aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2015-01-29 05:44:48 -0500
committerLinus Walleij <linus.walleij@linaro.org>2015-02-04 03:59:26 -0500
commit2479c7300ed943d62c88cd928ddccb4677c71ad4 (patch)
treef0f090e196cf64b2ff1cdbed92aa63fa9036abc1
parent34027ca2bbc6043fea8fc5c4a82670518b6be7df (diff)
pinctrl: cherryview: Configure HiZ pins to be input when requested as GPIOs
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 <jerome.blin@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/intel/pinctrl-cherryview.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c
index a2f23c357df3..3034fd03bced 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,
880 value &= ~CHV_PADCTRL1_INVRXTX_MASK; 880 value &= ~CHV_PADCTRL1_INVRXTX_MASK;
881 chv_writel(value, reg); 881 chv_writel(value, reg);
882 882
883 /* Switch to a GPIO mode */
884 reg = chv_padreg(pctrl, offset, CHV_PADCTRL0); 883 reg = chv_padreg(pctrl, offset, CHV_PADCTRL0);
885 value = readl(reg) | CHV_PADCTRL0_GPIOEN; 884 value = readl(reg);
885
886 /*
887 * If the pin is in HiZ mode (both TX and RX buffers are
888 * disabled) we turn it to be input now.
889 */
890 if ((value & CHV_PADCTRL0_GPIOCFG_MASK) ==
891 (CHV_PADCTRL0_GPIOCFG_HIZ << CHV_PADCTRL0_GPIOCFG_SHIFT)) {
892 value &= ~CHV_PADCTRL0_GPIOCFG_MASK;
893 value |= CHV_PADCTRL0_GPIOCFG_GPI <<
894 CHV_PADCTRL0_GPIOCFG_SHIFT;
895 }
896
897 /* Switch to a GPIO mode */
898 value |= CHV_PADCTRL0_GPIOEN;
886 chv_writel(value, reg); 899 chv_writel(value, reg);
887 } 900 }
888 901