|
@@ -353,6 +353,21 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
|
|
|
+{
|
|
|
+ u32 value;
|
|
|
+
|
|
|
+ value = readl(padcfg0);
|
|
|
+ if (input) {
|
|
|
+ value &= ~PADCFG0_GPIORXDIS;
|
|
|
+ value |= PADCFG0_GPIOTXDIS;
|
|
|
+ } else {
|
|
|
+ value &= ~PADCFG0_GPIOTXDIS;
|
|
|
+ value |= PADCFG0_GPIORXDIS;
|
|
|
+ }
|
|
|
+ writel(value, padcfg0);
|
|
|
+}
|
|
|
+
|
|
|
static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|
|
struct pinctrl_gpio_range *range,
|
|
|
unsigned pin)
|
|
@@ -375,11 +390,11 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|
|
/* Disable SCI/SMI/NMI generation */
|
|
|
value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
|
|
|
value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
|
|
|
- /* Disable TX buffer and enable RX (this will be input) */
|
|
|
- value &= ~PADCFG0_GPIORXDIS;
|
|
|
- value |= PADCFG0_GPIOTXDIS;
|
|
|
writel(value, padcfg0);
|
|
|
|
|
|
+ /* Disable TX buffer and enable RX (this will be input) */
|
|
|
+ __intel_gpio_set_direction(padcfg0, true);
|
|
|
+
|
|
|
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
|
|
|
|
|
return 0;
|
|
@@ -392,18 +407,11 @@ static int intel_gpio_set_direction(struct pinctrl_dev *pctldev,
|
|
|
struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
|
|
|
void __iomem *padcfg0;
|
|
|
unsigned long flags;
|
|
|
- u32 value;
|
|
|
|
|
|
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
|
|
|
|
|
padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
|
|
|
-
|
|
|
- value = readl(padcfg0);
|
|
|
- if (input)
|
|
|
- value |= PADCFG0_GPIOTXDIS;
|
|
|
- else
|
|
|
- value &= ~PADCFG0_GPIOTXDIS;
|
|
|
- writel(value, padcfg0);
|
|
|
+ __intel_gpio_set_direction(padcfg0, input);
|
|
|
|
|
|
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
|
|
|
|