1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Generic driver for memory-mapped GPIO controllers.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright 2008 MontaVista Software, Inc.
6*4882a593Smuzhiyun * Copyright 2008,2010 Anton Vorontsov <cbouatmailru@gmail.com>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * ....``.```~~~~````.`.`.`.`.```````'',,,.........`````......`.......
9*4882a593Smuzhiyun * ...`` ```````..
10*4882a593Smuzhiyun * ..The simplest form of a GPIO controller that the driver supports is``
11*4882a593Smuzhiyun * `.just a single "data" register, where GPIO state can be read and/or `
12*4882a593Smuzhiyun * `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
13*4882a593Smuzhiyun * `````````
14*4882a593Smuzhiyun ___
15*4882a593Smuzhiyun _/~~|___/~| . ```~~~~~~ ___/___\___ ,~.`.`.`.`````.~~...,,,,...
16*4882a593Smuzhiyun __________|~$@~~~ %~ /o*o*o*o*o*o\ .. Implementing such a GPIO .
17*4882a593Smuzhiyun o ` ~~~~\___/~~~~ ` controller in FPGA is ,.`
18*4882a593Smuzhiyun `....trivial..'~`.```.```
19*4882a593Smuzhiyun * ```````
20*4882a593Smuzhiyun * .```````~~~~`..`.``.``.
21*4882a593Smuzhiyun * . The driver supports `... ,..```.`~~~```````````````....````.``,,
22*4882a593Smuzhiyun * . big-endian notation, just`. .. A bit more sophisticated controllers ,
23*4882a593Smuzhiyun * . register the device with -be`. .with a pair of set/clear-bit registers ,
24*4882a593Smuzhiyun * `.. suffix. ```~~`````....`.` . affecting the data register and the .`
25*4882a593Smuzhiyun * ``.`.``...``` ```.. output pins are also supported.`
26*4882a593Smuzhiyun * ^^ `````.`````````.,``~``~``~~``````
27*4882a593Smuzhiyun * . ^^
28*4882a593Smuzhiyun * ,..`.`.`...````````````......`.`.`.`.`.`..`.`.`..
29*4882a593Smuzhiyun * .. The expectation is that in at least some cases . ,-~~~-,
30*4882a593Smuzhiyun * .this will be used with roll-your-own ASIC/FPGA .` \ /
31*4882a593Smuzhiyun * .logic in Verilog or VHDL. ~~~`````````..`````~~` \ /
32*4882a593Smuzhiyun * ..````````......``````````` \o_
33*4882a593Smuzhiyun * |
34*4882a593Smuzhiyun * ^^ / \
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun * ...`````~~`.....``.`..........``````.`.``.```........``.
37*4882a593Smuzhiyun * ` 8, 16, 32 and 64 bits registers are supported, and``.
38*4882a593Smuzhiyun * . the number of GPIOs is determined by the width of ~
39*4882a593Smuzhiyun * .. the registers. ,............```.`.`..`.`.~~~.`.`.`~
40*4882a593Smuzhiyun * `.......````.```
41*4882a593Smuzhiyun */
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #include <linux/init.h>
44*4882a593Smuzhiyun #include <linux/err.h>
45*4882a593Smuzhiyun #include <linux/bug.h>
46*4882a593Smuzhiyun #include <linux/kernel.h>
47*4882a593Smuzhiyun #include <linux/module.h>
48*4882a593Smuzhiyun #include <linux/spinlock.h>
49*4882a593Smuzhiyun #include <linux/compiler.h>
50*4882a593Smuzhiyun #include <linux/types.h>
51*4882a593Smuzhiyun #include <linux/errno.h>
52*4882a593Smuzhiyun #include <linux/log2.h>
53*4882a593Smuzhiyun #include <linux/ioport.h>
54*4882a593Smuzhiyun #include <linux/io.h>
55*4882a593Smuzhiyun #include <linux/gpio/driver.h>
56*4882a593Smuzhiyun #include <linux/slab.h>
57*4882a593Smuzhiyun #include <linux/bitops.h>
58*4882a593Smuzhiyun #include <linux/platform_device.h>
59*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
60*4882a593Smuzhiyun #include <linux/of.h>
61*4882a593Smuzhiyun #include <linux/of_device.h>
62*4882a593Smuzhiyun
bgpio_write8(void __iomem * reg,unsigned long data)63*4882a593Smuzhiyun static void bgpio_write8(void __iomem *reg, unsigned long data)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun writeb(data, reg);
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
bgpio_read8(void __iomem * reg)68*4882a593Smuzhiyun static unsigned long bgpio_read8(void __iomem *reg)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun return readb(reg);
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
bgpio_write16(void __iomem * reg,unsigned long data)73*4882a593Smuzhiyun static void bgpio_write16(void __iomem *reg, unsigned long data)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun writew(data, reg);
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
bgpio_read16(void __iomem * reg)78*4882a593Smuzhiyun static unsigned long bgpio_read16(void __iomem *reg)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun return readw(reg);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
bgpio_write32(void __iomem * reg,unsigned long data)83*4882a593Smuzhiyun static void bgpio_write32(void __iomem *reg, unsigned long data)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun writel(data, reg);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
bgpio_read32(void __iomem * reg)88*4882a593Smuzhiyun static unsigned long bgpio_read32(void __iomem *reg)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun return readl(reg);
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun #if BITS_PER_LONG >= 64
bgpio_write64(void __iomem * reg,unsigned long data)94*4882a593Smuzhiyun static void bgpio_write64(void __iomem *reg, unsigned long data)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun writeq(data, reg);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
bgpio_read64(void __iomem * reg)99*4882a593Smuzhiyun static unsigned long bgpio_read64(void __iomem *reg)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun return readq(reg);
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun #endif /* BITS_PER_LONG >= 64 */
104*4882a593Smuzhiyun
bgpio_write16be(void __iomem * reg,unsigned long data)105*4882a593Smuzhiyun static void bgpio_write16be(void __iomem *reg, unsigned long data)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun iowrite16be(data, reg);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
bgpio_read16be(void __iomem * reg)110*4882a593Smuzhiyun static unsigned long bgpio_read16be(void __iomem *reg)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun return ioread16be(reg);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
bgpio_write32be(void __iomem * reg,unsigned long data)115*4882a593Smuzhiyun static void bgpio_write32be(void __iomem *reg, unsigned long data)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun iowrite32be(data, reg);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
bgpio_read32be(void __iomem * reg)120*4882a593Smuzhiyun static unsigned long bgpio_read32be(void __iomem *reg)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun return ioread32be(reg);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun
bgpio_line2mask(struct gpio_chip * gc,unsigned int line)125*4882a593Smuzhiyun static unsigned long bgpio_line2mask(struct gpio_chip *gc, unsigned int line)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun if (gc->be_bits)
128*4882a593Smuzhiyun return BIT(gc->bgpio_bits - 1 - line);
129*4882a593Smuzhiyun return BIT(line);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
bgpio_get_set(struct gpio_chip * gc,unsigned int gpio)132*4882a593Smuzhiyun static int bgpio_get_set(struct gpio_chip *gc, unsigned int gpio)
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun unsigned long pinmask = bgpio_line2mask(gc, gpio);
135*4882a593Smuzhiyun bool dir = !!(gc->bgpio_dir & pinmask);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun if (dir)
138*4882a593Smuzhiyun return !!(gc->read_reg(gc->reg_set) & pinmask);
139*4882a593Smuzhiyun else
140*4882a593Smuzhiyun return !!(gc->read_reg(gc->reg_dat) & pinmask);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /*
144*4882a593Smuzhiyun * This assumes that the bits in the GPIO register are in native endianness.
145*4882a593Smuzhiyun * We only assign the function pointer if we have that.
146*4882a593Smuzhiyun */
bgpio_get_set_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)147*4882a593Smuzhiyun static int bgpio_get_set_multiple(struct gpio_chip *gc, unsigned long *mask,
148*4882a593Smuzhiyun unsigned long *bits)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun unsigned long get_mask = 0;
151*4882a593Smuzhiyun unsigned long set_mask = 0;
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun /* Make sure we first clear any bits that are zero when we read the register */
154*4882a593Smuzhiyun *bits &= ~*mask;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun set_mask = *mask & gc->bgpio_dir;
157*4882a593Smuzhiyun get_mask = *mask & ~gc->bgpio_dir;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun if (set_mask)
160*4882a593Smuzhiyun *bits |= gc->read_reg(gc->reg_set) & set_mask;
161*4882a593Smuzhiyun if (get_mask)
162*4882a593Smuzhiyun *bits |= gc->read_reg(gc->reg_dat) & get_mask;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun return 0;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
bgpio_get(struct gpio_chip * gc,unsigned int gpio)167*4882a593Smuzhiyun static int bgpio_get(struct gpio_chip *gc, unsigned int gpio)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun return !!(gc->read_reg(gc->reg_dat) & bgpio_line2mask(gc, gpio));
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /*
173*4882a593Smuzhiyun * This only works if the bits in the GPIO register are in native endianness.
174*4882a593Smuzhiyun */
bgpio_get_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)175*4882a593Smuzhiyun static int bgpio_get_multiple(struct gpio_chip *gc, unsigned long *mask,
176*4882a593Smuzhiyun unsigned long *bits)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun /* Make sure we first clear any bits that are zero when we read the register */
179*4882a593Smuzhiyun *bits &= ~*mask;
180*4882a593Smuzhiyun *bits |= gc->read_reg(gc->reg_dat) & *mask;
181*4882a593Smuzhiyun return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun /*
185*4882a593Smuzhiyun * With big endian mirrored bit order it becomes more tedious.
186*4882a593Smuzhiyun */
bgpio_get_multiple_be(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)187*4882a593Smuzhiyun static int bgpio_get_multiple_be(struct gpio_chip *gc, unsigned long *mask,
188*4882a593Smuzhiyun unsigned long *bits)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun unsigned long readmask = 0;
191*4882a593Smuzhiyun unsigned long val;
192*4882a593Smuzhiyun int bit;
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /* Make sure we first clear any bits that are zero when we read the register */
195*4882a593Smuzhiyun *bits &= ~*mask;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun /* Create a mirrored mask */
198*4882a593Smuzhiyun for_each_set_bit(bit, mask, gc->ngpio)
199*4882a593Smuzhiyun readmask |= bgpio_line2mask(gc, bit);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /* Read the register */
202*4882a593Smuzhiyun val = gc->read_reg(gc->reg_dat) & readmask;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /*
205*4882a593Smuzhiyun * Mirror the result into the "bits" result, this will give line 0
206*4882a593Smuzhiyun * in bit 0 ... line 31 in bit 31 for a 32bit register.
207*4882a593Smuzhiyun */
208*4882a593Smuzhiyun for_each_set_bit(bit, &val, gc->ngpio)
209*4882a593Smuzhiyun *bits |= bgpio_line2mask(gc, bit);
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun return 0;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
bgpio_set_none(struct gpio_chip * gc,unsigned int gpio,int val)214*4882a593Smuzhiyun static void bgpio_set_none(struct gpio_chip *gc, unsigned int gpio, int val)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
bgpio_set(struct gpio_chip * gc,unsigned int gpio,int val)218*4882a593Smuzhiyun static void bgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun unsigned long mask = bgpio_line2mask(gc, gpio);
221*4882a593Smuzhiyun unsigned long flags;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun spin_lock_irqsave(&gc->bgpio_lock, flags);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun if (val)
226*4882a593Smuzhiyun gc->bgpio_data |= mask;
227*4882a593Smuzhiyun else
228*4882a593Smuzhiyun gc->bgpio_data &= ~mask;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun gc->write_reg(gc->reg_dat, gc->bgpio_data);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun spin_unlock_irqrestore(&gc->bgpio_lock, flags);
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
bgpio_set_with_clear(struct gpio_chip * gc,unsigned int gpio,int val)235*4882a593Smuzhiyun static void bgpio_set_with_clear(struct gpio_chip *gc, unsigned int gpio,
236*4882a593Smuzhiyun int val)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun unsigned long mask = bgpio_line2mask(gc, gpio);
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun if (val)
241*4882a593Smuzhiyun gc->write_reg(gc->reg_set, mask);
242*4882a593Smuzhiyun else
243*4882a593Smuzhiyun gc->write_reg(gc->reg_clr, mask);
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
bgpio_set_set(struct gpio_chip * gc,unsigned int gpio,int val)246*4882a593Smuzhiyun static void bgpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun unsigned long mask = bgpio_line2mask(gc, gpio);
249*4882a593Smuzhiyun unsigned long flags;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun spin_lock_irqsave(&gc->bgpio_lock, flags);
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun if (val)
254*4882a593Smuzhiyun gc->bgpio_data |= mask;
255*4882a593Smuzhiyun else
256*4882a593Smuzhiyun gc->bgpio_data &= ~mask;
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun gc->write_reg(gc->reg_set, gc->bgpio_data);
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun spin_unlock_irqrestore(&gc->bgpio_lock, flags);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
bgpio_multiple_get_masks(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits,unsigned long * set_mask,unsigned long * clear_mask)263*4882a593Smuzhiyun static void bgpio_multiple_get_masks(struct gpio_chip *gc,
264*4882a593Smuzhiyun unsigned long *mask, unsigned long *bits,
265*4882a593Smuzhiyun unsigned long *set_mask,
266*4882a593Smuzhiyun unsigned long *clear_mask)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun int i;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun *set_mask = 0;
271*4882a593Smuzhiyun *clear_mask = 0;
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun for_each_set_bit(i, mask, gc->bgpio_bits) {
274*4882a593Smuzhiyun if (test_bit(i, bits))
275*4882a593Smuzhiyun *set_mask |= bgpio_line2mask(gc, i);
276*4882a593Smuzhiyun else
277*4882a593Smuzhiyun *clear_mask |= bgpio_line2mask(gc, i);
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun
bgpio_set_multiple_single_reg(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits,void __iomem * reg)281*4882a593Smuzhiyun static void bgpio_set_multiple_single_reg(struct gpio_chip *gc,
282*4882a593Smuzhiyun unsigned long *mask,
283*4882a593Smuzhiyun unsigned long *bits,
284*4882a593Smuzhiyun void __iomem *reg)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun unsigned long flags;
287*4882a593Smuzhiyun unsigned long set_mask, clear_mask;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun spin_lock_irqsave(&gc->bgpio_lock, flags);
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun bgpio_multiple_get_masks(gc, mask, bits, &set_mask, &clear_mask);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun gc->bgpio_data |= set_mask;
294*4882a593Smuzhiyun gc->bgpio_data &= ~clear_mask;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun gc->write_reg(reg, gc->bgpio_data);
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun spin_unlock_irqrestore(&gc->bgpio_lock, flags);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
bgpio_set_multiple(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)301*4882a593Smuzhiyun static void bgpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
302*4882a593Smuzhiyun unsigned long *bits)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun bgpio_set_multiple_single_reg(gc, mask, bits, gc->reg_dat);
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
bgpio_set_multiple_set(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)307*4882a593Smuzhiyun static void bgpio_set_multiple_set(struct gpio_chip *gc, unsigned long *mask,
308*4882a593Smuzhiyun unsigned long *bits)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun bgpio_set_multiple_single_reg(gc, mask, bits, gc->reg_set);
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun
bgpio_set_multiple_with_clear(struct gpio_chip * gc,unsigned long * mask,unsigned long * bits)313*4882a593Smuzhiyun static void bgpio_set_multiple_with_clear(struct gpio_chip *gc,
314*4882a593Smuzhiyun unsigned long *mask,
315*4882a593Smuzhiyun unsigned long *bits)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun unsigned long set_mask, clear_mask;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun bgpio_multiple_get_masks(gc, mask, bits, &set_mask, &clear_mask);
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun if (set_mask)
322*4882a593Smuzhiyun gc->write_reg(gc->reg_set, set_mask);
323*4882a593Smuzhiyun if (clear_mask)
324*4882a593Smuzhiyun gc->write_reg(gc->reg_clr, clear_mask);
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun
bgpio_simple_dir_in(struct gpio_chip * gc,unsigned int gpio)327*4882a593Smuzhiyun static int bgpio_simple_dir_in(struct gpio_chip *gc, unsigned int gpio)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun return 0;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun
bgpio_dir_out_err(struct gpio_chip * gc,unsigned int gpio,int val)332*4882a593Smuzhiyun static int bgpio_dir_out_err(struct gpio_chip *gc, unsigned int gpio,
333*4882a593Smuzhiyun int val)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun return -EINVAL;
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
bgpio_simple_dir_out(struct gpio_chip * gc,unsigned int gpio,int val)338*4882a593Smuzhiyun static int bgpio_simple_dir_out(struct gpio_chip *gc, unsigned int gpio,
339*4882a593Smuzhiyun int val)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun gc->set(gc, gpio, val);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return 0;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
bgpio_dir_in(struct gpio_chip * gc,unsigned int gpio)346*4882a593Smuzhiyun static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun unsigned long flags;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun spin_lock_irqsave(&gc->bgpio_lock, flags);
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun gc->bgpio_dir &= ~bgpio_line2mask(gc, gpio);
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun if (gc->reg_dir_in)
355*4882a593Smuzhiyun gc->write_reg(gc->reg_dir_in, ~gc->bgpio_dir);
356*4882a593Smuzhiyun if (gc->reg_dir_out)
357*4882a593Smuzhiyun gc->write_reg(gc->reg_dir_out, gc->bgpio_dir);
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun spin_unlock_irqrestore(&gc->bgpio_lock, flags);
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun return 0;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
bgpio_get_dir(struct gpio_chip * gc,unsigned int gpio)364*4882a593Smuzhiyun static int bgpio_get_dir(struct gpio_chip *gc, unsigned int gpio)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun /* Return 0 if output, 1 if input */
367*4882a593Smuzhiyun if (gc->bgpio_dir_unreadable) {
368*4882a593Smuzhiyun if (gc->bgpio_dir & bgpio_line2mask(gc, gpio))
369*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_OUT;
370*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_IN;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun if (gc->reg_dir_out) {
374*4882a593Smuzhiyun if (gc->read_reg(gc->reg_dir_out) & bgpio_line2mask(gc, gpio))
375*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_OUT;
376*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_IN;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun if (gc->reg_dir_in)
380*4882a593Smuzhiyun if (!(gc->read_reg(gc->reg_dir_in) & bgpio_line2mask(gc, gpio)))
381*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_OUT;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun return GPIO_LINE_DIRECTION_IN;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun
bgpio_dir_out(struct gpio_chip * gc,unsigned int gpio,int val)386*4882a593Smuzhiyun static void bgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
387*4882a593Smuzhiyun {
388*4882a593Smuzhiyun unsigned long flags;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun spin_lock_irqsave(&gc->bgpio_lock, flags);
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun gc->bgpio_dir |= bgpio_line2mask(gc, gpio);
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun if (gc->reg_dir_in)
395*4882a593Smuzhiyun gc->write_reg(gc->reg_dir_in, ~gc->bgpio_dir);
396*4882a593Smuzhiyun if (gc->reg_dir_out)
397*4882a593Smuzhiyun gc->write_reg(gc->reg_dir_out, gc->bgpio_dir);
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun spin_unlock_irqrestore(&gc->bgpio_lock, flags);
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
bgpio_dir_out_dir_first(struct gpio_chip * gc,unsigned int gpio,int val)402*4882a593Smuzhiyun static int bgpio_dir_out_dir_first(struct gpio_chip *gc, unsigned int gpio,
403*4882a593Smuzhiyun int val)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun bgpio_dir_out(gc, gpio, val);
406*4882a593Smuzhiyun gc->set(gc, gpio, val);
407*4882a593Smuzhiyun return 0;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun
bgpio_dir_out_val_first(struct gpio_chip * gc,unsigned int gpio,int val)410*4882a593Smuzhiyun static int bgpio_dir_out_val_first(struct gpio_chip *gc, unsigned int gpio,
411*4882a593Smuzhiyun int val)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun gc->set(gc, gpio, val);
414*4882a593Smuzhiyun bgpio_dir_out(gc, gpio, val);
415*4882a593Smuzhiyun return 0;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun
bgpio_setup_accessors(struct device * dev,struct gpio_chip * gc,bool byte_be)418*4882a593Smuzhiyun static int bgpio_setup_accessors(struct device *dev,
419*4882a593Smuzhiyun struct gpio_chip *gc,
420*4882a593Smuzhiyun bool byte_be)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun switch (gc->bgpio_bits) {
424*4882a593Smuzhiyun case 8:
425*4882a593Smuzhiyun gc->read_reg = bgpio_read8;
426*4882a593Smuzhiyun gc->write_reg = bgpio_write8;
427*4882a593Smuzhiyun break;
428*4882a593Smuzhiyun case 16:
429*4882a593Smuzhiyun if (byte_be) {
430*4882a593Smuzhiyun gc->read_reg = bgpio_read16be;
431*4882a593Smuzhiyun gc->write_reg = bgpio_write16be;
432*4882a593Smuzhiyun } else {
433*4882a593Smuzhiyun gc->read_reg = bgpio_read16;
434*4882a593Smuzhiyun gc->write_reg = bgpio_write16;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun break;
437*4882a593Smuzhiyun case 32:
438*4882a593Smuzhiyun if (byte_be) {
439*4882a593Smuzhiyun gc->read_reg = bgpio_read32be;
440*4882a593Smuzhiyun gc->write_reg = bgpio_write32be;
441*4882a593Smuzhiyun } else {
442*4882a593Smuzhiyun gc->read_reg = bgpio_read32;
443*4882a593Smuzhiyun gc->write_reg = bgpio_write32;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun break;
446*4882a593Smuzhiyun #if BITS_PER_LONG >= 64
447*4882a593Smuzhiyun case 64:
448*4882a593Smuzhiyun if (byte_be) {
449*4882a593Smuzhiyun dev_err(dev,
450*4882a593Smuzhiyun "64 bit big endian byte order unsupported\n");
451*4882a593Smuzhiyun return -EINVAL;
452*4882a593Smuzhiyun } else {
453*4882a593Smuzhiyun gc->read_reg = bgpio_read64;
454*4882a593Smuzhiyun gc->write_reg = bgpio_write64;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun break;
457*4882a593Smuzhiyun #endif /* BITS_PER_LONG >= 64 */
458*4882a593Smuzhiyun default:
459*4882a593Smuzhiyun dev_err(dev, "unsupported data width %u bits\n", gc->bgpio_bits);
460*4882a593Smuzhiyun return -EINVAL;
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun return 0;
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun /*
467*4882a593Smuzhiyun * Create the device and allocate the resources. For setting GPIO's there are
468*4882a593Smuzhiyun * three supported configurations:
469*4882a593Smuzhiyun *
470*4882a593Smuzhiyun * - single input/output register resource (named "dat").
471*4882a593Smuzhiyun * - set/clear pair (named "set" and "clr").
472*4882a593Smuzhiyun * - single output register resource and single input resource ("set" and
473*4882a593Smuzhiyun * dat").
474*4882a593Smuzhiyun *
475*4882a593Smuzhiyun * For the single output register, this drives a 1 by setting a bit and a zero
476*4882a593Smuzhiyun * by clearing a bit. For the set clr pair, this drives a 1 by setting a bit
477*4882a593Smuzhiyun * in the set register and clears it by setting a bit in the clear register.
478*4882a593Smuzhiyun * The configuration is detected by which resources are present.
479*4882a593Smuzhiyun *
480*4882a593Smuzhiyun * For setting the GPIO direction, there are three supported configurations:
481*4882a593Smuzhiyun *
482*4882a593Smuzhiyun * - simple bidirection GPIO that requires no configuration.
483*4882a593Smuzhiyun * - an output direction register (named "dirout") where a 1 bit
484*4882a593Smuzhiyun * indicates the GPIO is an output.
485*4882a593Smuzhiyun * - an input direction register (named "dirin") where a 1 bit indicates
486*4882a593Smuzhiyun * the GPIO is an input.
487*4882a593Smuzhiyun */
bgpio_setup_io(struct gpio_chip * gc,void __iomem * dat,void __iomem * set,void __iomem * clr,unsigned long flags)488*4882a593Smuzhiyun static int bgpio_setup_io(struct gpio_chip *gc,
489*4882a593Smuzhiyun void __iomem *dat,
490*4882a593Smuzhiyun void __iomem *set,
491*4882a593Smuzhiyun void __iomem *clr,
492*4882a593Smuzhiyun unsigned long flags)
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun gc->reg_dat = dat;
496*4882a593Smuzhiyun if (!gc->reg_dat)
497*4882a593Smuzhiyun return -EINVAL;
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun if (set && clr) {
500*4882a593Smuzhiyun gc->reg_set = set;
501*4882a593Smuzhiyun gc->reg_clr = clr;
502*4882a593Smuzhiyun gc->set = bgpio_set_with_clear;
503*4882a593Smuzhiyun gc->set_multiple = bgpio_set_multiple_with_clear;
504*4882a593Smuzhiyun } else if (set && !clr) {
505*4882a593Smuzhiyun gc->reg_set = set;
506*4882a593Smuzhiyun gc->set = bgpio_set_set;
507*4882a593Smuzhiyun gc->set_multiple = bgpio_set_multiple_set;
508*4882a593Smuzhiyun } else if (flags & BGPIOF_NO_OUTPUT) {
509*4882a593Smuzhiyun gc->set = bgpio_set_none;
510*4882a593Smuzhiyun gc->set_multiple = NULL;
511*4882a593Smuzhiyun } else {
512*4882a593Smuzhiyun gc->set = bgpio_set;
513*4882a593Smuzhiyun gc->set_multiple = bgpio_set_multiple;
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun if (!(flags & BGPIOF_UNREADABLE_REG_SET) &&
517*4882a593Smuzhiyun (flags & BGPIOF_READ_OUTPUT_REG_SET)) {
518*4882a593Smuzhiyun gc->get = bgpio_get_set;
519*4882a593Smuzhiyun if (!gc->be_bits)
520*4882a593Smuzhiyun gc->get_multiple = bgpio_get_set_multiple;
521*4882a593Smuzhiyun /*
522*4882a593Smuzhiyun * We deliberately avoid assigning the ->get_multiple() call
523*4882a593Smuzhiyun * for big endian mirrored registers which are ALSO reflecting
524*4882a593Smuzhiyun * their value in the set register when used as output. It is
525*4882a593Smuzhiyun * simply too much complexity, let the GPIO core fall back to
526*4882a593Smuzhiyun * reading each line individually in that fringe case.
527*4882a593Smuzhiyun */
528*4882a593Smuzhiyun } else {
529*4882a593Smuzhiyun gc->get = bgpio_get;
530*4882a593Smuzhiyun if (gc->be_bits)
531*4882a593Smuzhiyun gc->get_multiple = bgpio_get_multiple_be;
532*4882a593Smuzhiyun else
533*4882a593Smuzhiyun gc->get_multiple = bgpio_get_multiple;
534*4882a593Smuzhiyun }
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun return 0;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun
bgpio_setup_direction(struct gpio_chip * gc,void __iomem * dirout,void __iomem * dirin,unsigned long flags)539*4882a593Smuzhiyun static int bgpio_setup_direction(struct gpio_chip *gc,
540*4882a593Smuzhiyun void __iomem *dirout,
541*4882a593Smuzhiyun void __iomem *dirin,
542*4882a593Smuzhiyun unsigned long flags)
543*4882a593Smuzhiyun {
544*4882a593Smuzhiyun if (dirout || dirin) {
545*4882a593Smuzhiyun gc->reg_dir_out = dirout;
546*4882a593Smuzhiyun gc->reg_dir_in = dirin;
547*4882a593Smuzhiyun if (flags & BGPIOF_NO_SET_ON_INPUT)
548*4882a593Smuzhiyun gc->direction_output = bgpio_dir_out_dir_first;
549*4882a593Smuzhiyun else
550*4882a593Smuzhiyun gc->direction_output = bgpio_dir_out_val_first;
551*4882a593Smuzhiyun gc->direction_input = bgpio_dir_in;
552*4882a593Smuzhiyun gc->get_direction = bgpio_get_dir;
553*4882a593Smuzhiyun } else {
554*4882a593Smuzhiyun if (flags & BGPIOF_NO_OUTPUT)
555*4882a593Smuzhiyun gc->direction_output = bgpio_dir_out_err;
556*4882a593Smuzhiyun else
557*4882a593Smuzhiyun gc->direction_output = bgpio_simple_dir_out;
558*4882a593Smuzhiyun gc->direction_input = bgpio_simple_dir_in;
559*4882a593Smuzhiyun }
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun return 0;
562*4882a593Smuzhiyun }
563*4882a593Smuzhiyun
bgpio_request(struct gpio_chip * chip,unsigned gpio_pin)564*4882a593Smuzhiyun static int bgpio_request(struct gpio_chip *chip, unsigned gpio_pin)
565*4882a593Smuzhiyun {
566*4882a593Smuzhiyun if (gpio_pin < chip->ngpio)
567*4882a593Smuzhiyun return 0;
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun return -EINVAL;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun /**
573*4882a593Smuzhiyun * bgpio_init() - Initialize generic GPIO accessor functions
574*4882a593Smuzhiyun * @gc: the GPIO chip to set up
575*4882a593Smuzhiyun * @dev: the parent device of the new GPIO chip (compulsory)
576*4882a593Smuzhiyun * @sz: the size (width) of the MMIO registers in bytes, typically 1, 2 or 4
577*4882a593Smuzhiyun * @dat: MMIO address for the register to READ the value of the GPIO lines, it
578*4882a593Smuzhiyun * is expected that a 1 in the corresponding bit in this register means the
579*4882a593Smuzhiyun * line is asserted
580*4882a593Smuzhiyun * @set: MMIO address for the register to SET the value of the GPIO lines, it is
581*4882a593Smuzhiyun * expected that we write the line with 1 in this register to drive the GPIO line
582*4882a593Smuzhiyun * high.
583*4882a593Smuzhiyun * @clr: MMIO address for the register to CLEAR the value of the GPIO lines, it is
584*4882a593Smuzhiyun * expected that we write the line with 1 in this register to drive the GPIO line
585*4882a593Smuzhiyun * low. It is allowed to leave this address as NULL, in that case the SET register
586*4882a593Smuzhiyun * will be assumed to also clear the GPIO lines, by actively writing the line
587*4882a593Smuzhiyun * with 0.
588*4882a593Smuzhiyun * @dirout: MMIO address for the register to set the line as OUTPUT. It is assumed
589*4882a593Smuzhiyun * that setting a line to 1 in this register will turn that line into an
590*4882a593Smuzhiyun * output line. Conversely, setting the line to 0 will turn that line into
591*4882a593Smuzhiyun * an input.
592*4882a593Smuzhiyun * @dirin: MMIO address for the register to set this line as INPUT. It is assumed
593*4882a593Smuzhiyun * that setting a line to 1 in this register will turn that line into an
594*4882a593Smuzhiyun * input line. Conversely, setting the line to 0 will turn that line into
595*4882a593Smuzhiyun * an output.
596*4882a593Smuzhiyun * @flags: Different flags that will affect the behaviour of the device, such as
597*4882a593Smuzhiyun * endianness etc.
598*4882a593Smuzhiyun */
bgpio_init(struct gpio_chip * gc,struct device * dev,unsigned long sz,void __iomem * dat,void __iomem * set,void __iomem * clr,void __iomem * dirout,void __iomem * dirin,unsigned long flags)599*4882a593Smuzhiyun int bgpio_init(struct gpio_chip *gc, struct device *dev,
600*4882a593Smuzhiyun unsigned long sz, void __iomem *dat, void __iomem *set,
601*4882a593Smuzhiyun void __iomem *clr, void __iomem *dirout, void __iomem *dirin,
602*4882a593Smuzhiyun unsigned long flags)
603*4882a593Smuzhiyun {
604*4882a593Smuzhiyun int ret;
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun if (!is_power_of_2(sz))
607*4882a593Smuzhiyun return -EINVAL;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun gc->bgpio_bits = sz * 8;
610*4882a593Smuzhiyun if (gc->bgpio_bits > BITS_PER_LONG)
611*4882a593Smuzhiyun return -EINVAL;
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun spin_lock_init(&gc->bgpio_lock);
614*4882a593Smuzhiyun gc->parent = dev;
615*4882a593Smuzhiyun gc->label = dev_name(dev);
616*4882a593Smuzhiyun gc->base = -1;
617*4882a593Smuzhiyun gc->ngpio = gc->bgpio_bits;
618*4882a593Smuzhiyun gc->request = bgpio_request;
619*4882a593Smuzhiyun gc->be_bits = !!(flags & BGPIOF_BIG_ENDIAN);
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun ret = bgpio_setup_io(gc, dat, set, clr, flags);
622*4882a593Smuzhiyun if (ret)
623*4882a593Smuzhiyun return ret;
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun ret = bgpio_setup_accessors(dev, gc, flags & BGPIOF_BIG_ENDIAN_BYTE_ORDER);
626*4882a593Smuzhiyun if (ret)
627*4882a593Smuzhiyun return ret;
628*4882a593Smuzhiyun
629*4882a593Smuzhiyun ret = bgpio_setup_direction(gc, dirout, dirin, flags);
630*4882a593Smuzhiyun if (ret)
631*4882a593Smuzhiyun return ret;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun gc->bgpio_data = gc->read_reg(gc->reg_dat);
634*4882a593Smuzhiyun if (gc->set == bgpio_set_set &&
635*4882a593Smuzhiyun !(flags & BGPIOF_UNREADABLE_REG_SET))
636*4882a593Smuzhiyun gc->bgpio_data = gc->read_reg(gc->reg_set);
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun if (flags & BGPIOF_UNREADABLE_REG_DIR)
639*4882a593Smuzhiyun gc->bgpio_dir_unreadable = true;
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun /*
642*4882a593Smuzhiyun * Inspect hardware to find initial direction setting.
643*4882a593Smuzhiyun */
644*4882a593Smuzhiyun if ((gc->reg_dir_out || gc->reg_dir_in) &&
645*4882a593Smuzhiyun !(flags & BGPIOF_UNREADABLE_REG_DIR)) {
646*4882a593Smuzhiyun if (gc->reg_dir_out)
647*4882a593Smuzhiyun gc->bgpio_dir = gc->read_reg(gc->reg_dir_out);
648*4882a593Smuzhiyun else if (gc->reg_dir_in)
649*4882a593Smuzhiyun gc->bgpio_dir = ~gc->read_reg(gc->reg_dir_in);
650*4882a593Smuzhiyun /*
651*4882a593Smuzhiyun * If we have two direction registers, synchronise
652*4882a593Smuzhiyun * input setting to output setting, the library
653*4882a593Smuzhiyun * can not handle a line being input and output at
654*4882a593Smuzhiyun * the same time.
655*4882a593Smuzhiyun */
656*4882a593Smuzhiyun if (gc->reg_dir_out && gc->reg_dir_in)
657*4882a593Smuzhiyun gc->write_reg(gc->reg_dir_in, ~gc->bgpio_dir);
658*4882a593Smuzhiyun }
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun return ret;
661*4882a593Smuzhiyun }
662*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(bgpio_init);
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_GPIO_GENERIC_PLATFORM)
665*4882a593Smuzhiyun
bgpio_map(struct platform_device * pdev,const char * name,resource_size_t sane_sz)666*4882a593Smuzhiyun static void __iomem *bgpio_map(struct platform_device *pdev,
667*4882a593Smuzhiyun const char *name,
668*4882a593Smuzhiyun resource_size_t sane_sz)
669*4882a593Smuzhiyun {
670*4882a593Smuzhiyun struct resource *r;
671*4882a593Smuzhiyun resource_size_t sz;
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun r = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
674*4882a593Smuzhiyun if (!r)
675*4882a593Smuzhiyun return NULL;
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun sz = resource_size(r);
678*4882a593Smuzhiyun if (sz != sane_sz)
679*4882a593Smuzhiyun return IOMEM_ERR_PTR(-EINVAL);
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun return devm_ioremap_resource(&pdev->dev, r);
682*4882a593Smuzhiyun }
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun #ifdef CONFIG_OF
685*4882a593Smuzhiyun static const struct of_device_id bgpio_of_match[] = {
686*4882a593Smuzhiyun { .compatible = "brcm,bcm6345-gpio" },
687*4882a593Smuzhiyun { .compatible = "wd,mbl-gpio" },
688*4882a593Smuzhiyun { .compatible = "ni,169445-nand-gpio" },
689*4882a593Smuzhiyun { }
690*4882a593Smuzhiyun };
691*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, bgpio_of_match);
692*4882a593Smuzhiyun
bgpio_parse_dt(struct platform_device * pdev,unsigned long * flags)693*4882a593Smuzhiyun static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev,
694*4882a593Smuzhiyun unsigned long *flags)
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun struct bgpio_pdata *pdata;
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun if (!of_match_device(bgpio_of_match, &pdev->dev))
699*4882a593Smuzhiyun return NULL;
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun pdata = devm_kzalloc(&pdev->dev, sizeof(struct bgpio_pdata),
702*4882a593Smuzhiyun GFP_KERNEL);
703*4882a593Smuzhiyun if (!pdata)
704*4882a593Smuzhiyun return ERR_PTR(-ENOMEM);
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun pdata->base = -1;
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun if (of_device_is_big_endian(pdev->dev.of_node))
709*4882a593Smuzhiyun *flags |= BGPIOF_BIG_ENDIAN_BYTE_ORDER;
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun if (of_property_read_bool(pdev->dev.of_node, "no-output"))
712*4882a593Smuzhiyun *flags |= BGPIOF_NO_OUTPUT;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun return pdata;
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun #else
bgpio_parse_dt(struct platform_device * pdev,unsigned long * flags)717*4882a593Smuzhiyun static struct bgpio_pdata *bgpio_parse_dt(struct platform_device *pdev,
718*4882a593Smuzhiyun unsigned long *flags)
719*4882a593Smuzhiyun {
720*4882a593Smuzhiyun return NULL;
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun #endif /* CONFIG_OF */
723*4882a593Smuzhiyun
bgpio_pdev_probe(struct platform_device * pdev)724*4882a593Smuzhiyun static int bgpio_pdev_probe(struct platform_device *pdev)
725*4882a593Smuzhiyun {
726*4882a593Smuzhiyun struct device *dev = &pdev->dev;
727*4882a593Smuzhiyun struct resource *r;
728*4882a593Smuzhiyun void __iomem *dat;
729*4882a593Smuzhiyun void __iomem *set;
730*4882a593Smuzhiyun void __iomem *clr;
731*4882a593Smuzhiyun void __iomem *dirout;
732*4882a593Smuzhiyun void __iomem *dirin;
733*4882a593Smuzhiyun unsigned long sz;
734*4882a593Smuzhiyun unsigned long flags = 0;
735*4882a593Smuzhiyun int err;
736*4882a593Smuzhiyun struct gpio_chip *gc;
737*4882a593Smuzhiyun struct bgpio_pdata *pdata;
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun pdata = bgpio_parse_dt(pdev, &flags);
740*4882a593Smuzhiyun if (IS_ERR(pdata))
741*4882a593Smuzhiyun return PTR_ERR(pdata);
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun if (!pdata) {
744*4882a593Smuzhiyun pdata = dev_get_platdata(dev);
745*4882a593Smuzhiyun flags = pdev->id_entry->driver_data;
746*4882a593Smuzhiyun }
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
749*4882a593Smuzhiyun if (!r)
750*4882a593Smuzhiyun return -EINVAL;
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun sz = resource_size(r);
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun dat = bgpio_map(pdev, "dat", sz);
755*4882a593Smuzhiyun if (IS_ERR(dat))
756*4882a593Smuzhiyun return PTR_ERR(dat);
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun set = bgpio_map(pdev, "set", sz);
759*4882a593Smuzhiyun if (IS_ERR(set))
760*4882a593Smuzhiyun return PTR_ERR(set);
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun clr = bgpio_map(pdev, "clr", sz);
763*4882a593Smuzhiyun if (IS_ERR(clr))
764*4882a593Smuzhiyun return PTR_ERR(clr);
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun dirout = bgpio_map(pdev, "dirout", sz);
767*4882a593Smuzhiyun if (IS_ERR(dirout))
768*4882a593Smuzhiyun return PTR_ERR(dirout);
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun dirin = bgpio_map(pdev, "dirin", sz);
771*4882a593Smuzhiyun if (IS_ERR(dirin))
772*4882a593Smuzhiyun return PTR_ERR(dirin);
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun gc = devm_kzalloc(&pdev->dev, sizeof(*gc), GFP_KERNEL);
775*4882a593Smuzhiyun if (!gc)
776*4882a593Smuzhiyun return -ENOMEM;
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun err = bgpio_init(gc, dev, sz, dat, set, clr, dirout, dirin, flags);
779*4882a593Smuzhiyun if (err)
780*4882a593Smuzhiyun return err;
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun if (pdata) {
783*4882a593Smuzhiyun if (pdata->label)
784*4882a593Smuzhiyun gc->label = pdata->label;
785*4882a593Smuzhiyun gc->base = pdata->base;
786*4882a593Smuzhiyun if (pdata->ngpio > 0)
787*4882a593Smuzhiyun gc->ngpio = pdata->ngpio;
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun platform_set_drvdata(pdev, gc);
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun return devm_gpiochip_add_data(&pdev->dev, gc, NULL);
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun static const struct platform_device_id bgpio_id_table[] = {
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun .name = "basic-mmio-gpio",
798*4882a593Smuzhiyun .driver_data = 0,
799*4882a593Smuzhiyun }, {
800*4882a593Smuzhiyun .name = "basic-mmio-gpio-be",
801*4882a593Smuzhiyun .driver_data = BGPIOF_BIG_ENDIAN,
802*4882a593Smuzhiyun },
803*4882a593Smuzhiyun { }
804*4882a593Smuzhiyun };
805*4882a593Smuzhiyun MODULE_DEVICE_TABLE(platform, bgpio_id_table);
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun static struct platform_driver bgpio_driver = {
808*4882a593Smuzhiyun .driver = {
809*4882a593Smuzhiyun .name = "basic-mmio-gpio",
810*4882a593Smuzhiyun .of_match_table = of_match_ptr(bgpio_of_match),
811*4882a593Smuzhiyun },
812*4882a593Smuzhiyun .id_table = bgpio_id_table,
813*4882a593Smuzhiyun .probe = bgpio_pdev_probe,
814*4882a593Smuzhiyun };
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun module_platform_driver(bgpio_driver);
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun #endif /* CONFIG_GPIO_GENERIC_PLATFORM */
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun MODULE_DESCRIPTION("Driver for basic memory-mapped GPIO controllers");
821*4882a593Smuzhiyun MODULE_AUTHOR("Anton Vorontsov <cbouatmailru@gmail.com>");
822*4882a593Smuzhiyun MODULE_LICENSE("GPL");
823