gpio: davinci: Use dev name for label and automatic base selection

Use dev_name to get a unique label and use -1 for a base to get our
selection automatically. We pull in all GPIOs per chip now so this
does not have the effect of out of order labels like before.

We do these both together so we can drop all the static data in one
patch. This also lets us normalize the return paths as we don't need
any cleanup after this change.

Signed-off-by: Andrew F. Davis <afd@ti.com>
Tested-by: Keerthy <j-keerthy@ti.com>
Acked-by: Keerthy <j-keerthy@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Andrew F. Davis 2018-08-31 14:13:23 -05:00 committed by Linus Walleij
parent 329357723f
commit 587f7a694f

View File

@ -41,7 +41,6 @@ struct davinci_gpio_regs {
typedef struct irq_chip *(*gpio_get_irq_chip_cb_t)(unsigned int irq); typedef struct irq_chip *(*gpio_get_irq_chip_cb_t)(unsigned int irq);
#define BINTEN 0x8 /* GPIO Interrupt Per-Bank Enable Register */ #define BINTEN 0x8 /* GPIO Interrupt Per-Bank Enable Register */
#define MAX_LABEL_SIZE 20
static void __iomem *gpio_base; static void __iomem *gpio_base;
static unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0}; static unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0};
@ -166,14 +165,12 @@ davinci_gpio_get_pdata(struct platform_device *pdev)
static int davinci_gpio_probe(struct platform_device *pdev) static int davinci_gpio_probe(struct platform_device *pdev)
{ {
static int ctrl_num, bank_base;
int gpio, bank, i, ret = 0; int gpio, bank, i, ret = 0;
unsigned int ngpio, nbank, nirq; unsigned int ngpio, nbank, nirq;
struct davinci_gpio_controller *chips; struct davinci_gpio_controller *chips;
struct davinci_gpio_platform_data *pdata; struct davinci_gpio_platform_data *pdata;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
char label[MAX_LABEL_SIZE];
pdata = davinci_gpio_get_pdata(pdev); pdata = davinci_gpio_get_pdata(pdev);
if (!pdata) { if (!pdata) {
@ -228,10 +225,7 @@ static int davinci_gpio_probe(struct platform_device *pdev)
} }
} }
snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++); chips->chip.label = dev_name(dev);
chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL);
if (!chips->chip.label)
return -ENOMEM;
chips->chip.direction_input = davinci_direction_in; chips->chip.direction_input = davinci_direction_in;
chips->chip.get = davinci_gpio_get; chips->chip.get = davinci_gpio_get;
@ -239,7 +233,7 @@ static int davinci_gpio_probe(struct platform_device *pdev)
chips->chip.set = davinci_gpio_set; chips->chip.set = davinci_gpio_set;
chips->chip.ngpio = ngpio; chips->chip.ngpio = ngpio;
chips->chip.base = bank_base; chips->chip.base = -1;
#ifdef CONFIG_OF_GPIO #ifdef CONFIG_OF_GPIO
chips->chip.of_gpio_n_cells = 2; chips->chip.of_gpio_n_cells = 2;
@ -252,28 +246,20 @@ static int davinci_gpio_probe(struct platform_device *pdev)
} }
#endif #endif
spin_lock_init(&chips->lock); spin_lock_init(&chips->lock);
bank_base += ngpio;
for (gpio = 0, bank = 0; gpio < ngpio; gpio += 32, bank++) for (gpio = 0, bank = 0; gpio < ngpio; gpio += 32, bank++)
chips->regs[bank] = gpio_base + offset_array[bank]; chips->regs[bank] = gpio_base + offset_array[bank];
ret = devm_gpiochip_add_data(dev, &chips->chip, chips); ret = devm_gpiochip_add_data(dev, &chips->chip, chips);
if (ret) if (ret)
goto err; return ret;
platform_set_drvdata(pdev, chips); platform_set_drvdata(pdev, chips);
ret = davinci_gpio_irq_setup(pdev); ret = davinci_gpio_irq_setup(pdev);
if (ret) if (ret)
goto err; return ret;
return 0; return 0;
err:
/* Revert the static variable increments */
ctrl_num--;
bank_base -= ngpio;
return ret;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/