From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Thu, 26 Mar 2015 09:29:30 -0600 Subject: [U-Boot] [PATCH v2 06/17] dm: cros_ec: Convert cros_ec LPC driver to driver model In-Reply-To: <1427383781-7151-1-git-send-email-sjg@chromium.org> References: <1427383781-7151-1-git-send-email-sjg@chromium.org> Message-ID: <1427383781-7151-7-git-send-email-sjg@chromium.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de This is the last driver to be converted. It requires an LPC bus and a special check_version() method. Signed-off-by: Simon Glass --- Changes in v2: - Support pre-driver-model too so we can rebase on dm/next configs/chromebook_link_defconfig | 1 + drivers/misc/cros_ec.c | 12 ++++++++++++ drivers/misc/cros_ec_lpc.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/configs/chromebook_link_defconfig b/configs/chromebook_link_defconfig index f3196fd..fe2610a 100644 --- a/configs/chromebook_link_defconfig +++ b/configs/chromebook_link_defconfig @@ -10,3 +10,4 @@ CONFIG_VIDEO_VESA=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_VESA_MODE_11A=y CONFIG_DM_PCI=y +CONFIG_CROS_EC_LPC=y diff --git a/drivers/misc/cros_ec.c b/drivers/misc/cros_ec.c index 1c29ba8..efcad89 100644 --- a/drivers/misc/cros_ec.c +++ b/drivers/misc/cros_ec.c @@ -681,11 +681,23 @@ static int cros_ec_check_version(struct cros_ec_dev *dev) struct ec_params_hello req; struct ec_response_hello *resp; +#ifdef CONFIG_DM_CROS_EC + struct dm_cros_ec_ops *ops; + int ret; + + ops = dm_cros_ec_get_ops(dev->dev); + if (ops->check_version) { + ret = ops->check_version(dev->dev); + if (ret) + return ret; + } +#else #ifdef CONFIG_CROS_EC_LPC /* LPC has its own way of doing this */ if (dev->interface == CROS_EC_IF_LPC) return cros_ec_lpc_check_version(dev); #endif +#endif /* * TODO(sjg at chromium.org). diff --git a/drivers/misc/cros_ec_lpc.c b/drivers/misc/cros_ec_lpc.c index 07624a1..b94501e 100644 --- a/drivers/misc/cros_ec_lpc.c +++ b/drivers/misc/cros_ec_lpc.c @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -40,10 +41,18 @@ static int wait_for_sync(struct cros_ec_dev *dev) return 0; } +#ifdef CONFIG_DM_CROS_EC +int cros_ec_lpc_command(struct udevice *udev, uint8_t cmd, int cmd_version, + const uint8_t *dout, int dout_len, + uint8_t **dinp, int din_len) +{ + struct cros_ec_dev *dev = dev_get_uclass_priv(udev); +#else int cros_ec_lpc_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version, const uint8_t *dout, int dout_len, uint8_t **dinp, int din_len) { +#endif const int cmd_addr = EC_LPC_ADDR_HOST_CMD; const int data_addr = EC_LPC_ADDR_HOST_DATA; const int args_addr = EC_LPC_ADDR_HOST_ARGS; @@ -178,7 +187,11 @@ int cros_ec_lpc_init(struct cros_ec_dev *dev, const void *blob) * seeing whether the EC sets the EC_HOST_ARGS_FLAG_FROM_HOST flag * in args when it responds. */ +#ifdef CONFIG_DM_CROS_EC +static int cros_ec_lpc_check_version(struct udevice *dev) +#else int cros_ec_lpc_check_version(struct cros_ec_dev *dev) +#endif { if (inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID) == 'E' && inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID + 1) @@ -192,3 +205,28 @@ int cros_ec_lpc_check_version(struct cros_ec_dev *dev) printf("%s: ERROR: old EC interface not supported\n", __func__); return -1; } + +#ifdef CONFIG_DM_CROS_EC +static int cros_ec_probe(struct udevice *dev) +{ + return cros_ec_register(dev); +} + +static struct dm_cros_ec_ops cros_ec_ops = { + .command = cros_ec_lpc_command, + .check_version = cros_ec_lpc_check_version, +}; + +static const struct udevice_id cros_ec_ids[] = { + { .compatible = "google,cros-ec" }, + { } +}; + +U_BOOT_DRIVER(cros_ec_lpc) = { + .name = "cros_ec", + .id = UCLASS_CROS_EC, + .of_match = cros_ec_ids, + .probe = cros_ec_probe, + .ops = &cros_ec_ops, +}; +#endif -- 2.2.0.rc0.207.ga3a616c