pinctrl: qcom: lpass-lpi: split slew rate set to separate function
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Fri, 13 Oct 2023 14:59:34 +0000 (16:59 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 14 Nov 2023 07:44:40 +0000 (08:44 +0100)
Setting slew rate for each pin will grow with upcoming Qualcomm SoCs,
so split the code responsible for this into separate function for easier
readability and maintenance.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Link: https://lore.kernel.org/r/20231013145935.220945-2-krzysztof.kozlowski@linaro.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/qcom/pinctrl-lpass-lpi.c

index 9651aed048cf4bb64670cdc93120356e009c7f76..4fb808545f7f6478ad3ed74a43465bc751ff00f5 100644 (file)
@@ -186,6 +186,35 @@ static int lpi_config_get(struct pinctrl_dev *pctldev,
        return 0;
 }
 
+static int lpi_config_set_slew_rate(struct lpi_pinctrl *pctrl,
+                                   const struct lpi_pingroup *g,
+                                   unsigned int group, unsigned int slew)
+{
+       unsigned long sval;
+       int slew_offset;
+
+       if (slew > LPI_SLEW_RATE_MAX) {
+               dev_err(pctrl->dev, "invalid slew rate %u for pin: %d\n",
+                       slew, group);
+               return -EINVAL;
+       }
+
+       slew_offset = g->slew_offset;
+       if (slew_offset == LPI_NO_SLEW)
+               return 0;
+
+       mutex_lock(&pctrl->lock);
+
+       sval = ioread32(pctrl->slew_base + LPI_SLEW_RATE_CTL_REG);
+       sval &= ~(LPI_SLEW_RATE_MASK << slew_offset);
+       sval |= slew << slew_offset;
+       iowrite32(sval, pctrl->slew_base + LPI_SLEW_RATE_CTL_REG);
+
+       mutex_unlock(&pctrl->lock);
+
+       return 0;
+}
+
 static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int group,
                          unsigned long *configs, unsigned int nconfs)
 {
@@ -193,8 +222,7 @@ static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int group,
        unsigned int param, arg, pullup = LPI_GPIO_BIAS_DISABLE, strength = 2;
        bool value, output_enabled = false;
        const struct lpi_pingroup *g;
-       unsigned long sval;
-       int i, slew_offset;
+       int i, ret;
        u32 val;
 
        g = &pctrl->data->groups[group];
@@ -226,24 +254,9 @@ static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int group,
                        strength = arg;
                        break;
                case PIN_CONFIG_SLEW_RATE:
-                       if (arg > LPI_SLEW_RATE_MAX) {
-                               dev_err(pctldev->dev, "invalid slew rate %u for pin: %d\n",
-                                       arg, group);
-                               return -EINVAL;
-                       }
-
-                       slew_offset = g->slew_offset;
-                       if (slew_offset == LPI_NO_SLEW)
-                               break;
-
-                       mutex_lock(&pctrl->lock);
-
-                       sval = ioread32(pctrl->slew_base + LPI_SLEW_RATE_CTL_REG);
-                       sval &= ~(LPI_SLEW_RATE_MASK << slew_offset);
-                       sval |= arg << slew_offset;
-                       iowrite32(sval, pctrl->slew_base + LPI_SLEW_RATE_CTL_REG);
-
-                       mutex_unlock(&pctrl->lock);
+                       ret = lpi_config_set_slew_rate(pctrl, g, group, arg);
+                       if (ret)
+                               return ret;
                        break;
                default:
                        return -EINVAL;