int cros_ec_probe(struct udevice *dev) { struct ec_state *ec = dev->priv; struct cros_ec_dev *cdev = dev->uclass_priv; const void *blob = gd->fdt_blob; struct udevice *keyb_dev; int node; int err; memcpy(ec, &s_state, sizeof(*ec)); err = cros_ec_decode_ec_flash(blob, dev_of_offset(dev), &ec->ec_config); if (err) return err; node = -1; for (device_find_first_child(dev, &keyb_dev); keyb_dev; device_find_next_child(&keyb_dev)) { if (device_get_uclass_id(keyb_dev) == UCLASS_KEYBOARD) { node = dev_of_offset(keyb_dev); break; } } if (node < 0) { debug("%s: No cros_ec keyboard found\n", __func__); } else if (keyscan_read_fdt_matrix(ec, blob, node)) { debug("%s: Could not read key matrix\n", __func__); return -1; } /* If we loaded EC data, check that the length matches */ if (ec->flash_data && ec->flash_data_len != ec->ec_config.flash.length) { printf("EC data length is %x, expected %x, discarding data\n", ec->flash_data_len, ec->ec_config.flash.length); os_free(ec->flash_data); ec->flash_data = NULL; } /* Otherwise allocate the memory */ if (!ec->flash_data) { ec->flash_data_len = ec->ec_config.flash.length; ec->flash_data = os_malloc(ec->flash_data_len); if (!ec->flash_data) return -ENOMEM; } cdev->dev = dev; g_state = ec; return cros_ec_register(dev); }
int cros_ec_sandbox_packet(struct udevice *udev, int out_bytes, int in_bytes) { struct cros_ec_dev *dev = udev->uclass_priv; struct ec_state *ec = dev_get_priv(dev->dev); #else int cros_ec_sandbox_packet(struct cros_ec_dev *dev, int out_bytes, int in_bytes) { struct ec_state *ec = &s_state; #endif struct ec_host_request *req_hdr = (struct ec_host_request *)dev->dout; const void *req_data = req_hdr + 1; struct ec_host_response *resp_hdr = (struct ec_host_response *)dev->din; void *resp_data = resp_hdr + 1; int len; len = process_cmd(ec, req_hdr, req_data, resp_hdr, resp_data); if (len < 0) return len; resp_hdr->struct_version = 3; resp_hdr->result = EC_RES_SUCCESS; resp_hdr->data_len = len; resp_hdr->reserved = 0; len += sizeof(*resp_hdr); resp_hdr->checksum = 0; resp_hdr->checksum = (uint8_t) -cros_ec_calc_checksum((const uint8_t *)resp_hdr, len); return in_bytes; } int cros_ec_sandbox_decode_fdt(struct cros_ec_dev *dev, const void *blob) { return 0; } void cros_ec_check_keyboard(struct cros_ec_dev *dev) { #ifdef CONFIG_DM_CROS_EC struct ec_state *ec = dev_get_priv(dev->dev); #else struct ec_state *ec = &s_state; #endif ulong start; printf("Press keys for EC to detect on reset (ESC=recovery)..."); start = get_timer(0); while (get_timer(start) < 1000) ; putc('\n'); if (!sandbox_sdl_key_pressed(KEY_ESC)) { ec->recovery_req = true; printf(" - EC requests recovery\n"); } } #ifdef CONFIG_DM_CROS_EC int cros_ec_probe(struct udevice *dev) { struct ec_state *ec = dev->priv; struct cros_ec_dev *cdev = dev->uclass_priv; const void *blob = gd->fdt_blob; int node; int err; memcpy(ec, &s_state, sizeof(*ec)); err = cros_ec_decode_ec_flash(blob, dev->of_offset, &ec->ec_config); if (err) return err; node = fdtdec_next_compatible(blob, 0, COMPAT_GOOGLE_CROS_EC_KEYB); if (node < 0) { debug("%s: No cros_ec keyboard found\n", __func__); } else if (keyscan_read_fdt_matrix(ec, blob, node)) { debug("%s: Could not read key matrix\n", __func__); return -1; } /* If we loaded EC data, check that the length matches */ if (ec->flash_data && ec->flash_data_len != ec->ec_config.flash.length) { printf("EC data length is %x, expected %x, discarding data\n", ec->flash_data_len, ec->ec_config.flash.length); os_free(ec->flash_data); ec->flash_data = NULL; } /* Otherwise allocate the memory */ if (!ec->flash_data) { ec->flash_data_len = ec->ec_config.flash.length; ec->flash_data = os_malloc(ec->flash_data_len); if (!ec->flash_data) return -ENOMEM; } cdev->dev = dev; g_state = ec; return cros_ec_register(dev); } #else /** * Initialize sandbox EC emulation. * * @param dev CROS_EC device * @param blob Device tree blob * @return 0 if ok, -1 on error */ int cros_ec_sandbox_init(struct cros_ec_dev *dev, const void *blob) { struct ec_state *ec = &s_state; int node; int err; node = fdtdec_next_compatible(blob, 0, COMPAT_GOOGLE_CROS_EC); if (node < 0) { debug("Failed to find chrome-ec node'\n"); return -1; } err = cros_ec_decode_ec_flash(blob, node, &ec->ec_config); if (err) return err; node = fdtdec_next_compatible(blob, 0, COMPAT_GOOGLE_CROS_EC_KEYB); if (node < 0) { debug("%s: No cros_ec keyboard found\n", __func__); } else if (keyscan_read_fdt_matrix(ec, blob, node)) { debug("%s: Could not read key matrix\n", __func__); return -1; } /* If we loaded EC data, check that the length matches */ if (ec->flash_data && ec->flash_data_len != ec->ec_config.flash.length) { printf("EC data length is %x, expected %x, discarding data\n", ec->flash_data_len, ec->ec_config.flash.length); os_free(ec->flash_data); ec->flash_data = NULL; } /* Otherwise allocate the memory */ if (!ec->flash_data) { ec->flash_data_len = ec->ec_config.flash.length; ec->flash_data = os_malloc(ec->flash_data_len); if (!ec->flash_data) return -ENOMEM; } return 0; } #endif #ifdef CONFIG_DM_CROS_EC struct dm_cros_ec_ops cros_ec_ops = { .packet = cros_ec_sandbox_packet, }; static const struct udevice_id cros_ec_ids[] = { { .compatible = "google,cros-ec" }, { } };