pinctrl: cherryview: add option to set open-drain pin config
authorDan O'Donovan <dan@emutex.com>
Fri, 10 Jun 2016 12:23:35 +0000 (13:23 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 15 Jun 2016 06:37:39 +0000 (08:37 +0200)
On some CHV platforms, we need an option to configure the
open-drain setting for these pins.  This adds support for the
PIN_CONFIG_DRIVE_PUSH_PULL and PIN_CONFIG_DRIVE_OPEN_DRAIN to
disable/enable open-drain mode for a specific pin.

Signed-off-by: Dan O'Donovan <dan@emutex.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/intel/pinctrl-cherryview.c

index bf65c948b31d0ad64dd11b8f8e818b2d0411a950..7b3f147279c82653ff5b319783e411e8461c4527 100644 (file)
@@ -1108,6 +1108,27 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin,
        return 0;
 }
 
+static int chv_config_set_oden(struct chv_pinctrl *pctrl, unsigned int pin,
+                              bool enable)
+{
+       void __iomem *reg = chv_padreg(pctrl, pin, CHV_PADCTRL1);
+       unsigned long flags;
+       u32 ctrl1;
+
+       raw_spin_lock_irqsave(&chv_lock, flags);
+       ctrl1 = readl(reg);
+
+       if (enable)
+               ctrl1 |= CHV_PADCTRL1_ODEN;
+       else
+               ctrl1 &= ~CHV_PADCTRL1_ODEN;
+
+       chv_writel(ctrl1, reg);
+       raw_spin_unlock_irqrestore(&chv_lock, flags);
+
+       return 0;
+}
+
 static int chv_config_set(struct pinctrl_dev *pctldev, unsigned pin,
                          unsigned long *configs, unsigned nconfigs)
 {
@@ -1132,6 +1153,18 @@ static int chv_config_set(struct pinctrl_dev *pctldev, unsigned pin,
                                return ret;
                        break;
 
+               case PIN_CONFIG_DRIVE_PUSH_PULL:
+                       ret = chv_config_set_oden(pctrl, pin, false);
+                       if (ret)
+                               return ret;
+                       break;
+
+               case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+                       ret = chv_config_set_oden(pctrl, pin, true);
+                       if (ret)
+                               return ret;
+                       break;
+
                default:
                        return -ENOTSUPP;
                }