|
@@ -417,6 +417,14 @@ static void at91_mux_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)
|
|
|
__raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR));
|
|
|
}
|
|
|
|
|
|
+static bool at91_mux_pio3_get_deglitch(void __iomem *pio, unsigned pin)
|
|
|
+{
|
|
|
+ if ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1)
|
|
|
+ return !((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1);
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on)
|
|
|
{
|
|
|
if (is_on)
|
|
@@ -428,7 +436,8 @@ static bool at91_mux_pio3_get_debounce(void __iomem *pio, unsigned pin, u32 *div
|
|
|
{
|
|
|
*div = __raw_readl(pio + PIO_SCDR);
|
|
|
|
|
|
- return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1;
|
|
|
+ return ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) &&
|
|
|
+ ((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1);
|
|
|
}
|
|
|
|
|
|
static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,
|
|
@@ -438,9 +447,8 @@ static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask,
|
|
|
__raw_writel(mask, pio + PIO_IFSCER);
|
|
|
__raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR);
|
|
|
__raw_writel(mask, pio + PIO_IFER);
|
|
|
- } else {
|
|
|
- __raw_writel(mask, pio + PIO_IFDR);
|
|
|
- }
|
|
|
+ } else
|
|
|
+ __raw_writel(mask, pio + PIO_IFSCDR);
|
|
|
}
|
|
|
|
|
|
static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
|
|
@@ -478,7 +486,7 @@ static struct at91_pinctrl_mux_ops at91sam9x5_ops = {
|
|
|
.mux_B_periph = at91_mux_pio3_set_B_periph,
|
|
|
.mux_C_periph = at91_mux_pio3_set_C_periph,
|
|
|
.mux_D_periph = at91_mux_pio3_set_D_periph,
|
|
|
- .get_deglitch = at91_mux_get_deglitch,
|
|
|
+ .get_deglitch = at91_mux_pio3_get_deglitch,
|
|
|
.set_deglitch = at91_mux_pio3_set_deglitch,
|
|
|
.get_debounce = at91_mux_pio3_get_debounce,
|
|
|
.set_debounce = at91_mux_pio3_set_debounce,
|