2024-09-09 08:52:07 +00:00
|
|
|
* TI Highspeed MMC host controller for OMAP
|
|
|
|
|
|
|
|
The Highspeed MMC Host Controller on TI OMAP family
|
|
|
|
provides an interface for MMC, SD, and SDIO types of memory cards.
|
|
|
|
|
2024-09-09 08:57:42 +00:00
|
|
|
This file documents differences between the core properties described
|
|
|
|
by mmc.txt and the properties used by the omap_hsmmc driver.
|
|
|
|
|
2024-09-09 08:52:07 +00:00
|
|
|
Required properties:
|
|
|
|
- compatible:
|
|
|
|
Should be "ti,omap2-hsmmc", for OMAP2 controllers
|
|
|
|
Should be "ti,omap3-hsmmc", for OMAP3 controllers
|
2024-09-09 08:57:42 +00:00
|
|
|
Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0
|
2024-09-09 08:52:07 +00:00
|
|
|
Should be "ti,omap4-hsmmc", for OMAP4 controllers
|
2024-09-09 08:57:42 +00:00
|
|
|
Should be "ti,am33xx-hsmmc", for AM335x controllers
|
2024-09-09 08:52:07 +00:00
|
|
|
- ti,hwmods: Must be "mmc<n>", n is controller instance starting 1
|
|
|
|
|
|
|
|
Optional properties:
|
|
|
|
ti,dual-volt: boolean, supports dual voltage cards
|
|
|
|
<supply-name>-supply: phandle to the regulator device tree node
|
|
|
|
"supply-name" examples are "vmmc", "vmmc_aux" etc
|
|
|
|
ti,non-removable: non-removable slot (like eMMC)
|
|
|
|
ti,needs-special-reset: Requires a special softreset sequence
|
2024-09-09 08:57:42 +00:00
|
|
|
ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed
|
|
|
|
dmas: List of DMA specifiers with the controller specific format
|
|
|
|
as described in the generic DMA client binding. A tx and rx
|
|
|
|
specifier is required.
|
|
|
|
dma-names: List of DMA request names. These strings correspond
|
|
|
|
1:1 with the DMA specifiers listed in dmas. The string naming is
|
|
|
|
to be "rx" and "tx" for RX and TX DMA requests, respectively.
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
[hwmod populated DMA resources]
|
|
|
|
|
|
|
|
mmc1: mmc@0x4809c000 {
|
|
|
|
compatible = "ti,omap4-hsmmc";
|
|
|
|
reg = <0x4809c000 0x400>;
|
|
|
|
ti,hwmods = "mmc1";
|
|
|
|
ti,dual-volt;
|
|
|
|
bus-width = <4>;
|
|
|
|
vmmc-supply = <&vmmc>; /* phandle to regulator node */
|
|
|
|
ti,non-removable;
|
|
|
|
};
|
|
|
|
|
|
|
|
[generic DMA request binding]
|
2024-09-09 08:52:07 +00:00
|
|
|
|
|
|
|
mmc1: mmc@0x4809c000 {
|
|
|
|
compatible = "ti,omap4-hsmmc";
|
|
|
|
reg = <0x4809c000 0x400>;
|
|
|
|
ti,hwmods = "mmc1";
|
|
|
|
ti,dual-volt;
|
2024-09-09 08:57:42 +00:00
|
|
|
bus-width = <4>;
|
2024-09-09 08:52:07 +00:00
|
|
|
vmmc-supply = <&vmmc>; /* phandle to regulator node */
|
|
|
|
ti,non-removable;
|
2024-09-09 08:57:42 +00:00
|
|
|
dmas = <&edma 24
|
|
|
|
&edma 25>;
|
|
|
|
dma-names = "tx", "rx";
|
|
|
|
};
|
|
|
|
|
|
|
|
[workaround for missing swakeup on am33xx]
|
|
|
|
|
|
|
|
This SOC is missing the swakeup line, it will not detect SDIO irq
|
|
|
|
while in suspend.
|
|
|
|
|
|
|
|
------
|
|
|
|
| PRCM |
|
|
|
|
------
|
|
|
|
^ |
|
|
|
|
swakeup | | fclk
|
|
|
|
| v
|
|
|
|
------ ------- -----
|
|
|
|
| card | -- CIRQ --> | hsmmc | -- IRQ --> | CPU |
|
|
|
|
------ ------- -----
|
|
|
|
|
|
|
|
In suspend the fclk is off and the module is disfunctional. Even register reads
|
|
|
|
will fail. A small logic in the host will request fclk restore, when an
|
|
|
|
external event is detected. Once the clock is restored, the host detects the
|
|
|
|
event normally. Since am33xx doesn't have this line it never wakes from
|
|
|
|
suspend.
|
|
|
|
|
|
|
|
The workaround is to reconfigure the dat1 line as a GPIO upon suspend. To make
|
|
|
|
this work, we need to set the named pinctrl states "default" and "idle".
|
|
|
|
Prepare idle to remux dat1 as a gpio, and default to remux it back as sdio
|
|
|
|
dat1. The MMC driver will then toggle between idle and default state during
|
|
|
|
runtime.
|
|
|
|
|
|
|
|
In summary:
|
|
|
|
1. select matching 'compatible' section, see example below.
|
|
|
|
2. specify pinctrl states "default" and "idle", "sleep" is optional.
|
|
|
|
3. specify the gpio irq used for detecting sdio irq in suspend
|
|
|
|
|
|
|
|
If configuration is incomplete, a warning message is emitted "falling back to
|
|
|
|
polling". Also check the "sdio irq mode" in /sys/kernel/debug/mmc0/regs. Mind
|
|
|
|
not every application needs SDIO irq, e.g. MMC cards.
|
|
|
|
|
|
|
|
mmc1: mmc@48060100 {
|
|
|
|
compatible = "ti,am33xx-hsmmc";
|
|
|
|
...
|
|
|
|
pinctrl-names = "default", "idle", "sleep"
|
|
|
|
pinctrl-0 = <&mmc1_pins>;
|
|
|
|
pinctrl-1 = <&mmc1_idle>;
|
|
|
|
pinctrl-2 = <&mmc1_sleep>;
|
|
|
|
...
|
|
|
|
interrupts-extended = <&intc 64 &gpio2 28 0>;
|
|
|
|
};
|
|
|
|
|
|
|
|
mmc1_idle : pinmux_cirq_pin {
|
|
|
|
pinctrl-single,pins = <
|
|
|
|
0x0f8 0x3f /* GPIO2_28 */
|
|
|
|
>;
|
2024-09-09 08:52:07 +00:00
|
|
|
};
|