diff options
Diffstat (limited to 'Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt')
-rw-r--r-- | Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt index ce8056116fb0..76bf087bc889 100644 --- a/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt +++ b/Documentation/devicetree/bindings/mmc/ti-omap-hsmmc.txt | |||
@@ -12,6 +12,7 @@ Required properties: | |||
12 | Should be "ti,omap3-hsmmc", for OMAP3 controllers | 12 | Should be "ti,omap3-hsmmc", for OMAP3 controllers |
13 | Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0 | 13 | Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0 |
14 | Should be "ti,omap4-hsmmc", for OMAP4 controllers | 14 | Should be "ti,omap4-hsmmc", for OMAP4 controllers |
15 | Should be "ti,am33xx-hsmmc", for AM335x controllers | ||
15 | - ti,hwmods: Must be "mmc<n>", n is controller instance starting 1 | 16 | - ti,hwmods: Must be "mmc<n>", n is controller instance starting 1 |
16 | 17 | ||
17 | Optional properties: | 18 | Optional properties: |
@@ -56,3 +57,56 @@ Examples: | |||
56 | &edma 25>; | 57 | &edma 25>; |
57 | dma-names = "tx", "rx"; | 58 | dma-names = "tx", "rx"; |
58 | }; | 59 | }; |
60 | |||
61 | [workaround for missing swakeup on am33xx] | ||
62 | |||
63 | This SOC is missing the swakeup line, it will not detect SDIO irq | ||
64 | while in suspend. | ||
65 | |||
66 | ------ | ||
67 | | PRCM | | ||
68 | ------ | ||
69 | ^ | | ||
70 | swakeup | | fclk | ||
71 | | v | ||
72 | ------ ------- ----- | ||
73 | | card | -- CIRQ --> | hsmmc | -- IRQ --> | CPU | | ||
74 | ------ ------- ----- | ||
75 | |||
76 | In suspend the fclk is off and the module is disfunctional. Even register reads | ||
77 | will fail. A small logic in the host will request fclk restore, when an | ||
78 | external event is detected. Once the clock is restored, the host detects the | ||
79 | event normally. Since am33xx doesn't have this line it never wakes from | ||
80 | suspend. | ||
81 | |||
82 | The workaround is to reconfigure the dat1 line as a GPIO upon suspend. To make | ||
83 | this work, we need to set the named pinctrl states "default" and "idle". | ||
84 | Prepare idle to remux dat1 as a gpio, and default to remux it back as sdio | ||
85 | dat1. The MMC driver will then toggle between idle and default state during | ||
86 | runtime. | ||
87 | |||
88 | In summary: | ||
89 | 1. select matching 'compatible' section, see example below. | ||
90 | 2. specify pinctrl states "default" and "idle", "sleep" is optional. | ||
91 | 3. specify the gpio irq used for detecting sdio irq in suspend | ||
92 | |||
93 | If configuration is incomplete, a warning message is emitted "falling back to | ||
94 | polling". Also check the "sdio irq mode" in /sys/kernel/debug/mmc0/regs. Mind | ||
95 | not every application needs SDIO irq, e.g. MMC cards. | ||
96 | |||
97 | mmc1: mmc@48060100 { | ||
98 | compatible = "ti,am33xx-hsmmc"; | ||
99 | ... | ||
100 | pinctrl-names = "default", "idle", "sleep" | ||
101 | pinctrl-0 = <&mmc1_pins>; | ||
102 | pinctrl-1 = <&mmc1_idle>; | ||
103 | pinctrl-2 = <&mmc1_sleep>; | ||
104 | ... | ||
105 | interrupts-extended = <&intc 64 &gpio2 28 0>; | ||
106 | }; | ||
107 | |||
108 | mmc1_idle : pinmux_cirq_pin { | ||
109 | pinctrl-single,pins = < | ||
110 | 0x0f8 0x3f /* GPIO2_28 */ | ||
111 | >; | ||
112 | }; | ||