diff options
-rw-r--r-- | arch/arm/cpu/armv7/am33xx/board.c | 12 | ||||
-rw-r--r-- | arch/arm/cpu/armv7/omap3/board.c | 24 | ||||
-rw-r--r-- | arch/arm/cpu/armv7/omap4/hwinit.c | 12 | ||||
-rw-r--r-- | arch/arm/cpu/armv7/omap5/hwinit.c | 18 | ||||
-rw-r--r-- | arch/arm/include/asm/omap_gpio.h | 7 | ||||
-rw-r--r-- | drivers/gpio/omap_gpio.c | 107 |
6 files changed, 94 insertions, 86 deletions
diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c index a1cb4ec..bd14326 100644 --- a/arch/arm/cpu/armv7/am33xx/board.c +++ b/arch/arm/cpu/armv7/am33xx/board.c @@ -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 }; diff --git a/arch/arm/cpu/armv7/omap3/board.c b/arch/arm/cpu/armv7/omap3/board.c index 17cb5b7..8252b32 100644 --- a/arch/arm/cpu/armv7/omap3/board.c +++ b/arch/arm/cpu/armv7/omap3/board.c @@ -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; diff --git a/arch/arm/cpu/armv7/omap4/hwinit.c b/arch/arm/cpu/armv7/omap4/hwinit.c index 9792761..a68947f 100644 --- a/arch/arm/cpu/armv7/omap4/hwinit.c +++ b/arch/arm/cpu/armv7/omap4/hwinit.c @@ -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; diff --git a/arch/arm/cpu/armv7/omap5/hwinit.c b/arch/arm/cpu/armv7/omap5/hwinit.c index 22e0829..3699050 100644 --- a/arch/arm/cpu/armv7/omap5/hwinit.c +++ b/arch/arm/cpu/armv7/omap5/hwinit.c @@ -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) { diff --git a/arch/arm/include/asm/omap_gpio.h b/arch/arm/include/asm/omap_gpio.h index 839af54..ef38b63 100644 --- a/arch/arm/include/asm/omap_gpio.h +++ b/arch/arm/include/asm/omap_gpio.h @@ -23,24 +23,19 @@ #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; diff --git a/drivers/gpio/omap_gpio.c b/drivers/gpio/omap_gpio.c index 0a1e124..cd960dc 100644 --- a/drivers/gpio/omap_gpio.c +++ b/drivers/gpio/omap_gpio.c @@ -20,9 +20,13 @@ */ #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), }; |