On 19/12/2023 17:04, Caleb Connolly wrote:
Qualcomm PMICs number their GPIOs starting from 1, implement a custom
.xlate method to handle this.

Signed-off-by: Caleb Connolly <caleb.conno...@linaro.org>
---
  drivers/gpio/qcom_pmic_gpio.c | 22 ++++++++++++++++++++++
  1 file changed, 22 insertions(+)

diff --git a/drivers/gpio/qcom_pmic_gpio.c b/drivers/gpio/qcom_pmic_gpio.c
index 6167c8411678..2a4fef8d28cb 100644
--- a/drivers/gpio/qcom_pmic_gpio.c
+++ b/drivers/gpio/qcom_pmic_gpio.c
@@ -209,12 +209,34 @@ static int qcom_gpio_set_value(struct udevice *dev, 
unsigned offset,
                                       REG_CTL_OUTPUT_MASK, !!value);
  }
+static int qcom_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
+                          struct ofnode_phandle_args *args)
+{
+       struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+
+       if (args->args_count < 1)
+               return -EINVAL;
+
+       /* GPIOs in DT are 1-based */
+       desc->offset = args->args[0] - 1;
+       if (desc->offset >= uc_priv->gpio_count)
+               return -EINVAL;
+
+       if (args->args_count < 2)
+               return 0;
+
+       desc->flags = gpio_flags_xlate(args->args[1]);
+
+       return 0;
+}
+
  static const struct dm_gpio_ops qcom_gpio_ops = {
        .direction_input        = qcom_gpio_direction_input,
        .direction_output       = qcom_gpio_direction_output,
        .get_value              = qcom_gpio_get_value,
        .set_value              = qcom_gpio_set_value,
        .get_function           = qcom_gpio_get_function,
+       .xlate                  = qcom_gpio_xlate,
  };
static int qcom_gpio_probe(struct udevice *dev)


Reviewed-by: Neil Armstrong <neil.armstr...@linaro.org>

Reply via email to