If the pin is in HiZ mode when it is requested as GPIO its value cannot be
read (it always returns 0). In order to cope with the Linux GPIO subsystem
where we do not have such state at all, turn the pin to be input instead.

Reported-by: Jerome Blin <[email protected]>
Signed-off-by: Mika Westerberg <[email protected]>
---
 drivers/pinctrl/intel/pinctrl-cherryview.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c 
b/drivers/pinctrl/intel/pinctrl-cherryview.c
index dde67d425e9c..abe18960933d 100644
--- a/drivers/pinctrl/intel/pinctrl-cherryview.c
+++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
@@ -880,9 +880,22 @@ static int chv_gpio_request_enable(struct pinctrl_dev 
*pctldev,
                value &= ~CHV_PADCTRL1_INVRXTX_MASK;
                chv_writel(value, reg);
 
-               /* Switch to a GPIO mode */
                reg = chv_padreg(pctrl, offset, CHV_PADCTRL0);
-               value = readl(reg) | CHV_PADCTRL0_GPIOEN;
+               value = readl(reg);
+
+               /*
+                * If the pin is in HiZ mode (both TX and RX buffers are
+                * disabled) we turn it to be input now.
+                */
+               if ((value & CHV_PADCTRL0_GPIOCFG_MASK) ==
+                    (CHV_PADCTRL0_GPIOCFG_HIZ << CHV_PADCTRL0_GPIOCFG_SHIFT)) {
+                       value &= ~CHV_PADCTRL0_GPIOCFG_MASK;
+                       value |= CHV_PADCTRL0_GPIOCFG_GPI <<
+                               CHV_PADCTRL0_GPIOCFG_SHIFT;
+               }
+
+               /* Switch to a GPIO mode */
+               value |= CHV_PADCTRL0_GPIOEN;
                chv_writel(value, reg);
        }
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to