Lines Matching +full:irq +full:- +full:push +full:- +full:pull

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2014, 2016-2021 The Linux Foundation. All rights reserved.
11 #include <linux/pinctrl/pinconf-generic.h>
20 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
23 #include "../pinctrl-utils.h"
94 * Output type - indicates pin should be configured as push-pull,
131 * struct pmic_gpio_pad - keep current GPIO settings
135 * @have_buffer: Set to true if GPIO output could be configured in push-pull,
136 * open-drain or open-source mode.
139 * @analog_pass: Set to true if GPIO is in analog-pass-through mode.
141 * @num_sources: Number of power-sources supported by this GPIO.
142 * @power_source: Current power-source used.
143 * @buffer_type: Push-pull, open-drain or open-source.
147 * @atest: the ATEST selection for GPIO analog-pass-through mode
174 struct irq_chip irq; member
180 {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
181 {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
183 {"qcom,analog-pass", PMIC_GPIO_CONF_ANALOG_PASS, 0},
184 {"qcom,dtest-buffer", PMIC_GPIO_CONF_DTEST_BUFFER, 0},
189 PCONFDUMP(PMIC_GPIO_CONF_PULL_UP, "pull up strength", NULL, true),
190 PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
192 PCONFDUMP(PMIC_GPIO_CONF_ANALOG_PASS, "analog-pass", NULL, true),
193 PCONFDUMP(PMIC_GPIO_CONF_DTEST_BUFFER, "dtest-buffer", NULL, true),
224 ret = regmap_read(state->map, pad->base + addr, &val); in pmic_gpio_read()
226 dev_err(state->dev, "read 0x%x failed\n", addr); in pmic_gpio_read()
239 ret = regmap_write(state->map, pad->base + addr, val); in pmic_gpio_write()
241 dev_err(state->dev, "write 0x%x failed\n", addr); in pmic_gpio_write()
249 return pctldev->desc->npins; in pmic_gpio_get_groups_count()
255 return pctldev->desc->pins[pin].name; in pmic_gpio_get_group_name()
261 *pins = &pctldev->desc->pins[pin].number; in pmic_gpio_get_group_pins()
291 *num_qgroups = pctldev->desc->npins; in pmic_gpio_get_function_groups()
305 return -EINVAL; in pmic_gpio_set_mux()
308 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_set_mux()
310 * Non-LV/MV subtypes only support 2 special functions, in pmic_gpio_set_mux()
313 if (!pad->lv_mv_type) { in pmic_gpio_set_mux()
317 return -EINVAL; in pmic_gpio_set_mux()
320 function -= (PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_set_mux()
324 pad->function = function; in pmic_gpio_set_mux()
326 if (pad->analog_pass) in pmic_gpio_set_mux()
328 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_set_mux()
330 else if (pad->output_enabled) in pmic_gpio_set_mux()
335 if (pad->lv_mv_type) { in pmic_gpio_set_mux()
341 val = pad->atest - 1; in pmic_gpio_set_mux()
347 val = pad->out_value in pmic_gpio_set_mux()
349 val |= pad->function in pmic_gpio_set_mux()
357 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_set_mux()
358 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_set_mux()
365 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_set_mux()
384 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_get()
388 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS) in pmic_gpio_config_get()
389 return -EINVAL; in pmic_gpio_config_get()
393 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS) in pmic_gpio_config_get()
394 return -EINVAL; in pmic_gpio_config_get()
398 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS) in pmic_gpio_config_get()
399 return -EINVAL; in pmic_gpio_config_get()
403 if (pad->pullup != PMIC_GPIO_PULL_DOWN) in pmic_gpio_config_get()
404 return -EINVAL; in pmic_gpio_config_get()
408 if (pad->pullup != PMIC_GPIO_PULL_DISABLE) in pmic_gpio_config_get()
409 return -EINVAL; in pmic_gpio_config_get()
413 if (pad->pullup != PMIC_GPIO_PULL_UP_30) in pmic_gpio_config_get()
414 return -EINVAL; in pmic_gpio_config_get()
418 if (pad->is_enabled) in pmic_gpio_config_get()
419 return -EINVAL; in pmic_gpio_config_get()
423 arg = pad->power_source; in pmic_gpio_config_get()
426 if (!pad->input_enabled) in pmic_gpio_config_get()
427 return -EINVAL; in pmic_gpio_config_get()
431 arg = pad->out_value; in pmic_gpio_config_get()
434 arg = pad->pullup; in pmic_gpio_config_get()
437 arg = pad->strength; in pmic_gpio_config_get()
440 arg = pad->atest; in pmic_gpio_config_get()
443 arg = pad->analog_pass; in pmic_gpio_config_get()
446 arg = pad->dtest_buffer; in pmic_gpio_config_get()
449 return -EINVAL; in pmic_gpio_config_get()
465 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_set()
467 pad->is_enabled = true; in pmic_gpio_config_set()
474 pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS; in pmic_gpio_config_set()
477 if (!pad->have_buffer) in pmic_gpio_config_set()
478 return -EINVAL; in pmic_gpio_config_set()
479 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS; in pmic_gpio_config_set()
482 if (!pad->have_buffer) in pmic_gpio_config_set()
483 return -EINVAL; in pmic_gpio_config_set()
484 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS; in pmic_gpio_config_set()
487 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
490 pad->pullup = PMIC_GPIO_PULL_UP_30; in pmic_gpio_config_set()
494 pad->pullup = PMIC_GPIO_PULL_DOWN; in pmic_gpio_config_set()
496 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
499 pad->is_enabled = false; in pmic_gpio_config_set()
502 if (arg >= pad->num_sources) in pmic_gpio_config_set()
503 return -EINVAL; in pmic_gpio_config_set()
504 pad->power_source = arg; in pmic_gpio_config_set()
507 pad->input_enabled = arg ? true : false; in pmic_gpio_config_set()
510 pad->output_enabled = true; in pmic_gpio_config_set()
511 pad->out_value = arg; in pmic_gpio_config_set()
515 return -EINVAL; in pmic_gpio_config_set()
516 pad->pullup = arg; in pmic_gpio_config_set()
520 return -EINVAL; in pmic_gpio_config_set()
521 pad->strength = arg; in pmic_gpio_config_set()
524 if (!pad->lv_mv_type || arg > 4) in pmic_gpio_config_set()
525 return -EINVAL; in pmic_gpio_config_set()
526 pad->atest = arg; in pmic_gpio_config_set()
529 if (!pad->lv_mv_type) in pmic_gpio_config_set()
530 return -EINVAL; in pmic_gpio_config_set()
531 pad->analog_pass = true; in pmic_gpio_config_set()
535 return -EINVAL; in pmic_gpio_config_set()
536 pad->dtest_buffer = arg; in pmic_gpio_config_set()
539 return -EINVAL; in pmic_gpio_config_set()
543 val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_config_set()
549 val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_config_set()
555 val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_config_set()
556 val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_config_set()
562 if (pad->dtest_buffer == 0) { in pmic_gpio_config_set()
565 if (pad->lv_mv_type) { in pmic_gpio_config_set()
566 val = pad->dtest_buffer - 1; in pmic_gpio_config_set()
569 val = BIT(pad->dtest_buffer - 1); in pmic_gpio_config_set()
576 if (pad->analog_pass) in pmic_gpio_config_set()
578 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_config_set()
580 else if (pad->output_enabled) in pmic_gpio_config_set()
585 if (pad->lv_mv_type) { in pmic_gpio_config_set()
591 val = pad->atest - 1; in pmic_gpio_config_set()
597 val = pad->out_value in pmic_gpio_config_set()
599 val |= pad->function in pmic_gpio_config_set()
607 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_config_set()
608 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_config_set()
615 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_config_set()
630 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA", in pmic_gpio_config_dbg_show()
631 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull" in pmic_gpio_config_dbg_show()
634 "push-pull", "open-drain", "open-source" in pmic_gpio_config_dbg_show()
640 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_dbg_show()
642 seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET); in pmic_gpio_config_dbg_show()
647 seq_puts(s, " ---"); in pmic_gpio_config_dbg_show()
649 if (pad->input_enabled) { in pmic_gpio_config_dbg_show()
655 pad->out_value = ret; in pmic_gpio_config_dbg_show()
658 * For the non-LV/MV subtypes only 2 special functions are in pmic_gpio_config_dbg_show()
661 function = pad->function; in pmic_gpio_config_dbg_show()
662 if (!pad->lv_mv_type && in pmic_gpio_config_dbg_show()
663 pad->function >= PMIC_GPIO_FUNC_INDEX_FUNC3) in pmic_gpio_config_dbg_show()
664 function += PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_config_dbg_show()
667 if (pad->analog_pass) in pmic_gpio_config_dbg_show()
668 seq_puts(s, " analog-pass"); in pmic_gpio_config_dbg_show()
670 seq_printf(s, " %-4s", in pmic_gpio_config_dbg_show()
671 pad->output_enabled ? "out" : "in"); in pmic_gpio_config_dbg_show()
672 seq_printf(s, " %-4s", pad->out_value ? "high" : "low"); in pmic_gpio_config_dbg_show()
673 seq_printf(s, " %-7s", pmic_gpio_functions[function]); in pmic_gpio_config_dbg_show()
674 seq_printf(s, " vin-%d", pad->power_source); in pmic_gpio_config_dbg_show()
675 seq_printf(s, " %-27s", biases[pad->pullup]); in pmic_gpio_config_dbg_show()
676 seq_printf(s, " %-10s", buffer_types[pad->buffer_type]); in pmic_gpio_config_dbg_show()
677 seq_printf(s, " %-7s", strengths[pad->strength]); in pmic_gpio_config_dbg_show()
678 seq_printf(s, " atest-%d", pad->atest); in pmic_gpio_config_dbg_show()
679 seq_printf(s, " dtest-%d", pad->dtest_buffer); in pmic_gpio_config_dbg_show()
697 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_input()
708 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_output()
717 pad = state->ctrl->desc->pins[pin].drv_data; in pmic_gpio_get()
719 if (!pad->is_enabled) in pmic_gpio_get()
720 return -EINVAL; in pmic_gpio_get()
722 if (pad->input_enabled) { in pmic_gpio_get()
727 pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK; in pmic_gpio_get()
730 return !!pad->out_value; in pmic_gpio_get()
740 pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_set()
747 if (chip->of_gpio_n_cells < 2) in pmic_gpio_of_xlate()
748 return -EINVAL; in pmic_gpio_of_xlate()
751 *flags = gpio_desc->args[1]; in pmic_gpio_of_xlate()
753 return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_of_xlate()
761 for (i = 0; i < chip->ngpio; i++) { in pmic_gpio_dbg_show()
762 pmic_gpio_config_dbg_show(state->ctrl, s, i); in pmic_gpio_dbg_show()
788 dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n", in pmic_gpio_populate()
789 type, pad->base); in pmic_gpio_populate()
790 return -ENODEV; in pmic_gpio_populate()
799 pad->have_buffer = true; in pmic_gpio_populate()
802 pad->num_sources = 4; in pmic_gpio_populate()
805 pad->have_buffer = true; in pmic_gpio_populate()
808 pad->num_sources = 8; in pmic_gpio_populate()
811 pad->num_sources = 1; in pmic_gpio_populate()
812 pad->have_buffer = true; in pmic_gpio_populate()
813 pad->lv_mv_type = true; in pmic_gpio_populate()
816 pad->num_sources = 2; in pmic_gpio_populate()
817 pad->have_buffer = true; in pmic_gpio_populate()
818 pad->lv_mv_type = true; in pmic_gpio_populate()
821 dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype); in pmic_gpio_populate()
822 return -ENODEV; in pmic_gpio_populate()
825 if (pad->lv_mv_type) { in pmic_gpio_populate()
831 pad->out_value = !!(val & PMIC_GPIO_LV_MV_OUTPUT_INVERT); in pmic_gpio_populate()
832 pad->function = val & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK; in pmic_gpio_populate()
844 pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_populate()
848 pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_populate()
849 pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK; in pmic_gpio_populate()
854 pad->input_enabled = true; in pmic_gpio_populate()
855 pad->output_enabled = false; in pmic_gpio_populate()
858 pad->input_enabled = false; in pmic_gpio_populate()
859 pad->output_enabled = true; in pmic_gpio_populate()
862 pad->input_enabled = true; in pmic_gpio_populate()
863 pad->output_enabled = true; in pmic_gpio_populate()
866 if (!pad->lv_mv_type) in pmic_gpio_populate()
867 return -ENODEV; in pmic_gpio_populate()
868 pad->analog_pass = true; in pmic_gpio_populate()
871 dev_err(state->dev, "unknown GPIO direction\n"); in pmic_gpio_populate()
872 return -ENODEV; in pmic_gpio_populate()
879 pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_populate()
880 pad->power_source &= PMIC_GPIO_REG_VIN_MASK; in pmic_gpio_populate()
886 pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_populate()
887 pad->pullup &= PMIC_GPIO_REG_PULL_MASK; in pmic_gpio_populate()
893 if (pad->lv_mv_type && (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN)) in pmic_gpio_populate()
894 pad->dtest_buffer = in pmic_gpio_populate()
896 else if (!pad->lv_mv_type) in pmic_gpio_populate()
897 pad->dtest_buffer = ffs(val); in pmic_gpio_populate()
899 pad->dtest_buffer = 0; in pmic_gpio_populate()
905 pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_populate()
906 pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK; in pmic_gpio_populate()
908 pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_populate()
909 pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK; in pmic_gpio_populate()
911 if (pad->lv_mv_type) { in pmic_gpio_populate()
916 pad->atest = (val & PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK) + 1; in pmic_gpio_populate()
920 pad->is_enabled = true; in pmic_gpio_populate()
929 struct pmic_gpio_state *state = container_of(domain->host_data, in pmic_gpio_domain_translate()
933 if (fwspec->param_count != 2 || in pmic_gpio_domain_translate()
934 fwspec->param[0] < 1 || fwspec->param[0] > state->chip.ngpio) in pmic_gpio_domain_translate()
935 return -EINVAL; in pmic_gpio_domain_translate()
937 *hwirq = fwspec->param[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_domain_translate()
938 *type = fwspec->param[1]; in pmic_gpio_domain_translate()
957 *parent_hwirq = child_hwirq + state->pid_base; in pmic_gpio_child_to_parent_hwirq()
974 fwspec->fwnode = chip->irq.parent_domain->fwnode; in pmic_gpio_populate_parent_fwspec()
976 fwspec->param_count = 4; in pmic_gpio_populate_parent_fwspec()
977 fwspec->param[0] = state->usid; in pmic_gpio_populate_parent_fwspec()
978 fwspec->param[1] = parent_hwirq; in pmic_gpio_populate_parent_fwspec()
980 fwspec->param[3] = parent_type; in pmic_gpio_populate_parent_fwspec()
989 struct device *dev = &pdev->dev; in pmic_gpio_probe()
999 ret = of_property_read_u32(dev->of_node, "reg", &reg); in pmic_gpio_probe()
1005 npins = (uintptr_t) device_get_match_data(&pdev->dev); in pmic_gpio_probe()
1009 return -ENOMEM; in pmic_gpio_probe()
1013 state->dev = &pdev->dev; in pmic_gpio_probe()
1014 state->map = dev_get_regmap(dev->parent, NULL); in pmic_gpio_probe()
1015 parent_spmi_dev = to_spmi_device(dev->parent); in pmic_gpio_probe()
1016 state->usid = parent_spmi_dev->usid; in pmic_gpio_probe()
1017 state->pid_base = reg >> 8; in pmic_gpio_probe()
1021 return -ENOMEM; in pmic_gpio_probe()
1025 return -ENOMEM; in pmic_gpio_probe()
1029 return -ENOMEM; in pmic_gpio_probe()
1031 pctrldesc->pctlops = &pmic_gpio_pinctrl_ops; in pmic_gpio_probe()
1032 pctrldesc->pmxops = &pmic_gpio_pinmux_ops; in pmic_gpio_probe()
1033 pctrldesc->confops = &pmic_gpio_pinconf_ops; in pmic_gpio_probe()
1034 pctrldesc->owner = THIS_MODULE; in pmic_gpio_probe()
1035 pctrldesc->name = dev_name(dev); in pmic_gpio_probe()
1036 pctrldesc->pins = pindesc; in pmic_gpio_probe()
1037 pctrldesc->npins = npins; in pmic_gpio_probe()
1038 pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings); in pmic_gpio_probe()
1039 pctrldesc->custom_params = pmic_gpio_bindings; in pmic_gpio_probe()
1041 pctrldesc->custom_conf_items = pmic_conf_items; in pmic_gpio_probe()
1046 pindesc->drv_data = pad; in pmic_gpio_probe()
1047 pindesc->number = i; in pmic_gpio_probe()
1048 pindesc->name = pmic_gpio_groups[i]; in pmic_gpio_probe()
1050 pad->base = reg + i * PMIC_GPIO_ADDRESS_RANGE; in pmic_gpio_probe()
1057 state->chip = pmic_gpio_gpio_template; in pmic_gpio_probe()
1058 state->chip.parent = dev; in pmic_gpio_probe()
1059 state->chip.base = -1; in pmic_gpio_probe()
1060 state->chip.ngpio = npins; in pmic_gpio_probe()
1061 state->chip.label = dev_name(dev); in pmic_gpio_probe()
1062 state->chip.of_gpio_n_cells = 2; in pmic_gpio_probe()
1063 state->chip.can_sleep = false; in pmic_gpio_probe()
1065 state->ctrl = devm_pinctrl_register(dev, pctrldesc, state); in pmic_gpio_probe()
1066 if (IS_ERR(state->ctrl)) in pmic_gpio_probe()
1067 return PTR_ERR(state->ctrl); in pmic_gpio_probe()
1069 parent_node = of_irq_find_parent(state->dev->of_node); in pmic_gpio_probe()
1071 return -ENXIO; in pmic_gpio_probe()
1076 return -ENXIO; in pmic_gpio_probe()
1078 state->irq.name = "spmi-gpio", in pmic_gpio_probe()
1079 state->irq.irq_ack = irq_chip_ack_parent, in pmic_gpio_probe()
1080 state->irq.irq_mask = irq_chip_mask_parent, in pmic_gpio_probe()
1081 state->irq.irq_unmask = irq_chip_unmask_parent, in pmic_gpio_probe()
1082 state->irq.irq_set_type = irq_chip_set_type_parent, in pmic_gpio_probe()
1083 state->irq.irq_set_wake = irq_chip_set_wake_parent, in pmic_gpio_probe()
1084 state->irq.flags = IRQCHIP_MASK_ON_SUSPEND, in pmic_gpio_probe()
1086 girq = &state->chip.irq; in pmic_gpio_probe()
1087 girq->chip = &state->irq; in pmic_gpio_probe()
1088 girq->default_type = IRQ_TYPE_NONE; in pmic_gpio_probe()
1089 girq->handler = handle_level_irq; in pmic_gpio_probe()
1090 girq->fwnode = of_node_to_fwnode(state->dev->of_node); in pmic_gpio_probe()
1091 girq->parent_domain = parent_domain; in pmic_gpio_probe()
1092 girq->child_to_parent_hwirq = pmic_gpio_child_to_parent_hwirq; in pmic_gpio_probe()
1093 girq->populate_parent_alloc_arg = pmic_gpio_populate_parent_fwspec; in pmic_gpio_probe()
1094 girq->child_offset_to_irq = pmic_gpio_child_offset_to_irq; in pmic_gpio_probe()
1095 girq->child_irq_domain_ops.translate = pmic_gpio_domain_translate; in pmic_gpio_probe()
1097 ret = gpiochip_add_data(&state->chip, state); in pmic_gpio_probe()
1099 dev_err(state->dev, "can't add gpio chip\n"); in pmic_gpio_probe()
1104 * For DeviceTree-supported systems, the gpio core checks the in pmic_gpio_probe()
1105 * pinctrl's device node for the "gpio-ranges" property. in pmic_gpio_probe()
1110 * files which don't set the "gpio-ranges" property or systems that in pmic_gpio_probe()
1113 if (!of_property_read_bool(dev->of_node, "gpio-ranges")) { in pmic_gpio_probe()
1114 ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, in pmic_gpio_probe()
1125 gpiochip_remove(&state->chip); in pmic_gpio_probe()
1133 gpiochip_remove(&state->chip); in pmic_gpio_remove()
1139 { .compatible = "qcom,pm660-gpio", .data = (void *) 13 },
1141 { .compatible = "qcom,pm660l-gpio", .data = (void *) 12 },
1142 { .compatible = "qcom,pm6150-gpio", .data = (void *) 10 },
1143 { .compatible = "qcom,pm6150l-gpio", .data = (void *) 12 },
1144 { .compatible = "qcom,pm7325-gpio", .data = (void *) 10 },
1145 { .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
1146 { .compatible = "qcom,pm8008-gpio", .data = (void *) 2 },
1148 { .compatible = "qcom,pm8150-gpio", .data = (void *) 10 },
1149 { .compatible = "qcom,pmc8180-gpio", .data = (void *) 10 },
1151 { .compatible = "qcom,pm8150b-gpio", .data = (void *) 12 },
1153 { .compatible = "qcom,pm8150l-gpio", .data = (void *) 12 },
1154 { .compatible = "qcom,pmc8180c-gpio", .data = (void *) 12 },
1155 { .compatible = "qcom,pm8350-gpio", .data = (void *) 10 },
1156 { .compatible = "qcom,pm8350b-gpio", .data = (void *) 8 },
1157 { .compatible = "qcom,pm8350c-gpio", .data = (void *) 9 },
1158 { .compatible = "qcom,pm8916-gpio", .data = (void *) 4 },
1159 { .compatible = "qcom,pm8941-gpio", .data = (void *) 36 },
1161 { .compatible = "qcom,pm8950-gpio", .data = (void *) 8 },
1162 { .compatible = "qcom,pm8994-gpio", .data = (void *) 22 },
1163 { .compatible = "qcom,pm8998-gpio", .data = (void *) 26 },
1164 { .compatible = "qcom,pma8084-gpio", .data = (void *) 22 },
1165 { .compatible = "qcom,pmi8950-gpio", .data = (void *) 2 },
1166 { .compatible = "qcom,pmi8994-gpio", .data = (void *) 10 },
1167 { .compatible = "qcom,pmi8998-gpio", .data = (void *) 14 },
1168 { .compatible = "qcom,pmk8350-gpio", .data = (void *) 4 },
1169 { .compatible = "qcom,pmm8155au-gpio", .data = (void *) 10 },
1170 { .compatible = "qcom,pmr735a-gpio", .data = (void *) 4 },
1171 { .compatible = "qcom,pmr735b-gpio", .data = (void *) 4 },
1173 { .compatible = "qcom,pms405-gpio", .data = (void *) 12 },
1175 { .compatible = "qcom,pmx55-gpio", .data = (void *) 11 },
1183 .name = "qcom-spmi-gpio",
1192 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
1194 MODULE_ALIAS("platform:qcom-spmi-gpio");