• Home
  • Raw
  • Download

Lines Matching +full:dtest +full:- +full:buffer

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
11 #include <linux/pinctrl/pinconf-generic.h>
19 #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
22 #include "../pinctrl-utils.h"
93 * Output type - indicates pin should be configured as push-pull,
130 * struct pmic_gpio_pad - keep current GPIO settings
134 * @have_buffer: Set to true if GPIO output could be configured in push-pull,
135 * open-drain or open-source mode.
137 * @input_enabled: Set to true if GPIO input buffer logic is enabled.
138 * @analog_pass: Set to true if GPIO is in analog-pass-through mode.
140 * @num_sources: Number of power-sources supported by this GPIO.
141 * @power_source: Current power-source used.
142 * @buffer_type: Push-pull, open-drain or open-source.
143 * @pullup: Constant current which flow trough GPIO output buffer.
146 * @atest: the ATEST selection for GPIO analog-pass-through mode
147 * @dtest_buffer: the DTEST buffer selection for digital input mode.
177 {"qcom,pull-up-strength", PMIC_GPIO_CONF_PULL_UP, 0},
178 {"qcom,drive-strength", PMIC_GPIO_CONF_STRENGTH, 0},
180 {"qcom,analog-pass", PMIC_GPIO_CONF_ANALOG_PASS, 0},
181 {"qcom,dtest-buffer", PMIC_GPIO_CONF_DTEST_BUFFER, 0},
187 PCONFDUMP(PMIC_GPIO_CONF_STRENGTH, "drive-strength", NULL, true),
189 PCONFDUMP(PMIC_GPIO_CONF_ANALOG_PASS, "analog-pass", NULL, true),
190 PCONFDUMP(PMIC_GPIO_CONF_DTEST_BUFFER, "dtest-buffer", NULL, true),
221 ret = regmap_read(state->map, pad->base + addr, &val); in pmic_gpio_read()
223 dev_err(state->dev, "read 0x%x failed\n", addr); in pmic_gpio_read()
236 ret = regmap_write(state->map, pad->base + addr, val); in pmic_gpio_write()
238 dev_err(state->dev, "write 0x%x failed\n", addr); in pmic_gpio_write()
246 return pctldev->desc->npins; in pmic_gpio_get_groups_count()
252 return pctldev->desc->pins[pin].name; in pmic_gpio_get_group_name()
258 *pins = &pctldev->desc->pins[pin].number; in pmic_gpio_get_group_pins()
288 *num_qgroups = pctldev->desc->npins; in pmic_gpio_get_function_groups()
302 return -EINVAL; in pmic_gpio_set_mux()
305 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_set_mux()
307 * Non-LV/MV subtypes only support 2 special functions, in pmic_gpio_set_mux()
310 if (!pad->lv_mv_type) { in pmic_gpio_set_mux()
314 return -EINVAL; in pmic_gpio_set_mux()
317 function -= (PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_set_mux()
321 pad->function = function; in pmic_gpio_set_mux()
323 if (pad->analog_pass) in pmic_gpio_set_mux()
325 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_set_mux()
327 else if (pad->output_enabled) in pmic_gpio_set_mux()
332 if (pad->lv_mv_type) { in pmic_gpio_set_mux()
338 val = pad->atest - 1; in pmic_gpio_set_mux()
344 val = pad->out_value in pmic_gpio_set_mux()
346 val |= pad->function in pmic_gpio_set_mux()
354 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_set_mux()
355 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_set_mux()
362 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_set_mux()
381 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_get()
385 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS) in pmic_gpio_config_get()
386 return -EINVAL; in pmic_gpio_config_get()
390 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS) in pmic_gpio_config_get()
391 return -EINVAL; in pmic_gpio_config_get()
395 if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS) in pmic_gpio_config_get()
396 return -EINVAL; in pmic_gpio_config_get()
400 if (pad->pullup != PMIC_GPIO_PULL_DOWN) in pmic_gpio_config_get()
401 return -EINVAL; in pmic_gpio_config_get()
405 if (pad->pullup != PMIC_GPIO_PULL_DISABLE) in pmic_gpio_config_get()
406 return -EINVAL; in pmic_gpio_config_get()
410 if (pad->pullup != PMIC_GPIO_PULL_UP_30) in pmic_gpio_config_get()
411 return -EINVAL; in pmic_gpio_config_get()
415 if (pad->is_enabled) in pmic_gpio_config_get()
416 return -EINVAL; in pmic_gpio_config_get()
420 arg = pad->power_source; in pmic_gpio_config_get()
423 if (!pad->input_enabled) in pmic_gpio_config_get()
424 return -EINVAL; in pmic_gpio_config_get()
428 arg = pad->out_value; in pmic_gpio_config_get()
431 arg = pad->pullup; in pmic_gpio_config_get()
434 arg = pad->strength; in pmic_gpio_config_get()
437 arg = pad->atest; in pmic_gpio_config_get()
440 arg = pad->analog_pass; in pmic_gpio_config_get()
443 arg = pad->dtest_buffer; in pmic_gpio_config_get()
446 return -EINVAL; in pmic_gpio_config_get()
462 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_set()
464 pad->is_enabled = true; in pmic_gpio_config_set()
471 pad->buffer_type = PMIC_GPIO_OUT_BUF_CMOS; in pmic_gpio_config_set()
474 if (!pad->have_buffer) in pmic_gpio_config_set()
475 return -EINVAL; in pmic_gpio_config_set()
476 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS; in pmic_gpio_config_set()
479 if (!pad->have_buffer) in pmic_gpio_config_set()
480 return -EINVAL; in pmic_gpio_config_set()
481 pad->buffer_type = PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS; in pmic_gpio_config_set()
484 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
487 pad->pullup = PMIC_GPIO_PULL_UP_30; in pmic_gpio_config_set()
491 pad->pullup = PMIC_GPIO_PULL_DOWN; in pmic_gpio_config_set()
493 pad->pullup = PMIC_GPIO_PULL_DISABLE; in pmic_gpio_config_set()
496 pad->is_enabled = false; in pmic_gpio_config_set()
499 if (arg >= pad->num_sources) in pmic_gpio_config_set()
500 return -EINVAL; in pmic_gpio_config_set()
501 pad->power_source = arg; in pmic_gpio_config_set()
504 pad->input_enabled = arg ? true : false; in pmic_gpio_config_set()
507 pad->output_enabled = true; in pmic_gpio_config_set()
508 pad->out_value = arg; in pmic_gpio_config_set()
512 return -EINVAL; in pmic_gpio_config_set()
513 pad->pullup = arg; in pmic_gpio_config_set()
517 return -EINVAL; in pmic_gpio_config_set()
518 pad->strength = arg; in pmic_gpio_config_set()
521 if (!pad->lv_mv_type || arg > 4) in pmic_gpio_config_set()
522 return -EINVAL; in pmic_gpio_config_set()
523 pad->atest = arg; in pmic_gpio_config_set()
526 if (!pad->lv_mv_type) in pmic_gpio_config_set()
527 return -EINVAL; in pmic_gpio_config_set()
528 pad->analog_pass = true; in pmic_gpio_config_set()
532 return -EINVAL; in pmic_gpio_config_set()
533 pad->dtest_buffer = arg; in pmic_gpio_config_set()
536 return -EINVAL; in pmic_gpio_config_set()
540 val = pad->power_source << PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_config_set()
546 val = pad->pullup << PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_config_set()
552 val = pad->buffer_type << PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_config_set()
553 val |= pad->strength << PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_config_set()
559 if (pad->dtest_buffer == 0) { in pmic_gpio_config_set()
562 if (pad->lv_mv_type) { in pmic_gpio_config_set()
563 val = pad->dtest_buffer - 1; in pmic_gpio_config_set()
566 val = BIT(pad->dtest_buffer - 1); in pmic_gpio_config_set()
573 if (pad->analog_pass) in pmic_gpio_config_set()
575 else if (pad->output_enabled && pad->input_enabled) in pmic_gpio_config_set()
577 else if (pad->output_enabled) in pmic_gpio_config_set()
582 if (pad->lv_mv_type) { in pmic_gpio_config_set()
588 val = pad->atest - 1; in pmic_gpio_config_set()
594 val = pad->out_value in pmic_gpio_config_set()
596 val |= pad->function in pmic_gpio_config_set()
604 val |= pad->function << PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_config_set()
605 val |= pad->out_value & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_config_set()
612 val = pad->is_enabled << PMIC_GPIO_REG_MASTER_EN_SHIFT; in pmic_gpio_config_set()
627 "pull-up 30uA", "pull-up 1.5uA", "pull-up 31.5uA", in pmic_gpio_config_dbg_show()
628 "pull-up 1.5uA + 30uA boost", "pull-down 10uA", "no pull" in pmic_gpio_config_dbg_show()
631 "push-pull", "open-drain", "open-source" in pmic_gpio_config_dbg_show()
637 pad = pctldev->desc->pins[pin].drv_data; in pmic_gpio_config_dbg_show()
639 seq_printf(s, " gpio%-2d:", pin + PMIC_GPIO_PHYSICAL_OFFSET); in pmic_gpio_config_dbg_show()
644 seq_puts(s, " ---"); in pmic_gpio_config_dbg_show()
646 if (pad->input_enabled) { in pmic_gpio_config_dbg_show()
652 pad->out_value = ret; in pmic_gpio_config_dbg_show()
655 * For the non-LV/MV subtypes only 2 special functions are in pmic_gpio_config_dbg_show()
656 * available, offsetting the dtest function values by 2. in pmic_gpio_config_dbg_show()
658 function = pad->function; in pmic_gpio_config_dbg_show()
659 if (!pad->lv_mv_type && in pmic_gpio_config_dbg_show()
660 pad->function >= PMIC_GPIO_FUNC_INDEX_FUNC3) in pmic_gpio_config_dbg_show()
661 function += PMIC_GPIO_FUNC_INDEX_DTEST1 - in pmic_gpio_config_dbg_show()
664 if (pad->analog_pass) in pmic_gpio_config_dbg_show()
665 seq_puts(s, " analog-pass"); in pmic_gpio_config_dbg_show()
667 seq_printf(s, " %-4s", in pmic_gpio_config_dbg_show()
668 pad->output_enabled ? "out" : "in"); in pmic_gpio_config_dbg_show()
669 seq_printf(s, " %-4s", pad->out_value ? "high" : "low"); in pmic_gpio_config_dbg_show()
670 seq_printf(s, " %-7s", pmic_gpio_functions[function]); in pmic_gpio_config_dbg_show()
671 seq_printf(s, " vin-%d", pad->power_source); in pmic_gpio_config_dbg_show()
672 seq_printf(s, " %-27s", biases[pad->pullup]); in pmic_gpio_config_dbg_show()
673 seq_printf(s, " %-10s", buffer_types[pad->buffer_type]); in pmic_gpio_config_dbg_show()
674 seq_printf(s, " %-7s", strengths[pad->strength]); in pmic_gpio_config_dbg_show()
675 seq_printf(s, " atest-%d", pad->atest); in pmic_gpio_config_dbg_show()
676 seq_printf(s, " dtest-%d", pad->dtest_buffer); in pmic_gpio_config_dbg_show()
694 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_input()
705 return pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_direction_output()
714 pad = state->ctrl->desc->pins[pin].drv_data; in pmic_gpio_get()
716 if (!pad->is_enabled) in pmic_gpio_get()
717 return -EINVAL; in pmic_gpio_get()
719 if (pad->input_enabled) { in pmic_gpio_get()
724 pad->out_value = ret & PMIC_MPP_REG_RT_STS_VAL_MASK; in pmic_gpio_get()
727 return !!pad->out_value; in pmic_gpio_get()
737 pmic_gpio_config_set(state->ctrl, pin, &config, 1); in pmic_gpio_set()
744 if (chip->of_gpio_n_cells < 2) in pmic_gpio_of_xlate()
745 return -EINVAL; in pmic_gpio_of_xlate()
748 *flags = gpio_desc->args[1]; in pmic_gpio_of_xlate()
750 return gpio_desc->args[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_of_xlate()
758 for (i = 0; i < chip->ngpio; i++) { in pmic_gpio_dbg_show()
759 pmic_gpio_config_dbg_show(state->ctrl, s, i); in pmic_gpio_dbg_show()
785 dev_err(state->dev, "incorrect block type 0x%x at 0x%x\n", in pmic_gpio_populate()
786 type, pad->base); in pmic_gpio_populate()
787 return -ENODEV; in pmic_gpio_populate()
796 pad->have_buffer = true; in pmic_gpio_populate()
799 pad->num_sources = 4; in pmic_gpio_populate()
802 pad->have_buffer = true; in pmic_gpio_populate()
805 pad->num_sources = 8; in pmic_gpio_populate()
808 pad->num_sources = 1; in pmic_gpio_populate()
809 pad->have_buffer = true; in pmic_gpio_populate()
810 pad->lv_mv_type = true; in pmic_gpio_populate()
813 pad->num_sources = 2; in pmic_gpio_populate()
814 pad->have_buffer = true; in pmic_gpio_populate()
815 pad->lv_mv_type = true; in pmic_gpio_populate()
818 dev_err(state->dev, "unknown GPIO type 0x%x\n", subtype); in pmic_gpio_populate()
819 return -ENODEV; in pmic_gpio_populate()
822 if (pad->lv_mv_type) { in pmic_gpio_populate()
828 pad->out_value = !!(val & PMIC_GPIO_LV_MV_OUTPUT_INVERT); in pmic_gpio_populate()
829 pad->function = val & PMIC_GPIO_LV_MV_OUTPUT_SOURCE_SEL_MASK; in pmic_gpio_populate()
841 pad->out_value = val & PMIC_GPIO_REG_MODE_VALUE_SHIFT; in pmic_gpio_populate()
845 pad->function = val >> PMIC_GPIO_REG_MODE_FUNCTION_SHIFT; in pmic_gpio_populate()
846 pad->function &= PMIC_GPIO_REG_MODE_FUNCTION_MASK; in pmic_gpio_populate()
851 pad->input_enabled = true; in pmic_gpio_populate()
852 pad->output_enabled = false; in pmic_gpio_populate()
855 pad->input_enabled = false; in pmic_gpio_populate()
856 pad->output_enabled = true; in pmic_gpio_populate()
859 pad->input_enabled = true; in pmic_gpio_populate()
860 pad->output_enabled = true; in pmic_gpio_populate()
863 if (!pad->lv_mv_type) in pmic_gpio_populate()
864 return -ENODEV; in pmic_gpio_populate()
865 pad->analog_pass = true; in pmic_gpio_populate()
868 dev_err(state->dev, "unknown GPIO direction\n"); in pmic_gpio_populate()
869 return -ENODEV; in pmic_gpio_populate()
876 pad->power_source = val >> PMIC_GPIO_REG_VIN_SHIFT; in pmic_gpio_populate()
877 pad->power_source &= PMIC_GPIO_REG_VIN_MASK; in pmic_gpio_populate()
883 pad->pullup = val >> PMIC_GPIO_REG_PULL_SHIFT; in pmic_gpio_populate()
884 pad->pullup &= PMIC_GPIO_REG_PULL_MASK; in pmic_gpio_populate()
890 if (pad->lv_mv_type && (val & PMIC_GPIO_LV_MV_DIG_IN_DTEST_EN)) in pmic_gpio_populate()
891 pad->dtest_buffer = in pmic_gpio_populate()
893 else if (!pad->lv_mv_type) in pmic_gpio_populate()
894 pad->dtest_buffer = ffs(val); in pmic_gpio_populate()
896 pad->dtest_buffer = 0; in pmic_gpio_populate()
902 pad->strength = val >> PMIC_GPIO_REG_OUT_STRENGTH_SHIFT; in pmic_gpio_populate()
903 pad->strength &= PMIC_GPIO_REG_OUT_STRENGTH_MASK; in pmic_gpio_populate()
905 pad->buffer_type = val >> PMIC_GPIO_REG_OUT_TYPE_SHIFT; in pmic_gpio_populate()
906 pad->buffer_type &= PMIC_GPIO_REG_OUT_TYPE_MASK; in pmic_gpio_populate()
908 if (pad->lv_mv_type) { in pmic_gpio_populate()
913 pad->atest = (val & PMIC_GPIO_LV_MV_ANA_MUX_SEL_MASK) + 1; in pmic_gpio_populate()
917 pad->is_enabled = true; in pmic_gpio_populate()
926 struct pmic_gpio_state *state = container_of(domain->host_data, in pmic_gpio_domain_translate()
930 if (fwspec->param_count != 2 || in pmic_gpio_domain_translate()
931 fwspec->param[0] < 1 || fwspec->param[0] > state->chip.ngpio) in pmic_gpio_domain_translate()
932 return -EINVAL; in pmic_gpio_domain_translate()
934 *hwirq = fwspec->param[0] - PMIC_GPIO_PHYSICAL_OFFSET; in pmic_gpio_domain_translate()
935 *type = fwspec->param[1]; in pmic_gpio_domain_translate()
962 struct device *dev = &pdev->dev; in pmic_gpio_probe()
971 ret = of_property_read_u32(dev->of_node, "reg", &reg); in pmic_gpio_probe()
977 npins = (uintptr_t) device_get_match_data(&pdev->dev); in pmic_gpio_probe()
981 return -ENOMEM; in pmic_gpio_probe()
985 state->dev = &pdev->dev; in pmic_gpio_probe()
986 state->map = dev_get_regmap(dev->parent, NULL); in pmic_gpio_probe()
990 return -ENOMEM; in pmic_gpio_probe()
994 return -ENOMEM; in pmic_gpio_probe()
998 return -ENOMEM; in pmic_gpio_probe()
1000 pctrldesc->pctlops = &pmic_gpio_pinctrl_ops; in pmic_gpio_probe()
1001 pctrldesc->pmxops = &pmic_gpio_pinmux_ops; in pmic_gpio_probe()
1002 pctrldesc->confops = &pmic_gpio_pinconf_ops; in pmic_gpio_probe()
1003 pctrldesc->owner = THIS_MODULE; in pmic_gpio_probe()
1004 pctrldesc->name = dev_name(dev); in pmic_gpio_probe()
1005 pctrldesc->pins = pindesc; in pmic_gpio_probe()
1006 pctrldesc->npins = npins; in pmic_gpio_probe()
1007 pctrldesc->num_custom_params = ARRAY_SIZE(pmic_gpio_bindings); in pmic_gpio_probe()
1008 pctrldesc->custom_params = pmic_gpio_bindings; in pmic_gpio_probe()
1010 pctrldesc->custom_conf_items = pmic_conf_items; in pmic_gpio_probe()
1015 pindesc->drv_data = pad; in pmic_gpio_probe()
1016 pindesc->number = i; in pmic_gpio_probe()
1017 pindesc->name = pmic_gpio_groups[i]; in pmic_gpio_probe()
1019 pad->base = reg + i * PMIC_GPIO_ADDRESS_RANGE; in pmic_gpio_probe()
1026 state->chip = pmic_gpio_gpio_template; in pmic_gpio_probe()
1027 state->chip.parent = dev; in pmic_gpio_probe()
1028 state->chip.base = -1; in pmic_gpio_probe()
1029 state->chip.ngpio = npins; in pmic_gpio_probe()
1030 state->chip.label = dev_name(dev); in pmic_gpio_probe()
1031 state->chip.of_gpio_n_cells = 2; in pmic_gpio_probe()
1032 state->chip.can_sleep = false; in pmic_gpio_probe()
1034 state->ctrl = devm_pinctrl_register(dev, pctrldesc, state); in pmic_gpio_probe()
1035 if (IS_ERR(state->ctrl)) in pmic_gpio_probe()
1036 return PTR_ERR(state->ctrl); in pmic_gpio_probe()
1038 parent_node = of_irq_find_parent(state->dev->of_node); in pmic_gpio_probe()
1040 return -ENXIO; in pmic_gpio_probe()
1045 return -ENXIO; in pmic_gpio_probe()
1047 state->irq.name = "spmi-gpio", in pmic_gpio_probe()
1048 state->irq.irq_ack = irq_chip_ack_parent, in pmic_gpio_probe()
1049 state->irq.irq_mask = irq_chip_mask_parent, in pmic_gpio_probe()
1050 state->irq.irq_unmask = irq_chip_unmask_parent, in pmic_gpio_probe()
1051 state->irq.irq_set_type = irq_chip_set_type_parent, in pmic_gpio_probe()
1052 state->irq.irq_set_wake = irq_chip_set_wake_parent, in pmic_gpio_probe()
1053 state->irq.flags = IRQCHIP_MASK_ON_SUSPEND, in pmic_gpio_probe()
1055 girq = &state->chip.irq; in pmic_gpio_probe()
1056 girq->chip = &state->irq; in pmic_gpio_probe()
1057 girq->default_type = IRQ_TYPE_NONE; in pmic_gpio_probe()
1058 girq->handler = handle_level_irq; in pmic_gpio_probe()
1059 girq->fwnode = of_node_to_fwnode(state->dev->of_node); in pmic_gpio_probe()
1060 girq->parent_domain = parent_domain; in pmic_gpio_probe()
1061 girq->child_to_parent_hwirq = pmic_gpio_child_to_parent_hwirq; in pmic_gpio_probe()
1062 girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_fourcell; in pmic_gpio_probe()
1063 girq->child_offset_to_irq = pmic_gpio_child_offset_to_irq; in pmic_gpio_probe()
1064 girq->child_irq_domain_ops.translate = pmic_gpio_domain_translate; in pmic_gpio_probe()
1066 ret = gpiochip_add_data(&state->chip, state); in pmic_gpio_probe()
1068 dev_err(state->dev, "can't add gpio chip\n"); in pmic_gpio_probe()
1073 * For DeviceTree-supported systems, the gpio core checks the in pmic_gpio_probe()
1074 * pinctrl's device node for the "gpio-ranges" property. in pmic_gpio_probe()
1079 * files which don't set the "gpio-ranges" property or systems that in pmic_gpio_probe()
1082 if (!of_property_read_bool(dev->of_node, "gpio-ranges")) { in pmic_gpio_probe()
1083 ret = gpiochip_add_pin_range(&state->chip, dev_name(dev), 0, 0, in pmic_gpio_probe()
1094 gpiochip_remove(&state->chip); in pmic_gpio_probe()
1102 gpiochip_remove(&state->chip); in pmic_gpio_remove()
1107 { .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
1108 { .compatible = "qcom,pm8916-gpio", .data = (void *) 4 },
1109 { .compatible = "qcom,pm8941-gpio", .data = (void *) 36 },
1111 { .compatible = "qcom,pm8950-gpio", .data = (void *) 8 },
1112 { .compatible = "qcom,pmi8950-gpio", .data = (void *) 2 },
1113 { .compatible = "qcom,pm8994-gpio", .data = (void *) 22 },
1114 { .compatible = "qcom,pmi8994-gpio", .data = (void *) 10 },
1115 { .compatible = "qcom,pm8998-gpio", .data = (void *) 26 },
1116 { .compatible = "qcom,pmi8998-gpio", .data = (void *) 14 },
1117 { .compatible = "qcom,pma8084-gpio", .data = (void *) 22 },
1119 { .compatible = "qcom,pms405-gpio", .data = (void *) 12 },
1121 { .compatible = "qcom,pm660-gpio", .data = (void *) 13 },
1123 { .compatible = "qcom,pm660l-gpio", .data = (void *) 12 },
1125 { .compatible = "qcom,pm8150-gpio", .data = (void *) 10 },
1127 { .compatible = "qcom,pm8150b-gpio", .data = (void *) 12 },
1129 { .compatible = "qcom,pm8150l-gpio", .data = (void *) 12 },
1130 { .compatible = "qcom,pm6150-gpio", .data = (void *) 10 },
1131 { .compatible = "qcom,pm6150l-gpio", .data = (void *) 12 },
1139 .name = "qcom-spmi-gpio",
1148 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
1150 MODULE_ALIAS("platform:qcom-spmi-gpio");