hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpio/gpio-davinci.c
....@@ -1,14 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * TI DaVinci GPIO Support
34 *
45 * Copyright (c) 2006-2007 David Brownell
56 * Copyright (c) 2007, MontaVista Software, Inc. <source@mvista.com>
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; either version 2 of the License, or
10
- * (at your option) any later version.
117 */
8
+
129 #include <linux/gpio/driver.h>
1310 #include <linux/errno.h>
1411 #include <linux/kernel.h>
....@@ -24,6 +21,12 @@
2421 #include <linux/platform_device.h>
2522 #include <linux/platform_data/gpio-davinci.h>
2623 #include <linux/irqchip/chained_irq.h>
24
+#include <linux/spinlock.h>
25
+
26
+#include <asm-generic/gpio.h>
27
+
28
+#define MAX_REGS_BANKS 5
29
+#define MAX_INT_PER_BANK 32
2730
2831 struct davinci_gpio_regs {
2932 u32 dir;
....@@ -41,10 +44,30 @@
4144 typedef struct irq_chip *(*gpio_get_irq_chip_cb_t)(unsigned int irq);
4245
4346 #define BINTEN 0x8 /* GPIO Interrupt Per-Bank Enable Register */
44
-#define MAX_LABEL_SIZE 20
4547
4648 static void __iomem *gpio_base;
4749 static unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0};
50
+
51
+struct davinci_gpio_irq_data {
52
+ void __iomem *regs;
53
+ struct davinci_gpio_controller *chip;
54
+ int bank_num;
55
+};
56
+
57
+struct davinci_gpio_controller {
58
+ struct gpio_chip chip;
59
+ struct irq_domain *irq_domain;
60
+ /* Serialize access to GPIO registers */
61
+ spinlock_t lock;
62
+ void __iomem *regs[MAX_REGS_BANKS];
63
+ int gpio_unbanked;
64
+ int irqs[MAX_INT_PER_BANK];
65
+};
66
+
67
+static inline u32 __gpio_mask(unsigned gpio)
68
+{
69
+ return 1 << (gpio % 32);
70
+}
4871
4972 static inline struct davinci_gpio_regs __iomem *irq2regs(struct irq_data *d)
5073 {
....@@ -166,14 +189,11 @@
166189
167190 static int davinci_gpio_probe(struct platform_device *pdev)
168191 {
169
- static int ctrl_num, bank_base;
170
- int gpio, bank, i, ret = 0;
192
+ int bank, i, ret = 0;
171193 unsigned int ngpio, nbank, nirq;
172194 struct davinci_gpio_controller *chips;
173195 struct davinci_gpio_platform_data *pdata;
174196 struct device *dev = &pdev->dev;
175
- struct resource *res;
176
- char label[MAX_LABEL_SIZE];
177197
178198 pdata = davinci_gpio_get_pdata(pdev);
179199 if (!pdata) {
....@@ -207,32 +227,21 @@
207227 else
208228 nirq = DIV_ROUND_UP(ngpio, 16);
209229
210
- nbank = DIV_ROUND_UP(ngpio, 32);
211
- chips = devm_kcalloc(dev,
212
- nbank, sizeof(struct davinci_gpio_controller),
213
- GFP_KERNEL);
230
+ chips = devm_kzalloc(dev, sizeof(*chips), GFP_KERNEL);
214231 if (!chips)
215232 return -ENOMEM;
216233
217
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
218
- gpio_base = devm_ioremap_resource(dev, res);
234
+ gpio_base = devm_platform_ioremap_resource(pdev, 0);
219235 if (IS_ERR(gpio_base))
220236 return PTR_ERR(gpio_base);
221237
222238 for (i = 0; i < nirq; i++) {
223239 chips->irqs[i] = platform_get_irq(pdev, i);
224
- if (chips->irqs[i] < 0) {
225
- if (chips->irqs[i] != -EPROBE_DEFER)
226
- dev_info(dev, "IRQ not populated, err = %d\n",
227
- chips->irqs[i]);
228
- return chips->irqs[i];
229
- }
240
+ if (chips->irqs[i] < 0)
241
+ return dev_err_probe(dev, chips->irqs[i], "IRQ not populated\n");
230242 }
231243
232
- snprintf(label, MAX_LABEL_SIZE, "davinci_gpio.%d", ctrl_num++);
233
- chips->chip.label = devm_kstrdup(dev, label, GFP_KERNEL);
234
- if (!chips->chip.label)
235
- return -ENOMEM;
244
+ chips->chip.label = dev_name(dev);
236245
237246 chips->chip.direction_input = davinci_direction_in;
238247 chips->chip.get = davinci_gpio_get;
....@@ -240,41 +249,31 @@
240249 chips->chip.set = davinci_gpio_set;
241250
242251 chips->chip.ngpio = ngpio;
243
- chips->chip.base = bank_base;
252
+ chips->chip.base = pdata->no_auto_base ? pdata->base : -1;
244253
245254 #ifdef CONFIG_OF_GPIO
246255 chips->chip.of_gpio_n_cells = 2;
247256 chips->chip.parent = dev;
248257 chips->chip.of_node = dev->of_node;
249
-
250
- if (of_property_read_bool(dev->of_node, "gpio-ranges")) {
251
- chips->chip.request = gpiochip_generic_request;
252
- chips->chip.free = gpiochip_generic_free;
253
- }
258
+ chips->chip.request = gpiochip_generic_request;
259
+ chips->chip.free = gpiochip_generic_free;
254260 #endif
255261 spin_lock_init(&chips->lock);
256
- bank_base += ngpio;
257262
258
- for (gpio = 0, bank = 0; gpio < ngpio; gpio += 32, bank++)
263
+ nbank = DIV_ROUND_UP(ngpio, 32);
264
+ for (bank = 0; bank < nbank; bank++)
259265 chips->regs[bank] = gpio_base + offset_array[bank];
260266
261267 ret = devm_gpiochip_add_data(dev, &chips->chip, chips);
262268 if (ret)
263
- goto err;
269
+ return ret;
264270
265271 platform_set_drvdata(pdev, chips);
266272 ret = davinci_gpio_irq_setup(pdev);
267273 if (ret)
268
- goto err;
274
+ return ret;
269275
270276 return 0;
271
-
272
-err:
273
- /* Revert the static variable increments */
274
- ctrl_num--;
275
- bank_base -= ngpio;
276
-
277
- return ret;
278277 }
279278
280279 /*--------------------------------------------------------------------------*/
....@@ -292,7 +291,7 @@
292291 static void gpio_irq_disable(struct irq_data *d)
293292 {
294293 struct davinci_gpio_regs __iomem *g = irq2regs(d);
295
- u32 mask = (u32) irq_data_get_irq_handler_data(d);
294
+ uintptr_t mask = (uintptr_t)irq_data_get_irq_handler_data(d);
296295
297296 writel_relaxed(mask, &g->clr_falling);
298297 writel_relaxed(mask, &g->clr_rising);
....@@ -301,7 +300,7 @@
301300 static void gpio_irq_enable(struct irq_data *d)
302301 {
303302 struct davinci_gpio_regs __iomem *g = irq2regs(d);
304
- u32 mask = (u32) irq_data_get_irq_handler_data(d);
303
+ uintptr_t mask = (uintptr_t)irq_data_get_irq_handler_data(d);
305304 unsigned status = irqd_get_trigger_type(d);
306305
307306 status &= IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING;
....@@ -442,7 +441,7 @@
442441 "davinci_gpio");
443442 irq_set_irq_type(irq, IRQ_TYPE_NONE);
444443 irq_set_chip_data(irq, (__force void *)g);
445
- irq_set_handler_data(irq, (void *)__gpio_mask(hw));
444
+ irq_set_handler_data(irq, (void *)(uintptr_t)__gpio_mask(hw));
446445
447446 return 0;
448447 }
....@@ -627,6 +626,7 @@
627626
628627 static const struct of_device_id davinci_gpio_ids[] = {
629628 { .compatible = "ti,keystone-gpio", keystone_gpio_get_irq_chip},
629
+ { .compatible = "ti,am654-gpio", keystone_gpio_get_irq_chip},
630630 { .compatible = "ti,dm6441-gpio", davinci_gpio_get_irq_chip},
631631 { /* sentinel */ },
632632 };