]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: qcom: lpass-lpi: Add ability to use custom pin offsets
authorNickolay Goppen <setotau@mainlining.org>
Mon, 8 Sep 2025 12:28:44 +0000 (15:28 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 10 Sep 2025 13:35:41 +0000 (15:35 +0200)
By default pin_offset is calculated by formula: LPI_TLMM_REG_OFFSET * pin_id.
However not all platforms are using this pin_offset formula (e.g. SDM660 LPASS
LPI uses a predefined array of offsets [1]), so extend lpi_pingroup struct
with pin_offset field, introduce extended LPI_PINGROUP_OFFSET macro with
pin_offet field and introduce LPI_FLAG_USE_PREDEFINED_PIN_OFFSET flag.
This adds an ability to use predefined offset for pin if it exists.

[1] https://git.codelinaro.org/clo/la/kernel/msm-4.4/-/blob/LA.UM.7.2.c27-07400-sdm660.0/drivers/pinctrl/qcom/pinctrl-lpi.c#L107

Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Nickolay Goppen <setotau@mainlining.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/qcom/pinctrl-lpass-lpi.c
drivers/pinctrl/qcom/pinctrl-lpass-lpi.h

index 28eb92a2b249fe1bac06684a0d9c43ae1b640914..1c97ec44aa5ff7f7886dc913bdec5c978b04b14c 100644 (file)
@@ -41,13 +41,27 @@ struct lpi_pinctrl {
 static int lpi_gpio_read(struct lpi_pinctrl *state, unsigned int pin,
                         unsigned int addr)
 {
-       return ioread32(state->tlmm_base + LPI_TLMM_REG_OFFSET * pin + addr);
+       u32 pin_offset;
+
+       if (state->data->flags & LPI_FLAG_USE_PREDEFINED_PIN_OFFSET)
+               pin_offset = state->data->groups[pin].pin_offset;
+       else
+               pin_offset = LPI_TLMM_REG_OFFSET * pin;
+
+       return ioread32(state->tlmm_base + pin_offset + addr);
 }
 
 static int lpi_gpio_write(struct lpi_pinctrl *state, unsigned int pin,
                          unsigned int addr, unsigned int val)
 {
-       iowrite32(val, state->tlmm_base + LPI_TLMM_REG_OFFSET * pin + addr);
+       u32 pin_offset;
+
+       if (state->data->flags & LPI_FLAG_USE_PREDEFINED_PIN_OFFSET)
+               pin_offset = state->data->groups[pin].pin_offset;
+       else
+               pin_offset = LPI_TLMM_REG_OFFSET * pin;
+
+       iowrite32(val, state->tlmm_base + pin_offset + addr);
 
        return 0;
 }
index a9b2f65c1ebe0f8fb5d7814f8ef8b723c617c85b..f48368492861348519ea19b5291ac7df13050eef 100644 (file)
@@ -55,6 +55,22 @@ struct pinctrl_pin_desc;
                        LPI_MUX_##f4,                   \
                },                                      \
                .nfuncs = 5,                            \
+               .pin_offset = 0,                        \
+       }
+
+#define LPI_PINGROUP_OFFSET(id, soff, f1, f2, f3, f4, poff)    \
+       {                                                       \
+               .pin = id,                                      \
+               .slew_offset = soff,                            \
+               .funcs = (int[]){                               \
+                       LPI_MUX_gpio,                           \
+                       LPI_MUX_##f1,                           \
+                       LPI_MUX_##f2,                           \
+                       LPI_MUX_##f3,                           \
+                       LPI_MUX_##f4,                           \
+               },                                              \
+               .nfuncs = 5,                                    \
+               .pin_offset = poff,                             \
        }
 
 /*
@@ -62,6 +78,7 @@ struct pinctrl_pin_desc;
  * pin configuration.
  */
 #define LPI_FLAG_SLEW_RATE_SAME_REG                    BIT(0)
+#define LPI_FLAG_USE_PREDEFINED_PIN_OFFSET             BIT(1)
 
 struct lpi_pingroup {
        unsigned int pin;
@@ -69,6 +86,7 @@ struct lpi_pingroup {
        int slew_offset;
        unsigned int *funcs;
        unsigned int nfuncs;
+       unsigned int pin_offset;
 };
 
 struct lpi_function {