Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 1 | * TI Highspeed MMC host controller for OMAP |
| 2 | |
| 3 | The Highspeed MMC Host Controller on TI OMAP family |
| 4 | provides an interface for MMC, SD, and SDIO types of memory cards. |
| 5 | |
Chris Ball | 4efafee | 2012-06-11 21:48:16 -0400 | [diff] [blame] | 6 | This file documents differences between the core properties described |
| 7 | by mmc.txt and the properties used by the omap_hsmmc driver. |
| 8 | |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 9 | Required properties: |
| 10 | - compatible: |
| 11 | Should be "ti,omap2-hsmmc", for OMAP2 controllers |
| 12 | Should be "ti,omap3-hsmmc", for OMAP3 controllers |
Nishanth Menon | 59445b1 | 2014-02-13 23:45:48 -0600 | [diff] [blame] | 13 | Should be "ti,omap3-pre-es3-hsmmc" for OMAP3 controllers pre ES3.0 |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 14 | Should be "ti,omap4-hsmmc", for OMAP4 controllers |
Andreas Fenkart | 2cd3a2a | 2014-05-29 10:28:00 +0200 | [diff] [blame] | 15 | Should be "ti,am33xx-hsmmc", for AM335x controllers |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 16 | - ti,hwmods: Must be "mmc<n>", n is controller instance starting 1 |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 17 | |
| 18 | Optional properties: |
| 19 | ti,dual-volt: boolean, supports dual voltage cards |
| 20 | <supply-name>-supply: phandle to the regulator device tree node |
| 21 | "supply-name" examples are "vmmc", "vmmc_aux" etc |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 22 | ti,non-removable: non-removable slot (like eMMC) |
| 23 | ti,needs-special-reset: Requires a special softreset sequence |
Hebbar, Gururaja | cd58709 | 2012-11-19 21:59:58 +0530 | [diff] [blame] | 24 | ti,needs-special-hs-handling: HSMMC IP needs special setting for handling High Speed |
Matt Porter | 55b4452 | 2013-09-10 14:24:39 -0500 | [diff] [blame] | 25 | dmas: List of DMA specifiers with the controller specific format |
| 26 | as described in the generic DMA client binding. A tx and rx |
| 27 | specifier is required. |
| 28 | dma-names: List of DMA request names. These strings correspond |
| 29 | 1:1 with the DMA specifiers listed in dmas. The string naming is |
| 30 | to be "rx" and "tx" for RX and TX DMA requests, respectively. |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 31 | |
Matt Porter | 55b4452 | 2013-09-10 14:24:39 -0500 | [diff] [blame] | 32 | Examples: |
| 33 | |
| 34 | [hwmod populated DMA resources] |
| 35 | |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 36 | mmc1: mmc@0x4809c000 { |
| 37 | compatible = "ti,omap4-hsmmc"; |
| 38 | reg = <0x4809c000 0x400>; |
| 39 | ti,hwmods = "mmc1"; |
| 40 | ti,dual-volt; |
Arnd Bergmann | 7f21779 | 2012-05-13 00:14:24 -0400 | [diff] [blame] | 41 | bus-width = <4>; |
Rajendra Nayak | 46856a6 | 2012-03-12 20:32:37 +0530 | [diff] [blame] | 42 | vmmc-supply = <&vmmc>; /* phandle to regulator node */ |
| 43 | ti,non-removable; |
| 44 | }; |
Matt Porter | 55b4452 | 2013-09-10 14:24:39 -0500 | [diff] [blame] | 45 | |
| 46 | [generic DMA request binding] |
| 47 | |
| 48 | mmc1: mmc@0x4809c000 { |
| 49 | compatible = "ti,omap4-hsmmc"; |
| 50 | reg = <0x4809c000 0x400>; |
| 51 | ti,hwmods = "mmc1"; |
| 52 | ti,dual-volt; |
| 53 | bus-width = <4>; |
| 54 | vmmc-supply = <&vmmc>; /* phandle to regulator node */ |
| 55 | ti,non-removable; |
| 56 | dmas = <&edma 24 |
| 57 | &edma 25>; |
| 58 | dma-names = "tx", "rx"; |
| 59 | }; |
Andreas Fenkart | 455e5cd | 2014-05-29 10:28:05 +0200 | [diff] [blame] | 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 | ... |
Andreas Fenkart | c21e678 | 2015-07-07 19:53:10 +0200 | [diff] [blame^] | 105 | interrupts-extended = <&intc 64 &gpio2 28 GPIO_ACTIVE_LOW>; |
Andreas Fenkart | 455e5cd | 2014-05-29 10:28:05 +0200 | [diff] [blame] | 106 | }; |
| 107 | |
| 108 | mmc1_idle : pinmux_cirq_pin { |
| 109 | pinctrl-single,pins = < |
| 110 | 0x0f8 0x3f /* GPIO2_28 */ |
| 111 | >; |
| 112 | }; |