blob: a5976ebc4482633514e7b8b6259b528b2bb2c0ed [file] [log] [blame]
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001/*
2 * Pinctrl Driver for ADI GPIO2 controller
3 *
4 * Copyright 2007-2013 Analog Devices Inc.
5 *
6 * Licensed under the GPLv2 or later
7 */
8
9#include <linux/bitops.h>
10#include <linux/delay.h>
11#include <linux/module.h>
12#include <linux/err.h>
13#include <linux/debugfs.h>
14#include <linux/seq_file.h>
15#include <linux/irq.h>
16#include <linux/platform_data/pinctrl-adi2.h>
17#include <linux/irqdomain.h>
18#include <linux/irqchip/chained_irq.h>
19#include <linux/pinctrl/pinctrl.h>
20#include <linux/pinctrl/pinmux.h>
21#include <linux/pinctrl/consumer.h>
22#include <linux/pinctrl/machine.h>
23#include <linux/syscore_ops.h>
24#include <linux/gpio.h>
25#include <asm/portmux.h>
26#include "pinctrl-adi2.h"
27#include "core.h"
28
29/*
30According to the BF54x HRM, pint means "pin interrupt".
31http://www.analog.com/static/imported-files/processor_manuals/ADSP-BF54x_hwr_rev1.2.pdf
32
33ADSP-BF54x processor Blackfin processors have four SIC interrupt chan-
34nels dedicated to pin interrupt purposes. These channels are managed by
35four hardware blocks, called PINT0, PINT1, PINT2, and PINT3. Every PINTx
36block can sense to up to 32 pins. While PINT0 and PINT1 can sense the
37pins of port A and port B, PINT2 and PINT3 manage all the pins from port
38C to port J as shown in Figure 9-2.
39
40n BF54x HRM:
41The ten GPIO ports are subdivided into 8-bit half ports, resulting in lower and
42upper half 8-bit units. The PINTx_ASSIGN registers control the 8-bit multi-
43plexers shown in Figure 9-3. Lower half units of eight pins can be
44forwarded to either byte 0 or byte 2 of either associated PINTx block.
45Upper half units can be forwarded to either byte 1 or byte 3 of the pin
46interrupt blocks, without further restrictions.
47
48All MMR registers in the pin interrupt module are 32 bits wide. To simply the
49mapping logic, this driver only maps a 16-bit gpio port to the upper or lower
5016 bits of a PINTx block. You can find the Figure 9-3 on page 583.
51
52Each IRQ domain is binding to a GPIO bank device. 2 GPIO bank devices can map
53to one PINT device. Two in "struct gpio_pint" are used to ease the PINT
54interrupt handler.
55
56The GPIO bank mapping to the lower 16 bits of the PINT device set its IRQ
57domain pointer in domain[0]. The IRQ domain pointer of the other bank is set
58to domain[1]. PINT interrupt handler adi_gpio_handle_pint_irq() finds out
59the current domain pointer according to whether the interrupt request mask
60is in lower 16 bits (domain[0]) or upper 16bits (domain[1]).
61
62A PINT device is not part of a GPIO port device in Blackfin. Multiple GPIO
63port devices can be mapped to the same PINT device.
64
65*/
66
67static LIST_HEAD(adi_pint_list);
68static LIST_HEAD(adi_gpio_port_list);
69
70#define DRIVER_NAME "pinctrl-adi2"
71
72#define PINT_HI_OFFSET 16
73
74/**
75 * struct gpio_port_saved - GPIO port registers that should be saved between
76 * power suspend and resume operations.
77 *
78 * @fer: PORTx_FER register
79 * @data: PORTx_DATA register
80 * @dir: PORTx_DIR register
81 * @inen: PORTx_INEN register
82 * @mux: PORTx_MUX register
83 */
84struct gpio_port_saved {
85 u16 fer;
86 u16 data;
87 u16 dir;
88 u16 inen;
89 u32 mux;
90};
91
Sonic Zhang1e6f8e32014-01-27 18:23:54 +080092/*
93 * struct gpio_pint_saved - PINT registers saved in PM operations
94 *
95 * @assign: ASSIGN register
96 * @edge_set: EDGE_SET register
97 * @invert_set: INVERT_SET register
98 */
99struct gpio_pint_saved {
100 u32 assign;
101 u32 edge_set;
102 u32 invert_set;
103};
104
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800105/**
106 * struct gpio_pint - Pin interrupt controller device. Multiple ADI GPIO
107 * banks can be mapped into one Pin interrupt controller.
108 *
109 * @node: All gpio_pint instances are added to a global list.
110 * @base: PINT device register base address
111 * @irq: IRQ of the PINT device, it is the parent IRQ of all
112 * GPIO IRQs mapping to this device.
113 * @domain: [0] irq domain of the gpio port, whose hardware interrupts are
114 * mapping to the low 16-bit of the pint registers.
115 * [1] irq domain of the gpio port, whose hardware interrupts are
116 * mapping to the high 16-bit of the pint registers.
117 * @regs: address pointer to the PINT device
118 * @map_count: No more than 2 GPIO banks can be mapped to this PINT device.
119 * @lock: This lock make sure the irq_chip operations to one PINT device
120 * for different GPIO interrrupts are atomic.
121 * @pint_map_port: Set up the mapping between one PINT device and
122 * multiple GPIO banks.
123 */
124struct gpio_pint {
125 struct list_head node;
126 void __iomem *base;
127 int irq;
128 struct irq_domain *domain[2];
129 struct gpio_pint_regs *regs;
Sonic Zhang1e6f8e32014-01-27 18:23:54 +0800130 struct gpio_pint_saved saved_data;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800131 int map_count;
132 spinlock_t lock;
133
134 int (*pint_map_port)(struct gpio_pint *pint, bool assign,
135 u8 map, struct irq_domain *domain);
136};
137
138/**
139 * ADI pin controller
140 *
141 * @dev: a pointer back to containing device
142 * @pctl: the pinctrl device
143 * @soc: SoC data for this specific chip
144 */
145struct adi_pinctrl {
146 struct device *dev;
147 struct pinctrl_dev *pctl;
148 const struct adi_pinctrl_soc_data *soc;
149};
150
151/**
152 * struct gpio_port - GPIO bank device. Multiple ADI GPIO banks can be mapped
153 * into one pin interrupt controller.
154 *
155 * @node: All gpio_port instances are added to a list.
156 * @base: GPIO bank device register base address
157 * @irq_base: base IRQ of the GPIO bank device
158 * @width: PIN number of the GPIO bank device
159 * @regs: address pointer to the GPIO bank device
160 * @saved_data: registers that should be saved between PM operations.
161 * @dev: device structure of this GPIO bank
162 * @pint: GPIO PINT device that this GPIO bank mapped to
163 * @pint_map: GIOP bank mapping code in PINT device
164 * @pint_assign: The 32-bit PINT registers can be divided into 2 parts. A
165 * GPIO bank can be mapped into either low 16 bits[0] or high 16
166 * bits[1] of each PINT register.
167 * @lock: This lock make sure the irq_chip operations to one PINT device
168 * for different GPIO interrrupts are atomic.
169 * @chip: abstract a GPIO controller
170 * @domain: The irq domain owned by the GPIO port.
171 * @rsvmap: Reservation map array for each pin in the GPIO bank
172 */
173struct gpio_port {
174 struct list_head node;
175 void __iomem *base;
Sonic Zhangb4eef7b2014-01-27 18:23:55 +0800176 int irq_base;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800177 unsigned int width;
178 struct gpio_port_t *regs;
179 struct gpio_port_saved saved_data;
180 struct device *dev;
181
182 struct gpio_pint *pint;
183 u8 pint_map;
184 bool pint_assign;
185
186 spinlock_t lock;
187 struct gpio_chip chip;
188 struct irq_domain *domain;
189};
190
191static inline u8 pin_to_offset(struct pinctrl_gpio_range *range, unsigned pin)
192{
193 return pin - range->pin_base;
194}
195
196static inline u32 hwirq_to_pintbit(struct gpio_port *port, int hwirq)
197{
198 return port->pint_assign ? BIT(hwirq) << PINT_HI_OFFSET : BIT(hwirq);
199}
200
201static struct gpio_pint *find_gpio_pint(unsigned id)
202{
203 struct gpio_pint *pint;
204 int i = 0;
205
206 list_for_each_entry(pint, &adi_pint_list, node) {
207 if (id == i)
208 return pint;
209 i++;
210 }
211
212 return NULL;
213}
214
215static inline void port_setup(struct gpio_port *port, unsigned offset,
216 bool use_for_gpio)
217{
218 struct gpio_port_t *regs = port->regs;
219
220 if (use_for_gpio)
221 writew(readw(&regs->port_fer) & ~BIT(offset),
222 &regs->port_fer);
223 else
224 writew(readw(&regs->port_fer) | BIT(offset), &regs->port_fer);
225}
226
227static inline void portmux_setup(struct gpio_port *port, unsigned offset,
228 unsigned short function)
229{
230 struct gpio_port_t *regs = port->regs;
231 u32 pmux;
232
233 pmux = readl(&regs->port_mux);
234
235 /* The function field of each pin has 2 consecutive bits in
236 * the mux register.
237 */
238 pmux &= ~(0x3 << (2 * offset));
239 pmux |= (function & 0x3) << (2 * offset);
240
241 writel(pmux, &regs->port_mux);
242}
243
244static inline u16 get_portmux(struct gpio_port *port, unsigned offset)
245{
246 struct gpio_port_t *regs = port->regs;
247 u32 pmux = readl(&regs->port_mux);
248
249 /* The function field of each pin has 2 consecutive bits in
250 * the mux register.
251 */
252 return pmux >> (2 * offset) & 0x3;
253}
254
255static void adi_gpio_ack_irq(struct irq_data *d)
256{
257 unsigned long flags;
258 struct gpio_port *port = irq_data_get_irq_chip_data(d);
259 struct gpio_pint_regs *regs = port->pint->regs;
260 unsigned pintbit = hwirq_to_pintbit(port, d->hwirq);
261
262 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800263 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800264
265 if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) {
266 if (readl(&regs->invert_set) & pintbit)
267 writel(pintbit, &regs->invert_clear);
268 else
269 writel(pintbit, &regs->invert_set);
270 }
271
272 writel(pintbit, &regs->request);
273
Sonic Zhang010c51e2013-10-08 15:30:21 +0800274 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800275 spin_unlock_irqrestore(&port->lock, flags);
276}
277
278static void adi_gpio_mask_ack_irq(struct irq_data *d)
279{
280 unsigned long flags;
281 struct gpio_port *port = irq_data_get_irq_chip_data(d);
282 struct gpio_pint_regs *regs = port->pint->regs;
283 unsigned pintbit = hwirq_to_pintbit(port, d->hwirq);
284
285 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800286 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800287
288 if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) {
289 if (readl(&regs->invert_set) & pintbit)
290 writel(pintbit, &regs->invert_clear);
291 else
292 writel(pintbit, &regs->invert_set);
293 }
294
295 writel(pintbit, &regs->request);
296 writel(pintbit, &regs->mask_clear);
297
Sonic Zhang010c51e2013-10-08 15:30:21 +0800298 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800299 spin_unlock_irqrestore(&port->lock, flags);
300}
301
302static void adi_gpio_mask_irq(struct irq_data *d)
303{
304 unsigned long flags;
305 struct gpio_port *port = irq_data_get_irq_chip_data(d);
306 struct gpio_pint_regs *regs = port->pint->regs;
307
308 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800309 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800310
311 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear);
312
Sonic Zhang010c51e2013-10-08 15:30:21 +0800313 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800314 spin_unlock_irqrestore(&port->lock, flags);
315}
316
317static void adi_gpio_unmask_irq(struct irq_data *d)
318{
319 unsigned long flags;
320 struct gpio_port *port = irq_data_get_irq_chip_data(d);
321 struct gpio_pint_regs *regs = port->pint->regs;
322
323 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800324 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800325
326 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set);
327
Sonic Zhang010c51e2013-10-08 15:30:21 +0800328 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800329 spin_unlock_irqrestore(&port->lock, flags);
330}
331
332static unsigned int adi_gpio_irq_startup(struct irq_data *d)
333{
334 unsigned long flags;
335 struct gpio_port *port = irq_data_get_irq_chip_data(d);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800336 struct gpio_pint_regs *regs;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800337
338 if (!port) {
Sonic Zhang010c51e2013-10-08 15:30:21 +0800339 pr_err("GPIO IRQ %d :Not exist\n", d->irq);
Linus Walleij57ef0422014-03-14 18:16:20 +0100340 /* FIXME: negative return code will be ignored */
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800341 return -ENODEV;
342 }
343
Sonic Zhang010c51e2013-10-08 15:30:21 +0800344 regs = port->pint->regs;
345
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800346 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800347 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800348
349 port_setup(port, d->hwirq, true);
350 writew(BIT(d->hwirq), &port->regs->dir_clear);
351 writew(readw(&port->regs->inen) | BIT(d->hwirq), &port->regs->inen);
352
353 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set);
354
Sonic Zhang010c51e2013-10-08 15:30:21 +0800355 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800356 spin_unlock_irqrestore(&port->lock, flags);
357
358 return 0;
359}
360
361static void adi_gpio_irq_shutdown(struct irq_data *d)
362{
363 unsigned long flags;
364 struct gpio_port *port = irq_data_get_irq_chip_data(d);
365 struct gpio_pint_regs *regs = port->pint->regs;
366
367 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800368 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800369
370 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear);
371
Sonic Zhang010c51e2013-10-08 15:30:21 +0800372 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800373 spin_unlock_irqrestore(&port->lock, flags);
374}
375
376static int adi_gpio_irq_type(struct irq_data *d, unsigned int type)
377{
378 unsigned long flags;
379 struct gpio_port *port = irq_data_get_irq_chip_data(d);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800380 struct gpio_pint_regs *pint_regs;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800381 unsigned pintmask;
382 unsigned int irq = d->irq;
383 int ret = 0;
384 char buf[16];
385
386 if (!port) {
Sonic Zhang010c51e2013-10-08 15:30:21 +0800387 pr_err("GPIO IRQ %d :Not exist\n", d->irq);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800388 return -ENODEV;
389 }
390
Sonic Zhang010c51e2013-10-08 15:30:21 +0800391 pint_regs = port->pint->regs;
392
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800393 pintmask = hwirq_to_pintbit(port, d->hwirq);
394
395 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800396 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800397
398 /* In case of interrupt autodetect, set irq type to edge sensitive. */
399 if (type == IRQ_TYPE_PROBE)
400 type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
401
402 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING |
403 IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
Rickard Strandqvist719e2312014-06-26 18:57:14 +0200404 snprintf(buf, 16, "gpio-irq%u", irq);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800405 port_setup(port, d->hwirq, true);
406 } else
407 goto out;
408
409 /* The GPIO interrupt is triggered only when its input value
410 * transfer from 0 to 1. So, invert the input value if the
411 * irq type is low or falling
412 */
413 if ((type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW)))
414 writel(pintmask, &pint_regs->invert_set);
415 else
416 writel(pintmask, &pint_regs->invert_clear);
417
418 /* In edge sensitive case, if the input value of the requested irq
419 * is already 1, invert it.
420 */
421 if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
422 if (gpio_get_value(port->chip.base + d->hwirq))
423 writel(pintmask, &pint_regs->invert_set);
424 else
425 writel(pintmask, &pint_regs->invert_clear);
426 }
427
428 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
429 writel(pintmask, &pint_regs->edge_set);
Thomas Gleixnere0d6a2c2015-06-23 15:52:47 +0200430 irq_set_handler_locked(d, handle_edge_irq);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800431 } else {
432 writel(pintmask, &pint_regs->edge_clear);
Thomas Gleixnere0d6a2c2015-06-23 15:52:47 +0200433 irq_set_handler_locked(d, handle_level_irq);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800434 }
435
436out:
Sonic Zhang010c51e2013-10-08 15:30:21 +0800437 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800438 spin_unlock_irqrestore(&port->lock, flags);
439
440 return ret;
441}
442
443#ifdef CONFIG_PM
444static int adi_gpio_set_wake(struct irq_data *d, unsigned int state)
445{
446 struct gpio_port *port = irq_data_get_irq_chip_data(d);
447
448 if (!port || !port->pint || port->pint->irq != d->irq)
449 return -EINVAL;
450
451#ifndef SEC_GCTL
452 adi_internal_set_wake(port->pint->irq, state);
453#endif
454
455 return 0;
456}
457
458static int adi_pint_suspend(void)
459{
460 struct gpio_pint *pint;
461
462 list_for_each_entry(pint, &adi_pint_list, node) {
463 writel(0xffffffff, &pint->regs->mask_clear);
464 pint->saved_data.assign = readl(&pint->regs->assign);
465 pint->saved_data.edge_set = readl(&pint->regs->edge_set);
466 pint->saved_data.invert_set = readl(&pint->regs->invert_set);
467 }
468
469 return 0;
470}
471
472static void adi_pint_resume(void)
473{
474 struct gpio_pint *pint;
475
476 list_for_each_entry(pint, &adi_pint_list, node) {
477 writel(pint->saved_data.assign, &pint->regs->assign);
478 writel(pint->saved_data.edge_set, &pint->regs->edge_set);
479 writel(pint->saved_data.invert_set, &pint->regs->invert_set);
480 }
481}
482
483static int adi_gpio_suspend(void)
484{
485 struct gpio_port *port;
486
487 list_for_each_entry(port, &adi_gpio_port_list, node) {
488 port->saved_data.fer = readw(&port->regs->port_fer);
489 port->saved_data.mux = readl(&port->regs->port_mux);
490 port->saved_data.data = readw(&port->regs->data);
491 port->saved_data.inen = readw(&port->regs->inen);
492 port->saved_data.dir = readw(&port->regs->dir_set);
493 }
494
495 return adi_pint_suspend();
496}
497
498static void adi_gpio_resume(void)
499{
500 struct gpio_port *port;
501
502 adi_pint_resume();
503
504 list_for_each_entry(port, &adi_gpio_port_list, node) {
505 writel(port->saved_data.mux, &port->regs->port_mux);
506 writew(port->saved_data.fer, &port->regs->port_fer);
507 writew(port->saved_data.inen, &port->regs->inen);
508 writew(port->saved_data.data & port->saved_data.dir,
509 &port->regs->data_set);
510 writew(port->saved_data.dir, &port->regs->dir_set);
511 }
512
513}
514
515static struct syscore_ops gpio_pm_syscore_ops = {
516 .suspend = adi_gpio_suspend,
517 .resume = adi_gpio_resume,
518};
519#else /* CONFIG_PM */
520#define adi_gpio_set_wake NULL
521#endif /* CONFIG_PM */
522
523#ifdef CONFIG_IRQ_PREFLOW_FASTEOI
524static inline void preflow_handler(struct irq_desc *desc)
525{
526 if (desc->preflow_handler)
527 desc->preflow_handler(&desc->irq_data);
528}
529#else
530static inline void preflow_handler(struct irq_desc *desc) { }
531#endif
532
533static void adi_gpio_handle_pint_irq(unsigned int inta_irq,
534 struct irq_desc *desc)
535{
536 u32 request;
537 u32 level_mask, hwirq;
538 bool umask = false;
539 struct gpio_pint *pint = irq_desc_get_handler_data(desc);
540 struct irq_chip *chip = irq_desc_get_chip(desc);
541 struct gpio_pint_regs *regs = pint->regs;
542 struct irq_domain *domain;
543
544 preflow_handler(desc);
545 chained_irq_enter(chip, desc);
546
547 request = readl(&regs->request);
548 level_mask = readl(&regs->edge_set) & request;
549
550 hwirq = 0;
551 domain = pint->domain[0];
552 while (request) {
553 /* domain pointer need to be changed only once at IRQ 16 when
554 * we go through IRQ requests from bit 0 to bit 31.
555 */
556 if (hwirq == PINT_HI_OFFSET)
557 domain = pint->domain[1];
558
559 if (request & 1) {
560 if (level_mask & BIT(hwirq)) {
561 umask = true;
562 chained_irq_exit(chip, desc);
563 }
564 generic_handle_irq(irq_find_mapping(domain,
565 hwirq % PINT_HI_OFFSET));
566 }
567
568 hwirq++;
569 request >>= 1;
570 }
571
572 if (!umask)
573 chained_irq_exit(chip, desc);
574}
575
576static struct irq_chip adi_gpio_irqchip = {
577 .name = "GPIO",
578 .irq_ack = adi_gpio_ack_irq,
579 .irq_mask = adi_gpio_mask_irq,
580 .irq_mask_ack = adi_gpio_mask_ack_irq,
581 .irq_unmask = adi_gpio_unmask_irq,
582 .irq_disable = adi_gpio_mask_irq,
583 .irq_enable = adi_gpio_unmask_irq,
584 .irq_set_type = adi_gpio_irq_type,
585 .irq_startup = adi_gpio_irq_startup,
586 .irq_shutdown = adi_gpio_irq_shutdown,
587 .irq_set_wake = adi_gpio_set_wake,
588};
589
590static int adi_get_groups_count(struct pinctrl_dev *pctldev)
591{
592 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
593
594 return pinctrl->soc->ngroups;
595}
596
597static const char *adi_get_group_name(struct pinctrl_dev *pctldev,
598 unsigned selector)
599{
600 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
601
602 return pinctrl->soc->groups[selector].name;
603}
604
605static int adi_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
606 const unsigned **pins,
607 unsigned *num_pins)
608{
609 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
610
611 *pins = pinctrl->soc->groups[selector].pins;
612 *num_pins = pinctrl->soc->groups[selector].num;
613 return 0;
614}
615
616static struct pinctrl_ops adi_pctrl_ops = {
617 .get_groups_count = adi_get_groups_count,
618 .get_group_name = adi_get_group_name,
619 .get_group_pins = adi_get_group_pins,
620};
621
Linus Walleij03e9f0c2014-09-03 13:02:56 +0200622static int adi_pinmux_set(struct pinctrl_dev *pctldev, unsigned func_id,
623 unsigned group_id)
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800624{
625 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
626 struct gpio_port *port;
627 struct pinctrl_gpio_range *range;
628 unsigned long flags;
629 unsigned short *mux, pin;
630
Sonic Zhange3653742014-02-14 18:21:06 +0800631 mux = (unsigned short *)pinctrl->soc->groups[group_id].mux;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800632
633 while (*mux) {
634 pin = P_IDENT(*mux);
635
636 range = pinctrl_find_gpio_range_from_pin(pctldev, pin);
637 if (range == NULL) /* should not happen */
638 return -ENODEV;
639
640 port = container_of(range->gc, struct gpio_port, chip);
641
642 spin_lock_irqsave(&port->lock, flags);
643
644 portmux_setup(port, pin_to_offset(range, pin),
Sonic Zhangb81e57e2014-01-27 18:23:56 +0800645 P_FUNCT2MUX(*mux));
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800646 port_setup(port, pin_to_offset(range, pin), false);
647 mux++;
648
649 spin_unlock_irqrestore(&port->lock, flags);
650 }
651
652 return 0;
653}
654
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800655static int adi_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
656{
657 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
658
659 return pinctrl->soc->nfunctions;
660}
661
662static const char *adi_pinmux_get_func_name(struct pinctrl_dev *pctldev,
663 unsigned selector)
664{
665 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
666
667 return pinctrl->soc->functions[selector].name;
668}
669
670static int adi_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
671 const char * const **groups,
672 unsigned * const num_groups)
673{
674 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
675
676 *groups = pinctrl->soc->functions[selector].groups;
677 *num_groups = pinctrl->soc->functions[selector].num_groups;
678 return 0;
679}
680
681static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev,
682 struct pinctrl_gpio_range *range, unsigned pin)
683{
684 struct gpio_port *port;
685 unsigned long flags;
686 u8 offset;
687
688 port = container_of(range->gc, struct gpio_port, chip);
689 offset = pin_to_offset(range, pin);
690
691 spin_lock_irqsave(&port->lock, flags);
692
693 port_setup(port, offset, true);
694
695 spin_unlock_irqrestore(&port->lock, flags);
696
697 return 0;
698}
699
700static struct pinmux_ops adi_pinmux_ops = {
Linus Walleij03e9f0c2014-09-03 13:02:56 +0200701 .set_mux = adi_pinmux_set,
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800702 .get_functions_count = adi_pinmux_get_funcs_count,
703 .get_function_name = adi_pinmux_get_func_name,
704 .get_function_groups = adi_pinmux_get_groups,
705 .gpio_request_enable = adi_pinmux_request_gpio,
Linus Walleij8c4c2012015-05-06 14:19:13 +0200706 .strict = true,
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800707};
708
709
710static struct pinctrl_desc adi_pinmux_desc = {
711 .name = DRIVER_NAME,
712 .pctlops = &adi_pctrl_ops,
713 .pmxops = &adi_pinmux_ops,
714 .owner = THIS_MODULE,
715};
716
717static int adi_gpio_request(struct gpio_chip *chip, unsigned offset)
718{
719 return pinctrl_request_gpio(chip->base + offset);
720}
721
722static void adi_gpio_free(struct gpio_chip *chip, unsigned offset)
723{
724 pinctrl_free_gpio(chip->base + offset);
725}
726
727static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
728{
729 struct gpio_port *port;
730 unsigned long flags;
731
732 port = container_of(chip, struct gpio_port, chip);
733
734 spin_lock_irqsave(&port->lock, flags);
735
736 writew(BIT(offset), &port->regs->dir_clear);
737 writew(readw(&port->regs->inen) | BIT(offset), &port->regs->inen);
738
739 spin_unlock_irqrestore(&port->lock, flags);
740
741 return 0;
742}
743
744static void adi_gpio_set_value(struct gpio_chip *chip, unsigned offset,
745 int value)
746{
747 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
748 struct gpio_port_t *regs = port->regs;
749 unsigned long flags;
750
751 spin_lock_irqsave(&port->lock, flags);
752
753 if (value)
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800754 writew(BIT(offset), &regs->data_set);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800755 else
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800756 writew(BIT(offset), &regs->data_clear);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800757
758 spin_unlock_irqrestore(&port->lock, flags);
759}
760
761static int adi_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
762 int value)
763{
764 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
765 struct gpio_port_t *regs = port->regs;
766 unsigned long flags;
767
768 spin_lock_irqsave(&port->lock, flags);
769
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800770 writew(readw(&regs->inen) & ~BIT(offset), &regs->inen);
771 if (value)
772 writew(BIT(offset), &regs->data_set);
773 else
774 writew(BIT(offset), &regs->data_clear);
775 writew(BIT(offset), &regs->dir_set);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800776
777 spin_unlock_irqrestore(&port->lock, flags);
778
779 return 0;
780}
781
782static int adi_gpio_get_value(struct gpio_chip *chip, unsigned offset)
783{
784 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
785 struct gpio_port_t *regs = port->regs;
786 unsigned long flags;
787 int ret;
788
789 spin_lock_irqsave(&port->lock, flags);
790
791 ret = !!(readw(&regs->data) & BIT(offset));
792
793 spin_unlock_irqrestore(&port->lock, flags);
794
795 return ret;
796}
797
798static int adi_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
799{
800 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
801
802 if (port->irq_base >= 0)
803 return irq_find_mapping(port->domain, offset);
804 else
805 return irq_create_mapping(port->domain, offset);
806}
807
808static int adi_pint_map_port(struct gpio_pint *pint, bool assign, u8 map,
809 struct irq_domain *domain)
810{
811 struct gpio_pint_regs *regs = pint->regs;
812 u32 map_mask;
813
814 if (pint->map_count > 1)
815 return -EINVAL;
816
817 pint->map_count++;
818
819 /* The map_mask of each gpio port is a 16-bit duplicate
820 * of the 8-bit map. It can be set to either high 16 bits or low
821 * 16 bits of the pint assignment register.
822 */
823 map_mask = (map << 8) | map;
824 if (assign) {
825 map_mask <<= PINT_HI_OFFSET;
826 writel((readl(&regs->assign) & 0xFFFF) | map_mask,
827 &regs->assign);
828 } else
829 writel((readl(&regs->assign) & 0xFFFF0000) | map_mask,
830 &regs->assign);
831
832 pint->domain[assign] = domain;
833
834 return 0;
835}
836
837static int adi_gpio_pint_probe(struct platform_device *pdev)
838{
839 struct device *dev = &pdev->dev;
840 struct resource *res;
841 struct gpio_pint *pint;
842
843 pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL);
844 if (!pint) {
845 dev_err(dev, "Memory alloc failed\n");
846 return -ENOMEM;
847 }
848
849 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Axel Linc8690d62013-09-24 15:46:11 +0800850 pint->base = devm_ioremap_resource(dev, res);
851 if (IS_ERR(pint->base))
852 return PTR_ERR(pint->base);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800853
854 pint->regs = (struct gpio_pint_regs *)pint->base;
855
856 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
857 if (!res) {
858 dev_err(dev, "Invalid IRQ resource\n");
859 return -ENODEV;
860 }
861
862 spin_lock_init(&pint->lock);
863
864 pint->irq = res->start;
865 pint->pint_map_port = adi_pint_map_port;
866 platform_set_drvdata(pdev, pint);
867
Thomas Gleixnerbb6d6dd2015-06-21 20:16:15 +0200868 irq_set_chained_handler_and_data(pint->irq, adi_gpio_handle_pint_irq,
869 pint);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800870
871 list_add_tail(&pint->node, &adi_pint_list);
872
873 return 0;
874}
875
876static int adi_gpio_pint_remove(struct platform_device *pdev)
877{
878 struct gpio_pint *pint = platform_get_drvdata(pdev);
879
880 list_del(&pint->node);
881 irq_set_handler(pint->irq, handle_simple_irq);
882
883 return 0;
884}
885
886static int adi_gpio_irq_map(struct irq_domain *d, unsigned int irq,
887 irq_hw_number_t hwirq)
888{
889 struct gpio_port *port = d->host_data;
890
891 if (!port)
892 return -EINVAL;
893
894 irq_set_chip_data(irq, port);
895 irq_set_chip_and_handler(irq, &adi_gpio_irqchip,
896 handle_level_irq);
897
898 return 0;
899}
900
Axel Linf77329d2014-04-03 21:44:47 +0800901static const struct irq_domain_ops adi_gpio_irq_domain_ops = {
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800902 .map = adi_gpio_irq_map,
903 .xlate = irq_domain_xlate_onecell,
904};
905
906static int adi_gpio_init_int(struct gpio_port *port)
907{
908 struct device_node *node = port->dev->of_node;
909 struct gpio_pint *pint = port->pint;
910 int ret;
911
912 port->domain = irq_domain_add_linear(node, port->width,
913 &adi_gpio_irq_domain_ops, port);
914 if (!port->domain) {
915 dev_err(port->dev, "Failed to create irqdomain\n");
916 return -ENOSYS;
917 }
918
919 /* According to BF54x and BF60x HRM, pin interrupt devices are not
920 * part of the GPIO port device. in GPIO interrupt mode, the GPIO
921 * pins of multiple port devices can be routed into one pin interrupt
922 * device. The mapping can be configured by setting pint assignment
923 * register with the mapping value of different GPIO port. This is
924 * done via function pint_map_port().
925 */
926 ret = pint->pint_map_port(port->pint, port->pint_assign,
927 port->pint_map, port->domain);
928 if (ret)
929 return ret;
930
931 if (port->irq_base >= 0) {
932 ret = irq_create_strict_mappings(port->domain, port->irq_base,
933 0, port->width);
934 if (ret) {
935 dev_err(port->dev, "Couldn't associate to domain\n");
936 return ret;
937 }
938 }
939
940 return 0;
941}
942
943#define DEVNAME_SIZE 16
944
945static int adi_gpio_probe(struct platform_device *pdev)
946{
947 struct device *dev = &pdev->dev;
948 const struct adi_pinctrl_gpio_platform_data *pdata;
949 struct resource *res;
950 struct gpio_port *port;
951 char pinctrl_devname[DEVNAME_SIZE];
952 static int gpio;
abdoulaye bertheb4e7c552014-07-12 22:30:13 +0200953 int ret = 0;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800954
955 pdata = dev->platform_data;
956 if (!pdata)
957 return -EINVAL;
958
959 port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL);
960 if (!port) {
961 dev_err(dev, "Memory alloc failed\n");
962 return -ENOMEM;
963 }
964
965 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Axel Linc8690d62013-09-24 15:46:11 +0800966 port->base = devm_ioremap_resource(dev, res);
967 if (IS_ERR(port->base))
968 return PTR_ERR(port->base);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800969
970 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
971 if (!res)
972 port->irq_base = -1;
973 else
974 port->irq_base = res->start;
975
976 port->width = pdata->port_width;
977 port->dev = dev;
978 port->regs = (struct gpio_port_t *)port->base;
979 port->pint_assign = pdata->pint_assign;
980 port->pint_map = pdata->pint_map;
981
982 port->pint = find_gpio_pint(pdata->pint_id);
983 if (port->pint) {
984 ret = adi_gpio_init_int(port);
985 if (ret)
986 return ret;
987 }
988
989 spin_lock_init(&port->lock);
990
991 platform_set_drvdata(pdev, port);
992
993 port->chip.label = "adi-gpio";
994 port->chip.direction_input = adi_gpio_direction_input;
995 port->chip.get = adi_gpio_get_value;
996 port->chip.direction_output = adi_gpio_direction_output;
997 port->chip.set = adi_gpio_set_value;
998 port->chip.request = adi_gpio_request;
999 port->chip.free = adi_gpio_free;
1000 port->chip.to_irq = adi_gpio_to_irq;
1001 if (pdata->port_gpio_base > 0)
1002 port->chip.base = pdata->port_gpio_base;
1003 else
1004 port->chip.base = gpio;
1005 port->chip.ngpio = port->width;
1006 gpio = port->chip.base + port->width;
1007
1008 ret = gpiochip_add(&port->chip);
1009 if (ret) {
1010 dev_err(&pdev->dev, "Fail to add GPIO chip.\n");
1011 goto out_remove_domain;
1012 }
1013
1014 /* Add gpio pin range */
1015 snprintf(pinctrl_devname, DEVNAME_SIZE, "pinctrl-adi2.%d",
1016 pdata->pinctrl_id);
1017 pinctrl_devname[DEVNAME_SIZE - 1] = 0;
1018 ret = gpiochip_add_pin_range(&port->chip, pinctrl_devname,
1019 0, pdata->port_pin_base, port->width);
1020 if (ret) {
1021 dev_err(&pdev->dev, "Fail to add pin range to %s.\n",
1022 pinctrl_devname);
1023 goto out_remove_gpiochip;
1024 }
1025
1026 list_add_tail(&port->node, &adi_gpio_port_list);
1027
1028 return 0;
1029
1030out_remove_gpiochip:
abdoulaye bertheb4e7c552014-07-12 22:30:13 +02001031 gpiochip_remove(&port->chip);
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001032out_remove_domain:
1033 if (port->pint)
1034 irq_domain_remove(port->domain);
1035
1036 return ret;
1037}
1038
1039static int adi_gpio_remove(struct platform_device *pdev)
1040{
1041 struct gpio_port *port = platform_get_drvdata(pdev);
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001042 u8 offset;
1043
1044 list_del(&port->node);
abdoulaye bertheb4e7c552014-07-12 22:30:13 +02001045 gpiochip_remove(&port->chip);
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001046 if (port->pint) {
1047 for (offset = 0; offset < port->width; offset++)
1048 irq_dispose_mapping(irq_find_mapping(port->domain,
1049 offset));
1050 irq_domain_remove(port->domain);
1051 }
1052
abdoulaye bertheb4e7c552014-07-12 22:30:13 +02001053 return 0;
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001054}
1055
1056static int adi_pinctrl_probe(struct platform_device *pdev)
1057{
1058 struct adi_pinctrl *pinctrl;
1059
1060 pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL);
1061 if (!pinctrl)
1062 return -ENOMEM;
1063
1064 pinctrl->dev = &pdev->dev;
1065
1066 adi_pinctrl_soc_init(&pinctrl->soc);
1067
1068 adi_pinmux_desc.pins = pinctrl->soc->pins;
1069 adi_pinmux_desc.npins = pinctrl->soc->npins;
1070
1071 /* Now register the pin controller and all pins it handles */
1072 pinctrl->pctl = pinctrl_register(&adi_pinmux_desc, &pdev->dev, pinctrl);
Masahiro Yamada323de9e2015-06-09 13:01:16 +09001073 if (IS_ERR(pinctrl->pctl)) {
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001074 dev_err(&pdev->dev, "could not register pinctrl ADI2 driver\n");
Masahiro Yamada323de9e2015-06-09 13:01:16 +09001075 return PTR_ERR(pinctrl->pctl);
Sonic Zhange9a03ad2013-09-03 16:28:59 +08001076 }
1077
1078 platform_set_drvdata(pdev, pinctrl);
1079
1080 return 0;
1081}
1082
1083static int adi_pinctrl_remove(struct platform_device *pdev)
1084{
1085 struct adi_pinctrl *pinctrl = platform_get_drvdata(pdev);
1086
1087 pinctrl_unregister(pinctrl->pctl);
1088
1089 return 0;
1090}
1091
1092static struct platform_driver adi_pinctrl_driver = {
1093 .probe = adi_pinctrl_probe,
1094 .remove = adi_pinctrl_remove,
1095 .driver = {
1096 .name = DRIVER_NAME,
1097 },
1098};
1099
1100static struct platform_driver adi_gpio_pint_driver = {
1101 .probe = adi_gpio_pint_probe,
1102 .remove = adi_gpio_pint_remove,
1103 .driver = {
1104 .name = "adi-gpio-pint",
1105 },
1106};
1107
1108static struct platform_driver adi_gpio_driver = {
1109 .probe = adi_gpio_probe,
1110 .remove = adi_gpio_remove,
1111 .driver = {
1112 .name = "adi-gpio",
1113 },
1114};
1115
1116static int __init adi_pinctrl_setup(void)
1117{
1118 int ret;
1119
1120 ret = platform_driver_register(&adi_pinctrl_driver);
1121 if (ret)
1122 return ret;
1123
1124 ret = platform_driver_register(&adi_gpio_pint_driver);
1125 if (ret)
1126 goto pint_error;
1127
1128 ret = platform_driver_register(&adi_gpio_driver);
1129 if (ret)
1130 goto gpio_error;
1131
1132#ifdef CONFIG_PM
1133 register_syscore_ops(&gpio_pm_syscore_ops);
1134#endif
1135 return ret;
1136gpio_error:
1137 platform_driver_unregister(&adi_gpio_pint_driver);
1138pint_error:
1139 platform_driver_unregister(&adi_pinctrl_driver);
1140
1141 return ret;
1142}
1143arch_initcall(adi_pinctrl_setup);
1144
1145MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
1146MODULE_DESCRIPTION("ADI gpio2 pin control driver");
1147MODULE_LICENSE("GPL");