]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
dm: cros_ec: Convert cros_ec LPC driver to driver model
authorSimon Glass <sjg@chromium.org>
Thu, 26 Mar 2015 15:29:30 +0000 (09:29 -0600)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 8 Sep 2015 19:47:45 +0000 (21:47 +0200)
This is the last driver to be converted. It requires an LPC bus and a
special check_version() method.

Signed-off-by: Simon Glass <sjg@chromium.org>
configs/chromebook_link_defconfig
drivers/misc/cros_ec.c
drivers/misc/cros_ec_lpc.c

index f3196fdd3a948560fa61874feb6fd4d6a610479d..fe2610a351e5eb4c8d8d4133d0aa7afbce263b56 100644 (file)
@@ -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
index 1c29ba83dee2df54db46f2f1f3b657ac1d4ca9cd..efcad89eb0bb9c2ebe2eb464f5f6a5c06174fa19 100644 (file)
@@ -681,10 +681,22 @@ 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
 
        /*
index 07624a136fa47def2c330ae229c25a1cd822a3dc..b94501e474217f5444c2bf7da9aebf86066c4e0b 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <command.h>
 #include <cros_ec.h>
 #include <asm/io.h>
@@ -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