|
@@ -425,6 +425,18 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
|
|
|
writel(value, padcfg0);
|
|
|
}
|
|
|
|
|
|
+static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
|
|
|
+{
|
|
|
+ u32 value;
|
|
|
+
|
|
|
+ /* Put the pad into GPIO mode */
|
|
|
+ value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
|
|
|
+ /* Disable SCI/SMI/NMI generation */
|
|
|
+ value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
|
|
|
+ value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
|
|
|
+ writel(value, padcfg0);
|
|
|
+}
|
|
|
+
|
|
|
static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|
|
struct pinctrl_gpio_range *range,
|
|
|
unsigned pin)
|
|
@@ -432,7 +444,6 @@ static int intel_gpio_request_enable(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);
|
|
|
|
|
@@ -442,13 +453,7 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|
|
}
|
|
|
|
|
|
padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
|
|
|
- /* Put the pad into GPIO mode */
|
|
|
- value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
|
|
|
- /* Disable SCI/SMI/NMI generation */
|
|
|
- value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
|
|
|
- value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
|
|
|
- writel(value, padcfg0);
|
|
|
-
|
|
|
+ intel_gpio_set_gpio_mode(padcfg0);
|
|
|
/* Disable TX buffer and enable RX (this will be input) */
|
|
|
__intel_gpio_set_direction(padcfg0, true);
|
|
|
|
|
@@ -968,6 +973,8 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned type)
|
|
|
|
|
|
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
|
|
|
|
|
+ intel_gpio_set_gpio_mode(reg);
|
|
|
+
|
|
|
value = readl(reg);
|
|
|
|
|
|
value &= ~(PADCFG0_RXEVCFG_MASK | PADCFG0_RXINV);
|