xhci: Increase STS_HALT timeout in xhci_suspend()
[linux/fpc-iii.git] / drivers / pinctrl / qcom / pinctrl-ssbi-gpio.c
blobc1f7d0799ebedcf9d56ae967afcb0a85f73a454f
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2015, Sony Mobile Communications AB.
4 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
5 */
7 #include <linux/module.h>
8 #include <linux/platform_device.h>
9 #include <linux/pinctrl/pinctrl.h>
10 #include <linux/pinctrl/pinmux.h>
11 #include <linux/pinctrl/pinconf.h>
12 #include <linux/pinctrl/pinconf-generic.h>
13 #include <linux/slab.h>
14 #include <linux/regmap.h>
15 #include <linux/gpio/driver.h>
16 #include <linux/interrupt.h>
17 #include <linux/of_device.h>
18 #include <linux/of_irq.h>
20 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
22 #include "../core.h"
23 #include "../pinctrl-utils.h"
25 /* mode */
26 #define PM8XXX_GPIO_MODE_ENABLED BIT(0)
27 #define PM8XXX_GPIO_MODE_INPUT 0
28 #define PM8XXX_GPIO_MODE_OUTPUT 2
30 /* output buffer */
31 #define PM8XXX_GPIO_PUSH_PULL 0
32 #define PM8XXX_GPIO_OPEN_DRAIN 1
34 /* bias */
35 #define PM8XXX_GPIO_BIAS_PU_30 0
36 #define PM8XXX_GPIO_BIAS_PU_1P5 1
37 #define PM8XXX_GPIO_BIAS_PU_31P5 2
38 #define PM8XXX_GPIO_BIAS_PU_1P5_30 3
39 #define PM8XXX_GPIO_BIAS_PD 4
40 #define PM8XXX_GPIO_BIAS_NP 5
42 /* GPIO registers */
43 #define SSBI_REG_ADDR_GPIO_BASE 0x150
44 #define SSBI_REG_ADDR_GPIO(n) (SSBI_REG_ADDR_GPIO_BASE + n)
46 #define PM8XXX_BANK_WRITE BIT(7)
48 #define PM8XXX_MAX_GPIOS 44
50 #define PM8XXX_GPIO_PHYSICAL_OFFSET 1
52 /* custom pinconf parameters */
53 #define PM8XXX_QCOM_DRIVE_STRENGH (PIN_CONFIG_END + 1)
54 #define PM8XXX_QCOM_PULL_UP_STRENGTH (PIN_CONFIG_END + 2)
56 /**
57 * struct pm8xxx_pin_data - dynamic configuration for a pin
58 * @reg: address of the control register
59 * @irq: IRQ from the PMIC interrupt controller
60 * @power_source: logical selected voltage source, mapping in static data
61 * is used translate to register values
62 * @mode: operating mode for the pin (input/output)
63 * @open_drain: output buffer configured as open-drain (vs push-pull)
64 * @output_value: configured output value
65 * @bias: register view of configured bias
66 * @pull_up_strength: placeholder for selected pull up strength
67 * only used to configure bias when pull up is selected
68 * @output_strength: selector of output-strength
69 * @disable: pin disabled / configured as tristate
70 * @function: pinmux selector
71 * @inverted: pin logic is inverted
73 struct pm8xxx_pin_data {
74 unsigned reg;
75 int irq;
76 u8 power_source;
77 u8 mode;
78 bool open_drain;
79 bool output_value;
80 u8 bias;
81 u8 pull_up_strength;
82 u8 output_strength;
83 bool disable;
84 u8 function;
85 bool inverted;
88 struct pm8xxx_gpio {
89 struct device *dev;
90 struct regmap *regmap;
91 struct pinctrl_dev *pctrl;
92 struct gpio_chip chip;
94 struct pinctrl_desc desc;
95 unsigned npins;
97 struct fwnode_handle *fwnode;
98 struct irq_domain *domain;
101 static const struct pinconf_generic_params pm8xxx_gpio_bindings[] = {
102 {"qcom,drive-strength", PM8XXX_QCOM_DRIVE_STRENGH, 0},
103 {"qcom,pull-up-strength", PM8XXX_QCOM_PULL_UP_STRENGTH, 0},
106 #ifdef CONFIG_DEBUG_FS
107 static const struct pin_config_item pm8xxx_conf_items[ARRAY_SIZE(pm8xxx_gpio_bindings)] = {
108 PCONFDUMP(PM8XXX_QCOM_DRIVE_STRENGH, "drive-strength", NULL, true),
109 PCONFDUMP(PM8XXX_QCOM_PULL_UP_STRENGTH, "pull up strength", NULL, true),
111 #endif
113 static const char * const pm8xxx_groups[PM8XXX_MAX_GPIOS] = {
114 "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8",
115 "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15",
116 "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
117 "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", "gpio29",
118 "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", "gpio36",
119 "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", "gpio43",
120 "gpio44",
123 static const char * const pm8xxx_gpio_functions[] = {
124 PMIC_GPIO_FUNC_NORMAL, PMIC_GPIO_FUNC_PAIRED,
125 PMIC_GPIO_FUNC_FUNC1, PMIC_GPIO_FUNC_FUNC2,
126 PMIC_GPIO_FUNC_DTEST1, PMIC_GPIO_FUNC_DTEST2,
127 PMIC_GPIO_FUNC_DTEST3, PMIC_GPIO_FUNC_DTEST4,
130 static int pm8xxx_read_bank(struct pm8xxx_gpio *pctrl,
131 struct pm8xxx_pin_data *pin, int bank)
133 unsigned int val = bank << 4;
134 int ret;
136 ret = regmap_write(pctrl->regmap, pin->reg, val);
137 if (ret) {
138 dev_err(pctrl->dev, "failed to select bank %d\n", bank);
139 return ret;
142 ret = regmap_read(pctrl->regmap, pin->reg, &val);
143 if (ret) {
144 dev_err(pctrl->dev, "failed to read register %d\n", bank);
145 return ret;
148 return val;
151 static int pm8xxx_write_bank(struct pm8xxx_gpio *pctrl,
152 struct pm8xxx_pin_data *pin,
153 int bank,
154 u8 val)
156 int ret;
158 val |= PM8XXX_BANK_WRITE;
159 val |= bank << 4;
161 ret = regmap_write(pctrl->regmap, pin->reg, val);
162 if (ret)
163 dev_err(pctrl->dev, "failed to write register\n");
165 return ret;
168 static int pm8xxx_get_groups_count(struct pinctrl_dev *pctldev)
170 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
172 return pctrl->npins;
175 static const char *pm8xxx_get_group_name(struct pinctrl_dev *pctldev,
176 unsigned group)
178 return pm8xxx_groups[group];
182 static int pm8xxx_get_group_pins(struct pinctrl_dev *pctldev,
183 unsigned group,
184 const unsigned **pins,
185 unsigned *num_pins)
187 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
189 *pins = &pctrl->desc.pins[group].number;
190 *num_pins = 1;
192 return 0;
195 static const struct pinctrl_ops pm8xxx_pinctrl_ops = {
196 .get_groups_count = pm8xxx_get_groups_count,
197 .get_group_name = pm8xxx_get_group_name,
198 .get_group_pins = pm8xxx_get_group_pins,
199 .dt_node_to_map = pinconf_generic_dt_node_to_map_group,
200 .dt_free_map = pinctrl_utils_free_map,
203 static int pm8xxx_get_functions_count(struct pinctrl_dev *pctldev)
205 return ARRAY_SIZE(pm8xxx_gpio_functions);
208 static const char *pm8xxx_get_function_name(struct pinctrl_dev *pctldev,
209 unsigned function)
211 return pm8xxx_gpio_functions[function];
214 static int pm8xxx_get_function_groups(struct pinctrl_dev *pctldev,
215 unsigned function,
216 const char * const **groups,
217 unsigned * const num_groups)
219 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
221 *groups = pm8xxx_groups;
222 *num_groups = pctrl->npins;
223 return 0;
226 static int pm8xxx_pinmux_set_mux(struct pinctrl_dev *pctldev,
227 unsigned function,
228 unsigned group)
230 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
231 struct pm8xxx_pin_data *pin = pctrl->desc.pins[group].drv_data;
232 u8 val;
234 pin->function = function;
235 val = pin->function << 1;
237 pm8xxx_write_bank(pctrl, pin, 4, val);
239 return 0;
242 static const struct pinmux_ops pm8xxx_pinmux_ops = {
243 .get_functions_count = pm8xxx_get_functions_count,
244 .get_function_name = pm8xxx_get_function_name,
245 .get_function_groups = pm8xxx_get_function_groups,
246 .set_mux = pm8xxx_pinmux_set_mux,
249 static int pm8xxx_pin_config_get(struct pinctrl_dev *pctldev,
250 unsigned int offset,
251 unsigned long *config)
253 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
254 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
255 unsigned param = pinconf_to_config_param(*config);
256 unsigned arg;
258 switch (param) {
259 case PIN_CONFIG_BIAS_DISABLE:
260 if (pin->bias != PM8XXX_GPIO_BIAS_NP)
261 return -EINVAL;
262 arg = 1;
263 break;
264 case PIN_CONFIG_BIAS_PULL_DOWN:
265 if (pin->bias != PM8XXX_GPIO_BIAS_PD)
266 return -EINVAL;
267 arg = 1;
268 break;
269 case PIN_CONFIG_BIAS_PULL_UP:
270 if (pin->bias > PM8XXX_GPIO_BIAS_PU_1P5_30)
271 return -EINVAL;
272 arg = 1;
273 break;
274 case PM8XXX_QCOM_PULL_UP_STRENGTH:
275 arg = pin->pull_up_strength;
276 break;
277 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
278 if (!pin->disable)
279 return -EINVAL;
280 arg = 1;
281 break;
282 case PIN_CONFIG_INPUT_ENABLE:
283 if (pin->mode != PM8XXX_GPIO_MODE_INPUT)
284 return -EINVAL;
285 arg = 1;
286 break;
287 case PIN_CONFIG_OUTPUT:
288 if (pin->mode & PM8XXX_GPIO_MODE_OUTPUT)
289 arg = pin->output_value;
290 else
291 arg = 0;
292 break;
293 case PIN_CONFIG_POWER_SOURCE:
294 arg = pin->power_source;
295 break;
296 case PM8XXX_QCOM_DRIVE_STRENGH:
297 arg = pin->output_strength;
298 break;
299 case PIN_CONFIG_DRIVE_PUSH_PULL:
300 if (pin->open_drain)
301 return -EINVAL;
302 arg = 1;
303 break;
304 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
305 if (!pin->open_drain)
306 return -EINVAL;
307 arg = 1;
308 break;
309 default:
310 return -EINVAL;
313 *config = pinconf_to_config_packed(param, arg);
315 return 0;
318 static int pm8xxx_pin_config_set(struct pinctrl_dev *pctldev,
319 unsigned int offset,
320 unsigned long *configs,
321 unsigned num_configs)
323 struct pm8xxx_gpio *pctrl = pinctrl_dev_get_drvdata(pctldev);
324 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
325 unsigned param;
326 unsigned arg;
327 unsigned i;
328 u8 banks = 0;
329 u8 val;
331 for (i = 0; i < num_configs; i++) {
332 param = pinconf_to_config_param(configs[i]);
333 arg = pinconf_to_config_argument(configs[i]);
335 switch (param) {
336 case PIN_CONFIG_BIAS_DISABLE:
337 pin->bias = PM8XXX_GPIO_BIAS_NP;
338 banks |= BIT(2);
339 pin->disable = 0;
340 banks |= BIT(3);
341 break;
342 case PIN_CONFIG_BIAS_PULL_DOWN:
343 pin->bias = PM8XXX_GPIO_BIAS_PD;
344 banks |= BIT(2);
345 pin->disable = 0;
346 banks |= BIT(3);
347 break;
348 case PM8XXX_QCOM_PULL_UP_STRENGTH:
349 if (arg > PM8XXX_GPIO_BIAS_PU_1P5_30) {
350 dev_err(pctrl->dev, "invalid pull-up strength\n");
351 return -EINVAL;
353 pin->pull_up_strength = arg;
354 /* FALLTHROUGH */
355 case PIN_CONFIG_BIAS_PULL_UP:
356 pin->bias = pin->pull_up_strength;
357 banks |= BIT(2);
358 pin->disable = 0;
359 banks |= BIT(3);
360 break;
361 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
362 pin->disable = 1;
363 banks |= BIT(3);
364 break;
365 case PIN_CONFIG_INPUT_ENABLE:
366 pin->mode = PM8XXX_GPIO_MODE_INPUT;
367 banks |= BIT(0) | BIT(1);
368 break;
369 case PIN_CONFIG_OUTPUT:
370 pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
371 pin->output_value = !!arg;
372 banks |= BIT(0) | BIT(1);
373 break;
374 case PIN_CONFIG_POWER_SOURCE:
375 pin->power_source = arg;
376 banks |= BIT(0);
377 break;
378 case PM8XXX_QCOM_DRIVE_STRENGH:
379 if (arg > PMIC_GPIO_STRENGTH_LOW) {
380 dev_err(pctrl->dev, "invalid drive strength\n");
381 return -EINVAL;
383 pin->output_strength = arg;
384 banks |= BIT(3);
385 break;
386 case PIN_CONFIG_DRIVE_PUSH_PULL:
387 pin->open_drain = 0;
388 banks |= BIT(1);
389 break;
390 case PIN_CONFIG_DRIVE_OPEN_DRAIN:
391 pin->open_drain = 1;
392 banks |= BIT(1);
393 break;
394 default:
395 dev_err(pctrl->dev,
396 "unsupported config parameter: %x\n",
397 param);
398 return -EINVAL;
402 if (banks & BIT(0)) {
403 val = pin->power_source << 1;
404 val |= PM8XXX_GPIO_MODE_ENABLED;
405 pm8xxx_write_bank(pctrl, pin, 0, val);
408 if (banks & BIT(1)) {
409 val = pin->mode << 2;
410 val |= pin->open_drain << 1;
411 val |= pin->output_value;
412 pm8xxx_write_bank(pctrl, pin, 1, val);
415 if (banks & BIT(2)) {
416 val = pin->bias << 1;
417 pm8xxx_write_bank(pctrl, pin, 2, val);
420 if (banks & BIT(3)) {
421 val = pin->output_strength << 2;
422 val |= pin->disable;
423 pm8xxx_write_bank(pctrl, pin, 3, val);
426 if (banks & BIT(4)) {
427 val = pin->function << 1;
428 pm8xxx_write_bank(pctrl, pin, 4, val);
431 if (banks & BIT(5)) {
432 val = 0;
433 if (!pin->inverted)
434 val |= BIT(3);
435 pm8xxx_write_bank(pctrl, pin, 5, val);
438 return 0;
441 static const struct pinconf_ops pm8xxx_pinconf_ops = {
442 .is_generic = true,
443 .pin_config_group_get = pm8xxx_pin_config_get,
444 .pin_config_group_set = pm8xxx_pin_config_set,
447 static struct pinctrl_desc pm8xxx_pinctrl_desc = {
448 .name = "pm8xxx_gpio",
449 .pctlops = &pm8xxx_pinctrl_ops,
450 .pmxops = &pm8xxx_pinmux_ops,
451 .confops = &pm8xxx_pinconf_ops,
452 .owner = THIS_MODULE,
455 static int pm8xxx_gpio_direction_input(struct gpio_chip *chip,
456 unsigned offset)
458 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
459 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
460 u8 val;
462 pin->mode = PM8XXX_GPIO_MODE_INPUT;
463 val = pin->mode << 2;
465 pm8xxx_write_bank(pctrl, pin, 1, val);
467 return 0;
470 static int pm8xxx_gpio_direction_output(struct gpio_chip *chip,
471 unsigned offset,
472 int value)
474 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
475 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
476 u8 val;
478 pin->mode = PM8XXX_GPIO_MODE_OUTPUT;
479 pin->output_value = !!value;
481 val = pin->mode << 2;
482 val |= pin->open_drain << 1;
483 val |= pin->output_value;
485 pm8xxx_write_bank(pctrl, pin, 1, val);
487 return 0;
490 static int pm8xxx_gpio_get(struct gpio_chip *chip, unsigned offset)
492 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
493 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
494 bool state;
495 int ret;
497 if (pin->mode == PM8XXX_GPIO_MODE_OUTPUT) {
498 ret = pin->output_value;
499 } else if (pin->irq >= 0) {
500 ret = irq_get_irqchip_state(pin->irq, IRQCHIP_STATE_LINE_LEVEL, &state);
501 if (!ret)
502 ret = !!state;
503 } else
504 ret = -EINVAL;
506 return ret;
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;
513 u8 val;
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,
526 u32 *flags)
528 if (chip->of_gpio_n_cells < 2)
529 return -EINVAL;
531 if (flags)
532 *flags = gpio_desc->args[1];
534 return gpio_desc->args[0] - PM8XXX_GPIO_PHYSICAL_OFFSET;
538 static int pm8xxx_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
540 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
541 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
542 struct irq_fwspec fwspec;
543 int ret;
545 fwspec.fwnode = pctrl->fwnode;
546 fwspec.param_count = 2;
547 fwspec.param[0] = offset + PM8XXX_GPIO_PHYSICAL_OFFSET;
548 fwspec.param[1] = IRQ_TYPE_EDGE_RISING;
550 ret = irq_create_fwspec_mapping(&fwspec);
553 * Cache the IRQ since pm8xxx_gpio_get() needs this to get determine the
554 * line level.
556 pin->irq = ret;
558 return ret;
561 static void pm8xxx_gpio_free(struct gpio_chip *chip, unsigned int offset)
563 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
564 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
566 pin->irq = -1;
569 #ifdef CONFIG_DEBUG_FS
570 #include <linux/seq_file.h>
572 static void pm8xxx_gpio_dbg_show_one(struct seq_file *s,
573 struct pinctrl_dev *pctldev,
574 struct gpio_chip *chip,
575 unsigned offset,
576 unsigned gpio)
578 struct pm8xxx_gpio *pctrl = gpiochip_get_data(chip);
579 struct pm8xxx_pin_data *pin = pctrl->desc.pins[offset].drv_data;
581 static const char * const modes[] = {
582 "in", "both", "out", "off"
584 static const char * const biases[] = {
585 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA",
586 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull"
588 static const char * const buffer_types[] = {
589 "push-pull", "open-drain"
591 static const char * const strengths[] = {
592 "no", "high", "medium", "low"
595 seq_printf(s, " gpio%-2d:", offset + PM8XXX_GPIO_PHYSICAL_OFFSET);
596 if (pin->disable) {
597 seq_puts(s, " ---");
598 } else {
599 seq_printf(s, " %-4s", modes[pin->mode]);
600 seq_printf(s, " %-7s", pm8xxx_gpio_functions[pin->function]);
601 seq_printf(s, " VIN%d", pin->power_source);
602 seq_printf(s, " %-27s", biases[pin->bias]);
603 seq_printf(s, " %-10s", buffer_types[pin->open_drain]);
604 seq_printf(s, " %-4s", pin->output_value ? "high" : "low");
605 seq_printf(s, " %-7s", strengths[pin->output_strength]);
606 if (pin->inverted)
607 seq_puts(s, " inverted");
611 static void pm8xxx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
613 unsigned gpio = chip->base;
614 unsigned i;
616 for (i = 0; i < chip->ngpio; i++, gpio++) {
617 pm8xxx_gpio_dbg_show_one(s, NULL, chip, i, gpio);
618 seq_puts(s, "\n");
622 #else
623 #define pm8xxx_gpio_dbg_show NULL
624 #endif
626 static const struct gpio_chip pm8xxx_gpio_template = {
627 .free = pm8xxx_gpio_free,
628 .direction_input = pm8xxx_gpio_direction_input,
629 .direction_output = pm8xxx_gpio_direction_output,
630 .get = pm8xxx_gpio_get,
631 .set = pm8xxx_gpio_set,
632 .of_xlate = pm8xxx_gpio_of_xlate,
633 .to_irq = pm8xxx_gpio_to_irq,
634 .dbg_show = pm8xxx_gpio_dbg_show,
635 .owner = THIS_MODULE,
638 static int pm8xxx_pin_populate(struct pm8xxx_gpio *pctrl,
639 struct pm8xxx_pin_data *pin)
641 int val;
643 val = pm8xxx_read_bank(pctrl, pin, 0);
644 if (val < 0)
645 return val;
647 pin->power_source = (val >> 1) & 0x7;
649 val = pm8xxx_read_bank(pctrl, pin, 1);
650 if (val < 0)
651 return val;
653 pin->mode = (val >> 2) & 0x3;
654 pin->open_drain = !!(val & BIT(1));
655 pin->output_value = val & BIT(0);
657 val = pm8xxx_read_bank(pctrl, pin, 2);
658 if (val < 0)
659 return val;
661 pin->bias = (val >> 1) & 0x7;
662 if (pin->bias <= PM8XXX_GPIO_BIAS_PU_1P5_30)
663 pin->pull_up_strength = pin->bias;
664 else
665 pin->pull_up_strength = PM8XXX_GPIO_BIAS_PU_30;
667 val = pm8xxx_read_bank(pctrl, pin, 3);
668 if (val < 0)
669 return val;
671 pin->output_strength = (val >> 2) & 0x3;
672 pin->disable = val & BIT(0);
674 val = pm8xxx_read_bank(pctrl, pin, 4);
675 if (val < 0)
676 return val;
678 pin->function = (val >> 1) & 0x7;
680 val = pm8xxx_read_bank(pctrl, pin, 5);
681 if (val < 0)
682 return val;
684 pin->inverted = !(val & BIT(3));
686 return 0;
689 static struct irq_chip pm8xxx_irq_chip = {
690 .name = "ssbi-gpio",
691 .irq_mask_ack = irq_chip_mask_ack_parent,
692 .irq_unmask = irq_chip_unmask_parent,
693 .irq_set_type = irq_chip_set_type_parent,
694 .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,
697 static int pm8xxx_domain_translate(struct irq_domain *domain,
698 struct irq_fwspec *fwspec,
699 unsigned long *hwirq,
700 unsigned int *type)
702 struct pm8xxx_gpio *pctrl = container_of(domain->host_data,
703 struct pm8xxx_gpio, chip);
705 if (fwspec->param_count != 2 || fwspec->param[0] < 1 ||
706 fwspec->param[0] > pctrl->chip.ngpio)
707 return -EINVAL;
709 *hwirq = fwspec->param[0] - PM8XXX_GPIO_PHYSICAL_OFFSET;
710 *type = fwspec->param[1];
712 return 0;
715 static int pm8xxx_domain_alloc(struct irq_domain *domain, unsigned int virq,
716 unsigned int nr_irqs, void *data)
718 struct pm8xxx_gpio *pctrl = container_of(domain->host_data,
719 struct pm8xxx_gpio, chip);
720 struct irq_fwspec *fwspec = data;
721 struct irq_fwspec parent_fwspec;
722 irq_hw_number_t hwirq;
723 unsigned int type;
724 int ret, i;
726 ret = pm8xxx_domain_translate(domain, fwspec, &hwirq, &type);
727 if (ret)
728 return ret;
730 for (i = 0; i < nr_irqs; i++)
731 irq_domain_set_info(domain, virq + i, hwirq + i,
732 &pm8xxx_irq_chip, pctrl, handle_level_irq,
733 NULL, NULL);
735 parent_fwspec.fwnode = domain->parent->fwnode;
736 parent_fwspec.param_count = 2;
737 parent_fwspec.param[0] = hwirq + 0xc0;
738 parent_fwspec.param[1] = fwspec->param[1];
740 return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
741 &parent_fwspec);
744 static const struct irq_domain_ops pm8xxx_domain_ops = {
745 .activate = gpiochip_irq_domain_activate,
746 .alloc = pm8xxx_domain_alloc,
747 .deactivate = gpiochip_irq_domain_deactivate,
748 .free = irq_domain_free_irqs_common,
749 .translate = pm8xxx_domain_translate,
752 static const struct of_device_id pm8xxx_gpio_of_match[] = {
753 { .compatible = "qcom,pm8018-gpio", .data = (void *) 6 },
754 { .compatible = "qcom,pm8038-gpio", .data = (void *) 12 },
755 { .compatible = "qcom,pm8058-gpio", .data = (void *) 44 },
756 { .compatible = "qcom,pm8917-gpio", .data = (void *) 38 },
757 { .compatible = "qcom,pm8921-gpio", .data = (void *) 44 },
758 { },
760 MODULE_DEVICE_TABLE(of, pm8xxx_gpio_of_match);
762 static int pm8xxx_gpio_probe(struct platform_device *pdev)
764 struct pm8xxx_pin_data *pin_data;
765 struct irq_domain *parent_domain;
766 struct device_node *parent_node;
767 struct pinctrl_pin_desc *pins;
768 struct pm8xxx_gpio *pctrl;
769 int ret, i;
771 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
772 if (!pctrl)
773 return -ENOMEM;
775 pctrl->dev = &pdev->dev;
776 pctrl->npins = (uintptr_t) device_get_match_data(&pdev->dev);
778 pctrl->regmap = dev_get_regmap(pdev->dev.parent, NULL);
779 if (!pctrl->regmap) {
780 dev_err(&pdev->dev, "parent regmap unavailable\n");
781 return -ENXIO;
784 pctrl->desc = pm8xxx_pinctrl_desc;
785 pctrl->desc.npins = pctrl->npins;
787 pins = devm_kcalloc(&pdev->dev,
788 pctrl->desc.npins,
789 sizeof(struct pinctrl_pin_desc),
790 GFP_KERNEL);
791 if (!pins)
792 return -ENOMEM;
794 pin_data = devm_kcalloc(&pdev->dev,
795 pctrl->desc.npins,
796 sizeof(struct pm8xxx_pin_data),
797 GFP_KERNEL);
798 if (!pin_data)
799 return -ENOMEM;
801 for (i = 0; i < pctrl->desc.npins; i++) {
802 pin_data[i].reg = SSBI_REG_ADDR_GPIO(i);
803 pin_data[i].irq = -1;
805 ret = pm8xxx_pin_populate(pctrl, &pin_data[i]);
806 if (ret)
807 return ret;
809 pins[i].number = i;
810 pins[i].name = pm8xxx_groups[i];
811 pins[i].drv_data = &pin_data[i];
813 pctrl->desc.pins = pins;
815 pctrl->desc.num_custom_params = ARRAY_SIZE(pm8xxx_gpio_bindings);
816 pctrl->desc.custom_params = pm8xxx_gpio_bindings;
817 #ifdef CONFIG_DEBUG_FS
818 pctrl->desc.custom_conf_items = pm8xxx_conf_items;
819 #endif
821 pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl);
822 if (IS_ERR(pctrl->pctrl)) {
823 dev_err(&pdev->dev, "couldn't register pm8xxx gpio driver\n");
824 return PTR_ERR(pctrl->pctrl);
827 pctrl->chip = pm8xxx_gpio_template;
828 pctrl->chip.base = -1;
829 pctrl->chip.parent = &pdev->dev;
830 pctrl->chip.of_node = pdev->dev.of_node;
831 pctrl->chip.of_gpio_n_cells = 2;
832 pctrl->chip.label = dev_name(pctrl->dev);
833 pctrl->chip.ngpio = pctrl->npins;
835 parent_node = of_irq_find_parent(pctrl->dev->of_node);
836 if (!parent_node)
837 return -ENXIO;
839 parent_domain = irq_find_host(parent_node);
840 of_node_put(parent_node);
841 if (!parent_domain)
842 return -ENXIO;
844 pctrl->fwnode = of_node_to_fwnode(pctrl->dev->of_node);
845 pctrl->domain = irq_domain_create_hierarchy(parent_domain, 0,
846 pctrl->chip.ngpio,
847 pctrl->fwnode,
848 &pm8xxx_domain_ops,
849 &pctrl->chip);
850 if (!pctrl->domain)
851 return -ENODEV;
853 ret = gpiochip_add_data(&pctrl->chip, pctrl);
854 if (ret) {
855 dev_err(&pdev->dev, "failed register gpiochip\n");
856 goto err_chip_add_data;
860 * For DeviceTree-supported systems, the gpio core checks the
861 * pinctrl's device node for the "gpio-ranges" property.
862 * If it is present, it takes care of adding the pin ranges
863 * for the driver. In this case the driver can skip ahead.
865 * In order to remain compatible with older, existing DeviceTree
866 * files which don't set the "gpio-ranges" property or systems that
867 * utilize ACPI the driver has to call gpiochip_add_pin_range().
869 if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) {
870 ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
871 0, 0, pctrl->chip.ngpio);
872 if (ret) {
873 dev_err(pctrl->dev, "failed to add pin range\n");
874 goto unregister_gpiochip;
878 platform_set_drvdata(pdev, pctrl);
880 dev_dbg(&pdev->dev, "Qualcomm pm8xxx gpio driver probed\n");
882 return 0;
884 unregister_gpiochip:
885 gpiochip_remove(&pctrl->chip);
886 err_chip_add_data:
887 irq_domain_remove(pctrl->domain);
889 return ret;
892 static int pm8xxx_gpio_remove(struct platform_device *pdev)
894 struct pm8xxx_gpio *pctrl = platform_get_drvdata(pdev);
896 gpiochip_remove(&pctrl->chip);
897 irq_domain_remove(pctrl->domain);
899 return 0;
902 static struct platform_driver pm8xxx_gpio_driver = {
903 .driver = {
904 .name = "qcom-ssbi-gpio",
905 .of_match_table = pm8xxx_gpio_of_match,
907 .probe = pm8xxx_gpio_probe,
908 .remove = pm8xxx_gpio_remove,
911 module_platform_driver(pm8xxx_gpio_driver);
913 MODULE_AUTHOR("Bjorn Andersson <bjorn.andersson@sonymobile.com>");
914 MODULE_DESCRIPTION("Qualcomm PM8xxx GPIO driver");
915 MODULE_LICENSE("GPL v2");