Re: omap_hsmmc + gta04 + sdio irq + runtime_suspend + 4 bit = trouble

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

 



Hi,

On Tue, 4 Sep 2018 08:47:50 -0700
Tony Lindgren <tony@xxxxxxxxxxx> wrote:

> * Andreas Kemnade <andreas@xxxxxxxxxxxx> [180902 20:46]:
> >         mmc2_pins: pinmux_mmc2_pins {
> >                 pinctrl-single,pins = <
> >                         /* sdmmc2_clk.sdmmc2_clk */
> >                         OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)
> > 
> >                         /* sdmmc2_cmd.sdmmc2_cmd */
> >                         OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)
> > 
> >                         /* sdmmc2_dat0.sdmmc2_dat0 */
> >                         OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)
> > 
> >                         /* sdmmc2_dat0.sdmmc2_dat1 */
> >                         OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE0 | WAKEUP_EN)  
> 
> Having WAKEUP_EN here is wrong nowadays, this bit is managed by
> Linux generic wakeirqs.
> 
> > &mmc2 {
> >         pinctrl-names = "default";
> >         pinctrl-0 = <&mmc2_pins>;
> > 
> >         interrupts-extended = <&intc 86>, <&omap3_pmx_core 0x12e>;   
> 
> And then the second interrupt here must match padconf register like
> you have 0x215e - 0x2030 = 0x12e which seems correct. And you should
> start seeing interrupts with grep wake /proc/interrupts.
> 
Here is another try:
       mmc2_pins: pinmux_mmc2_pins {
                pinctrl-single,pins = <
                        /* sdmmc2_clk.sdmmc2_clk */
                        OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_cmd.sdmmc2_cmd */
                        OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat0.sdmmc2_dat0 */
                        OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat0.sdmmc2_dat1 */
                        OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat2.sdmmc2_dat2 */
                        OMAP3_CORE1_IOPAD(0x2160, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat2.sdmmc2_dat3 */
                        OMAP3_CORE1_IOPAD(0x2162, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat4.sdmmc2_dir_dat0 */
                        OMAP3_CORE1_IOPAD(0x2164, PIN_INPUT_PULLUP | MUX_MODE1)

                        /* sdmmc2_dat4.sdmmc2_dir_dat1 */
                        OMAP3_CORE1_IOPAD(0x2166,
                                          PIN_INPUT_PULLDOWN | MUX_MODE1)

                        /* sdmmc2_dat6.sdmmc2_dir_cmd */
                        OMAP3_CORE1_IOPAD(0x2168, PIN_INPUT_PULLUP | MUX_MODE1)

                        /* sdmmc2_dat6.sdmmc2_clkin */
                        OMAP3_CORE1_IOPAD(0x216a, PIN_INPUT_PULLUP | MUX_MODE1)
                >;
        };

        mmc2_idle_pins: pinmux_mmc2_idle_pins {
                pinctrl-single,pins = <
                        /* sdmmc2_clk.sdmmc2_clk */
                        OMAP3_CORE1_IOPAD(0x2158, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_cmd.sdmmc2_cmd */
                        OMAP3_CORE1_IOPAD(0x215a, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat0.sdmmc2_dat0 */
                        OMAP3_CORE1_IOPAD(0x215c, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat0.gpio133 */
                        OMAP3_CORE1_IOPAD(0x215e, PIN_INPUT_PULLUP | MUX_MODE4)

                        /* sdmmc2_dat2.sdmmc2_dat2 */
                        OMAP3_CORE1_IOPAD(0x2160, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat2.sdmmc2_dat3 */
                        OMAP3_CORE1_IOPAD(0x2162, PIN_INPUT_PULLUP | MUX_MODE0)

                        /* sdmmc2_dat4.sdmmc2_dir_dat0 */
                        OMAP3_CORE1_IOPAD(0x2164, PIN_INPUT_PULLUP | MUX_MODE1)

                        /* sdmmc2_dat4.sdmmc2_dir_dat1 */
                        OMAP3_CORE1_IOPAD(0x2166,
                                          PIN_INPUT_PULLUP | MUX_MODE1)

                        /* sdmmc2_dat6.sdmmc2_dir_cmd */
                        OMAP3_CORE1_IOPAD(0x2168, PIN_INPUT_PULLUP | MUX_MODE1)

                        /* sdmmc2_dat6.sdmmc2_clkin */
                        OMAP3_CORE1_IOPAD(0x216a, PIN_INPUT_PULLUP | MUX_MODE1)
                >;
        };


                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                               

[...]
     &mmc2 {
        pinctrl-names = "default", "idle";
        pinctrl-0 = <&mmc2_pins>;
        pinctrl-1 = <&mmc2_idle_pins>;

        /* dat1 remuxed as gpio133 */
        interrupts-extended = <&intc 86>, <&gpio5 5 IRQ_TYPE_LEVEL_LOW>;
        vmmc-supply = <&vaux4>;
        bus-width = <4>;
        ti,non-removable;       /* remove ti, */
        mmc-pwrseq = <&wifi_pwrseq>;
        cap-power-off-card;     /* remove! */
};
                                                                                                                                                                                                                                                               

Result: works with 4bit, Irq count is sane as long as the card
is powered on. On a wifi with low traffic I get around 2 irqs per second
But if as soon as I power off the card by doing ifconfig down, I get
around 10 irqs per second which could be explained by the fact that
autosuspend time is 100ms, and it is waking up just immediately.
Reason is probably that the other side of the level shifter powered
off and low, so
dat1 will be low permanently. And since wakeup is enabled regardless of
whether sdio irq or anything else is enabled, hsmmc will never get a
good sleep.
That behavior (I have to check that) was probably introduced by
5b83b2234be6 ("mmc: omap_hsmmc: Change wake-up interrupt to use generic wakeirq").

I guess there is also a race somehow involved here. 

Regards,
Andreas

Attachment: pgphFcqAryPc9.pgp
Description: OpenPGP digital signature


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux