diff mbox series

[v8,1/3] dt-bindings: mmc: mtk-sd: extend interrupts and pinctrls properties

Message ID 20220321115133.32121-2-axe.yang@mediatek.com
State Superseded
Headers show
Series mmc: mediatek: add support for SDIO async IRQ | expand

Commit Message

Axe Yang March 21, 2022, 11:51 a.m. UTC
Extend interrupts and pinctrls for SDIO wakeup interrupt feature.
This feature allow SDIO devices alarm asynchronous interrupt to host
even when host stop providing clock to SDIO card. An extra wakeup
interrupt and pinctrl states for SDIO DAT1 pin state switching are
required in this scenario.

Signed-off-by: Axe Yang <axe.yang@mediatek.com>
---
 .../devicetree/bindings/mmc/mtk-sd.yaml       | 23 ++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

Comments

Axe Yang March 22, 2022, 1:35 a.m. UTC | #1
On Mon, 2022-03-21 at 18:29 -0500, Rob Herring wrote:
> On Mon, Mar 21, 2022 at 07:51:32PM +0800, Axe Yang wrote:
> > Extend interrupts and pinctrls for SDIO wakeup interrupt feature.
> > This feature allow SDIO devices alarm asynchronous interrupt to
> > host
> > even when host stop providing clock to SDIO card. An extra wakeup
> > interrupt and pinctrl states for SDIO DAT1 pin state switching are
> > required in this scenario.
> > 
> > Signed-off-by: Axe Yang <axe.yang@mediatek.com>
> > ---
> >  .../devicetree/bindings/mmc/mtk-sd.yaml       | 23
> > ++++++++++++++++++-
> >  1 file changed, 22 insertions(+), 1 deletion(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > index 297ada03e3de..f57774535a1d 100644
> > --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > @@ -69,12 +69,23 @@ properties:
> >        - const: ahb_cg
> >  
> >    interrupts:
> > -    maxItems: 1
> > +    description:
> > +      Should at least contain MSDC GIC interrupt. To support SDIO
> > in-band wakeup, an extended
> > +      interrupt is required and be configured as wakeup source
> > irq.
> > +    minItems: 1
> > +    maxItems: 2
> >  
> >    pinctrl-names:
> > +    description:
> > +      Should at least contain default and state_uhs. To support
> > SDIO in-band wakeup, dat1 pin
> > +      will be switched between GPIO mode and SDIO DAT1 mode,
> > state_eint and state_dat1 are
> > +      mandatory in this scenarios.
> > +    minItems: 2
> >      items:
> >        - const: default
> >        - const: state_uhs
> > +      - const: state_eint
> > +      - const: state_dat1
> >  
> >    pinctrl-0:
> >      description:
> > @@ -86,6 +97,16 @@ properties:
> >        should contain uhs mode pin ctrl.
> >      maxItems: 1
> >  
> > +  pinctrl-2:
> > +    description:
> > +      should switch dat1 pin to GPIO mode.
> > +    maxItems: 1
> > +
> > +  pinctrl-3:
> > +    description:
> > +      should switch SDIO dat1 pin from GPIO mode back to SDIO
> > mode.
> 
> How is this different than pinctrl-0?

pinctrl-0 contains default settings for all IO pins(CLK/CMD/DAT).
pinctrl-1 contains settings for all IO pins(CLK/CMD/DAT) in UHS mode.
pinctrl-3 is lightweight pinctrl-1, only keep SDIO DAT1 pin function
switch part.

...

Regards,
Axe
AngeloGioacchino Del Regno March 22, 2022, 8:42 a.m. UTC | #2
Il 22/03/22 02:35, Axe Yang ha scritto:
> On Mon, 2022-03-21 at 18:29 -0500, Rob Herring wrote:
>> On Mon, Mar 21, 2022 at 07:51:32PM +0800, Axe Yang wrote:
>>> Extend interrupts and pinctrls for SDIO wakeup interrupt feature.
>>> This feature allow SDIO devices alarm asynchronous interrupt to
>>> host
>>> even when host stop providing clock to SDIO card. An extra wakeup
>>> interrupt and pinctrl states for SDIO DAT1 pin state switching are
>>> required in this scenario.
>>>
>>> Signed-off-by: Axe Yang <axe.yang@mediatek.com>
>>> ---
>>>   .../devicetree/bindings/mmc/mtk-sd.yaml       | 23
>>> ++++++++++++++++++-
>>>   1 file changed, 22 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> index 297ada03e3de..f57774535a1d 100644
>>> --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
>>> @@ -69,12 +69,23 @@ properties:
>>>         - const: ahb_cg
>>>   
>>>     interrupts:
>>> -    maxItems: 1
>>> +    description:
>>> +      Should at least contain MSDC GIC interrupt. To support SDIO
>>> in-band wakeup, an extended
>>> +      interrupt is required and be configured as wakeup source
>>> irq.
>>> +    minItems: 1
>>> +    maxItems: 2
>>>   
>>>     pinctrl-names:
>>> +    description:
>>> +      Should at least contain default and state_uhs. To support
>>> SDIO in-band wakeup, dat1 pin
>>> +      will be switched between GPIO mode and SDIO DAT1 mode,
>>> state_eint and state_dat1 are
>>> +      mandatory in this scenarios.
>>> +    minItems: 2
>>>       items:
>>>         - const: default
>>>         - const: state_uhs
>>> +      - const: state_eint
>>> +      - const: state_dat1
>>>   
>>>     pinctrl-0:
>>>       description:
>>> @@ -86,6 +97,16 @@ properties:
>>>         should contain uhs mode pin ctrl.
>>>       maxItems: 1
>>>   
>>> +  pinctrl-2:
>>> +    description:
>>> +      should switch dat1 pin to GPIO mode.
>>> +    maxItems: 1
>>> +
>>> +  pinctrl-3:
>>> +    description:
>>> +      should switch SDIO dat1 pin from GPIO mode back to SDIO
>>> mode.
>>
>> How is this different than pinctrl-0?
> 
> pinctrl-0 contains default settings for all IO pins(CLK/CMD/DAT).
> pinctrl-1 contains settings for all IO pins(CLK/CMD/DAT) in UHS mode.
> pinctrl-3 is lightweight pinctrl-1, only keep SDIO DAT1 pin function
> switch part.
> 

Is there any particular reason why we cannot simply select pinctrl-1 again
instead of pinctrl-3, apart from the virtually not existent overhead of
one more mmio write?

> ...
> 
> Regards,
> Axe
>
Rob Herring (Arm) March 22, 2022, 4:42 p.m. UTC | #3
On Tue, Mar 22, 2022 at 05:33:55PM +0800, Axe Yang wrote:
> Hello AngeloGioacchino,
> 
> On Tue, 2022-03-22 at 09:42 +0100, AngeloGioacchino Del Regno wrote:
> > Il 22/03/22 02:35, Axe Yang ha scritto:
> > > On Mon, 2022-03-21 at 18:29 -0500, Rob Herring wrote:
> > > > On Mon, Mar 21, 2022 at 07:51:32PM +0800, Axe Yang wrote:
> > > > > Extend interrupts and pinctrls for SDIO wakeup interrupt
> > > > > feature.
> > > > > This feature allow SDIO devices alarm asynchronous interrupt to
> > > > > host
> > > > > even when host stop providing clock to SDIO card. An extra
> > > > > wakeup
> > > > > interrupt and pinctrl states for SDIO DAT1 pin state switching
> > > > > are
> > > > > required in this scenario.
> > > > > 
> > > > > Signed-off-by: Axe Yang <axe.yang@mediatek.com>
> > > > > ---
> > > > >   .../devicetree/bindings/mmc/mtk-sd.yaml       | 23
> > > > > ++++++++++++++++++-
> > > > >   1 file changed, 22 insertions(+), 1 deletion(-)
> > > > > 
> > > > > diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > index 297ada03e3de..f57774535a1d 100644
> > > > > --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > @@ -69,12 +69,23 @@ properties:
> > > > >         - const: ahb_cg
> > > > >   
> > > > >     interrupts:
> > > > > -    maxItems: 1
> > > > > +    description:
> > > > > +      Should at least contain MSDC GIC interrupt. To support
> > > > > SDIO
> > > > > in-band wakeup, an extended
> > > > > +      interrupt is required and be configured as wakeup source
> > > > > irq.
> > > > > +    minItems: 1
> > > > > +    maxItems: 2
> > > > >   
> > > > >     pinctrl-names:
> > > > > +    description:
> > > > > +      Should at least contain default and state_uhs. To
> > > > > support
> > > > > SDIO in-band wakeup, dat1 pin
> > > > > +      will be switched between GPIO mode and SDIO DAT1 mode,
> > > > > state_eint and state_dat1 are
> > > > > +      mandatory in this scenarios.
> > > > > +    minItems: 2
> > > > >       items:
> > > > >         - const: default
> > > > >         - const: state_uhs
> > > > > +      - const: state_eint
> > > > > +      - const: state_dat1
> > > > >   
> > > > >     pinctrl-0:
> > > > >       description:
> > > > > @@ -86,6 +97,16 @@ properties:
> > > > >         should contain uhs mode pin ctrl.
> > > > >       maxItems: 1
> > > > >   
> > > > > +  pinctrl-2:
> > > > > +    description:
> > > > > +      should switch dat1 pin to GPIO mode.
> > > > > +    maxItems: 1
> > > > > +
> > > > > +  pinctrl-3:
> > > > > +    description:
> > > > > +      should switch SDIO dat1 pin from GPIO mode back to SDIO
> > > > > mode.
> > > > 
> > > > How is this different than pinctrl-0?
> > > 
> > > pinctrl-0 contains default settings for all IO pins(CLK/CMD/DAT).
> > > pinctrl-1 contains settings for all IO pins(CLK/CMD/DAT) in UHS
> > > mode.
> > > pinctrl-3 is lightweight pinctrl-1, only keep SDIO DAT1 pin
> > > function
> > > switch part.
> > > 
> > 
> > Is there any particular reason why we cannot simply select pinctrl-1
> > again
> > instead of pinctrl-3, apart from the virtually not existent overhead
> > of one more mmio write?
> 
> No, there is no particular reason. 
> I just want to do the pin function switch quick and clean. 
> 
> The intention of pinctrl-1 is to set the most initial state of IO pins
> in UHS mode. If I don't need to adjust IO settings any longer, it is
> okay to select pinctrl-1 state instead of pinctrl-3. 
> But think about this scenarios: after initial SDIO IO pins to UHS mode,
> I want to adjust some IO related properties, such as driving strength.
> And I want to keep these settings because with new driving strength,
> the signal is better. I'd rather to choose pinctrl-3 but not pinctrl-1, 
> because I do not want the change be restored after next runtime resume.

The pinctrl-X properties set modes, they aren't supposed to be a state 
machine.

Rob
Axe Yang March 23, 2022, 3:38 a.m. UTC | #4
Hi Rob,

Sorry, my last mail may mislead your understanding. Let me explain more
about this.

On Tue, 2022-03-22 at 11:42 -0500, Rob Herring wrote:
> On Tue, Mar 22, 2022 at 05:33:55PM +0800, Axe Yang wrote:
> > Hello AngeloGioacchino,
> > 
> > On Tue, 2022-03-22 at 09:42 +0100, AngeloGioacchino Del Regno
> > wrote:
> > > Il 22/03/22 02:35, Axe Yang ha scritto:
> > > > On Mon, 2022-03-21 at 18:29 -0500, Rob Herring wrote:
> > > > > On Mon, Mar 21, 2022 at 07:51:32PM +0800, Axe Yang wrote:
> > > > > > Extend interrupts and pinctrls for SDIO wakeup interrupt
> > > > > > feature.
> > > > > > This feature allow SDIO devices alarm asynchronous
> > > > > > interrupt to
> > > > > > host
> > > > > > even when host stop providing clock to SDIO card. An extra
> > > > > > wakeup
> > > > > > interrupt and pinctrl states for SDIO DAT1 pin state
> > > > > > switching
> > > > > > are
> > > > > > required in this scenario.
> > > > > > 
> > > > > > Signed-off-by: Axe Yang <axe.yang@mediatek.com>
> > > > > > ---
> > > > > >   .../devicetree/bindings/mmc/mtk-sd.yaml       | 23
> > > > > > ++++++++++++++++++-
> > > > > >   1 file changed, 22 insertions(+), 1 deletion(-)
> > > > > > 
> > > > > > diff --git a/Documentation/devicetree/bindings/mmc/mtk-
> > > > > > sd.yaml
> > > > > > b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > > index 297ada03e3de..f57774535a1d 100644
> > > > > > --- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > > +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
> > > > > > @@ -69,12 +69,23 @@ properties:
> > > > > >         - const: ahb_cg
> > > > > >   
> > > > > >     interrupts:
> > > > > > -    maxItems: 1
> > > > > > +    description:
> > > > > > +      Should at least contain MSDC GIC interrupt. To
> > > > > > support
> > > > > > SDIO
> > > > > > in-band wakeup, an extended
> > > > > > +      interrupt is required and be configured as wakeup
> > > > > > source
> > > > > > irq.
> > > > > > +    minItems: 1
> > > > > > +    maxItems: 2
> > > > > >   
> > > > > >     pinctrl-names:
> > > > > > +    description:
> > > > > > +      Should at least contain default and state_uhs. To
> > > > > > support
> > > > > > SDIO in-band wakeup, dat1 pin
> > > > > > +      will be switched between GPIO mode and SDIO DAT1
> > > > > > mode,
> > > > > > state_eint and state_dat1 are
> > > > > > +      mandatory in this scenarios.
> > > > > > +    minItems: 2
> > > > > >       items:
> > > > > >         - const: default
> > > > > >         - const: state_uhs
> > > > > > +      - const: state_eint
> > > > > > +      - const: state_dat1
> > > > > >   
> > > > > >     pinctrl-0:
> > > > > >       description:
> > > > > > @@ -86,6 +97,16 @@ properties:
> > > > > >         should contain uhs mode pin ctrl.
> > > > > >       maxItems: 1
> > > > > >   
> > > > > > +  pinctrl-2:
> > > > > > +    description:
> > > > > > +      should switch dat1 pin to GPIO mode.
> > > > > > +    maxItems: 1
> > > > > > +
> > > > > > +  pinctrl-3:
> > > > > > +    description:
> > > > > > +      should switch SDIO dat1 pin from GPIO mode back to
> > > > > > SDIO
> > > > > > mode.
> > > > > 
> > > > > How is this different than pinctrl-0?
> > > > 
> > > > pinctrl-0 contains default settings for all IO
> > > > pins(CLK/CMD/DAT).
> > > > pinctrl-1 contains settings for all IO pins(CLK/CMD/DAT) in UHS
> > > > mode.
> > > > pinctrl-3 is lightweight pinctrl-1, only keep SDIO DAT1 pin
> > > > function
> > > > switch part.
> > > > 
> > > 
> > > Is there any particular reason why we cannot simply select
> > > pinctrl-1
> > > again
> > > instead of pinctrl-3, apart from the virtually not existent
> > > overhead
> > > of one more mmio write?
> > 
> > No, there is no particular reason. 
> > I just want to do the pin function switch quick and clean. 
> > 
> > The intention of pinctrl-1 is to set the most initial state of IO
> > pins
> > in UHS mode. If I don't need to adjust IO settings any longer, it
> > is
> > okay to select pinctrl-1 state instead of pinctrl-3. 
> > But think about this scenarios: after initial SDIO IO pins to UHS
> > mode,
> > I want to adjust some IO related properties, such as driving
> > strength.
> > And I want to keep these settings because with new driving
> > strength,
> > the signal is better. I'd rather to choose pinctrl-3 but not
> > pinctrl-1, 
> > because I do not want the change be restored after next runtime
> > resume.
> 
> The pinctrl-X properties set modes, they aren't supposed to be a
> state 
> machine

I do use the pinctl-x properties to set modes, but not judge state from
pin state.

I need to time-multiplex SDIO DAT1 pin, shift it between GPIO mode and
SDIO IO mode, for example:

mmc2_pins_default {
	...
};

mmc2_pins_uhs {
        pins_clk {
                pinmux = <PINMUX_GPIO170__FUNC_B1_MSDC2_CLK>;
                drive-strength = <MTK_DRIVE_4mA>;
                bias-pull-down = <MTK_PUPD_SET_R1R0_10>;
        };

        pins_cmd_dat {
                pinmux = <PINMUX_GPIO169__FUNC_B1_MSDC2_CMD>,
                         <PINMUX_GPIO171__FUNC_B1_MSDC2_DAT0>,
                         <PINMUX_GPIO172__FUNC_B1_MSDC2_DAT1>,
                         <PINMUX_GPIO173__FUNC_B1_MSDC2_DAT2>,
                         <PINMUX_GPIO174__FUNC_B1_MSDC2_DAT3>;
                input-enable;
                drive-strength = <MTK_DRIVE_6mA>;
                bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
        };
};

mmc2_pins_eint {
        pins_dat1 {
                pinmux = <PINMUX_GPIO172__FUNC_B_GPIO172>;
                input-enable;
                bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
        };
};

mmc2_pins_dat1 {
        pins_dat1 {
                pinmux = <PINMUX_GPIO172__FUNC_B1_MSDC2_DAT1>;
                input-enable;
                bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
        };
};

The pinctrl-1(mmc2_pin_uhs) here contain all SDIO IO pins, for the most
early initialize. I SELECT pinctrl-1 when I change SDIO to SDR104 mode,
before calibration.
And when SDIO bus is idle, I SELECT pinctrl-2(mmc2_pins_eint), use DAT1
as a interrupt line when steping into runtime suspend.
After resume, I SELECT pinctrl-3(mmc2_pins_dat1) to set DAT1 pin back
to SDIO IO mode.

I need all the pinctrl-x properties, and take the initiative to set pin
mode according to needs.


Best Regard,
Axe
diff mbox series

Patch

diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
index 297ada03e3de..f57774535a1d 100644
--- a/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
+++ b/Documentation/devicetree/bindings/mmc/mtk-sd.yaml
@@ -69,12 +69,23 @@  properties:
       - const: ahb_cg
 
   interrupts:
-    maxItems: 1
+    description:
+      Should at least contain MSDC GIC interrupt. To support SDIO in-band wakeup, an extended
+      interrupt is required and be configured as wakeup source irq.
+    minItems: 1
+    maxItems: 2
 
   pinctrl-names:
+    description:
+      Should at least contain default and state_uhs. To support SDIO in-band wakeup, dat1 pin
+      will be switched between GPIO mode and SDIO DAT1 mode, state_eint and state_dat1 are
+      mandatory in this scenarios.
+    minItems: 2
     items:
       - const: default
       - const: state_uhs
+      - const: state_eint
+      - const: state_dat1
 
   pinctrl-0:
     description:
@@ -86,6 +97,16 @@  properties:
       should contain uhs mode pin ctrl.
     maxItems: 1
 
+  pinctrl-2:
+    description:
+      should switch dat1 pin to GPIO mode.
+    maxItems: 1
+
+  pinctrl-3:
+    description:
+      should switch SDIO dat1 pin from GPIO mode back to SDIO mode.
+    maxItems: 1
+
   assigned-clocks:
     description:
       PLL of the source clock.