mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.7 KiB
134 lines
4.7 KiB
* 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 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 IRQ_TYPE_LEVEL_LOW>; |
|
}; |
|
|
|
mmc1_idle : pinmux_cirq_pin { |
|
pinctrl-single,pins = < |
|
0x0f8 0x3f /* GPIO2_28 */ |
|
>; |
|
};
|
|
|