blob: 94138bca1f2e24269f4f534df8863ee1bdc513e8 [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
92/**
93 * struct gpio_pint - Pin interrupt controller device. Multiple ADI GPIO
94 * banks can be mapped into one Pin interrupt controller.
95 *
96 * @node: All gpio_pint instances are added to a global list.
97 * @base: PINT device register base address
98 * @irq: IRQ of the PINT device, it is the parent IRQ of all
99 * GPIO IRQs mapping to this device.
100 * @domain: [0] irq domain of the gpio port, whose hardware interrupts are
101 * mapping to the low 16-bit of the pint registers.
102 * [1] irq domain of the gpio port, whose hardware interrupts are
103 * mapping to the high 16-bit of the pint registers.
104 * @regs: address pointer to the PINT device
105 * @map_count: No more than 2 GPIO banks can be mapped to this PINT device.
106 * @lock: This lock make sure the irq_chip operations to one PINT device
107 * for different GPIO interrrupts are atomic.
108 * @pint_map_port: Set up the mapping between one PINT device and
109 * multiple GPIO banks.
110 */
111struct gpio_pint {
112 struct list_head node;
113 void __iomem *base;
114 int irq;
115 struct irq_domain *domain[2];
116 struct gpio_pint_regs *regs;
117 struct adi_pm_pint_save saved_data;
118 int map_count;
119 spinlock_t lock;
120
121 int (*pint_map_port)(struct gpio_pint *pint, bool assign,
122 u8 map, struct irq_domain *domain);
123};
124
125/**
126 * ADI pin controller
127 *
128 * @dev: a pointer back to containing device
129 * @pctl: the pinctrl device
130 * @soc: SoC data for this specific chip
131 */
132struct adi_pinctrl {
133 struct device *dev;
134 struct pinctrl_dev *pctl;
135 const struct adi_pinctrl_soc_data *soc;
136};
137
138/**
139 * struct gpio_port - GPIO bank device. Multiple ADI GPIO banks can be mapped
140 * into one pin interrupt controller.
141 *
142 * @node: All gpio_port instances are added to a list.
143 * @base: GPIO bank device register base address
144 * @irq_base: base IRQ of the GPIO bank device
145 * @width: PIN number of the GPIO bank device
146 * @regs: address pointer to the GPIO bank device
147 * @saved_data: registers that should be saved between PM operations.
148 * @dev: device structure of this GPIO bank
149 * @pint: GPIO PINT device that this GPIO bank mapped to
150 * @pint_map: GIOP bank mapping code in PINT device
151 * @pint_assign: The 32-bit PINT registers can be divided into 2 parts. A
152 * GPIO bank can be mapped into either low 16 bits[0] or high 16
153 * bits[1] of each PINT register.
154 * @lock: This lock make sure the irq_chip operations to one PINT device
155 * for different GPIO interrrupts are atomic.
156 * @chip: abstract a GPIO controller
157 * @domain: The irq domain owned by the GPIO port.
158 * @rsvmap: Reservation map array for each pin in the GPIO bank
159 */
160struct gpio_port {
161 struct list_head node;
162 void __iomem *base;
163 unsigned int irq_base;
164 unsigned int width;
165 struct gpio_port_t *regs;
166 struct gpio_port_saved saved_data;
167 struct device *dev;
168
169 struct gpio_pint *pint;
170 u8 pint_map;
171 bool pint_assign;
172
173 spinlock_t lock;
174 struct gpio_chip chip;
175 struct irq_domain *domain;
176};
177
178static inline u8 pin_to_offset(struct pinctrl_gpio_range *range, unsigned pin)
179{
180 return pin - range->pin_base;
181}
182
183static inline u32 hwirq_to_pintbit(struct gpio_port *port, int hwirq)
184{
185 return port->pint_assign ? BIT(hwirq) << PINT_HI_OFFSET : BIT(hwirq);
186}
187
188static struct gpio_pint *find_gpio_pint(unsigned id)
189{
190 struct gpio_pint *pint;
191 int i = 0;
192
193 list_for_each_entry(pint, &adi_pint_list, node) {
194 if (id == i)
195 return pint;
196 i++;
197 }
198
199 return NULL;
200}
201
202static inline void port_setup(struct gpio_port *port, unsigned offset,
203 bool use_for_gpio)
204{
205 struct gpio_port_t *regs = port->regs;
206
207 if (use_for_gpio)
208 writew(readw(&regs->port_fer) & ~BIT(offset),
209 &regs->port_fer);
210 else
211 writew(readw(&regs->port_fer) | BIT(offset), &regs->port_fer);
212}
213
214static inline void portmux_setup(struct gpio_port *port, unsigned offset,
215 unsigned short function)
216{
217 struct gpio_port_t *regs = port->regs;
218 u32 pmux;
219
220 pmux = readl(&regs->port_mux);
221
222 /* The function field of each pin has 2 consecutive bits in
223 * the mux register.
224 */
225 pmux &= ~(0x3 << (2 * offset));
226 pmux |= (function & 0x3) << (2 * offset);
227
228 writel(pmux, &regs->port_mux);
229}
230
231static inline u16 get_portmux(struct gpio_port *port, unsigned offset)
232{
233 struct gpio_port_t *regs = port->regs;
234 u32 pmux = readl(&regs->port_mux);
235
236 /* The function field of each pin has 2 consecutive bits in
237 * the mux register.
238 */
239 return pmux >> (2 * offset) & 0x3;
240}
241
242static void adi_gpio_ack_irq(struct irq_data *d)
243{
244 unsigned long flags;
245 struct gpio_port *port = irq_data_get_irq_chip_data(d);
246 struct gpio_pint_regs *regs = port->pint->regs;
247 unsigned pintbit = hwirq_to_pintbit(port, d->hwirq);
248
249 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800250 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800251
252 if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) {
253 if (readl(&regs->invert_set) & pintbit)
254 writel(pintbit, &regs->invert_clear);
255 else
256 writel(pintbit, &regs->invert_set);
257 }
258
259 writel(pintbit, &regs->request);
260
Sonic Zhang010c51e2013-10-08 15:30:21 +0800261 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800262 spin_unlock_irqrestore(&port->lock, flags);
263}
264
265static void adi_gpio_mask_ack_irq(struct irq_data *d)
266{
267 unsigned long flags;
268 struct gpio_port *port = irq_data_get_irq_chip_data(d);
269 struct gpio_pint_regs *regs = port->pint->regs;
270 unsigned pintbit = hwirq_to_pintbit(port, d->hwirq);
271
272 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800273 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800274
275 if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) {
276 if (readl(&regs->invert_set) & pintbit)
277 writel(pintbit, &regs->invert_clear);
278 else
279 writel(pintbit, &regs->invert_set);
280 }
281
282 writel(pintbit, &regs->request);
283 writel(pintbit, &regs->mask_clear);
284
Sonic Zhang010c51e2013-10-08 15:30:21 +0800285 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800286 spin_unlock_irqrestore(&port->lock, flags);
287}
288
289static void adi_gpio_mask_irq(struct irq_data *d)
290{
291 unsigned long flags;
292 struct gpio_port *port = irq_data_get_irq_chip_data(d);
293 struct gpio_pint_regs *regs = port->pint->regs;
294
295 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800296 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800297
298 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear);
299
Sonic Zhang010c51e2013-10-08 15:30:21 +0800300 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800301 spin_unlock_irqrestore(&port->lock, flags);
302}
303
304static void adi_gpio_unmask_irq(struct irq_data *d)
305{
306 unsigned long flags;
307 struct gpio_port *port = irq_data_get_irq_chip_data(d);
308 struct gpio_pint_regs *regs = port->pint->regs;
309
310 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800311 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800312
313 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set);
314
Sonic Zhang010c51e2013-10-08 15:30:21 +0800315 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800316 spin_unlock_irqrestore(&port->lock, flags);
317}
318
319static unsigned int adi_gpio_irq_startup(struct irq_data *d)
320{
321 unsigned long flags;
322 struct gpio_port *port = irq_data_get_irq_chip_data(d);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800323 struct gpio_pint_regs *regs;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800324
325 if (!port) {
Sonic Zhang010c51e2013-10-08 15:30:21 +0800326 pr_err("GPIO IRQ %d :Not exist\n", d->irq);
Linus Walleij57ef0422014-03-14 18:16:20 +0100327 /* FIXME: negative return code will be ignored */
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800328 return -ENODEV;
329 }
330
Sonic Zhang010c51e2013-10-08 15:30:21 +0800331 regs = port->pint->regs;
332
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800333 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800334 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800335
336 port_setup(port, d->hwirq, true);
337 writew(BIT(d->hwirq), &port->regs->dir_clear);
338 writew(readw(&port->regs->inen) | BIT(d->hwirq), &port->regs->inen);
339
340 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set);
341
Sonic Zhang010c51e2013-10-08 15:30:21 +0800342 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800343 spin_unlock_irqrestore(&port->lock, flags);
344
345 return 0;
346}
347
348static void adi_gpio_irq_shutdown(struct irq_data *d)
349{
350 unsigned long flags;
351 struct gpio_port *port = irq_data_get_irq_chip_data(d);
352 struct gpio_pint_regs *regs = port->pint->regs;
353
354 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800355 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800356
357 writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear);
358
Sonic Zhang010c51e2013-10-08 15:30:21 +0800359 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800360 spin_unlock_irqrestore(&port->lock, flags);
361}
362
363static int adi_gpio_irq_type(struct irq_data *d, unsigned int type)
364{
365 unsigned long flags;
366 struct gpio_port *port = irq_data_get_irq_chip_data(d);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800367 struct gpio_pint_regs *pint_regs;
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800368 unsigned pintmask;
369 unsigned int irq = d->irq;
370 int ret = 0;
371 char buf[16];
372
373 if (!port) {
Sonic Zhang010c51e2013-10-08 15:30:21 +0800374 pr_err("GPIO IRQ %d :Not exist\n", d->irq);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800375 return -ENODEV;
376 }
377
Sonic Zhang010c51e2013-10-08 15:30:21 +0800378 pint_regs = port->pint->regs;
379
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800380 pintmask = hwirq_to_pintbit(port, d->hwirq);
381
382 spin_lock_irqsave(&port->lock, flags);
Sonic Zhang010c51e2013-10-08 15:30:21 +0800383 spin_lock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800384
385 /* In case of interrupt autodetect, set irq type to edge sensitive. */
386 if (type == IRQ_TYPE_PROBE)
387 type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
388
389 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING |
390 IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
391 snprintf(buf, 16, "gpio-irq%d", irq);
392 port_setup(port, d->hwirq, true);
393 } else
394 goto out;
395
396 /* The GPIO interrupt is triggered only when its input value
397 * transfer from 0 to 1. So, invert the input value if the
398 * irq type is low or falling
399 */
400 if ((type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW)))
401 writel(pintmask, &pint_regs->invert_set);
402 else
403 writel(pintmask, &pint_regs->invert_clear);
404
405 /* In edge sensitive case, if the input value of the requested irq
406 * is already 1, invert it.
407 */
408 if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) {
409 if (gpio_get_value(port->chip.base + d->hwirq))
410 writel(pintmask, &pint_regs->invert_set);
411 else
412 writel(pintmask, &pint_regs->invert_clear);
413 }
414
415 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
416 writel(pintmask, &pint_regs->edge_set);
417 __irq_set_handler_locked(irq, handle_edge_irq);
418 } else {
419 writel(pintmask, &pint_regs->edge_clear);
420 __irq_set_handler_locked(irq, handle_level_irq);
421 }
422
423out:
Sonic Zhang010c51e2013-10-08 15:30:21 +0800424 spin_unlock(&port->pint->lock);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800425 spin_unlock_irqrestore(&port->lock, flags);
426
427 return ret;
428}
429
430#ifdef CONFIG_PM
431static int adi_gpio_set_wake(struct irq_data *d, unsigned int state)
432{
433 struct gpio_port *port = irq_data_get_irq_chip_data(d);
434
435 if (!port || !port->pint || port->pint->irq != d->irq)
436 return -EINVAL;
437
438#ifndef SEC_GCTL
439 adi_internal_set_wake(port->pint->irq, state);
440#endif
441
442 return 0;
443}
444
445static int adi_pint_suspend(void)
446{
447 struct gpio_pint *pint;
448
449 list_for_each_entry(pint, &adi_pint_list, node) {
450 writel(0xffffffff, &pint->regs->mask_clear);
451 pint->saved_data.assign = readl(&pint->regs->assign);
452 pint->saved_data.edge_set = readl(&pint->regs->edge_set);
453 pint->saved_data.invert_set = readl(&pint->regs->invert_set);
454 }
455
456 return 0;
457}
458
459static void adi_pint_resume(void)
460{
461 struct gpio_pint *pint;
462
463 list_for_each_entry(pint, &adi_pint_list, node) {
464 writel(pint->saved_data.assign, &pint->regs->assign);
465 writel(pint->saved_data.edge_set, &pint->regs->edge_set);
466 writel(pint->saved_data.invert_set, &pint->regs->invert_set);
467 }
468}
469
470static int adi_gpio_suspend(void)
471{
472 struct gpio_port *port;
473
474 list_for_each_entry(port, &adi_gpio_port_list, node) {
475 port->saved_data.fer = readw(&port->regs->port_fer);
476 port->saved_data.mux = readl(&port->regs->port_mux);
477 port->saved_data.data = readw(&port->regs->data);
478 port->saved_data.inen = readw(&port->regs->inen);
479 port->saved_data.dir = readw(&port->regs->dir_set);
480 }
481
482 return adi_pint_suspend();
483}
484
485static void adi_gpio_resume(void)
486{
487 struct gpio_port *port;
488
489 adi_pint_resume();
490
491 list_for_each_entry(port, &adi_gpio_port_list, node) {
492 writel(port->saved_data.mux, &port->regs->port_mux);
493 writew(port->saved_data.fer, &port->regs->port_fer);
494 writew(port->saved_data.inen, &port->regs->inen);
495 writew(port->saved_data.data & port->saved_data.dir,
496 &port->regs->data_set);
497 writew(port->saved_data.dir, &port->regs->dir_set);
498 }
499
500}
501
502static struct syscore_ops gpio_pm_syscore_ops = {
503 .suspend = adi_gpio_suspend,
504 .resume = adi_gpio_resume,
505};
506#else /* CONFIG_PM */
507#define adi_gpio_set_wake NULL
508#endif /* CONFIG_PM */
509
510#ifdef CONFIG_IRQ_PREFLOW_FASTEOI
511static inline void preflow_handler(struct irq_desc *desc)
512{
513 if (desc->preflow_handler)
514 desc->preflow_handler(&desc->irq_data);
515}
516#else
517static inline void preflow_handler(struct irq_desc *desc) { }
518#endif
519
520static void adi_gpio_handle_pint_irq(unsigned int inta_irq,
521 struct irq_desc *desc)
522{
523 u32 request;
524 u32 level_mask, hwirq;
525 bool umask = false;
526 struct gpio_pint *pint = irq_desc_get_handler_data(desc);
527 struct irq_chip *chip = irq_desc_get_chip(desc);
528 struct gpio_pint_regs *regs = pint->regs;
529 struct irq_domain *domain;
530
531 preflow_handler(desc);
532 chained_irq_enter(chip, desc);
533
534 request = readl(&regs->request);
535 level_mask = readl(&regs->edge_set) & request;
536
537 hwirq = 0;
538 domain = pint->domain[0];
539 while (request) {
540 /* domain pointer need to be changed only once at IRQ 16 when
541 * we go through IRQ requests from bit 0 to bit 31.
542 */
543 if (hwirq == PINT_HI_OFFSET)
544 domain = pint->domain[1];
545
546 if (request & 1) {
547 if (level_mask & BIT(hwirq)) {
548 umask = true;
549 chained_irq_exit(chip, desc);
550 }
551 generic_handle_irq(irq_find_mapping(domain,
552 hwirq % PINT_HI_OFFSET));
553 }
554
555 hwirq++;
556 request >>= 1;
557 }
558
559 if (!umask)
560 chained_irq_exit(chip, desc);
561}
562
563static struct irq_chip adi_gpio_irqchip = {
564 .name = "GPIO",
565 .irq_ack = adi_gpio_ack_irq,
566 .irq_mask = adi_gpio_mask_irq,
567 .irq_mask_ack = adi_gpio_mask_ack_irq,
568 .irq_unmask = adi_gpio_unmask_irq,
569 .irq_disable = adi_gpio_mask_irq,
570 .irq_enable = adi_gpio_unmask_irq,
571 .irq_set_type = adi_gpio_irq_type,
572 .irq_startup = adi_gpio_irq_startup,
573 .irq_shutdown = adi_gpio_irq_shutdown,
574 .irq_set_wake = adi_gpio_set_wake,
575};
576
577static int adi_get_groups_count(struct pinctrl_dev *pctldev)
578{
579 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
580
581 return pinctrl->soc->ngroups;
582}
583
584static const char *adi_get_group_name(struct pinctrl_dev *pctldev,
585 unsigned selector)
586{
587 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
588
589 return pinctrl->soc->groups[selector].name;
590}
591
592static int adi_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
593 const unsigned **pins,
594 unsigned *num_pins)
595{
596 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
597
598 *pins = pinctrl->soc->groups[selector].pins;
599 *num_pins = pinctrl->soc->groups[selector].num;
600 return 0;
601}
602
603static struct pinctrl_ops adi_pctrl_ops = {
604 .get_groups_count = adi_get_groups_count,
605 .get_group_name = adi_get_group_name,
606 .get_group_pins = adi_get_group_pins,
607};
608
609static int adi_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
610 unsigned group)
611{
612 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
613 struct gpio_port *port;
614 struct pinctrl_gpio_range *range;
615 unsigned long flags;
616 unsigned short *mux, pin;
617
618 mux = (unsigned short *)pinctrl->soc->functions[selector].mux;
619
620 while (*mux) {
621 pin = P_IDENT(*mux);
622
623 range = pinctrl_find_gpio_range_from_pin(pctldev, pin);
624 if (range == NULL) /* should not happen */
625 return -ENODEV;
626
627 port = container_of(range->gc, struct gpio_port, chip);
628
629 spin_lock_irqsave(&port->lock, flags);
630
631 portmux_setup(port, pin_to_offset(range, pin),
632 P_FUNCT2MUX(*mux));
633 port_setup(port, pin_to_offset(range, pin), false);
634 mux++;
635
636 spin_unlock_irqrestore(&port->lock, flags);
637 }
638
639 return 0;
640}
641
642static void adi_pinmux_disable(struct pinctrl_dev *pctldev, unsigned selector,
643 unsigned group)
644{
645 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
646 struct gpio_port *port;
647 struct pinctrl_gpio_range *range;
648 unsigned long flags;
649 unsigned short *mux, pin;
650
651 mux = (unsigned short *)pinctrl->soc->functions[selector].mux;
652
653 while (*mux) {
654 pin = P_IDENT(*mux);
655
656 range = pinctrl_find_gpio_range_from_pin(pctldev, pin);
657 if (range == NULL) /* should not happen */
658 return;
659
660 port = container_of(range->gc, struct gpio_port, chip);
661
662 spin_lock_irqsave(&port->lock, flags);
663
664 port_setup(port, pin_to_offset(range, pin), true);
665 mux++;
666
667 spin_unlock_irqrestore(&port->lock, flags);
668 }
669}
670
671static int adi_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
672{
673 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
674
675 return pinctrl->soc->nfunctions;
676}
677
678static const char *adi_pinmux_get_func_name(struct pinctrl_dev *pctldev,
679 unsigned selector)
680{
681 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
682
683 return pinctrl->soc->functions[selector].name;
684}
685
686static int adi_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
687 const char * const **groups,
688 unsigned * const num_groups)
689{
690 struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
691
692 *groups = pinctrl->soc->functions[selector].groups;
693 *num_groups = pinctrl->soc->functions[selector].num_groups;
694 return 0;
695}
696
697static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev,
698 struct pinctrl_gpio_range *range, unsigned pin)
699{
700 struct gpio_port *port;
701 unsigned long flags;
702 u8 offset;
703
704 port = container_of(range->gc, struct gpio_port, chip);
705 offset = pin_to_offset(range, pin);
706
707 spin_lock_irqsave(&port->lock, flags);
708
709 port_setup(port, offset, true);
710
711 spin_unlock_irqrestore(&port->lock, flags);
712
713 return 0;
714}
715
716static struct pinmux_ops adi_pinmux_ops = {
717 .enable = adi_pinmux_enable,
718 .disable = adi_pinmux_disable,
719 .get_functions_count = adi_pinmux_get_funcs_count,
720 .get_function_name = adi_pinmux_get_func_name,
721 .get_function_groups = adi_pinmux_get_groups,
722 .gpio_request_enable = adi_pinmux_request_gpio,
723};
724
725
726static struct pinctrl_desc adi_pinmux_desc = {
727 .name = DRIVER_NAME,
728 .pctlops = &adi_pctrl_ops,
729 .pmxops = &adi_pinmux_ops,
730 .owner = THIS_MODULE,
731};
732
733static int adi_gpio_request(struct gpio_chip *chip, unsigned offset)
734{
735 return pinctrl_request_gpio(chip->base + offset);
736}
737
738static void adi_gpio_free(struct gpio_chip *chip, unsigned offset)
739{
740 pinctrl_free_gpio(chip->base + offset);
741}
742
743static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
744{
745 struct gpio_port *port;
746 unsigned long flags;
747
748 port = container_of(chip, struct gpio_port, chip);
749
750 spin_lock_irqsave(&port->lock, flags);
751
752 writew(BIT(offset), &port->regs->dir_clear);
753 writew(readw(&port->regs->inen) | BIT(offset), &port->regs->inen);
754
755 spin_unlock_irqrestore(&port->lock, flags);
756
757 return 0;
758}
759
760static void adi_gpio_set_value(struct gpio_chip *chip, unsigned offset,
761 int value)
762{
763 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
764 struct gpio_port_t *regs = port->regs;
765 unsigned long flags;
766
767 spin_lock_irqsave(&port->lock, flags);
768
769 if (value)
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800770 writew(BIT(offset), &regs->data_set);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800771 else
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800772 writew(BIT(offset), &regs->data_clear);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800773
774 spin_unlock_irqrestore(&port->lock, flags);
775}
776
777static int adi_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
778 int value)
779{
780 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
781 struct gpio_port_t *regs = port->regs;
782 unsigned long flags;
783
784 spin_lock_irqsave(&port->lock, flags);
785
Sonic Zhangd3224ed2013-10-08 15:31:21 +0800786 writew(readw(&regs->inen) & ~BIT(offset), &regs->inen);
787 if (value)
788 writew(BIT(offset), &regs->data_set);
789 else
790 writew(BIT(offset), &regs->data_clear);
791 writew(BIT(offset), &regs->dir_set);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800792
793 spin_unlock_irqrestore(&port->lock, flags);
794
795 return 0;
796}
797
798static int adi_gpio_get_value(struct gpio_chip *chip, unsigned offset)
799{
800 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
801 struct gpio_port_t *regs = port->regs;
802 unsigned long flags;
803 int ret;
804
805 spin_lock_irqsave(&port->lock, flags);
806
807 ret = !!(readw(&regs->data) & BIT(offset));
808
809 spin_unlock_irqrestore(&port->lock, flags);
810
811 return ret;
812}
813
814static int adi_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
815{
816 struct gpio_port *port = container_of(chip, struct gpio_port, chip);
817
818 if (port->irq_base >= 0)
819 return irq_find_mapping(port->domain, offset);
820 else
821 return irq_create_mapping(port->domain, offset);
822}
823
824static int adi_pint_map_port(struct gpio_pint *pint, bool assign, u8 map,
825 struct irq_domain *domain)
826{
827 struct gpio_pint_regs *regs = pint->regs;
828 u32 map_mask;
829
830 if (pint->map_count > 1)
831 return -EINVAL;
832
833 pint->map_count++;
834
835 /* The map_mask of each gpio port is a 16-bit duplicate
836 * of the 8-bit map. It can be set to either high 16 bits or low
837 * 16 bits of the pint assignment register.
838 */
839 map_mask = (map << 8) | map;
840 if (assign) {
841 map_mask <<= PINT_HI_OFFSET;
842 writel((readl(&regs->assign) & 0xFFFF) | map_mask,
843 &regs->assign);
844 } else
845 writel((readl(&regs->assign) & 0xFFFF0000) | map_mask,
846 &regs->assign);
847
848 pint->domain[assign] = domain;
849
850 return 0;
851}
852
853static int adi_gpio_pint_probe(struct platform_device *pdev)
854{
855 struct device *dev = &pdev->dev;
856 struct resource *res;
857 struct gpio_pint *pint;
858
859 pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL);
860 if (!pint) {
861 dev_err(dev, "Memory alloc failed\n");
862 return -ENOMEM;
863 }
864
865 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Axel Linc8690d62013-09-24 15:46:11 +0800866 pint->base = devm_ioremap_resource(dev, res);
867 if (IS_ERR(pint->base))
868 return PTR_ERR(pint->base);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800869
870 pint->regs = (struct gpio_pint_regs *)pint->base;
871
872 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
873 if (!res) {
874 dev_err(dev, "Invalid IRQ resource\n");
875 return -ENODEV;
876 }
877
878 spin_lock_init(&pint->lock);
879
880 pint->irq = res->start;
881 pint->pint_map_port = adi_pint_map_port;
882 platform_set_drvdata(pdev, pint);
883
884 irq_set_chained_handler(pint->irq, adi_gpio_handle_pint_irq);
885 irq_set_handler_data(pint->irq, pint);
886
887 list_add_tail(&pint->node, &adi_pint_list);
888
889 return 0;
890}
891
892static int adi_gpio_pint_remove(struct platform_device *pdev)
893{
894 struct gpio_pint *pint = platform_get_drvdata(pdev);
895
896 list_del(&pint->node);
897 irq_set_handler(pint->irq, handle_simple_irq);
898
899 return 0;
900}
901
902static int adi_gpio_irq_map(struct irq_domain *d, unsigned int irq,
903 irq_hw_number_t hwirq)
904{
905 struct gpio_port *port = d->host_data;
906
907 if (!port)
908 return -EINVAL;
909
910 irq_set_chip_data(irq, port);
911 irq_set_chip_and_handler(irq, &adi_gpio_irqchip,
912 handle_level_irq);
913
914 return 0;
915}
916
917const struct irq_domain_ops adi_gpio_irq_domain_ops = {
918 .map = adi_gpio_irq_map,
919 .xlate = irq_domain_xlate_onecell,
920};
921
922static int adi_gpio_init_int(struct gpio_port *port)
923{
924 struct device_node *node = port->dev->of_node;
925 struct gpio_pint *pint = port->pint;
926 int ret;
927
928 port->domain = irq_domain_add_linear(node, port->width,
929 &adi_gpio_irq_domain_ops, port);
930 if (!port->domain) {
931 dev_err(port->dev, "Failed to create irqdomain\n");
932 return -ENOSYS;
933 }
934
935 /* According to BF54x and BF60x HRM, pin interrupt devices are not
936 * part of the GPIO port device. in GPIO interrupt mode, the GPIO
937 * pins of multiple port devices can be routed into one pin interrupt
938 * device. The mapping can be configured by setting pint assignment
939 * register with the mapping value of different GPIO port. This is
940 * done via function pint_map_port().
941 */
942 ret = pint->pint_map_port(port->pint, port->pint_assign,
943 port->pint_map, port->domain);
944 if (ret)
945 return ret;
946
947 if (port->irq_base >= 0) {
948 ret = irq_create_strict_mappings(port->domain, port->irq_base,
949 0, port->width);
950 if (ret) {
951 dev_err(port->dev, "Couldn't associate to domain\n");
952 return ret;
953 }
954 }
955
956 return 0;
957}
958
959#define DEVNAME_SIZE 16
960
961static int adi_gpio_probe(struct platform_device *pdev)
962{
963 struct device *dev = &pdev->dev;
964 const struct adi_pinctrl_gpio_platform_data *pdata;
965 struct resource *res;
966 struct gpio_port *port;
967 char pinctrl_devname[DEVNAME_SIZE];
968 static int gpio;
969 int ret = 0, ret1;
970
971 pdata = dev->platform_data;
972 if (!pdata)
973 return -EINVAL;
974
975 port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL);
976 if (!port) {
977 dev_err(dev, "Memory alloc failed\n");
978 return -ENOMEM;
979 }
980
981 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Axel Linc8690d62013-09-24 15:46:11 +0800982 port->base = devm_ioremap_resource(dev, res);
983 if (IS_ERR(port->base))
984 return PTR_ERR(port->base);
Sonic Zhange9a03ad2013-09-03 16:28:59 +0800985
986 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
987 if (!res)
988 port->irq_base = -1;
989 else
990 port->irq_base = res->start;
991
992 port->width = pdata->port_width;
993 port->dev = dev;
994 port->regs = (struct gpio_port_t *)port->base;
995 port->pint_assign = pdata->pint_assign;
996 port->pint_map = pdata->pint_map;
997
998 port->pint = find_gpio_pint(pdata->pint_id);
999 if (port->pint) {
1000 ret = adi_gpio_init_int(port);
1001 if (ret)
1002 return ret;
1003 }
1004
1005 spin_lock_init(&port->lock);
1006
1007 platform_set_drvdata(pdev, port);
1008
1009 port->chip.label = "adi-gpio";
1010 port->chip.direction_input = adi_gpio_direction_input;
1011 port->chip.get = adi_gpio_get_value;
1012 port->chip.direction_output = adi_gpio_direction_output;
1013 port->chip.set = adi_gpio_set_value;
1014 port->chip.request = adi_gpio_request;
1015 port->chip.free = adi_gpio_free;
1016 port->chip.to_irq = adi_gpio_to_irq;
1017 if (pdata->port_gpio_base > 0)
1018 port->chip.base = pdata->port_gpio_base;
1019 else
1020 port->chip.base = gpio;
1021 port->chip.ngpio = port->width;
1022 gpio = port->chip.base + port->width;
1023
1024 ret = gpiochip_add(&port->chip);
1025 if (ret) {
1026 dev_err(&pdev->dev, "Fail to add GPIO chip.\n");
1027 goto out_remove_domain;
1028 }
1029
1030 /* Add gpio pin range */
1031 snprintf(pinctrl_devname, DEVNAME_SIZE, "pinctrl-adi2.%d",
1032 pdata->pinctrl_id);
1033 pinctrl_devname[DEVNAME_SIZE - 1] = 0;
1034 ret = gpiochip_add_pin_range(&port->chip, pinctrl_devname,
1035 0, pdata->port_pin_base, port->width);
1036 if (ret) {
1037 dev_err(&pdev->dev, "Fail to add pin range to %s.\n",
1038 pinctrl_devname);
1039 goto out_remove_gpiochip;
1040 }
1041
1042 list_add_tail(&port->node, &adi_gpio_port_list);
1043
1044 return 0;
1045
1046out_remove_gpiochip:
1047 ret1 = gpiochip_remove(&port->chip);
1048out_remove_domain:
1049 if (port->pint)
1050 irq_domain_remove(port->domain);
1051
1052 return ret;
1053}
1054
1055static int adi_gpio_remove(struct platform_device *pdev)
1056{
1057 struct gpio_port *port = platform_get_drvdata(pdev);
1058 int ret;
1059 u8 offset;
1060
1061 list_del(&port->node);
1062 gpiochip_remove_pin_ranges(&port->chip);
1063 ret = gpiochip_remove(&port->chip);
1064 if (port->pint) {
1065 for (offset = 0; offset < port->width; offset++)
1066 irq_dispose_mapping(irq_find_mapping(port->domain,
1067 offset));
1068 irq_domain_remove(port->domain);
1069 }
1070
1071 return ret;
1072}
1073
1074static int adi_pinctrl_probe(struct platform_device *pdev)
1075{
1076 struct adi_pinctrl *pinctrl;
1077
1078 pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL);
1079 if (!pinctrl)
1080 return -ENOMEM;
1081
1082 pinctrl->dev = &pdev->dev;
1083
1084 adi_pinctrl_soc_init(&pinctrl->soc);
1085
1086 adi_pinmux_desc.pins = pinctrl->soc->pins;
1087 adi_pinmux_desc.npins = pinctrl->soc->npins;
1088
1089 /* Now register the pin controller and all pins it handles */
1090 pinctrl->pctl = pinctrl_register(&adi_pinmux_desc, &pdev->dev, pinctrl);
1091 if (!pinctrl->pctl) {
1092 dev_err(&pdev->dev, "could not register pinctrl ADI2 driver\n");
1093 return -EINVAL;
1094 }
1095
1096 platform_set_drvdata(pdev, pinctrl);
1097
1098 return 0;
1099}
1100
1101static int adi_pinctrl_remove(struct platform_device *pdev)
1102{
1103 struct adi_pinctrl *pinctrl = platform_get_drvdata(pdev);
1104
1105 pinctrl_unregister(pinctrl->pctl);
1106
1107 return 0;
1108}
1109
1110static struct platform_driver adi_pinctrl_driver = {
1111 .probe = adi_pinctrl_probe,
1112 .remove = adi_pinctrl_remove,
1113 .driver = {
1114 .name = DRIVER_NAME,
1115 },
1116};
1117
1118static struct platform_driver adi_gpio_pint_driver = {
1119 .probe = adi_gpio_pint_probe,
1120 .remove = adi_gpio_pint_remove,
1121 .driver = {
1122 .name = "adi-gpio-pint",
1123 },
1124};
1125
1126static struct platform_driver adi_gpio_driver = {
1127 .probe = adi_gpio_probe,
1128 .remove = adi_gpio_remove,
1129 .driver = {
1130 .name = "adi-gpio",
1131 },
1132};
1133
1134static int __init adi_pinctrl_setup(void)
1135{
1136 int ret;
1137
1138 ret = platform_driver_register(&adi_pinctrl_driver);
1139 if (ret)
1140 return ret;
1141
1142 ret = platform_driver_register(&adi_gpio_pint_driver);
1143 if (ret)
1144 goto pint_error;
1145
1146 ret = platform_driver_register(&adi_gpio_driver);
1147 if (ret)
1148 goto gpio_error;
1149
1150#ifdef CONFIG_PM
1151 register_syscore_ops(&gpio_pm_syscore_ops);
1152#endif
1153 return ret;
1154gpio_error:
1155 platform_driver_unregister(&adi_gpio_pint_driver);
1156pint_error:
1157 platform_driver_unregister(&adi_pinctrl_driver);
1158
1159 return ret;
1160}
1161arch_initcall(adi_pinctrl_setup);
1162
1163MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>");
1164MODULE_DESCRIPTION("ADI gpio2 pin control driver");
1165MODULE_LICENSE("GPL");