123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- * 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.
- This file documents differences between the core properties described
- by mmc.txt and the properties used by the omap_hsmmc driver.
- Required properties:
- - compatible:
- Should be "ti,omap2-hsmmc", for OMAP2 controllers
- Should be "ti,omap3-hsmmc", for OMAP3 controllers
- Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0
- Should be "ti,omap4-hsmmc", for OMAP4 controllers
- Should be "ti,am33xx-hsmmc", for AM335x controllers
- - 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
- 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]
- 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;
- 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 GPIO_ACTIVE_LOW>;
- };
- mmc1_idle : pinmux_cirq_pin {
- pinctrl-single,pins = <
- 0x0f8 0x3f /* GPIO2_28 */
- >;
- };
|