aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-4.14/950-0233-overlays-Rework-sdio-overlays-to-allow-polling.patch
blob: d376bdde8d21ad3f6f392ebef21137fa8e2f6821 (plain)
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
From 152d226fd2eff1fdc1f8881287bf1a7d4560b27e Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
Date: Mon, 26 Feb 2018 19:46:32 +0000
Subject: [PATCH 233/454] overlays: Rework sdio overlays to allow polling

MMC/SD interfaces support a DT property (non-removable) that disables
the usual polling required to detect card removal for a configuration
that doesn't have hardware card presence detection. This property is
required for the on-board SDIO WiFi interface, but other uses of the
interface may want the polling to be re-enabled.

'non-removable' is a boolean DT property - true if present, false if
absent - and the overlay mechanism does not allow a property in the
base DTB to be deleted, so if the base DTB has non-removable set
(which is true for all WiFi-equipped Pis) then an overlay cannot
unset it.

Modify the SDIO overlays to work around this problem by disabling
the mmc node and adding a clone to which non-removable may
optionally be added.

N.B. The default state of poll_once is still true, and the overlay
does include a non-removable property, but setting poll_once to false
("off") will remove the property from the overlay before it is applied.

See: https://github.com/raspberrypi/linux/issues/2401

Signed-off-by: Phil Elwell <phil@raspberrypi.org>
---
 .../boot/dts/overlays/sdio-1bit-overlay.dts   | 40 +++++++++++++-----
 arch/arm/boot/dts/overlays/sdio-overlay.dts   | 41 ++++++++++++++-----
 2 files changed, 59 insertions(+), 22 deletions(-)

--- a/arch/arm/boot/dts/overlays/sdio-1bit-overlay.dts
+++ b/arch/arm/boot/dts/overlays/sdio-1bit-overlay.dts
@@ -8,21 +8,39 @@
 
 	fragment@0 {
 		target = <&mmc>;
-		sdio_mmc: __overlay__ {
-			compatible = "brcm,bcm2835-mmc";
-			pinctrl-names = "default";
-			pinctrl-0 = <&sdio_pins>;
-			non-removable;
-			bus-width = <1>;
-			brcm,overclock-50 = <0>;
-			status = "okay";
+		__overlay__ {
+			status = "disabled";
 		};
 	};
 
 	fragment@1 {
+		target = <&soc>;
+		__overlay__ {
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			sdio_1bit: sdio@7e300000 {
+				compatible = "brcm,bcm2835-mmc",
+					     "brcm,bcm2835-sdhci";
+				reg = <0x7e300000 0x100>;
+				interrupts = <2 30>;
+				clocks = <&clocks 28/*BCM2835_CLOCK_EMMC*/>;
+				dmas = <&dma 11>;
+				dma-names = "rx-tx";
+				brcm,overclock-50 = <0>;
+				status = "okay";
+				pinctrl-names = "default";
+				pinctrl-0 = <&sdio_1bit_pins>;
+				non-removable;
+				bus-width = <1>;
+			};
+		};
+	};
+
+	fragment@2 {
 		target = <&gpio>;
 		__overlay__ {
-			sdio_pins: sdio_pins {
+			sdio_1bit_pins: sdio_1bit_pins {
 				brcm,pins = <22 23 24 25>;
 				brcm,function = <7>; /* ALT3 = SD1 */
 				brcm,pull = <0 2 2 2>;
@@ -31,7 +49,7 @@
 	};
 
 	__overrides__ {
-		poll_once = <&sdio_mmc>,"non-removable?";
-		sdio_overclock = <&sdio_mmc>,"brcm,overclock-50:0";
+		poll_once = <&sdio_1bit>,"non-removable?";
+		sdio_overclock = <&sdio_1bit>,"brcm,overclock-50:0";
 	};
 };
--- a/arch/arm/boot/dts/overlays/sdio-overlay.dts
+++ b/arch/arm/boot/dts/overlays/sdio-overlay.dts
@@ -8,20 +8,39 @@
 
 	fragment@0 {
 		target = <&mmc>;
-		sdio_mmc: __overlay__ {
-			pinctrl-names = "default";
-			pinctrl-0 = <&sdio_pins>;
-			non-removable;
-			bus-width = <4>;
-			brcm,overclock-50 = <0>;
-			status = "okay";
+		__overlay__ {
+			status = "disabled";
 		};
 	};
 
 	fragment@1 {
+		target = <&soc>;
+		__overlay__ {
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			sdio_ovl: sdio@7e300000 {
+				compatible = "brcm,bcm2835-mmc",
+					     "brcm,bcm2835-sdhci";
+				reg = <0x7e300000 0x100>;
+				interrupts = <2 30>;
+				clocks = <&clocks 28/*BCM2835_CLOCK_EMMC*/>;
+				dmas = <&dma 11>;
+				dma-names = "rx-tx";
+				brcm,overclock-50 = <0>;
+				status = "okay";
+				pinctrl-names = "default";
+				pinctrl-0 = <&sdio_ovl_pins>;
+				non-removable;
+				bus-width = <1>;
+			};
+		};
+	};
+
+	fragment@2 {
 		target = <&gpio>;
 		__overlay__ {
-			sdio_pins: sdio_pins {
+			sdio_ovl_pins: sdio_ovl_pins {
 				brcm,pins = <22 23 24 25 26 27>;
 				brcm,function = <7>; /* ALT3 = SD1 */
 				brcm,pull = <0 2 2 2 2 2>;
@@ -30,8 +49,8 @@
 	};
 
 	__overrides__ {
-		poll_once = <&sdio_mmc>,"non-removable?";
-		bus_width = <&sdio_mmc>,"bus-width:0";
-		sdio_overclock = <&sdio_mmc>,"brcm,overclock-50:0";
+		poll_once = <&sdio_ovl>,"non-removable?";
+		bus_width = <&sdio_ovl>,"bus-width:0";
+		sdio_overclock = <&sdio_ovl>,"brcm,overclock-50:0";
 	};
 };