Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2014-06-30 Thread Andreas Fenkart
Hi,

2013-11-19 16:59 GMT+01:00 Balaji T K :
> On Tuesday 19 November 2013 09:19 PM, Tony Lindgren wrote:
>>
>> * Balaji T K  [131118 08:23]:
>>>
>>> On Monday 18 November 2013 05:45 PM, Andreas Fenkart wrote:

 2013/11/18 Michael Trimarchi :
>
> On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart 
> wrote:
>>
>>   static int omap_hsmmc_card_detect(struct device *dev, int slot)
>>   {
>>  struct omap_hsmmc_host *host = dev_get_drvdata(dev);
>> @@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct
>> omap_mmc_platform_data *pdata)
>>  } else
>>  pdata->slots[0].gpio_wp = -EINVAL;
>>
>> +   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
>> +   pdata->slots[0].sdio_irq =
>> +
>> gpio_to_irq(pdata->slots[0].gpio_cirq);
>
>
> What is this? re-assign the platform data?


 Seems like, I didn't pay attention to this.
 Simply kept in line how the write protection/read only pins are managed.
 I'd rather not change this part, or not changing it as part of adding
 sdio IRQ support it.

 Maybe somebody else on the list can explain why the platform data
 contains elements
 that are modified during runtime.

 - set_power / get_ro function callbacks
 - ocr_mask.

>>> Hi,
>>>
>>> few params were passed via platform data in non-DT case and never cached
>>> in internal data structure, with non-dt support going away soon, I am
>>> planning to cleanup pdata usage in the driver when it gets to DT only
>>> support.
>>

any news on this?

I'd like to reuse generic mmc_of_parse, kind of difficult with the
current driver state
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-27 Thread Tony Lindgren
* Balaji T K  [131127 09:00]:
> On Tuesday 26 November 2013 04:16 AM, Tony Lindgren wrote:
> >
> >This patch we can now make a bit more generic with the recent addition
> >of interrupts-extended property that's now merged in mainline tree :)
> >
> >We can optionally pass two interrupts to omap_hsmmc.c where the second
> >interrupt is either the pinctrl-single wake-up interrupt, or the GPIO
> >interrupt.
> >
> >Both the iochain wake interrupt or the GPIO interrupt are available with
> >request_irq as long as configured in the .dts file. And can both use the
> >SDIO interrupt handler. The only difference is that the GPIO wake-up
> >still needs to do the dynamic remuxing of pins.
> >
> >So omap3 can use:
> >
> >mmc: mmc@4800abcd {
> > compatible = "ti,omap3-hsmmc";
> > ...
> > interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
> > ...
> >};
> >
> >And am33xx can use:
> >
> >mmc: mmc@4810abcd {
> > compatible = "ti,omap33xx-hsmmc";
> > ...
> > interrupts-extended = <&intc 64 &gpio3 28>;
> > ...
> >};
> >
> Hi Tony,
> 
> I made similar changes for omap4 panda-es as below, but get WARNING for no 
> irq domain [1]
> omap3 beagle seems to be OK.
> 
>   mmc1: mmc@4809c000 {
>   compatible = "ti,omap4-hsmmc";
>   reg = <0x4809c000 0x400>;
> + interrupts-extended = <&gic GIC_SPI 83 
> IRQ_TYPE_LEVEL_HIGH &omap4_pmx_core 0xa8>;
>   ti,hwmods = "mmc1";
> 
> [0.338745] OMAP GPIO hardware version 0.1
> [0.348266] omap-gpmc 5000.gpmc: GPMC revision 6.0
> [0.354339] irq: no irq domain found for /ocp/pinmux@4a100040 !
> [0.354339] [ cut here ]
> [0.354370] WARNING: CPU: 1 PID: 1 at 
> /home/a0393241/git/lo/drivers/of/platform.c:171 of_device_alloc+0x158/0x16c()
> [0.354370] Modules linked in:
> [0.354400] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 
> 3.13.0-rc1-00141-g8ae516a-dirty #36
> [0.354431] [] (unwind_backtrace+0x0/0xf0) from [] 
> (show_stack+0x10/0x14)
> [0.354431] [] (show_stack+0x10/0x14) from [] 
> (dump_stack+0x78/0x94)
> [0.354461] [] (dump_stack+0x78/0x94) from [] 
> (warn_slowpath_common+0x6c/0x90)
> [0.354492] [] (warn_slowpath_common+0x6c/0x90) from 
> [] (warn_slowpath_null+0x1c/0x24)
> [0.354492] [] (warn_slowpath_null+0x1c/0x24) from [] 
> (of_device_alloc+0x158/0x16c)
> [0.354522] [] (of_device_alloc+0x158/0x16c) from [] 
> (of_platform_device_create_pdata+0x30/0x94)
> [0.354522] [] (of_platform_device_create_pdata+0x30/0x94) from 
> [] (of_platform_bus_create+0xe0/0x164)
> [0.354553] [] (of_platform_bus_create+0xe0/0x164) from 
> [] (of_platform_bus_create+0x13c/0x164)
> [0.354553] [] (of_platform_bus_create+0x13c/0x164) from 
> [] (of_platform_populate+0x5c/0x9c)
> [0.354583] [] (of_platform_populate+0x5c/0x9c) from 
> [] (pdata_quirks_init+0x28/0x70)
> [0.354614] [] (pdata_quirks_init+0x28/0x70) from [] 
> (customize_machine+0x1c/0x40)
> [0.354614] [] (customize_machine+0x1c/0x40) from [] 
> (do_one_initcall+0xec/0x150)
> [0.354644] [] (do_one_initcall+0xec/0x150) from [] 
> (kernel_init_freeable+0xfc/0x1cc)
> [0.354644] [] (kernel_init_freeable+0xfc/0x1cc) from 
> [] (kernel_init+0x8/0x118)
> [0.354675] [] (kernel_init+0x8/0x118) from [] 
> (ret_from_fork+0x14/0x2c)
> [0.354766] ---[ end trace 7067c7558a4cd015 ]---

Yeah that's nasty looking but harmless, so you can ignore that for now :)

See the thread "[PATCH] of/platform: Fix no irq domain found errors
when populating interrupts" on LAKML for attempted fix for that.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-27 Thread Balaji T K

On Tuesday 26 November 2013 04:16 AM, Tony Lindgren wrote:

* Andreas Fenkart  [131125 05:30]:

--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -452,10 +475,23 @@ static int omap_hsmmc_gpio_init(struct 
omap_mmc_platform_data *pdata)
} else
pdata->slots[0].gpio_wp = -EINVAL;

+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
+   ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
+  "sdio_cirq");
+   if (ret)
+   goto err_free_ro;
+
+   } else {
+   pdata->slots[0].gpio_cirq = -EINVAL;
+   }
+
+
return 0;

+err_free_ro:
+   if (gpio_is_valid(pdata->slots[0].gpio_wp))
  err_free_wp:
-   gpio_free(pdata->slots[0].gpio_wp);
+   gpio_free(pdata->slots[0].gpio_wp);
  err_free_cd:
if (gpio_is_valid(pdata->slots[0].switch_pin))
  err_free_sp:


This patch we can now make a bit more generic with the recent addition
of interrupts-extended property that's now merged in mainline tree :)

We can optionally pass two interrupts to omap_hsmmc.c where the second
interrupt is either the pinctrl-single wake-up interrupt, or the GPIO
interrupt.

Both the iochain wake interrupt or the GPIO interrupt are available with
request_irq as long as configured in the .dts file. And can both use the
SDIO interrupt handler. The only difference is that the GPIO wake-up
still needs to do the dynamic remuxing of pins.

So omap3 can use:

mmc: mmc@4800abcd {
compatible = "ti,omap3-hsmmc";
...
interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
...
};

And am33xx can use:

mmc: mmc@4810abcd {
compatible = "ti,omap33xx-hsmmc";
...
interrupts-extended = <&intc 64 &gpio3 28>;
...
};


Hi Tony,

I made similar changes for omap4 panda-es as below, but get WARNING for no irq 
domain [1]
omap3 beagle seems to be OK.

mmc1: mmc@4809c000 {
compatible = "ti,omap4-hsmmc";
reg = <0x4809c000 0x400>;
+   interrupts-extended = <&gic GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH 
&omap4_pmx_core 0xa8>;
ti,hwmods = "mmc1";

[0.338745] OMAP GPIO hardware version 0.1
[0.348266] omap-gpmc 5000.gpmc: GPMC revision 6.0
[0.354339] irq: no irq domain found for /ocp/pinmux@4a100040 !
[0.354339] [ cut here ]
[0.354370] WARNING: CPU: 1 PID: 1 at 
/home/a0393241/git/lo/drivers/of/platform.c:171 of_device_alloc+0x158/0x16c()
[0.354370] Modules linked in:
[0.354400] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 
3.13.0-rc1-00141-g8ae516a-dirty #36
[0.354431] [] (unwind_backtrace+0x0/0xf0) from [] 
(show_stack+0x10/0x14)
[0.354431] [] (show_stack+0x10/0x14) from [] 
(dump_stack+0x78/0x94)
[0.354461] [] (dump_stack+0x78/0x94) from [] 
(warn_slowpath_common+0x6c/0x90)
[0.354492] [] (warn_slowpath_common+0x6c/0x90) from [] 
(warn_slowpath_null+0x1c/0x24)
[0.354492] [] (warn_slowpath_null+0x1c/0x24) from [] 
(of_device_alloc+0x158/0x16c)
[0.354522] [] (of_device_alloc+0x158/0x16c) from [] 
(of_platform_device_create_pdata+0x30/0x94)
[0.354522] [] (of_platform_device_create_pdata+0x30/0x94) from 
[] (of_platform_bus_create+0xe0/0x164)
[0.354553] [] (of_platform_bus_create+0xe0/0x164) from 
[] (of_platform_bus_create+0x13c/0x164)
[0.354553] [] (of_platform_bus_create+0x13c/0x164) from 
[] (of_platform_populate+0x5c/0x9c)
[0.354583] [] (of_platform_populate+0x5c/0x9c) from [] 
(pdata_quirks_init+0x28/0x70)
[0.354614] [] (pdata_quirks_init+0x28/0x70) from [] 
(customize_machine+0x1c/0x40)
[0.354614] [] (customize_machine+0x1c/0x40) from [] 
(do_one_initcall+0xec/0x150)
[0.354644] [] (do_one_initcall+0xec/0x150) from [] 
(kernel_init_freeable+0xfc/0x1cc)
[0.354644] [] (kernel_init_freeable+0xfc/0x1cc) from [] 
(kernel_init+0x8/0x118)
[0.354675] [] (kernel_init+0x8/0x118) from [] 
(ret_from_fork+0x14/0x2c)
[0.354766] ---[ end trace 7067c7558a4cd015 ]---
[0.366607] platform 4b501000.aes: Cannot lookup hwmod 'aes'
[0.367034] platform 480a5000.des: Cannot lookup hwmod 'des'
[0.374481] No ATAGs?
[0.374511] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint 
registers.
[0.374542] hw-breakpoint: maximum watchpoint size is 4 bytes.
[0.377502] OMAP DMA hardware revision 0.0
[0.415100] bio: create slab  at 0
[0.417388] edma-dma-engine edma-dma-engine.0: Can't allocate PaRAM dummy 
slot
[0.417419] edma-dma-engine: probe of edma-dma-engine.0 failed with error -5
[0.460754] omap-dma-engine 4a056000.dma-controller: OMAP DMA engine driver
[0.462249] hsusb1_vbus: 3300 mV

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-26 Thread Tony Lindgren
* Felipe Balbi  [131125 17:17]:
> Hi,
> 
> On Mon, Nov 25, 2013 at 02:46:02PM -0800, Tony Lindgren wrote:
> > * Andreas Fenkart  [131125 05:30]:
> > > --- a/drivers/mmc/host/omap_hsmmc.c
> > > +++ b/drivers/mmc/host/omap_hsmmc.c
> > > @@ -452,10 +475,23 @@ static int omap_hsmmc_gpio_init(struct 
> > > omap_mmc_platform_data *pdata)
> > >   } else
> > >   pdata->slots[0].gpio_wp = -EINVAL;
> > >  
> > > + if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> > > + ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
> > > +"sdio_cirq");
> > > + if (ret)
> > > + goto err_free_ro;
> > > +
> > > + } else {
> > > + pdata->slots[0].gpio_cirq = -EINVAL;
> > > + }
> > > +
> > > +
> > >   return 0;
> > >  
> > > +err_free_ro:
> > > + if (gpio_is_valid(pdata->slots[0].gpio_wp))
> > >  err_free_wp:
> > > - gpio_free(pdata->slots[0].gpio_wp);
> > > + gpio_free(pdata->slots[0].gpio_wp);
> > >  err_free_cd:
> > >   if (gpio_is_valid(pdata->slots[0].switch_pin))
> > >  err_free_sp:
> > 
> > This patch we can now make a bit more generic with the recent addition
> > of interrupts-extended property that's now merged in mainline tree :)
> > 
> > We can optionally pass two interrupts to omap_hsmmc.c where the second
> > interrupt is either the pinctrl-single wake-up interrupt, or the GPIO
> > interrupt.
> > 
> > Both the iochain wake interrupt or the GPIO interrupt are available with
> > request_irq as long as configured in the .dts file. And can both use the
> > SDIO interrupt handler. The only difference is that the GPIO wake-up
> > still needs to do the dynamic remuxing of pins.
> 
> could that be done automatically if DTS provides "suspend" pinctrl
> state ?

Yes based on the compatible flag and the provided named pin states.
 
> Would that be done before or after driver's ->{runtime_,}suspend()
> methods ?

Pins need to remuxed to GPIO input on 33xx in runtime suspend, and then
back to SDIO dat1 in runtime resume. Possibly needs to be done also for
34xx, but that's yet to be seen.
 
> > mmc: mmc@4810abcd {
> > compatible = "ti,omap33xx-hsmmc";
> 
> I would rather call it "ti,am33xx-hsmmc" just to make it match marketing
> name of the device.

Except you have both am33xx and dm33xx where the only difference is the
DSP on dm33xx? Other than that, I'm fine with am33xx naming as long as
it's clear to people and does not involve adding dm33xx stuff separately.
 
> > Then the logic of enabling the dynamic remuxing can be done based
> > on the ti,omap33xx-hsmmc compatible flag if there are two interrupts
> > and the needed pin states are defined.
> 
> or maybe dynamic remuxing can be done by calling pinctrl_select_state()
> with appropriate arguments ?

Yes the way to do the remuxing is to call pinctrl_select_state() on the
named state desired.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-25 Thread Felipe Balbi
Hi,

On Mon, Nov 25, 2013 at 02:46:02PM -0800, Tony Lindgren wrote:
> * Andreas Fenkart  [131125 05:30]:
> > --- a/drivers/mmc/host/omap_hsmmc.c
> > +++ b/drivers/mmc/host/omap_hsmmc.c
> > @@ -452,10 +475,23 @@ static int omap_hsmmc_gpio_init(struct 
> > omap_mmc_platform_data *pdata)
> > } else
> > pdata->slots[0].gpio_wp = -EINVAL;
> >  
> > +   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> > +   ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
> > +  "sdio_cirq");
> > +   if (ret)
> > +   goto err_free_ro;
> > +
> > +   } else {
> > +   pdata->slots[0].gpio_cirq = -EINVAL;
> > +   }
> > +
> > +
> > return 0;
> >  
> > +err_free_ro:
> > +   if (gpio_is_valid(pdata->slots[0].gpio_wp))
> >  err_free_wp:
> > -   gpio_free(pdata->slots[0].gpio_wp);
> > +   gpio_free(pdata->slots[0].gpio_wp);
> >  err_free_cd:
> > if (gpio_is_valid(pdata->slots[0].switch_pin))
> >  err_free_sp:
> 
> This patch we can now make a bit more generic with the recent addition
> of interrupts-extended property that's now merged in mainline tree :)
> 
> We can optionally pass two interrupts to omap_hsmmc.c where the second
> interrupt is either the pinctrl-single wake-up interrupt, or the GPIO
> interrupt.
> 
> Both the iochain wake interrupt or the GPIO interrupt are available with
> request_irq as long as configured in the .dts file. And can both use the
> SDIO interrupt handler. The only difference is that the GPIO wake-up
> still needs to do the dynamic remuxing of pins.

could that be done automatically if DTS provides "suspend" pinctrl
state ?

Would that be done before or after driver's ->{runtime_,}suspend()
methods ?

> mmc: mmc@4810abcd {
>   compatible = "ti,omap33xx-hsmmc";

I would rather call it "ti,am33xx-hsmmc" just to make it match marketing
name of the device.

> Then the logic of enabling the dynamic remuxing can be done based
> on the ti,omap33xx-hsmmc compatible flag if there are two interrupts
> and the needed pin states are defined.

or maybe dynamic remuxing can be done by calling pinctrl_select_state()
with appropriate arguments ?

-- 
balbi


signature.asc
Description: Digital signature


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-25 Thread Tony Lindgren
* Andreas Fenkart  [131125 05:30]:
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -452,10 +475,23 @@ static int omap_hsmmc_gpio_init(struct 
> omap_mmc_platform_data *pdata)
>   } else
>   pdata->slots[0].gpio_wp = -EINVAL;
>  
> + if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> + ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
> +"sdio_cirq");
> + if (ret)
> + goto err_free_ro;
> +
> + } else {
> + pdata->slots[0].gpio_cirq = -EINVAL;
> + }
> +
> +
>   return 0;
>  
> +err_free_ro:
> + if (gpio_is_valid(pdata->slots[0].gpio_wp))
>  err_free_wp:
> - gpio_free(pdata->slots[0].gpio_wp);
> + gpio_free(pdata->slots[0].gpio_wp);
>  err_free_cd:
>   if (gpio_is_valid(pdata->slots[0].switch_pin))
>  err_free_sp:

This patch we can now make a bit more generic with the recent addition
of interrupts-extended property that's now merged in mainline tree :)

We can optionally pass two interrupts to omap_hsmmc.c where the second
interrupt is either the pinctrl-single wake-up interrupt, or the GPIO
interrupt.

Both the iochain wake interrupt or the GPIO interrupt are available with
request_irq as long as configured in the .dts file. And can both use the
SDIO interrupt handler. The only difference is that the GPIO wake-up
still needs to do the dynamic remuxing of pins.

So omap3 can use:

mmc: mmc@4800abcd {
compatible = "ti,omap3-hsmmc";
...
interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
...
};

And am33xx can use:

mmc: mmc@4810abcd {
compatible = "ti,omap33xx-hsmmc";
...
interrupts-extended = <&intc 64 &gpio3 28>;
...
};

Then the logic of enabling the dynamic remuxing can be done based
on the ti,omap33xx-hsmmc compatible flag if there are two interrupts
and the needed pin states are defined.

> @@ -1791,6 +1890,7 @@ static struct omap_mmc_platform_data 
> *of_get_hsmmc_pdata(struct device *dev)
>   pdata->nr_slots = 1;
>   pdata->slots[0].switch_pin = cd_gpio;
>   pdata->slots[0].gpio_wp = wp_gpio;
> + pdata->slots[0].gpio_cirq = of_get_named_gpio(np, "ti,cirq-gpio", 0);
>  
>   if (of_find_property(np, "ti,non-removable", NULL)) {
>   pdata->slots[0].nonremovable = true;

We should just add the two interrupts to the host, not to the pdata.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-25 Thread Andreas Fenkart
The am335x can't detect pending cirq in PM runtime suspend.
This patch reconfigures dat1 as a GPIO before going to suspend.
SDIO interrupts are detected with the GPIO, the GPIO will only wake
the module from suspend, SDIO irq detection will still happen through the
IP block.

Idea of remuxing the pins by Tony Lindgren as well as the implementation
of omap_hsmmc_pin_init.

Signed-off-by: Andreas Fenkart 
---
 .../devicetree/bindings/mmc/ti-omap-hsmmc.txt  |   28 ++-
 drivers/mmc/host/omap_hsmmc.c  |  202 ++--
 include/linux/platform_data/mmc-omap.h |1 +
 3 files changed, 215 insertions(+), 16 deletions(-)

diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 1136e6b..146f3ad 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
 ti,needs-special-reset: Requires a special softreset sequence
 ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High 
Speed
 ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
-SDIO irq while in suspend. Fallback to polling. Affected chips are
-am335x,
+SDIO irq while in suspend. The workaround is to reconfigure the dat1 line as a
+GPIO upon suspend. Beyond this option and the GPIO config, you also need to set
+named pinctrl states "default", "active" and "idle ", see example below.  The
+MMC driver will then then toggle between default and idle during the runtime
+Affected chips are am335x,
 
 --
 | PRCM |
@@ -49,3 +52,24 @@ Example:
vmmc-supply = <&vmmc>; /* phandle to regulator node */
ti,non-removable;
};
+
+[am335x with with gpio for sdio irq]
+
+   mmc1_cirq_pin: pinmux_cirq_pin {
+   pinctrl-single,pins = <
+   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
+   >;
+   };
+
+   mmc1: mmc@4806 {
+   ti,non-removable;
+   bus-width = <4>;
+   vmmc-supply = <&ldo2_reg>;
+   vmmc_aux-supply = <&vmmc>;
+   ti,quirk-swakeup-missing;
+   pinctrl-names = "default", "active", "idle";
+   pinctrl-0 = <&mmc1_pins>;
+   pinctrl-1 = <&mmc1_pins>;
+   pinctrl-2 = <&mmc1_cirq_pin>;
+   ti,cirq-gpio = <&gpio3 28 0>;
+   };
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 6b0ec55..c8c54f5 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -202,6 +203,7 @@ struct omap_hsmmc_host {
u32 hctl;
u32 capa;
int irq;
+   int gpio_sdio_irq;
int use_dma, dma_ch;
struct dma_chan *tx_chan;
struct dma_chan *rx_chan;
@@ -213,11 +215,32 @@ struct omap_hsmmc_host {
int req_in_progress;
int flags;
 #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
+#define HSMMC_SWAKEUP_QUIRK(1 << 1)
+#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)
 
struct omap_hsmmc_next  next_data;
+   struct pinctrl  *pinctrl;
+   struct pinctrl_state*fixed, *active, *idle;
struct  omap_mmc_platform_data  *pdata;
 };
 
+static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
+{
+   struct omap_hsmmc_host *host = dev_id;
+   unsigned long flags;
+
+   spin_lock_irqsave(&host->irq_lock, flags);
+   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
+   disable_irq_nosync(host->gpio_sdio_irq);
+   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
+   }
+   spin_unlock_irqrestore(&host->irq_lock, flags);
+
+   pm_request_resume(host->dev); /* no use counter */
+
+   return IRQ_HANDLED;
+}
+
 static int omap_hsmmc_card_detect(struct device *dev, int slot)
 {
struct omap_hsmmc_host *host = dev_get_drvdata(dev);
@@ -452,10 +475,23 @@ static int omap_hsmmc_gpio_init(struct 
omap_mmc_platform_data *pdata)
} else
pdata->slots[0].gpio_wp = -EINVAL;
 
+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
+   ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
+  "sdio_cirq");
+   if (ret)
+   goto err_free_ro;
+
+   } else {
+   pdata->slots[0].gpio_cirq = -EINVAL;
+   }
+
+
return 0;
 
+err_free_ro:
+   if (gpio_is_valid(pdata->slots[0].gpio_wp))
 err_free_wp:
-   gpio_free(pdata->slots[0].gpio_wp);
+   gpio_free(pd

Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-21 Thread Balaji T K

On Thursday 21 November 2013 05:07 PM, Andreas Fenkart wrote:

2013/11/19 Tony Lindgren :

* Balaji T K  [131119 08:00]:

On Tuesday 19 November 2013 09:19 PM, Tony Lindgren wrote:

* Balaji T K  [131118 08:23]:


few params were passed via platform data in non-DT case and never cached
in internal data structure, with non-dt support going away soon, I am
planning to cleanup pdata usage in the driver when it gets to DT only support.


The issue of pdata tinkering needs to be fixed first as it will cause nasty
issues when the module is reprobed.


Agree that pdata usage needs to be fixed, but currently module
reprobe is working fine.


OK. The sdio_irq should be just set in struct omap_hsmmc_host instead.


agree, sdio_irq should be cached in struct omap_hsmmc_host




Note that it's still possible to pass platform data in the device tree case
as auxdata. And we probably need to do that for the pbias register handling
until we have a driver for that.

Talking of the pbias driver, any news on it?


Almost there, will post the patches soon.
Do you have a branch with updated board files, for me to base pbias patches on
else I can base the patches on rc1 too.


Great. How about make the pbias driver DT only? Let's not touch the board-*.c
files any longer as those will be going away for v3.14. We can probably keep
the old callback support in place also, and then remove it for v3.15.


Is there a dependency on the patches from Balaji or can the SDIO IRQ patches
go in already?


Hi Andreas,

I could get sdio interrupt working on AM335x, will do more testing and get back
to you.

Pbias shouldn't have create any dependency. Just add sdio_irq to
struct omap_hsmmc_host as suggested by Tony.

Thanks and Regards,
Balaji T K



And after that it would certainly make sense to rip out the platform data
fomr hsmmc driver just to get rid of the legacy support for multiplexing slots
that's not needed in this driver. That would allow replacing all mmc->slots[0]
accesses with something more standard.




rgds,
Andi


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-21 Thread Andreas Fenkart
2013/11/19 Tony Lindgren :
> * Balaji T K  [131119 08:00]:
>> On Tuesday 19 November 2013 09:19 PM, Tony Lindgren wrote:
>> >* Balaji T K  [131118 08:23]:
>> >>
>> >>few params were passed via platform data in non-DT case and never cached
>> >>in internal data structure, with non-dt support going away soon, I am
>> >>planning to cleanup pdata usage in the driver when it gets to DT only 
>> >>support.
>> >
>> >The issue of pdata tinkering needs to be fixed first as it will cause nasty
>> >issues when the module is reprobed.
>>
>> Agree that pdata usage needs to be fixed, but currently module
>> reprobe is working fine.
>
> OK. The sdio_irq should be just set in struct omap_hsmmc_host instead.
>
>> >Note that it's still possible to pass platform data in the device tree case
>> >as auxdata. And we probably need to do that for the pbias register handling
>> >until we have a driver for that.
>> >
>> >Talking of the pbias driver, any news on it?
>>
>> Almost there, will post the patches soon.
>> Do you have a branch with updated board files, for me to base pbias patches 
>> on
>> else I can base the patches on rc1 too.
>
> Great. How about make the pbias driver DT only? Let's not touch the board-*.c
> files any longer as those will be going away for v3.14. We can probably keep
> the old callback support in place also, and then remove it for v3.15.

Is there a dependency on the patches from Balaji or can the SDIO IRQ patches
go in already?

>
> And after that it would certainly make sense to rip out the platform data
> fomr hsmmc driver just to get rid of the legacy support for multiplexing slots
> that's not needed in this driver. That would allow replacing all mmc->slots[0]
> accesses with something more standard.
>


rgds,
Andi
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Tony Lindgren
* Balaji T K  [131119 08:00]:
> On Tuesday 19 November 2013 09:19 PM, Tony Lindgren wrote:
> >* Balaji T K  [131118 08:23]:
> >>
> >>few params were passed via platform data in non-DT case and never cached
> >>in internal data structure, with non-dt support going away soon, I am
> >>planning to cleanup pdata usage in the driver when it gets to DT only 
> >>support.
> >
> >The issue of pdata tinkering needs to be fixed first as it will cause nasty
> >issues when the module is reprobed.
> 
> Agree that pdata usage needs to be fixed, but currently module
> reprobe is working fine.

OK. The sdio_irq should be just set in struct omap_hsmmc_host instead.

> >Note that it's still possible to pass platform data in the device tree case
> >as auxdata. And we probably need to do that for the pbias register handling
> >until we have a driver for that.
> >
> >Talking of the pbias driver, any news on it?
> 
> Almost there, will post the patches soon.
> Do you have a branch with updated board files, for me to base pbias patches on
> else I can base the patches on rc1 too.

Great. How about make the pbias driver DT only? Let's not touch the board-*.c
files any longer as those will be going away for v3.14. We can probably keep
the old callback support in place also, and then remove it for v3.15.

And after that it would certainly make sense to rip out the platform data
fomr hsmmc driver just to get rid of the legacy support for multiplexing slots
that's not needed in this driver. That would allow replacing all mmc->slots[0]
accesses with something more standard.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Balaji T K

On Tuesday 19 November 2013 09:19 PM, Tony Lindgren wrote:

* Balaji T K  [131118 08:23]:

On Monday 18 November 2013 05:45 PM, Andreas Fenkart wrote:

2013/11/18 Michael Trimarchi :

On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart  wrote:

  static int omap_hsmmc_card_detect(struct device *dev, int slot)
  {
 struct omap_hsmmc_host *host = dev_get_drvdata(dev);
@@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
omap_mmc_platform_data *pdata)
 } else
 pdata->slots[0].gpio_wp = -EINVAL;

+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
+   pdata->slots[0].sdio_irq =
+   gpio_to_irq(pdata->slots[0].gpio_cirq);


What is this? re-assign the platform data?


Seems like, I didn't pay attention to this.
Simply kept in line how the write protection/read only pins are managed.
I'd rather not change this part, or not changing it as part of adding
sdio IRQ support it.

Maybe somebody else on the list can explain why the platform data
contains elements
that are modified during runtime.

- set_power / get_ro function callbacks
- ocr_mask.


Hi,

few params were passed via platform data in non-DT case and never cached
in internal data structure, with non-dt support going away soon, I am
planning to cleanup pdata usage in the driver when it gets to DT only support.


The issue of pdata tinkering needs to be fixed first as it will cause nasty
issues when the module is reprobed.


Agree that pdata usage needs to be fixed, but currently module
reprobe is working fine.



Note that it's still possible to pass platform data in the device tree case
as auxdata. And we probably need to do that for the pbias register handling
until we have a driver for that.

Talking of the pbias driver, any news on it?


Almost there, will post the patches soon.
Do you have a branch with updated board files, for me to base pbias patches on
else I can base the patches on rc1 too.



To recap, we basically we need a minimal separate driver that exposes the
control module pbias register as a regulator to the hsmmc driver. I don't see
that we can remove the platform data from the driver before that's done.

Regards,

Tony


--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Tony Lindgren
* Balaji T K  [131118 08:23]:
> On Monday 18 November 2013 05:45 PM, Andreas Fenkart wrote:
> >2013/11/18 Michael Trimarchi :
> >>On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart  wrote:
> >>>  static int omap_hsmmc_card_detect(struct device *dev, int slot)
> >>>  {
> >>> struct omap_hsmmc_host *host = dev_get_drvdata(dev);
> >>>@@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
> >>>omap_mmc_platform_data *pdata)
> >>> } else
> >>> pdata->slots[0].gpio_wp = -EINVAL;
> >>>
> >>>+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> >>>+   pdata->slots[0].sdio_irq =
> >>>+   gpio_to_irq(pdata->slots[0].gpio_cirq);
> >>
> >>What is this? re-assign the platform data?
> >
> >Seems like, I didn't pay attention to this.
> >Simply kept in line how the write protection/read only pins are managed.
> >I'd rather not change this part, or not changing it as part of adding
> >sdio IRQ support it.
> >
> >Maybe somebody else on the list can explain why the platform data
> >contains elements
> >that are modified during runtime.
> >
> >- set_power / get_ro function callbacks
> >- ocr_mask.
> >
> Hi,
> 
> few params were passed via platform data in non-DT case and never cached
> in internal data structure, with non-dt support going away soon, I am
> planning to cleanup pdata usage in the driver when it gets to DT only support.

The issue of pdata tinkering needs to be fixed first as it will cause nasty
issues when the module is reprobed. 

Note that it's still possible to pass platform data in the device tree case
as auxdata. And we probably need to do that for the pbias register handling
until we have a driver for that.

Talking of the pbias driver, any news on it?

To recap, we basically we need a minimal separate driver that exposes the
control module pbias register as a regulator to the hsmmc driver. I don't see
that we can remove the platform data from the driver before that's done.

Regards,

Tony
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Ulf Hansson
On 19 November 2013 14:37, Andreas Fenkart  wrote:
> Hi Ulf,
>
> 2013/11/19 Ulf Hansson :
>> On 18 November 2013 08:53, Andreas Fenkart  wrote:
>
>>>
>>> +static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
>>> +{
>>> +   struct omap_hsmmc_host *host = dev_id;
>>> +   unsigned long flags;
>>> +
>>> +   spin_lock_irqsave(&host->irq_lock, flags);
>>> +   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
>>> +   disable_irq_nosync(mmc_slot(host).sdio_irq);
>>> +   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
>>> +   }
>>> +   spin_unlock_irqrestore(&host->irq_lock, flags);
>>> +
>>> +   pm_request_resume(host->dev); /* no use counter */
>>
>> In the case were you are not waking up from system suspend, but from
>> runtime suspend, you likely want to signal the SDIO irq as soon as
>> possible. Then you should use mmc_signal_sdio_irq instead.
>
> That was my intention first as well, and previous patches worked that way.
> SDIO IRQ while in pm_suspend is a rare event, compard to SDIO irq
> while in pm_active state.
>
> cat /proc/interrupts
>CPU0
>  80:  68349  INTC  64  mmc0
> 236:   4352  GPIO  28  mmc0
>
> Here the Wifi module is just connected, not being pinged or iperf
> running. So the benefit will not be as big as you imagine.

You are right.

>
> On the other side the optimisations is not without problems, while in
> pm_suspend the functional clock is off and you must not access the
> registers of the module.
>
> But this is exactly whapt happens when you call mmc_signal_sdio_irq,
> it will call back into the drivers omap_hsmmc_enable_sdio_irq trying to
> disable the SDIO irq. So you must add special state machines there.

Yes, it will be somewhat complicated - I guess.

>
> After all it's doable but error prone, and I consider not worth the troubles
> for no noticeable speedup.
>
> Also have a look here, Balaji T K had a similar remark to yours
> http://www.spinics.net/lists/linux-omap/msg99832.html

Thanks, I should have looked that first. :-)

Kind regards
Ulf Hansson

>
>>
>> In the other case, when waking up from system suspend, you should be
>> able to completely rely on that the mmc_sdio_resume from the core
>> layer, will handle the IRQ.
>>
>> Kind regards
>> Ulf Hansson
>>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Andreas Fenkart
Hi Ulf,

2013/11/19 Ulf Hansson :
> On 18 November 2013 08:53, Andreas Fenkart  wrote:

>>
>> +static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
>> +{
>> +   struct omap_hsmmc_host *host = dev_id;
>> +   unsigned long flags;
>> +
>> +   spin_lock_irqsave(&host->irq_lock, flags);
>> +   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
>> +   disable_irq_nosync(mmc_slot(host).sdio_irq);
>> +   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
>> +   }
>> +   spin_unlock_irqrestore(&host->irq_lock, flags);
>> +
>> +   pm_request_resume(host->dev); /* no use counter */
>
> In the case were you are not waking up from system suspend, but from
> runtime suspend, you likely want to signal the SDIO irq as soon as
> possible. Then you should use mmc_signal_sdio_irq instead.

That was my intention first as well, and previous patches worked that way.
SDIO IRQ while in pm_suspend is a rare event, compard to SDIO irq
while in pm_active state.

cat /proc/interrupts
   CPU0
 80:  68349  INTC  64  mmc0
236:   4352  GPIO  28  mmc0

Here the Wifi module is just connected, not being pinged or iperf
running. So the benefit will not be as big as you imagine.

On the other side the optimisations is not without problems, while in
pm_suspend the functional clock is off and you must not access the
registers of the module.

But this is exactly whapt happens when you call mmc_signal_sdio_irq,
it will call back into the drivers omap_hsmmc_enable_sdio_irq trying to
disable the SDIO irq. So you must add special state machines there.

After all it's doable but error prone, and I consider not worth the troubles
for no noticeable speedup.

Also have a look here, Balaji T K had a similar remark to yours
http://www.spinics.net/lists/linux-omap/msg99832.html

>
> In the other case, when waking up from system suspend, you should be
> able to completely rely on that the mmc_sdio_resume from the core
> layer, will handle the IRQ.
>
> Kind regards
> Ulf Hansson
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-19 Thread Ulf Hansson
On 18 November 2013 08:53, Andreas Fenkart  wrote:
> The am335x can't detect pending cirq in PM runtime suspend.
> This patch reconfigures dat1 as a GPIO before going to suspend.
> SDIO interrupts are detected with the GPIO, the GPIO will only wake
> the module from suspend, SDIO irq detection will still happen through the
> IP block.
>
> Idea of remuxing the pins by Tony Lindgren as well as the implementation
> of omap_hsmmc_pin_init.
>
> Signed-off-by: Andreas Fenkart 
>
> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
> b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> index 1136e6b..146f3ad 100644
> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> @@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
>  ti,needs-special-reset: Requires a special softreset sequence
>  ti,needs-special-hs-handling: HSMMC IP needs special setting for handling 
> High Speed
>  ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
> -SDIO irq while in suspend. Fallback to polling. Affected chips are
> -am335x,
> +SDIO irq while in suspend. The workaround is to reconfigure the dat1 line as 
> a
> +GPIO upon suspend. Beyond this option and the GPIO config, you also need to 
> set
> +named pinctrl states "default", "active" and "idle ", see example below.  The
> +MMC driver will then then toggle between default and idle during the runtime
> +Affected chips are am335x,
>
>  --
>  | PRCM |
> @@ -49,3 +52,24 @@ Example:
> vmmc-supply = <&vmmc>; /* phandle to regulator node */
> ti,non-removable;
> };
> +
> +[am335x with with gpio for sdio irq]
> +
> +   mmc1_cirq_pin: pinmux_cirq_pin {
> +   pinctrl-single,pins = <
> +   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
> +   >;
> +   };
> +
> +   mmc1: mmc@4806 {
> +   ti,non-removable;
> +   bus-width = <4>;
> +   vmmc-supply = <&ldo2_reg>;
> +   vmmc_aux-supply = <&vmmc>;
> +   ti,quirk-swakeup-missing;
> +   pinctrl-names = "default", "active", "idle";
> +   pinctrl-0 = <&mmc1_pins>;
> +   pinctrl-1 = <&mmc1_pins>;
> +   pinctrl-2 = <&mmc1_cirq_pin>;
> +   ti,cirq-gpio = <&gpio3 28 0>;
> +   };
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 6b0ec55..b94ab08 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -36,6 +36,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -213,11 +214,32 @@ struct omap_hsmmc_host {
> int req_in_progress;
> int flags;
>  #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
> +#define HSMMC_SWAKEUP_QUIRK(1 << 1)
> +#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)
>
> struct omap_hsmmc_next  next_data;
> +   struct pinctrl  *pinctrl;
> +   struct pinctrl_state*fixed, *active, *idle;
> struct  omap_mmc_platform_data  *pdata;
>  };
>
> +static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
> +{
> +   struct omap_hsmmc_host *host = dev_id;
> +   unsigned long flags;
> +
> +   spin_lock_irqsave(&host->irq_lock, flags);
> +   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
> +   disable_irq_nosync(mmc_slot(host).sdio_irq);
> +   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
> +   }
> +   spin_unlock_irqrestore(&host->irq_lock, flags);
> +
> +   pm_request_resume(host->dev); /* no use counter */

In the case were you are not waking up from system suspend, but from
runtime suspend, you likely want to signal the SDIO irq as soon as
possible. Then you should use mmc_signal_sdio_irq instead.

In the other case, when waking up from system suspend, you should be
able to completely rely on that the mmc_sdio_resume from the core
layer, will handle the IRQ.

Kind regards
Ulf Hansson

> +
> +   return IRQ_HANDLED;
> +}
> +
>  static int omap_hsmmc_card_detect(struct device *dev, int slot)
>  {
> struct omap_hsmmc_host *host = dev_get_drvdata(dev);
> @@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
> omap_mmc_platform_data *pdata)
> } else
> pdata->slots[0].gpio_wp = -EINVAL;
>
> +   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> +   pdata->slots[0].sdio_irq =
> +   gpio_to_irq(pdata->slots[0].gpio_cirq);
> +   ret = gpio_request_one(pdata->slots[0].gpio_cirq, 
> GPIOF_DIR_IN,
> +  "sdio_cirq");
> +   if (ret)
> +   goto err_free_ro;
> +
> +   } else {
> +   pdata->slots[0].gpio_cirq = -EINVAL

Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-18 Thread Balaji T K

On Monday 18 November 2013 05:45 PM, Andreas Fenkart wrote:

2013/11/18 Michael Trimarchi :

Hi Andreas

On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart  wrote:

The am335x can't detect pending cirq in PM runtime suspend.
This patch reconfigures dat1 as a GPIO before going to suspend.
SDIO interrupts are detected with the GPIO, the GPIO will only wake
the module from suspend, SDIO irq detection will still happen through the
IP block.

Idea of remuxing the pins by Tony Lindgren as well as the implementation
of omap_hsmmc_pin_init.

Signed-off-by: Andreas Fenkart 

diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 1136e6b..146f3ad 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
  ti,needs-special-reset: Requires a special softreset sequence
  ti,needs-special-hs-handling: HSMMC IP needs special setting for handling 
High Speed
  ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
-SDIO irq while in suspend. Fallback to polling. Affected chips are
-am335x,
+SDIO irq while in suspend. The workaround is to reconfigure the dat1 line as a
+GPIO upon suspend. Beyond this option and the GPIO config, you also need to set
+named pinctrl states "default", "active" and "idle ", see example below.  The
+MMC driver will then then toggle between default and idle during the runtime
+Affected chips are am335x,

  --
  | PRCM |
@@ -49,3 +52,24 @@ Example:
 vmmc-supply = <&vmmc>; /* phandle to regulator node */
 ti,non-removable;
 };
+
+[am335x with with gpio for sdio irq]
+
+   mmc1_cirq_pin: pinmux_cirq_pin {
+   pinctrl-single,pins = <
+   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
+   >;
+   };
+
+   mmc1: mmc@4806 {
+   ti,non-removable;
+   bus-width = <4>;
+   vmmc-supply = <&ldo2_reg>;
+   vmmc_aux-supply = <&vmmc>;
+   ti,quirk-swakeup-missing;
+   pinctrl-names = "default", "active", "idle";
+   pinctrl-0 = <&mmc1_pins>;
+   pinctrl-1 = <&mmc1_pins>;
+   pinctrl-2 = <&mmc1_cirq_pin>;
+   ti,cirq-gpio = <&gpio3 28 0>;
+   };
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 6b0ec55..b94ab08 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -36,6 +36,7 @@
  #include 
  #include 
  #include 
+#include 
  #include 
  #include 
  #include 
@@ -213,11 +214,32 @@ struct omap_hsmmc_host {
 int req_in_progress;
 int flags;
  #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
+#define HSMMC_SWAKEUP_QUIRK(1 << 1)
+#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)

 struct omap_hsmmc_next  next_data;
+   struct pinctrl  *pinctrl;
+   struct pinctrl_state*fixed, *active, *idle;
 struct  omap_mmc_platform_data  *pdata;
  };

+static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
+{
+   struct omap_hsmmc_host *host = dev_id;
+   unsigned long flags;
+
+   spin_lock_irqsave(&host->irq_lock, flags);
+   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
+   disable_irq_nosync(mmc_slot(host).sdio_irq);
+   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
+   }
+   spin_unlock_irqrestore(&host->irq_lock, flags);
+
+   pm_request_resume(host->dev); /* no use counter */
+
+   return IRQ_HANDLED;
+}
+
  static int omap_hsmmc_card_detect(struct device *dev, int slot)
  {
 struct omap_hsmmc_host *host = dev_get_drvdata(dev);
@@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
omap_mmc_platform_data *pdata)
 } else
 pdata->slots[0].gpio_wp = -EINVAL;

+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
+   pdata->slots[0].sdio_irq =
+   gpio_to_irq(pdata->slots[0].gpio_cirq);


What is this? re-assign the platform data?


Seems like, I didn't pay attention to this.
Simply kept in line how the write protection/read only pins are managed.
I'd rather not change this part, or not changing it as part of adding
sdio IRQ support it.

Maybe somebody else on the list can explain why the platform data
contains elements
that are modified during runtime.

- set_power / get_ro function callbacks
- ocr_mask.


Hi,

few params were passed via platform data in non-DT case and never cached
in internal data structure, with non-dt support going away soon, I am
planning to cleanup pdata usage in the driver when it gets to DT only support.

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a messag

Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-18 Thread Andreas Fenkart
2013/11/18 Michael Trimarchi :
> Hi Andreas
>
> On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart  wrote:
>> The am335x can't detect pending cirq in PM runtime suspend.
>> This patch reconfigures dat1 as a GPIO before going to suspend.
>> SDIO interrupts are detected with the GPIO, the GPIO will only wake
>> the module from suspend, SDIO irq detection will still happen through the
>> IP block.
>>
>> Idea of remuxing the pins by Tony Lindgren as well as the implementation
>> of omap_hsmmc_pin_init.
>>
>> Signed-off-by: Andreas Fenkart 
>>
>> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
>> b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> index 1136e6b..146f3ad 100644
>> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
>> @@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
>>  ti,needs-special-reset: Requires a special softreset sequence
>>  ti,needs-special-hs-handling: HSMMC IP needs special setting for handling 
>> High Speed
>>  ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
>> -SDIO irq while in suspend. Fallback to polling. Affected chips are
>> -am335x,
>> +SDIO irq while in suspend. The workaround is to reconfigure the dat1 line 
>> as a
>> +GPIO upon suspend. Beyond this option and the GPIO config, you also need to 
>> set
>> +named pinctrl states "default", "active" and "idle ", see example below.  
>> The
>> +MMC driver will then then toggle between default and idle during the runtime
>> +Affected chips are am335x,
>>
>>  --
>>  | PRCM |
>> @@ -49,3 +52,24 @@ Example:
>> vmmc-supply = <&vmmc>; /* phandle to regulator node */
>> ti,non-removable;
>> };
>> +
>> +[am335x with with gpio for sdio irq]
>> +
>> +   mmc1_cirq_pin: pinmux_cirq_pin {
>> +   pinctrl-single,pins = <
>> +   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
>> +   >;
>> +   };
>> +
>> +   mmc1: mmc@4806 {
>> +   ti,non-removable;
>> +   bus-width = <4>;
>> +   vmmc-supply = <&ldo2_reg>;
>> +   vmmc_aux-supply = <&vmmc>;
>> +   ti,quirk-swakeup-missing;
>> +   pinctrl-names = "default", "active", "idle";
>> +   pinctrl-0 = <&mmc1_pins>;
>> +   pinctrl-1 = <&mmc1_pins>;
>> +   pinctrl-2 = <&mmc1_cirq_pin>;
>> +   ti,cirq-gpio = <&gpio3 28 0>;
>> +   };
>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
>> index 6b0ec55..b94ab08 100644
>> --- a/drivers/mmc/host/omap_hsmmc.c
>> +++ b/drivers/mmc/host/omap_hsmmc.c
>> @@ -36,6 +36,7 @@
>>  #include 
>>  #include 
>>  #include 
>> +#include 
>>  #include 
>>  #include 
>>  #include 
>> @@ -213,11 +214,32 @@ struct omap_hsmmc_host {
>> int req_in_progress;
>> int flags;
>>  #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
>> +#define HSMMC_SWAKEUP_QUIRK(1 << 1)
>> +#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)
>>
>> struct omap_hsmmc_next  next_data;
>> +   struct pinctrl  *pinctrl;
>> +   struct pinctrl_state*fixed, *active, *idle;
>> struct  omap_mmc_platform_data  *pdata;
>>  };
>>
>> +static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
>> +{
>> +   struct omap_hsmmc_host *host = dev_id;
>> +   unsigned long flags;
>> +
>> +   spin_lock_irqsave(&host->irq_lock, flags);
>> +   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
>> +   disable_irq_nosync(mmc_slot(host).sdio_irq);
>> +   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
>> +   }
>> +   spin_unlock_irqrestore(&host->irq_lock, flags);
>> +
>> +   pm_request_resume(host->dev); /* no use counter */
>> +
>> +   return IRQ_HANDLED;
>> +}
>> +
>>  static int omap_hsmmc_card_detect(struct device *dev, int slot)
>>  {
>> struct omap_hsmmc_host *host = dev_get_drvdata(dev);
>> @@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
>> omap_mmc_platform_data *pdata)
>> } else
>> pdata->slots[0].gpio_wp = -EINVAL;
>>
>> +   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
>> +   pdata->slots[0].sdio_irq =
>> +   gpio_to_irq(pdata->slots[0].gpio_cirq);
>
> What is this? re-assign the platform data?

Seems like, I didn't pay attention to this.
Simply kept in line how the write protection/read only pins are managed.
I'd rather not change this part, or not changing it as part of adding
sdio IRQ support it.

Maybe somebody else on the list can explain why the platform data
contains elements
that are modified during runtime.

- set_power / get_ro function callbacks
- ocr_mask.


>
>> +   ret = gpio_request_one(pdata->slots[0].gpio_cirq, 
>> 

Re: [PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-18 Thread Michael Trimarchi
Hi Andreas

On Mon, Nov 18, 2013 at 8:53 AM, Andreas Fenkart  wrote:
> The am335x can't detect pending cirq in PM runtime suspend.
> This patch reconfigures dat1 as a GPIO before going to suspend.
> SDIO interrupts are detected with the GPIO, the GPIO will only wake
> the module from suspend, SDIO irq detection will still happen through the
> IP block.
>
> Idea of remuxing the pins by Tony Lindgren as well as the implementation
> of omap_hsmmc_pin_init.
>
> Signed-off-by: Andreas Fenkart 
>
> diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
> b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> index 1136e6b..146f3ad 100644
> --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
> @@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
>  ti,needs-special-reset: Requires a special softreset sequence
>  ti,needs-special-hs-handling: HSMMC IP needs special setting for handling 
> High Speed
>  ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
> -SDIO irq while in suspend. Fallback to polling. Affected chips are
> -am335x,
> +SDIO irq while in suspend. The workaround is to reconfigure the dat1 line as 
> a
> +GPIO upon suspend. Beyond this option and the GPIO config, you also need to 
> set
> +named pinctrl states "default", "active" and "idle ", see example below.  The
> +MMC driver will then then toggle between default and idle during the runtime
> +Affected chips are am335x,
>
>  --
>  | PRCM |
> @@ -49,3 +52,24 @@ Example:
> vmmc-supply = <&vmmc>; /* phandle to regulator node */
> ti,non-removable;
> };
> +
> +[am335x with with gpio for sdio irq]
> +
> +   mmc1_cirq_pin: pinmux_cirq_pin {
> +   pinctrl-single,pins = <
> +   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
> +   >;
> +   };
> +
> +   mmc1: mmc@4806 {
> +   ti,non-removable;
> +   bus-width = <4>;
> +   vmmc-supply = <&ldo2_reg>;
> +   vmmc_aux-supply = <&vmmc>;
> +   ti,quirk-swakeup-missing;
> +   pinctrl-names = "default", "active", "idle";
> +   pinctrl-0 = <&mmc1_pins>;
> +   pinctrl-1 = <&mmc1_pins>;
> +   pinctrl-2 = <&mmc1_cirq_pin>;
> +   ti,cirq-gpio = <&gpio3 28 0>;
> +   };
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 6b0ec55..b94ab08 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -36,6 +36,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -213,11 +214,32 @@ struct omap_hsmmc_host {
> int req_in_progress;
> int flags;
>  #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
> +#define HSMMC_SWAKEUP_QUIRK(1 << 1)
> +#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)
>
> struct omap_hsmmc_next  next_data;
> +   struct pinctrl  *pinctrl;
> +   struct pinctrl_state*fixed, *active, *idle;
> struct  omap_mmc_platform_data  *pdata;
>  };
>
> +static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
> +{
> +   struct omap_hsmmc_host *host = dev_id;
> +   unsigned long flags;
> +
> +   spin_lock_irqsave(&host->irq_lock, flags);
> +   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
> +   disable_irq_nosync(mmc_slot(host).sdio_irq);
> +   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
> +   }
> +   spin_unlock_irqrestore(&host->irq_lock, flags);
> +
> +   pm_request_resume(host->dev); /* no use counter */
> +
> +   return IRQ_HANDLED;
> +}
> +
>  static int omap_hsmmc_card_detect(struct device *dev, int slot)
>  {
> struct omap_hsmmc_host *host = dev_get_drvdata(dev);
> @@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
> omap_mmc_platform_data *pdata)
> } else
> pdata->slots[0].gpio_wp = -EINVAL;
>
> +   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
> +   pdata->slots[0].sdio_irq =
> +   gpio_to_irq(pdata->slots[0].gpio_cirq);

What is this? re-assign the platform data?

> +   ret = gpio_request_one(pdata->slots[0].gpio_cirq, 
> GPIOF_DIR_IN,
> +  "sdio_cirq");
> +   if (ret)
> +   goto err_free_ro;
> +
> +   } else {
> +   pdata->slots[0].gpio_cirq = -EINVAL;
> +   }
> +
> +
> return 0;
>
> +err_free_ro:
> +   if (gpio_is_valid(pdata->slots[0].gpio_wp))
>  err_free_wp:
> -   gpio_free(pdata->slots[0].gpio_wp);
> +   gpio_free(pdata->slots[0].gpio_wp);
>  err_free_cd:
> if (gpio_is_valid(pdata->slots[0].switch_pin))
>  err_free_sp:
> @@ 

[PATCH v3 2/3] mmc: omap_hsmmc: Pin remux workaround to support SDIO interrupt on AM335x.

2013-11-17 Thread Andreas Fenkart
The am335x can't detect pending cirq in PM runtime suspend.
This patch reconfigures dat1 as a GPIO before going to suspend.
SDIO interrupts are detected with the GPIO, the GPIO will only wake
the module from suspend, SDIO irq detection will still happen through the
IP block.

Idea of remuxing the pins by Tony Lindgren as well as the implementation
of omap_hsmmc_pin_init.

Signed-off-by: Andreas Fenkart 

diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt 
b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
index 1136e6b..146f3ad 100644
--- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
+++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt
@@ -21,8 +21,11 @@ ti,non-removable: non-removable slot (like eMMC)
 ti,needs-special-reset: Requires a special softreset sequence
 ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High 
Speed
 ti,quirk-swakup-missing: SOC missing the swakeup line, will not detect
-SDIO irq while in suspend. Fallback to polling. Affected chips are
-am335x,
+SDIO irq while in suspend. The workaround is to reconfigure the dat1 line as a
+GPIO upon suspend. Beyond this option and the GPIO config, you also need to set
+named pinctrl states "default", "active" and "idle ", see example below.  The
+MMC driver will then then toggle between default and idle during the runtime
+Affected chips are am335x,
 
 --
 | PRCM |
@@ -49,3 +52,24 @@ Example:
vmmc-supply = <&vmmc>; /* phandle to regulator node */
ti,non-removable;
};
+
+[am335x with with gpio for sdio irq]
+
+   mmc1_cirq_pin: pinmux_cirq_pin {
+   pinctrl-single,pins = <
+   0x0f8 0x3f  /* MMC0_DAT1 as GPIO2_28 */
+   >;
+   };
+
+   mmc1: mmc@4806 {
+   ti,non-removable;
+   bus-width = <4>;
+   vmmc-supply = <&ldo2_reg>;
+   vmmc_aux-supply = <&vmmc>;
+   ti,quirk-swakeup-missing;
+   pinctrl-names = "default", "active", "idle";
+   pinctrl-0 = <&mmc1_pins>;
+   pinctrl-1 = <&mmc1_pins>;
+   pinctrl-2 = <&mmc1_cirq_pin>;
+   ti,cirq-gpio = <&gpio3 28 0>;
+   };
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 6b0ec55..b94ab08 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -213,11 +214,32 @@ struct omap_hsmmc_host {
int req_in_progress;
int flags;
 #define HSMMC_SDIO_IRQ_ENABLED (1 << 0)/* SDIO irq enabled */
+#define HSMMC_SWAKEUP_QUIRK(1 << 1)
+#define HSMMC_CIRQ_GPIO_ENABLED (1 << 2)
 
struct omap_hsmmc_next  next_data;
+   struct pinctrl  *pinctrl;
+   struct pinctrl_state*fixed, *active, *idle;
struct  omap_mmc_platform_data  *pdata;
 };
 
+static irqreturn_t omap_hsmmc_cirq(int irq, void *dev_id)
+{
+   struct omap_hsmmc_host *host = dev_id;
+   unsigned long flags;
+
+   spin_lock_irqsave(&host->irq_lock, flags);
+   if (host->flags & HSMMC_CIRQ_GPIO_ENABLED) {
+   disable_irq_nosync(mmc_slot(host).sdio_irq);
+   host->flags &= ~HSMMC_CIRQ_GPIO_ENABLED;
+   }
+   spin_unlock_irqrestore(&host->irq_lock, flags);
+
+   pm_request_resume(host->dev); /* no use counter */
+
+   return IRQ_HANDLED;
+}
+
 static int omap_hsmmc_card_detect(struct device *dev, int slot)
 {
struct omap_hsmmc_host *host = dev_get_drvdata(dev);
@@ -452,10 +474,25 @@ static int omap_hsmmc_gpio_init(struct 
omap_mmc_platform_data *pdata)
} else
pdata->slots[0].gpio_wp = -EINVAL;
 
+   if (gpio_is_valid(pdata->slots[0].gpio_cirq)) {
+   pdata->slots[0].sdio_irq =
+   gpio_to_irq(pdata->slots[0].gpio_cirq);
+   ret = gpio_request_one(pdata->slots[0].gpio_cirq, GPIOF_DIR_IN,
+  "sdio_cirq");
+   if (ret)
+   goto err_free_ro;
+
+   } else {
+   pdata->slots[0].gpio_cirq = -EINVAL;
+   }
+
+
return 0;
 
+err_free_ro:
+   if (gpio_is_valid(pdata->slots[0].gpio_wp))
 err_free_wp:
-   gpio_free(pdata->slots[0].gpio_wp);
+   gpio_free(pdata->slots[0].gpio_wp);
 err_free_cd:
if (gpio_is_valid(pdata->slots[0].switch_pin))
 err_free_sp:
@@ -469,6 +506,69 @@ static void omap_hsmmc_gpio_free(struct 
omap_mmc_platform_data *pdata)
gpio_free(pdata->slots[0].gpio_wp);
if (gpio_is_valid(pdata->slots[0].switch_pin))
gpio_free(pdata->slots[0].switch_pin);
+   if (gpio_is_valid(pdata->slots[0].gpio_cirq))
+   gpio_free(pdata->slots[0].gpio_cirq);
+}
+
+stat