2 * Copyright (C) 2014-2017 Broadcom
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 * This file contains the Broadcom Iproc GPIO driver that supports 3
16 * GPIO controllers on Iproc including the ASIU GPIO controller, the
17 * chipCommonG GPIO controller, and the always-on GPIO controller. Basic
18 * PINCONF such as bias pull up/down, and drive strength are also supported
21 * It provides the functionality where pins from the GPIO can be
22 * individually muxed to GPIO function, if individual pad
23 * configuration is supported, through the interaction with respective
24 * SoCs IOMUX controller.
27 #include <linux/kernel.h>
28 #include <linux/slab.h>
29 #include <linux/interrupt.h>
31 #include <linux/gpio/driver.h>
32 #include <linux/ioport.h>
33 #include <linux/of_device.h>
34 #include <linux/of_irq.h>
35 #include <linux/pinctrl/pinctrl.h>
36 #include <linux/pinctrl/pinconf.h>
37 #include <linux/pinctrl/pinconf-generic.h>
39 #include "../pinctrl-utils.h"
41 #define IPROC_GPIO_DATA_IN_OFFSET 0x00
42 #define IPROC_GPIO_DATA_OUT_OFFSET 0x04
43 #define IPROC_GPIO_OUT_EN_OFFSET 0x08
44 #define IPROC_GPIO_INT_TYPE_OFFSET 0x0c
45 #define IPROC_GPIO_INT_DE_OFFSET 0x10
46 #define IPROC_GPIO_INT_EDGE_OFFSET 0x14
47 #define IPROC_GPIO_INT_MSK_OFFSET 0x18
48 #define IPROC_GPIO_INT_STAT_OFFSET 0x1c
49 #define IPROC_GPIO_INT_MSTAT_OFFSET 0x20
50 #define IPROC_GPIO_INT_CLR_OFFSET 0x24
51 #define IPROC_GPIO_PAD_RES_OFFSET 0x34
52 #define IPROC_GPIO_RES_EN_OFFSET 0x38
54 /* drive strength control for ASIU GPIO */
55 #define IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET 0x58
57 /* pinconf for CCM GPIO */
58 #define IPROC_GPIO_PULL_DN_OFFSET 0x10
59 #define IPROC_GPIO_PULL_UP_OFFSET 0x14
61 /* pinconf for CRMU(aon) GPIO and CCM GPIO*/
62 #define IPROC_GPIO_DRV_CTRL_OFFSET 0x00
64 #define GPIO_BANK_SIZE 0x200
65 #define NGPIOS_PER_BANK 32
66 #define GPIO_BANK(pin) ((pin) / NGPIOS_PER_BANK)
68 #define IPROC_GPIO_REG(pin, reg) (GPIO_BANK(pin) * GPIO_BANK_SIZE + (reg))
69 #define IPROC_GPIO_SHIFT(pin) ((pin) % NGPIOS_PER_BANK)
71 #define GPIO_DRV_STRENGTH_BIT_SHIFT 20
72 #define GPIO_DRV_STRENGTH_BITS 3
73 #define GPIO_DRV_STRENGTH_BIT_MASK ((1 << GPIO_DRV_STRENGTH_BITS) - 1)
75 enum iproc_pinconf_param
{
76 IPROC_PINCONF_DRIVE_STRENGTH
= 0,
77 IPROC_PINCONF_BIAS_DISABLE
,
78 IPROC_PINCONF_BIAS_PULL_UP
,
79 IPROC_PINCONF_BIAS_PULL_DOWN
,
83 enum iproc_pinconf_ctrl_type
{
92 * @dev: pointer to device
93 * @base: I/O register base for Iproc GPIO controller
94 * @io_ctrl: I/O register base for certain type of Iproc GPIO controller that
95 * has the PINCONF support implemented outside of the GPIO block
96 * @lock: lock to protect access to I/O registers
98 * @num_banks: number of GPIO banks, each bank supports up to 32 GPIOs
99 * @pinmux_is_supported: flag to indicate this GPIO controller contains pins
100 * that can be individually muxed to GPIO
101 * @pinconf_disable: contains a list of PINCONF parameters that need to be
103 * @nr_pinconf_disable: total number of PINCONF parameters that need to be
105 * @pctl: pointer to pinctrl_dev
106 * @pctldesc: pinctrl descriptor
112 void __iomem
*io_ctrl
;
113 enum iproc_pinconf_ctrl_type io_ctrl_type
;
120 bool pinmux_is_supported
;
122 enum pin_config_param
*pinconf_disable
;
123 unsigned int nr_pinconf_disable
;
125 struct pinctrl_dev
*pctl
;
126 struct pinctrl_desc pctldesc
;
130 * Mapping from PINCONF pins to GPIO pins is 1-to-1
132 static inline unsigned iproc_pin_to_gpio(unsigned pin
)
138 * iproc_set_bit - set or clear one bit (corresponding to the GPIO pin) in a
139 * Iproc GPIO register
141 * @iproc_gpio: Iproc GPIO device
142 * @reg: register offset
146 static inline void iproc_set_bit(struct iproc_gpio
*chip
, unsigned int reg
,
147 unsigned gpio
, bool set
)
149 unsigned int offset
= IPROC_GPIO_REG(gpio
, reg
);
150 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
153 val
= readl(chip
->base
+ offset
);
158 writel(val
, chip
->base
+ offset
);
161 static inline bool iproc_get_bit(struct iproc_gpio
*chip
, unsigned int reg
,
164 unsigned int offset
= IPROC_GPIO_REG(gpio
, reg
);
165 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
167 return !!(readl(chip
->base
+ offset
) & BIT(shift
));
170 static void iproc_gpio_irq_handler(struct irq_desc
*desc
)
172 struct gpio_chip
*gc
= irq_desc_get_handler_data(desc
);
173 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
174 struct irq_chip
*irq_chip
= irq_desc_get_chip(desc
);
177 chained_irq_enter(irq_chip
, desc
);
179 /* go through the entire GPIO banks and handle all interrupts */
180 for (i
= 0; i
< chip
->num_banks
; i
++) {
181 unsigned long val
= readl(chip
->base
+ (i
* GPIO_BANK_SIZE
) +
182 IPROC_GPIO_INT_MSTAT_OFFSET
);
184 for_each_set_bit(bit
, &val
, NGPIOS_PER_BANK
) {
185 unsigned pin
= NGPIOS_PER_BANK
* i
+ bit
;
186 int child_irq
= irq_find_mapping(gc
->irq
.domain
, pin
);
189 * Clear the interrupt before invoking the
190 * handler, so we do not leave any window
192 writel(BIT(bit
), chip
->base
+ (i
* GPIO_BANK_SIZE
) +
193 IPROC_GPIO_INT_CLR_OFFSET
);
195 generic_handle_irq(child_irq
);
199 chained_irq_exit(irq_chip
, desc
);
203 static void iproc_gpio_irq_ack(struct irq_data
*d
)
205 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
206 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
207 unsigned gpio
= d
->hwirq
;
208 unsigned int offset
= IPROC_GPIO_REG(gpio
,
209 IPROC_GPIO_INT_CLR_OFFSET
);
210 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
211 u32 val
= BIT(shift
);
213 writel(val
, chip
->base
+ offset
);
217 * iproc_gpio_irq_set_mask - mask/unmask a GPIO interrupt
220 * @unmask: mask/unmask GPIO interrupt
222 static void iproc_gpio_irq_set_mask(struct irq_data
*d
, bool unmask
)
224 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
225 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
226 unsigned gpio
= d
->hwirq
;
228 iproc_set_bit(chip
, IPROC_GPIO_INT_MSK_OFFSET
, gpio
, unmask
);
231 static void iproc_gpio_irq_mask(struct irq_data
*d
)
233 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
234 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
237 raw_spin_lock_irqsave(&chip
->lock
, flags
);
238 iproc_gpio_irq_set_mask(d
, false);
239 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
242 static void iproc_gpio_irq_unmask(struct irq_data
*d
)
244 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
245 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
248 raw_spin_lock_irqsave(&chip
->lock
, flags
);
249 iproc_gpio_irq_set_mask(d
, true);
250 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
253 static int iproc_gpio_irq_set_type(struct irq_data
*d
, unsigned int type
)
255 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
256 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
257 unsigned gpio
= d
->hwirq
;
258 bool level_triggered
= false;
259 bool dual_edge
= false;
260 bool rising_or_high
= false;
263 switch (type
& IRQ_TYPE_SENSE_MASK
) {
264 case IRQ_TYPE_EDGE_RISING
:
265 rising_or_high
= true;
268 case IRQ_TYPE_EDGE_FALLING
:
271 case IRQ_TYPE_EDGE_BOTH
:
275 case IRQ_TYPE_LEVEL_HIGH
:
276 level_triggered
= true;
277 rising_or_high
= true;
280 case IRQ_TYPE_LEVEL_LOW
:
281 level_triggered
= true;
285 dev_err(chip
->dev
, "invalid GPIO IRQ type 0x%x\n",
290 raw_spin_lock_irqsave(&chip
->lock
, flags
);
291 iproc_set_bit(chip
, IPROC_GPIO_INT_TYPE_OFFSET
, gpio
,
293 iproc_set_bit(chip
, IPROC_GPIO_INT_DE_OFFSET
, gpio
, dual_edge
);
294 iproc_set_bit(chip
, IPROC_GPIO_INT_EDGE_OFFSET
, gpio
,
296 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
299 "gpio:%u level_triggered:%d dual_edge:%d rising_or_high:%d\n",
300 gpio
, level_triggered
, dual_edge
, rising_or_high
);
305 static struct irq_chip iproc_gpio_irq_chip
= {
306 .name
= "bcm-iproc-gpio",
307 .irq_ack
= iproc_gpio_irq_ack
,
308 .irq_mask
= iproc_gpio_irq_mask
,
309 .irq_unmask
= iproc_gpio_irq_unmask
,
310 .irq_set_type
= iproc_gpio_irq_set_type
,
314 * Request the Iproc IOMUX pinmux controller to mux individual pins to GPIO
316 static int iproc_gpio_request(struct gpio_chip
*gc
, unsigned offset
)
318 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
319 unsigned gpio
= gc
->base
+ offset
;
321 /* not all Iproc GPIO pins can be muxed individually */
322 if (!chip
->pinmux_is_supported
)
325 return pinctrl_gpio_request(gpio
);
328 static void iproc_gpio_free(struct gpio_chip
*gc
, unsigned offset
)
330 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
331 unsigned gpio
= gc
->base
+ offset
;
333 if (!chip
->pinmux_is_supported
)
336 pinctrl_gpio_free(gpio
);
339 static int iproc_gpio_direction_input(struct gpio_chip
*gc
, unsigned gpio
)
341 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
344 raw_spin_lock_irqsave(&chip
->lock
, flags
);
345 iproc_set_bit(chip
, IPROC_GPIO_OUT_EN_OFFSET
, gpio
, false);
346 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
348 dev_dbg(chip
->dev
, "gpio:%u set input\n", gpio
);
353 static int iproc_gpio_direction_output(struct gpio_chip
*gc
, unsigned gpio
,
356 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
359 raw_spin_lock_irqsave(&chip
->lock
, flags
);
360 iproc_set_bit(chip
, IPROC_GPIO_OUT_EN_OFFSET
, gpio
, true);
361 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
362 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
364 dev_dbg(chip
->dev
, "gpio:%u set output, value:%d\n", gpio
, val
);
369 static void iproc_gpio_set(struct gpio_chip
*gc
, unsigned gpio
, int val
)
371 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
374 raw_spin_lock_irqsave(&chip
->lock
, flags
);
375 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
376 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
378 dev_dbg(chip
->dev
, "gpio:%u set, value:%d\n", gpio
, val
);
381 static int iproc_gpio_get(struct gpio_chip
*gc
, unsigned gpio
)
383 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
384 unsigned int offset
= IPROC_GPIO_REG(gpio
,
385 IPROC_GPIO_DATA_IN_OFFSET
);
386 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
388 return !!(readl(chip
->base
+ offset
) & BIT(shift
));
392 * Mapping of the iProc PINCONF parameters to the generic pin configuration
395 static const enum pin_config_param iproc_pinconf_disable_map
[] = {
396 [IPROC_PINCONF_DRIVE_STRENGTH
] = PIN_CONFIG_DRIVE_STRENGTH
,
397 [IPROC_PINCONF_BIAS_DISABLE
] = PIN_CONFIG_BIAS_DISABLE
,
398 [IPROC_PINCONF_BIAS_PULL_UP
] = PIN_CONFIG_BIAS_PULL_UP
,
399 [IPROC_PINCONF_BIAS_PULL_DOWN
] = PIN_CONFIG_BIAS_PULL_DOWN
,
402 static bool iproc_pinconf_param_is_disabled(struct iproc_gpio
*chip
,
403 enum pin_config_param param
)
407 if (!chip
->nr_pinconf_disable
)
410 for (i
= 0; i
< chip
->nr_pinconf_disable
; i
++)
411 if (chip
->pinconf_disable
[i
] == param
)
417 static int iproc_pinconf_disable_map_create(struct iproc_gpio
*chip
,
418 unsigned long disable_mask
)
420 unsigned int map_size
= ARRAY_SIZE(iproc_pinconf_disable_map
);
421 unsigned int bit
, nbits
= 0;
423 /* figure out total number of PINCONF parameters to disable */
424 for_each_set_bit(bit
, &disable_mask
, map_size
)
431 * Allocate an array to store PINCONF parameters that need to be
434 chip
->pinconf_disable
= devm_kcalloc(chip
->dev
, nbits
,
435 sizeof(*chip
->pinconf_disable
),
437 if (!chip
->pinconf_disable
)
440 chip
->nr_pinconf_disable
= nbits
;
442 /* now store these parameters */
444 for_each_set_bit(bit
, &disable_mask
, map_size
)
445 chip
->pinconf_disable
[nbits
++] = iproc_pinconf_disable_map
[bit
];
450 static int iproc_get_groups_count(struct pinctrl_dev
*pctldev
)
456 * Only one group: "gpio_grp", since this local pinctrl device only performs
457 * GPIO specific PINCONF configurations
459 static const char *iproc_get_group_name(struct pinctrl_dev
*pctldev
,
465 static const struct pinctrl_ops iproc_pctrl_ops
= {
466 .get_groups_count
= iproc_get_groups_count
,
467 .get_group_name
= iproc_get_group_name
,
468 .dt_node_to_map
= pinconf_generic_dt_node_to_map_pin
,
469 .dt_free_map
= pinctrl_utils_free_map
,
472 static int iproc_gpio_set_pull(struct iproc_gpio
*chip
, unsigned gpio
,
473 bool disable
, bool pull_up
)
480 raw_spin_lock_irqsave(&chip
->lock
, flags
);
481 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
482 base
= chip
->io_ctrl
;
483 shift
= IPROC_GPIO_SHIFT(gpio
);
485 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
);
486 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
);
488 /* no pull-up or pull-down */
489 val_1
&= ~BIT(shift
);
490 val_2
&= ~BIT(shift
);
491 } else if (pull_up
) {
493 val_2
&= ~BIT(shift
);
495 val_1
&= ~BIT(shift
);
498 writel(val_1
, base
+ IPROC_GPIO_PULL_UP_OFFSET
);
499 writel(val_2
, base
+ IPROC_GPIO_PULL_DN_OFFSET
);
502 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
505 iproc_set_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
,
507 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
512 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
513 dev_dbg(chip
->dev
, "gpio:%u set pullup:%d\n", gpio
, pull_up
);
518 static void iproc_gpio_get_pull(struct iproc_gpio
*chip
, unsigned gpio
,
519 bool *disable
, bool *pull_up
)
526 raw_spin_lock_irqsave(&chip
->lock
, flags
);
527 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
528 base
= chip
->io_ctrl
;
529 shift
= IPROC_GPIO_SHIFT(gpio
);
531 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
) & BIT(shift
);
532 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
) & BIT(shift
);
534 *pull_up
= val_1
? true : false;
535 *disable
= (val_1
| val_2
) ? false : true;
538 *disable
= !iproc_get_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
);
539 *pull_up
= iproc_get_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
);
541 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
544 #define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \
545 ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
546 ((type) == IOCTRL_TYPE_CDRU) ? \
547 ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
548 ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET)))
550 static int iproc_gpio_set_strength(struct iproc_gpio
*chip
, unsigned gpio
,
554 unsigned int i
, offset
, shift
;
558 /* make sure drive strength is supported */
559 if (strength
< 2 || strength
> 16 || (strength
% 2))
563 base
= chip
->io_ctrl
;
568 shift
= IPROC_GPIO_SHIFT(gpio
);
570 dev_dbg(chip
->dev
, "gpio:%u set drive strength:%d mA\n", gpio
,
573 raw_spin_lock_irqsave(&chip
->lock
, flags
);
574 strength
= (strength
/ 2) - 1;
575 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
576 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
577 val
= readl(base
+ offset
);
579 val
|= ((strength
>> i
) & 0x1) << shift
;
580 writel(val
, base
+ offset
);
582 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
587 static int iproc_gpio_get_strength(struct iproc_gpio
*chip
, unsigned gpio
,
591 unsigned int i
, offset
, shift
;
596 base
= chip
->io_ctrl
;
601 shift
= IPROC_GPIO_SHIFT(gpio
);
603 raw_spin_lock_irqsave(&chip
->lock
, flags
);
605 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
606 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
607 val
= readl(base
+ offset
) & BIT(shift
);
609 *strength
+= (val
<< i
);
613 *strength
= (*strength
+ 1) * 2;
614 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
619 static int iproc_pin_config_get(struct pinctrl_dev
*pctldev
, unsigned pin
,
620 unsigned long *config
)
622 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
623 enum pin_config_param param
= pinconf_to_config_param(*config
);
624 unsigned gpio
= iproc_pin_to_gpio(pin
);
626 bool disable
, pull_up
;
629 if (iproc_pinconf_param_is_disabled(chip
, param
))
633 case PIN_CONFIG_BIAS_DISABLE
:
634 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
640 case PIN_CONFIG_BIAS_PULL_UP
:
641 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
642 if (!disable
&& pull_up
)
647 case PIN_CONFIG_BIAS_PULL_DOWN
:
648 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
649 if (!disable
&& !pull_up
)
654 case PIN_CONFIG_DRIVE_STRENGTH
:
655 ret
= iproc_gpio_get_strength(chip
, gpio
, &arg
);
658 *config
= pinconf_to_config_packed(param
, arg
);
669 static int iproc_pin_config_set(struct pinctrl_dev
*pctldev
, unsigned pin
,
670 unsigned long *configs
, unsigned num_configs
)
672 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
673 enum pin_config_param param
;
675 unsigned i
, gpio
= iproc_pin_to_gpio(pin
);
678 for (i
= 0; i
< num_configs
; i
++) {
679 param
= pinconf_to_config_param(configs
[i
]);
681 if (iproc_pinconf_param_is_disabled(chip
, param
))
684 arg
= pinconf_to_config_argument(configs
[i
]);
687 case PIN_CONFIG_BIAS_DISABLE
:
688 ret
= iproc_gpio_set_pull(chip
, gpio
, true, false);
693 case PIN_CONFIG_BIAS_PULL_UP
:
694 ret
= iproc_gpio_set_pull(chip
, gpio
, false, true);
699 case PIN_CONFIG_BIAS_PULL_DOWN
:
700 ret
= iproc_gpio_set_pull(chip
, gpio
, false, false);
705 case PIN_CONFIG_DRIVE_STRENGTH
:
706 ret
= iproc_gpio_set_strength(chip
, gpio
, arg
);
712 dev_err(chip
->dev
, "invalid configuration\n");
715 } /* for each config */
721 static const struct pinconf_ops iproc_pconf_ops
= {
723 .pin_config_get
= iproc_pin_config_get
,
724 .pin_config_set
= iproc_pin_config_set
,
728 * Iproc GPIO controller supports some PINCONF related configurations such as
729 * pull up, pull down, and drive strength, when the pin is configured to GPIO
731 * Here a local pinctrl device is created with simple 1-to-1 pin mapping to the
734 static int iproc_gpio_register_pinconf(struct iproc_gpio
*chip
)
736 struct pinctrl_desc
*pctldesc
= &chip
->pctldesc
;
737 struct pinctrl_pin_desc
*pins
;
738 struct gpio_chip
*gc
= &chip
->gc
;
741 pins
= devm_kcalloc(chip
->dev
, gc
->ngpio
, sizeof(*pins
), GFP_KERNEL
);
745 for (i
= 0; i
< gc
->ngpio
; i
++) {
747 pins
[i
].name
= devm_kasprintf(chip
->dev
, GFP_KERNEL
,
753 pctldesc
->name
= dev_name(chip
->dev
);
754 pctldesc
->pctlops
= &iproc_pctrl_ops
;
755 pctldesc
->pins
= pins
;
756 pctldesc
->npins
= gc
->ngpio
;
757 pctldesc
->confops
= &iproc_pconf_ops
;
759 chip
->pctl
= devm_pinctrl_register(chip
->dev
, pctldesc
, chip
);
760 if (IS_ERR(chip
->pctl
)) {
761 dev_err(chip
->dev
, "unable to register pinctrl device\n");
762 return PTR_ERR(chip
->pctl
);
768 static const struct of_device_id iproc_gpio_of_match
[] = {
769 { .compatible
= "brcm,iproc-gpio" },
770 { .compatible
= "brcm,cygnus-ccm-gpio" },
771 { .compatible
= "brcm,cygnus-asiu-gpio" },
772 { .compatible
= "brcm,cygnus-crmu-gpio" },
773 { .compatible
= "brcm,iproc-nsp-gpio" },
774 { .compatible
= "brcm,iproc-stingray-gpio" },
778 static int iproc_gpio_probe(struct platform_device
*pdev
)
780 struct device
*dev
= &pdev
->dev
;
781 struct resource
*res
;
782 struct iproc_gpio
*chip
;
783 struct gpio_chip
*gc
;
784 u32 ngpios
, pinconf_disable_mask
= 0;
786 bool no_pinconf
= false;
787 enum iproc_pinconf_ctrl_type io_ctrl_type
= IOCTRL_TYPE_INVALID
;
789 /* NSP does not support drive strength config */
790 if (of_device_is_compatible(dev
->of_node
, "brcm,iproc-nsp-gpio"))
791 pinconf_disable_mask
= BIT(IPROC_PINCONF_DRIVE_STRENGTH
);
792 /* Stingray does not support pinconf in this controller */
793 else if (of_device_is_compatible(dev
->of_node
,
794 "brcm,iproc-stingray-gpio"))
797 chip
= devm_kzalloc(dev
, sizeof(*chip
), GFP_KERNEL
);
802 platform_set_drvdata(pdev
, chip
);
804 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
805 chip
->base
= devm_ioremap_resource(dev
, res
);
806 if (IS_ERR(chip
->base
)) {
807 dev_err(dev
, "unable to map I/O memory\n");
808 return PTR_ERR(chip
->base
);
811 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
813 chip
->io_ctrl
= devm_ioremap_resource(dev
, res
);
814 if (IS_ERR(chip
->io_ctrl
)) {
815 dev_err(dev
, "unable to map I/O memory\n");
816 return PTR_ERR(chip
->io_ctrl
);
818 if (of_device_is_compatible(dev
->of_node
,
819 "brcm,cygnus-ccm-gpio"))
820 io_ctrl_type
= IOCTRL_TYPE_CDRU
;
822 io_ctrl_type
= IOCTRL_TYPE_AON
;
825 chip
->io_ctrl_type
= io_ctrl_type
;
827 if (of_property_read_u32(dev
->of_node
, "ngpios", &ngpios
)) {
828 dev_err(&pdev
->dev
, "missing ngpios DT property\n");
832 raw_spin_lock_init(&chip
->lock
);
837 chip
->num_banks
= (ngpios
+ NGPIOS_PER_BANK
- 1) / NGPIOS_PER_BANK
;
838 gc
->label
= dev_name(dev
);
840 gc
->of_node
= dev
->of_node
;
841 gc
->request
= iproc_gpio_request
;
842 gc
->free
= iproc_gpio_free
;
843 gc
->direction_input
= iproc_gpio_direction_input
;
844 gc
->direction_output
= iproc_gpio_direction_output
;
845 gc
->set
= iproc_gpio_set
;
846 gc
->get
= iproc_gpio_get
;
848 chip
->pinmux_is_supported
= of_property_read_bool(dev
->of_node
,
851 ret
= gpiochip_add_data(gc
, chip
);
853 dev_err(dev
, "unable to add GPIO chip\n");
858 ret
= iproc_gpio_register_pinconf(chip
);
860 dev_err(dev
, "unable to register pinconf\n");
861 goto err_rm_gpiochip
;
864 if (pinconf_disable_mask
) {
865 ret
= iproc_pinconf_disable_map_create(chip
,
866 pinconf_disable_mask
);
869 "unable to create pinconf disable map\n");
870 goto err_rm_gpiochip
;
875 /* optional GPIO interrupt support */
876 irq
= platform_get_irq(pdev
, 0);
878 ret
= gpiochip_irqchip_add(gc
, &iproc_gpio_irq_chip
, 0,
879 handle_simple_irq
, IRQ_TYPE_NONE
);
881 dev_err(dev
, "no GPIO irqchip\n");
882 goto err_rm_gpiochip
;
885 gpiochip_set_chained_irqchip(gc
, &iproc_gpio_irq_chip
, irq
,
886 iproc_gpio_irq_handler
);
897 static struct platform_driver iproc_gpio_driver
= {
899 .name
= "iproc-gpio",
900 .of_match_table
= iproc_gpio_of_match
,
902 .probe
= iproc_gpio_probe
,
905 static int __init
iproc_gpio_init(void)
907 return platform_driver_register(&iproc_gpio_driver
);
909 arch_initcall_sync(iproc_gpio_init
);