Merge tag 'loongarch-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai...
[linux-2.6-microblaze.git] / drivers / pinctrl / spear / pinctrl-plgpio.c
1 /*
2  * SPEAr platform PLGPIO driver
3  *
4  * Copyright (C) 2012 ST Microelectronics
5  * Viresh Kumar <viresh.kumar@linaro.org>
6  *
7  * This file is licensed under the terms of the GNU General Public
8  * License version 2. This program is licensed "as is" without any
9  * warranty of any kind, whether express or implied.
10  */
11
12 #include <linux/clk.h>
13 #include <linux/err.h>
14 #include <linux/gpio/driver.h>
15 #include <linux/io.h>
16 #include <linux/init.h>
17 #include <linux/mfd/syscon.h>
18 #include <linux/of.h>
19 #include <linux/of_platform.h>
20 #include <linux/pinctrl/consumer.h>
21 #include <linux/platform_device.h>
22 #include <linux/pm.h>
23 #include <linux/regmap.h>
24 #include <linux/spinlock.h>
25
26 #define MAX_GPIO_PER_REG                32
27 #define PIN_OFFSET(pin)                 (pin % MAX_GPIO_PER_REG)
28 #define REG_OFFSET(base, reg, pin)      (base + reg + (pin / MAX_GPIO_PER_REG) \
29                                                         * sizeof(int *))
30
31 /*
32  * plgpio pins in all machines are not one to one mapped, bitwise with registers
33  * bits. These set of macros define register masks for which below functions
34  * (pin_to_offset and offset_to_pin) are required to be called.
35  */
36 #define PTO_ENB_REG             0x001
37 #define PTO_WDATA_REG           0x002
38 #define PTO_DIR_REG             0x004
39 #define PTO_IE_REG              0x008
40 #define PTO_RDATA_REG           0x010
41 #define PTO_MIS_REG             0x020
42
43 struct plgpio_regs {
44         u32 enb;                /* enable register */
45         u32 wdata;              /* write data register */
46         u32 dir;                /* direction set register */
47         u32 rdata;              /* read data register */
48         u32 ie;                 /* interrupt enable register */
49         u32 mis;                /* mask interrupt status register */
50         u32 eit;                /* edge interrupt type */
51 };
52
53 /*
54  * struct plgpio: plgpio driver specific structure
55  *
56  * lock: lock for guarding gpio registers
57  * base: base address of plgpio block
58  * chip: gpio framework specific chip information structure
59  * p2o: function ptr for pin to offset conversion. This is required only for
60  *      machines where mapping b/w pin and offset is not 1-to-1.
61  * o2p: function ptr for offset to pin conversion. This is required only for
62  *      machines where mapping b/w pin and offset is not 1-to-1.
63  * p2o_regs: mask of registers for which p2o and o2p are applicable
64  * regs: register offsets
65  * csave_regs: context save registers for standby/sleep/hibernate cases
66  */
67 struct plgpio {
68         spinlock_t              lock;
69         struct regmap           *regmap;
70         struct clk              *clk;
71         struct gpio_chip        chip;
72         int                     (*p2o)(int pin);        /* pin_to_offset */
73         int                     (*o2p)(int offset);     /* offset_to_pin */
74         u32                     p2o_regs;
75         struct plgpio_regs      regs;
76 #ifdef CONFIG_PM_SLEEP
77         struct plgpio_regs      *csave_regs;
78 #endif
79 };
80
81 /* register manipulation inline functions */
82 static inline u32 is_plgpio_set(struct regmap *regmap, u32 pin, u32 reg)
83 {
84         u32 offset = PIN_OFFSET(pin);
85         u32 reg_off = REG_OFFSET(0, reg, pin);
86         u32 val;
87
88         regmap_read(regmap, reg_off, &val);
89
90         return !!(val & (1 << offset));
91 }
92
93 static inline void plgpio_reg_set(struct regmap *regmap, u32 pin, u32 reg)
94 {
95         u32 offset = PIN_OFFSET(pin);
96         u32 reg_off = REG_OFFSET(0, reg, pin);
97         u32 mask;
98
99         mask = 1 << offset;
100         regmap_update_bits(regmap, reg_off, mask, mask);
101 }
102
103 static inline void plgpio_reg_reset(struct regmap *regmap, u32 pin, u32 reg)
104 {
105         u32 offset = PIN_OFFSET(pin);
106         u32 reg_off = REG_OFFSET(0, reg, pin);
107         u32 mask;
108
109         mask = 1 << offset;
110         regmap_update_bits(regmap, reg_off, mask, 0);
111 }
112
113
114 /* gpio framework specific routines */
115 static int plgpio_direction_input(struct gpio_chip *chip, unsigned offset)
116 {
117         struct plgpio *plgpio = gpiochip_get_data(chip);
118         unsigned long flags;
119
120         /* get correct offset for "offset" pin */
121         if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) {
122                 offset = plgpio->p2o(offset);
123                 if (offset == -1)
124                         return -EINVAL;
125         }
126
127         spin_lock_irqsave(&plgpio->lock, flags);
128         plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.dir);
129         spin_unlock_irqrestore(&plgpio->lock, flags);
130
131         return 0;
132 }
133
134 static int plgpio_direction_output(struct gpio_chip *chip, unsigned offset,
135                 int value)
136 {
137         struct plgpio *plgpio = gpiochip_get_data(chip);
138         unsigned long flags;
139         unsigned dir_offset = offset, wdata_offset = offset, tmp;
140
141         /* get correct offset for "offset" pin */
142         if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) {
143                 tmp = plgpio->p2o(offset);
144                 if (tmp == -1)
145                         return -EINVAL;
146
147                 if (plgpio->p2o_regs & PTO_DIR_REG)
148                         dir_offset = tmp;
149                 if (plgpio->p2o_regs & PTO_WDATA_REG)
150                         wdata_offset = tmp;
151         }
152
153         spin_lock_irqsave(&plgpio->lock, flags);
154         if (value)
155                 plgpio_reg_set(plgpio->regmap, wdata_offset,
156                                 plgpio->regs.wdata);
157         else
158                 plgpio_reg_reset(plgpio->regmap, wdata_offset,
159                                 plgpio->regs.wdata);
160
161         plgpio_reg_reset(plgpio->regmap, dir_offset, plgpio->regs.dir);
162         spin_unlock_irqrestore(&plgpio->lock, flags);
163
164         return 0;
165 }
166
167 static int plgpio_get_value(struct gpio_chip *chip, unsigned offset)
168 {
169         struct plgpio *plgpio = gpiochip_get_data(chip);
170
171         if (offset >= chip->ngpio)
172                 return -EINVAL;
173
174         /* get correct offset for "offset" pin */
175         if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) {
176                 offset = plgpio->p2o(offset);
177                 if (offset == -1)
178                         return -EINVAL;
179         }
180
181         return is_plgpio_set(plgpio->regmap, offset, plgpio->regs.rdata);
182 }
183
184 static void plgpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
185 {
186         struct plgpio *plgpio = gpiochip_get_data(chip);
187
188         if (offset >= chip->ngpio)
189                 return;
190
191         /* get correct offset for "offset" pin */
192         if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) {
193                 offset = plgpio->p2o(offset);
194                 if (offset == -1)
195                         return;
196         }
197
198         if (value)
199                 plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.wdata);
200         else
201                 plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.wdata);
202 }
203
204 static int plgpio_request(struct gpio_chip *chip, unsigned offset)
205 {
206         struct plgpio *plgpio = gpiochip_get_data(chip);
207         unsigned long flags;
208         int ret = 0;
209
210         if (offset >= chip->ngpio)
211                 return -EINVAL;
212
213         ret = pinctrl_gpio_request(chip, offset);
214         if (ret)
215                 return ret;
216
217         if (!IS_ERR(plgpio->clk)) {
218                 ret = clk_enable(plgpio->clk);
219                 if (ret)
220                         goto err0;
221         }
222
223         if (plgpio->regs.enb == -1)
224                 return 0;
225
226         /*
227          * put gpio in IN mode before enabling it. This make enabling gpio safe
228          */
229         ret = plgpio_direction_input(chip, offset);
230         if (ret)
231                 goto err1;
232
233         /* get correct offset for "offset" pin */
234         if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
235                 offset = plgpio->p2o(offset);
236                 if (offset == -1) {
237                         ret = -EINVAL;
238                         goto err1;
239                 }
240         }
241
242         spin_lock_irqsave(&plgpio->lock, flags);
243         plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.enb);
244         spin_unlock_irqrestore(&plgpio->lock, flags);
245         return 0;
246
247 err1:
248         if (!IS_ERR(plgpio->clk))
249                 clk_disable(plgpio->clk);
250 err0:
251         pinctrl_gpio_free(chip, offset);
252         return ret;
253 }
254
255 static void plgpio_free(struct gpio_chip *chip, unsigned offset)
256 {
257         struct plgpio *plgpio = gpiochip_get_data(chip);
258         unsigned long flags;
259
260         if (offset >= chip->ngpio)
261                 return;
262
263         if (plgpio->regs.enb == -1)
264                 goto disable_clk;
265
266         /* get correct offset for "offset" pin */
267         if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
268                 offset = plgpio->p2o(offset);
269                 if (offset == -1)
270                         return;
271         }
272
273         spin_lock_irqsave(&plgpio->lock, flags);
274         plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.enb);
275         spin_unlock_irqrestore(&plgpio->lock, flags);
276
277 disable_clk:
278         if (!IS_ERR(plgpio->clk))
279                 clk_disable(plgpio->clk);
280
281         pinctrl_gpio_free(chip, offset);
282 }
283
284 /* PLGPIO IRQ */
285 static void plgpio_irq_disable(struct irq_data *d)
286 {
287         struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
288         struct plgpio *plgpio = gpiochip_get_data(gc);
289         int offset = d->hwirq;
290         unsigned long flags;
291
292         /* get correct offset for "offset" pin */
293         if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
294                 offset = plgpio->p2o(offset);
295                 if (offset == -1)
296                         return;
297         }
298
299         spin_lock_irqsave(&plgpio->lock, flags);
300         plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.ie);
301         spin_unlock_irqrestore(&plgpio->lock, flags);
302         gpiochip_disable_irq(gc, irqd_to_hwirq(d));
303 }
304
305 static void plgpio_irq_enable(struct irq_data *d)
306 {
307         struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
308         struct plgpio *plgpio = gpiochip_get_data(gc);
309         int offset = d->hwirq;
310         unsigned long flags;
311
312         /* get correct offset for "offset" pin */
313         if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
314                 offset = plgpio->p2o(offset);
315                 if (offset == -1)
316                         return;
317         }
318
319         gpiochip_enable_irq(gc, irqd_to_hwirq(d));
320         spin_lock_irqsave(&plgpio->lock, flags);
321         plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.ie);
322         spin_unlock_irqrestore(&plgpio->lock, flags);
323 }
324
325 static int plgpio_irq_set_type(struct irq_data *d, unsigned trigger)
326 {
327         struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
328         struct plgpio *plgpio = gpiochip_get_data(gc);
329         int offset = d->hwirq;
330         u32 reg_off;
331         unsigned int supported_type = 0, val;
332
333         if (offset >= plgpio->chip.ngpio)
334                 return -EINVAL;
335
336         if (plgpio->regs.eit == -1)
337                 supported_type = IRQ_TYPE_LEVEL_HIGH;
338         else
339                 supported_type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
340
341         if (!(trigger & supported_type))
342                 return -EINVAL;
343
344         if (plgpio->regs.eit == -1)
345                 return 0;
346
347         reg_off = REG_OFFSET(0, plgpio->regs.eit, offset);
348         regmap_read(plgpio->regmap, reg_off, &val);
349
350         offset = PIN_OFFSET(offset);
351         if (trigger & IRQ_TYPE_EDGE_RISING)
352                 regmap_write(plgpio->regmap, reg_off, val | (1 << offset));
353         else
354                 regmap_write(plgpio->regmap, reg_off, val & ~(1 << offset));
355
356         return 0;
357 }
358
359 static const struct irq_chip plgpio_irqchip = {
360         .name           = "PLGPIO",
361         .irq_enable     = plgpio_irq_enable,
362         .irq_disable    = plgpio_irq_disable,
363         .irq_set_type   = plgpio_irq_set_type,
364         .flags          = IRQCHIP_IMMUTABLE,
365         GPIOCHIP_IRQ_RESOURCE_HELPERS,
366 };
367
368 static void plgpio_irq_handler(struct irq_desc *desc)
369 {
370         struct gpio_chip *gc = irq_desc_get_handler_data(desc);
371         struct plgpio *plgpio = gpiochip_get_data(gc);
372         struct irq_chip *irqchip = irq_desc_get_chip(desc);
373         int regs_count, count, pin, offset, i = 0;
374         u32 pending;
375         unsigned long pendingl;
376
377         count = plgpio->chip.ngpio;
378         regs_count = DIV_ROUND_UP(count, MAX_GPIO_PER_REG);
379
380         chained_irq_enter(irqchip, desc);
381         /* check all plgpio MIS registers for a possible interrupt */
382         for (; i < regs_count; i++) {
383                 regmap_read(plgpio->regmap, plgpio->regs.mis +
384                         i * sizeof(int *), &pending);
385                 if (!pending)
386                         continue;
387
388                 /* clear interrupts */
389                 regmap_write(plgpio->regmap, plgpio->regs.mis +
390                         i * sizeof(int *), ~pending);
391                 /*
392                  * clear extra bits in last register having gpios < MAX/REG
393                  * ex: Suppose there are max 102 plgpios. then last register
394                  * must have only (102 - MAX_GPIO_PER_REG * 3) = 6 relevant bits
395                  * so, we must not take other 28 bits into consideration for
396                  * checking interrupt. so clear those bits.
397                  */
398                 count = count - i * MAX_GPIO_PER_REG;
399                 if (count < MAX_GPIO_PER_REG)
400                         pending &= (1 << count) - 1;
401
402                 pendingl = pending;
403                 for_each_set_bit(offset, &pendingl, MAX_GPIO_PER_REG) {
404                         /* get correct pin for "offset" */
405                         if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) {
406                                 pin = plgpio->o2p(offset);
407                                 if (pin == -1)
408                                         continue;
409                         } else
410                                 pin = offset;
411
412                         /* get correct irq line number */
413                         pin = i * MAX_GPIO_PER_REG + pin;
414                         generic_handle_domain_irq(gc->irq.domain, pin);
415                 }
416         }
417         chained_irq_exit(irqchip, desc);
418 }
419
420 /*
421  * pin to offset and offset to pin converter functions
422  *
423  * In spear310 there is inconsistency among bit positions in plgpio regiseters,
424  * for different plgpio pins. For example: for pin 27, bit offset is 23, pin
425  * 28-33 are not supported, pin 95 has offset bit 95, bit 100 has offset bit 1
426  */
427 static int spear310_p2o(int pin)
428 {
429         int offset = pin;
430
431         if (pin <= 27)
432                 offset += 4;
433         else if (pin <= 33)
434                 offset = -1;
435         else if (pin <= 97)
436                 offset -= 2;
437         else if (pin <= 101)
438                 offset = 101 - pin;
439         else
440                 offset = -1;
441
442         return offset;
443 }
444
445 static int spear310_o2p(int offset)
446 {
447         if (offset <= 3)
448                 return 101 - offset;
449         else if (offset <= 31)
450                 return offset - 4;
451         else
452                 return offset + 2;
453 }
454
455 static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio)
456 {
457         struct device_node *np = pdev->dev.of_node;
458         int ret = -EINVAL;
459         u32 val;
460
461         if (of_machine_is_compatible("st,spear310")) {
462                 plgpio->p2o = spear310_p2o;
463                 plgpio->o2p = spear310_o2p;
464                 plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG |
465                         PTO_RDATA_REG | PTO_MIS_REG;
466         }
467
468         if (!of_property_read_u32(np, "st-plgpio,ngpio", &val)) {
469                 plgpio->chip.ngpio = val;
470         } else {
471                 dev_err(&pdev->dev, "DT: Invalid ngpio field\n");
472                 goto end;
473         }
474
475         if (!of_property_read_u32(np, "st-plgpio,enb-reg", &val))
476                 plgpio->regs.enb = val;
477         else
478                 plgpio->regs.enb = -1;
479
480         if (!of_property_read_u32(np, "st-plgpio,wdata-reg", &val)) {
481                 plgpio->regs.wdata = val;
482         } else {
483                 dev_err(&pdev->dev, "DT: Invalid wdata reg\n");
484                 goto end;
485         }
486
487         if (!of_property_read_u32(np, "st-plgpio,dir-reg", &val)) {
488                 plgpio->regs.dir = val;
489         } else {
490                 dev_err(&pdev->dev, "DT: Invalid dir reg\n");
491                 goto end;
492         }
493
494         if (!of_property_read_u32(np, "st-plgpio,ie-reg", &val)) {
495                 plgpio->regs.ie = val;
496         } else {
497                 dev_err(&pdev->dev, "DT: Invalid ie reg\n");
498                 goto end;
499         }
500
501         if (!of_property_read_u32(np, "st-plgpio,rdata-reg", &val)) {
502                 plgpio->regs.rdata = val;
503         } else {
504                 dev_err(&pdev->dev, "DT: Invalid rdata reg\n");
505                 goto end;
506         }
507
508         if (!of_property_read_u32(np, "st-plgpio,mis-reg", &val)) {
509                 plgpio->regs.mis = val;
510         } else {
511                 dev_err(&pdev->dev, "DT: Invalid mis reg\n");
512                 goto end;
513         }
514
515         if (!of_property_read_u32(np, "st-plgpio,eit-reg", &val))
516                 plgpio->regs.eit = val;
517         else
518                 plgpio->regs.eit = -1;
519
520         return 0;
521
522 end:
523         return ret;
524 }
525
526 static int plgpio_probe(struct platform_device *pdev)
527 {
528         struct device_node *regmap_np;
529         struct plgpio *plgpio;
530         int ret, irq;
531
532         plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
533         if (!plgpio)
534                 return -ENOMEM;
535
536         regmap_np = of_parse_phandle(pdev->dev.of_node, "regmap", 0);
537         if (regmap_np) {
538                 plgpio->regmap = device_node_to_regmap(regmap_np);
539                 of_node_put(regmap_np);
540                 if (IS_ERR(plgpio->regmap)) {
541                         dev_err(&pdev->dev, "Retrieve regmap failed (%pe)\n",
542                                 plgpio->regmap);
543                         return PTR_ERR(plgpio->regmap);
544                 }
545         } else {
546                 plgpio->regmap = device_node_to_regmap(pdev->dev.of_node);
547                 if (IS_ERR(plgpio->regmap)) {
548                         dev_err(&pdev->dev, "Init regmap failed (%pe)\n",
549                                 plgpio->regmap);
550                         return PTR_ERR(plgpio->regmap);
551                 }
552         }
553
554         ret = plgpio_probe_dt(pdev, plgpio);
555         if (ret) {
556                 dev_err(&pdev->dev, "DT probe failed\n");
557                 return ret;
558         }
559
560         plgpio->clk = devm_clk_get(&pdev->dev, NULL);
561         if (IS_ERR(plgpio->clk))
562                 dev_warn(&pdev->dev, "clk_get() failed, work without it\n");
563
564 #ifdef CONFIG_PM_SLEEP
565         plgpio->csave_regs = devm_kcalloc(&pdev->dev,
566                         DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
567                         sizeof(*plgpio->csave_regs),
568                         GFP_KERNEL);
569         if (!plgpio->csave_regs)
570                 return -ENOMEM;
571 #endif
572
573         platform_set_drvdata(pdev, plgpio);
574         spin_lock_init(&plgpio->lock);
575
576         plgpio->chip.base = -1;
577         plgpio->chip.request = plgpio_request;
578         plgpio->chip.free = plgpio_free;
579         plgpio->chip.direction_input = plgpio_direction_input;
580         plgpio->chip.direction_output = plgpio_direction_output;
581         plgpio->chip.get = plgpio_get_value;
582         plgpio->chip.set = plgpio_set_value;
583         plgpio->chip.label = dev_name(&pdev->dev);
584         plgpio->chip.parent = &pdev->dev;
585         plgpio->chip.owner = THIS_MODULE;
586
587         if (!IS_ERR(plgpio->clk)) {
588                 ret = clk_prepare(plgpio->clk);
589                 if (ret) {
590                         dev_err(&pdev->dev, "clk prepare failed\n");
591                         return ret;
592                 }
593         }
594
595         irq = platform_get_irq(pdev, 0);
596         if (irq > 0) {
597                 struct gpio_irq_chip *girq;
598
599                 girq = &plgpio->chip.irq;
600                 gpio_irq_chip_set_chip(girq, &plgpio_irqchip);
601                 girq->parent_handler = plgpio_irq_handler;
602                 girq->num_parents = 1;
603                 girq->parents = devm_kcalloc(&pdev->dev, 1,
604                                              sizeof(*girq->parents),
605                                              GFP_KERNEL);
606                 if (!girq->parents)
607                         return -ENOMEM;
608                 girq->parents[0] = irq;
609                 girq->default_type = IRQ_TYPE_NONE;
610                 girq->handler = handle_simple_irq;
611                 dev_info(&pdev->dev, "PLGPIO registering with IRQs\n");
612         } else {
613                 dev_info(&pdev->dev, "PLGPIO registering without IRQs\n");
614         }
615
616         ret = gpiochip_add_data(&plgpio->chip, plgpio);
617         if (ret) {
618                 dev_err(&pdev->dev, "unable to add gpio chip\n");
619                 goto unprepare_clk;
620         }
621
622         return 0;
623
624 unprepare_clk:
625         if (!IS_ERR(plgpio->clk))
626                 clk_unprepare(plgpio->clk);
627
628         return ret;
629 }
630
631 #ifdef CONFIG_PM_SLEEP
632 static int plgpio_suspend(struct device *dev)
633 {
634         struct plgpio *plgpio = dev_get_drvdata(dev);
635         int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
636         u32 off;
637
638         for (i = 0; i < reg_count; i++) {
639                 off = i * sizeof(int *);
640
641                 if (plgpio->regs.enb != -1)
642                         regmap_read(plgpio->regmap, plgpio->regs.enb + off,
643                                 &plgpio->csave_regs[i].enb);
644                 if (plgpio->regs.eit != -1)
645                         regmap_read(plgpio->regmap, plgpio->regs.eit + off,
646                                 &plgpio->csave_regs[i].eit);
647                 regmap_read(plgpio->regmap, plgpio->regs.wdata + off,
648                                 &plgpio->csave_regs[i].wdata);
649                 regmap_read(plgpio->regmap, plgpio->regs.dir + off,
650                                 &plgpio->csave_regs[i].dir);
651                 regmap_read(plgpio->regmap, plgpio->regs.ie + off,
652                                 &plgpio->csave_regs[i].ie);
653         }
654
655         return 0;
656 }
657
658 /*
659  * This is used to correct the values in end registers. End registers contain
660  * extra bits that might be used for other purpose in platform. So, we shouldn't
661  * overwrite these bits. This macro, reads given register again, preserves other
662  * bit values (non-plgpio bits), and retain captured value (plgpio bits).
663  */
664 #define plgpio_prepare_reg(__reg, _off, _mask, _tmp)            \
665 {                                                               \
666         regmap_read(plgpio->regmap, plgpio->regs.__reg + _off, &_tmp); \
667         _tmp &= ~_mask;                                         \
668         plgpio->csave_regs[i].__reg =                           \
669                 _tmp | (plgpio->csave_regs[i].__reg & _mask);   \
670 }
671
672 static int plgpio_resume(struct device *dev)
673 {
674         struct plgpio *plgpio = dev_get_drvdata(dev);
675         int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
676         u32 off;
677         u32 mask, tmp;
678
679         for (i = 0; i < reg_count; i++) {
680                 off = i * sizeof(int *);
681
682                 if (i == reg_count - 1) {
683                         mask = (1 << (plgpio->chip.ngpio - i *
684                                                 MAX_GPIO_PER_REG)) - 1;
685
686                         if (plgpio->regs.enb != -1)
687                                 plgpio_prepare_reg(enb, off, mask, tmp);
688
689                         if (plgpio->regs.eit != -1)
690                                 plgpio_prepare_reg(eit, off, mask, tmp);
691
692                         plgpio_prepare_reg(wdata, off, mask, tmp);
693                         plgpio_prepare_reg(dir, off, mask, tmp);
694                         plgpio_prepare_reg(ie, off, mask, tmp);
695                 }
696
697                 regmap_write(plgpio->regmap, plgpio->regs.wdata + off,
698                         plgpio->csave_regs[i].wdata);
699
700                 regmap_write(plgpio->regmap, plgpio->regs.dir + off,
701                         plgpio->csave_regs[i].dir);
702
703                 if (plgpio->regs.eit != -1)
704                         regmap_write(plgpio->regmap, plgpio->regs.eit + off,
705                                 plgpio->csave_regs[i].eit);
706
707                 regmap_write(plgpio->regmap, plgpio->regs.ie + off,
708                         plgpio->csave_regs[i].ie);
709
710                 if (plgpio->regs.enb != -1)
711                         regmap_write(plgpio->regmap, plgpio->regs.enb + off,
712                                 plgpio->csave_regs[i].enb);
713         }
714
715         return 0;
716 }
717 #endif
718
719 static SIMPLE_DEV_PM_OPS(plgpio_dev_pm_ops, plgpio_suspend, plgpio_resume);
720
721 static const struct of_device_id plgpio_of_match[] = {
722         { .compatible = "st,spear-plgpio" },
723         {}
724 };
725
726 static struct platform_driver plgpio_driver = {
727         .probe = plgpio_probe,
728         .driver = {
729                 .name = "spear-plgpio",
730                 .pm = &plgpio_dev_pm_ops,
731                 .of_match_table = plgpio_of_match,
732         },
733 };
734
735 static int __init plgpio_init(void)
736 {
737         return platform_driver_register(&plgpio_driver);
738 }
739 subsys_initcall(plgpio_init);