int cros_ec_register(struct udevice *dev) { struct cros_ec_dev *cdev = dev_get_uclass_priv(dev); const void *blob = gd->fdt_blob; int node = dev->of_offset; char id[MSG_BYTES]; cdev->dev = dev; gpio_request_by_name(dev, "ec-interrupt", 0, &cdev->ec_int, GPIOD_IS_IN); cdev->optimise_flash_write = fdtdec_get_bool(blob, node, "optimise-flash-write"); if (cros_ec_check_version(cdev)) { debug("%s: Could not detect CROS-EC version\n", __func__); return -CROS_EC_ERR_CHECK_VERSION; } if (cros_ec_read_id(cdev, id, sizeof(id))) { debug("%s: Could not read KBC ID\n", __func__); return -CROS_EC_ERR_READ_ID; } /* Remember this device for use by the cros_ec command */ debug("Google Chrome EC v%d CROS-EC driver ready, id '%s'\n", cdev->protocol_version, id); return 0; }
void cros_ec_attach(struct device *parent, struct device *self, void *aux) { struct cros_ec_softc *sc = (struct cros_ec_softc *)self; struct i2c_attach_args *ia = aux; sc->sc_tag = ia->ia_tag; sc->sc_addr = ia->ia_addr; printf("\n"); if (cros_ec_check_version(sc)) { printf("%s: could not initialize ChromeOS EC\n", __func__); return; } if (cros_ec_init_keyboard(sc)) { printf("%s: could not initialize keyboard\n", __func__); return; } }
int cros_ec_init(const void *blob, struct cros_ec_dev **cros_ecp) { char id[MSG_BYTES]; struct cros_ec_dev *dev; int node = 0; *cros_ecp = NULL; do { node = fdtdec_next_compatible(blob, node, COMPAT_GOOGLE_CROS_EC); if (node < 0) { debug("%s: Node not found\n", __func__); return 0; } } while (!fdtdec_get_is_enabled(blob, node)); if (cros_ec_decode_fdt(blob, node, &dev)) { debug("%s: Failed to decode device.\n", __func__); return -CROS_EC_ERR_FDT_DECODE; } switch (dev->interface) { #ifdef CONFIG_CROS_EC_SPI case CROS_EC_IF_SPI: if (cros_ec_spi_init(dev, blob)) { debug("%s: Could not setup SPI interface\n", __func__); return -CROS_EC_ERR_DEV_INIT; } break; #endif #ifdef CONFIG_CROS_EC_I2C case CROS_EC_IF_I2C: if (cros_ec_i2c_init(dev, blob)) return -CROS_EC_ERR_DEV_INIT; break; #endif #ifdef CONFIG_CROS_EC_LPC case CROS_EC_IF_LPC: if (cros_ec_lpc_init(dev, blob)) return -CROS_EC_ERR_DEV_INIT; break; #endif #ifdef CONFIG_CROS_EC_SANDBOX case CROS_EC_IF_SANDBOX: if (cros_ec_sandbox_init(dev, blob)) return -CROS_EC_ERR_DEV_INIT; break; #endif case CROS_EC_IF_NONE: default: return 0; } /* we will poll the EC interrupt line */ fdtdec_setup_gpio(&dev->ec_int); if (fdt_gpio_isvalid(&dev->ec_int)) gpio_direction_input(dev->ec_int.gpio); if (cros_ec_check_version(dev)) { debug("%s: Could not detect CROS-EC version\n", __func__); return -CROS_EC_ERR_CHECK_VERSION; } if (cros_ec_read_id(dev, id, sizeof(id))) { debug("%s: Could not read KBC ID\n", __func__); return -CROS_EC_ERR_READ_ID; } /* Remember this device for use by the cros_ec command */ last_dev = *cros_ecp = dev; debug("Google Chrome EC CROS-EC driver ready, id '%s'\n", id); return 0; }