Merge branch 'clockevents/fixes' of git://git.linaro.org/people/daniel.lezcano/linux...
[linux-drm-fsl-dcu.git] / drivers / gpio / gpio-mvebu.c
1 /*
2  * GPIO driver for Marvell SoCs
3  *
4  * Copyright (C) 2012 Marvell
5  *
6  * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
7  * Andrew Lunn <andrew@lunn.ch>
8  * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
9  *
10  * This file is licensed under the terms of the GNU General Public
11  * License version 2.  This program is licensed "as is" without any
12  * warranty of any kind, whether express or implied.
13  *
14  * This driver is a fairly straightforward GPIO driver for the
15  * complete family of Marvell EBU SoC platforms (Orion, Dove,
16  * Kirkwood, Discovery, Armada 370/XP). The only complexity of this
17  * driver is the different register layout that exists between the
18  * non-SMP platforms (Orion, Dove, Kirkwood, Armada 370) and the SMP
19  * platforms (MV78200 from the Discovery family and the Armada
20  * XP). Therefore, this driver handles three variants of the GPIO
21  * block:
22  * - the basic variant, called "orion-gpio", with the simplest
23  *   register set. Used on Orion, Dove, Kirkwoord, Armada 370 and
24  *   non-SMP Discovery systems
25  * - the mv78200 variant for MV78200 Discovery systems. This variant
26  *   turns the edge mask and level mask registers into CPU0 edge
27  *   mask/level mask registers, and adds CPU1 edge mask/level mask
28  *   registers.
29  * - the armadaxp variant for Armada XP systems. This variant keeps
30  *   the normal cause/edge mask/level mask registers when the global
31  *   interrupts are used, but adds per-CPU cause/edge mask/level mask
32  *   registers n a separate memory area for the per-CPU GPIO
33  *   interrupts.
34  */
35
36 #include <linux/err.h>
37 #include <linux/module.h>
38 #include <linux/gpio.h>
39 #include <linux/irq.h>
40 #include <linux/slab.h>
41 #include <linux/irqdomain.h>
42 #include <linux/io.h>
43 #include <linux/of_irq.h>
44 #include <linux/of_device.h>
45 #include <linux/clk.h>
46 #include <linux/pinctrl/consumer.h>
47
48 /*
49  * GPIO unit register offsets.
50  */
51 #define GPIO_OUT_OFF            0x0000
52 #define GPIO_IO_CONF_OFF        0x0004
53 #define GPIO_BLINK_EN_OFF       0x0008
54 #define GPIO_IN_POL_OFF         0x000c
55 #define GPIO_DATA_IN_OFF        0x0010
56 #define GPIO_EDGE_CAUSE_OFF     0x0014
57 #define GPIO_EDGE_MASK_OFF      0x0018
58 #define GPIO_LEVEL_MASK_OFF     0x001c
59
60 /* The MV78200 has per-CPU registers for edge mask and level mask */
61 #define GPIO_EDGE_MASK_MV78200_OFF(cpu)   ((cpu) ? 0x30 : 0x18)
62 #define GPIO_LEVEL_MASK_MV78200_OFF(cpu)  ((cpu) ? 0x34 : 0x1C)
63
64 /* The Armada XP has per-CPU registers for interrupt cause, interrupt
65  * mask and interrupt level mask. Those are relative to the
66  * percpu_membase. */
67 #define GPIO_EDGE_CAUSE_ARMADAXP_OFF(cpu) ((cpu) * 0x4)
68 #define GPIO_EDGE_MASK_ARMADAXP_OFF(cpu)  (0x10 + (cpu) * 0x4)
69 #define GPIO_LEVEL_MASK_ARMADAXP_OFF(cpu) (0x20 + (cpu) * 0x4)
70
71 #define MVEBU_GPIO_SOC_VARIANT_ORION    0x1
72 #define MVEBU_GPIO_SOC_VARIANT_MV78200  0x2
73 #define MVEBU_GPIO_SOC_VARIANT_ARMADAXP 0x3
74
75 #define MVEBU_MAX_GPIO_PER_BANK         32
76
77 struct mvebu_gpio_chip {
78         struct gpio_chip   chip;
79         spinlock_t         lock;
80         void __iomem      *membase;
81         void __iomem      *percpu_membase;
82         int                irqbase;
83         struct irq_domain *domain;
84         int                soc_variant;
85 };
86
87 /*
88  * Functions returning addresses of individual registers for a given
89  * GPIO controller.
90  */
91 static inline void __iomem *mvebu_gpioreg_out(struct mvebu_gpio_chip *mvchip)
92 {
93         return mvchip->membase + GPIO_OUT_OFF;
94 }
95
96 static inline void __iomem *mvebu_gpioreg_blink(struct mvebu_gpio_chip *mvchip)
97 {
98         return mvchip->membase + GPIO_BLINK_EN_OFF;
99 }
100
101 static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip)
102 {
103         return mvchip->membase + GPIO_IO_CONF_OFF;
104 }
105
106 static inline void __iomem *mvebu_gpioreg_in_pol(struct mvebu_gpio_chip *mvchip)
107 {
108         return mvchip->membase + GPIO_IN_POL_OFF;
109 }
110
111 static inline void __iomem *mvebu_gpioreg_data_in(struct mvebu_gpio_chip *mvchip)
112 {
113         return mvchip->membase + GPIO_DATA_IN_OFF;
114 }
115
116 static inline void __iomem *mvebu_gpioreg_edge_cause(struct mvebu_gpio_chip *mvchip)
117 {
118         int cpu;
119
120         switch (mvchip->soc_variant) {
121         case MVEBU_GPIO_SOC_VARIANT_ORION:
122         case MVEBU_GPIO_SOC_VARIANT_MV78200:
123                 return mvchip->membase + GPIO_EDGE_CAUSE_OFF;
124         case MVEBU_GPIO_SOC_VARIANT_ARMADAXP:
125                 cpu = smp_processor_id();
126                 return mvchip->percpu_membase + GPIO_EDGE_CAUSE_ARMADAXP_OFF(cpu);
127         default:
128                 BUG();
129         }
130 }
131
132 static inline void __iomem *mvebu_gpioreg_edge_mask(struct mvebu_gpio_chip *mvchip)
133 {
134         int cpu;
135
136         switch (mvchip->soc_variant) {
137         case MVEBU_GPIO_SOC_VARIANT_ORION:
138                 return mvchip->membase + GPIO_EDGE_MASK_OFF;
139         case MVEBU_GPIO_SOC_VARIANT_MV78200:
140                 cpu = smp_processor_id();
141                 return mvchip->membase + GPIO_EDGE_MASK_MV78200_OFF(cpu);
142         case MVEBU_GPIO_SOC_VARIANT_ARMADAXP:
143                 cpu = smp_processor_id();
144                 return mvchip->percpu_membase + GPIO_EDGE_MASK_ARMADAXP_OFF(cpu);
145         default:
146                 BUG();
147         }
148 }
149
150 static void __iomem *mvebu_gpioreg_level_mask(struct mvebu_gpio_chip *mvchip)
151 {
152         int cpu;
153
154         switch (mvchip->soc_variant) {
155         case MVEBU_GPIO_SOC_VARIANT_ORION:
156                 return mvchip->membase + GPIO_LEVEL_MASK_OFF;
157         case MVEBU_GPIO_SOC_VARIANT_MV78200:
158                 cpu = smp_processor_id();
159                 return mvchip->membase + GPIO_LEVEL_MASK_MV78200_OFF(cpu);
160         case MVEBU_GPIO_SOC_VARIANT_ARMADAXP:
161                 cpu = smp_processor_id();
162                 return mvchip->percpu_membase + GPIO_LEVEL_MASK_ARMADAXP_OFF(cpu);
163         default:
164                 BUG();
165         }
166 }
167
168 /*
169  * Functions implementing the gpio_chip methods
170  */
171
172 static int mvebu_gpio_request(struct gpio_chip *chip, unsigned pin)
173 {
174         return pinctrl_request_gpio(chip->base + pin);
175 }
176
177 static void mvebu_gpio_free(struct gpio_chip *chip, unsigned pin)
178 {
179         pinctrl_free_gpio(chip->base + pin);
180 }
181
182 static void mvebu_gpio_set(struct gpio_chip *chip, unsigned pin, int value)
183 {
184         struct mvebu_gpio_chip *mvchip =
185                 container_of(chip, struct mvebu_gpio_chip, chip);
186         unsigned long flags;
187         u32 u;
188
189         spin_lock_irqsave(&mvchip->lock, flags);
190         u = readl_relaxed(mvebu_gpioreg_out(mvchip));
191         if (value)
192                 u |= 1 << pin;
193         else
194                 u &= ~(1 << pin);
195         writel_relaxed(u, mvebu_gpioreg_out(mvchip));
196         spin_unlock_irqrestore(&mvchip->lock, flags);
197 }
198
199 static int mvebu_gpio_get(struct gpio_chip *chip, unsigned pin)
200 {
201         struct mvebu_gpio_chip *mvchip =
202                 container_of(chip, struct mvebu_gpio_chip, chip);
203         u32 u;
204
205         if (readl_relaxed(mvebu_gpioreg_io_conf(mvchip)) & (1 << pin)) {
206                 u = readl_relaxed(mvebu_gpioreg_data_in(mvchip)) ^
207                         readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
208         } else {
209                 u = readl_relaxed(mvebu_gpioreg_out(mvchip));
210         }
211
212         return (u >> pin) & 1;
213 }
214
215 static void mvebu_gpio_blink(struct gpio_chip *chip, unsigned pin, int value)
216 {
217         struct mvebu_gpio_chip *mvchip =
218                 container_of(chip, struct mvebu_gpio_chip, chip);
219         unsigned long flags;
220         u32 u;
221
222         spin_lock_irqsave(&mvchip->lock, flags);
223         u = readl_relaxed(mvebu_gpioreg_blink(mvchip));
224         if (value)
225                 u |= 1 << pin;
226         else
227                 u &= ~(1 << pin);
228         writel_relaxed(u, mvebu_gpioreg_blink(mvchip));
229         spin_unlock_irqrestore(&mvchip->lock, flags);
230 }
231
232 static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
233 {
234         struct mvebu_gpio_chip *mvchip =
235                 container_of(chip, struct mvebu_gpio_chip, chip);
236         unsigned long flags;
237         int ret;
238         u32 u;
239
240         /* Check with the pinctrl driver whether this pin is usable as
241          * an input GPIO */
242         ret = pinctrl_gpio_direction_input(chip->base + pin);
243         if (ret)
244                 return ret;
245
246         spin_lock_irqsave(&mvchip->lock, flags);
247         u = readl_relaxed(mvebu_gpioreg_io_conf(mvchip));
248         u |= 1 << pin;
249         writel_relaxed(u, mvebu_gpioreg_io_conf(mvchip));
250         spin_unlock_irqrestore(&mvchip->lock, flags);
251
252         return 0;
253 }
254
255 static int mvebu_gpio_direction_output(struct gpio_chip *chip, unsigned pin,
256                                        int value)
257 {
258         struct mvebu_gpio_chip *mvchip =
259                 container_of(chip, struct mvebu_gpio_chip, chip);
260         unsigned long flags;
261         int ret;
262         u32 u;
263
264         /* Check with the pinctrl driver whether this pin is usable as
265          * an output GPIO */
266         ret = pinctrl_gpio_direction_output(chip->base + pin);
267         if (ret)
268                 return ret;
269
270         mvebu_gpio_blink(chip, pin, 0);
271         mvebu_gpio_set(chip, pin, value);
272
273         spin_lock_irqsave(&mvchip->lock, flags);
274         u = readl_relaxed(mvebu_gpioreg_io_conf(mvchip));
275         u &= ~(1 << pin);
276         writel_relaxed(u, mvebu_gpioreg_io_conf(mvchip));
277         spin_unlock_irqrestore(&mvchip->lock, flags);
278
279         return 0;
280 }
281
282 static int mvebu_gpio_to_irq(struct gpio_chip *chip, unsigned pin)
283 {
284         struct mvebu_gpio_chip *mvchip =
285                 container_of(chip, struct mvebu_gpio_chip, chip);
286         return irq_create_mapping(mvchip->domain, pin);
287 }
288
289 /*
290  * Functions implementing the irq_chip methods
291  */
292 static void mvebu_gpio_irq_ack(struct irq_data *d)
293 {
294         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
295         struct mvebu_gpio_chip *mvchip = gc->private;
296         u32 mask = ~(1 << (d->irq - gc->irq_base));
297
298         irq_gc_lock(gc);
299         writel_relaxed(mask, mvebu_gpioreg_edge_cause(mvchip));
300         irq_gc_unlock(gc);
301 }
302
303 static void mvebu_gpio_edge_irq_mask(struct irq_data *d)
304 {
305         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
306         struct mvebu_gpio_chip *mvchip = gc->private;
307         u32 mask = 1 << (d->irq - gc->irq_base);
308
309         irq_gc_lock(gc);
310         gc->mask_cache &= ~mask;
311         writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip));
312         irq_gc_unlock(gc);
313 }
314
315 static void mvebu_gpio_edge_irq_unmask(struct irq_data *d)
316 {
317         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
318         struct mvebu_gpio_chip *mvchip = gc->private;
319         u32 mask = 1 << (d->irq - gc->irq_base);
320
321         irq_gc_lock(gc);
322         gc->mask_cache |= mask;
323         writel_relaxed(gc->mask_cache, mvebu_gpioreg_edge_mask(mvchip));
324         irq_gc_unlock(gc);
325 }
326
327 static void mvebu_gpio_level_irq_mask(struct irq_data *d)
328 {
329         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
330         struct mvebu_gpio_chip *mvchip = gc->private;
331         u32 mask = 1 << (d->irq - gc->irq_base);
332
333         irq_gc_lock(gc);
334         gc->mask_cache &= ~mask;
335         writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip));
336         irq_gc_unlock(gc);
337 }
338
339 static void mvebu_gpio_level_irq_unmask(struct irq_data *d)
340 {
341         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
342         struct mvebu_gpio_chip *mvchip = gc->private;
343         u32 mask = 1 << (d->irq - gc->irq_base);
344
345         irq_gc_lock(gc);
346         gc->mask_cache |= mask;
347         writel_relaxed(gc->mask_cache, mvebu_gpioreg_level_mask(mvchip));
348         irq_gc_unlock(gc);
349 }
350
351 /*****************************************************************************
352  * MVEBU GPIO IRQ
353  *
354  * GPIO_IN_POL register controls whether GPIO_DATA_IN will hold the same
355  * value of the line or the opposite value.
356  *
357  * Level IRQ handlers: DATA_IN is used directly as cause register.
358  *                     Interrupt are masked by LEVEL_MASK registers.
359  * Edge IRQ handlers:  Change in DATA_IN are latched in EDGE_CAUSE.
360  *                     Interrupt are masked by EDGE_MASK registers.
361  * Both-edge handlers: Similar to regular Edge handlers, but also swaps
362  *                     the polarity to catch the next line transaction.
363  *                     This is a race condition that might not perfectly
364  *                     work on some use cases.
365  *
366  * Every eight GPIO lines are grouped (OR'ed) before going up to main
367  * cause register.
368  *
369  *                    EDGE  cause    mask
370  *        data-in   /--------| |-----| |----\
371  *     -----| |-----                         ---- to main cause reg
372  *           X      \----------------| |----/
373  *        polarity    LEVEL          mask
374  *
375  ****************************************************************************/
376
377 static int mvebu_gpio_irq_set_type(struct irq_data *d, unsigned int type)
378 {
379         struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
380         struct irq_chip_type *ct = irq_data_get_chip_type(d);
381         struct mvebu_gpio_chip *mvchip = gc->private;
382         int pin;
383         u32 u;
384
385         pin = d->hwirq;
386
387         u = readl_relaxed(mvebu_gpioreg_io_conf(mvchip)) & (1 << pin);
388         if (!u) {
389                 return -EINVAL;
390         }
391
392         type &= IRQ_TYPE_SENSE_MASK;
393         if (type == IRQ_TYPE_NONE)
394                 return -EINVAL;
395
396         /* Check if we need to change chip and handler */
397         if (!(ct->type & type))
398                 if (irq_setup_alt_chip(d, type))
399                         return -EINVAL;
400
401         /*
402          * Configure interrupt polarity.
403          */
404         switch (type) {
405         case IRQ_TYPE_EDGE_RISING:
406         case IRQ_TYPE_LEVEL_HIGH:
407                 u = readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
408                 u &= ~(1 << pin);
409                 writel_relaxed(u, mvebu_gpioreg_in_pol(mvchip));
410                 break;
411         case IRQ_TYPE_EDGE_FALLING:
412         case IRQ_TYPE_LEVEL_LOW:
413                 u = readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
414                 u |= 1 << pin;
415                 writel_relaxed(u, mvebu_gpioreg_in_pol(mvchip));
416                 break;
417         case IRQ_TYPE_EDGE_BOTH: {
418                 u32 v;
419
420                 v = readl_relaxed(mvebu_gpioreg_in_pol(mvchip)) ^
421                         readl_relaxed(mvebu_gpioreg_data_in(mvchip));
422
423                 /*
424                  * set initial polarity based on current input level
425                  */
426                 u = readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
427                 if (v & (1 << pin))
428                         u |= 1 << pin;          /* falling */
429                 else
430                         u &= ~(1 << pin);       /* rising */
431                 writel_relaxed(u, mvebu_gpioreg_in_pol(mvchip));
432                 break;
433         }
434         }
435         return 0;
436 }
437
438 static void mvebu_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
439 {
440         struct mvebu_gpio_chip *mvchip = irq_get_handler_data(irq);
441         u32 cause, type;
442         int i;
443
444         if (mvchip == NULL)
445                 return;
446
447         cause = readl_relaxed(mvebu_gpioreg_data_in(mvchip)) &
448                 readl_relaxed(mvebu_gpioreg_level_mask(mvchip));
449         cause |= readl_relaxed(mvebu_gpioreg_edge_cause(mvchip)) &
450                 readl_relaxed(mvebu_gpioreg_edge_mask(mvchip));
451
452         for (i = 0; i < mvchip->chip.ngpio; i++) {
453                 int irq;
454
455                 irq = mvchip->irqbase + i;
456
457                 if (!(cause & (1 << i)))
458                         continue;
459
460                 type = irq_get_trigger_type(irq);
461                 if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
462                         /* Swap polarity (race with GPIO line) */
463                         u32 polarity;
464
465                         polarity = readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
466                         polarity ^= 1 << i;
467                         writel_relaxed(polarity, mvebu_gpioreg_in_pol(mvchip));
468                 }
469                 generic_handle_irq(irq);
470         }
471 }
472
473 #ifdef CONFIG_DEBUG_FS
474 #include <linux/seq_file.h>
475
476 static void mvebu_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
477 {
478         struct mvebu_gpio_chip *mvchip =
479                 container_of(chip, struct mvebu_gpio_chip, chip);
480         u32 out, io_conf, blink, in_pol, data_in, cause, edg_msk, lvl_msk;
481         int i;
482
483         out     = readl_relaxed(mvebu_gpioreg_out(mvchip));
484         io_conf = readl_relaxed(mvebu_gpioreg_io_conf(mvchip));
485         blink   = readl_relaxed(mvebu_gpioreg_blink(mvchip));
486         in_pol  = readl_relaxed(mvebu_gpioreg_in_pol(mvchip));
487         data_in = readl_relaxed(mvebu_gpioreg_data_in(mvchip));
488         cause   = readl_relaxed(mvebu_gpioreg_edge_cause(mvchip));
489         edg_msk = readl_relaxed(mvebu_gpioreg_edge_mask(mvchip));
490         lvl_msk = readl_relaxed(mvebu_gpioreg_level_mask(mvchip));
491
492         for (i = 0; i < chip->ngpio; i++) {
493                 const char *label;
494                 u32 msk;
495                 bool is_out;
496
497                 label = gpiochip_is_requested(chip, i);
498                 if (!label)
499                         continue;
500
501                 msk = 1 << i;
502                 is_out = !(io_conf & msk);
503
504                 seq_printf(s, " gpio-%-3d (%-20.20s)", chip->base + i, label);
505
506                 if (is_out) {
507                         seq_printf(s, " out %s %s\n",
508                                    out & msk ? "hi" : "lo",
509                                    blink & msk ? "(blink )" : "");
510                         continue;
511                 }
512
513                 seq_printf(s, " in  %s (act %s) - IRQ",
514                            (data_in ^ in_pol) & msk  ? "hi" : "lo",
515                            in_pol & msk ? "lo" : "hi");
516                 if (!((edg_msk | lvl_msk) & msk)) {
517                         seq_printf(s, " disabled\n");
518                         continue;
519                 }
520                 if (edg_msk & msk)
521                         seq_printf(s, " edge ");
522                 if (lvl_msk & msk)
523                         seq_printf(s, " level");
524                 seq_printf(s, " (%s)\n", cause & msk ? "pending" : "clear  ");
525         }
526 }
527 #else
528 #define mvebu_gpio_dbg_show NULL
529 #endif
530
531 static struct of_device_id mvebu_gpio_of_match[] = {
532         {
533                 .compatible = "marvell,orion-gpio",
534                 .data       = (void *) MVEBU_GPIO_SOC_VARIANT_ORION,
535         },
536         {
537                 .compatible = "marvell,mv78200-gpio",
538                 .data       = (void *) MVEBU_GPIO_SOC_VARIANT_MV78200,
539         },
540         {
541                 .compatible = "marvell,armadaxp-gpio",
542                 .data       = (void *) MVEBU_GPIO_SOC_VARIANT_ARMADAXP,
543         },
544         {
545                 /* sentinel */
546         },
547 };
548 MODULE_DEVICE_TABLE(of, mvebu_gpio_of_match);
549
550 static int mvebu_gpio_probe(struct platform_device *pdev)
551 {
552         struct mvebu_gpio_chip *mvchip;
553         const struct of_device_id *match;
554         struct device_node *np = pdev->dev.of_node;
555         struct resource *res;
556         struct irq_chip_generic *gc;
557         struct irq_chip_type *ct;
558         struct clk *clk;
559         unsigned int ngpios;
560         int soc_variant;
561         int i, cpu, id;
562
563         match = of_match_device(mvebu_gpio_of_match, &pdev->dev);
564         if (match)
565                 soc_variant = (int) match->data;
566         else
567                 soc_variant = MVEBU_GPIO_SOC_VARIANT_ORION;
568
569         mvchip = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_gpio_chip), GFP_KERNEL);
570         if (!mvchip) {
571                 dev_err(&pdev->dev, "Cannot allocate memory\n");
572                 return -ENOMEM;
573         }
574
575         if (of_property_read_u32(pdev->dev.of_node, "ngpios", &ngpios)) {
576                 dev_err(&pdev->dev, "Missing ngpios OF property\n");
577                 return -ENODEV;
578         }
579
580         id = of_alias_get_id(pdev->dev.of_node, "gpio");
581         if (id < 0) {
582                 dev_err(&pdev->dev, "Couldn't get OF id\n");
583                 return id;
584         }
585
586         clk = devm_clk_get(&pdev->dev, NULL);
587         /* Not all SoCs require a clock.*/
588         if (!IS_ERR(clk))
589                 clk_prepare_enable(clk);
590
591         mvchip->soc_variant = soc_variant;
592         mvchip->chip.label = dev_name(&pdev->dev);
593         mvchip->chip.dev = &pdev->dev;
594         mvchip->chip.request = mvebu_gpio_request;
595         mvchip->chip.free = mvebu_gpio_free;
596         mvchip->chip.direction_input = mvebu_gpio_direction_input;
597         mvchip->chip.get = mvebu_gpio_get;
598         mvchip->chip.direction_output = mvebu_gpio_direction_output;
599         mvchip->chip.set = mvebu_gpio_set;
600         mvchip->chip.to_irq = mvebu_gpio_to_irq;
601         mvchip->chip.base = id * MVEBU_MAX_GPIO_PER_BANK;
602         mvchip->chip.ngpio = ngpios;
603         mvchip->chip.can_sleep = 0;
604         mvchip->chip.of_node = np;
605         mvchip->chip.dbg_show = mvebu_gpio_dbg_show;
606
607         spin_lock_init(&mvchip->lock);
608         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
609         mvchip->membase = devm_ioremap_resource(&pdev->dev, res);
610         if (IS_ERR(mvchip->membase))
611                 return PTR_ERR(mvchip->membase);
612
613         /* The Armada XP has a second range of registers for the
614          * per-CPU registers */
615         if (soc_variant == MVEBU_GPIO_SOC_VARIANT_ARMADAXP) {
616                 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
617                 mvchip->percpu_membase = devm_ioremap_resource(&pdev->dev,
618                                                                res);
619                 if (IS_ERR(mvchip->percpu_membase))
620                         return PTR_ERR(mvchip->percpu_membase);
621         }
622
623         /*
624          * Mask and clear GPIO interrupts.
625          */
626         switch (soc_variant) {
627         case MVEBU_GPIO_SOC_VARIANT_ORION:
628                 writel_relaxed(0, mvchip->membase + GPIO_EDGE_CAUSE_OFF);
629                 writel_relaxed(0, mvchip->membase + GPIO_EDGE_MASK_OFF);
630                 writel_relaxed(0, mvchip->membase + GPIO_LEVEL_MASK_OFF);
631                 break;
632         case MVEBU_GPIO_SOC_VARIANT_MV78200:
633                 writel_relaxed(0, mvchip->membase + GPIO_EDGE_CAUSE_OFF);
634                 for (cpu = 0; cpu < 2; cpu++) {
635                         writel_relaxed(0, mvchip->membase +
636                                        GPIO_EDGE_MASK_MV78200_OFF(cpu));
637                         writel_relaxed(0, mvchip->membase +
638                                        GPIO_LEVEL_MASK_MV78200_OFF(cpu));
639                 }
640                 break;
641         case MVEBU_GPIO_SOC_VARIANT_ARMADAXP:
642                 writel_relaxed(0, mvchip->membase + GPIO_EDGE_CAUSE_OFF);
643                 writel_relaxed(0, mvchip->membase + GPIO_EDGE_MASK_OFF);
644                 writel_relaxed(0, mvchip->membase + GPIO_LEVEL_MASK_OFF);
645                 for (cpu = 0; cpu < 4; cpu++) {
646                         writel_relaxed(0, mvchip->percpu_membase +
647                                        GPIO_EDGE_CAUSE_ARMADAXP_OFF(cpu));
648                         writel_relaxed(0, mvchip->percpu_membase +
649                                        GPIO_EDGE_MASK_ARMADAXP_OFF(cpu));
650                         writel_relaxed(0, mvchip->percpu_membase +
651                                        GPIO_LEVEL_MASK_ARMADAXP_OFF(cpu));
652                 }
653                 break;
654         default:
655                 BUG();
656         }
657
658         gpiochip_add(&mvchip->chip);
659
660         /* Some gpio controllers do not provide irq support */
661         if (!of_irq_count(np))
662                 return 0;
663
664         /* Setup the interrupt handlers. Each chip can have up to 4
665          * interrupt handlers, with each handler dealing with 8 GPIO
666          * pins. */
667         for (i = 0; i < 4; i++) {
668                 int irq;
669                 irq = platform_get_irq(pdev, i);
670                 if (irq < 0)
671                         continue;
672                 irq_set_handler_data(irq, mvchip);
673                 irq_set_chained_handler(irq, mvebu_gpio_irq_handler);
674         }
675
676         mvchip->irqbase = irq_alloc_descs(-1, 0, ngpios, -1);
677         if (mvchip->irqbase < 0) {
678                 dev_err(&pdev->dev, "no irqs\n");
679                 return -ENOMEM;
680         }
681
682         gc = irq_alloc_generic_chip("mvebu_gpio_irq", 2, mvchip->irqbase,
683                                     mvchip->membase, handle_level_irq);
684         if (!gc) {
685                 dev_err(&pdev->dev, "Cannot allocate generic irq_chip\n");
686                 return -ENOMEM;
687         }
688
689         gc->private = mvchip;
690         ct = &gc->chip_types[0];
691         ct->type = IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW;
692         ct->chip.irq_mask = mvebu_gpio_level_irq_mask;
693         ct->chip.irq_unmask = mvebu_gpio_level_irq_unmask;
694         ct->chip.irq_set_type = mvebu_gpio_irq_set_type;
695         ct->chip.name = mvchip->chip.label;
696
697         ct = &gc->chip_types[1];
698         ct->type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
699         ct->chip.irq_ack = mvebu_gpio_irq_ack;
700         ct->chip.irq_mask = mvebu_gpio_edge_irq_mask;
701         ct->chip.irq_unmask = mvebu_gpio_edge_irq_unmask;
702         ct->chip.irq_set_type = mvebu_gpio_irq_set_type;
703         ct->handler = handle_edge_irq;
704         ct->chip.name = mvchip->chip.label;
705
706         irq_setup_generic_chip(gc, IRQ_MSK(ngpios), 0,
707                                IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE);
708
709         /* Setup irq domain on top of the generic chip. */
710         mvchip->domain = irq_domain_add_simple(np, mvchip->chip.ngpio,
711                                                mvchip->irqbase,
712                                                &irq_domain_simple_ops,
713                                                mvchip);
714         if (!mvchip->domain) {
715                 dev_err(&pdev->dev, "couldn't allocate irq domain %s (DT).\n",
716                         mvchip->chip.label);
717                 irq_remove_generic_chip(gc, IRQ_MSK(ngpios), IRQ_NOREQUEST,
718                                         IRQ_LEVEL | IRQ_NOPROBE);
719                 kfree(gc);
720                 return -ENODEV;
721         }
722
723         return 0;
724 }
725
726 static struct platform_driver mvebu_gpio_driver = {
727         .driver         = {
728                 .name           = "mvebu-gpio",
729                 .owner          = THIS_MODULE,
730                 .of_match_table = mvebu_gpio_of_match,
731         },
732         .probe          = mvebu_gpio_probe,
733 };
734
735 static int __init mvebu_gpio_init(void)
736 {
737         return platform_driver_register(&mvebu_gpio_driver);
738 }
739 postcore_initcall(mvebu_gpio_init);