pinctrl: qcom: spmi-gpio: implement .get_direction()
GPIO controller driver should typically implement the .get_direction() callback as GPIOLIB internals may try to use it to determine the state of a pin. Since introduction of shared proxy, it prints a warning splat when using a shared spmi gpio. The implementation is not easy because the controller supports enabling the input and output logic at the same time, so we aligns on the behaviour of the .get() operation and return -EINVAL in other situations. Fixes:eadff30244("pinctrl: Qualcomm SPMI PMIC GPIO pin controller driver") Fixes:d7b5f5cc5e("pinctrl: qcom: spmi-gpio: Add support for GPIO LV/MV subtype") Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> Signed-off-by: Linus Walleij <linusw@kernel.org>
This commit is contained in:
parent
1f318b96cc
commit
2634475324
|
|
@ -723,6 +723,21 @@ static const struct pinconf_ops pmic_gpio_pinconf_ops = {
|
|||
.pin_config_group_dbg_show = pmic_gpio_config_dbg_show,
|
||||
};
|
||||
|
||||
static int pmic_gpio_get_direction(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct pmic_gpio_state *state = gpiochip_get_data(chip);
|
||||
struct pmic_gpio_pad *pad;
|
||||
|
||||
pad = state->ctrl->desc->pins[pin].drv_data;
|
||||
|
||||
if (!pad->is_enabled || pad->analog_pass ||
|
||||
(!pad->input_enabled && !pad->output_enabled))
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure the state is aligned on what pmic_gpio_get() returns */
|
||||
return pad->input_enabled ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
static int pmic_gpio_direction_input(struct gpio_chip *chip, unsigned pin)
|
||||
{
|
||||
struct pmic_gpio_state *state = gpiochip_get_data(chip);
|
||||
|
|
@ -801,6 +816,7 @@ static void pmic_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
|||
}
|
||||
|
||||
static const struct gpio_chip pmic_gpio_gpio_template = {
|
||||
.get_direction = pmic_gpio_get_direction,
|
||||
.direction_input = pmic_gpio_direction_input,
|
||||
.direction_output = pmic_gpio_direction_output,
|
||||
.get = pmic_gpio_get,
|
||||
|
|
|
|||
Loading…
Reference in New Issue