| * TI Highspeed MMC host controller for OMAP and 66AK2G family. |
| |
| The Highspeed MMC Host Controller on TI OMAP and 66AK2G 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 |
| Should be "ti,k2g-hsmmc", "ti,omap4-hsmmc" for 66AK2G controllers. |
| |
| SoC specific required properties: |
| --------------------------------- |
| The following are mandatory properties for OMAPs, AM33xx and AM43xx SoCs only: |
| - ti,hwmods: Must be "mmc<n>", n is controller instance starting 1. |
| |
| The following are mandatory properties for 66AK2G SoCs only: |
| - power-domains:Should contain a phandle to a PM domain provider node |
| and an args specifier containing the MMC device id |
| value. This property is as per the binding, |
| Documentation/devicetree/bindings/soc/ti/sci-pm-domain.yaml |
| - clocks: Must contain an entry for each entry in clock-names. Should |
| be defined as per the he appropriate clock bindings consumer |
| usage in Documentation/devicetree/bindings/clock/ti,sci-clk.yaml |
| - clock-names: Shall be "fck" for the functional clock, |
| and "mmchsdb_fck" for the debounce clock. |
| |
| |
| 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"(deprecated)/"vqmmc" 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@4809c000 { |
| 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@4809c000 { |
| 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 dysfunctional. 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 IRQ_TYPE_LEVEL_LOW>; |
| }; |
| |
| mmc1_idle : pinmux_cirq_pin { |
| pinctrl-single,pins = < |
| 0x0f8 0x3f /* GPIO2_28 */ |
| >; |
| }; |