Re: [PATCH] ARM: dts: Use level interrupt for omap4 & 5 wlcore

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 9 Oct 2019 at 18:43, Tony Lindgren <tony@xxxxxxxxxxx> wrote:
>
> Commit 572cf7d7b07d ("ARM: dts: Improve omap l4per idling with wlcore edge
> sensitive interrupt") changed wlcore interrupts to use edge interrupt based
> on what's specified in the wl1835mod.pdf data sheet.
>
> However, there are still cases where we can have lost interrupts as
> described in omap_gpio_unidle(). And using a level interrupt instead of edge
> interrupt helps as we avoid the check for untriggered GPIO interrupts in
> omap_gpio_unidle().
>
> And with commit e6818d29ea15 ("gpio: gpio-omap: configure edge detection
> for level IRQs for idle wakeup") GPIOs idle just fine with level interrupts.
>
> Let's change omap4 and 5 wlcore users back to using level interrupt
> instead of edge interrupt. Let's not change the others as I've only seen
> this on omap4 and 5, probably because the other SoCs don't have l4per idle
> independent of the CPUs.

I assume this relates to the implementation for support of SDIO IRQs
(and wakeups) in the omap_hsmmc driver?

In any case, just wanted to share some experience in the field, feel
free to do whatever you want with the below information. :-)

So, while I was working for ST-Ericsson on ux500, we had a very
similar approach to re-route the SDIO bus DAT1 line to a GPIO IRQ as a
remote/system wakeup (vendor hack in the mmci driver). In other words,
while runtime suspending the mmc host controller, we configured a GPIO
IRQ, via an always on logic, to capture the IRQ instead. The point is,
I believe we may have ended up looking at similar problems as you have
been facing on OMAP.

In hindsight, I realized that we actually violated the SDIO spec by
using this approach. More precisely, during runtime suspend we do
clock gating and then re-routes the IRQ. However, clock gating isn't
allowed before the SDIO bus width have been changed back from 4-bit
into 1-bit. This last piece of action, would be an interesting change
to see if it could affect the behaviour, but unfortunately I have
never been able to check this.

The tricky part, is that we can't issue a command to change the bus to
1-bit in omap_hsmmc ->runtime_suspend() callback (this needs to be
managed by the core in some way). However, we can make a simple test,
by simply always limit the bus width to 1-bit, as that should mean we
should conform to the SDIO spec.

Kind regards
Uffe

>
> Fixes: 572cf7d7b07d ("ARM: dts: Improve omap l4per idling with wlcore edge sensitive interrupt")
> Depends-on: e6818d29ea15 ("gpio: gpio-omap: configure edge detection for level IRQs for idle wakeup")
> Cc: Anders Roxell <anders.roxell@xxxxxxxxxx>
> Cc: Eyal Reizer <eyalr@xxxxxx>
> Cc: Guy Mishol <guym@xxxxxx>
> Cc: John Stultz <john.stultz@xxxxxxxxxx>
> Cc: Ulf Hansson <ulf.hansson@xxxxxxxxxx>
> Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>
> ---
>  arch/arm/boot/dts/omap4-droid4-xt894.dts       | 2 +-
>  arch/arm/boot/dts/omap4-panda-common.dtsi      | 2 +-
>  arch/arm/boot/dts/omap4-sdp.dts                | 2 +-
>  arch/arm/boot/dts/omap4-var-som-om44-wlan.dtsi | 2 +-
>  arch/arm/boot/dts/omap5-board-common.dtsi      | 2 +-
>  5 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm/boot/dts/omap4-droid4-xt894.dts b/arch/arm/boot/dts/omap4-droid4-xt894.dts
> --- a/arch/arm/boot/dts/omap4-droid4-xt894.dts
> +++ b/arch/arm/boot/dts/omap4-droid4-xt894.dts
> @@ -369,7 +369,7 @@
>                 compatible = "ti,wl1285", "ti,wl1283";
>                 reg = <2>;
>                 /* gpio_100 with gpmc_wait2 pad as wakeirq */
> -               interrupts-extended = <&gpio4 4 IRQ_TYPE_EDGE_RISING>,
> +               interrupts-extended = <&gpio4 4 IRQ_TYPE_LEVEL_HIGH>,
>                                       <&omap4_pmx_core 0x4e>;
>                 interrupt-names = "irq", "wakeup";
>                 ref-clock-frequency = <26000000>;
> diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi
> --- a/arch/arm/boot/dts/omap4-panda-common.dtsi
> +++ b/arch/arm/boot/dts/omap4-panda-common.dtsi
> @@ -474,7 +474,7 @@
>                 compatible = "ti,wl1271";
>                 reg = <2>;
>                 /* gpio_53 with gpmc_ncs3 pad as wakeup */
> -               interrupts-extended = <&gpio2 21 IRQ_TYPE_EDGE_RISING>,
> +               interrupts-extended = <&gpio2 21 IRQ_TYPE_LEVEL_HIGH>,
>                                       <&omap4_pmx_core 0x3a>;
>                 interrupt-names = "irq", "wakeup";
>                 ref-clock-frequency = <38400000>;
> diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts
> --- a/arch/arm/boot/dts/omap4-sdp.dts
> +++ b/arch/arm/boot/dts/omap4-sdp.dts
> @@ -512,7 +512,7 @@
>                 compatible = "ti,wl1281";
>                 reg = <2>;
>                 interrupt-parent = <&gpio1>;
> -               interrupts = <21 IRQ_TYPE_EDGE_RISING>; /* gpio 53 */
> +               interrupts = <21 IRQ_TYPE_LEVEL_HIGH>; /* gpio 53 */
>                 ref-clock-frequency = <26000000>;
>                 tcxo-clock-frequency = <26000000>;
>         };
> diff --git a/arch/arm/boot/dts/omap4-var-som-om44-wlan.dtsi b/arch/arm/boot/dts/omap4-var-som-om44-wlan.dtsi
> --- a/arch/arm/boot/dts/omap4-var-som-om44-wlan.dtsi
> +++ b/arch/arm/boot/dts/omap4-var-som-om44-wlan.dtsi
> @@ -69,7 +69,7 @@
>                 compatible = "ti,wl1271";
>                 reg = <2>;
>                 interrupt-parent = <&gpio2>;
> -               interrupts = <9 IRQ_TYPE_EDGE_RISING>; /* gpio 41 */
> +               interrupts = <9 IRQ_TYPE_LEVEL_HIGH>; /* gpio 41 */
>                 ref-clock-frequency = <38400000>;
>         };
>  };
> diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi
> --- a/arch/arm/boot/dts/omap5-board-common.dtsi
> +++ b/arch/arm/boot/dts/omap5-board-common.dtsi
> @@ -362,7 +362,7 @@
>                 pinctrl-names = "default";
>                 pinctrl-0 = <&wlcore_irq_pin>;
>                 interrupt-parent = <&gpio1>;
> -               interrupts = <14 IRQ_TYPE_EDGE_RISING>; /* gpio 14 */
> +               interrupts = <14 IRQ_TYPE_LEVEL_HIGH>;  /* gpio 14 */
>                 ref-clock-frequency = <26000000>;
>         };
>  };
> --
> 2.23.0



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux