From: Andy Shevchenko <andriy.shevche...@linux.intel.com>

[ Upstream commit 0fa86fc2e28227f1e64f13867e73cf864c6d25ad ]

When GPIO library asks pin control to set the bias, it doesn't pass
any value of it and argument is considered boolean (and this is true
for ACPI GpioIo() / GpioInt() resources, by the way). Thus, individual
drivers must behave well, when they got the resistance value of 1 Ohm,
i.e. transforming it to sane default.

In case of Intel Merrifield pin control hardware the 20 kOhm sounds plausible
because it gives a good trade off between weakness and minimization of leakage
current (will be only 50 uA with the above choice).

Fixes: 4e80c8f50574 ("pinctrl: intel: Add Intel Merrifield pin controller 
support")
Depends-on: 2956b5d94a76 ("pinctrl / gpio: Introduce .set_config() callback for 
GPIO chips")
Signed-off-by: Andy Shevchenko <andriy.shevche...@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerb...@linux.intel.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/pinctrl/intel/pinctrl-merrifield.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/pinctrl/intel/pinctrl-merrifield.c 
b/drivers/pinctrl/intel/pinctrl-merrifield.c
index 04d6fd2be08cc..8d0cff3146b87 100644
--- a/drivers/pinctrl/intel/pinctrl-merrifield.c
+++ b/drivers/pinctrl/intel/pinctrl-merrifield.c
@@ -731,6 +731,10 @@ static int mrfld_config_set_pin(struct mrfld_pinctrl *mp, 
unsigned int pin,
                mask |= BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
                bits |= BUFCFG_PU_EN;
 
+               /* Set default strength value in case none is given */
+               if (arg == 1)
+                       arg = 20000;
+
                switch (arg) {
                case 50000:
                        bits |= BUFCFG_PUPD_VAL_50K << BUFCFG_PUPD_VAL_SHIFT;
@@ -751,6 +755,10 @@ static int mrfld_config_set_pin(struct mrfld_pinctrl *mp, 
unsigned int pin,
                mask |= BUFCFG_Px_EN_MASK | BUFCFG_PUPD_VAL_MASK;
                bits |= BUFCFG_PD_EN;
 
+               /* Set default strength value in case none is given */
+               if (arg == 1)
+                       arg = 20000;
+
                switch (arg) {
                case 50000:
                        bits |= BUFCFG_PUPD_VAL_50K << BUFCFG_PUPD_VAL_SHIFT;
-- 
2.27.0



Reply via email to