1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
* Cavium Octeon & ThunderX MMC controller
The highspeed MMC host controller on Caviums SoCs provides an interface
for MMC and SD types of memory cards.
Supported maximum speeds are the ones of the eMMC standard 4.41 as well
as the speed of SD standard 4.0. Only 3.3 Volt is supported.
Required properties:
- compatible : should be one of:
cavium,octeon-6130-mmc
cavium,octeon-7890-mmc
cavium,thunder-8190-mmc
cavium,thunder-8390-mmc
mmc-slot
- reg : mmc controller base registers
- clocks : phandle
Optional properties:
- for cd, bus-width, vmmc-supply, vqmmc-supply, and additional generic
mmc parameters please refer to mmc.txt within this directory
- cavium,cmd-clk-skew : number of coprocessor clocks before sampling command
- cavium,dat-clk-skew : number of coprocessor clocks before sampling data
Deprecated properties:
- spi-max-frequency : use max-frequency instead
- cavium,bus-max-width : use bus-width instead
- power-gpios : use vmmc-supply instead
- cavium,octeon-6130-mmc-slot : use mmc-slot instead
GPIO control via vmmc-supply & vqmmc-supply:
Two types of regulator object can be specified as mmc properties,
typically regulator-fixed controlled by GPIO pins.
Octeon/OcteonTX chips commonly use GPIO8 as an MMC-reset pin.
In systems which may boot from MMC, it starts as input, and is gently
pulled up/down by board logic to indicate the active sense of the
signal. Chip reset then drives the signal in the opposite direction
to effect a reset of target devices.
Device tree should model this with a vmmc-supply regulator, gated by
GPIO8, so GPIO8 is driven in the non-reset direction when MMC devices
are probed, and held there until rmmod/shutdown/suspend.
This allows a warm reboot to reset the MMC devices.
Octeon/OcteonTX MMC supports up to 3 mmc slots, but any
level-shifting to accommodate different signal voltages is
done by external hardware, under control of an optional
vqmmc regulator object, typically controlled by GPIO.
If any mmc-slots have a vqmmc-supply property, it is taken as a warning
that we must switch carefully between slots (unless they have the same
vqmmc object), tri-stating MMC signals to avoid any transient states
as level-shifters are enabled/disabled.
Even when so-called bi-directional level shifters are used,
this technique should be employed when using different bus-widths
on different slots, disabling level shifters to avoid presenting
non-uniform impedance across DATA0-7 & CMD when non-selected
4-wide slots are left enabled, while accessing 8-wide targets.
Note that it's not possible to specify multiple regulators
controlled by same GPIO pin, but with different active state.
If one GPIO line is require to switch voltage/routing between
different mmc-slots, specify a vqmmc-supply on one slot, but
not the other. The regulator_disable call on leaving that slot
will implicitly switch the state to support the unmarked slot.
There's no need to list vqmmc-supply if all the mmc-slots on
a board run at same voltage, and have same width.
Examples:
mmc_1_4: mmc@1,4 {
compatible = "cavium,thunder-8390-mmc";
reg = <0x0c00 0 0 0 0>; /* DEVFN = 0x0c (1:4) */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&sclk>;
mmc-slot@0 {
compatible = "mmc-slot";
reg = <0>;
vmmc-supply = <&mmc_supply_3v3>;
vqmmc-supply = <&vqmmc_3v3>;
max-frequency = <52000000>;
bus-width = <4>;
cap-sd-highspeed;
};
mmc-slot@1 {
compatible = "mmc-slot";
reg = <1>;
vmmc-supply = <&mmc_supply_3v3>;
vqmmc-supply = <&vqmmc_1v8>;
max-frequency = <100000000>;
bus-width = <8>;
cap-mmc-highspeed;
non-removable;
};
};
|