The RK_BIAS_PULL_* defines do not always directly map to register
values. In some cases they have to be translated according to the
bank->pull_type array. Add the missing translation.

The original Linux driver passes pinctrl generic defines into
rockchip_set_pull() whereas the barebox driver directly passes
RK_BIAS_* values into rockchip_set_pull(), therefore I thought this
translation is not necessary and skipped it. While bringing up
SD on a RK3588 I ended up with wrong bias settings though, this
is fixed with this commit.

Fixes: 018fcba104 ("pinctrl: Update pinctrl-rockchip from kernel")
Signed-off-by: Sascha Hauer <[email protected]>
---
 drivers/pinctrl/pinctrl-rockchip.c | 31 ++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-rockchip.c 
b/drivers/pinctrl/pinctrl-rockchip.c
index 57d676fc98..d7ae77d52a 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -2101,6 +2101,21 @@ static int rockchip_set_drive_perpin(struct 
rockchip_pin_bank *bank,
        return ret;
 }
 
+static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
+       {
+               RK_BIAS_DISABLE,
+               RK_BIAS_PULL_UP,
+               RK_BIAS_PULL_DOWN,
+               RK_BIAS_BUS_HOLD
+       },
+       {
+               RK_BIAS_DISABLE,
+               RK_BIAS_PULL_DOWN,
+               RK_BIAS_DISABLE,
+               RK_BIAS_PULL_UP
+       },
+};
+
 static int rockchip_set_pull(struct rockchip_pin_bank *bank,
                                        int pin_num, int pull)
 {
@@ -2108,7 +2123,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank 
*bank,
        struct rockchip_pin_ctrl *ctrl = info->ctrl;
        struct device *dev = info->dev;
        struct regmap *regmap;
-       int reg, ret;
+       int reg, ret, i, pull_type;
        u8 bit;
        u32 data, rmask;
 
@@ -2140,19 +2155,27 @@ static int rockchip_set_pull(struct rockchip_pin_bank 
*bank,
        case RK3399:
        case RK3568:
        case RK3588:
+               pull_type = bank->pull_type[pin_num / 8];
+               ret = -EINVAL;
+               for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); i++) 
{
+                       if (rockchip_pull_list[pull_type][i] == pull) {
+                               ret = i;
+                               break;
+                       }
+               }
                /*
                 * In the TRM, pull-up being 1 for everything except the 
GPIO0_D3-D6,
                 * where that pull up value becomes 3.
                 */
                if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 
27 && pin_num <= 30) {
-                       if (pull == RK_BIAS_PULL_UP)
-                               pull = 3;
+                       if (ret == RK_BIAS_PULL_UP)
+                               ret = 3;
                }
 
                /* enable the write to the equivalent lower bits */
                data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
                rmask = data | (data >> 16);
-               data |= (pull << bit);
+               data |= (ret << bit);
 
                ret = regmap_update_bits(regmap, reg, rmask, data);
                break;
-- 
2.39.2


Reply via email to