blob: 7c35249058f61837de5d7b9db7287e3c9ae9c000 [file] [log] [blame]
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001/*
2 * Driver for Broadcom BCM2835 GPIO unit (pinctrl + GPIO)
3 *
4 * Copyright (C) 2012 Chris Boot, Simon Arlott, Stephen Warren
5 *
6 * This driver is inspired by:
7 * pinctrl-nomadik.c, please see original file for copyright information
8 * pinctrl-tegra.c, please see original file for copyright information
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 */
20
21#include <linux/bitmap.h>
22#include <linux/bug.h>
23#include <linux/delay.h>
24#include <linux/device.h>
25#include <linux/err.h>
Linus Walleije19a5f72015-12-08 22:01:00 +010026#include <linux/gpio/driver.h>
Simon Arlotte1b2dc72012-09-27 22:10:11 -060027#include <linux/interrupt.h>
28#include <linux/io.h>
29#include <linux/irq.h>
30#include <linux/irqdesc.h>
31#include <linux/irqdomain.h>
Simon Arlotte1b2dc72012-09-27 22:10:11 -060032#include <linux/module.h>
33#include <linux/of_address.h>
34#include <linux/of.h>
35#include <linux/of_irq.h>
36#include <linux/pinctrl/consumer.h>
37#include <linux/pinctrl/machine.h>
38#include <linux/pinctrl/pinconf.h>
39#include <linux/pinctrl/pinctrl.h>
40#include <linux/pinctrl/pinmux.h>
41#include <linux/platform_device.h>
42#include <linux/seq_file.h>
43#include <linux/slab.h>
44#include <linux/spinlock.h>
45#include <linux/types.h>
46
47#define MODULE_NAME "pinctrl-bcm2835"
48#define BCM2835_NUM_GPIOS 54
49#define BCM2835_NUM_BANKS 2
50
51#define BCM2835_PIN_BITMAP_SZ \
52 DIV_ROUND_UP(BCM2835_NUM_GPIOS, sizeof(unsigned long) * 8)
53
54/* GPIO register offsets */
55#define GPFSEL0 0x0 /* Function Select */
56#define GPSET0 0x1c /* Pin Output Set */
57#define GPCLR0 0x28 /* Pin Output Clear */
58#define GPLEV0 0x34 /* Pin Level */
59#define GPEDS0 0x40 /* Pin Event Detect Status */
60#define GPREN0 0x4c /* Pin Rising Edge Detect Enable */
61#define GPFEN0 0x58 /* Pin Falling Edge Detect Enable */
62#define GPHEN0 0x64 /* Pin High Detect Enable */
63#define GPLEN0 0x70 /* Pin Low Detect Enable */
64#define GPAREN0 0x7c /* Pin Async Rising Edge Detect */
65#define GPAFEN0 0x88 /* Pin Async Falling Edge Detect */
66#define GPPUD 0x94 /* Pin Pull-up/down Enable */
67#define GPPUDCLK0 0x98 /* Pin Pull-up/down Enable Clock */
68
69#define FSEL_REG(p) (GPFSEL0 + (((p) / 10) * 4))
70#define FSEL_SHIFT(p) (((p) % 10) * 3)
71#define GPIO_REG_OFFSET(p) ((p) / 32)
72#define GPIO_REG_SHIFT(p) ((p) % 32)
73
74enum bcm2835_pinconf_param {
75 /* argument: bcm2835_pinconf_pull */
76 BCM2835_PINCONF_PARAM_PULL,
77};
78
79enum bcm2835_pinconf_pull {
80 BCM2835_PINCONFIG_PULL_NONE,
81 BCM2835_PINCONFIG_PULL_DOWN,
82 BCM2835_PINCONFIG_PULL_UP,
83};
84
85#define BCM2835_PINCONF_PACK(_param_, _arg_) ((_param_) << 16 | (_arg_))
86#define BCM2835_PINCONF_UNPACK_PARAM(_conf_) ((_conf_) >> 16)
87#define BCM2835_PINCONF_UNPACK_ARG(_conf_) ((_conf_) & 0xffff)
88
89struct bcm2835_gpio_irqdata {
90 struct bcm2835_pinctrl *pc;
91 int bank;
92};
93
94struct bcm2835_pinctrl {
95 struct device *dev;
96 void __iomem *base;
97 int irq[BCM2835_NUM_BANKS];
98
99 /* note: locking assumes each bank will have its own unsigned long */
100 unsigned long enabled_irq_map[BCM2835_NUM_BANKS];
101 unsigned int irq_type[BCM2835_NUM_GPIOS];
102
103 struct pinctrl_dev *pctl_dev;
104 struct irq_domain *irq_domain;
105 struct gpio_chip gpio_chip;
106 struct pinctrl_gpio_range gpio_range;
107
108 struct bcm2835_gpio_irqdata irq_data[BCM2835_NUM_BANKS];
109 spinlock_t irq_lock[BCM2835_NUM_BANKS];
110};
111
112static struct lock_class_key gpio_lock_class;
113
114/* pins are just named GPIO0..GPIO53 */
115#define BCM2835_GPIO_PIN(a) PINCTRL_PIN(a, "gpio" #a)
Sachin Kamate8ed9122013-06-18 14:34:24 +0530116static struct pinctrl_pin_desc bcm2835_gpio_pins[] = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600117 BCM2835_GPIO_PIN(0),
118 BCM2835_GPIO_PIN(1),
119 BCM2835_GPIO_PIN(2),
120 BCM2835_GPIO_PIN(3),
121 BCM2835_GPIO_PIN(4),
122 BCM2835_GPIO_PIN(5),
123 BCM2835_GPIO_PIN(6),
124 BCM2835_GPIO_PIN(7),
125 BCM2835_GPIO_PIN(8),
126 BCM2835_GPIO_PIN(9),
127 BCM2835_GPIO_PIN(10),
128 BCM2835_GPIO_PIN(11),
129 BCM2835_GPIO_PIN(12),
130 BCM2835_GPIO_PIN(13),
131 BCM2835_GPIO_PIN(14),
132 BCM2835_GPIO_PIN(15),
133 BCM2835_GPIO_PIN(16),
134 BCM2835_GPIO_PIN(17),
135 BCM2835_GPIO_PIN(18),
136 BCM2835_GPIO_PIN(19),
137 BCM2835_GPIO_PIN(20),
138 BCM2835_GPIO_PIN(21),
139 BCM2835_GPIO_PIN(22),
140 BCM2835_GPIO_PIN(23),
141 BCM2835_GPIO_PIN(24),
142 BCM2835_GPIO_PIN(25),
143 BCM2835_GPIO_PIN(26),
144 BCM2835_GPIO_PIN(27),
145 BCM2835_GPIO_PIN(28),
146 BCM2835_GPIO_PIN(29),
147 BCM2835_GPIO_PIN(30),
148 BCM2835_GPIO_PIN(31),
149 BCM2835_GPIO_PIN(32),
150 BCM2835_GPIO_PIN(33),
151 BCM2835_GPIO_PIN(34),
152 BCM2835_GPIO_PIN(35),
153 BCM2835_GPIO_PIN(36),
154 BCM2835_GPIO_PIN(37),
155 BCM2835_GPIO_PIN(38),
156 BCM2835_GPIO_PIN(39),
157 BCM2835_GPIO_PIN(40),
158 BCM2835_GPIO_PIN(41),
159 BCM2835_GPIO_PIN(42),
160 BCM2835_GPIO_PIN(43),
161 BCM2835_GPIO_PIN(44),
162 BCM2835_GPIO_PIN(45),
163 BCM2835_GPIO_PIN(46),
164 BCM2835_GPIO_PIN(47),
165 BCM2835_GPIO_PIN(48),
166 BCM2835_GPIO_PIN(49),
167 BCM2835_GPIO_PIN(50),
168 BCM2835_GPIO_PIN(51),
169 BCM2835_GPIO_PIN(52),
170 BCM2835_GPIO_PIN(53),
171};
172
173/* one pin per group */
174static const char * const bcm2835_gpio_groups[] = {
175 "gpio0",
176 "gpio1",
177 "gpio2",
178 "gpio3",
179 "gpio4",
180 "gpio5",
181 "gpio6",
182 "gpio7",
183 "gpio8",
184 "gpio9",
185 "gpio10",
186 "gpio11",
187 "gpio12",
188 "gpio13",
189 "gpio14",
190 "gpio15",
191 "gpio16",
192 "gpio17",
193 "gpio18",
194 "gpio19",
195 "gpio20",
196 "gpio21",
197 "gpio22",
198 "gpio23",
199 "gpio24",
200 "gpio25",
201 "gpio26",
202 "gpio27",
203 "gpio28",
204 "gpio29",
205 "gpio30",
206 "gpio31",
207 "gpio32",
208 "gpio33",
209 "gpio34",
210 "gpio35",
211 "gpio36",
212 "gpio37",
213 "gpio38",
214 "gpio39",
215 "gpio40",
216 "gpio41",
217 "gpio42",
218 "gpio43",
219 "gpio44",
220 "gpio45",
221 "gpio46",
222 "gpio47",
223 "gpio48",
224 "gpio49",
225 "gpio50",
226 "gpio51",
227 "gpio52",
228 "gpio53",
229};
230
231enum bcm2835_fsel {
232 BCM2835_FSEL_GPIO_IN = 0,
233 BCM2835_FSEL_GPIO_OUT = 1,
234 BCM2835_FSEL_ALT0 = 4,
235 BCM2835_FSEL_ALT1 = 5,
236 BCM2835_FSEL_ALT2 = 6,
237 BCM2835_FSEL_ALT3 = 7,
238 BCM2835_FSEL_ALT4 = 3,
239 BCM2835_FSEL_ALT5 = 2,
240 BCM2835_FSEL_COUNT = 8,
241 BCM2835_FSEL_MASK = 0x7,
242};
243
244static const char * const bcm2835_functions[BCM2835_FSEL_COUNT] = {
245 [BCM2835_FSEL_GPIO_IN] = "gpio_in",
246 [BCM2835_FSEL_GPIO_OUT] = "gpio_out",
247 [BCM2835_FSEL_ALT0] = "alt0",
248 [BCM2835_FSEL_ALT1] = "alt1",
249 [BCM2835_FSEL_ALT2] = "alt2",
250 [BCM2835_FSEL_ALT3] = "alt3",
251 [BCM2835_FSEL_ALT4] = "alt4",
252 [BCM2835_FSEL_ALT5] = "alt5",
253};
254
255static const char * const irq_type_names[] = {
256 [IRQ_TYPE_NONE] = "none",
257 [IRQ_TYPE_EDGE_RISING] = "edge-rising",
258 [IRQ_TYPE_EDGE_FALLING] = "edge-falling",
259 [IRQ_TYPE_EDGE_BOTH] = "edge-both",
260 [IRQ_TYPE_LEVEL_HIGH] = "level-high",
261 [IRQ_TYPE_LEVEL_LOW] = "level-low",
262};
263
264static inline u32 bcm2835_gpio_rd(struct bcm2835_pinctrl *pc, unsigned reg)
265{
266 return readl(pc->base + reg);
267}
268
269static inline void bcm2835_gpio_wr(struct bcm2835_pinctrl *pc, unsigned reg,
270 u32 val)
271{
272 writel(val, pc->base + reg);
273}
274
275static inline int bcm2835_gpio_get_bit(struct bcm2835_pinctrl *pc, unsigned reg,
276 unsigned bit)
277{
278 reg += GPIO_REG_OFFSET(bit) * 4;
279 return (bcm2835_gpio_rd(pc, reg) >> GPIO_REG_SHIFT(bit)) & 1;
280}
281
282/* note NOT a read/modify/write cycle */
283static inline void bcm2835_gpio_set_bit(struct bcm2835_pinctrl *pc,
284 unsigned reg, unsigned bit)
285{
286 reg += GPIO_REG_OFFSET(bit) * 4;
287 bcm2835_gpio_wr(pc, reg, BIT(GPIO_REG_SHIFT(bit)));
288}
289
290static inline enum bcm2835_fsel bcm2835_pinctrl_fsel_get(
291 struct bcm2835_pinctrl *pc, unsigned pin)
292{
293 u32 val = bcm2835_gpio_rd(pc, FSEL_REG(pin));
294 enum bcm2835_fsel status = (val >> FSEL_SHIFT(pin)) & BCM2835_FSEL_MASK;
295
296 dev_dbg(pc->dev, "get %08x (%u => %s)\n", val, pin,
297 bcm2835_functions[status]);
298
299 return status;
300}
301
302static inline void bcm2835_pinctrl_fsel_set(
303 struct bcm2835_pinctrl *pc, unsigned pin,
304 enum bcm2835_fsel fsel)
305{
306 u32 val = bcm2835_gpio_rd(pc, FSEL_REG(pin));
307 enum bcm2835_fsel cur = (val >> FSEL_SHIFT(pin)) & BCM2835_FSEL_MASK;
308
309 dev_dbg(pc->dev, "read %08x (%u => %s)\n", val, pin,
310 bcm2835_functions[cur]);
311
312 if (cur == fsel)
313 return;
314
315 if (cur != BCM2835_FSEL_GPIO_IN && fsel != BCM2835_FSEL_GPIO_IN) {
316 /* always transition through GPIO_IN */
317 val &= ~(BCM2835_FSEL_MASK << FSEL_SHIFT(pin));
318 val |= BCM2835_FSEL_GPIO_IN << FSEL_SHIFT(pin);
319
320 dev_dbg(pc->dev, "trans %08x (%u <= %s)\n", val, pin,
321 bcm2835_functions[BCM2835_FSEL_GPIO_IN]);
322 bcm2835_gpio_wr(pc, FSEL_REG(pin), val);
323 }
324
325 val &= ~(BCM2835_FSEL_MASK << FSEL_SHIFT(pin));
326 val |= fsel << FSEL_SHIFT(pin);
327
328 dev_dbg(pc->dev, "write %08x (%u <= %s)\n", val, pin,
329 bcm2835_functions[fsel]);
330 bcm2835_gpio_wr(pc, FSEL_REG(pin), val);
331}
332
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600333static int bcm2835_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
334{
335 return pinctrl_gpio_direction_input(chip->base + offset);
336}
337
338static int bcm2835_gpio_get(struct gpio_chip *chip, unsigned offset)
339{
Linus Walleije19a5f72015-12-08 22:01:00 +0100340 struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600341
342 return bcm2835_gpio_get_bit(pc, GPLEV0, offset);
343}
344
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600345static void bcm2835_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
346{
Linus Walleije19a5f72015-12-08 22:01:00 +0100347 struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600348
349 bcm2835_gpio_set_bit(pc, value ? GPSET0 : GPCLR0, offset);
350}
351
Stefan Wahren4c02cba2015-11-19 00:32:27 +0000352static int bcm2835_gpio_direction_output(struct gpio_chip *chip,
353 unsigned offset, int value)
354{
355 bcm2835_gpio_set(chip, offset, value);
356 return pinctrl_gpio_direction_output(chip->base + offset);
357}
358
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600359static int bcm2835_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
360{
Linus Walleije19a5f72015-12-08 22:01:00 +0100361 struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600362
363 return irq_linear_revmap(pc->irq_domain, offset);
364}
365
Bill Pemberton84db00b2012-11-19 13:25:13 -0500366static struct gpio_chip bcm2835_gpio_chip = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600367 .label = MODULE_NAME,
368 .owner = THIS_MODULE,
Jonas Gorski98c85d52015-10-11 17:34:19 +0200369 .request = gpiochip_generic_request,
370 .free = gpiochip_generic_free,
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600371 .direction_input = bcm2835_gpio_direction_input,
372 .direction_output = bcm2835_gpio_direction_output,
373 .get = bcm2835_gpio_get,
374 .set = bcm2835_gpio_set,
375 .to_irq = bcm2835_gpio_to_irq,
376 .base = -1,
377 .ngpio = BCM2835_NUM_GPIOS,
Linus Walleij9fb1f392013-12-04 14:42:46 +0100378 .can_sleep = false,
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600379};
380
381static irqreturn_t bcm2835_gpio_irq_handler(int irq, void *dev_id)
382{
383 struct bcm2835_gpio_irqdata *irqdata = dev_id;
384 struct bcm2835_pinctrl *pc = irqdata->pc;
385 int bank = irqdata->bank;
386 unsigned long events;
387 unsigned offset;
388 unsigned gpio;
389 unsigned int type;
390
391 events = bcm2835_gpio_rd(pc, GPEDS0 + bank * 4);
392 events &= pc->enabled_irq_map[bank];
393 for_each_set_bit(offset, &events, 32) {
394 gpio = (32 * bank) + offset;
395 type = pc->irq_type[gpio];
396
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600397 generic_handle_irq(irq_linear_revmap(pc->irq_domain, gpio));
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600398 }
399 return events ? IRQ_HANDLED : IRQ_NONE;
400}
401
402static inline void __bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc,
403 unsigned reg, unsigned offset, bool enable)
404{
405 u32 value;
406 reg += GPIO_REG_OFFSET(offset) * 4;
407 value = bcm2835_gpio_rd(pc, reg);
408 if (enable)
409 value |= BIT(GPIO_REG_SHIFT(offset));
410 else
411 value &= ~(BIT(GPIO_REG_SHIFT(offset)));
412 bcm2835_gpio_wr(pc, reg, value);
413}
414
415/* fast path for IRQ handler */
416static void bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc,
417 unsigned offset, bool enable)
418{
419 switch (pc->irq_type[offset]) {
420 case IRQ_TYPE_EDGE_RISING:
421 __bcm2835_gpio_irq_config(pc, GPREN0, offset, enable);
422 break;
423
424 case IRQ_TYPE_EDGE_FALLING:
425 __bcm2835_gpio_irq_config(pc, GPFEN0, offset, enable);
426 break;
427
428 case IRQ_TYPE_EDGE_BOTH:
429 __bcm2835_gpio_irq_config(pc, GPREN0, offset, enable);
430 __bcm2835_gpio_irq_config(pc, GPFEN0, offset, enable);
431 break;
432
433 case IRQ_TYPE_LEVEL_HIGH:
434 __bcm2835_gpio_irq_config(pc, GPHEN0, offset, enable);
435 break;
436
437 case IRQ_TYPE_LEVEL_LOW:
438 __bcm2835_gpio_irq_config(pc, GPLEN0, offset, enable);
439 break;
440 }
441}
442
443static void bcm2835_gpio_irq_enable(struct irq_data *data)
444{
445 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data);
446 unsigned gpio = irqd_to_hwirq(data);
447 unsigned offset = GPIO_REG_SHIFT(gpio);
448 unsigned bank = GPIO_REG_OFFSET(gpio);
449 unsigned long flags;
450
451 spin_lock_irqsave(&pc->irq_lock[bank], flags);
452 set_bit(offset, &pc->enabled_irq_map[bank]);
453 bcm2835_gpio_irq_config(pc, gpio, true);
454 spin_unlock_irqrestore(&pc->irq_lock[bank], flags);
455}
456
457static void bcm2835_gpio_irq_disable(struct irq_data *data)
458{
459 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data);
460 unsigned gpio = irqd_to_hwirq(data);
461 unsigned offset = GPIO_REG_SHIFT(gpio);
462 unsigned bank = GPIO_REG_OFFSET(gpio);
463 unsigned long flags;
464
465 spin_lock_irqsave(&pc->irq_lock[bank], flags);
466 bcm2835_gpio_irq_config(pc, gpio, false);
Jonathan Bell714b1dd2015-06-30 12:35:39 +0100467 /* Clear events that were latched prior to clearing event sources */
468 bcm2835_gpio_set_bit(pc, GPEDS0, gpio);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600469 clear_bit(offset, &pc->enabled_irq_map[bank]);
470 spin_unlock_irqrestore(&pc->irq_lock[bank], flags);
471}
472
473static int __bcm2835_gpio_irq_set_type_disabled(struct bcm2835_pinctrl *pc,
474 unsigned offset, unsigned int type)
475{
476 switch (type) {
477 case IRQ_TYPE_NONE:
478 case IRQ_TYPE_EDGE_RISING:
479 case IRQ_TYPE_EDGE_FALLING:
480 case IRQ_TYPE_EDGE_BOTH:
481 case IRQ_TYPE_LEVEL_HIGH:
482 case IRQ_TYPE_LEVEL_LOW:
483 pc->irq_type[offset] = type;
484 break;
485
486 default:
487 return -EINVAL;
488 }
489 return 0;
490}
491
492/* slower path for reconfiguring IRQ type */
493static int __bcm2835_gpio_irq_set_type_enabled(struct bcm2835_pinctrl *pc,
494 unsigned offset, unsigned int type)
495{
496 switch (type) {
497 case IRQ_TYPE_NONE:
498 if (pc->irq_type[offset] != type) {
499 bcm2835_gpio_irq_config(pc, offset, false);
500 pc->irq_type[offset] = type;
501 }
502 break;
503
504 case IRQ_TYPE_EDGE_RISING:
505 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) {
506 /* RISING already enabled, disable FALLING */
507 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING;
508 bcm2835_gpio_irq_config(pc, offset, false);
509 pc->irq_type[offset] = type;
510 } else if (pc->irq_type[offset] != type) {
511 bcm2835_gpio_irq_config(pc, offset, false);
512 pc->irq_type[offset] = type;
513 bcm2835_gpio_irq_config(pc, offset, true);
514 }
515 break;
516
517 case IRQ_TYPE_EDGE_FALLING:
518 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_BOTH) {
519 /* FALLING already enabled, disable RISING */
520 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING;
521 bcm2835_gpio_irq_config(pc, offset, false);
522 pc->irq_type[offset] = type;
523 } else if (pc->irq_type[offset] != type) {
524 bcm2835_gpio_irq_config(pc, offset, false);
525 pc->irq_type[offset] = type;
526 bcm2835_gpio_irq_config(pc, offset, true);
527 }
528 break;
529
530 case IRQ_TYPE_EDGE_BOTH:
531 if (pc->irq_type[offset] == IRQ_TYPE_EDGE_RISING) {
532 /* RISING already enabled, enable FALLING too */
533 pc->irq_type[offset] = IRQ_TYPE_EDGE_FALLING;
534 bcm2835_gpio_irq_config(pc, offset, true);
535 pc->irq_type[offset] = type;
536 } else if (pc->irq_type[offset] == IRQ_TYPE_EDGE_FALLING) {
537 /* FALLING already enabled, enable RISING too */
538 pc->irq_type[offset] = IRQ_TYPE_EDGE_RISING;
539 bcm2835_gpio_irq_config(pc, offset, true);
540 pc->irq_type[offset] = type;
541 } else if (pc->irq_type[offset] != type) {
542 bcm2835_gpio_irq_config(pc, offset, false);
543 pc->irq_type[offset] = type;
544 bcm2835_gpio_irq_config(pc, offset, true);
545 }
546 break;
547
548 case IRQ_TYPE_LEVEL_HIGH:
549 case IRQ_TYPE_LEVEL_LOW:
550 if (pc->irq_type[offset] != type) {
551 bcm2835_gpio_irq_config(pc, offset, false);
552 pc->irq_type[offset] = type;
553 bcm2835_gpio_irq_config(pc, offset, true);
554 }
555 break;
556
557 default:
558 return -EINVAL;
559 }
560 return 0;
561}
562
563static int bcm2835_gpio_irq_set_type(struct irq_data *data, unsigned int type)
564{
565 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data);
566 unsigned gpio = irqd_to_hwirq(data);
567 unsigned offset = GPIO_REG_SHIFT(gpio);
568 unsigned bank = GPIO_REG_OFFSET(gpio);
569 unsigned long flags;
570 int ret;
571
572 spin_lock_irqsave(&pc->irq_lock[bank], flags);
573
574 if (test_bit(offset, &pc->enabled_irq_map[bank]))
575 ret = __bcm2835_gpio_irq_set_type_enabled(pc, gpio, type);
576 else
577 ret = __bcm2835_gpio_irq_set_type_disabled(pc, gpio, type);
578
Charles Keepaxb8a19382015-04-07 11:43:45 +0100579 if (type & IRQ_TYPE_EDGE_BOTH)
Thomas Gleixner1aa74fd2015-06-23 15:52:41 +0200580 irq_set_handler_locked(data, handle_edge_irq);
Charles Keepaxb8a19382015-04-07 11:43:45 +0100581 else
Thomas Gleixner1aa74fd2015-06-23 15:52:41 +0200582 irq_set_handler_locked(data, handle_level_irq);
Charles Keepaxb8a19382015-04-07 11:43:45 +0100583
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600584 spin_unlock_irqrestore(&pc->irq_lock[bank], flags);
585
586 return ret;
587}
588
Charles Keepaxb8a19382015-04-07 11:43:45 +0100589static void bcm2835_gpio_irq_ack(struct irq_data *data)
590{
591 struct bcm2835_pinctrl *pc = irq_data_get_irq_chip_data(data);
592 unsigned gpio = irqd_to_hwirq(data);
593
594 bcm2835_gpio_set_bit(pc, GPEDS0, gpio);
595}
596
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600597static struct irq_chip bcm2835_gpio_irq_chip = {
598 .name = MODULE_NAME,
599 .irq_enable = bcm2835_gpio_irq_enable,
600 .irq_disable = bcm2835_gpio_irq_disable,
601 .irq_set_type = bcm2835_gpio_irq_set_type,
Charles Keepaxb8a19382015-04-07 11:43:45 +0100602 .irq_ack = bcm2835_gpio_irq_ack,
603 .irq_mask = bcm2835_gpio_irq_disable,
604 .irq_unmask = bcm2835_gpio_irq_enable,
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600605};
606
607static int bcm2835_pctl_get_groups_count(struct pinctrl_dev *pctldev)
608{
609 return ARRAY_SIZE(bcm2835_gpio_groups);
610}
611
612static const char *bcm2835_pctl_get_group_name(struct pinctrl_dev *pctldev,
613 unsigned selector)
614{
615 return bcm2835_gpio_groups[selector];
616}
617
618static int bcm2835_pctl_get_group_pins(struct pinctrl_dev *pctldev,
619 unsigned selector,
620 const unsigned **pins,
621 unsigned *num_pins)
622{
623 *pins = &bcm2835_gpio_pins[selector].number;
624 *num_pins = 1;
625
626 return 0;
627}
628
629static void bcm2835_pctl_pin_dbg_show(struct pinctrl_dev *pctldev,
630 struct seq_file *s,
631 unsigned offset)
632{
633 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
634 enum bcm2835_fsel fsel = bcm2835_pinctrl_fsel_get(pc, offset);
635 const char *fname = bcm2835_functions[fsel];
636 int value = bcm2835_gpio_get_bit(pc, GPLEV0, offset);
637 int irq = irq_find_mapping(pc->irq_domain, offset);
638
639 seq_printf(s, "function %s in %s; irq %d (%s)",
640 fname, value ? "hi" : "lo",
641 irq, irq_type_names[pc->irq_type[offset]]);
642}
643
644static void bcm2835_pctl_dt_free_map(struct pinctrl_dev *pctldev,
645 struct pinctrl_map *maps, unsigned num_maps)
646{
647 int i;
648
649 for (i = 0; i < num_maps; i++)
650 if (maps[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
651 kfree(maps[i].data.configs.configs);
652
653 kfree(maps);
654}
655
656static int bcm2835_pctl_dt_node_to_map_func(struct bcm2835_pinctrl *pc,
657 struct device_node *np, u32 pin, u32 fnum,
658 struct pinctrl_map **maps)
659{
660 struct pinctrl_map *map = *maps;
661
662 if (fnum >= ARRAY_SIZE(bcm2835_functions)) {
663 dev_err(pc->dev, "%s: invalid brcm,function %d\n",
664 of_node_full_name(np), fnum);
665 return -EINVAL;
666 }
667
668 map->type = PIN_MAP_TYPE_MUX_GROUP;
669 map->data.mux.group = bcm2835_gpio_groups[pin];
670 map->data.mux.function = bcm2835_functions[fnum];
671 (*maps)++;
672
673 return 0;
674}
675
676static int bcm2835_pctl_dt_node_to_map_pull(struct bcm2835_pinctrl *pc,
677 struct device_node *np, u32 pin, u32 pull,
678 struct pinctrl_map **maps)
679{
680 struct pinctrl_map *map = *maps;
681 unsigned long *configs;
682
683 if (pull > 2) {
684 dev_err(pc->dev, "%s: invalid brcm,pull %d\n",
685 of_node_full_name(np), pull);
686 return -EINVAL;
687 }
688
689 configs = kzalloc(sizeof(*configs), GFP_KERNEL);
690 if (!configs)
691 return -ENOMEM;
692 configs[0] = BCM2835_PINCONF_PACK(BCM2835_PINCONF_PARAM_PULL, pull);
693
694 map->type = PIN_MAP_TYPE_CONFIGS_PIN;
695 map->data.configs.group_or_pin = bcm2835_gpio_pins[pin].name;
696 map->data.configs.configs = configs;
697 map->data.configs.num_configs = 1;
698 (*maps)++;
699
700 return 0;
701}
702
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600703static int bcm2835_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
704 struct device_node *np,
705 struct pinctrl_map **map, unsigned *num_maps)
706{
707 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
708 struct property *pins, *funcs, *pulls;
709 int num_pins, num_funcs, num_pulls, maps_per_pin;
710 struct pinctrl_map *maps, *cur_map;
711 int i, err;
712 u32 pin, func, pull;
713
714 pins = of_find_property(np, "brcm,pins", NULL);
715 if (!pins) {
716 dev_err(pc->dev, "%s: missing brcm,pins property\n",
717 of_node_full_name(np));
718 return -EINVAL;
719 }
720
721 funcs = of_find_property(np, "brcm,function", NULL);
722 pulls = of_find_property(np, "brcm,pull", NULL);
723
724 if (!funcs && !pulls) {
725 dev_err(pc->dev,
726 "%s: neither brcm,function nor brcm,pull specified\n",
727 of_node_full_name(np));
728 return -EINVAL;
729 }
730
731 num_pins = pins->length / 4;
732 num_funcs = funcs ? (funcs->length / 4) : 0;
733 num_pulls = pulls ? (pulls->length / 4) : 0;
734
735 if (num_funcs > 1 && num_funcs != num_pins) {
736 dev_err(pc->dev,
737 "%s: brcm,function must have 1 or %d entries\n",
738 of_node_full_name(np), num_pins);
739 return -EINVAL;
740 }
741
742 if (num_pulls > 1 && num_pulls != num_pins) {
743 dev_err(pc->dev,
744 "%s: brcm,pull must have 1 or %d entries\n",
745 of_node_full_name(np), num_pins);
746 return -EINVAL;
747 }
748
749 maps_per_pin = 0;
750 if (num_funcs)
751 maps_per_pin++;
752 if (num_pulls)
753 maps_per_pin++;
754 cur_map = maps = kzalloc(num_pins * maps_per_pin * sizeof(*maps),
755 GFP_KERNEL);
756 if (!maps)
757 return -ENOMEM;
758
759 for (i = 0; i < num_pins; i++) {
Stephen Warrence63d6d2013-03-28 05:09:57 +0000760 err = of_property_read_u32_index(np, "brcm,pins", i, &pin);
761 if (err)
762 goto out;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600763 if (pin >= ARRAY_SIZE(bcm2835_gpio_pins)) {
764 dev_err(pc->dev, "%s: invalid brcm,pins value %d\n",
765 of_node_full_name(np), pin);
766 err = -EINVAL;
767 goto out;
768 }
769
770 if (num_funcs) {
Stephen Warrence63d6d2013-03-28 05:09:57 +0000771 err = of_property_read_u32_index(np, "brcm,function",
772 (num_funcs > 1) ? i : 0, &func);
773 if (err)
774 goto out;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600775 err = bcm2835_pctl_dt_node_to_map_func(pc, np, pin,
776 func, &cur_map);
777 if (err)
778 goto out;
779 }
780 if (num_pulls) {
Stephen Warrence63d6d2013-03-28 05:09:57 +0000781 err = of_property_read_u32_index(np, "brcm,pull",
782 (num_funcs > 1) ? i : 0, &pull);
783 if (err)
784 goto out;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600785 err = bcm2835_pctl_dt_node_to_map_pull(pc, np, pin,
786 pull, &cur_map);
787 if (err)
788 goto out;
789 }
790 }
791
792 *map = maps;
793 *num_maps = num_pins * maps_per_pin;
794
795 return 0;
796
797out:
798 kfree(maps);
799 return err;
800}
801
Laurent Pinchart022ab142013-02-16 10:25:07 +0100802static const struct pinctrl_ops bcm2835_pctl_ops = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600803 .get_groups_count = bcm2835_pctl_get_groups_count,
804 .get_group_name = bcm2835_pctl_get_group_name,
805 .get_group_pins = bcm2835_pctl_get_group_pins,
806 .pin_dbg_show = bcm2835_pctl_pin_dbg_show,
807 .dt_node_to_map = bcm2835_pctl_dt_node_to_map,
808 .dt_free_map = bcm2835_pctl_dt_free_map,
809};
810
811static int bcm2835_pmx_get_functions_count(struct pinctrl_dev *pctldev)
812{
813 return BCM2835_FSEL_COUNT;
814}
815
816static const char *bcm2835_pmx_get_function_name(struct pinctrl_dev *pctldev,
817 unsigned selector)
818{
819 return bcm2835_functions[selector];
820}
821
822static int bcm2835_pmx_get_function_groups(struct pinctrl_dev *pctldev,
823 unsigned selector,
824 const char * const **groups,
825 unsigned * const num_groups)
826{
827 /* every pin can do every function */
828 *groups = bcm2835_gpio_groups;
829 *num_groups = ARRAY_SIZE(bcm2835_gpio_groups);
830
831 return 0;
832}
833
Linus Walleij03e9f0c2014-09-03 13:02:56 +0200834static int bcm2835_pmx_set(struct pinctrl_dev *pctldev,
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600835 unsigned func_selector,
836 unsigned group_selector)
837{
838 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
839
840 bcm2835_pinctrl_fsel_set(pc, group_selector, func_selector);
841
842 return 0;
843}
844
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600845static void bcm2835_pmx_gpio_disable_free(struct pinctrl_dev *pctldev,
846 struct pinctrl_gpio_range *range,
847 unsigned offset)
848{
849 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
850
851 /* disable by setting to GPIO_IN */
852 bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
853}
854
855static int bcm2835_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
856 struct pinctrl_gpio_range *range,
857 unsigned offset,
858 bool input)
859{
860 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
861 enum bcm2835_fsel fsel = input ?
862 BCM2835_FSEL_GPIO_IN : BCM2835_FSEL_GPIO_OUT;
863
864 bcm2835_pinctrl_fsel_set(pc, offset, fsel);
865
866 return 0;
867}
868
Laurent Pinchart022ab142013-02-16 10:25:07 +0100869static const struct pinmux_ops bcm2835_pmx_ops = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600870 .get_functions_count = bcm2835_pmx_get_functions_count,
871 .get_function_name = bcm2835_pmx_get_function_name,
872 .get_function_groups = bcm2835_pmx_get_function_groups,
Linus Walleij03e9f0c2014-09-03 13:02:56 +0200873 .set_mux = bcm2835_pmx_set,
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600874 .gpio_disable_free = bcm2835_pmx_gpio_disable_free,
875 .gpio_set_direction = bcm2835_pmx_gpio_set_direction,
876};
877
878static int bcm2835_pinconf_get(struct pinctrl_dev *pctldev,
879 unsigned pin, unsigned long *config)
880{
881 /* No way to read back config in HW */
882 return -ENOTSUPP;
883}
884
885static int bcm2835_pinconf_set(struct pinctrl_dev *pctldev,
Sherman Yin03b054e2013-08-27 11:32:12 -0700886 unsigned pin, unsigned long *configs,
887 unsigned num_configs)
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600888{
889 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
Sherman Yin03b054e2013-08-27 11:32:12 -0700890 enum bcm2835_pinconf_param param;
891 u16 arg;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600892 u32 off, bit;
Sherman Yin03b054e2013-08-27 11:32:12 -0700893 int i;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600894
Sherman Yin03b054e2013-08-27 11:32:12 -0700895 for (i = 0; i < num_configs; i++) {
896 param = BCM2835_PINCONF_UNPACK_PARAM(configs[i]);
897 arg = BCM2835_PINCONF_UNPACK_ARG(configs[i]);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600898
Sherman Yin03b054e2013-08-27 11:32:12 -0700899 if (param != BCM2835_PINCONF_PARAM_PULL)
900 return -EINVAL;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600901
Sherman Yin03b054e2013-08-27 11:32:12 -0700902 off = GPIO_REG_OFFSET(pin);
903 bit = GPIO_REG_SHIFT(pin);
904
905 bcm2835_gpio_wr(pc, GPPUD, arg & 3);
906 /*
907 * Docs say to wait 150 cycles, but not of what. We assume a
908 * 1 MHz clock here, which is pretty slow...
909 */
910 udelay(150);
911 bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), BIT(bit));
912 udelay(150);
913 bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), 0);
914 } /* for each config */
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600915
916 return 0;
917}
918
Laurent Pinchart022ab142013-02-16 10:25:07 +0100919static const struct pinconf_ops bcm2835_pinconf_ops = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600920 .pin_config_get = bcm2835_pinconf_get,
921 .pin_config_set = bcm2835_pinconf_set,
922};
923
924static struct pinctrl_desc bcm2835_pinctrl_desc = {
925 .name = MODULE_NAME,
926 .pins = bcm2835_gpio_pins,
927 .npins = ARRAY_SIZE(bcm2835_gpio_pins),
928 .pctlops = &bcm2835_pctl_ops,
929 .pmxops = &bcm2835_pmx_ops,
930 .confops = &bcm2835_pinconf_ops,
931 .owner = THIS_MODULE,
932};
933
Bill Pemberton84db00b2012-11-19 13:25:13 -0500934static struct pinctrl_gpio_range bcm2835_pinctrl_gpio_range = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600935 .name = MODULE_NAME,
936 .npins = BCM2835_NUM_GPIOS,
937};
938
Greg Kroah-Hartman150632b2012-12-21 13:10:23 -0800939static int bcm2835_pinctrl_probe(struct platform_device *pdev)
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600940{
941 struct device *dev = &pdev->dev;
942 struct device_node *np = dev->of_node;
943 struct bcm2835_pinctrl *pc;
944 struct resource iomem;
945 int err, i;
946 BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_pins) != BCM2835_NUM_GPIOS);
947 BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_groups) != BCM2835_NUM_GPIOS);
948
949 pc = devm_kzalloc(dev, sizeof(*pc), GFP_KERNEL);
950 if (!pc)
951 return -ENOMEM;
952
953 platform_set_drvdata(pdev, pc);
954 pc->dev = dev;
955
956 err = of_address_to_resource(np, 0, &iomem);
957 if (err) {
958 dev_err(dev, "could not get IO memory\n");
959 return err;
960 }
961
Thierry Reding9e0c1fb2013-01-21 11:09:14 +0100962 pc->base = devm_ioremap_resource(dev, &iomem);
963 if (IS_ERR(pc->base))
964 return PTR_ERR(pc->base);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600965
966 pc->gpio_chip = bcm2835_gpio_chip;
Linus Walleij58383c782015-11-04 09:56:26 +0100967 pc->gpio_chip.parent = dev;
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600968 pc->gpio_chip.of_node = np;
969
970 pc->irq_domain = irq_domain_add_linear(np, BCM2835_NUM_GPIOS,
971 &irq_domain_simple_ops, NULL);
972 if (!pc->irq_domain) {
973 dev_err(dev, "could not create IRQ domain\n");
974 return -ENOMEM;
975 }
976
977 for (i = 0; i < BCM2835_NUM_GPIOS; i++) {
978 int irq = irq_create_mapping(pc->irq_domain, i);
979 irq_set_lockdep_class(irq, &gpio_lock_class);
980 irq_set_chip_and_handler(irq, &bcm2835_gpio_irq_chip,
Charles Keepaxb8a19382015-04-07 11:43:45 +0100981 handle_level_irq);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600982 irq_set_chip_data(irq, pc);
Simon Arlotte1b2dc72012-09-27 22:10:11 -0600983 }
984
985 for (i = 0; i < BCM2835_NUM_BANKS; i++) {
986 unsigned long events;
987 unsigned offset;
988 int len;
989 char *name;
990
991 /* clear event detection flags */
992 bcm2835_gpio_wr(pc, GPREN0 + i * 4, 0);
993 bcm2835_gpio_wr(pc, GPFEN0 + i * 4, 0);
994 bcm2835_gpio_wr(pc, GPHEN0 + i * 4, 0);
995 bcm2835_gpio_wr(pc, GPLEN0 + i * 4, 0);
996 bcm2835_gpio_wr(pc, GPAREN0 + i * 4, 0);
997 bcm2835_gpio_wr(pc, GPAFEN0 + i * 4, 0);
998
999 /* clear all the events */
1000 events = bcm2835_gpio_rd(pc, GPEDS0 + i * 4);
1001 for_each_set_bit(offset, &events, 32)
1002 bcm2835_gpio_wr(pc, GPEDS0 + i * 4, BIT(offset));
1003
1004 pc->irq[i] = irq_of_parse_and_map(np, i);
1005 pc->irq_data[i].pc = pc;
1006 pc->irq_data[i].bank = i;
1007 spin_lock_init(&pc->irq_lock[i]);
1008
1009 len = strlen(dev_name(pc->dev)) + 16;
1010 name = devm_kzalloc(pc->dev, len, GFP_KERNEL);
1011 if (!name)
1012 return -ENOMEM;
1013 snprintf(name, len, "%s:bank%d", dev_name(pc->dev), i);
1014
1015 err = devm_request_irq(dev, pc->irq[i],
1016 bcm2835_gpio_irq_handler, IRQF_SHARED,
1017 name, &pc->irq_data[i]);
1018 if (err) {
1019 dev_err(dev, "unable to request IRQ %d\n", pc->irq[i]);
1020 return err;
1021 }
1022 }
1023
Linus Walleije19a5f72015-12-08 22:01:00 +01001024 err = gpiochip_add_data(&pc->gpio_chip, pc);
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001025 if (err) {
1026 dev_err(dev, "could not add GPIO chip\n");
1027 return err;
1028 }
1029
1030 pc->pctl_dev = pinctrl_register(&bcm2835_pinctrl_desc, dev, pc);
Masahiro Yamada323de9e2015-06-09 13:01:16 +09001031 if (IS_ERR(pc->pctl_dev)) {
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001032 gpiochip_remove(&pc->gpio_chip);
Masahiro Yamada323de9e2015-06-09 13:01:16 +09001033 return PTR_ERR(pc->pctl_dev);
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001034 }
1035
1036 pc->gpio_range = bcm2835_pinctrl_gpio_range;
1037 pc->gpio_range.base = pc->gpio_chip.base;
1038 pc->gpio_range.gc = &pc->gpio_chip;
1039 pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
1040
1041 return 0;
1042}
1043
Bill Pembertonf90f54b2012-11-19 13:26:06 -05001044static int bcm2835_pinctrl_remove(struct platform_device *pdev)
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001045{
1046 struct bcm2835_pinctrl *pc = platform_get_drvdata(pdev);
1047
1048 pinctrl_unregister(pc->pctl_dev);
1049 gpiochip_remove(&pc->gpio_chip);
1050
1051 return 0;
1052}
1053
Fabian Frederickbaa9946e2015-03-16 20:59:09 +01001054static const struct of_device_id bcm2835_pinctrl_match[] = {
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001055 { .compatible = "brcm,bcm2835-gpio" },
1056 {}
1057};
1058MODULE_DEVICE_TABLE(of, bcm2835_pinctrl_match);
1059
1060static struct platform_driver bcm2835_pinctrl_driver = {
1061 .probe = bcm2835_pinctrl_probe,
1062 .remove = bcm2835_pinctrl_remove,
1063 .driver = {
1064 .name = MODULE_NAME,
Simon Arlotte1b2dc72012-09-27 22:10:11 -06001065 .of_match_table = bcm2835_pinctrl_match,
1066 },
1067};
1068module_platform_driver(bcm2835_pinctrl_driver);
1069
1070MODULE_AUTHOR("Chris Boot, Simon Arlott, Stephen Warren");
1071MODULE_DESCRIPTION("BCM2835 Pin control driver");
1072MODULE_LICENSE("GPL");