]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/gpio/gpio-generic.c
ARM: dts: add support for TX6S with LVDS output
[karo-tx-linux.git] / drivers / gpio / gpio-generic.c
1 /*
2  * Generic driver for memory-mapped GPIO controllers.
3  *
4  * Copyright 2008 MontaVista Software, Inc.
5  * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com>
6  *
7  * This program is free software; you can redistribute  it and/or modify it
8  * under  the terms of  the GNU General  Public License as published by the
9  * Free Software Foundation;  either version 2 of the  License, or (at your
10  * option) any later version.
11  *
12  * ....``.```~~~~````.`.`.`.`.```````'',,,.........`````......`.......
13  * ...``                                                         ```````..
14  * ..The simplest form of a GPIO controller that the driver supports is``
15  *  `.just a single "data" register, where GPIO state can be read and/or `
16  *    `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
17  *        `````````
18                                     ___
19 _/~~|___/~|   . ```~~~~~~       ___/___\___     ,~.`.`.`.`````.~~...,,,,...
20 __________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a GPIO .
21 o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
22                                                  `....trivial..'~`.```.```
23  *                                                    ```````
24  *  .```````~~~~`..`.``.``.
25  * .  The driver supports  `...       ,..```.`~~~```````````````....````.``,,
26  * .   big-endian notation, just`.  .. A bit more sophisticated controllers ,
27  *  . register the device with -be`. .with a pair of set/clear-bit registers ,
28  *   `.. suffix.  ```~~`````....`.`   . affecting the data register and the .`
29  *     ``.`.``...```                  ```.. output pins are also supported.`
30  *                        ^^             `````.`````````.,``~``~``~~``````
31  *                                                   .                  ^^
32  *   ,..`.`.`...````````````......`.`.`.`.`.`..`.`.`..
33  * .. The expectation is that in at least some cases .    ,-~~~-,
34  *  .this will be used with roll-your-own ASIC/FPGA .`     \   /
35  *  .logic in Verilog or VHDL. ~~~`````````..`````~~`       \ /
36  *  ..````````......```````````                             \o_
37  *                                                           |
38  *                              ^^                          / \
39  *
40  *           ...`````~~`.....``.`..........``````.`.``.```........``.
41  *            `  8, 16, 32 and 64 bits registers are supported, and``.
42  *            . the number of GPIOs is determined by the width of   ~
43  *             .. the registers. ,............```.`.`..`.`.~~~.`.`.`~
44  *               `.......````.```
45  */
46
47 #include <linux/init.h>
48 #include <linux/err.h>
49 #include <linux/bug.h>
50 #include <linux/kernel.h>
51 #include <linux/module.h>
52 #include <linux/spinlock.h>
53 #include <linux/compiler.h>
54 #include <linux/types.h>
55 #include <linux/errno.h>
56 #include <linux/log2.h>
57 #include <linux/ioport.h>
58 #include <linux/io.h>
59 #include <linux/gpio.h>
60 #include <linux/slab.h>
61 #include <linux/platform_device.h>
62 #include <linux/mod_devicetable.h>
63 #include <linux/basic_mmio_gpio.h>
64
65 static void bgpio_write8(void __iomem *reg, unsigned long data)
66 {
67         writeb(data, reg);
68 }
69
70 static unsigned long bgpio_read8(void __iomem *reg)
71 {
72         return readb(reg);
73 }
74
75 static void bgpio_write16(void __iomem *reg, unsigned long data)
76 {
77         writew(data, reg);
78 }
79
80 static unsigned long bgpio_read16(void __iomem *reg)
81 {
82         return readw(reg);
83 }
84
85 static void bgpio_write32(void __iomem *reg, unsigned long data)
86 {
87         writel(data, reg);
88 }
89
90 static unsigned long bgpio_read32(void __iomem *reg)
91 {
92         return readl(reg);
93 }
94
95 #if BITS_PER_LONG >= 64
96 static void bgpio_write64(void __iomem *reg, unsigned long data)
97 {
98         writeq(data, reg);
99 }
100
101 static unsigned long bgpio_read64(void __iomem *reg)
102 {
103         return readq(reg);
104 }
105 #endif /* BITS_PER_LONG >= 64 */
106
107 static void bgpio_write16be(void __iomem *reg, unsigned long data)
108 {
109         iowrite16be(data, reg);
110 }
111
112 static unsigned long bgpio_read16be(void __iomem *reg)
113 {
114         return ioread16be(reg);
115 }
116
117 static void bgpio_write32be(void __iomem *reg, unsigned long data)
118 {
119         iowrite32be(data, reg);
120 }
121
122 static unsigned long bgpio_read32be(void __iomem *reg)
123 {
124         return ioread32be(reg);
125 }
126
127 static unsigned long bgpio_pin2mask(struct bgpio_chip *bgc, unsigned int pin)
128 {
129         return 1 << pin;
130 }
131
132 static unsigned long bgpio_pin2mask_be(struct bgpio_chip *bgc,
133                                        unsigned int pin)
134 {
135         return 1 << (bgc->bits - 1 - pin);
136 }
137
138 static int bgpio_get(struct gpio_chip *gc, unsigned int gpio)
139 {
140         struct bgpio_chip *bgc = to_bgpio_chip(gc);
141
142         return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio));
143 }
144
145 static void bgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
146 {
147         struct bgpio_chip *bgc = to_bgpio_chip(gc);
148         unsigned long mask = bgc->pin2mask(bgc, gpio);
149         unsigned long flags;
150
151         spin_lock_irqsave(&bgc->lock, flags);
152
153         if (val)
154                 bgc->data |= mask;
155         else
156                 bgc->data &= ~mask;
157
158         bgc->write_reg(bgc->reg_dat, bgc->data);
159
160         spin_unlock_irqrestore(&bgc->lock, flags);
161 }
162
163 static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio,
164                                  int val)
165 {
166         struct bgpio_chip *bgc = to_bgpio_chip(gc);
167         unsigned long mask = bgc->pin2mask(bgc, gpio);
168
169         if (val)
170                 bgc->write_reg(bgc->reg_set, mask);
171         else
172                 bgc->write_reg(bgc->reg_clr, mask);
173 }
174
175 static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val)
176 {
177         struct bgpio_chip *bgc = to_bgpio_chip(gc);
178         unsigned long mask = bgc->pin2mask(bgc, gpio);
179         unsigned long flags;
180
181         spin_lock_irqsave(&bgc->lock, flags);
182
183         if (val)
184                 bgc->data |= mask;
185         else
186                 bgc->data &= ~mask;
187
188         bgc->write_reg(bgc->reg_set, bgc->data);
189
190         spin_unlock_irqrestore(&bgc->lock, flags);
191 }
192
193 static int bgpio_simple_dir_in(struct gpio_chip *gc, unsigned int gpio)
194 {
195         return 0;
196 }
197
198 static int bgpio_simple_dir_out(struct gpio_chip *gc, unsigned int gpio,
199                                 int val)
200 {
201         gc->set(gc, gpio, val);
202
203         return 0;
204 }
205
206 static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
207 {
208         struct bgpio_chip *bgc = to_bgpio_chip(gc);
209         unsigned long flags;
210
211         spin_lock_irqsave(&bgc->lock, flags);
212
213         bgc->dir &= ~bgc->pin2mask(bgc, gpio);
214         bgc->write_reg(bgc->reg_dir, bgc->dir);
215
216         spin_unlock_irqrestore(&bgc->lock, flags);
217
218         return 0;
219 }
220
221 static int bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
222 {
223         struct bgpio_chip *bgc = to_bgpio_chip(gc);
224         unsigned long flags;
225
226         gc->set(gc, gpio, val);
227
228         spin_lock_irqsave(&bgc->lock, flags);
229
230         bgc->dir |= bgc->pin2mask(bgc, gpio);
231         bgc->write_reg(bgc->reg_dir, bgc->dir);
232
233         spin_unlock_irqrestore(&bgc->lock, flags);
234
235         return 0;
236 }
237
238 static int bgpio_dir_in_inv(struct gpio_chip *gc, unsigned int gpio)
239 {
240         struct bgpio_chip *bgc = to_bgpio_chip(gc);
241         unsigned long flags;
242
243         spin_lock_irqsave(&bgc->lock, flags);
244
245         bgc->dir |= bgc->pin2mask(bgc, gpio);
246         bgc->write_reg(bgc->reg_dir, bgc->dir);
247
248         spin_unlock_irqrestore(&bgc->lock, flags);
249
250         return 0;
251 }
252
253 static int bgpio_dir_out_inv(struct gpio_chip *gc, unsigned int gpio, int val)
254 {
255         struct bgpio_chip *bgc = to_bgpio_chip(gc);
256         unsigned long flags;
257
258         gc->set(gc, gpio, val);
259
260         spin_lock_irqsave(&bgc->lock, flags);
261
262         bgc->dir &= ~bgc->pin2mask(bgc, gpio);
263         bgc->write_reg(bgc->reg_dir, bgc->dir);
264
265         spin_unlock_irqrestore(&bgc->lock, flags);
266
267         return 0;
268 }
269
270 static int bgpio_setup_accessors(struct device *dev,
271                                  struct bgpio_chip *bgc,
272                                  bool bit_be,
273                                  bool byte_be)
274 {
275
276         switch (bgc->bits) {
277         case 8:
278                 bgc->read_reg   = bgpio_read8;
279                 bgc->write_reg  = bgpio_write8;
280                 break;
281         case 16:
282                 if (byte_be) {
283                         bgc->read_reg   = bgpio_read16be;
284                         bgc->write_reg  = bgpio_write16be;
285                 } else {
286                         bgc->read_reg   = bgpio_read16;
287                         bgc->write_reg  = bgpio_write16;
288                 }
289                 break;
290         case 32:
291                 if (byte_be) {
292                         bgc->read_reg   = bgpio_read32be;
293                         bgc->write_reg  = bgpio_write32be;
294                 } else {
295                         bgc->read_reg   = bgpio_read32;
296                         bgc->write_reg  = bgpio_write32;
297                 }
298                 break;
299 #if BITS_PER_LONG >= 64
300         case 64:
301                 if (byte_be) {
302                         dev_err(dev,
303                                 "64 bit big endian byte order unsupported\n");
304                         return -EINVAL;
305                 } else {
306                         bgc->read_reg   = bgpio_read64;
307                         bgc->write_reg  = bgpio_write64;
308                 }
309                 break;
310 #endif /* BITS_PER_LONG >= 64 */
311         default:
312                 dev_err(dev, "unsupported data width %u bits\n", bgc->bits);
313                 return -EINVAL;
314         }
315
316         bgc->pin2mask = bit_be ? bgpio_pin2mask_be : bgpio_pin2mask;
317
318         return 0;
319 }
320
321 /*
322  * Create the device and allocate the resources.  For setting GPIO's there are
323  * three supported configurations:
324  *
325  *      - single input/output register resource (named "dat").
326  *      - set/clear pair (named "set" and "clr").
327  *      - single output register resource and single input resource ("set" and
328  *      dat").
329  *
330  * For the single output register, this drives a 1 by setting a bit and a zero
331  * by clearing a bit.  For the set clr pair, this drives a 1 by setting a bit
332  * in the set register and clears it by setting a bit in the clear register.
333  * The configuration is detected by which resources are present.
334  *
335  * For setting the GPIO direction, there are three supported configurations:
336  *
337  *      - simple bidirection GPIO that requires no configuration.
338  *      - an output direction register (named "dirout") where a 1 bit
339  *      indicates the GPIO is an output.
340  *      - an input direction register (named "dirin") where a 1 bit indicates
341  *      the GPIO is an input.
342  */
343 static int bgpio_setup_io(struct bgpio_chip *bgc,
344                           void __iomem *dat,
345                           void __iomem *set,
346                           void __iomem *clr)
347 {
348
349         bgc->reg_dat = dat;
350         if (!bgc->reg_dat)
351                 return -EINVAL;
352
353         if (set && clr) {
354                 bgc->reg_set = set;
355                 bgc->reg_clr = clr;
356                 bgc->gc.set = bgpio_set_with_clear;
357         } else if (set && !clr) {
358                 bgc->reg_set = set;
359                 bgc->gc.set = bgpio_set_set;
360         } else {
361                 bgc->gc.set = bgpio_set;
362         }
363
364         bgc->gc.get = bgpio_get;
365
366         return 0;
367 }
368
369 static int bgpio_setup_direction(struct bgpio_chip *bgc,
370                                  void __iomem *dirout,
371                                  void __iomem *dirin)
372 {
373         if (dirout && dirin) {
374                 return -EINVAL;
375         } else if (dirout) {
376                 bgc->reg_dir = dirout;
377                 bgc->gc.direction_output = bgpio_dir_out;
378                 bgc->gc.direction_input = bgpio_dir_in;
379         } else if (dirin) {
380                 bgc->reg_dir = dirin;
381                 bgc->gc.direction_output = bgpio_dir_out_inv;
382                 bgc->gc.direction_input = bgpio_dir_in_inv;
383         } else {
384                 bgc->gc.direction_output = bgpio_simple_dir_out;
385                 bgc->gc.direction_input = bgpio_simple_dir_in;
386         }
387
388         return 0;
389 }
390
391 static int bgpio_request(struct gpio_chip *chip, unsigned gpio_pin)
392 {
393         if (gpio_pin < chip->ngpio)
394                 return 0;
395
396         return -EINVAL;
397 }
398
399 int bgpio_remove(struct bgpio_chip *bgc)
400 {
401         return gpiochip_remove(&bgc->gc);
402 }
403 EXPORT_SYMBOL_GPL(bgpio_remove);
404
405 int bgpio_init(struct bgpio_chip *bgc, struct device *dev,
406                unsigned long sz, void __iomem *dat, void __iomem *set,
407                void __iomem *clr, void __iomem *dirout, void __iomem *dirin,
408                unsigned long flags)
409 {
410         int ret;
411
412         if (!is_power_of_2(sz))
413                 return -EINVAL;
414
415         bgc->bits = sz * 8;
416         if (bgc->bits > BITS_PER_LONG)
417                 return -EINVAL;
418
419         spin_lock_init(&bgc->lock);
420         bgc->gc.dev = dev;
421         bgc->gc.label = dev_name(dev);
422         bgc->gc.base = -1;
423         bgc->gc.ngpio = bgc->bits;
424         bgc->gc.request = bgpio_request;
425
426         ret = bgpio_setup_io(bgc, dat, set, clr);
427         if (ret)
428                 return ret;
429
430         ret = bgpio_setup_accessors(dev, bgc, flags & BGPIOF_BIG_ENDIAN,
431                                     flags & BGPIOF_BIG_ENDIAN_BYTE_ORDER);
432         if (ret)
433                 return ret;
434
435         ret = bgpio_setup_direction(bgc, dirout, dirin);
436         if (ret)
437                 return ret;
438
439         bgc->data = bgc->read_reg(bgc->reg_dat);
440         if (bgc->gc.set == bgpio_set_set &&
441                         !(flags & BGPIOF_UNREADABLE_REG_SET))
442                 bgc->data = bgc->read_reg(bgc->reg_set);
443         if (bgc->reg_dir && !(flags & BGPIOF_UNREADABLE_REG_DIR))
444                 bgc->dir = bgc->read_reg(bgc->reg_dir);
445
446         return ret;
447 }
448 EXPORT_SYMBOL_GPL(bgpio_init);
449
450 #ifdef CONFIG_GPIO_GENERIC_PLATFORM
451
452 static void __iomem *bgpio_map(struct platform_device *pdev,
453                                const char *name,
454                                resource_size_t sane_sz,
455                                int *err)
456 {
457         struct device *dev = &pdev->dev;
458         struct resource *r;
459         resource_size_t start;
460         resource_size_t sz;
461         void __iomem *ret;
462
463         *err = 0;
464
465         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
466         if (!r)
467                 return NULL;
468
469         sz = resource_size(r);
470         if (sz != sane_sz) {
471                 *err = -EINVAL;
472                 return NULL;
473         }
474
475         start = r->start;
476         if (!devm_request_mem_region(dev, start, sz, r->name)) {
477                 *err = -EBUSY;
478                 return NULL;
479         }
480
481         ret = devm_ioremap(dev, start, sz);
482         if (!ret) {
483                 *err = -ENOMEM;
484                 return NULL;
485         }
486
487         return ret;
488 }
489
490 static int bgpio_pdev_probe(struct platform_device *pdev)
491 {
492         struct device *dev = &pdev->dev;
493         struct resource *r;
494         void __iomem *dat;
495         void __iomem *set;
496         void __iomem *clr;
497         void __iomem *dirout;
498         void __iomem *dirin;
499         unsigned long sz;
500         unsigned long flags = pdev->id_entry->driver_data;
501         int err;
502         struct bgpio_chip *bgc;
503         struct bgpio_pdata *pdata = dev_get_platdata(dev);
504
505         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
506         if (!r)
507                 return -EINVAL;
508
509         sz = resource_size(r);
510
511         dat = bgpio_map(pdev, "dat", sz, &err);
512         if (!dat)
513                 return err ? err : -EINVAL;
514
515         set = bgpio_map(pdev, "set", sz, &err);
516         if (err)
517                 return err;
518
519         clr = bgpio_map(pdev, "clr", sz, &err);
520         if (err)
521                 return err;
522
523         dirout = bgpio_map(pdev, "dirout", sz, &err);
524         if (err)
525                 return err;
526
527         dirin = bgpio_map(pdev, "dirin", sz, &err);
528         if (err)
529                 return err;
530
531         bgc = devm_kzalloc(&pdev->dev, sizeof(*bgc), GFP_KERNEL);
532         if (!bgc)
533                 return -ENOMEM;
534
535         err = bgpio_init(bgc, dev, sz, dat, set, clr, dirout, dirin, flags);
536         if (err)
537                 return err;
538
539         if (pdata) {
540                 if (pdata->label)
541                         bgc->gc.label = pdata->label;
542                 bgc->gc.base = pdata->base;
543                 if (pdata->ngpio > 0)
544                         bgc->gc.ngpio = pdata->ngpio;
545         }
546
547         platform_set_drvdata(pdev, bgc);
548
549         return gpiochip_add(&bgc->gc);
550 }
551
552 static int bgpio_pdev_remove(struct platform_device *pdev)
553 {
554         struct bgpio_chip *bgc = platform_get_drvdata(pdev);
555
556         return bgpio_remove(bgc);
557 }
558
559 static const struct platform_device_id bgpio_id_table[] = {
560         {
561                 .name           = "basic-mmio-gpio",
562                 .driver_data    = 0,
563         }, {
564                 .name           = "basic-mmio-gpio-be",
565                 .driver_data    = BGPIOF_BIG_ENDIAN,
566         },
567         { }
568 };
569 MODULE_DEVICE_TABLE(platform, bgpio_id_table);
570
571 static struct platform_driver bgpio_driver = {
572         .driver = {
573                 .name = "basic-mmio-gpio",
574         },
575         .id_table = bgpio_id_table,
576         .probe = bgpio_pdev_probe,
577         .remove = bgpio_pdev_remove,
578 };
579
580 module_platform_driver(bgpio_driver);
581
582 #endif /* CONFIG_GPIO_GENERIC_PLATFORM */
583
584 MODULE_DESCRIPTION("Driver for basic memory-mapped GPIO controllers");
585 MODULE_AUTHOR("Anton Vorontsov <cbouatmailru@gmail.com>");
586 MODULE_LICENSE("GPL");