|
@@ -1108,6 +1108,27 @@ static int chv_config_set_pull(struct chv_pinctrl *pctrl, unsigned pin,
|
|
return 0;
|
|
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,
|
|
static int chv_config_set(struct pinctrl_dev *pctldev, unsigned pin,
|
|
unsigned long *configs, unsigned nconfigs)
|
|
unsigned long *configs, unsigned nconfigs)
|
|
{
|
|
{
|
|
@@ -1132,6 +1153,18 @@ static int chv_config_set(struct pinctrl_dev *pctldev, unsigned pin,
|
|
return ret;
|
|
return ret;
|
|
break;
|
|
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:
|
|
default:
|
|
return -ENOTSUPP;
|
|
return -ENOTSUPP;
|
|
}
|
|
}
|