pinctrl: qcom: Add support for i2c specific pull feature
authorAbel Vesa <abel.vesa@linaro.org>
Thu, 9 Feb 2023 07:45:09 +0000 (09:45 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 10 Feb 2023 22:47:07 +0000 (23:47 +0100)
Add support for the new i2c_pull property introduced for SM8550 setting
a I2C specific pull mode on I2C able pins. Add the bit to the SM8550
specific driver while at it.

Co-developed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20230209074510.4153294-1-abel.vesa@linaro.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/qcom/pinctrl-msm.c
drivers/pinctrl/qcom/pinctrl-msm.h
drivers/pinctrl/qcom/pinctrl-sm8550.c

index 5142c363480a062d41d6e58c2350ff0d3751b423..a69f93e74435b48581c8c36eec35e42aa9d0162e 100644 (file)
@@ -310,6 +310,8 @@ static int msm_config_reg(struct msm_pinctrl *pctrl,
        case PIN_CONFIG_BIAS_PULL_UP:
                *bit = g->pull_bit;
                *mask = 3;
+               if (g->i2c_pull_bit)
+                       *mask |= BIT(g->i2c_pull_bit) >> *bit;
                break;
        case PIN_CONFIG_DRIVE_OPEN_DRAIN:
                *bit = g->od_bit;
@@ -336,6 +338,7 @@ static int msm_config_reg(struct msm_pinctrl *pctrl,
 #define MSM_KEEPER             2
 #define MSM_PULL_UP_NO_KEEPER  2
 #define MSM_PULL_UP            3
+#define MSM_I2C_STRONG_PULL_UP 2200
 
 static unsigned msm_regval_to_drive(u32 val)
 {
@@ -387,6 +390,8 @@ static int msm_config_group_get(struct pinctrl_dev *pctldev,
        case PIN_CONFIG_BIAS_PULL_UP:
                if (pctrl->soc->pull_no_keeper)
                        arg = arg == MSM_PULL_UP_NO_KEEPER;
+               else if (arg & BIT(g->i2c_pull_bit))
+                       arg = MSM_I2C_STRONG_PULL_UP;
                else
                        arg = arg == MSM_PULL_UP;
                if (!arg)
@@ -467,6 +472,8 @@ static int msm_config_group_set(struct pinctrl_dev *pctldev,
                case PIN_CONFIG_BIAS_PULL_UP:
                        if (pctrl->soc->pull_no_keeper)
                                arg = MSM_PULL_UP_NO_KEEPER;
+                       else if (g->i2c_pull_bit && arg == MSM_I2C_STRONG_PULL_UP)
+                               arg = BIT(g->i2c_pull_bit) | MSM_PULL_UP;
                        else
                                arg = MSM_PULL_UP;
                        break;
index 05a1209bf9ae0869c5df1e1199516be3f41c9480..985eceda2517357a7a8bc7872cc53fa340d49c39 100644 (file)
@@ -80,6 +80,7 @@ struct msm_pingroup {
 
        unsigned pull_bit:5;
        unsigned drv_bit:5;
+       unsigned i2c_pull_bit:5;
 
        unsigned od_bit:5;
        unsigned egpio_enable:5;
index 0b7db7d4054abeae0142e4b73bc1a82c203b4846..c9d038098f2cad8fa7f4f6d060d8e5dcf6eb213c 100644 (file)
@@ -47,6 +47,7 @@
                .mux_bit = 2,                   \
                .pull_bit = 0,                  \
                .drv_bit = 6,                   \
+               .i2c_pull_bit = 13,             \
                .egpio_enable = 12,             \
                .egpio_present = 11,            \
                .oe_bit = 9,                    \