gpio: omap: Drop 'method' parameter
authorTom Rini <trini@konsulko.com>
Fri, 31 Jul 2015 23:55:09 +0000 (19:55 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 13 Aug 2015 00:48:06 +0000 (20:48 -0400)
The "method" parameter was part of the original port of the driver from
the kernel.  At some point this may have been added to allow for future
differentiation (as omap1 and omap2 have different GPIO IP blocks, so
this wasn't an unreasonable thing to do).  At this point however it's
just extra overhead, so drop.

Signed-off-by: Tom Rini <trini@konsulko.com>
arch/arm/cpu/armv7/am33xx/board.c
arch/arm/cpu/armv7/omap3/board.c
arch/arm/cpu/armv7/omap4/hwinit.c
arch/arm/cpu/armv7/omap5/hwinit.c
arch/arm/include/asm/omap_gpio.h
drivers/gpio/omap_gpio.c

index a1cb4ecf57801631b3705c6178626f4116cd75d8..bd14326cf4799aa99f8fab4a96c199c7ff46bb83 100644 (file)
@@ -73,13 +73,13 @@ U_BOOT_DEVICES(am33xx_uarts) = {
 
 #ifndef CONFIG_DM_GPIO
 static const struct gpio_bank gpio_bank_am33xx[] = {
-       { (void *)AM33XX_GPIO0_BASE, METHOD_GPIO_24XX },
-       { (void *)AM33XX_GPIO1_BASE, METHOD_GPIO_24XX },
-       { (void *)AM33XX_GPIO2_BASE, METHOD_GPIO_24XX },
-       { (void *)AM33XX_GPIO3_BASE, METHOD_GPIO_24XX },
+       { (void *)AM33XX_GPIO0_BASE },
+       { (void *)AM33XX_GPIO1_BASE },
+       { (void *)AM33XX_GPIO2_BASE },
+       { (void *)AM33XX_GPIO3_BASE },
 #ifdef CONFIG_AM43XX
-       { (void *)AM33XX_GPIO4_BASE, METHOD_GPIO_24XX },
-       { (void *)AM33XX_GPIO5_BASE, METHOD_GPIO_24XX },
+       { (void *)AM33XX_GPIO4_BASE },
+       { (void *)AM33XX_GPIO5_BASE },
 #endif
 };
 
index 17cb5b759b9a4d598ab828a6fda6af2a50f6b3bc..8252b322f68a3fed2def8ca2d28198643a093f40 100644 (file)
@@ -38,12 +38,12 @@ static void omap3_invalidate_l2_cache_secure(void);
 
 #ifdef CONFIG_DM_GPIO
 static const struct omap_gpio_platdata omap34xx_gpio[] = {
-       { 0, OMAP34XX_GPIO1_BASE, METHOD_GPIO_24XX },
-       { 1, OMAP34XX_GPIO2_BASE, METHOD_GPIO_24XX },
-       { 2, OMAP34XX_GPIO3_BASE, METHOD_GPIO_24XX },
-       { 3, OMAP34XX_GPIO4_BASE, METHOD_GPIO_24XX },
-       { 4, OMAP34XX_GPIO5_BASE, METHOD_GPIO_24XX },
-       { 5, OMAP34XX_GPIO6_BASE, METHOD_GPIO_24XX },
+       { 0, OMAP34XX_GPIO1_BASE },
+       { 1, OMAP34XX_GPIO2_BASE },
+       { 2, OMAP34XX_GPIO3_BASE },
+       { 3, OMAP34XX_GPIO4_BASE },
+       { 4, OMAP34XX_GPIO5_BASE },
+       { 5, OMAP34XX_GPIO6_BASE },
 };
 
 U_BOOT_DEVICES(am33xx_gpios) = {
@@ -58,12 +58,12 @@ U_BOOT_DEVICES(am33xx_gpios) = {
 #else
 
 static const struct gpio_bank gpio_bank_34xx[6] = {
-       { (void *)OMAP34XX_GPIO1_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP34XX_GPIO2_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP34XX_GPIO3_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP34XX_GPIO4_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP34XX_GPIO5_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP34XX_GPIO6_BASE, METHOD_GPIO_24XX },
+       { (void *)OMAP34XX_GPIO1_BASE },
+       { (void *)OMAP34XX_GPIO2_BASE },
+       { (void *)OMAP34XX_GPIO3_BASE },
+       { (void *)OMAP34XX_GPIO4_BASE },
+       { (void *)OMAP34XX_GPIO5_BASE },
+       { (void *)OMAP34XX_GPIO6_BASE },
 };
 
 const struct gpio_bank *const omap_gpio_bank = gpio_bank_34xx;
index 9792761d40a0263a0c7b19f57b7edd3fd087cdd1..a68947faf115f410507ddad6e70a2726adcf3fc9 100644 (file)
@@ -25,12 +25,12 @@ DECLARE_GLOBAL_DATA_PTR;
 u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
 
 static const struct gpio_bank gpio_bank_44xx[6] = {
-       { (void *)OMAP44XX_GPIO1_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP44XX_GPIO2_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP44XX_GPIO3_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP44XX_GPIO4_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP44XX_GPIO5_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP44XX_GPIO6_BASE, METHOD_GPIO_24XX },
+       { (void *)OMAP44XX_GPIO1_BASE },
+       { (void *)OMAP44XX_GPIO2_BASE },
+       { (void *)OMAP44XX_GPIO3_BASE },
+       { (void *)OMAP44XX_GPIO4_BASE },
+       { (void *)OMAP44XX_GPIO5_BASE },
+       { (void *)OMAP44XX_GPIO6_BASE },
 };
 
 const struct gpio_bank *const omap_gpio_bank = gpio_bank_44xx;
index 22e0829a6a0c2482328f6136ec1e6cf2160586bc..3699050e09a0af7096071b77033e8db527764bef 100644 (file)
@@ -27,18 +27,20 @@ DECLARE_GLOBAL_DATA_PTR;
 
 u32 *const omap_si_rev = (u32 *)OMAP_SRAM_SCRATCH_OMAP_REV;
 
+#ifndef CONFIG_DM_GPIO
 static struct gpio_bank gpio_bank_54xx[8] = {
-       { (void *)OMAP54XX_GPIO1_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO2_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO3_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO4_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO5_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO6_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO7_BASE, METHOD_GPIO_24XX },
-       { (void *)OMAP54XX_GPIO8_BASE, METHOD_GPIO_24XX },
+       { (void *)OMAP54XX_GPIO1_BASE },
+       { (void *)OMAP54XX_GPIO2_BASE },
+       { (void *)OMAP54XX_GPIO3_BASE },
+       { (void *)OMAP54XX_GPIO4_BASE },
+       { (void *)OMAP54XX_GPIO5_BASE },
+       { (void *)OMAP54XX_GPIO6_BASE },
+       { (void *)OMAP54XX_GPIO7_BASE },
+       { (void *)OMAP54XX_GPIO8_BASE },
 };
 
 const struct gpio_bank *const omap_gpio_bank = gpio_bank_54xx;
+#endif
 
 void do_set_mux32(u32 base, struct pad_conf_entry const *array, int size)
 {
index 839af54d482e9fbc9e03c5a777eb9317566681ea..ef38b6308d870b1b4121c622993fe19db2f2851a 100644 (file)
 
 #include <asm/arch/cpu.h>
 
-enum gpio_method {
-       METHOD_GPIO_24XX        = 4,
-};
-
 #ifdef CONFIG_DM_GPIO
 
 /* Information about a GPIO bank */
 struct omap_gpio_platdata {
        int bank_index;
        ulong base;     /* address of registers in physical memory */
-       enum gpio_method method;
+       const char *port_name;
 };
 
 #else
 
 struct gpio_bank {
        void *base;
-       int method;
 };
 
 extern const struct gpio_bank *const omap_gpio_bank;
index 0a1e12419b0ed8071891f681b5c72b92f023e9d2..cd960dc013f0f128be8d625aab83996e3863eb65 100644 (file)
  */
 #include <common.h>
 #include <dm.h>
+#include <fdtdec.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/errno.h>
+#include <malloc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
 
 #define OMAP_GPIO_DIR_OUT      0
 #define OMAP_GPIO_DIR_IN       1
@@ -34,7 +38,6 @@
 struct gpio_bank {
        /* TODO(sjg@chromium.org): Can we use a struct here? */
        void *base;     /* address of registers in physical memory */
-       enum gpio_method method;
 };
 
 #endif
@@ -55,13 +58,8 @@ static void _set_gpio_direction(const struct gpio_bank *bank, int gpio,
        void *reg = bank->base;
        u32 l;
 
-       switch (bank->method) {
-       case METHOD_GPIO_24XX:
-               reg += OMAP_GPIO_OE;
-               break;
-       default:
-               return;
-       }
+       reg += OMAP_GPIO_OE;
+
        l = __raw_readl(reg);
        if (is_input)
                l |= 1 << gpio;
@@ -79,13 +77,7 @@ static int _get_gpio_direction(const struct gpio_bank *bank, int gpio)
        void *reg = bank->base;
        u32 v;
 
-       switch (bank->method) {
-       case METHOD_GPIO_24XX:
-               reg += OMAP_GPIO_OE;
-               break;
-       default:
-               return -1;
-       }
+       reg += OMAP_GPIO_OE;
 
        v = __raw_readl(reg);
 
@@ -101,19 +93,12 @@ static void _set_gpio_dataout(const struct gpio_bank *bank, int gpio,
        void *reg = bank->base;
        u32 l = 0;
 
-       switch (bank->method) {
-       case METHOD_GPIO_24XX:
-               if (enable)
-                       reg += OMAP_GPIO_SETDATAOUT;
-               else
-                       reg += OMAP_GPIO_CLEARDATAOUT;
-               l = 1 << gpio;
-               break;
-       default:
-               printf("omap3-gpio unknown bank method %s %d\n",
-                      __FILE__, __LINE__);
-               return;
-       }
+       if (enable)
+               reg += OMAP_GPIO_SETDATAOUT;
+       else
+               reg += OMAP_GPIO_CLEARDATAOUT;
+
+       l = 1 << gpio;
        __raw_writel(l, reg);
 }
 
@@ -122,19 +107,13 @@ static int _get_gpio_value(const struct gpio_bank *bank, int gpio)
        void *reg = bank->base;
        int input;
 
-       switch (bank->method) {
-       case METHOD_GPIO_24XX:
-               input = _get_gpio_direction(bank, gpio);
-               switch (input) {
-               case OMAP_GPIO_DIR_IN:
-                       reg += OMAP_GPIO_DATAIN;
-                       break;
-               case OMAP_GPIO_DIR_OUT:
-                       reg += OMAP_GPIO_DATAOUT;
-                       break;
-               default:
-                       return -1;
-               }
+       input = _get_gpio_direction(bank, gpio);
+       switch (input) {
+       case OMAP_GPIO_DIR_IN:
+               reg += OMAP_GPIO_DATAIN;
+               break;
+       case OMAP_GPIO_DIR_OUT:
+               reg += OMAP_GPIO_DATAOUT;
                break;
        default:
                return -1;
@@ -310,24 +289,56 @@ static int omap_gpio_probe(struct udevice *dev)
        struct gpio_bank *bank = dev_get_priv(dev);
        struct omap_gpio_platdata *plat = dev_get_platdata(dev);
        struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
-       char name[18], *str;
 
-       sprintf(name, "GPIO%d_", plat->bank_index);
-       str = strdup(name);
-       if (!str)
-               return -ENOMEM;
-       uc_priv->bank_name = str;
+       uc_priv->bank_name = plat->port_name;
        uc_priv->gpio_count = GPIO_PER_BANK;
        bank->base = (void *)plat->base;
-       bank->method = plat->method;
 
        return 0;
 }
 
+static int omap_gpio_bind(struct udevice *dev)
+{
+       struct omap_gpio_platdata *plat = dev->platdata;
+       fdt_addr_t base_addr;
+
+       if (plat)
+               return 0;
+
+       base_addr = dev_get_addr(dev);
+       if (base_addr == FDT_ADDR_T_NONE)
+               return -ENODEV;
+
+       /*
+       * TODO:
+       * When every board is converted to driver model and DT is
+       * supported, this can be done by auto-alloc feature, but
+       * not using calloc to alloc memory for platdata.
+       */
+       plat = calloc(1, sizeof(*plat));
+       if (!plat)
+               return -ENOMEM;
+
+       plat->base = base_addr;
+       plat->port_name = fdt_get_name(gd->fdt_blob, dev->of_offset, NULL);
+       dev->platdata = plat;
+
+       return 0;
+}
+
+static const struct udevice_id omap_gpio_ids[] = {
+       { .compatible = "ti,omap3-gpio" },
+       { .compatible = "ti,omap4-gpio" },
+       { .compatible = "ti,am4372-gpio" },
+       { }
+};
+
 U_BOOT_DRIVER(gpio_omap) = {
        .name   = "gpio_omap",
        .id     = UCLASS_GPIO,
        .ops    = &gpio_omap_ops,
+       .of_match = omap_gpio_ids,
+       .bind   = omap_gpio_bind,
        .probe  = omap_gpio_probe,
        .priv_auto_alloc_size = sizeof(struct gpio_bank),
 };