]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
pinctrl: qcom: add support setting pin configuration for special pins
authorNeil Armstrong <neil.armstrong@linaro.org>
Tue, 28 May 2024 08:31:55 +0000 (10:31 +0200)
committerCaleb Connolly <caleb.connolly@linaro.org>
Fri, 5 Jul 2024 10:04:48 +0000 (12:04 +0200)
Use the previously introduced msm_special_pin_data to setup the special
pins configuration if the SoC driver have them specified.

Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Sumit Garg <sumit.garg@linaro.org>
drivers/pinctrl/qcom/pinctrl-qcom.c

index 4f4e9a839490df7ccfea8b859bc1287f01585fdc..26a3fba194a236bc66ce32ae79b861513739865e 100644 (file)
@@ -103,14 +103,47 @@ static int msm_pinmux_set(struct udevice *dev, unsigned int pin_selector,
        return 0;
 }
 
+static int msm_pinconf_set_special(struct msm_pinctrl_priv *priv, unsigned int pin_selector,
+                                  unsigned int param, unsigned int argument)
+{
+       unsigned int offset = pin_selector - priv->data->pin_data.special_pins_start;
+       const struct msm_special_pin_data *data;
+
+       if (!priv->data->pin_data.special_pins_data)
+               return 0;
+
+       data = &priv->data->pin_data.special_pins_data[offset];
+
+       switch (param) {
+       case PIN_CONFIG_DRIVE_STRENGTH:
+               argument = (argument / 2) - 1;
+               clrsetbits_le32(priv->base + data->ctl_reg,
+                               GENMASK(2, 0) << data->drv_bit,
+                               argument << data->drv_bit);
+               break;
+       case PIN_CONFIG_BIAS_DISABLE:
+               clrbits_le32(priv->base + data->ctl_reg,
+                            TLMM_GPIO_PULL_MASK << data->pull_bit);
+               break;
+       case PIN_CONFIG_BIAS_PULL_UP:
+               clrsetbits_le32(priv->base + data->ctl_reg,
+                               TLMM_GPIO_PULL_MASK << data->pull_bit,
+                               argument << data->pull_bit);
+               break;
+       default:
+               return 0;
+       }
+
+       return 0;
+}
+
 static int msm_pinconf_set(struct udevice *dev, unsigned int pin_selector,
                           unsigned int param, unsigned int argument)
 {
        struct msm_pinctrl_priv *priv = dev_get_priv(dev);
 
-       /* Always NOP for special pins */
        if (qcom_is_special_pin(&priv->data->pin_data, pin_selector))
-               return 0;
+               return msm_pinconf_set_special(priv, pin_selector, param, argument);
 
        switch (param) {
        case PIN_CONFIG_DRIVE_STRENGTH: