[PATCH] pinctrl: meson: fix drive strength register and bit calculation

From: hhk7734
Date: Wed Jun 10 2020 - 00:14:04 EST


From: Hyeonki Hong <hhk7734@xxxxxxxxx>

If a GPIO bank has greater than 16 pins, PAD_DS_REG is split into two
registers. However, when register and bit were calculated, the first
register defined in the bank was used, and the bit was calculated based
on the first pin. This causes problems in setting the driving strength.

Solved the problem by changing the bit using a mask and selecting the
next register when the bit exceeds 15.

Signed-off-by: Hyeonki Hong <hhk7734@xxxxxxxxx>
---
drivers/pinctrl/meson/pinctrl-meson.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index bbc919bef2bf..ef66239b7df5 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -98,6 +98,13 @@ static void meson_calc_reg_and_bit(struct meson_bank *bank, unsigned int pin,

*reg = desc->reg * 4;
*bit = desc->bit + pin - bank->first;
+
+ if (reg_type == REG_DS) {
+ if (*bit > 15) {
+ *bit &= 0xf;
+ *reg += 4;
+ }
+ }
}

static int meson_get_groups_count(struct pinctrl_dev *pcdev)
--
2.17.1