1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2015, Sony Mobile Communications AB.
4 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
7 #include <linux/gpio/driver.h>
8 #include <linux/interrupt.h>
9 #include <linux/module.h>
11 #include <linux/of_irq.h>
12 #include <linux/platform_device.h>
13 #include <linux/regmap.h>
14 #include <linux/seq_file.h>
15 #include <linux/slab.h>
17 #include <linux/pinctrl/pinconf-generic.h>
18 #include <linux/pinctrl/pinconf.h>
19 #include <linux/pinctrl/pinctrl.h>
20 #include <linux/pinctrl/pinmux.h>
22 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
25 #include "../pinctrl-utils.h"
28 #define PM8XXX_GPIO_MODE_ENABLED BIT(0)
29 #define PM8XXX_GPIO_MODE_INPUT 0
30 #define PM8XXX_GPIO_MODE_OUTPUT 2
33 #define PM8XXX_GPIO_PUSH_PULL 0
34 #define PM8XXX_GPIO_OPEN_DRAIN 1
37 #define PM8XXX_GPIO_BIAS_PU_30 0
38 #define PM8XXX_GPIO_BIAS_PU_1P5 1
39 #define PM8XXX_GPIO_BIAS_PU_31P5 2
40 #define PM8XXX_GPIO_BIAS_PU_1P5_30 3
41 #define PM8XXX_GPIO_BIAS_PD 4
42 #define PM8XXX_GPIO_BIAS_NP 5
45 #define SSBI_REG_ADDR_GPIO_BASE 0x150
46 #define SSBI_REG_ADDR_GPIO(n) (SSBI_REG_ADDR_GPIO_BASE + n)
48 #define PM8XXX_BANK_WRITE BIT(7)
50 #define PM8XXX_MAX_GPIOS 44
52 #define PM8XXX_GPIO_PHYSICAL_OFFSET 1
54 /* custom pinconf parameters */
55 #define PM8XXX_QCOM_DRIVE_STRENGH (PIN_CONFIG_END + 1)
56 #define PM8XXX_QCOM_PULL_UP_STRENGTH (PIN_CONFIG_END + 2)
59 * struct pm8xxx_pin_data - dynamic configuration for a pin
60 * @reg: address of the control register
61 * @power_source: logical selected voltage source, mapping in static data
62 * is used translate to register values
63 * @mode: operating mode for the pin (input/output)
64 * @open_drain: output buffer configured as open-drain (vs push-pull)
65 * @output_value: configured output value
66 * @bias: register view of configured bias
67 * @pull_up_strength: placeholder for selected pull up strength
68 * only used to configure bias when pull up is selected
69 * @output_strength: selector of output-strength
70 * @disable: pin disabled / configured as tristate
71 * @function: pinmux selector
72 * @inverted: pin logic is inverted
74 struct pm8xxx_pin_data
{
90 struct regmap
*regmap
;
91 struct pinctrl_dev
*pctrl
;
92 struct gpio_chip chip
;
94 struct pinctrl_desc desc
;
98 static const struct pinconf_generic_params pm8xxx_gpio_bindings
[] = {
99 {"qcom,drive-strength", PM8XXX_QCOM_DRIVE_STRENGH
, 0},
100 {"qcom,pull-up-strength", PM8XXX_QCOM_PULL_UP_STRENGTH
, 0},
103 #ifdef CONFIG_DEBUG_FS
104 static const struct pin_config_item pm8xxx_conf_items
[ARRAY_SIZE(pm8xxx_gpio_bindings
)] = {
105 PCONFDUMP(PM8XXX_QCOM_DRIVE_STRENGH
, "drive-strength", NULL
, true),
106 PCONFDUMP(PM8XXX_QCOM_PULL_UP_STRENGTH
, "pull up strength", NULL
, true),
110 static const char * const pm8xxx_groups
[PM8XXX_MAX_GPIOS
] = {
111 "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
112 "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
113 "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
114 "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
115 "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
116 "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
120 static const char * const pm8xxx_gpio_functions
[] = {
121 PMIC_GPIO_FUNC_NORMAL
, PMIC_GPIO_FUNC_PAIRED
,
122 PMIC_GPIO_FUNC_FUNC1
, PMIC_GPIO_FUNC_FUNC2
,
123 PMIC_GPIO_FUNC_DTEST1
, PMIC_GPIO_FUNC_DTEST2
,
124 PMIC_GPIO_FUNC_DTEST3
, PMIC_GPIO_FUNC_DTEST4
,
127 static int pm8xxx_read_bank(struct pm8xxx_gpio
*pctrl
,
128 struct pm8xxx_pin_data
*pin
, int bank
)
130 unsigned int val
= bank
<< 4;
133 ret
= regmap_write(pctrl
->regmap
, pin
->reg
, val
);
135 dev_err(pctrl
->dev
, "failed to select bank %d\n", bank
);
139 ret
= regmap_read(pctrl
->regmap
, pin
->reg
, &val
);
141 dev_err(pctrl
->dev
, "failed to read register %d\n", bank
);
148 static int pm8xxx_write_bank(struct pm8xxx_gpio
*pctrl
,
149 struct pm8xxx_pin_data
*pin
,
155 val
|= PM8XXX_BANK_WRITE
;
158 ret
= regmap_write(pctrl
->regmap
, pin
->reg
, val
);
160 dev_err(pctrl
->dev
, "failed to write register\n");
165 static int pm8xxx_get_groups_count(struct pinctrl_dev
*pctldev
)
167 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
172 static const char *pm8xxx_get_group_name(struct pinctrl_dev
*pctldev
,
175 return pm8xxx_groups
[group
];
179 static int pm8xxx_get_group_pins(struct pinctrl_dev
*pctldev
,
181 const unsigned **pins
,
184 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
186 *pins
= &pctrl
->desc
.pins
[group
].number
;
192 static const struct pinctrl_ops pm8xxx_pinctrl_ops
= {
193 .get_groups_count
= pm8xxx_get_groups_count
,
194 .get_group_name
= pm8xxx_get_group_name
,
195 .get_group_pins
= pm8xxx_get_group_pins
,
196 .dt_node_to_map
= pinconf_generic_dt_node_to_map_group
,
197 .dt_free_map
= pinctrl_utils_free_map
,
200 static int pm8xxx_get_functions_count(struct pinctrl_dev
*pctldev
)
202 return ARRAY_SIZE(pm8xxx_gpio_functions
);
205 static const char *pm8xxx_get_function_name(struct pinctrl_dev
*pctldev
,
208 return pm8xxx_gpio_functions
[function
];
211 static int pm8xxx_get_function_groups(struct pinctrl_dev
*pctldev
,
213 const char * const **groups
,
214 unsigned * const num_groups
)
216 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
218 *groups
= pm8xxx_groups
;
219 *num_groups
= pctrl
->npins
;
223 static int pm8xxx_pinmux_set_mux(struct pinctrl_dev
*pctldev
,
227 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
228 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[group
].drv_data
;
231 pin
->function
= function
;
232 val
= pin
->function
<< 1;
234 pm8xxx_write_bank(pctrl
, pin
, 4, val
);
239 static const struct pinmux_ops pm8xxx_pinmux_ops
= {
240 .get_functions_count
= pm8xxx_get_functions_count
,
241 .get_function_name
= pm8xxx_get_function_name
,
242 .get_function_groups
= pm8xxx_get_function_groups
,
243 .set_mux
= pm8xxx_pinmux_set_mux
,
246 static int pm8xxx_pin_config_get(struct pinctrl_dev
*pctldev
,
248 unsigned long *config
)
250 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
251 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
252 unsigned param
= pinconf_to_config_param(*config
);
256 case PIN_CONFIG_BIAS_DISABLE
:
257 if (pin
->bias
!= PM8XXX_GPIO_BIAS_NP
)
261 case PIN_CONFIG_BIAS_PULL_DOWN
:
262 if (pin
->bias
!= PM8XXX_GPIO_BIAS_PD
)
266 case PIN_CONFIG_BIAS_PULL_UP
:
267 if (pin
->bias
> PM8XXX_GPIO_BIAS_PU_1P5_30
)
271 case PM8XXX_QCOM_PULL_UP_STRENGTH
:
272 arg
= pin
->pull_up_strength
;
274 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE
:
279 case PIN_CONFIG_INPUT_ENABLE
:
280 if (pin
->mode
!= PM8XXX_GPIO_MODE_INPUT
)
284 case PIN_CONFIG_OUTPUT
:
285 if (pin
->mode
& PM8XXX_GPIO_MODE_OUTPUT
)
286 arg
= pin
->output_value
;
290 case PIN_CONFIG_POWER_SOURCE
:
291 arg
= pin
->power_source
;
293 case PM8XXX_QCOM_DRIVE_STRENGH
:
294 arg
= pin
->output_strength
;
296 case PIN_CONFIG_DRIVE_PUSH_PULL
:
301 case PIN_CONFIG_DRIVE_OPEN_DRAIN
:
302 if (!pin
->open_drain
)
310 *config
= pinconf_to_config_packed(param
, arg
);
315 static int pm8xxx_pin_config_set(struct pinctrl_dev
*pctldev
,
317 unsigned long *configs
,
318 unsigned num_configs
)
320 struct pm8xxx_gpio
*pctrl
= pinctrl_dev_get_drvdata(pctldev
);
321 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
328 for (i
= 0; i
< num_configs
; i
++) {
329 param
= pinconf_to_config_param(configs
[i
]);
330 arg
= pinconf_to_config_argument(configs
[i
]);
333 case PIN_CONFIG_BIAS_DISABLE
:
334 pin
->bias
= PM8XXX_GPIO_BIAS_NP
;
339 case PIN_CONFIG_BIAS_PULL_DOWN
:
340 pin
->bias
= PM8XXX_GPIO_BIAS_PD
;
345 case PM8XXX_QCOM_PULL_UP_STRENGTH
:
346 if (arg
> PM8XXX_GPIO_BIAS_PU_1P5_30
) {
347 dev_err(pctrl
->dev
, "invalid pull-up strength\n");
350 pin
->pull_up_strength
= arg
;
352 case PIN_CONFIG_BIAS_PULL_UP
:
353 pin
->bias
= pin
->pull_up_strength
;
358 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE
:
362 case PIN_CONFIG_INPUT_ENABLE
:
363 pin
->mode
= PM8XXX_GPIO_MODE_INPUT
;
364 banks
|= BIT(0) | BIT(1);
366 case PIN_CONFIG_OUTPUT
:
367 pin
->mode
= PM8XXX_GPIO_MODE_OUTPUT
;
368 pin
->output_value
= !!arg
;
369 banks
|= BIT(0) | BIT(1);
371 case PIN_CONFIG_POWER_SOURCE
:
372 pin
->power_source
= arg
;
375 case PM8XXX_QCOM_DRIVE_STRENGH
:
376 if (arg
> PMIC_GPIO_STRENGTH_LOW
) {
377 dev_err(pctrl
->dev
, "invalid drive strength\n");
380 pin
->output_strength
= arg
;
383 case PIN_CONFIG_DRIVE_PUSH_PULL
:
387 case PIN_CONFIG_DRIVE_OPEN_DRAIN
:
393 "unsupported config parameter: %x\n",
399 if (banks
& BIT(0)) {
400 val
= pin
->power_source
<< 1;
401 val
|= PM8XXX_GPIO_MODE_ENABLED
;
402 pm8xxx_write_bank(pctrl
, pin
, 0, val
);
405 if (banks
& BIT(1)) {
406 val
= pin
->mode
<< 2;
407 val
|= pin
->open_drain
<< 1;
408 val
|= pin
->output_value
;
409 pm8xxx_write_bank(pctrl
, pin
, 1, val
);
412 if (banks
& BIT(2)) {
413 val
= pin
->bias
<< 1;
414 pm8xxx_write_bank(pctrl
, pin
, 2, val
);
417 if (banks
& BIT(3)) {
418 val
= pin
->output_strength
<< 2;
420 pm8xxx_write_bank(pctrl
, pin
, 3, val
);
423 if (banks
& BIT(4)) {
424 val
= pin
->function
<< 1;
425 pm8xxx_write_bank(pctrl
, pin
, 4, val
);
428 if (banks
& BIT(5)) {
432 pm8xxx_write_bank(pctrl
, pin
, 5, val
);
438 static const struct pinconf_ops pm8xxx_pinconf_ops
= {
440 .pin_config_group_get
= pm8xxx_pin_config_get
,
441 .pin_config_group_set
= pm8xxx_pin_config_set
,
444 static const struct pinctrl_desc pm8xxx_pinctrl_desc
= {
445 .name
= "pm8xxx_gpio",
446 .pctlops
= &pm8xxx_pinctrl_ops
,
447 .pmxops
= &pm8xxx_pinmux_ops
,
448 .confops
= &pm8xxx_pinconf_ops
,
449 .owner
= THIS_MODULE
,
452 static int pm8xxx_gpio_direction_input(struct gpio_chip
*chip
,
455 struct pm8xxx_gpio
*pctrl
= gpiochip_get_data(chip
);
456 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
459 pin
->mode
= PM8XXX_GPIO_MODE_INPUT
;
460 val
= pin
->mode
<< 2;
462 pm8xxx_write_bank(pctrl
, pin
, 1, val
);
467 static int pm8xxx_gpio_direction_output(struct gpio_chip
*chip
,
471 struct pm8xxx_gpio
*pctrl
= gpiochip_get_data(chip
);
472 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
475 pin
->mode
= PM8XXX_GPIO_MODE_OUTPUT
;
476 pin
->output_value
= !!value
;
478 val
= pin
->mode
<< 2;
479 val
|= pin
->open_drain
<< 1;
480 val
|= pin
->output_value
;
482 pm8xxx_write_bank(pctrl
, pin
, 1, val
);
487 static int pm8xxx_gpio_get(struct gpio_chip
*chip
, unsigned offset
)
489 struct pm8xxx_gpio
*pctrl
= gpiochip_get_data(chip
);
490 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
494 if (pin
->mode
== PM8XXX_GPIO_MODE_OUTPUT
)
495 return pin
->output_value
;
497 irq
= chip
->to_irq(chip
, offset
);
499 ret
= irq_get_irqchip_state(irq
, IRQCHIP_STATE_LINE_LEVEL
,
509 static void pm8xxx_gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
511 struct pm8xxx_gpio
*pctrl
= gpiochip_get_data(chip
);
512 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
515 pin
->output_value
= !!value
;
517 val
= pin
->mode
<< 2;
518 val
|= pin
->open_drain
<< 1;
519 val
|= pin
->output_value
;
521 pm8xxx_write_bank(pctrl
, pin
, 1, val
);
524 static int pm8xxx_gpio_of_xlate(struct gpio_chip
*chip
,
525 const struct of_phandle_args
*gpio_desc
,
528 if (chip
->of_gpio_n_cells
< 2)
532 *flags
= gpio_desc
->args
[1];
534 return gpio_desc
->args
[0] - PM8XXX_GPIO_PHYSICAL_OFFSET
;
538 #ifdef CONFIG_DEBUG_FS
540 static void pm8xxx_gpio_dbg_show_one(struct seq_file
*s
,
541 struct pinctrl_dev
*pctldev
,
542 struct gpio_chip
*chip
,
546 struct pm8xxx_gpio
*pctrl
= gpiochip_get_data(chip
);
547 struct pm8xxx_pin_data
*pin
= pctrl
->desc
.pins
[offset
].drv_data
;
549 static const char * const modes
[] = {
550 "in", "both", "out", "off"
552 static const char * const biases
[] = {
553 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
554 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
556 static const char * const buffer_types
[] = {
557 "push-pull", "open-drain"
559 static const char * const strengths
[] = {
560 "no", "high", "medium", "low"
563 seq_printf(s
, " gpio%-2d:", offset
+ PM8XXX_GPIO_PHYSICAL_OFFSET
);
567 seq_printf(s
, " %-4s", modes
[pin
->mode
]);
568 seq_printf(s
, " %-7s", pm8xxx_gpio_functions
[pin
->function
]);
569 seq_printf(s
, " VIN%d", pin
->power_source
);
570 seq_printf(s
, " %-27s", biases
[pin
->bias
]);
571 seq_printf(s
, " %-10s", buffer_types
[pin
->open_drain
]);
572 seq_printf(s
, " %-4s", pin
->output_value
? "high" : "low");
573 seq_printf(s
, " %-7s", strengths
[pin
->output_strength
]);
575 seq_puts(s
, " inverted");
579 static void pm8xxx_gpio_dbg_show(struct seq_file
*s
, struct gpio_chip
*chip
)
581 unsigned gpio
= chip
->base
;
584 for (i
= 0; i
< chip
->ngpio
; i
++, gpio
++) {
585 pm8xxx_gpio_dbg_show_one(s
, NULL
, chip
, i
, gpio
);
591 #define pm8xxx_gpio_dbg_show NULL
594 static const struct gpio_chip pm8xxx_gpio_template
= {
595 .direction_input
= pm8xxx_gpio_direction_input
,
596 .direction_output
= pm8xxx_gpio_direction_output
,
597 .get
= pm8xxx_gpio_get
,
598 .set
= pm8xxx_gpio_set
,
599 .of_xlate
= pm8xxx_gpio_of_xlate
,
600 .dbg_show
= pm8xxx_gpio_dbg_show
,
601 .owner
= THIS_MODULE
,
604 static int pm8xxx_pin_populate(struct pm8xxx_gpio
*pctrl
,
605 struct pm8xxx_pin_data
*pin
)
609 val
= pm8xxx_read_bank(pctrl
, pin
, 0);
613 pin
->power_source
= (val
>> 1) & 0x7;
615 val
= pm8xxx_read_bank(pctrl
, pin
, 1);
619 pin
->mode
= (val
>> 2) & 0x3;
620 pin
->open_drain
= !!(val
& BIT(1));
621 pin
->output_value
= val
& BIT(0);
623 val
= pm8xxx_read_bank(pctrl
, pin
, 2);
627 pin
->bias
= (val
>> 1) & 0x7;
628 if (pin
->bias
<= PM8XXX_GPIO_BIAS_PU_1P5_30
)
629 pin
->pull_up_strength
= pin
->bias
;
631 pin
->pull_up_strength
= PM8XXX_GPIO_BIAS_PU_30
;
633 val
= pm8xxx_read_bank(pctrl
, pin
, 3);
637 pin
->output_strength
= (val
>> 2) & 0x3;
638 pin
->disable
= val
& BIT(0);
640 val
= pm8xxx_read_bank(pctrl
, pin
, 4);
644 pin
->function
= (val
>> 1) & 0x7;
646 val
= pm8xxx_read_bank(pctrl
, pin
, 5);
650 pin
->inverted
= !(val
& BIT(3));
655 static void pm8xxx_irq_disable(struct irq_data
*d
)
657 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
659 gpiochip_disable_irq(gc
, irqd_to_hwirq(d
));
662 static void pm8xxx_irq_enable(struct irq_data
*d
)
664 struct gpio_chip
*gc
= irq_data_get_irq_chip_data(d
);
666 gpiochip_enable_irq(gc
, irqd_to_hwirq(d
));
669 static const struct irq_chip pm8xxx_irq_chip
= {
671 .irq_mask_ack
= irq_chip_mask_ack_parent
,
672 .irq_unmask
= irq_chip_unmask_parent
,
673 .irq_disable
= pm8xxx_irq_disable
,
674 .irq_enable
= pm8xxx_irq_enable
,
675 .irq_set_type
= irq_chip_set_type_parent
,
676 .flags
= IRQCHIP_MASK_ON_SUSPEND
| IRQCHIP_SKIP_SET_WAKE
|
678 GPIOCHIP_IRQ_RESOURCE_HELPERS
,
681 static int pm8xxx_domain_translate(struct irq_domain
*domain
,
682 struct irq_fwspec
*fwspec
,
683 unsigned long *hwirq
,
686 struct pm8xxx_gpio
*pctrl
= container_of(domain
->host_data
,
687 struct pm8xxx_gpio
, chip
);
689 if (fwspec
->param_count
!= 2 || fwspec
->param
[0] < 1 ||
690 fwspec
->param
[0] > pctrl
->chip
.ngpio
)
693 *hwirq
= fwspec
->param
[0] - PM8XXX_GPIO_PHYSICAL_OFFSET
;
694 *type
= fwspec
->param
[1];
699 static unsigned int pm8xxx_child_offset_to_irq(struct gpio_chip
*chip
,
702 return offset
+ PM8XXX_GPIO_PHYSICAL_OFFSET
;
705 static int pm8xxx_child_to_parent_hwirq(struct gpio_chip
*chip
,
706 unsigned int child_hwirq
,
707 unsigned int child_type
,
708 unsigned int *parent_hwirq
,
709 unsigned int *parent_type
)
711 *parent_hwirq
= child_hwirq
+ 0xc0;
712 *parent_type
= child_type
;
717 static const struct of_device_id pm8xxx_gpio_of_match
[] = {
718 { .compatible
= "qcom,pm8018-gpio", .data
= (void *) 6 },
719 { .compatible
= "qcom,pm8038-gpio", .data
= (void *) 12 },
720 { .compatible
= "qcom,pm8058-gpio", .data
= (void *) 44 },
721 { .compatible
= "qcom,pm8917-gpio", .data
= (void *) 38 },
722 { .compatible
= "qcom,pm8921-gpio", .data
= (void *) 44 },
725 MODULE_DEVICE_TABLE(of
, pm8xxx_gpio_of_match
);
727 static int pm8xxx_gpio_probe(struct platform_device
*pdev
)
729 struct pm8xxx_pin_data
*pin_data
;
730 struct irq_domain
*parent_domain
;
731 struct device_node
*parent_node
;
732 struct pinctrl_pin_desc
*pins
;
733 struct gpio_irq_chip
*girq
;
734 struct pm8xxx_gpio
*pctrl
;
737 pctrl
= devm_kzalloc(&pdev
->dev
, sizeof(*pctrl
), GFP_KERNEL
);
741 pctrl
->dev
= &pdev
->dev
;
742 pctrl
->npins
= (uintptr_t) device_get_match_data(&pdev
->dev
);
744 pctrl
->regmap
= dev_get_regmap(pdev
->dev
.parent
, NULL
);
745 if (!pctrl
->regmap
) {
746 dev_err(&pdev
->dev
, "parent regmap unavailable\n");
750 pctrl
->desc
= pm8xxx_pinctrl_desc
;
751 pctrl
->desc
.npins
= pctrl
->npins
;
753 pins
= devm_kcalloc(&pdev
->dev
,
755 sizeof(struct pinctrl_pin_desc
),
760 pin_data
= devm_kcalloc(&pdev
->dev
,
762 sizeof(struct pm8xxx_pin_data
),
767 for (i
= 0; i
< pctrl
->desc
.npins
; i
++) {
768 pin_data
[i
].reg
= SSBI_REG_ADDR_GPIO(i
);
770 ret
= pm8xxx_pin_populate(pctrl
, &pin_data
[i
]);
775 pins
[i
].name
= pm8xxx_groups
[i
];
776 pins
[i
].drv_data
= &pin_data
[i
];
778 pctrl
->desc
.pins
= pins
;
780 pctrl
->desc
.num_custom_params
= ARRAY_SIZE(pm8xxx_gpio_bindings
);
781 pctrl
->desc
.custom_params
= pm8xxx_gpio_bindings
;
782 #ifdef CONFIG_DEBUG_FS
783 pctrl
->desc
.custom_conf_items
= pm8xxx_conf_items
;
786 pctrl
->pctrl
= devm_pinctrl_register(&pdev
->dev
, &pctrl
->desc
, pctrl
);
787 if (IS_ERR(pctrl
->pctrl
)) {
788 dev_err(&pdev
->dev
, "couldn't register pm8xxx gpio driver\n");
789 return PTR_ERR(pctrl
->pctrl
);
792 pctrl
->chip
= pm8xxx_gpio_template
;
793 pctrl
->chip
.base
= -1;
794 pctrl
->chip
.parent
= &pdev
->dev
;
795 pctrl
->chip
.of_gpio_n_cells
= 2;
796 pctrl
->chip
.label
= dev_name(pctrl
->dev
);
797 pctrl
->chip
.ngpio
= pctrl
->npins
;
799 parent_node
= of_irq_find_parent(pctrl
->dev
->of_node
);
803 parent_domain
= irq_find_host(parent_node
);
804 of_node_put(parent_node
);
808 girq
= &pctrl
->chip
.irq
;
809 gpio_irq_chip_set_chip(girq
, &pm8xxx_irq_chip
);
810 girq
->default_type
= IRQ_TYPE_NONE
;
811 girq
->handler
= handle_level_irq
;
812 girq
->fwnode
= dev_fwnode(pctrl
->dev
);
813 girq
->parent_domain
= parent_domain
;
814 girq
->child_to_parent_hwirq
= pm8xxx_child_to_parent_hwirq
;
815 girq
->populate_parent_alloc_arg
= gpiochip_populate_parent_fwspec_twocell
;
816 girq
->child_offset_to_irq
= pm8xxx_child_offset_to_irq
;
817 girq
->child_irq_domain_ops
.translate
= pm8xxx_domain_translate
;
819 ret
= gpiochip_add_data(&pctrl
->chip
, pctrl
);
821 dev_err(&pdev
->dev
, "failed register gpiochip\n");
826 * For DeviceTree-supported systems, the gpio core checks the
827 * pinctrl's device node for the "gpio-ranges" property.
828 * If it is present, it takes care of adding the pin ranges
829 * for the driver. In this case the driver can skip ahead.
831 * In order to remain compatible with older, existing DeviceTree
832 * files which don't set the "gpio-ranges" property or systems that
833 * utilize ACPI the driver has to call gpiochip_add_pin_range().
835 if (!of_property_present(pctrl
->dev
->of_node
, "gpio-ranges")) {
836 ret
= gpiochip_add_pin_range(&pctrl
->chip
, dev_name(pctrl
->dev
),
837 0, 0, pctrl
->chip
.ngpio
);
839 dev_err(pctrl
->dev
, "failed to add pin range\n");
840 goto unregister_gpiochip
;
844 platform_set_drvdata(pdev
, pctrl
);
846 dev_dbg(&pdev
->dev
, "Qualcomm pm8xxx gpio driver probed\n");
851 gpiochip_remove(&pctrl
->chip
);
856 static void pm8xxx_gpio_remove(struct platform_device
*pdev
)
858 struct pm8xxx_gpio
*pctrl
= platform_get_drvdata(pdev
);
860 gpiochip_remove(&pctrl
->chip
);
863 static struct platform_driver pm8xxx_gpio_driver
= {
865 .name
= "qcom-ssbi-gpio",
866 .of_match_table
= pm8xxx_gpio_of_match
,
868 .probe
= pm8xxx_gpio_probe
,
869 .remove
= pm8xxx_gpio_remove
,
872 module_platform_driver(pm8xxx_gpio_driver
);
874 MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
875 MODULE_DESCRIPTION("Qualcomm PM8xxx GPIO driver");
876 MODULE_LICENSE("GPL v2");