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
,
289 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
292 "gpio:%u level_triggered:%d dual_edge:%d rising_or_high:%d\n",
293 gpio
, level_triggered
, dual_edge
, rising_or_high
);
299 * Request the Iproc IOMUX pinmux controller to mux individual pins to GPIO
301 static int iproc_gpio_request(struct gpio_chip
*gc
, unsigned offset
)
303 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
304 unsigned gpio
= gc
->base
+ offset
;
306 /* not all Iproc GPIO pins can be muxed individually */
307 if (!chip
->pinmux_is_supported
)
310 return pinctrl_gpio_request(gpio
);
313 static void iproc_gpio_free(struct gpio_chip
*gc
, unsigned offset
)
315 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
316 unsigned gpio
= gc
->base
+ offset
;
318 if (!chip
->pinmux_is_supported
)
321 pinctrl_gpio_free(gpio
);
324 static int iproc_gpio_direction_input(struct gpio_chip
*gc
, unsigned gpio
)
326 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
329 raw_spin_lock_irqsave(&chip
->lock
, flags
);
330 iproc_set_bit(chip
, IPROC_GPIO_OUT_EN_OFFSET
, gpio
, false);
331 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
333 dev_dbg(chip
->dev
, "gpio:%u set input\n", gpio
);
338 static int iproc_gpio_direction_output(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
, true);
346 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
347 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
349 dev_dbg(chip
->dev
, "gpio:%u set output, value:%d\n", gpio
, val
);
354 static int iproc_gpio_get_direction(struct gpio_chip
*gc
, unsigned int gpio
)
356 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
357 unsigned int offset
= IPROC_GPIO_REG(gpio
, IPROC_GPIO_OUT_EN_OFFSET
);
358 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
360 return !(readl(chip
->base
+ offset
) & BIT(shift
));
363 static void iproc_gpio_set(struct gpio_chip
*gc
, unsigned gpio
, int val
)
365 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
368 raw_spin_lock_irqsave(&chip
->lock
, flags
);
369 iproc_set_bit(chip
, IPROC_GPIO_DATA_OUT_OFFSET
, gpio
, !!(val
));
370 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
372 dev_dbg(chip
->dev
, "gpio:%u set, value:%d\n", gpio
, val
);
375 static int iproc_gpio_get(struct gpio_chip
*gc
, unsigned gpio
)
377 struct iproc_gpio
*chip
= gpiochip_get_data(gc
);
378 unsigned int offset
= IPROC_GPIO_REG(gpio
,
379 IPROC_GPIO_DATA_IN_OFFSET
);
380 unsigned int shift
= IPROC_GPIO_SHIFT(gpio
);
382 return !!(readl(chip
->base
+ offset
) & BIT(shift
));
386 * Mapping of the iProc PINCONF parameters to the generic pin configuration
389 static const enum pin_config_param iproc_pinconf_disable_map
[] = {
390 [IPROC_PINCONF_DRIVE_STRENGTH
] = PIN_CONFIG_DRIVE_STRENGTH
,
391 [IPROC_PINCONF_BIAS_DISABLE
] = PIN_CONFIG_BIAS_DISABLE
,
392 [IPROC_PINCONF_BIAS_PULL_UP
] = PIN_CONFIG_BIAS_PULL_UP
,
393 [IPROC_PINCONF_BIAS_PULL_DOWN
] = PIN_CONFIG_BIAS_PULL_DOWN
,
396 static bool iproc_pinconf_param_is_disabled(struct iproc_gpio
*chip
,
397 enum pin_config_param param
)
401 if (!chip
->nr_pinconf_disable
)
404 for (i
= 0; i
< chip
->nr_pinconf_disable
; i
++)
405 if (chip
->pinconf_disable
[i
] == param
)
411 static int iproc_pinconf_disable_map_create(struct iproc_gpio
*chip
,
412 unsigned long disable_mask
)
414 unsigned int map_size
= ARRAY_SIZE(iproc_pinconf_disable_map
);
415 unsigned int bit
, nbits
= 0;
417 /* figure out total number of PINCONF parameters to disable */
418 for_each_set_bit(bit
, &disable_mask
, map_size
)
425 * Allocate an array to store PINCONF parameters that need to be
428 chip
->pinconf_disable
= devm_kcalloc(chip
->dev
, nbits
,
429 sizeof(*chip
->pinconf_disable
),
431 if (!chip
->pinconf_disable
)
434 chip
->nr_pinconf_disable
= nbits
;
436 /* now store these parameters */
438 for_each_set_bit(bit
, &disable_mask
, map_size
)
439 chip
->pinconf_disable
[nbits
++] = iproc_pinconf_disable_map
[bit
];
444 static int iproc_get_groups_count(struct pinctrl_dev
*pctldev
)
450 * Only one group: "gpio_grp", since this local pinctrl device only performs
451 * GPIO specific PINCONF configurations
453 static const char *iproc_get_group_name(struct pinctrl_dev
*pctldev
,
459 static const struct pinctrl_ops iproc_pctrl_ops
= {
460 .get_groups_count
= iproc_get_groups_count
,
461 .get_group_name
= iproc_get_group_name
,
462 .dt_node_to_map
= pinconf_generic_dt_node_to_map_pin
,
463 .dt_free_map
= pinctrl_utils_free_map
,
466 static int iproc_gpio_set_pull(struct iproc_gpio
*chip
, unsigned gpio
,
467 bool disable
, bool pull_up
)
474 raw_spin_lock_irqsave(&chip
->lock
, flags
);
475 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
476 base
= chip
->io_ctrl
;
477 shift
= IPROC_GPIO_SHIFT(gpio
);
479 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
);
480 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
);
482 /* no pull-up or pull-down */
483 val_1
&= ~BIT(shift
);
484 val_2
&= ~BIT(shift
);
485 } else if (pull_up
) {
487 val_2
&= ~BIT(shift
);
489 val_1
&= ~BIT(shift
);
492 writel(val_1
, base
+ IPROC_GPIO_PULL_UP_OFFSET
);
493 writel(val_2
, base
+ IPROC_GPIO_PULL_DN_OFFSET
);
496 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
499 iproc_set_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
,
501 iproc_set_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
,
506 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
507 dev_dbg(chip
->dev
, "gpio:%u set pullup:%d\n", gpio
, pull_up
);
512 static void iproc_gpio_get_pull(struct iproc_gpio
*chip
, unsigned gpio
,
513 bool *disable
, bool *pull_up
)
520 raw_spin_lock_irqsave(&chip
->lock
, flags
);
521 if (chip
->io_ctrl_type
== IOCTRL_TYPE_CDRU
) {
522 base
= chip
->io_ctrl
;
523 shift
= IPROC_GPIO_SHIFT(gpio
);
525 val_1
= readl(base
+ IPROC_GPIO_PULL_UP_OFFSET
) & BIT(shift
);
526 val_2
= readl(base
+ IPROC_GPIO_PULL_DN_OFFSET
) & BIT(shift
);
528 *pull_up
= val_1
? true : false;
529 *disable
= (val_1
| val_2
) ? false : true;
532 *disable
= !iproc_get_bit(chip
, IPROC_GPIO_RES_EN_OFFSET
, gpio
);
533 *pull_up
= iproc_get_bit(chip
, IPROC_GPIO_PAD_RES_OFFSET
, gpio
);
535 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
538 #define DRV_STRENGTH_OFFSET(gpio, bit, type) ((type) == IOCTRL_TYPE_AON ? \
539 ((2 - (bit)) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
540 ((type) == IOCTRL_TYPE_CDRU) ? \
541 ((bit) * 4 + IPROC_GPIO_DRV_CTRL_OFFSET) : \
542 ((bit) * 4 + IPROC_GPIO_REG(gpio, IPROC_GPIO_ASIU_DRV0_CTRL_OFFSET)))
544 static int iproc_gpio_set_strength(struct iproc_gpio
*chip
, unsigned gpio
,
548 unsigned int i
, offset
, shift
;
552 /* make sure drive strength is supported */
553 if (strength
< 2 || strength
> 16 || (strength
% 2))
557 base
= chip
->io_ctrl
;
562 shift
= IPROC_GPIO_SHIFT(gpio
);
564 dev_dbg(chip
->dev
, "gpio:%u set drive strength:%d mA\n", gpio
,
567 raw_spin_lock_irqsave(&chip
->lock
, flags
);
568 strength
= (strength
/ 2) - 1;
569 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
570 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
571 val
= readl(base
+ offset
);
573 val
|= ((strength
>> i
) & 0x1) << shift
;
574 writel(val
, base
+ offset
);
576 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
581 static int iproc_gpio_get_strength(struct iproc_gpio
*chip
, unsigned gpio
,
585 unsigned int i
, offset
, shift
;
590 base
= chip
->io_ctrl
;
595 shift
= IPROC_GPIO_SHIFT(gpio
);
597 raw_spin_lock_irqsave(&chip
->lock
, flags
);
599 for (i
= 0; i
< GPIO_DRV_STRENGTH_BITS
; i
++) {
600 offset
= DRV_STRENGTH_OFFSET(gpio
, i
, chip
->io_ctrl_type
);
601 val
= readl(base
+ offset
) & BIT(shift
);
603 *strength
+= (val
<< i
);
607 *strength
= (*strength
+ 1) * 2;
608 raw_spin_unlock_irqrestore(&chip
->lock
, flags
);
613 static int iproc_pin_config_get(struct pinctrl_dev
*pctldev
, unsigned pin
,
614 unsigned long *config
)
616 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
617 enum pin_config_param param
= pinconf_to_config_param(*config
);
618 unsigned gpio
= iproc_pin_to_gpio(pin
);
620 bool disable
, pull_up
;
623 if (iproc_pinconf_param_is_disabled(chip
, param
))
627 case PIN_CONFIG_BIAS_DISABLE
:
628 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
634 case PIN_CONFIG_BIAS_PULL_UP
:
635 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
636 if (!disable
&& pull_up
)
641 case PIN_CONFIG_BIAS_PULL_DOWN
:
642 iproc_gpio_get_pull(chip
, gpio
, &disable
, &pull_up
);
643 if (!disable
&& !pull_up
)
648 case PIN_CONFIG_DRIVE_STRENGTH
:
649 ret
= iproc_gpio_get_strength(chip
, gpio
, &arg
);
652 *config
= pinconf_to_config_packed(param
, arg
);
663 static int iproc_pin_config_set(struct pinctrl_dev
*pctldev
, unsigned pin
,
664 unsigned long *configs
, unsigned num_configs
)
666 struct iproc_gpio
*chip
= pinctrl_dev_get_drvdata(pctldev
);
667 enum pin_config_param param
;
669 unsigned i
, gpio
= iproc_pin_to_gpio(pin
);
672 for (i
= 0; i
< num_configs
; i
++) {
673 param
= pinconf_to_config_param(configs
[i
]);
675 if (iproc_pinconf_param_is_disabled(chip
, param
))
678 arg
= pinconf_to_config_argument(configs
[i
]);
681 case PIN_CONFIG_BIAS_DISABLE
:
682 ret
= iproc_gpio_set_pull(chip
, gpio
, true, false);
687 case PIN_CONFIG_BIAS_PULL_UP
:
688 ret
= iproc_gpio_set_pull(chip
, gpio
, false, true);
693 case PIN_CONFIG_BIAS_PULL_DOWN
:
694 ret
= iproc_gpio_set_pull(chip
, gpio
, false, false);
699 case PIN_CONFIG_DRIVE_STRENGTH
:
700 ret
= iproc_gpio_set_strength(chip
, gpio
, arg
);
706 dev_err(chip
->dev
, "invalid configuration\n");
709 } /* for each config */
715 static const struct pinconf_ops iproc_pconf_ops
= {
717 .pin_config_get
= iproc_pin_config_get
,
718 .pin_config_set
= iproc_pin_config_set
,
722 * Iproc GPIO controller supports some PINCONF related configurations such as
723 * pull up, pull down, and drive strength, when the pin is configured to GPIO
725 * Here a local pinctrl device is created with simple 1-to-1 pin mapping to the
728 static int iproc_gpio_register_pinconf(struct iproc_gpio
*chip
)
730 struct pinctrl_desc
*pctldesc
= &chip
->pctldesc
;
731 struct pinctrl_pin_desc
*pins
;
732 struct gpio_chip
*gc
= &chip
->gc
;
735 pins
= devm_kcalloc(chip
->dev
, gc
->ngpio
, sizeof(*pins
), GFP_KERNEL
);
739 for (i
= 0; i
< gc
->ngpio
; i
++) {
741 pins
[i
].name
= devm_kasprintf(chip
->dev
, GFP_KERNEL
,
747 pctldesc
->name
= dev_name(chip
->dev
);
748 pctldesc
->pctlops
= &iproc_pctrl_ops
;
749 pctldesc
->pins
= pins
;
750 pctldesc
->npins
= gc
->ngpio
;
751 pctldesc
->confops
= &iproc_pconf_ops
;
753 chip
->pctl
= devm_pinctrl_register(chip
->dev
, pctldesc
, chip
);
754 if (IS_ERR(chip
->pctl
)) {
755 dev_err(chip
->dev
, "unable to register pinctrl device\n");
756 return PTR_ERR(chip
->pctl
);
762 static const struct of_device_id iproc_gpio_of_match
[] = {
763 { .compatible
= "brcm,iproc-gpio" },
764 { .compatible
= "brcm,cygnus-ccm-gpio" },
765 { .compatible
= "brcm,cygnus-asiu-gpio" },
766 { .compatible
= "brcm,cygnus-crmu-gpio" },
767 { .compatible
= "brcm,iproc-nsp-gpio" },
768 { .compatible
= "brcm,iproc-stingray-gpio" },
772 static int iproc_gpio_probe(struct platform_device
*pdev
)
774 struct device
*dev
= &pdev
->dev
;
775 struct resource
*res
;
776 struct iproc_gpio
*chip
;
777 struct gpio_chip
*gc
;
778 u32 ngpios
, pinconf_disable_mask
= 0;
780 bool no_pinconf
= false;
781 enum iproc_pinconf_ctrl_type io_ctrl_type
= IOCTRL_TYPE_INVALID
;
783 /* NSP does not support drive strength config */
784 if (of_device_is_compatible(dev
->of_node
, "brcm,iproc-nsp-gpio"))
785 pinconf_disable_mask
= BIT(IPROC_PINCONF_DRIVE_STRENGTH
);
786 /* Stingray does not support pinconf in this controller */
787 else if (of_device_is_compatible(dev
->of_node
,
788 "brcm,iproc-stingray-gpio"))
791 chip
= devm_kzalloc(dev
, sizeof(*chip
), GFP_KERNEL
);
796 platform_set_drvdata(pdev
, chip
);
798 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
799 chip
->base
= devm_ioremap_resource(dev
, res
);
800 if (IS_ERR(chip
->base
)) {
801 dev_err(dev
, "unable to map I/O memory\n");
802 return PTR_ERR(chip
->base
);
805 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 1);
807 chip
->io_ctrl
= devm_ioremap_resource(dev
, res
);
808 if (IS_ERR(chip
->io_ctrl
)) {
809 dev_err(dev
, "unable to map I/O memory\n");
810 return PTR_ERR(chip
->io_ctrl
);
812 if (of_device_is_compatible(dev
->of_node
,
813 "brcm,cygnus-ccm-gpio"))
814 io_ctrl_type
= IOCTRL_TYPE_CDRU
;
816 io_ctrl_type
= IOCTRL_TYPE_AON
;
819 chip
->io_ctrl_type
= io_ctrl_type
;
821 if (of_property_read_u32(dev
->of_node
, "ngpios", &ngpios
)) {
822 dev_err(&pdev
->dev
, "missing ngpios DT property\n");
826 raw_spin_lock_init(&chip
->lock
);
831 chip
->num_banks
= (ngpios
+ NGPIOS_PER_BANK
- 1) / NGPIOS_PER_BANK
;
832 gc
->label
= dev_name(dev
);
834 gc
->of_node
= dev
->of_node
;
835 gc
->request
= iproc_gpio_request
;
836 gc
->free
= iproc_gpio_free
;
837 gc
->direction_input
= iproc_gpio_direction_input
;
838 gc
->direction_output
= iproc_gpio_direction_output
;
839 gc
->get_direction
= iproc_gpio_get_direction
;
840 gc
->set
= iproc_gpio_set
;
841 gc
->get
= iproc_gpio_get
;
843 chip
->pinmux_is_supported
= of_property_read_bool(dev
->of_node
,
846 /* optional GPIO interrupt support */
847 irq
= platform_get_irq(pdev
, 0);
849 struct irq_chip
*irqc
;
850 struct gpio_irq_chip
*girq
;
852 irqc
= &chip
->irqchip
;
853 irqc
->name
= "bcm-iproc-gpio";
854 irqc
->irq_ack
= iproc_gpio_irq_ack
;
855 irqc
->irq_mask
= iproc_gpio_irq_mask
;
856 irqc
->irq_unmask
= iproc_gpio_irq_unmask
;
857 irqc
->irq_set_type
= iproc_gpio_irq_set_type
;
858 irqc
->irq_enable
= iproc_gpio_irq_unmask
;
859 irqc
->irq_disable
= iproc_gpio_irq_mask
;
863 girq
->parent_handler
= iproc_gpio_irq_handler
;
864 girq
->num_parents
= 1;
865 girq
->parents
= devm_kcalloc(dev
, 1,
866 sizeof(*girq
->parents
),
870 girq
->parents
[0] = irq
;
871 girq
->default_type
= IRQ_TYPE_NONE
;
872 girq
->handler
= handle_simple_irq
;
875 ret
= gpiochip_add_data(gc
, chip
);
877 dev_err(dev
, "unable to add GPIO chip\n");
882 ret
= iproc_gpio_register_pinconf(chip
);
884 dev_err(dev
, "unable to register pinconf\n");
885 goto err_rm_gpiochip
;
888 if (pinconf_disable_mask
) {
889 ret
= iproc_pinconf_disable_map_create(chip
,
890 pinconf_disable_mask
);
893 "unable to create pinconf disable map\n");
894 goto err_rm_gpiochip
;
907 static struct platform_driver iproc_gpio_driver
= {
909 .name
= "iproc-gpio",
910 .of_match_table
= iproc_gpio_of_match
,
912 .probe
= iproc_gpio_probe
,
915 static int __init
iproc_gpio_init(void)
917 return platform_driver_register(&iproc_gpio_driver
);
919 arch_initcall_sync(iproc_gpio_init
);