Lines Matching +full:analog +full:- +full:pass +full:- +full:through
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2014, 2016-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
20 #include <linux/pinctrl/pinconf-generic.h>
24 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
27 #include "../pinctrl-utils.h"
100 * Output type - indicates pin should be configured as push-pull,
140 * struct pmic_gpio_pad - keep current GPIO settings
144 * @have_buffer: Set to true if GPIO output could be configured in push-pull,
145 * open-drain or open-source mode.
148 * @analog_pass: Set to true if GPIO is in analog-pass-through mode.
150 * @num_sources: Number of power-sources supported by this GPIO.
151 * @power_source: Current power-source used.
152 * @buffer_type: Push-pull, open-drain or open-source.
156 * @atest: the ATEST selection for GPIO analog-pass-through mode
188 {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
189 {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
191 {"qcom,analog-pass", PMIC_GPIO_CONF_ANALOG_PASS, 0},
192 {"qcom,dtest-buffer", PMIC_GPIO_CONF_DTEST_BUFFER, 0},
198 PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
200 PCONFDUMP(PMIC_GPIO_CONF_ANALOG_PASS, "analog-pass", NULL, true),
201 PCONFDUMP(PMIC_GPIO_CONF_DTEST_BUFFER, "dtest-buffer", NULL, true),
232 ret = regmap_read(state->map, pad->base + addr, &val); in pmic_gpio_read()
234 dev_err(state->dev, "read 0x%x failed\n", addr); in pmic_gpio_read()
247 ret = regmap_write(state->map, pad->base + addr, val); in pmic_gpio_write()
249 dev_err(state->dev, "write 0x%x failed\n", addr); in pmic_gpio_write()
257 return pctldev->desc->npins; in pmic_gpio_get_groups_count()
263 return pctldev->desc->pins[pin].name; in pmic_gpio_get_group_name()
269 *pins = &pctldev->desc->pins[pin].number; in pmic_gpio_get_group_pins()
299 *num_qgroups = pctldev->desc->npins; in pmic_gpio_get_function_groups()
313 return -EINVAL; in pmic_gpio_set_mux()
316 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_set_mux()
318 * Non-LV/MV subtypes only support 2 special functions, in pmic_gpio_set_mux()
321 if (!pad->lv_mv_type) { in pmic_gpio_set_mux()
325 return -EINVAL; in pmic_gpio_set_mux()
328 function -= (PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_set_mux()
332 pad->function = function; in pmic_gpio_set_mux()
334 if (pad->analog_pass) in pmic_gpio_set_mux()
336 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_set_mux()
338 else if (pad->output_enabled) in pmic_gpio_set_mux()
343 if (pad->lv_mv_type) { in pmic_gpio_set_mux()
349 val = pad->atest - 1; in pmic_gpio_set_mux()
355 val = pad->out_value in pmic_gpio_set_mux()
357 val |= pad->function in pmic_gpio_set_mux()
365 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_set_mux()
366 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_set_mux()
373 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_set_mux()
392 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_get()
396 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS) in pmic_gpio_config_get()
397 return -EINVAL; in pmic_gpio_config_get()
401 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS) in pmic_gpio_config_get()
402 return -EINVAL; in pmic_gpio_config_get()
406 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS) in pmic_gpio_config_get()
407 return -EINVAL; in pmic_gpio_config_get()
411 if (pad->pullup != PMIC_GPIO_PULL_DOWN) in pmic_gpio_config_get()
412 return -EINVAL; in pmic_gpio_config_get()
416 if (pad->pullup != PMIC_GPIO_PULL_DISABLE) in pmic_gpio_config_get()
417 return -EINVAL; in pmic_gpio_config_get()
421 if (pad->pullup != PMIC_GPIO_PULL_UP_30) in pmic_gpio_config_get()
422 return -EINVAL; in pmic_gpio_config_get()
426 if (pad->is_enabled) in pmic_gpio_config_get()
427 return -EINVAL; in pmic_gpio_config_get()
431 arg = pad->power_source; in pmic_gpio_config_get()
434 if (!pad->input_enabled) in pmic_gpio_config_get()
435 return -EINVAL; in pmic_gpio_config_get()
439 arg = pad->output_enabled; in pmic_gpio_config_get()
442 arg = pad->out_value; in pmic_gpio_config_get()
445 arg = pad->pullup; in pmic_gpio_config_get()
448 switch (pad->strength) { in pmic_gpio_config_get()
456 arg = pad->strength; in pmic_gpio_config_get()
461 arg = pad->atest; in pmic_gpio_config_get()
464 arg = pad->analog_pass; in pmic_gpio_config_get()
467 arg = pad->dtest_buffer; in pmic_gpio_config_get()
470 return -EINVAL; in pmic_gpio_config_get()
486 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_set()
488 pad->is_enabled = true; in pmic_gpio_config_set()
495 pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS; in pmic_gpio_config_set()
498 if (!pad->have_buffer) in pmic_gpio_config_set()
499 return -EINVAL; in pmic_gpio_config_set()
500 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS; in pmic_gpio_config_set()
503 if (!pad->have_buffer) in pmic_gpio_config_set()
504 return -EINVAL; in pmic_gpio_config_set()
505 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS; in pmic_gpio_config_set()
508 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
511 pad->pullup = PMIC_GPIO_PULL_UP_30; in pmic_gpio_config_set()
515 pad->pullup = PMIC_GPIO_PULL_DOWN; in pmic_gpio_config_set()
517 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
520 pad->is_enabled = false; in pmic_gpio_config_set()
523 if (arg >= pad->num_sources) in pmic_gpio_config_set()
524 return -EINVAL; in pmic_gpio_config_set()
525 pad->power_source = arg; in pmic_gpio_config_set()
528 pad->input_enabled = arg ? true : false; in pmic_gpio_config_set()
531 pad->output_enabled = arg ? true : false; in pmic_gpio_config_set()
534 pad->output_enabled = true; in pmic_gpio_config_set()
535 pad->out_value = arg; in pmic_gpio_config_set()
539 return -EINVAL; in pmic_gpio_config_set()
540 pad->pullup = arg; in pmic_gpio_config_set()
544 return -EINVAL; in pmic_gpio_config_set()
547 pad->strength = PMIC_GPIO_OUT_STRENGTH_HIGH; in pmic_gpio_config_set()
550 pad->strength = PMIC_GPIO_OUT_STRENGTH_LOW; in pmic_gpio_config_set()
553 pad->strength = arg; in pmic_gpio_config_set()
558 if (!pad->lv_mv_type || arg > 4) in pmic_gpio_config_set()
559 return -EINVAL; in pmic_gpio_config_set()
560 pad->atest = arg; in pmic_gpio_config_set()
563 if (!pad->lv_mv_type) in pmic_gpio_config_set()
564 return -EINVAL; in pmic_gpio_config_set()
565 pad->analog_pass = true; in pmic_gpio_config_set()
569 return -EINVAL; in pmic_gpio_config_set()
570 pad->dtest_buffer = arg; in pmic_gpio_config_set()
573 return -EINVAL; in pmic_gpio_config_set()
577 val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_config_set()
583 val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_config_set()
589 val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_config_set()
590 val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_config_set()
596 if (pad->dtest_buffer == 0) { in pmic_gpio_config_set()
599 if (pad->lv_mv_type) { in pmic_gpio_config_set()
600 val = pad->dtest_buffer - 1; in pmic_gpio_config_set()
603 val = BIT(pad->dtest_buffer - 1); in pmic_gpio_config_set()
610 if (pad->analog_pass) in pmic_gpio_config_set()
612 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_config_set()
614 else if (pad->output_enabled) in pmic_gpio_config_set()
619 if (pad->lv_mv_type) { in pmic_gpio_config_set()
625 val = pad->atest - 1; in pmic_gpio_config_set()
631 val = pad->out_value in pmic_gpio_config_set()
633 val |= pad->function in pmic_gpio_config_set()
641 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_config_set()
642 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_config_set()
649 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_config_set()
664 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA", in pmic_gpio_config_dbg_show()
665 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull" in pmic_gpio_config_dbg_show()
668 "push-pull", "open-drain", "open-source" in pmic_gpio_config_dbg_show()
674 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_dbg_show()
676 seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET); in pmic_gpio_config_dbg_show()
681 seq_puts(s, " ---"); in pmic_gpio_config_dbg_show()
683 if (pad->input_enabled) { in pmic_gpio_config_dbg_show()
689 pad->out_value = ret; in pmic_gpio_config_dbg_show()
692 * For the non-LV/MV subtypes only 2 special functions are in pmic_gpio_config_dbg_show()
695 function = pad->function; in pmic_gpio_config_dbg_show()
696 if (!pad->lv_mv_type && in pmic_gpio_config_dbg_show()
697 pad->function >= PMIC_GPIO_FUNC_INDEX_FUNC3) in pmic_gpio_config_dbg_show()
698 function += PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_config_dbg_show()
701 if (pad->analog_pass) in pmic_gpio_config_dbg_show()
702 seq_puts(s, " analog-pass"); in pmic_gpio_config_dbg_show()
704 seq_printf(s, " %-4s", in pmic_gpio_config_dbg_show()
705 pad->output_enabled ? "out" : "in"); in pmic_gpio_config_dbg_show()
706 seq_printf(s, " %-4s", str_high_low(pad->out_value)); in pmic_gpio_config_dbg_show()
707 seq_printf(s, " %-7s", pmic_gpio_functions[function]); in pmic_gpio_config_dbg_show()
708 seq_printf(s, " vin-%d", pad->power_source); in pmic_gpio_config_dbg_show()
709 seq_printf(s, " %-27s", biases[pad->pullup]); in pmic_gpio_config_dbg_show()
710 seq_printf(s, " %-10s", buffer_types[pad->buffer_type]); in pmic_gpio_config_dbg_show()
711 seq_printf(s, " %-7s", strengths[pad->strength]); in pmic_gpio_config_dbg_show()
712 seq_printf(s, " atest-%d", pad->atest); in pmic_gpio_config_dbg_show()
713 seq_printf(s, " dtest-%d", pad->dtest_buffer); in pmic_gpio_config_dbg_show()
731 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_input()
742 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_output()
751 pad = state->ctrl->desc->pins[pin].drv_data; in pmic_gpio_get()
753 if (!pad->is_enabled) in pmic_gpio_get()
754 return -EINVAL; in pmic_gpio_get()
756 if (pad->input_enabled) { in pmic_gpio_get()
761 pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK; in pmic_gpio_get()
764 return !!pad->out_value; in pmic_gpio_get()
774 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_set()
781 if (chip->of_gpio_n_cells < 2) in pmic_gpio_of_xlate()
782 return -EINVAL; in pmic_gpio_of_xlate()
785 *flags = gpio_desc->args[1]; in pmic_gpio_of_xlate()
787 return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_of_xlate()
795 for (i = 0; i < chip->ngpio; i++) { in pmic_gpio_dbg_show()
796 pmic_gpio_config_dbg_show(state->ctrl, s, i); in pmic_gpio_dbg_show()
822 dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n", in pmic_gpio_populate()
823 type, pad->base); in pmic_gpio_populate()
824 return -ENODEV; in pmic_gpio_populate()
833 pad->have_buffer = true; in pmic_gpio_populate()
836 pad->num_sources = 4; in pmic_gpio_populate()
839 pad->have_buffer = true; in pmic_gpio_populate()
842 pad->num_sources = 8; in pmic_gpio_populate()
845 pad->num_sources = 1; in pmic_gpio_populate()
846 pad->have_buffer = true; in pmic_gpio_populate()
847 pad->lv_mv_type = true; in pmic_gpio_populate()
850 pad->num_sources = 2; in pmic_gpio_populate()
851 pad->have_buffer = true; in pmic_gpio_populate()
852 pad->lv_mv_type = true; in pmic_gpio_populate()
855 pad->num_sources = 2; in pmic_gpio_populate()
856 pad->have_buffer = true; in pmic_gpio_populate()
857 pad->lv_mv_type = true; in pmic_gpio_populate()
860 pad->num_sources = 3; in pmic_gpio_populate()
861 pad->have_buffer = true; in pmic_gpio_populate()
862 pad->lv_mv_type = true; in pmic_gpio_populate()
865 dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype); in pmic_gpio_populate()
866 return -ENODEV; in pmic_gpio_populate()
869 if (pad->lv_mv_type) { in pmic_gpio_populate()
875 pad->out_value = !!(val & PMIC_GPIO_LV_MV_OUTPUT_INVERT); in pmic_gpio_populate()
876 pad->function = val & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK; in pmic_gpio_populate()
888 pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_populate()
892 pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_populate()
893 pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK; in pmic_gpio_populate()
898 pad->input_enabled = true; in pmic_gpio_populate()
899 pad->output_enabled = false; in pmic_gpio_populate()
902 pad->input_enabled = false; in pmic_gpio_populate()
903 pad->output_enabled = true; in pmic_gpio_populate()
906 pad->input_enabled = true; in pmic_gpio_populate()
907 pad->output_enabled = true; in pmic_gpio_populate()
910 if (!pad->lv_mv_type) in pmic_gpio_populate()
911 return -ENODEV; in pmic_gpio_populate()
912 pad->analog_pass = true; in pmic_gpio_populate()
915 dev_err(state->dev, "unknown GPIO direction\n"); in pmic_gpio_populate()
916 return -ENODEV; in pmic_gpio_populate()
923 pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_populate()
924 pad->power_source &= PMIC_GPIO_REG_VIN_MASK; in pmic_gpio_populate()
930 pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_populate()
931 pad->pullup &= PMIC_GPIO_REG_PULL_MASK; in pmic_gpio_populate()
937 if (pad->lv_mv_type && (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN)) in pmic_gpio_populate()
938 pad->dtest_buffer = in pmic_gpio_populate()
940 else if (!pad->lv_mv_type) in pmic_gpio_populate()
941 pad->dtest_buffer = ffs(val); in pmic_gpio_populate()
943 pad->dtest_buffer = 0; in pmic_gpio_populate()
949 pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_populate()
950 pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK; in pmic_gpio_populate()
952 pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_populate()
953 pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK; in pmic_gpio_populate()
955 if (pad->lv_mv_type) { in pmic_gpio_populate()
960 pad->atest = (val & PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK) + 1; in pmic_gpio_populate()
964 pad->is_enabled = true; in pmic_gpio_populate()
973 struct pmic_gpio_state *state = container_of(domain->host_data, in pmic_gpio_domain_translate()
977 if (fwspec->param_count != 2 || in pmic_gpio_domain_translate()
978 fwspec->param[0] < 1 || fwspec->param[0] > state->chip.ngpio) in pmic_gpio_domain_translate()
979 return -EINVAL; in pmic_gpio_domain_translate()
981 *hwirq = fwspec->param[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_domain_translate()
982 *type = fwspec->param[1]; in pmic_gpio_domain_translate()
1001 *parent_hwirq = child_hwirq + state->pid_base; in pmic_gpio_child_to_parent_hwirq()
1013 struct irq_fwspec *fwspec = &gfwspec->fwspec; in pmic_gpio_populate_parent_fwspec()
1015 fwspec->fwnode = chip->irq.parent_domain->fwnode; in pmic_gpio_populate_parent_fwspec()
1017 fwspec->param_count = 4; in pmic_gpio_populate_parent_fwspec()
1018 fwspec->param[0] = state->usid; in pmic_gpio_populate_parent_fwspec()
1019 fwspec->param[1] = parent_hwirq; in pmic_gpio_populate_parent_fwspec()
1021 fwspec->param[3] = parent_type; in pmic_gpio_populate_parent_fwspec()
1031 gpiochip_disable_irq(gc, data->hwirq); in pmic_gpio_irq_mask()
1038 gpiochip_enable_irq(gc, data->hwirq); in pmic_gpio_irq_unmask()
1043 .name = "spmi-gpio",
1057 struct device *dev = &pdev->dev; in pmic_gpio_probe()
1067 ret = of_property_read_u32(dev->of_node, "reg", ®); in pmic_gpio_probe()
1073 npins = (uintptr_t) device_get_match_data(&pdev->dev); in pmic_gpio_probe()
1077 return -ENOMEM; in pmic_gpio_probe()
1081 state->dev = &pdev->dev; in pmic_gpio_probe()
1082 state->map = dev_get_regmap(dev->parent, NULL); in pmic_gpio_probe()
1083 parent_spmi_dev = to_spmi_device(dev->parent); in pmic_gpio_probe()
1084 state->usid = parent_spmi_dev->usid; in pmic_gpio_probe()
1085 state->pid_base = reg >> 8; in pmic_gpio_probe()
1089 return -ENOMEM; in pmic_gpio_probe()
1093 return -ENOMEM; in pmic_gpio_probe()
1097 return -ENOMEM; in pmic_gpio_probe()
1099 pctrldesc->pctlops = &pmic_gpio_pinctrl_ops; in pmic_gpio_probe()
1100 pctrldesc->pmxops = &pmic_gpio_pinmux_ops; in pmic_gpio_probe()
1101 pctrldesc->confops = &pmic_gpio_pinconf_ops; in pmic_gpio_probe()
1102 pctrldesc->owner = THIS_MODULE; in pmic_gpio_probe()
1103 pctrldesc->name = dev_name(dev); in pmic_gpio_probe()
1104 pctrldesc->pins = pindesc; in pmic_gpio_probe()
1105 pctrldesc->npins = npins; in pmic_gpio_probe()
1106 pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings); in pmic_gpio_probe()
1107 pctrldesc->custom_params = pmic_gpio_bindings; in pmic_gpio_probe()
1109 pctrldesc->custom_conf_items = pmic_conf_items; in pmic_gpio_probe()
1114 pindesc->drv_data = pad; in pmic_gpio_probe()
1115 pindesc->number = i; in pmic_gpio_probe()
1116 pindesc->name = pmic_gpio_groups[i]; in pmic_gpio_probe()
1118 pad->base = reg + i * PMIC_GPIO_ADDRESS_RANGE; in pmic_gpio_probe()
1125 state->chip = pmic_gpio_gpio_template; in pmic_gpio_probe()
1126 state->chip.parent = dev; in pmic_gpio_probe()
1127 state->chip.base = -1; in pmic_gpio_probe()
1128 state->chip.ngpio = npins; in pmic_gpio_probe()
1129 state->chip.label = dev_name(dev); in pmic_gpio_probe()
1130 state->chip.of_gpio_n_cells = 2; in pmic_gpio_probe()
1131 state->chip.can_sleep = false; in pmic_gpio_probe()
1133 state->ctrl = devm_pinctrl_register(dev, pctrldesc, state); in pmic_gpio_probe()
1134 if (IS_ERR(state->ctrl)) in pmic_gpio_probe()
1135 return PTR_ERR(state->ctrl); in pmic_gpio_probe()
1137 parent_node = of_irq_find_parent(state->dev->of_node); in pmic_gpio_probe()
1139 return -ENXIO; in pmic_gpio_probe()
1144 return -ENXIO; in pmic_gpio_probe()
1146 girq = &state->chip.irq; in pmic_gpio_probe()
1148 girq->default_type = IRQ_TYPE_NONE; in pmic_gpio_probe()
1149 girq->handler = handle_level_irq; in pmic_gpio_probe()
1150 girq->fwnode = dev_fwnode(state->dev); in pmic_gpio_probe()
1151 girq->parent_domain = parent_domain; in pmic_gpio_probe()
1152 girq->child_to_parent_hwirq = pmic_gpio_child_to_parent_hwirq; in pmic_gpio_probe()
1153 girq->populate_parent_alloc_arg = pmic_gpio_populate_parent_fwspec; in pmic_gpio_probe()
1154 girq->child_offset_to_irq = pmic_gpio_child_offset_to_irq; in pmic_gpio_probe()
1155 girq->child_irq_domain_ops.translate = pmic_gpio_domain_translate; in pmic_gpio_probe()
1157 ret = gpiochip_add_data(&state->chip, state); in pmic_gpio_probe()
1159 dev_err(state->dev, "can't add gpio chip\n"); in pmic_gpio_probe()
1164 * For DeviceTree-supported systems, the gpio core checks the in pmic_gpio_probe()
1165 * pinctrl's device node for the "gpio-ranges" property. in pmic_gpio_probe()
1170 * files which don't set the "gpio-ranges" property or systems that in pmic_gpio_probe()
1173 if (!of_property_present(dev->of_node, "gpio-ranges")) { in pmic_gpio_probe()
1174 ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, in pmic_gpio_probe()
1185 gpiochip_remove(&state->chip); in pmic_gpio_probe()
1193 gpiochip_remove(&state->chip); in pmic_gpio_remove()
1197 { .compatible = "qcom,pm2250-gpio", .data = (void *) 10 },
1199 { .compatible = "qcom,pm660-gpio", .data = (void *) 13 },
1201 { .compatible = "qcom,pm660l-gpio", .data = (void *) 12 },
1202 { .compatible = "qcom,pm6125-gpio", .data = (void *) 9 },
1203 { .compatible = "qcom,pm6150-gpio", .data = (void *) 10 },
1204 { .compatible = "qcom,pm6150l-gpio", .data = (void *) 12 },
1205 { .compatible = "qcom,pm6350-gpio", .data = (void *) 9 },
1206 { .compatible = "qcom,pm6450-gpio", .data = (void *) 9 },
1207 { .compatible = "qcom,pm7250b-gpio", .data = (void *) 12 },
1208 { .compatible = "qcom,pm7325-gpio", .data = (void *) 10 },
1209 { .compatible = "qcom,pm7550ba-gpio", .data = (void *) 8},
1210 { .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
1211 { .compatible = "qcom,pm8019-gpio", .data = (void *) 6 },
1213 { .compatible = "qcom,pm8150-gpio", .data = (void *) 10 },
1214 { .compatible = "qcom,pmc8180-gpio", .data = (void *) 10 },
1216 { .compatible = "qcom,pm8150b-gpio", .data = (void *) 12 },
1218 { .compatible = "qcom,pm8150l-gpio", .data = (void *) 12 },
1219 { .compatible = "qcom,pmc8180c-gpio", .data = (void *) 12 },
1220 { .compatible = "qcom,pm8226-gpio", .data = (void *) 8 },
1221 { .compatible = "qcom,pm8350-gpio", .data = (void *) 10 },
1222 { .compatible = "qcom,pm8350b-gpio", .data = (void *) 8 },
1223 { .compatible = "qcom,pm8350c-gpio", .data = (void *) 9 },
1224 { .compatible = "qcom,pm8450-gpio", .data = (void *) 4 },
1225 { .compatible = "qcom,pm8550-gpio", .data = (void *) 12 },
1226 { .compatible = "qcom,pm8550b-gpio", .data = (void *) 12 },
1227 { .compatible = "qcom,pm8550ve-gpio", .data = (void *) 8 },
1228 { .compatible = "qcom,pm8550vs-gpio", .data = (void *) 6 },
1229 { .compatible = "qcom,pm8916-gpio", .data = (void *) 4 },
1231 { .compatible = "qcom,pm8937-gpio", .data = (void *) 8 },
1232 { .compatible = "qcom,pm8941-gpio", .data = (void *) 36 },
1234 { .compatible = "qcom,pm8950-gpio", .data = (void *) 8 },
1236 { .compatible = "qcom,pm8953-gpio", .data = (void *) 8 },
1237 { .compatible = "qcom,pm8994-gpio", .data = (void *) 22 },
1238 { .compatible = "qcom,pm8998-gpio", .data = (void *) 26 },
1239 { .compatible = "qcom,pma8084-gpio", .data = (void *) 22 },
1240 { .compatible = "qcom,pmc8380-gpio", .data = (void *) 10 },
1241 { .compatible = "qcom,pmd8028-gpio", .data = (void *) 4 },
1242 { .compatible = "qcom,pmi632-gpio", .data = (void *) 8 },
1243 { .compatible = "qcom,pmi8950-gpio", .data = (void *) 2 },
1244 { .compatible = "qcom,pmi8994-gpio", .data = (void *) 10 },
1245 { .compatible = "qcom,pmi8998-gpio", .data = (void *) 14 },
1246 { .compatible = "qcom,pmih0108-gpio", .data = (void *) 18 },
1247 { .compatible = "qcom,pmk8350-gpio", .data = (void *) 4 },
1248 { .compatible = "qcom,pmk8550-gpio", .data = (void *) 6 },
1249 { .compatible = "qcom,pmm8155au-gpio", .data = (void *) 10 },
1250 { .compatible = "qcom,pmm8654au-gpio", .data = (void *) 12 },
1252 { .compatible = "qcom,pmp8074-gpio", .data = (void *) 12 },
1253 { .compatible = "qcom,pmr735a-gpio", .data = (void *) 4 },
1254 { .compatible = "qcom,pmr735b-gpio", .data = (void *) 4 },
1255 { .compatible = "qcom,pmr735d-gpio", .data = (void *) 2 },
1257 { .compatible = "qcom,pms405-gpio", .data = (void *) 12 },
1259 { .compatible = "qcom,pmx55-gpio", .data = (void *) 11 },
1260 { .compatible = "qcom,pmx65-gpio", .data = (void *) 16 },
1261 { .compatible = "qcom,pmx75-gpio", .data = (void *) 16 },
1262 { .compatible = "qcom,pmxr2230-gpio", .data = (void *) 12 },
1270 .name = "qcom-spmi-gpio",
1279 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
1281 MODULE_ALIAS("platform:qcom-spmi-gpio");