From: Petr Hodina <[email protected]>

The raw TLMM function value of an alternate function is not the same on
every pin.

On GPIO 89 "qup4" sits behind tsif1_clk (value 2), on GPIO 90..92 behind
two other functions (value 3).

Add a per-pin table for the functions in use and register the "qup4"
function for the QUP0 SE4 SPI pins (GPIO 89..92) next to "qup9".

Signed-off-by: Petr Hodina <[email protected]>
---
 drivers/pinctrl/qcom/pinctrl-sdm845.c | 45 +++++++++++++++++++++++++++++++----
 1 file changed, 40 insertions(+), 5 deletions(-)

diff --git a/drivers/pinctrl/qcom/pinctrl-sdm845.c 
b/drivers/pinctrl/qcom/pinctrl-sdm845.c
index 24b42e94c7a..bfd412d8e34 100644
--- a/drivers/pinctrl/qcom/pinctrl-sdm845.c
+++ b/drivers/pinctrl/qcom/pinctrl-sdm845.c
@@ -18,9 +18,31 @@
 #define MAX_PIN_NAME_LEN 32
 static char pin_name[MAX_PIN_NAME_LEN] __section(".data");
 
+enum {
+       FUNC_QUP9,
+       FUNC_QUP4,
+       FUNC_GPIO,
+};
+
 static const struct pinctrl_function msm_pinctrl_functions[] = {
-       {"qup9", 1},
-       {"gpio", 0},
+       [FUNC_QUP9] = {"qup9", -1},
+       [FUNC_QUP4] = {"qup4", -1},
+       [FUNC_GPIO] = {"gpio", 0},
+};
+
+static const struct {
+       u8 pin;
+       u8 function;
+       u8 mux;
+} sdm845_pin_muxes[] = {
+       /* GPIO 4..5: UART9 debug console */
+       { 4, FUNC_QUP9, 1 },
+       { 5, FUNC_QUP9, 1 },
+       /* GPIO 89..92: GENI QUP0 SE4 SPI */
+       { 89, FUNC_QUP4, 2 },
+       { 90, FUNC_QUP4, 3 },
+       { 91, FUNC_QUP4, 3 },
+       { 92, FUNC_QUP4, 3 },
 };
 
 static const unsigned int sdm845_pin_offsets[] = {
@@ -80,10 +102,23 @@ static const char *sdm845_get_pin_name(struct udevice *dev,
        return pin_name;
 }
 
-static int sdm845_get_function_mux(__maybe_unused unsigned int pin,
-                                  unsigned int selector)
+static int sdm845_get_function_mux(unsigned int pin, unsigned int selector)
 {
-       return msm_pinctrl_functions[selector].val;
+       int i;
+
+       if (selector >= ARRAY_SIZE(msm_pinctrl_functions))
+               return -EINVAL;
+
+       if (selector == FUNC_GPIO)
+               return msm_pinctrl_functions[selector].val;
+
+       for (i = 0; i < ARRAY_SIZE(sdm845_pin_muxes); i++) {
+               if (sdm845_pin_muxes[i].pin == pin &&
+                   sdm845_pin_muxes[i].function == selector)
+                       return sdm845_pin_muxes[i].mux;
+       }
+
+       return -EINVAL;
 }
 
 static const struct msm_pinctrl_data sdm845_data = {

-- 
2.55.0


Reply via email to