1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2014-2017 Broadcom
7 * This file contains the Broadcom Iproc GPIO driver that supports 3
8 * GPIO controllers on Iproc including the ASIU GPIO controller, the
9 * chipCommonG GPIO controller, and the always-on GPIO controller. Basic
10 * PINCONF such as bias pull up/down, and drive strength are also supported
13 * It provides the functionality where pins from the GPIO can be
14 * individually muxed to GPIO function, if individual pad
15 * configuration is supported, through the interaction with respective
16 * SoCs IOMUX controller.
19 #include <linux/kernel.h>
20 #include <linux/slab.h>
21 #include <linux/interrupt.h>
23 #include <linux/gpio/driver.h>
24 #include <linux/ioport.h>
25 #include <linux/of_device.h>
26 #include <linux/of_irq.h>
27 #include <linux/pinctrl/pinctrl.h>
28 #include <linux/pinctrl/pinconf.h>
29 #include <linux/pinctrl/pinconf-generic.h>
31 #include "../pinctrl-utils.h"
33 #define IPROC_GPIO_DATA_IN_OFFSET 0x00
34 #define IPROC_GPIO_DATA_OUT_OFFSET 0x04
35 #define IPROC_GPIO_OUT_EN_OFFSET 0x08
36 #define IPROC_GPIO_INT_TYPE_OFFSET 0x0c
37 #define IPROC_GPIO_INT_DE_OFFSET 0x10
38 #define IPROC_GPIO_INT_EDGE_OFFSET 0x14
39 #define IPROC_GPIO_INT_MSK_OFFSET 0x18
40 #define IPROC_GPIO_INT_STAT_OFFSET 0x1c
41 #define IPROC_GPIO_INT_MSTAT_OFFSET 0x20
42 #define IPROC_GPIO_INT_CLR_OFFSET 0x24
43 #define IPROC_GPIO_PAD_RES_OFFSET 0x34
44 #define IPROC_GPIO_RES_EN_OFFSET 0x38
46 /* drive strength control for ASIU GPIO */
47 #define IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET 0x58
49 /* pinconf for CCM GPIO */
50 #define IPROC_GPIO_PULL_DN_OFFSET 0x10
51 #define IPROC_GPIO_PULL_UP_OFFSET 0x14
53 /* pinconf for CRMU(aon) GPIO and CCM GPIO*/
54 #define IPROC_GPIO_DRV_CTRL_OFFSET 0x00
56 #define GPIO_BANK_SIZE 0x200
57 #define NGPIOS_PER_BANK 32
58 #define GPIO_BANK(pin) ((pin) / NGPIOS_PER_BANK)
60 #define IPROC_GPIO_REG(pin, reg) (GPIO_BANK(pin) * GPIO_BANK_SIZE + (reg))
61 #define IPROC_GPIO_SHIFT(pin) ((pin) % NGPIOS_PER_BANK)
63 #define GPIO_DRV_STRENGTH_BIT_SHIFT 20
64 #define GPIO_DRV_STRENGTH_BITS 3
65 #define GPIO_DRV_STRENGTH_BIT_MASK ((1 << GPIO_DRV_STRENGTH_BITS) - 1)
67 enum iproc_pinconf_param
{
68 IPROC_PINCONF_DRIVE_STRENGTH
= 0,
69 IPROC_PINCONF_BIAS_DISABLE
,
70 IPROC_PINCONF_BIAS_PULL_UP
,
71 IPROC_PINCONF_BIAS_PULL_DOWN
,
75 enum iproc_pinconf_ctrl_type
{
84 * @dev: pointer to device
85 * @base: I/O register base for Iproc GPIO controller
86 * @io_ctrl: I/O register base for certain type of Iproc GPIO controller that
87 * has the PINCONF support implemented outside of the GPIO block
88 * @lock: lock to protect access to I/O registers
90 * @num_banks: number of GPIO banks, each bank supports up to 32 GPIOs
91 * @pinmux_is_supported: flag to indicate this GPIO controller contains pins
92 * that can be individually muxed to GPIO
93 * @pinconf_disable: contains a list of PINCONF parameters that need to be
95 * @nr_pinconf_disable: total number of PINCONF parameters that need to be
97 * @pctl: pointer to pinctrl_dev
98 * @pctldesc: pinctrl descriptor
104 void __iomem
*io_ctrl
;
105 enum iproc_pinconf_ctrl_type io_ctrl_type
;
109 struct irq_chip irqchip
;
113 bool pinmux_is_supported
;
115 enum pin_config_param
*pinconf_disable
;
116 unsigned int nr_pinconf_disable
;
118 struct pinctrl_dev
*pctl
;
119 struct pinctrl_desc pctldesc
;
123 * Mapping from PINCONF pins to GPIO pins is 1-to-1
125 static inline unsigned iproc_pin_to_gpio(unsigned pin
)
131 * iproc_set_bit - set or clear one bit (corresponding to the GPIO pin) in a
132 * Iproc GPIO register
134 * @iproc_gpio: Iproc GPIO device
135 * @reg: register offset
139 static inline void iproc_set_bit(struct iproc_gpio
*chip
, unsigned int reg
,
140 unsigned gpio
, bool set
)
142 unsigned int offset
= IPROC_GPIO_REG(gpio
, reg
);
143 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
146 val
= readl(chip
->base
+ offset
);
151 writel(val
, chip
->base
+ offset
);
154 static inline bool iproc_get_bit(struct iproc_gpio
*chip
, unsigned int reg
,
157 unsigned int offset
= IPROC_GPIO_REG(gpio
, reg
);
158 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
160 return !!(readl(chip
->base
+ offset
) & BIT(shift
));
163 static void iproc_gpio_irq_handler(struct irq_desc
*desc
)
165 struct gpio_chip
*gc
= irq_desc_get_handler_data(desc
);
166 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
167 struct irq_chip
*irq_chip
= irq_desc_get_chip(desc
);
170 chained_irq_enter(irq_chip
, desc
);
172 /* go through the entire GPIO banks and handle all interrupts */
173 for (i
= 0; i
< chip
->num_banks
; i
++) {
174 unsigned long val
= readl(chip
->base
+ (i
* GPIO_BANK_SIZE
) +
175 IPROC_GPIO_INT_MSTAT_OFFSET
);
177 for_each_set_bit(bit
, &val
, NGPIOS_PER_BANK
) {
178 unsigned pin
= NGPIOS_PER_BANK
* i
+ bit
;
179 int child_irq
= irq_find_mapping(gc
->irq
.domain
, pin
);
182 * Clear the interrupt before invoking the
183 * handler, so we do not leave any window
185 writel(BIT(bit
), chip
->base
+ (i
* GPIO_BANK_SIZE
) +
186 IPROC_GPIO_INT_CLR_OFFSET
);
188 generic_handle_irq(child_irq
);
192 chained_irq_exit(irq_chip
, desc
);
196 static void iproc_gpio_irq_ack(struct irq_data
*d
)
198 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
199 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
200 unsigned gpio
= d
->hwirq
;
201 unsigned int offset
= IPROC_GPIO_REG(gpio
,
202 IPROC_GPIO_INT_CLR_OFFSET
);
203 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
204 u32 val
= BIT(shift
);
206 writel(val
, chip
->base
+ offset
);
210 * iproc_gpio_irq_set_mask - mask/unmask a GPIO interrupt
213 * @unmask: mask/unmask GPIO interrupt
215 static void iproc_gpio_irq_set_mask(struct irq_data
*d
, bool unmask
)
217 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
218 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
219 unsigned gpio
= d
->hwirq
;
221 iproc_set_bit(chip
, IPROC_GPIO_INT_MSK_OFFSET
, gpio
, unmask
);
224 static void iproc_gpio_irq_mask(struct irq_data
*d
)
226 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
227 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
230 raw_spin_lock_irqsave(&chip
->lock
, flags
);
231 iproc_gpio_irq_set_mask(d
, false);
232 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
235 static void iproc_gpio_irq_unmask(struct irq_data
*d
)
237 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
238 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
241 raw_spin_lock_irqsave(&chip
->lock
, flags
);
242 iproc_gpio_irq_set_mask(d
, true);
243 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
246 static int iproc_gpio_irq_set_type(struct irq_data
*d
, unsigned int type
)
248 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
249 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
250 unsigned gpio
= d
->hwirq
;
251 bool level_triggered
= false;
252 bool dual_edge
= false;
253 bool rising_or_high
= false;
256 switch (type
& IRQ_TYPE_SENSE_MASK
) {
257 case IRQ_TYPE_EDGE_RISING
:
258 rising_or_high
= true;
261 case IRQ_TYPE_EDGE_FALLING
:
264 case IRQ_TYPE_EDGE_BOTH
:
268 case IRQ_TYPE_LEVEL_HIGH
:
269 level_triggered
= true;
270 rising_or_high
= true;
273 case IRQ_TYPE_LEVEL_LOW
:
274 level_triggered
= true;
278 dev_err(chip
->dev
, "invalid GPIO IRQ type 0x%x\n",
283 raw_spin_lock_irqsave(&chip
->lock
, flags
);
284 iproc_set_bit(chip
, IPROC_GPIO_INT_TYPE_OFFSET
, gpio
,
286 iproc_set_bit(chip
, IPROC_GPIO_INT_DE_OFFSET
, gpio
, dual_edge
);
287 iproc_set_bit(chip
, IPROC_GPIO_INT_EDGE_OFFSET
, gpio
,
290 if (type
& IRQ_TYPE_EDGE_BOTH
)
291 irq_set_handler_locked(d
, handle_edge_irq
);
293 irq_set_handler_locked(d
, handle_level_irq
);
295 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
298 "gpio:%u level_triggered:%d dual_edge:%d rising_or_high:%d\n",
299 gpio
, level_triggered
, dual_edge
, rising_or_high
);
305 * Request the Iproc IOMUX pinmux controller to mux individual pins to GPIO
307 static int iproc_gpio_request(struct gpio_chip
*gc
, unsigned offset
)
309 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
310 unsigned gpio
= gc
->base
+ offset
;
312 /* not all Iproc GPIO pins can be muxed individually */
313 if (!chip
->pinmux_is_supported
)
316 return pinctrl_gpio_request(gpio
);
319 static void iproc_gpio_free(struct gpio_chip
*gc
, unsigned offset
)
321 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
322 unsigned gpio
= gc
->base
+ offset
;
324 if (!chip
->pinmux_is_supported
)
327 pinctrl_gpio_free(gpio
);
330 static int iproc_gpio_direction_input(struct gpio_chip
*gc
, unsigned gpio
)
332 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
335 raw_spin_lock_irqsave(&chip
->lock
, flags
);
336 iproc_set_bit(chip
, IPROC_GPIO_OUT_EN_OFFSET
, gpio
, false);
337 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
339 dev_dbg(chip
->dev
, "gpio:%u set input\n", gpio
);
344 static int iproc_gpio_direction_output(struct gpio_chip
*gc
, unsigned gpio
,
347 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
350 raw_spin_lock_irqsave(&chip
->lock
, flags
);
351 iproc_set_bit(chip
, IPROC_GPIO_OUT_EN_OFFSET
, gpio
, true);
352 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
353 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
355 dev_dbg(chip
->dev
, "gpio:%u set output, value:%d\n", gpio
, val
);
360 static int iproc_gpio_get_direction(struct gpio_chip
*gc
, unsigned int gpio
)
362 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
363 unsigned int offset
= IPROC_GPIO_REG(gpio
, IPROC_GPIO_OUT_EN_OFFSET
);
364 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
366 if (readl(chip
->base
+ offset
) & BIT(shift
))
367 return GPIO_LINE_DIRECTION_OUT
;
369 return GPIO_LINE_DIRECTION_IN
;
372 static void iproc_gpio_set(struct gpio_chip
*gc
, unsigned gpio
, int val
)
374 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
377 raw_spin_lock_irqsave(&chip
->lock
, flags
);
378 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
379 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
381 dev_dbg(chip
->dev
, "gpio:%u set, value:%d\n", gpio
, val
);
384 static int iproc_gpio_get(struct gpio_chip
*gc
, unsigned gpio
)
386 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
387 unsigned int offset
= IPROC_GPIO_REG(gpio
,
388 IPROC_GPIO_DATA_IN_OFFSET
);
389 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
391 return !!(readl(chip
->base
+ offset
) & BIT(shift
));
395 * Mapping of the iProc PINCONF parameters to the generic pin configuration
398 static const enum pin_config_param iproc_pinconf_disable_map
[] = {
399 [IPROC_PINCONF_DRIVE_STRENGTH
] = PIN_CONFIG_DRIVE_STRENGTH
,
400 [IPROC_PINCONF_BIAS_DISABLE
] = PIN_CONFIG_BIAS_DISABLE
,
401 [IPROC_PINCONF_BIAS_PULL_UP
] = PIN_CONFIG_BIAS_PULL_UP
,
402 [IPROC_PINCONF_BIAS_PULL_DOWN
] = PIN_CONFIG_BIAS_PULL_DOWN
,
405 static bool iproc_pinconf_param_is_disabled(struct iproc_gpio
*chip
,
406 enum pin_config_param param
)
410 if (!chip
->nr_pinconf_disable
)
413 for (i
= 0; i
< chip
->nr_pinconf_disable
; i
++)
414 if (chip
->pinconf_disable
[i
] == param
)
420 static int iproc_pinconf_disable_map_create(struct iproc_gpio
*chip
,
421 unsigned long disable_mask
)
423 unsigned int map_size
= ARRAY_SIZE(iproc_pinconf_disable_map
);
424 unsigned int bit
, nbits
= 0;
426 /* figure out total number of PINCONF parameters to disable */
427 for_each_set_bit(bit
, &disable_mask
, map_size
)
434 * Allocate an array to store PINCONF parameters that need to be
437 chip
->pinconf_disable
= devm_kcalloc(chip
->dev
, nbits
,
438 sizeof(*chip
->pinconf_disable
),
440 if (!chip
->pinconf_disable
)
443 chip
->nr_pinconf_disable
= nbits
;
445 /* now store these parameters */
447 for_each_set_bit(bit
, &disable_mask
, map_size
)
448 chip
->pinconf_disable
[nbits
++] = iproc_pinconf_disable_map
[bit
];
453 static int iproc_get_groups_count(struct pinctrl_dev
*pctldev
)
459 * Only one group: "gpio_grp", since this local pinctrl device only performs
460 * GPIO specific PINCONF configurations
462 static const char *iproc_get_group_name(struct pinctrl_dev
*pctldev
,
468 static const struct pinctrl_ops iproc_pctrl_ops
= {
469 .get_groups_count
= iproc_get_groups_count
,
470 .get_group_name
= iproc_get_group_name
,
471 .dt_node_to_map
= pinconf_generic_dt_node_to_map_pin
,
472 .dt_free_map
= pinctrl_utils_free_map
,
475 static int iproc_gpio_set_pull(struct iproc_gpio
*chip
, unsigned gpio
,
476 bool disable
, bool pull_up
)
483 raw_spin_lock_irqsave(&chip
->lock
, flags
);
484 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
485 base
= chip
->io_ctrl
;
486 shift
= IPROC_GPIO_SHIFT(gpio
);
488 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
);
489 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
);
491 /* no pull-up or pull-down */
492 val_1
&= ~BIT(shift
);
493 val_2
&= ~BIT(shift
);
494 } else if (pull_up
) {
496 val_2
&= ~BIT(shift
);
498 val_1
&= ~BIT(shift
);
501 writel(val_1
, base
+ IPROC_GPIO_PULL_UP_OFFSET
);
502 writel(val_2
, base
+ IPROC_GPIO_PULL_DN_OFFSET
);
505 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
508 iproc_set_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
,
510 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
515 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
516 dev_dbg(chip
->dev
, "gpio:%u set pullup:%d\n", gpio
, pull_up
);
521 static void iproc_gpio_get_pull(struct iproc_gpio
*chip
, unsigned gpio
,
522 bool *disable
, bool *pull_up
)
529 raw_spin_lock_irqsave(&chip
->lock
, flags
);
530 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
531 base
= chip
->io_ctrl
;
532 shift
= IPROC_GPIO_SHIFT(gpio
);
534 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
) & BIT(shift
);
535 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
) & BIT(shift
);
537 *pull_up
= val_1
? true : false;
538 *disable
= (val_1
| val_2
) ? false : true;
541 *disable
= !iproc_get_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
);
542 *pull_up
= iproc_get_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
);
544 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
547 #define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \
548 ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
549 ((type) == IOCTRL_TYPE_CDRU) ? \
550 ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
551 ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET)))
553 static int iproc_gpio_set_strength(struct iproc_gpio
*chip
, unsigned gpio
,
557 unsigned int i
, offset
, shift
;
561 /* make sure drive strength is supported */
562 if (strength
< 2 || strength
> 16 || (strength
% 2))
566 base
= chip
->io_ctrl
;
571 shift
= IPROC_GPIO_SHIFT(gpio
);
573 dev_dbg(chip
->dev
, "gpio:%u set drive strength:%d mA\n", gpio
,
576 raw_spin_lock_irqsave(&chip
->lock
, flags
);
577 strength
= (strength
/ 2) - 1;
578 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
579 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
580 val
= readl(base
+ offset
);
582 val
|= ((strength
>> i
) & 0x1) << shift
;
583 writel(val
, base
+ offset
);
585 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
590 static int iproc_gpio_get_strength(struct iproc_gpio
*chip
, unsigned gpio
,
594 unsigned int i
, offset
, shift
;
599 base
= chip
->io_ctrl
;
604 shift
= IPROC_GPIO_SHIFT(gpio
);
606 raw_spin_lock_irqsave(&chip
->lock
, flags
);
608 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
609 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
610 val
= readl(base
+ offset
) & BIT(shift
);
612 *strength
+= (val
<< i
);
616 *strength
= (*strength
+ 1) * 2;
617 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
622 static int iproc_pin_config_get(struct pinctrl_dev
*pctldev
, unsigned pin
,
623 unsigned long *config
)
625 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
626 enum pin_config_param param
= pinconf_to_config_param(*config
);
627 unsigned gpio
= iproc_pin_to_gpio(pin
);
629 bool disable
, pull_up
;
632 if (iproc_pinconf_param_is_disabled(chip
, param
))
636 case PIN_CONFIG_BIAS_DISABLE
:
637 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
643 case PIN_CONFIG_BIAS_PULL_UP
:
644 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
645 if (!disable
&& pull_up
)
650 case PIN_CONFIG_BIAS_PULL_DOWN
:
651 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
652 if (!disable
&& !pull_up
)
657 case PIN_CONFIG_DRIVE_STRENGTH
:
658 ret
= iproc_gpio_get_strength(chip
, gpio
, &arg
);
661 *config
= pinconf_to_config_packed(param
, arg
);
672 static int iproc_pin_config_set(struct pinctrl_dev
*pctldev
, unsigned pin
,
673 unsigned long *configs
, unsigned num_configs
)
675 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
676 enum pin_config_param param
;
678 unsigned i
, gpio
= iproc_pin_to_gpio(pin
);
681 for (i
= 0; i
< num_configs
; i
++) {
682 param
= pinconf_to_config_param(configs
[i
]);
684 if (iproc_pinconf_param_is_disabled(chip
, param
))
687 arg
= pinconf_to_config_argument(configs
[i
]);
690 case PIN_CONFIG_BIAS_DISABLE
:
691 ret
= iproc_gpio_set_pull(chip
, gpio
, true, false);
696 case PIN_CONFIG_BIAS_PULL_UP
:
697 ret
= iproc_gpio_set_pull(chip
, gpio
, false, true);
702 case PIN_CONFIG_BIAS_PULL_DOWN
:
703 ret
= iproc_gpio_set_pull(chip
, gpio
, false, false);
708 case PIN_CONFIG_DRIVE_STRENGTH
:
709 ret
= iproc_gpio_set_strength(chip
, gpio
, arg
);
715 dev_err(chip
->dev
, "invalid configuration\n");
718 } /* for each config */
724 static const struct pinconf_ops iproc_pconf_ops
= {
726 .pin_config_get
= iproc_pin_config_get
,
727 .pin_config_set
= iproc_pin_config_set
,
731 * Iproc GPIO controller supports some PINCONF related configurations such as
732 * pull up, pull down, and drive strength, when the pin is configured to GPIO
734 * Here a local pinctrl device is created with simple 1-to-1 pin mapping to the
737 static int iproc_gpio_register_pinconf(struct iproc_gpio
*chip
)
739 struct pinctrl_desc
*pctldesc
= &chip
->pctldesc
;
740 struct pinctrl_pin_desc
*pins
;
741 struct gpio_chip
*gc
= &chip
->gc
;
744 pins
= devm_kcalloc(chip
->dev
, gc
->ngpio
, sizeof(*pins
), GFP_KERNEL
);
748 for (i
= 0; i
< gc
->ngpio
; i
++) {
750 pins
[i
].name
= devm_kasprintf(chip
->dev
, GFP_KERNEL
,
756 pctldesc
->name
= dev_name(chip
->dev
);
757 pctldesc
->pctlops
= &iproc_pctrl_ops
;
758 pctldesc
->pins
= pins
;
759 pctldesc
->npins
= gc
->ngpio
;
760 pctldesc
->confops
= &iproc_pconf_ops
;
762 chip
->pctl
= devm_pinctrl_register(chip
->dev
, pctldesc
, chip
);
763 if (IS_ERR(chip
->pctl
)) {
764 dev_err(chip
->dev
, "unable to register pinctrl device\n");
765 return PTR_ERR(chip
->pctl
);
771 static const struct of_device_id iproc_gpio_of_match
[] = {
772 { .compatible
= "brcm,iproc-gpio" },
773 { .compatible
= "brcm,cygnus-ccm-gpio" },
774 { .compatible
= "brcm,cygnus-asiu-gpio" },
775 { .compatible
= "brcm,cygnus-crmu-gpio" },
776 { .compatible
= "brcm,iproc-nsp-gpio" },
777 { .compatible
= "brcm,iproc-stingray-gpio" },
781 static int iproc_gpio_probe(struct platform_device
*pdev
)
783 struct device
*dev
= &pdev
->dev
;
784 struct resource
*res
;
785 struct iproc_gpio
*chip
;
786 struct gpio_chip
*gc
;
787 u32 ngpios
, pinconf_disable_mask
= 0;
789 bool no_pinconf
= false;
790 enum iproc_pinconf_ctrl_type io_ctrl_type
= IOCTRL_TYPE_INVALID
;
792 /* NSP does not support drive strength config */
793 if (of_device_is_compatible(dev
->of_node
, "brcm,iproc-nsp-gpio"))
794 pinconf_disable_mask
= BIT(IPROC_PINCONF_DRIVE_STRENGTH
);
795 /* Stingray does not support pinconf in this controller */
796 else if (of_device_is_compatible(dev
->of_node
,
797 "brcm,iproc-stingray-gpio"))
800 chip
= devm_kzalloc(dev
, sizeof(*chip
), GFP_KERNEL
);
805 platform_set_drvdata(pdev
, chip
);
807 chip
->base
= devm_platform_ioremap_resource(pdev
, 0);
808 if (IS_ERR(chip
->base
)) {
809 dev_err(dev
, "unable to map I/O memory\n");
810 return PTR_ERR(chip
->base
);
813 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
815 chip
->io_ctrl
= devm_ioremap_resource(dev
, res
);
816 if (IS_ERR(chip
->io_ctrl
)) {
817 dev_err(dev
, "unable to map I/O memory\n");
818 return PTR_ERR(chip
->io_ctrl
);
820 if (of_device_is_compatible(dev
->of_node
,
821 "brcm,cygnus-ccm-gpio"))
822 io_ctrl_type
= IOCTRL_TYPE_CDRU
;
824 io_ctrl_type
= IOCTRL_TYPE_AON
;
827 chip
->io_ctrl_type
= io_ctrl_type
;
829 if (of_property_read_u32(dev
->of_node
, "ngpios", &ngpios
)) {
830 dev_err(&pdev
->dev
, "missing ngpios DT property\n");
834 raw_spin_lock_init(&chip
->lock
);
839 chip
->num_banks
= (ngpios
+ NGPIOS_PER_BANK
- 1) / NGPIOS_PER_BANK
;
840 gc
->label
= dev_name(dev
);
842 gc
->of_node
= dev
->of_node
;
843 gc
->request
= iproc_gpio_request
;
844 gc
->free
= iproc_gpio_free
;
845 gc
->direction_input
= iproc_gpio_direction_input
;
846 gc
->direction_output
= iproc_gpio_direction_output
;
847 gc
->get_direction
= iproc_gpio_get_direction
;
848 gc
->set
= iproc_gpio_set
;
849 gc
->get
= iproc_gpio_get
;
851 chip
->pinmux_is_supported
= of_property_read_bool(dev
->of_node
,
854 /* optional GPIO interrupt support */
855 irq
= platform_get_irq_optional(pdev
, 0);
857 struct irq_chip
*irqc
;
858 struct gpio_irq_chip
*girq
;
860 irqc
= &chip
->irqchip
;
861 irqc
->name
= dev_name(dev
);
862 irqc
->irq_ack
= iproc_gpio_irq_ack
;
863 irqc
->irq_mask
= iproc_gpio_irq_mask
;
864 irqc
->irq_unmask
= iproc_gpio_irq_unmask
;
865 irqc
->irq_set_type
= iproc_gpio_irq_set_type
;
866 irqc
->irq_enable
= iproc_gpio_irq_unmask
;
867 irqc
->irq_disable
= iproc_gpio_irq_mask
;
871 girq
->parent_handler
= iproc_gpio_irq_handler
;
872 girq
->num_parents
= 1;
873 girq
->parents
= devm_kcalloc(dev
, 1,
874 sizeof(*girq
->parents
),
878 girq
->parents
[0] = irq
;
879 girq
->default_type
= IRQ_TYPE_NONE
;
880 girq
->handler
= handle_bad_irq
;
883 ret
= gpiochip_add_data(gc
, chip
);
885 dev_err(dev
, "unable to add GPIO chip\n");
890 ret
= iproc_gpio_register_pinconf(chip
);
892 dev_err(dev
, "unable to register pinconf\n");
893 goto err_rm_gpiochip
;
896 if (pinconf_disable_mask
) {
897 ret
= iproc_pinconf_disable_map_create(chip
,
898 pinconf_disable_mask
);
901 "unable to create pinconf disable map\n");
902 goto err_rm_gpiochip
;
915 static struct platform_driver iproc_gpio_driver
= {
917 .name
= "iproc-gpio",
918 .of_match_table
= iproc_gpio_of_match
,
920 .probe
= iproc_gpio_probe
,
923 static int __init
iproc_gpio_init(void)
925 return platform_driver_register(&iproc_gpio_driver
);
927 arch_initcall_sync(iproc_gpio_init
);