diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 12:38:59 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-17 12:38:59 -0500 |
commit | 18656782a820f075cb5c168a2e381a8938b1550a (patch) | |
tree | db431928382a8ae2cc6a153ad28e5bb6a8d5d67e | |
parent | a233bb742aed62fc6164073d9835135f639b8828 (diff) | |
parent | 6f4554bdff6870c9e0f0b152bbec71d7a0f366f1 (diff) |
Merge tag 'drivers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC driver updates from Olof Johansson:
"These are changes for drivers that are intimately tied to some SoC and
for some reason could not get merged through the respective subsystem
maintainer tree.
This time around, much of this is for at91, with the bulk of it being
syscon and udc drivers.
Also, there's:
- coupled cpuidle support for Samsung Exynos4210
- Renesas 73A0 common-clk work
- of/platform changes to tear down DMA mappings on device destruction
- a few updates to the TI Keystone knav code"
* tag 'drivers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (26 commits)
cpuidle: exynos: add coupled cpuidle support for exynos4210
ARM: EXYNOS: apply S5P_CENTRAL_SEQ_OPTION fix only when necessary
soc: ti: knav_qmss_queue: change knav_range_setup_acc_irq to static
soc: ti: knav_qmss_queue: makefile tweak to build as dynamic module
pcmcia: at91_cf: depend on !ARCH_MULTIPLATFORM
soc: ti: knav_qmss_queue: export API calls for use by user driver
of/platform: teardown DMA mappings on device destruction
usb: gadget: at91_udc: Allocate udc instance
usb: gadget: at91_udc: Update DT binding documentation
usb: gadget: at91_udc: Rework for multi-platform kernel support
usb: gadget: at91_udc: Simplify probe and remove functions
usb: gadget: at91_udc: Remove non-DT handling code
usb: gadget: at91_udc: Document DT clocks and clock-names property
usb: gadget: at91_udc: Drop uclk clock
usb: gadget: at91_udc: Fix clock names
mfd: syscon: Add Atmel SMC binding doc
mfd: syscon: Add atmel-smc registers definition
mfd: syscon: Add Atmel Matrix bus DT binding documentation
mfd: syscon: Add atmel-matrix registers definition
clk: shmobile: fix sparse NULL pointer warning
...
28 files changed, 1570 insertions, 268 deletions
diff --git a/Documentation/devicetree/bindings/clock/renesas,sh73a0-cpg-clocks.txt b/Documentation/devicetree/bindings/clock/renesas,sh73a0-cpg-clocks.txt new file mode 100644 index 000000000000..a8978ec94831 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/renesas,sh73a0-cpg-clocks.txt | |||
@@ -0,0 +1,35 @@ | |||
1 | These bindings should be considered EXPERIMENTAL for now. | ||
2 | |||
3 | * Renesas SH73A0 Clock Pulse Generator (CPG) | ||
4 | |||
5 | The CPG generates core clocks for the SH73A0 SoC. It includes four PLLs | ||
6 | and several fixed ratio dividers. | ||
7 | |||
8 | Required Properties: | ||
9 | |||
10 | - compatible: Must be "renesas,sh73a0-cpg-clocks" | ||
11 | |||
12 | - reg: Base address and length of the memory resource used by the CPG | ||
13 | |||
14 | - clocks: Reference to the parent clocks ("extal1" and "extal2") | ||
15 | |||
16 | - #clock-cells: Must be 1 | ||
17 | |||
18 | - clock-output-names: The names of the clocks. Supported clocks are "main", | ||
19 | "pll0", "pll1", "pll2", "pll3", "dsi0phy", "dsi1phy", "zg", "m3", "b", | ||
20 | "m1", "m2", "z", "zx", and "hp". | ||
21 | |||
22 | |||
23 | Example | ||
24 | ------- | ||
25 | |||
26 | cpg_clocks: cpg_clocks@e6150000 { | ||
27 | compatible = "renesas,sh73a0-cpg-clocks"; | ||
28 | reg = <0 0xe6150000 0 0x10000>; | ||
29 | clocks = <&extal1_clk>, <&extal2_clk>; | ||
30 | #clock-cells = <1>; | ||
31 | clock-output-names = "main", "pll0", "pll1", "pll2", | ||
32 | "pll3", "dsi0phy", "dsi1phy", | ||
33 | "zg", "m3", "b", "m1", "m2", | ||
34 | "z", "zx", "hp"; | ||
35 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/atmel-matrix.txt b/Documentation/devicetree/bindings/mfd/atmel-matrix.txt new file mode 100644 index 000000000000..e3ef50ca02a5 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/atmel-matrix.txt | |||
@@ -0,0 +1,24 @@ | |||
1 | * Device tree bindings for Atmel Bus Matrix | ||
2 | |||
3 | The Bus Matrix registers are used to configure Atmel SoCs internal bus | ||
4 | behavior (master/slave priorities, undefined burst length type, ...) | ||
5 | |||
6 | Required properties: | ||
7 | - compatible: Should be one of the following | ||
8 | "atmel,at91sam9260-matrix", "syscon" | ||
9 | "atmel,at91sam9261-matrix", "syscon" | ||
10 | "atmel,at91sam9263-matrix", "syscon" | ||
11 | "atmel,at91sam9rl-matrix", "syscon" | ||
12 | "atmel,at91sam9g45-matrix", "syscon" | ||
13 | "atmel,at91sam9n12-matrix", "syscon" | ||
14 | "atmel,at91sam9x5-matrix", "syscon" | ||
15 | "atmel,sama5d3-matrix", "syscon" | ||
16 | - reg: Contains offset/length value of the Bus Matrix | ||
17 | memory region. | ||
18 | |||
19 | Example: | ||
20 | |||
21 | matrix: matrix@ffffec00 { | ||
22 | compatible = "atmel,sama5d3-matrix", "syscon"; | ||
23 | reg = <0xffffec00 0x200>; | ||
24 | }; | ||
diff --git a/Documentation/devicetree/bindings/mfd/atmel-smc.txt b/Documentation/devicetree/bindings/mfd/atmel-smc.txt new file mode 100644 index 000000000000..26eeed373934 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/atmel-smc.txt | |||
@@ -0,0 +1,19 @@ | |||
1 | * Device tree bindings for Atmel SMC (Static Memory Controller) | ||
2 | |||
3 | The SMC registers are used to configure Atmel EBI (External Bus Interface) | ||
4 | to interface with standard memory devices (NAND, NOR, SRAM or specialized | ||
5 | devices like FPGAs). | ||
6 | |||
7 | Required properties: | ||
8 | - compatible: Should be one of the following | ||
9 | "atmel,at91sam9260-smc", "syscon" | ||
10 | "atmel,sama5d3-smc", "syscon" | ||
11 | - reg: Contains offset/length value of the SMC memory | ||
12 | region. | ||
13 | |||
14 | Example: | ||
15 | |||
16 | smc: smc@ffffc000 { | ||
17 | compatible = "atmel,sama5d3-smc", "syscon"; | ||
18 | reg = <0xffffc000 0x1000>; | ||
19 | }; | ||
diff --git a/Documentation/devicetree/bindings/usb/atmel-usb.txt b/Documentation/devicetree/bindings/usb/atmel-usb.txt index 38fee0f66c12..e180d56c75db 100644 --- a/Documentation/devicetree/bindings/usb/atmel-usb.txt +++ b/Documentation/devicetree/bindings/usb/atmel-usb.txt | |||
@@ -33,9 +33,17 @@ usb1: ehci@00800000 { | |||
33 | AT91 USB device controller | 33 | AT91 USB device controller |
34 | 34 | ||
35 | Required properties: | 35 | Required properties: |
36 | - compatible: Should be "atmel,at91rm9200-udc" | 36 | - compatible: Should be one of the following |
37 | "atmel,at91rm9200-udc" | ||
38 | "atmel,at91sam9260-udc" | ||
39 | "atmel,at91sam9261-udc" | ||
40 | "atmel,at91sam9263-udc" | ||
37 | - reg: Address and length of the register set for the device | 41 | - reg: Address and length of the register set for the device |
38 | - interrupts: Should contain macb interrupt | 42 | - interrupts: Should contain macb interrupt |
43 | - clocks: Should reference the peripheral and the AHB clocks | ||
44 | - clock-names: Should contains two strings | ||
45 | "pclk" for the peripheral clock | ||
46 | "hclk" for the AHB clock | ||
39 | 47 | ||
40 | Optional properties: | 48 | Optional properties: |
41 | - atmel,vbus-gpio: If present, specifies a gpio that needs to be | 49 | - atmel,vbus-gpio: If present, specifies a gpio that needs to be |
diff --git a/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts b/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts index 863dc4c7d7f6..6d32c87632d4 100644 --- a/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts +++ b/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts | |||
@@ -182,6 +182,10 @@ | |||
182 | status = "okay"; | 182 | status = "okay"; |
183 | }; | 183 | }; |
184 | 184 | ||
185 | &extal2_clk { | ||
186 | clock-frequency = <48000000>; | ||
187 | }; | ||
188 | |||
185 | &i2c0 { | 189 | &i2c0 { |
186 | status = "okay"; | 190 | status = "okay"; |
187 | as3711@40 { | 191 | as3711@40 { |
diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi index 37c8a761aeab..2dfd5b44255d 100644 --- a/arch/arm/boot/dts/sh73a0.dtsi +++ b/arch/arm/boot/dts/sh73a0.dtsi | |||
@@ -10,6 +10,7 @@ | |||
10 | 10 | ||
11 | /include/ "skeleton.dtsi" | 11 | /include/ "skeleton.dtsi" |
12 | 12 | ||
13 | #include <dt-bindings/clock/sh73a0-clock.h> | ||
13 | #include <dt-bindings/interrupt-controller/irq.h> | 14 | #include <dt-bindings/interrupt-controller/irq.h> |
14 | 15 | ||
15 | / { | 16 | / { |
@@ -71,6 +72,8 @@ | |||
71 | 72 | ||
72 | renesas,channels-mask = <0x3f>; | 73 | renesas,channels-mask = <0x3f>; |
73 | 74 | ||
75 | clocks = <&mstp3_clks SH73A0_CLK_CMT1>; | ||
76 | clock-names = "fck"; | ||
74 | status = "disabled"; | 77 | status = "disabled"; |
75 | }; | 78 | }; |
76 | 79 | ||
@@ -160,6 +163,7 @@ | |||
160 | 0 168 IRQ_TYPE_LEVEL_HIGH | 163 | 0 168 IRQ_TYPE_LEVEL_HIGH |
161 | 0 169 IRQ_TYPE_LEVEL_HIGH | 164 | 0 169 IRQ_TYPE_LEVEL_HIGH |
162 | 0 170 IRQ_TYPE_LEVEL_HIGH>; | 165 | 0 170 IRQ_TYPE_LEVEL_HIGH>; |
166 | clocks = <&mstp1_clks SH73A0_CLK_IIC0>; | ||
163 | status = "disabled"; | 167 | status = "disabled"; |
164 | }; | 168 | }; |
165 | 169 | ||
@@ -172,6 +176,7 @@ | |||
172 | 0 52 IRQ_TYPE_LEVEL_HIGH | 176 | 0 52 IRQ_TYPE_LEVEL_HIGH |
173 | 0 53 IRQ_TYPE_LEVEL_HIGH | 177 | 0 53 IRQ_TYPE_LEVEL_HIGH |
174 | 0 54 IRQ_TYPE_LEVEL_HIGH>; | 178 | 0 54 IRQ_TYPE_LEVEL_HIGH>; |
179 | clocks = <&mstp3_clks SH73A0_CLK_IIC1>; | ||
175 | status = "disabled"; | 180 | status = "disabled"; |
176 | }; | 181 | }; |
177 | 182 | ||
@@ -184,6 +189,7 @@ | |||
184 | 0 172 IRQ_TYPE_LEVEL_HIGH | 189 | 0 172 IRQ_TYPE_LEVEL_HIGH |
185 | 0 173 IRQ_TYPE_LEVEL_HIGH | 190 | 0 173 IRQ_TYPE_LEVEL_HIGH |
186 | 0 174 IRQ_TYPE_LEVEL_HIGH>; | 191 | 0 174 IRQ_TYPE_LEVEL_HIGH>; |
192 | clocks = <&mstp0_clks SH73A0_CLK_IIC2>; | ||
187 | status = "disabled"; | 193 | status = "disabled"; |
188 | }; | 194 | }; |
189 | 195 | ||
@@ -196,6 +202,7 @@ | |||
196 | 0 184 IRQ_TYPE_LEVEL_HIGH | 202 | 0 184 IRQ_TYPE_LEVEL_HIGH |
197 | 0 185 IRQ_TYPE_LEVEL_HIGH | 203 | 0 185 IRQ_TYPE_LEVEL_HIGH |
198 | 0 186 IRQ_TYPE_LEVEL_HIGH>; | 204 | 0 186 IRQ_TYPE_LEVEL_HIGH>; |
205 | clocks = <&mstp4_clks SH73A0_CLK_IIC3>; | ||
199 | status = "disabled"; | 206 | status = "disabled"; |
200 | }; | 207 | }; |
201 | 208 | ||
@@ -208,6 +215,7 @@ | |||
208 | 0 188 IRQ_TYPE_LEVEL_HIGH | 215 | 0 188 IRQ_TYPE_LEVEL_HIGH |
209 | 0 189 IRQ_TYPE_LEVEL_HIGH | 216 | 0 189 IRQ_TYPE_LEVEL_HIGH |
210 | 0 190 IRQ_TYPE_LEVEL_HIGH>; | 217 | 0 190 IRQ_TYPE_LEVEL_HIGH>; |
218 | clocks = <&mstp4_clks SH73A0_CLK_IIC4>; | ||
211 | status = "disabled"; | 219 | status = "disabled"; |
212 | }; | 220 | }; |
213 | 221 | ||
@@ -216,6 +224,7 @@ | |||
216 | reg = <0xe6bd0000 0x100>; | 224 | reg = <0xe6bd0000 0x100>; |
217 | interrupts = <0 140 IRQ_TYPE_LEVEL_HIGH | 225 | interrupts = <0 140 IRQ_TYPE_LEVEL_HIGH |
218 | 0 141 IRQ_TYPE_LEVEL_HIGH>; | 226 | 0 141 IRQ_TYPE_LEVEL_HIGH>; |
227 | clocks = <&mstp3_clks SH73A0_CLK_MMCIF0>; | ||
219 | reg-io-width = <4>; | 228 | reg-io-width = <4>; |
220 | status = "disabled"; | 229 | status = "disabled"; |
221 | }; | 230 | }; |
@@ -226,6 +235,7 @@ | |||
226 | interrupts = <0 83 IRQ_TYPE_LEVEL_HIGH | 235 | interrupts = <0 83 IRQ_TYPE_LEVEL_HIGH |
227 | 0 84 IRQ_TYPE_LEVEL_HIGH | 236 | 0 84 IRQ_TYPE_LEVEL_HIGH |
228 | 0 85 IRQ_TYPE_LEVEL_HIGH>; | 237 | 0 85 IRQ_TYPE_LEVEL_HIGH>; |
238 | clocks = <&mstp3_clks SH73A0_CLK_SDHI0>; | ||
229 | cap-sd-highspeed; | 239 | cap-sd-highspeed; |
230 | status = "disabled"; | 240 | status = "disabled"; |
231 | }; | 241 | }; |
@@ -236,6 +246,7 @@ | |||
236 | reg = <0xee120000 0x100>; | 246 | reg = <0xee120000 0x100>; |
237 | interrupts = <0 88 IRQ_TYPE_LEVEL_HIGH | 247 | interrupts = <0 88 IRQ_TYPE_LEVEL_HIGH |
238 | 0 89 IRQ_TYPE_LEVEL_HIGH>; | 248 | 0 89 IRQ_TYPE_LEVEL_HIGH>; |
249 | clocks = <&mstp3_clks SH73A0_CLK_SDHI1>; | ||
239 | toshiba,mmc-wrprotect-disable; | 250 | toshiba,mmc-wrprotect-disable; |
240 | cap-sd-highspeed; | 251 | cap-sd-highspeed; |
241 | status = "disabled"; | 252 | status = "disabled"; |
@@ -246,6 +257,7 @@ | |||
246 | reg = <0xee140000 0x100>; | 257 | reg = <0xee140000 0x100>; |
247 | interrupts = <0 104 IRQ_TYPE_LEVEL_HIGH | 258 | interrupts = <0 104 IRQ_TYPE_LEVEL_HIGH |
248 | 0 105 IRQ_TYPE_LEVEL_HIGH>; | 259 | 0 105 IRQ_TYPE_LEVEL_HIGH>; |
260 | clocks = <&mstp3_clks SH73A0_CLK_SDHI2>; | ||
249 | toshiba,mmc-wrprotect-disable; | 261 | toshiba,mmc-wrprotect-disable; |
250 | cap-sd-highspeed; | 262 | cap-sd-highspeed; |
251 | status = "disabled"; | 263 | status = "disabled"; |
@@ -255,6 +267,8 @@ | |||
255 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 267 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
256 | reg = <0xe6c40000 0x100>; | 268 | reg = <0xe6c40000 0x100>; |
257 | interrupts = <0 72 IRQ_TYPE_LEVEL_HIGH>; | 269 | interrupts = <0 72 IRQ_TYPE_LEVEL_HIGH>; |
270 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA0>; | ||
271 | clock-names = "sci_ick"; | ||
258 | status = "disabled"; | 272 | status = "disabled"; |
259 | }; | 273 | }; |
260 | 274 | ||
@@ -262,6 +276,8 @@ | |||
262 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 276 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
263 | reg = <0xe6c50000 0x100>; | 277 | reg = <0xe6c50000 0x100>; |
264 | interrupts = <0 73 IRQ_TYPE_LEVEL_HIGH>; | 278 | interrupts = <0 73 IRQ_TYPE_LEVEL_HIGH>; |
279 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA1>; | ||
280 | clock-names = "sci_ick"; | ||
265 | status = "disabled"; | 281 | status = "disabled"; |
266 | }; | 282 | }; |
267 | 283 | ||
@@ -269,6 +285,8 @@ | |||
269 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 285 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
270 | reg = <0xe6c60000 0x100>; | 286 | reg = <0xe6c60000 0x100>; |
271 | interrupts = <0 74 IRQ_TYPE_LEVEL_HIGH>; | 287 | interrupts = <0 74 IRQ_TYPE_LEVEL_HIGH>; |
288 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA2>; | ||
289 | clock-names = "sci_ick"; | ||
272 | status = "disabled"; | 290 | status = "disabled"; |
273 | }; | 291 | }; |
274 | 292 | ||
@@ -276,6 +294,8 @@ | |||
276 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 294 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
277 | reg = <0xe6c70000 0x100>; | 295 | reg = <0xe6c70000 0x100>; |
278 | interrupts = <0 75 IRQ_TYPE_LEVEL_HIGH>; | 296 | interrupts = <0 75 IRQ_TYPE_LEVEL_HIGH>; |
297 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA3>; | ||
298 | clock-names = "sci_ick"; | ||
279 | status = "disabled"; | 299 | status = "disabled"; |
280 | }; | 300 | }; |
281 | 301 | ||
@@ -283,6 +303,8 @@ | |||
283 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 303 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
284 | reg = <0xe6c80000 0x100>; | 304 | reg = <0xe6c80000 0x100>; |
285 | interrupts = <0 78 IRQ_TYPE_LEVEL_HIGH>; | 305 | interrupts = <0 78 IRQ_TYPE_LEVEL_HIGH>; |
306 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA4>; | ||
307 | clock-names = "sci_ick"; | ||
286 | status = "disabled"; | 308 | status = "disabled"; |
287 | }; | 309 | }; |
288 | 310 | ||
@@ -290,6 +312,8 @@ | |||
290 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 312 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
291 | reg = <0xe6cb0000 0x100>; | 313 | reg = <0xe6cb0000 0x100>; |
292 | interrupts = <0 79 IRQ_TYPE_LEVEL_HIGH>; | 314 | interrupts = <0 79 IRQ_TYPE_LEVEL_HIGH>; |
315 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA5>; | ||
316 | clock-names = "sci_ick"; | ||
293 | status = "disabled"; | 317 | status = "disabled"; |
294 | }; | 318 | }; |
295 | 319 | ||
@@ -297,6 +321,8 @@ | |||
297 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 321 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
298 | reg = <0xe6cc0000 0x100>; | 322 | reg = <0xe6cc0000 0x100>; |
299 | interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>; | 323 | interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>; |
324 | clocks = <&mstp3_clks SH73A0_CLK_SCIFA6>; | ||
325 | clock-names = "sci_ick"; | ||
300 | status = "disabled"; | 326 | status = "disabled"; |
301 | }; | 327 | }; |
302 | 328 | ||
@@ -304,6 +330,8 @@ | |||
304 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; | 330 | compatible = "renesas,scifa-sh73a0", "renesas,scifa"; |
305 | reg = <0xe6cd0000 0x100>; | 331 | reg = <0xe6cd0000 0x100>; |
306 | interrupts = <0 143 IRQ_TYPE_LEVEL_HIGH>; | 332 | interrupts = <0 143 IRQ_TYPE_LEVEL_HIGH>; |
333 | clocks = <&mstp2_clks SH73A0_CLK_SCIFA7>; | ||
334 | clock-names = "sci_ick"; | ||
307 | status = "disabled"; | 335 | status = "disabled"; |
308 | }; | 336 | }; |
309 | 337 | ||
@@ -311,6 +339,8 @@ | |||
311 | compatible = "renesas,scifb-sh73a0", "renesas,scifb"; | 339 | compatible = "renesas,scifb-sh73a0", "renesas,scifb"; |
312 | reg = <0xe6c30000 0x100>; | 340 | reg = <0xe6c30000 0x100>; |
313 | interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>; | 341 | interrupts = <0 80 IRQ_TYPE_LEVEL_HIGH>; |
342 | clocks = <&mstp2_clks SH73A0_CLK_SCIFB>; | ||
343 | clock-names = "sci_ick"; | ||
314 | status = "disabled"; | 344 | status = "disabled"; |
315 | }; | 345 | }; |
316 | 346 | ||
@@ -338,4 +368,332 @@ | |||
338 | interrupts = <0 146 0x4>; | 368 | interrupts = <0 146 0x4>; |
339 | status = "disabled"; | 369 | status = "disabled"; |
340 | }; | 370 | }; |
371 | |||
372 | clocks { | ||
373 | #address-cells = <1>; | ||
374 | #size-cells = <1>; | ||
375 | ranges; | ||
376 | |||
377 | /* External root clocks */ | ||
378 | extalr_clk: extalr_clk { | ||
379 | compatible = "fixed-clock"; | ||
380 | #clock-cells = <0>; | ||
381 | clock-frequency = <32768>; | ||
382 | clock-output-names = "extalr"; | ||
383 | }; | ||
384 | extal1_clk: extal1_clk { | ||
385 | compatible = "fixed-clock"; | ||
386 | #clock-cells = <0>; | ||
387 | clock-frequency = <26000000>; | ||
388 | clock-output-names = "extal1"; | ||
389 | }; | ||
390 | extal2_clk: extal2_clk { | ||
391 | compatible = "fixed-clock"; | ||
392 | #clock-cells = <0>; | ||
393 | clock-output-names = "extal2"; | ||
394 | }; | ||
395 | extcki_clk: extcki_clk { | ||
396 | compatible = "fixed-clock"; | ||
397 | #clock-cells = <0>; | ||
398 | clock-output-names = "extcki"; | ||
399 | }; | ||
400 | fsiack_clk: fsiack_clk { | ||
401 | compatible = "fixed-clock"; | ||
402 | #clock-cells = <0>; | ||
403 | clock-frequency = <0>; | ||
404 | clock-output-names = "fsiack"; | ||
405 | }; | ||
406 | fsibck_clk: fsibck_clk { | ||
407 | compatible = "fixed-clock"; | ||
408 | #clock-cells = <0>; | ||
409 | clock-frequency = <0>; | ||
410 | clock-output-names = "fsibck"; | ||
411 | }; | ||
412 | |||
413 | /* Special CPG clocks */ | ||
414 | cpg_clocks: cpg_clocks@e6150000 { | ||
415 | compatible = "renesas,sh73a0-cpg-clocks"; | ||
416 | reg = <0xe6150000 0x10000>; | ||
417 | clocks = <&extal1_clk>, <&extal2_clk>; | ||
418 | #clock-cells = <1>; | ||
419 | clock-output-names = "main", "pll0", "pll1", "pll2", | ||
420 | "pll3", "dsi0phy", "dsi1phy", | ||
421 | "zg", "m3", "b", "m1", "m2", | ||
422 | "z", "zx", "hp"; | ||
423 | }; | ||
424 | |||
425 | /* Variable factor clocks (DIV6) */ | ||
426 | vclk1_clk: vclk1_clk@e6150008 { | ||
427 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
428 | reg = <0xe6150008 4>; | ||
429 | clocks = <&pll1_div2_clk>; | ||
430 | #clock-cells = <0>; | ||
431 | clock-output-names = "vclk1"; | ||
432 | }; | ||
433 | vclk2_clk: vclk2_clk@e615000c { | ||
434 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
435 | reg = <0xe615000c 4>; | ||
436 | clocks = <&pll1_div2_clk>; | ||
437 | #clock-cells = <0>; | ||
438 | clock-output-names = "vclk2"; | ||
439 | }; | ||
440 | vclk3_clk: vclk3_clk@e615001c { | ||
441 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
442 | reg = <0xe615001c 4>; | ||
443 | clocks = <&pll1_div2_clk>; | ||
444 | #clock-cells = <0>; | ||
445 | clock-output-names = "vclk3"; | ||
446 | }; | ||
447 | zb_clk: zb_clk@e6150010 { | ||
448 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
449 | reg = <0xe6150010 4>; | ||
450 | clocks = <&pll1_div2_clk>; | ||
451 | #clock-cells = <0>; | ||
452 | clock-output-names = "zb"; | ||
453 | }; | ||
454 | flctl_clk: flctl_clk@e6150014 { | ||
455 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
456 | reg = <0xe6150014 4>; | ||
457 | clocks = <&pll1_div2_clk>; | ||
458 | #clock-cells = <0>; | ||
459 | clock-output-names = "flctlck"; | ||
460 | }; | ||
461 | sdhi0_clk: sdhi0_clk@e6150074 { | ||
462 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
463 | reg = <0xe6150074 4>; | ||
464 | clocks = <&pll1_div2_clk>; | ||
465 | #clock-cells = <0>; | ||
466 | clock-output-names = "sdhi0ck"; | ||
467 | }; | ||
468 | sdhi1_clk: sdhi1_clk@e6150078 { | ||
469 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
470 | reg = <0xe6150078 4>; | ||
471 | clocks = <&pll1_div2_clk>; | ||
472 | #clock-cells = <0>; | ||
473 | clock-output-names = "sdhi1ck"; | ||
474 | }; | ||
475 | sdhi2_clk: sdhi2_clk@e615007c { | ||
476 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
477 | reg = <0xe615007c 4>; | ||
478 | clocks = <&pll1_div2_clk>; | ||
479 | #clock-cells = <0>; | ||
480 | clock-output-names = "sdhi2ck"; | ||
481 | }; | ||
482 | fsia_clk: fsia_clk@e6150018 { | ||
483 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
484 | reg = <0xe6150018 4>; | ||
485 | clocks = <&pll1_div2_clk>; | ||
486 | #clock-cells = <0>; | ||
487 | clock-output-names = "fsia"; | ||
488 | }; | ||
489 | fsib_clk: fsib_clk@e6150090 { | ||
490 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
491 | reg = <0xe6150090 4>; | ||
492 | clocks = <&pll1_div2_clk>; | ||
493 | #clock-cells = <0>; | ||
494 | clock-output-names = "fsib"; | ||
495 | }; | ||
496 | sub_clk: sub_clk@e6150080 { | ||
497 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
498 | reg = <0xe6150080 4>; | ||
499 | clocks = <&extal2_clk>; | ||
500 | #clock-cells = <0>; | ||
501 | clock-output-names = "sub"; | ||
502 | }; | ||
503 | spua_clk: spua_clk@e6150084 { | ||
504 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
505 | reg = <0xe6150084 4>; | ||
506 | clocks = <&pll1_div2_clk>; | ||
507 | #clock-cells = <0>; | ||
508 | clock-output-names = "spua"; | ||
509 | }; | ||
510 | spuv_clk: spuv_clk@e6150094 { | ||
511 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
512 | reg = <0xe6150094 4>; | ||
513 | clocks = <&pll1_div2_clk>; | ||
514 | #clock-cells = <0>; | ||
515 | clock-output-names = "spuv"; | ||
516 | }; | ||
517 | msu_clk: msu_clk@e6150088 { | ||
518 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
519 | reg = <0xe6150088 4>; | ||
520 | clocks = <&pll1_div2_clk>; | ||
521 | #clock-cells = <0>; | ||
522 | clock-output-names = "msu"; | ||
523 | }; | ||
524 | hsi_clk: hsi_clk@e615008c { | ||
525 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
526 | reg = <0xe615008c 4>; | ||
527 | clocks = <&pll1_div2_clk>; | ||
528 | #clock-cells = <0>; | ||
529 | clock-output-names = "hsi"; | ||
530 | }; | ||
531 | mfg1_clk: mfg1_clk@e6150098 { | ||
532 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
533 | reg = <0xe6150098 4>; | ||
534 | clocks = <&pll1_div2_clk>; | ||
535 | #clock-cells = <0>; | ||
536 | clock-output-names = "mfg1"; | ||
537 | }; | ||
538 | mfg2_clk: mfg2_clk@e615009c { | ||
539 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
540 | reg = <0xe615009c 4>; | ||
541 | clocks = <&pll1_div2_clk>; | ||
542 | #clock-cells = <0>; | ||
543 | clock-output-names = "mfg2"; | ||
544 | }; | ||
545 | dsit_clk: dsit_clk@e6150060 { | ||
546 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
547 | reg = <0xe6150060 4>; | ||
548 | clocks = <&pll1_div2_clk>; | ||
549 | #clock-cells = <0>; | ||
550 | clock-output-names = "dsit"; | ||
551 | }; | ||
552 | dsi0p_clk: dsi0p_clk@e6150064 { | ||
553 | compatible = "renesas,sh73a0-div6-clock", "renesas,cpg-div6-clock"; | ||
554 | reg = <0xe6150064 4>; | ||
555 | clocks = <&pll1_div2_clk>; | ||
556 | #clock-cells = <0>; | ||
557 | clock-output-names = "dsi0pck"; | ||
558 | }; | ||
559 | |||
560 | /* Fixed factor clocks */ | ||
561 | main_div2_clk: main_div2_clk { | ||
562 | compatible = "fixed-factor-clock"; | ||
563 | clocks = <&cpg_clocks SH73A0_CLK_MAIN>; | ||
564 | #clock-cells = <0>; | ||
565 | clock-div = <2>; | ||
566 | clock-mult = <1>; | ||
567 | clock-output-names = "main_div2"; | ||
568 | }; | ||
569 | pll1_div2_clk: pll1_div2_clk { | ||
570 | compatible = "fixed-factor-clock"; | ||
571 | clocks = <&cpg_clocks SH73A0_CLK_PLL1>; | ||
572 | #clock-cells = <0>; | ||
573 | clock-div = <2>; | ||
574 | clock-mult = <1>; | ||
575 | clock-output-names = "pll1_div2"; | ||
576 | }; | ||
577 | pll1_div7_clk: pll1_div7_clk { | ||
578 | compatible = "fixed-factor-clock"; | ||
579 | clocks = <&cpg_clocks SH73A0_CLK_PLL1>; | ||
580 | #clock-cells = <0>; | ||
581 | clock-div = <7>; | ||
582 | clock-mult = <1>; | ||
583 | clock-output-names = "pll1_div7"; | ||
584 | }; | ||
585 | pll1_div13_clk: pll1_div13_clk { | ||
586 | compatible = "fixed-factor-clock"; | ||
587 | clocks = <&cpg_clocks SH73A0_CLK_PLL1>; | ||
588 | #clock-cells = <0>; | ||
589 | clock-div = <13>; | ||
590 | clock-mult = <1>; | ||
591 | clock-output-names = "pll1_div13"; | ||
592 | }; | ||
593 | twd_clk: twd_clk { | ||
594 | compatible = "fixed-factor-clock"; | ||
595 | clocks = <&cpg_clocks SH73A0_CLK_Z>; | ||
596 | #clock-cells = <0>; | ||
597 | clock-div = <4>; | ||
598 | clock-mult = <1>; | ||
599 | clock-output-names = "twd"; | ||
600 | }; | ||
601 | |||
602 | /* Gate clocks */ | ||
603 | mstp0_clks: mstp0_clks@e6150130 { | ||
604 | compatible = "renesas,sh73a0-mstp-clocks", "renesas,cpg-mstp-clocks"; | ||
605 | reg = <0xe6150130 4>, <0xe6150030 4>; | ||
606 | clocks = <&cpg_clocks SH73A0_CLK_HP>; | ||
607 | #clock-cells = <1>; | ||
608 | clock-indices = < | ||
609 | SH73A0_CLK_IIC2 | ||
610 | >; | ||
611 | clock-output-names = | ||
612 | "iic2"; | ||
613 | }; | ||
614 | mstp1_clks: mstp1_clks@e6150134 { | ||
615 | compatible = "renesas,sh73a0-mstp-clocks", "renesas,cpg-mstp-clocks"; | ||
616 | reg = <0xe6150134 4>, <0xe6150038 4>; | ||
617 | clocks = <&cpg_clocks SH73A0_CLK_B>, | ||
618 | <&cpg_clocks SH73A0_CLK_B>, | ||
619 | <&cpg_clocks SH73A0_CLK_B>, | ||
620 | <&cpg_clocks SH73A0_CLK_B>, | ||
621 | <&sub_clk>, <&cpg_clocks SH73A0_CLK_B>, | ||
622 | <&cpg_clocks SH73A0_CLK_HP>, | ||
623 | <&cpg_clocks SH73A0_CLK_ZG>, | ||
624 | <&cpg_clocks SH73A0_CLK_B>; | ||
625 | #clock-cells = <1>; | ||
626 | clock-indices = < | ||
627 | SH73A0_CLK_CEU1 SH73A0_CLK_CSI2_RX1 | ||
628 | SH73A0_CLK_CEU0 SH73A0_CLK_CSI2_RX0 | ||
629 | SH73A0_CLK_TMU0 SH73A0_CLK_DSITX0 | ||
630 | SH73A0_CLK_IIC0 SH73A0_CLK_SGX | ||
631 | SH73A0_CLK_LCDC0 | ||
632 | >; | ||
633 | clock-output-names = | ||
634 | "ceu1", "csi2_rx1", "ceu0", "csi2_rx0", | ||
635 | "tmu0", "dsitx0", "iic0", "sgx", "lcdc0"; | ||
636 | }; | ||
637 | mstp2_clks: mstp2_clks@e6150138 { | ||
638 | compatible = "renesas,sh73a0-mstp-clocks", "renesas,cpg-mstp-clocks"; | ||
639 | reg = <0xe6150138 4>, <0xe6150040 4>; | ||
640 | clocks = <&sub_clk>, <&cpg_clocks SH73A0_CLK_HP>, | ||
641 | <&cpg_clocks SH73A0_CLK_HP>, <&sub_clk>, | ||
642 | <&sub_clk>, <&sub_clk>, <&sub_clk>, <&sub_clk>, | ||
643 | <&sub_clk>, <&sub_clk>; | ||
644 | #clock-cells = <1>; | ||
645 | clock-indices = < | ||
646 | SH73A0_CLK_SCIFA7 SH73A0_CLK_SY_DMAC | ||
647 | SH73A0_CLK_MP_DMAC SH73A0_CLK_SCIFA5 | ||
648 | SH73A0_CLK_SCIFB SH73A0_CLK_SCIFA0 | ||
649 | SH73A0_CLK_SCIFA1 SH73A0_CLK_SCIFA2 | ||
650 | SH73A0_CLK_SCIFA3 SH73A0_CLK_SCIFA4 | ||
651 | >; | ||
652 | clock-output-names = | ||
653 | "scifa7", "sy_dmac", "mp_dmac", "scifa5", | ||
654 | "scifb", "scifa0", "scifa1", "scifa2", | ||
655 | "scifa3", "scifa4"; | ||
656 | }; | ||
657 | mstp3_clks: mstp3_clks@e615013c { | ||
658 | compatible = "renesas,sh73a0-mstp-clocks", "renesas,cpg-mstp-clocks"; | ||
659 | reg = <0xe615013c 4>, <0xe6150048 4>; | ||
660 | clocks = <&sub_clk>, <&extalr_clk>, | ||
661 | <&cpg_clocks SH73A0_CLK_HP>, <&sub_clk>, | ||
662 | <&cpg_clocks SH73A0_CLK_HP>, | ||
663 | <&cpg_clocks SH73A0_CLK_HP>, <&flctl_clk>, | ||
664 | <&sdhi0_clk>, <&sdhi1_clk>, | ||
665 | <&cpg_clocks SH73A0_CLK_HP>, <&sdhi2_clk>, | ||
666 | <&main_div2_clk>, <&main_div2_clk>, | ||
667 | <&main_div2_clk>, <&main_div2_clk>, | ||
668 | <&main_div2_clk>; | ||
669 | #clock-cells = <1>; | ||
670 | clock-indices = < | ||
671 | SH73A0_CLK_SCIFA6 SH73A0_CLK_CMT1 | ||
672 | SH73A0_CLK_FSI SH73A0_CLK_IRDA | ||
673 | SH73A0_CLK_IIC1 SH73A0_CLK_USB SH73A0_CLK_FLCTL | ||
674 | SH73A0_CLK_SDHI0 SH73A0_CLK_SDHI1 | ||
675 | SH73A0_CLK_MMCIF0 SH73A0_CLK_SDHI2 | ||
676 | SH73A0_CLK_TPU0 SH73A0_CLK_TPU1 | ||
677 | SH73A0_CLK_TPU2 SH73A0_CLK_TPU3 | ||
678 | SH73A0_CLK_TPU4 | ||
679 | >; | ||
680 | clock-output-names = | ||
681 | "scifa6", "cmt1", "fsi", "irda", "iic1", | ||
682 | "usb", "flctl", "sdhi0", "sdhi1", "mmcif0", "sdhi2", | ||
683 | "tpu0", "tpu1", "tpu2", "tpu3", "tpu4"; | ||
684 | }; | ||
685 | mstp4_clks: mstp4_clks@e6150140 { | ||
686 | compatible = "renesas,sh73a0-mstp-clocks", "renesas,cpg-mstp-clocks"; | ||
687 | reg = <0xe6150140 4>, <0xe615004c 4>; | ||
688 | clocks = <&cpg_clocks SH73A0_CLK_HP>, | ||
689 | <&cpg_clocks SH73A0_CLK_HP>, <&extalr_clk>; | ||
690 | #clock-cells = <1>; | ||
691 | clock-indices = < | ||
692 | SH73A0_CLK_IIC3 SH73A0_CLK_IIC4 | ||
693 | SH73A0_CLK_KEYSC | ||
694 | >; | ||
695 | clock-output-names = | ||
696 | "iic3", "iic4", "keysc"; | ||
697 | }; | ||
698 | }; | ||
341 | }; | 699 | }; |
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 865f878063cc..f70eca7ee705 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #define __ARCH_ARM_MACH_EXYNOS_COMMON_H | 13 | #define __ARCH_ARM_MACH_EXYNOS_COMMON_H |
14 | 14 | ||
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/platform_data/cpuidle-exynos.h> | ||
16 | 17 | ||
17 | #define EXYNOS3250_SOC_ID 0xE3472000 | 18 | #define EXYNOS3250_SOC_ID 0xE3472000 |
18 | #define EXYNOS3_SOC_MASK 0xFFFFF000 | 19 | #define EXYNOS3_SOC_MASK 0xFFFFF000 |
@@ -150,8 +151,11 @@ extern void exynos_pm_central_suspend(void); | |||
150 | extern int exynos_pm_central_resume(void); | 151 | extern int exynos_pm_central_resume(void); |
151 | extern void exynos_enter_aftr(void); | 152 | extern void exynos_enter_aftr(void); |
152 | 153 | ||
154 | extern struct cpuidle_exynos_data cpuidle_coupled_exynos_data; | ||
155 | |||
153 | extern void s5p_init_cpu(void __iomem *cpuid_addr); | 156 | extern void s5p_init_cpu(void __iomem *cpuid_addr); |
154 | extern unsigned int samsung_rev(void); | 157 | extern unsigned int samsung_rev(void); |
158 | extern void __iomem *cpu_boot_reg_base(void); | ||
155 | 159 | ||
156 | static inline void pmu_raw_writel(u32 val, u32 offset) | 160 | static inline void pmu_raw_writel(u32 val, u32 offset) |
157 | { | 161 | { |
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index 78eca99b98d1..2013f73797ed 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c | |||
@@ -211,6 +211,10 @@ static void __init exynos_dt_machine_init(void) | |||
211 | if (!IS_ENABLED(CONFIG_SMP)) | 211 | if (!IS_ENABLED(CONFIG_SMP)) |
212 | exynos_sysram_init(); | 212 | exynos_sysram_init(); |
213 | 213 | ||
214 | #ifdef CONFIG_ARM_EXYNOS_CPUIDLE | ||
215 | if (of_machine_is_compatible("samsung,exynos4210")) | ||
216 | exynos_cpuidle.dev.platform_data = &cpuidle_coupled_exynos_data; | ||
217 | #endif | ||
214 | if (of_machine_is_compatible("samsung,exynos4210") || | 218 | if (of_machine_is_compatible("samsung,exynos4210") || |
215 | of_machine_is_compatible("samsung,exynos4212") || | 219 | of_machine_is_compatible("samsung,exynos4212") || |
216 | (of_machine_is_compatible("samsung,exynos4412") && | 220 | (of_machine_is_compatible("samsung,exynos4412") && |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 7a1ebfeeeeb8..3f32c47a6d74 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
@@ -194,7 +194,7 @@ int exynos_cluster_power_state(int cluster) | |||
194 | S5P_CORE_LOCAL_PWR_EN); | 194 | S5P_CORE_LOCAL_PWR_EN); |
195 | } | 195 | } |
196 | 196 | ||
197 | static inline void __iomem *cpu_boot_reg_base(void) | 197 | void __iomem *cpu_boot_reg_base(void) |
198 | { | 198 | { |
199 | if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1) | 199 | if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_1_1) |
200 | return pmu_base_addr + S5P_INFORM5; | 200 | return pmu_base_addr + S5P_INFORM5; |
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index dfc8594e5b1f..e6209dadc00d 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c | |||
@@ -98,10 +98,6 @@ void exynos_pm_central_suspend(void) | |||
98 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); | 98 | tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); |
99 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; | 99 | tmp &= ~S5P_CENTRAL_LOWPWR_CFG; |
100 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); | 100 | pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); |
101 | |||
102 | /* Setting SEQ_OPTION register */ | ||
103 | pmu_raw_writel(S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0, | ||
104 | S5P_CENTRAL_SEQ_OPTION); | ||
105 | } | 101 | } |
106 | 102 | ||
107 | int exynos_pm_central_resume(void) | 103 | int exynos_pm_central_resume(void) |
@@ -165,6 +161,13 @@ void exynos_enter_aftr(void) | |||
165 | 161 | ||
166 | exynos_pm_central_suspend(); | 162 | exynos_pm_central_suspend(); |
167 | 163 | ||
164 | if (of_machine_is_compatible("samsung,exynos4212") || | ||
165 | of_machine_is_compatible("samsung,exynos4412")) { | ||
166 | /* Setting SEQ_OPTION register */ | ||
167 | pmu_raw_writel(S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0, | ||
168 | S5P_CENTRAL_SEQ_OPTION); | ||
169 | } | ||
170 | |||
168 | cpu_suspend(0, exynos_aftr_finisher); | 171 | cpu_suspend(0, exynos_aftr_finisher); |
169 | 172 | ||
170 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { | 173 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { |
@@ -177,3 +180,125 @@ void exynos_enter_aftr(void) | |||
177 | 180 | ||
178 | cpu_pm_exit(); | 181 | cpu_pm_exit(); |
179 | } | 182 | } |
183 | |||
184 | static atomic_t cpu1_wakeup = ATOMIC_INIT(0); | ||
185 | |||
186 | static int exynos_cpu0_enter_aftr(void) | ||
187 | { | ||
188 | int ret = -1; | ||
189 | |||
190 | /* | ||
191 | * If the other cpu is powered on, we have to power it off, because | ||
192 | * the AFTR state won't work otherwise | ||
193 | */ | ||
194 | if (cpu_online(1)) { | ||
195 | /* | ||
196 | * We reach a sync point with the coupled idle state, we know | ||
197 | * the other cpu will power down itself or will abort the | ||
198 | * sequence, let's wait for one of these to happen | ||
199 | */ | ||
200 | while (exynos_cpu_power_state(1)) { | ||
201 | /* | ||
202 | * The other cpu may skip idle and boot back | ||
203 | * up again | ||
204 | */ | ||
205 | if (atomic_read(&cpu1_wakeup)) | ||
206 | goto abort; | ||
207 | |||
208 | /* | ||
209 | * The other cpu may bounce through idle and | ||
210 | * boot back up again, getting stuck in the | ||
211 | * boot rom code | ||
212 | */ | ||
213 | if (__raw_readl(cpu_boot_reg_base()) == 0) | ||
214 | goto abort; | ||
215 | |||
216 | cpu_relax(); | ||
217 | } | ||
218 | } | ||
219 | |||
220 | exynos_enter_aftr(); | ||
221 | ret = 0; | ||
222 | |||
223 | abort: | ||
224 | if (cpu_online(1)) { | ||
225 | /* | ||
226 | * Set the boot vector to something non-zero | ||
227 | */ | ||
228 | __raw_writel(virt_to_phys(exynos_cpu_resume), | ||
229 | cpu_boot_reg_base()); | ||
230 | dsb(); | ||
231 | |||
232 | /* | ||
233 | * Turn on cpu1 and wait for it to be on | ||
234 | */ | ||
235 | exynos_cpu_power_up(1); | ||
236 | while (exynos_cpu_power_state(1) != S5P_CORE_LOCAL_PWR_EN) | ||
237 | cpu_relax(); | ||
238 | |||
239 | while (!atomic_read(&cpu1_wakeup)) { | ||
240 | /* | ||
241 | * Poke cpu1 out of the boot rom | ||
242 | */ | ||
243 | __raw_writel(virt_to_phys(exynos_cpu_resume), | ||
244 | cpu_boot_reg_base()); | ||
245 | |||
246 | arch_send_wakeup_ipi_mask(cpumask_of(1)); | ||
247 | } | ||
248 | } | ||
249 | |||
250 | return ret; | ||
251 | } | ||
252 | |||
253 | static int exynos_wfi_finisher(unsigned long flags) | ||
254 | { | ||
255 | cpu_do_idle(); | ||
256 | |||
257 | return -1; | ||
258 | } | ||
259 | |||
260 | static int exynos_cpu1_powerdown(void) | ||
261 | { | ||
262 | int ret = -1; | ||
263 | |||
264 | /* | ||
265 | * Idle sequence for cpu1 | ||
266 | */ | ||
267 | if (cpu_pm_enter()) | ||
268 | goto cpu1_aborted; | ||
269 | |||
270 | /* | ||
271 | * Turn off cpu 1 | ||
272 | */ | ||
273 | exynos_cpu_power_down(1); | ||
274 | |||
275 | ret = cpu_suspend(0, exynos_wfi_finisher); | ||
276 | |||
277 | cpu_pm_exit(); | ||
278 | |||
279 | cpu1_aborted: | ||
280 | dsb(); | ||
281 | /* | ||
282 | * Notify cpu 0 that cpu 1 is awake | ||
283 | */ | ||
284 | atomic_set(&cpu1_wakeup, 1); | ||
285 | |||
286 | return ret; | ||
287 | } | ||
288 | |||
289 | static void exynos_pre_enter_aftr(void) | ||
290 | { | ||
291 | __raw_writel(virt_to_phys(exynos_cpu_resume), cpu_boot_reg_base()); | ||
292 | } | ||
293 | |||
294 | static void exynos_post_enter_aftr(void) | ||
295 | { | ||
296 | atomic_set(&cpu1_wakeup, 0); | ||
297 | } | ||
298 | |||
299 | struct cpuidle_exynos_data cpuidle_coupled_exynos_data = { | ||
300 | .cpu0_enter_aftr = exynos_cpu0_enter_aftr, | ||
301 | .cpu1_powerdown = exynos_cpu1_powerdown, | ||
302 | .pre_enter_aftr = exynos_pre_enter_aftr, | ||
303 | .post_enter_aftr = exynos_post_enter_aftr, | ||
304 | }; | ||
diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c index 82e6b6fba23f..666ec3e5b03f 100644 --- a/arch/arm/mach-exynos/suspend.c +++ b/arch/arm/mach-exynos/suspend.c | |||
@@ -319,6 +319,10 @@ static int exynos_pm_suspend(void) | |||
319 | { | 319 | { |
320 | exynos_pm_central_suspend(); | 320 | exynos_pm_central_suspend(); |
321 | 321 | ||
322 | /* Setting SEQ_OPTION register */ | ||
323 | pmu_raw_writel(S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0, | ||
324 | S5P_CENTRAL_SEQ_OPTION); | ||
325 | |||
322 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) | 326 | if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) |
323 | exynos_cpu_save_register(); | 327 | exynos_cpu_save_register(); |
324 | 328 | ||
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index a8593d1241be..faea74a2151b 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -766,7 +766,9 @@ void __init __weak sh73a0_register_twd(void) { } | |||
766 | void __init sh73a0_earlytimer_init(void) | 766 | void __init sh73a0_earlytimer_init(void) |
767 | { | 767 | { |
768 | shmobile_init_delay(); | 768 | shmobile_init_delay(); |
769 | #ifndef CONFIG_COMMON_CLK | ||
769 | sh73a0_clock_init(); | 770 | sh73a0_clock_init(); |
771 | #endif | ||
770 | shmobile_earlytimer_init(); | 772 | shmobile_earlytimer_init(); |
771 | sh73a0_register_twd(); | 773 | sh73a0_register_twd(); |
772 | } | 774 | } |
@@ -785,8 +787,9 @@ void __init sh73a0_add_early_devices(void) | |||
785 | void __init sh73a0_add_standard_devices_dt(void) | 787 | void __init sh73a0_add_standard_devices_dt(void) |
786 | { | 788 | { |
787 | /* clocks are setup late during boot in the case of DT */ | 789 | /* clocks are setup late during boot in the case of DT */ |
790 | #ifndef CONFIG_COMMON_CLK | ||
788 | sh73a0_clock_init(); | 791 | sh73a0_clock_init(); |
789 | 792 | #endif | |
790 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 793 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
791 | } | 794 | } |
792 | 795 | ||
diff --git a/drivers/clk/shmobile/Makefile b/drivers/clk/shmobile/Makefile index 960bf22d42ae..f83980f2b956 100644 --- a/drivers/clk/shmobile/Makefile +++ b/drivers/clk/shmobile/Makefile | |||
@@ -5,5 +5,6 @@ obj-$(CONFIG_ARCH_R8A7779) += clk-r8a7779.o | |||
5 | obj-$(CONFIG_ARCH_R8A7790) += clk-rcar-gen2.o | 5 | obj-$(CONFIG_ARCH_R8A7790) += clk-rcar-gen2.o |
6 | obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o | 6 | obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o |
7 | obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o | 7 | obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o |
8 | obj-$(CONFIG_ARCH_SH73A0) += clk-sh73a0.o | ||
8 | obj-$(CONFIG_ARCH_SHMOBILE_MULTI) += clk-div6.o | 9 | obj-$(CONFIG_ARCH_SHMOBILE_MULTI) += clk-div6.o |
9 | obj-$(CONFIG_ARCH_SHMOBILE_MULTI) += clk-mstp.o | 10 | obj-$(CONFIG_ARCH_SHMOBILE_MULTI) += clk-mstp.o |
diff --git a/drivers/clk/shmobile/clk-sh73a0.c b/drivers/clk/shmobile/clk-sh73a0.c new file mode 100644 index 000000000000..cd529cfe412f --- /dev/null +++ b/drivers/clk/shmobile/clk-sh73a0.c | |||
@@ -0,0 +1,218 @@ | |||
1 | /* | ||
2 | * sh73a0 Core CPG Clocks | ||
3 | * | ||
4 | * Copyright (C) 2014 Ulrich Hecht | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; version 2 of the License. | ||
9 | */ | ||
10 | |||
11 | #include <linux/clk-provider.h> | ||
12 | #include <linux/clkdev.h> | ||
13 | #include <linux/clk/shmobile.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/of.h> | ||
17 | #include <linux/of_address.h> | ||
18 | #include <linux/spinlock.h> | ||
19 | |||
20 | struct sh73a0_cpg { | ||
21 | struct clk_onecell_data data; | ||
22 | spinlock_t lock; | ||
23 | void __iomem *reg; | ||
24 | }; | ||
25 | |||
26 | #define CPG_FRQCRA 0x00 | ||
27 | #define CPG_FRQCRB 0x04 | ||
28 | #define CPG_SD0CKCR 0x74 | ||
29 | #define CPG_SD1CKCR 0x78 | ||
30 | #define CPG_SD2CKCR 0x7c | ||
31 | #define CPG_PLLECR 0xd0 | ||
32 | #define CPG_PLL0CR 0xd8 | ||
33 | #define CPG_PLL1CR 0x28 | ||
34 | #define CPG_PLL2CR 0x2c | ||
35 | #define CPG_PLL3CR 0xdc | ||
36 | #define CPG_CKSCR 0xc0 | ||
37 | #define CPG_DSI0PHYCR 0x6c | ||
38 | #define CPG_DSI1PHYCR 0x70 | ||
39 | |||
40 | #define CLK_ENABLE_ON_INIT BIT(0) | ||
41 | |||
42 | struct div4_clk { | ||
43 | const char *name; | ||
44 | const char *parent; | ||
45 | unsigned int reg; | ||
46 | unsigned int shift; | ||
47 | }; | ||
48 | |||
49 | static struct div4_clk div4_clks[] = { | ||
50 | { "zg", "pll0", CPG_FRQCRA, 16 }, | ||
51 | { "m3", "pll1", CPG_FRQCRA, 12 }, | ||
52 | { "b", "pll1", CPG_FRQCRA, 8 }, | ||
53 | { "m1", "pll1", CPG_FRQCRA, 4 }, | ||
54 | { "m2", "pll1", CPG_FRQCRA, 0 }, | ||
55 | { "zx", "pll1", CPG_FRQCRB, 12 }, | ||
56 | { "hp", "pll1", CPG_FRQCRB, 4 }, | ||
57 | { NULL, NULL, 0, 0 }, | ||
58 | }; | ||
59 | |||
60 | static const struct clk_div_table div4_div_table[] = { | ||
61 | { 0, 2 }, { 1, 3 }, { 2, 4 }, { 3, 6 }, { 4, 8 }, { 5, 12 }, | ||
62 | { 6, 16 }, { 7, 18 }, { 8, 24 }, { 10, 36 }, { 11, 48 }, | ||
63 | { 12, 7 }, { 0, 0 } | ||
64 | }; | ||
65 | |||
66 | static const struct clk_div_table z_div_table[] = { | ||
67 | /* ZSEL == 0 */ | ||
68 | { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 }, { 4, 1 }, { 5, 1 }, | ||
69 | { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 10, 1 }, { 11, 1 }, | ||
70 | { 12, 1 }, { 13, 1 }, { 14, 1 }, { 15, 1 }, | ||
71 | /* ZSEL == 1 */ | ||
72 | { 16, 2 }, { 17, 3 }, { 18, 4 }, { 19, 6 }, { 20, 8 }, { 21, 12 }, | ||
73 | { 22, 16 }, { 24, 24 }, { 27, 48 }, { 0, 0 } | ||
74 | }; | ||
75 | |||
76 | static struct clk * __init | ||
77 | sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg, | ||
78 | const char *name) | ||
79 | { | ||
80 | const struct clk_div_table *table = NULL; | ||
81 | unsigned int shift, reg, width; | ||
82 | const char *parent_name; | ||
83 | unsigned int mult = 1; | ||
84 | unsigned int div = 1; | ||
85 | |||
86 | if (!strcmp(name, "main")) { | ||
87 | /* extal1, extal1_div2, extal2, extal2_div2 */ | ||
88 | u32 parent_idx = (clk_readl(cpg->reg + CPG_CKSCR) >> 28) & 3; | ||
89 | |||
90 | parent_name = of_clk_get_parent_name(np, parent_idx >> 1); | ||
91 | div = (parent_idx & 1) + 1; | ||
92 | } else if (!strncmp(name, "pll", 3)) { | ||
93 | void __iomem *enable_reg = cpg->reg; | ||
94 | u32 enable_bit = name[3] - '0'; | ||
95 | |||
96 | parent_name = "main"; | ||
97 | switch (enable_bit) { | ||
98 | case 0: | ||
99 | enable_reg += CPG_PLL0CR; | ||
100 | break; | ||
101 | case 1: | ||
102 | enable_reg += CPG_PLL1CR; | ||
103 | break; | ||
104 | case 2: | ||
105 | enable_reg += CPG_PLL2CR; | ||
106 | break; | ||
107 | case 3: | ||
108 | enable_reg += CPG_PLL3CR; | ||
109 | break; | ||
110 | default: | ||
111 | return ERR_PTR(-EINVAL); | ||
112 | } | ||
113 | if (clk_readl(cpg->reg + CPG_PLLECR) & BIT(enable_bit)) { | ||
114 | mult = ((clk_readl(enable_reg) >> 24) & 0x3f) + 1; | ||
115 | /* handle CFG bit for PLL1 and PLL2 */ | ||
116 | if (enable_bit == 1 || enable_bit == 2) | ||
117 | if (clk_readl(enable_reg) & BIT(20)) | ||
118 | mult *= 2; | ||
119 | } | ||
120 | } else if (!strcmp(name, "dsi0phy") || !strcmp(name, "dsi1phy")) { | ||
121 | u32 phy_no = name[3] - '0'; | ||
122 | void __iomem *dsi_reg = cpg->reg + | ||
123 | (phy_no ? CPG_DSI1PHYCR : CPG_DSI0PHYCR); | ||
124 | |||
125 | parent_name = phy_no ? "dsi1pck" : "dsi0pck"; | ||
126 | mult = __raw_readl(dsi_reg); | ||
127 | if (!(mult & 0x8000)) | ||
128 | mult = 1; | ||
129 | else | ||
130 | mult = (mult & 0x3f) + 1; | ||
131 | } else if (!strcmp(name, "z")) { | ||
132 | parent_name = "pll0"; | ||
133 | table = z_div_table; | ||
134 | reg = CPG_FRQCRB; | ||
135 | shift = 24; | ||
136 | width = 5; | ||
137 | } else { | ||
138 | struct div4_clk *c; | ||
139 | |||
140 | for (c = div4_clks; c->name; c++) { | ||
141 | if (!strcmp(name, c->name)) { | ||
142 | parent_name = c->parent; | ||
143 | table = div4_div_table; | ||
144 | reg = c->reg; | ||
145 | shift = c->shift; | ||
146 | width = 4; | ||
147 | break; | ||
148 | } | ||
149 | } | ||
150 | if (!c->name) | ||
151 | return ERR_PTR(-EINVAL); | ||
152 | } | ||
153 | |||
154 | if (!table) { | ||
155 | return clk_register_fixed_factor(NULL, name, parent_name, 0, | ||
156 | mult, div); | ||
157 | } else { | ||
158 | return clk_register_divider_table(NULL, name, parent_name, 0, | ||
159 | cpg->reg + reg, shift, width, 0, | ||
160 | table, &cpg->lock); | ||
161 | } | ||
162 | } | ||
163 | |||
164 | static void __init sh73a0_cpg_clocks_init(struct device_node *np) | ||
165 | { | ||
166 | struct sh73a0_cpg *cpg; | ||
167 | struct clk **clks; | ||
168 | unsigned int i; | ||
169 | int num_clks; | ||
170 | |||
171 | num_clks = of_property_count_strings(np, "clock-output-names"); | ||
172 | if (num_clks < 0) { | ||
173 | pr_err("%s: failed to count clocks\n", __func__); | ||
174 | return; | ||
175 | } | ||
176 | |||
177 | cpg = kzalloc(sizeof(*cpg), GFP_KERNEL); | ||
178 | clks = kcalloc(num_clks, sizeof(*clks), GFP_KERNEL); | ||
179 | if (cpg == NULL || clks == NULL) { | ||
180 | /* We're leaking memory on purpose, there's no point in cleaning | ||
181 | * up as the system won't boot anyway. | ||
182 | */ | ||
183 | return; | ||
184 | } | ||
185 | |||
186 | spin_lock_init(&cpg->lock); | ||
187 | |||
188 | cpg->data.clks = clks; | ||
189 | cpg->data.clk_num = num_clks; | ||
190 | |||
191 | cpg->reg = of_iomap(np, 0); | ||
192 | if (WARN_ON(cpg->reg == NULL)) | ||
193 | return; | ||
194 | |||
195 | /* Set SDHI clocks to a known state */ | ||
196 | clk_writel(0x108, cpg->reg + CPG_SD0CKCR); | ||
197 | clk_writel(0x108, cpg->reg + CPG_SD1CKCR); | ||
198 | clk_writel(0x108, cpg->reg + CPG_SD2CKCR); | ||
199 | |||
200 | for (i = 0; i < num_clks; ++i) { | ||
201 | const char *name; | ||
202 | struct clk *clk; | ||
203 | |||
204 | of_property_read_string_index(np, "clock-output-names", i, | ||
205 | &name); | ||
206 | |||
207 | clk = sh73a0_cpg_register_clock(np, cpg, name); | ||
208 | if (IS_ERR(clk)) | ||
209 | pr_err("%s: failed to register %s %s clock (%ld)\n", | ||
210 | __func__, np->name, name, PTR_ERR(clk)); | ||
211 | else | ||
212 | cpg->data.clks[i] = clk; | ||
213 | } | ||
214 | |||
215 | of_clk_add_provider(np, of_clk_src_onecell_get, &cpg->data); | ||
216 | } | ||
217 | CLK_OF_DECLARE(sh73a0_cpg_clks, "renesas,sh73a0-cpg-clocks", | ||
218 | sh73a0_cpg_clocks_init); | ||
diff --git a/drivers/cpuidle/Kconfig.arm b/drivers/cpuidle/Kconfig.arm index 8c16ab20fb15..8e07c9419153 100644 --- a/drivers/cpuidle/Kconfig.arm +++ b/drivers/cpuidle/Kconfig.arm | |||
@@ -55,6 +55,7 @@ config ARM_AT91_CPUIDLE | |||
55 | config ARM_EXYNOS_CPUIDLE | 55 | config ARM_EXYNOS_CPUIDLE |
56 | bool "Cpu Idle Driver for the Exynos processors" | 56 | bool "Cpu Idle Driver for the Exynos processors" |
57 | depends on ARCH_EXYNOS | 57 | depends on ARCH_EXYNOS |
58 | select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP | ||
58 | help | 59 | help |
59 | Select this to enable cpuidle for Exynos processors | 60 | Select this to enable cpuidle for Exynos processors |
60 | 61 | ||
diff --git a/drivers/cpuidle/cpuidle-exynos.c b/drivers/cpuidle/cpuidle-exynos.c index 4003a3160865..26f5f29fdb03 100644 --- a/drivers/cpuidle/cpuidle-exynos.c +++ b/drivers/cpuidle/cpuidle-exynos.c | |||
@@ -1,8 +1,11 @@ | |||
1 | /* linux/arch/arm/mach-exynos/cpuidle.c | 1 | /* |
2 | * | 2 | * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd. |
3 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | 3 | * http://www.samsung.com |
5 | * | 4 | * |
5 | * Coupled cpuidle support based on the work of: | ||
6 | * Colin Cross <ccross@android.com> | ||
7 | * Daniel Lezcano <daniel.lezcano@linaro.org> | ||
8 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
@@ -13,13 +16,49 @@ | |||
13 | #include <linux/export.h> | 16 | #include <linux/export.h> |
14 | #include <linux/module.h> | 17 | #include <linux/module.h> |
15 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/of.h> | ||
20 | #include <linux/platform_data/cpuidle-exynos.h> | ||
16 | 21 | ||
17 | #include <asm/proc-fns.h> | 22 | #include <asm/proc-fns.h> |
18 | #include <asm/suspend.h> | 23 | #include <asm/suspend.h> |
19 | #include <asm/cpuidle.h> | 24 | #include <asm/cpuidle.h> |
20 | 25 | ||
26 | static atomic_t exynos_idle_barrier; | ||
27 | |||
28 | static struct cpuidle_exynos_data *exynos_cpuidle_pdata; | ||
21 | static void (*exynos_enter_aftr)(void); | 29 | static void (*exynos_enter_aftr)(void); |
22 | 30 | ||
31 | static int exynos_enter_coupled_lowpower(struct cpuidle_device *dev, | ||
32 | struct cpuidle_driver *drv, | ||
33 | int index) | ||
34 | { | ||
35 | int ret; | ||
36 | |||
37 | exynos_cpuidle_pdata->pre_enter_aftr(); | ||
38 | |||
39 | /* | ||
40 | * Waiting all cpus to reach this point at the same moment | ||
41 | */ | ||
42 | cpuidle_coupled_parallel_barrier(dev, &exynos_idle_barrier); | ||
43 | |||
44 | /* | ||
45 | * Both cpus will reach this point at the same time | ||
46 | */ | ||
47 | ret = dev->cpu ? exynos_cpuidle_pdata->cpu1_powerdown() | ||
48 | : exynos_cpuidle_pdata->cpu0_enter_aftr(); | ||
49 | if (ret) | ||
50 | index = ret; | ||
51 | |||
52 | /* | ||
53 | * Waiting all cpus to finish the power sequence before going further | ||
54 | */ | ||
55 | cpuidle_coupled_parallel_barrier(dev, &exynos_idle_barrier); | ||
56 | |||
57 | exynos_cpuidle_pdata->post_enter_aftr(); | ||
58 | |||
59 | return index; | ||
60 | } | ||
61 | |||
23 | static int exynos_enter_lowpower(struct cpuidle_device *dev, | 62 | static int exynos_enter_lowpower(struct cpuidle_device *dev, |
24 | struct cpuidle_driver *drv, | 63 | struct cpuidle_driver *drv, |
25 | int index) | 64 | int index) |
@@ -55,13 +94,40 @@ static struct cpuidle_driver exynos_idle_driver = { | |||
55 | .safe_state_index = 0, | 94 | .safe_state_index = 0, |
56 | }; | 95 | }; |
57 | 96 | ||
97 | static struct cpuidle_driver exynos_coupled_idle_driver = { | ||
98 | .name = "exynos_coupled_idle", | ||
99 | .owner = THIS_MODULE, | ||
100 | .states = { | ||
101 | [0] = ARM_CPUIDLE_WFI_STATE, | ||
102 | [1] = { | ||
103 | .enter = exynos_enter_coupled_lowpower, | ||
104 | .exit_latency = 5000, | ||
105 | .target_residency = 10000, | ||
106 | .flags = CPUIDLE_FLAG_COUPLED | | ||
107 | CPUIDLE_FLAG_TIMER_STOP, | ||
108 | .name = "C1", | ||
109 | .desc = "ARM power down", | ||
110 | }, | ||
111 | }, | ||
112 | .state_count = 2, | ||
113 | .safe_state_index = 0, | ||
114 | }; | ||
115 | |||
58 | static int exynos_cpuidle_probe(struct platform_device *pdev) | 116 | static int exynos_cpuidle_probe(struct platform_device *pdev) |
59 | { | 117 | { |
60 | int ret; | 118 | int ret; |
61 | 119 | ||
62 | exynos_enter_aftr = (void *)(pdev->dev.platform_data); | 120 | if (of_machine_is_compatible("samsung,exynos4210")) { |
121 | exynos_cpuidle_pdata = pdev->dev.platform_data; | ||
122 | |||
123 | ret = cpuidle_register(&exynos_coupled_idle_driver, | ||
124 | cpu_possible_mask); | ||
125 | } else { | ||
126 | exynos_enter_aftr = (void *)(pdev->dev.platform_data); | ||
127 | |||
128 | ret = cpuidle_register(&exynos_idle_driver, NULL); | ||
129 | } | ||
63 | 130 | ||
64 | ret = cpuidle_register(&exynos_idle_driver, NULL); | ||
65 | if (ret) { | 131 | if (ret) { |
66 | dev_err(&pdev->dev, "failed to register cpuidle driver\n"); | 132 | dev_err(&pdev->dev, "failed to register cpuidle driver\n"); |
67 | return ret; | 133 | return ret; |
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b0d50d70a8a1..b189733a1539 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c | |||
@@ -526,6 +526,7 @@ static int of_platform_device_destroy(struct device *dev, void *data) | |||
526 | amba_device_unregister(to_amba_device(dev)); | 526 | amba_device_unregister(to_amba_device(dev)); |
527 | #endif | 527 | #endif |
528 | 528 | ||
529 | of_dma_deconfigure(dev); | ||
529 | of_node_clear_flag(dev->of_node, OF_POPULATED); | 530 | of_node_clear_flag(dev->of_node, OF_POPULATED); |
530 | of_node_clear_flag(dev->of_node, OF_POPULATED_BUS); | 531 | of_node_clear_flag(dev->of_node, OF_POPULATED_BUS); |
531 | return 0; | 532 | return 0; |
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index 8843a678f200..3bb49252a098 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -279,6 +279,7 @@ config BFIN_CFPCMCIA | |||
279 | config AT91_CF | 279 | config AT91_CF |
280 | tristate "AT91 CompactFlash Controller" | 280 | tristate "AT91 CompactFlash Controller" |
281 | depends on PCMCIA && ARCH_AT91 | 281 | depends on PCMCIA && ARCH_AT91 |
282 | depends on !ARCH_MULTIPLATFORM | ||
282 | help | 283 | help |
283 | Say Y here to support the CompactFlash controller on AT91 chips. | 284 | Say Y here to support the CompactFlash controller on AT91 chips. |
284 | Or choose M to compile the driver as a module named "at91_cf". | 285 | Or choose M to compile the driver as a module named "at91_cf". |
diff --git a/drivers/soc/ti/Makefile b/drivers/soc/ti/Makefile index 6bed611e1934..135bdad7a6de 100644 --- a/drivers/soc/ti/Makefile +++ b/drivers/soc/ti/Makefile | |||
@@ -1,5 +1,6 @@ | |||
1 | # | 1 | # |
2 | # TI Keystone SOC drivers | 2 | # TI Keystone SOC drivers |
3 | # | 3 | # |
4 | obj-$(CONFIG_KEYSTONE_NAVIGATOR_QMSS) += knav_qmss_queue.o knav_qmss_acc.o | 4 | obj-$(CONFIG_KEYSTONE_NAVIGATOR_QMSS) += knav_qmss.o |
5 | knav_qmss-y := knav_qmss_queue.o knav_qmss_acc.o | ||
5 | obj-$(CONFIG_KEYSTONE_NAVIGATOR_DMA) += knav_dma.o | 6 | obj-$(CONFIG_KEYSTONE_NAVIGATOR_DMA) += knav_dma.o |
diff --git a/drivers/soc/ti/knav_qmss_acc.c b/drivers/soc/ti/knav_qmss_acc.c index 6fbfde6e748f..ef6f69db0bd0 100644 --- a/drivers/soc/ti/knav_qmss_acc.c +++ b/drivers/soc/ti/knav_qmss_acc.c | |||
@@ -209,7 +209,7 @@ static irqreturn_t knav_acc_int_handler(int irq, void *_instdata) | |||
209 | return IRQ_HANDLED; | 209 | return IRQ_HANDLED; |
210 | } | 210 | } |
211 | 211 | ||
212 | int knav_range_setup_acc_irq(struct knav_range_info *range, | 212 | static int knav_range_setup_acc_irq(struct knav_range_info *range, |
213 | int queue, bool enabled) | 213 | int queue, bool enabled) |
214 | { | 214 | { |
215 | struct knav_device *kdev = range->kdev; | 215 | struct knav_device *kdev = range->kdev; |
diff --git a/drivers/soc/ti/knav_qmss_queue.c b/drivers/soc/ti/knav_qmss_queue.c index 8e6a95d91d33..6d8646db52cc 100644 --- a/drivers/soc/ti/knav_qmss_queue.c +++ b/drivers/soc/ti/knav_qmss_queue.c | |||
@@ -626,6 +626,7 @@ int knav_queue_push(void *qhandle, dma_addr_t dma, | |||
626 | atomic_inc(&qh->stats.pushes); | 626 | atomic_inc(&qh->stats.pushes); |
627 | return 0; | 627 | return 0; |
628 | } | 628 | } |
629 | EXPORT_SYMBOL_GPL(knav_queue_push); | ||
629 | 630 | ||
630 | /** | 631 | /** |
631 | * knav_queue_pop() - pop data (or descriptor) from the head of a queue | 632 | * knav_queue_pop() - pop data (or descriptor) from the head of a queue |
@@ -663,6 +664,7 @@ dma_addr_t knav_queue_pop(void *qhandle, unsigned *size) | |||
663 | atomic_inc(&qh->stats.pops); | 664 | atomic_inc(&qh->stats.pops); |
664 | return dma; | 665 | return dma; |
665 | } | 666 | } |
667 | EXPORT_SYMBOL_GPL(knav_queue_pop); | ||
666 | 668 | ||
667 | /* carve out descriptors and push into queue */ | 669 | /* carve out descriptors and push into queue */ |
668 | static void kdesc_fill_pool(struct knav_pool *pool) | 670 | static void kdesc_fill_pool(struct knav_pool *pool) |
@@ -717,12 +719,14 @@ dma_addr_t knav_pool_desc_virt_to_dma(void *ph, void *virt) | |||
717 | struct knav_pool *pool = ph; | 719 | struct knav_pool *pool = ph; |
718 | return pool->region->dma_start + (virt - pool->region->virt_start); | 720 | return pool->region->dma_start + (virt - pool->region->virt_start); |
719 | } | 721 | } |
722 | EXPORT_SYMBOL_GPL(knav_pool_desc_virt_to_dma); | ||
720 | 723 | ||
721 | void *knav_pool_desc_dma_to_virt(void *ph, dma_addr_t dma) | 724 | void *knav_pool_desc_dma_to_virt(void *ph, dma_addr_t dma) |
722 | { | 725 | { |
723 | struct knav_pool *pool = ph; | 726 | struct knav_pool *pool = ph; |
724 | return pool->region->virt_start + (dma - pool->region->dma_start); | 727 | return pool->region->virt_start + (dma - pool->region->dma_start); |
725 | } | 728 | } |
729 | EXPORT_SYMBOL_GPL(knav_pool_desc_dma_to_virt); | ||
726 | 730 | ||
727 | /** | 731 | /** |
728 | * knav_pool_create() - Create a pool of descriptors | 732 | * knav_pool_create() - Create a pool of descriptors |
@@ -878,6 +882,7 @@ void *knav_pool_desc_get(void *ph) | |||
878 | data = knav_pool_desc_dma_to_virt(pool, dma); | 882 | data = knav_pool_desc_dma_to_virt(pool, dma); |
879 | return data; | 883 | return data; |
880 | } | 884 | } |
885 | EXPORT_SYMBOL_GPL(knav_pool_desc_get); | ||
881 | 886 | ||
882 | /** | 887 | /** |
883 | * knav_pool_desc_put() - return a descriptor to the pool | 888 | * knav_pool_desc_put() - return a descriptor to the pool |
@@ -890,6 +895,7 @@ void knav_pool_desc_put(void *ph, void *desc) | |||
890 | dma = knav_pool_desc_virt_to_dma(pool, desc); | 895 | dma = knav_pool_desc_virt_to_dma(pool, desc); |
891 | knav_queue_push(pool->queue, dma, pool->region->desc_size, 0); | 896 | knav_queue_push(pool->queue, dma, pool->region->desc_size, 0); |
892 | } | 897 | } |
898 | EXPORT_SYMBOL_GPL(knav_pool_desc_put); | ||
893 | 899 | ||
894 | /** | 900 | /** |
895 | * knav_pool_desc_map() - Map descriptor for DMA transfer | 901 | * knav_pool_desc_map() - Map descriptor for DMA transfer |
@@ -916,6 +922,7 @@ int knav_pool_desc_map(void *ph, void *desc, unsigned size, | |||
916 | 922 | ||
917 | return 0; | 923 | return 0; |
918 | } | 924 | } |
925 | EXPORT_SYMBOL_GPL(knav_pool_desc_map); | ||
919 | 926 | ||
920 | /** | 927 | /** |
921 | * knav_pool_desc_unmap() - Unmap descriptor after DMA transfer | 928 | * knav_pool_desc_unmap() - Unmap descriptor after DMA transfer |
@@ -938,6 +945,7 @@ void *knav_pool_desc_unmap(void *ph, dma_addr_t dma, unsigned dma_sz) | |||
938 | prefetch(desc); | 945 | prefetch(desc); |
939 | return desc; | 946 | return desc; |
940 | } | 947 | } |
948 | EXPORT_SYMBOL_GPL(knav_pool_desc_unmap); | ||
941 | 949 | ||
942 | /** | 950 | /** |
943 | * knav_pool_count() - Get the number of descriptors in pool. | 951 | * knav_pool_count() - Get the number of descriptors in pool. |
@@ -949,6 +957,7 @@ int knav_pool_count(void *ph) | |||
949 | struct knav_pool *pool = ph; | 957 | struct knav_pool *pool = ph; |
950 | return knav_queue_get_count(pool->queue); | 958 | return knav_queue_get_count(pool->queue); |
951 | } | 959 | } |
960 | EXPORT_SYMBOL_GPL(knav_pool_count); | ||
952 | 961 | ||
953 | static void knav_queue_setup_region(struct knav_device *kdev, | 962 | static void knav_queue_setup_region(struct knav_device *kdev, |
954 | struct knav_region *region) | 963 | struct knav_region *region) |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index b8e213eb36cc..366e551aeff0 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
@@ -32,6 +32,7 @@ menu "USB Peripheral Controller" | |||
32 | config USB_AT91 | 32 | config USB_AT91 |
33 | tristate "Atmel AT91 USB Device Port" | 33 | tristate "Atmel AT91 USB Device Port" |
34 | depends on ARCH_AT91 | 34 | depends on ARCH_AT91 |
35 | depends on OF || COMPILE_TEST | ||
35 | help | 36 | help |
36 | Many Atmel AT91 processors (such as the AT91RM2000) have a | 37 | Many Atmel AT91 processors (such as the AT91RM2000) have a |
37 | full speed USB Device Port with support for five configurable | 38 | full speed USB Device Port with support for five configurable |
diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c index c0ec5f71f16f..2fbedca3c2b4 100644 --- a/drivers/usb/gadget/udc/at91_udc.c +++ b/drivers/usb/gadget/udc/at91_udc.c | |||
@@ -31,16 +31,9 @@ | |||
31 | #include <linux/of.h> | 31 | #include <linux/of.h> |
32 | #include <linux/of_gpio.h> | 32 | #include <linux/of_gpio.h> |
33 | #include <linux/platform_data/atmel.h> | 33 | #include <linux/platform_data/atmel.h> |
34 | 34 | #include <linux/regmap.h> | |
35 | #include <asm/byteorder.h> | 35 | #include <linux/mfd/syscon.h> |
36 | #include <mach/hardware.h> | 36 | #include <linux/mfd/syscon/atmel-matrix.h> |
37 | #include <asm/io.h> | ||
38 | #include <asm/irq.h> | ||
39 | #include <asm/gpio.h> | ||
40 | |||
41 | #include <mach/cpu.h> | ||
42 | #include <mach/at91sam9261_matrix.h> | ||
43 | #include <mach/at91_matrix.h> | ||
44 | 37 | ||
45 | #include "at91_udc.h" | 38 | #include "at91_udc.h" |
46 | 39 | ||
@@ -66,7 +59,15 @@ | |||
66 | #define DRIVER_VERSION "3 May 2006" | 59 | #define DRIVER_VERSION "3 May 2006" |
67 | 60 | ||
68 | static const char driver_name [] = "at91_udc"; | 61 | static const char driver_name [] = "at91_udc"; |
69 | static const char ep0name[] = "ep0"; | 62 | static const char * const ep_names[] = { |
63 | "ep0", | ||
64 | "ep1", | ||
65 | "ep2", | ||
66 | "ep3-int", | ||
67 | "ep4", | ||
68 | "ep5", | ||
69 | }; | ||
70 | #define ep0name ep_names[0] | ||
70 | 71 | ||
71 | #define VBUS_POLL_TIMEOUT msecs_to_jiffies(1000) | 72 | #define VBUS_POLL_TIMEOUT msecs_to_jiffies(1000) |
72 | 73 | ||
@@ -895,8 +896,6 @@ static void clk_on(struct at91_udc *udc) | |||
895 | return; | 896 | return; |
896 | udc->clocked = 1; | 897 | udc->clocked = 1; |
897 | 898 | ||
898 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | ||
899 | clk_enable(udc->uclk); | ||
900 | clk_enable(udc->iclk); | 899 | clk_enable(udc->iclk); |
901 | clk_enable(udc->fclk); | 900 | clk_enable(udc->fclk); |
902 | } | 901 | } |
@@ -909,8 +908,6 @@ static void clk_off(struct at91_udc *udc) | |||
909 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 908 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
910 | clk_disable(udc->fclk); | 909 | clk_disable(udc->fclk); |
911 | clk_disable(udc->iclk); | 910 | clk_disable(udc->iclk); |
912 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | ||
913 | clk_disable(udc->uclk); | ||
914 | } | 911 | } |
915 | 912 | ||
916 | /* | 913 | /* |
@@ -919,8 +916,6 @@ static void clk_off(struct at91_udc *udc) | |||
919 | */ | 916 | */ |
920 | static void pullup(struct at91_udc *udc, int is_on) | 917 | static void pullup(struct at91_udc *udc, int is_on) |
921 | { | 918 | { |
922 | int active = !udc->board.pullup_active_low; | ||
923 | |||
924 | if (!udc->enabled || !udc->vbus) | 919 | if (!udc->enabled || !udc->vbus) |
925 | is_on = 0; | 920 | is_on = 0; |
926 | DBG("%sactive\n", is_on ? "" : "in"); | 921 | DBG("%sactive\n", is_on ? "" : "in"); |
@@ -929,40 +924,15 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
929 | clk_on(udc); | 924 | clk_on(udc); |
930 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM); | 925 | at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM); |
931 | at91_udp_write(udc, AT91_UDP_TXVC, 0); | 926 | at91_udp_write(udc, AT91_UDP_TXVC, 0); |
932 | if (cpu_is_at91rm9200()) | ||
933 | gpio_set_value(udc->board.pullup_pin, active); | ||
934 | else if (cpu_is_at91sam9260() || cpu_is_at91sam9263() || cpu_is_at91sam9g20()) { | ||
935 | u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); | ||
936 | |||
937 | txvc |= AT91_UDP_TXVC_PUON; | ||
938 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | ||
939 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { | ||
940 | u32 usbpucr; | ||
941 | |||
942 | usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR); | ||
943 | usbpucr |= AT91_MATRIX_USBPUCR_PUON; | ||
944 | at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr); | ||
945 | } | ||
946 | } else { | 927 | } else { |
947 | stop_activity(udc); | 928 | stop_activity(udc); |
948 | at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM); | 929 | at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM); |
949 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 930 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
950 | if (cpu_is_at91rm9200()) | ||
951 | gpio_set_value(udc->board.pullup_pin, !active); | ||
952 | else if (cpu_is_at91sam9260() || cpu_is_at91sam9263() || cpu_is_at91sam9g20()) { | ||
953 | u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); | ||
954 | |||
955 | txvc &= ~AT91_UDP_TXVC_PUON; | ||
956 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | ||
957 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { | ||
958 | u32 usbpucr; | ||
959 | |||
960 | usbpucr = at91_matrix_read(AT91_MATRIX_USBPUCR); | ||
961 | usbpucr &= ~AT91_MATRIX_USBPUCR_PUON; | ||
962 | at91_matrix_write(AT91_MATRIX_USBPUCR, usbpucr); | ||
963 | } | ||
964 | clk_off(udc); | 931 | clk_off(udc); |
965 | } | 932 | } |
933 | |||
934 | if (udc->caps && udc->caps->pullup) | ||
935 | udc->caps->pullup(udc, is_on); | ||
966 | } | 936 | } |
967 | 937 | ||
968 | /* vbus is here! turn everything on that's ready */ | 938 | /* vbus is here! turn everything on that's ready */ |
@@ -1535,74 +1505,6 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1535 | 1505 | ||
1536 | /*-------------------------------------------------------------------------*/ | 1506 | /*-------------------------------------------------------------------------*/ |
1537 | 1507 | ||
1538 | static struct at91_udc controller = { | ||
1539 | .gadget = { | ||
1540 | .ops = &at91_udc_ops, | ||
1541 | .ep0 = &controller.ep[0].ep, | ||
1542 | .name = driver_name, | ||
1543 | }, | ||
1544 | .ep[0] = { | ||
1545 | .ep = { | ||
1546 | .name = ep0name, | ||
1547 | .ops = &at91_ep_ops, | ||
1548 | }, | ||
1549 | .udc = &controller, | ||
1550 | .maxpacket = 8, | ||
1551 | .int_mask = 1 << 0, | ||
1552 | }, | ||
1553 | .ep[1] = { | ||
1554 | .ep = { | ||
1555 | .name = "ep1", | ||
1556 | .ops = &at91_ep_ops, | ||
1557 | }, | ||
1558 | .udc = &controller, | ||
1559 | .is_pingpong = 1, | ||
1560 | .maxpacket = 64, | ||
1561 | .int_mask = 1 << 1, | ||
1562 | }, | ||
1563 | .ep[2] = { | ||
1564 | .ep = { | ||
1565 | .name = "ep2", | ||
1566 | .ops = &at91_ep_ops, | ||
1567 | }, | ||
1568 | .udc = &controller, | ||
1569 | .is_pingpong = 1, | ||
1570 | .maxpacket = 64, | ||
1571 | .int_mask = 1 << 2, | ||
1572 | }, | ||
1573 | .ep[3] = { | ||
1574 | .ep = { | ||
1575 | /* could actually do bulk too */ | ||
1576 | .name = "ep3-int", | ||
1577 | .ops = &at91_ep_ops, | ||
1578 | }, | ||
1579 | .udc = &controller, | ||
1580 | .maxpacket = 8, | ||
1581 | .int_mask = 1 << 3, | ||
1582 | }, | ||
1583 | .ep[4] = { | ||
1584 | .ep = { | ||
1585 | .name = "ep4", | ||
1586 | .ops = &at91_ep_ops, | ||
1587 | }, | ||
1588 | .udc = &controller, | ||
1589 | .is_pingpong = 1, | ||
1590 | .maxpacket = 256, | ||
1591 | .int_mask = 1 << 4, | ||
1592 | }, | ||
1593 | .ep[5] = { | ||
1594 | .ep = { | ||
1595 | .name = "ep5", | ||
1596 | .ops = &at91_ep_ops, | ||
1597 | }, | ||
1598 | .udc = &controller, | ||
1599 | .is_pingpong = 1, | ||
1600 | .maxpacket = 256, | ||
1601 | .int_mask = 1 << 5, | ||
1602 | }, | ||
1603 | /* ep6 and ep7 are also reserved (custom silicon might use them) */ | ||
1604 | }; | ||
1605 | |||
1606 | static void at91_vbus_update(struct at91_udc *udc, unsigned value) | 1508 | static void at91_vbus_update(struct at91_udc *udc, unsigned value) |
1607 | { | 1509 | { |
1608 | value ^= udc->board.vbus_active_low; | 1510 | value ^= udc->board.vbus_active_low; |
@@ -1687,12 +1589,202 @@ static void at91udc_shutdown(struct platform_device *dev) | |||
1687 | spin_unlock_irqrestore(&udc->lock, flags); | 1589 | spin_unlock_irqrestore(&udc->lock, flags); |
1688 | } | 1590 | } |
1689 | 1591 | ||
1690 | static void at91udc_of_init(struct at91_udc *udc, | 1592 | static int at91rm9200_udc_init(struct at91_udc *udc) |
1691 | struct device_node *np) | 1593 | { |
1594 | struct at91_ep *ep; | ||
1595 | int ret; | ||
1596 | int i; | ||
1597 | |||
1598 | for (i = 0; i < NUM_ENDPOINTS; i++) { | ||
1599 | ep = &udc->ep[i]; | ||
1600 | |||
1601 | switch (i) { | ||
1602 | case 0: | ||
1603 | case 3: | ||
1604 | ep->maxpacket = 8; | ||
1605 | break; | ||
1606 | case 1 ... 2: | ||
1607 | ep->maxpacket = 64; | ||
1608 | break; | ||
1609 | case 4 ... 5: | ||
1610 | ep->maxpacket = 256; | ||
1611 | break; | ||
1612 | } | ||
1613 | } | ||
1614 | |||
1615 | if (!gpio_is_valid(udc->board.pullup_pin)) { | ||
1616 | DBG("no D+ pullup?\n"); | ||
1617 | return -ENODEV; | ||
1618 | } | ||
1619 | |||
1620 | ret = devm_gpio_request(&udc->pdev->dev, udc->board.pullup_pin, | ||
1621 | "udc_pullup"); | ||
1622 | if (ret) { | ||
1623 | DBG("D+ pullup is busy\n"); | ||
1624 | return ret; | ||
1625 | } | ||
1626 | |||
1627 | gpio_direction_output(udc->board.pullup_pin, | ||
1628 | udc->board.pullup_active_low); | ||
1629 | |||
1630 | return 0; | ||
1631 | } | ||
1632 | |||
1633 | static void at91rm9200_udc_pullup(struct at91_udc *udc, int is_on) | ||
1634 | { | ||
1635 | int active = !udc->board.pullup_active_low; | ||
1636 | |||
1637 | if (is_on) | ||
1638 | gpio_set_value(udc->board.pullup_pin, active); | ||
1639 | else | ||
1640 | gpio_set_value(udc->board.pullup_pin, !active); | ||
1641 | } | ||
1642 | |||
1643 | static const struct at91_udc_caps at91rm9200_udc_caps = { | ||
1644 | .init = at91rm9200_udc_init, | ||
1645 | .pullup = at91rm9200_udc_pullup, | ||
1646 | }; | ||
1647 | |||
1648 | static int at91sam9260_udc_init(struct at91_udc *udc) | ||
1649 | { | ||
1650 | struct at91_ep *ep; | ||
1651 | int i; | ||
1652 | |||
1653 | for (i = 0; i < NUM_ENDPOINTS; i++) { | ||
1654 | ep = &udc->ep[i]; | ||
1655 | |||
1656 | switch (i) { | ||
1657 | case 0 ... 3: | ||
1658 | ep->maxpacket = 64; | ||
1659 | break; | ||
1660 | case 4 ... 5: | ||
1661 | ep->maxpacket = 512; | ||
1662 | break; | ||
1663 | } | ||
1664 | } | ||
1665 | |||
1666 | return 0; | ||
1667 | } | ||
1668 | |||
1669 | static void at91sam9260_udc_pullup(struct at91_udc *udc, int is_on) | ||
1670 | { | ||
1671 | u32 txvc = at91_udp_read(udc, AT91_UDP_TXVC); | ||
1672 | |||
1673 | if (is_on) | ||
1674 | txvc |= AT91_UDP_TXVC_PUON; | ||
1675 | else | ||
1676 | txvc &= ~AT91_UDP_TXVC_PUON; | ||
1677 | |||
1678 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | ||
1679 | } | ||
1680 | |||
1681 | static const struct at91_udc_caps at91sam9260_udc_caps = { | ||
1682 | .init = at91sam9260_udc_init, | ||
1683 | .pullup = at91sam9260_udc_pullup, | ||
1684 | }; | ||
1685 | |||
1686 | static int at91sam9261_udc_init(struct at91_udc *udc) | ||
1687 | { | ||
1688 | struct at91_ep *ep; | ||
1689 | int i; | ||
1690 | |||
1691 | for (i = 0; i < NUM_ENDPOINTS; i++) { | ||
1692 | ep = &udc->ep[i]; | ||
1693 | |||
1694 | switch (i) { | ||
1695 | case 0: | ||
1696 | ep->maxpacket = 8; | ||
1697 | break; | ||
1698 | case 1 ... 3: | ||
1699 | ep->maxpacket = 64; | ||
1700 | break; | ||
1701 | case 4 ... 5: | ||
1702 | ep->maxpacket = 256; | ||
1703 | break; | ||
1704 | } | ||
1705 | } | ||
1706 | |||
1707 | udc->matrix = syscon_regmap_lookup_by_phandle(udc->pdev->dev.of_node, | ||
1708 | "atmel,matrix"); | ||
1709 | if (IS_ERR(udc->matrix)) | ||
1710 | return PTR_ERR(udc->matrix); | ||
1711 | |||
1712 | return 0; | ||
1713 | } | ||
1714 | |||
1715 | static void at91sam9261_udc_pullup(struct at91_udc *udc, int is_on) | ||
1716 | { | ||
1717 | u32 usbpucr = 0; | ||
1718 | |||
1719 | if (is_on) | ||
1720 | usbpucr = AT91_MATRIX_USBPUCR_PUON; | ||
1721 | |||
1722 | regmap_update_bits(udc->matrix, AT91SAM9261_MATRIX_USBPUCR, | ||
1723 | AT91_MATRIX_USBPUCR_PUON, usbpucr); | ||
1724 | } | ||
1725 | |||
1726 | static const struct at91_udc_caps at91sam9261_udc_caps = { | ||
1727 | .init = at91sam9261_udc_init, | ||
1728 | .pullup = at91sam9261_udc_pullup, | ||
1729 | }; | ||
1730 | |||
1731 | static int at91sam9263_udc_init(struct at91_udc *udc) | ||
1732 | { | ||
1733 | struct at91_ep *ep; | ||
1734 | int i; | ||
1735 | |||
1736 | for (i = 0; i < NUM_ENDPOINTS; i++) { | ||
1737 | ep = &udc->ep[i]; | ||
1738 | |||
1739 | switch (i) { | ||
1740 | case 0: | ||
1741 | case 1: | ||
1742 | case 2: | ||
1743 | case 3: | ||
1744 | ep->maxpacket = 64; | ||
1745 | break; | ||
1746 | case 4: | ||
1747 | case 5: | ||
1748 | ep->maxpacket = 256; | ||
1749 | break; | ||
1750 | } | ||
1751 | } | ||
1752 | |||
1753 | return 0; | ||
1754 | } | ||
1755 | |||
1756 | static const struct at91_udc_caps at91sam9263_udc_caps = { | ||
1757 | .init = at91sam9263_udc_init, | ||
1758 | .pullup = at91sam9260_udc_pullup, | ||
1759 | }; | ||
1760 | |||
1761 | static const struct of_device_id at91_udc_dt_ids[] = { | ||
1762 | { | ||
1763 | .compatible = "atmel,at91rm9200-udc", | ||
1764 | .data = &at91rm9200_udc_caps, | ||
1765 | }, | ||
1766 | { | ||
1767 | .compatible = "atmel,at91sam9260-udc", | ||
1768 | .data = &at91sam9260_udc_caps, | ||
1769 | }, | ||
1770 | { | ||
1771 | .compatible = "atmel,at91sam9261-udc", | ||
1772 | .data = &at91sam9261_udc_caps, | ||
1773 | }, | ||
1774 | { | ||
1775 | .compatible = "atmel,at91sam9263-udc", | ||
1776 | .data = &at91sam9263_udc_caps, | ||
1777 | }, | ||
1778 | { /* sentinel */ } | ||
1779 | }; | ||
1780 | MODULE_DEVICE_TABLE(of, at91_udc_dt_ids); | ||
1781 | |||
1782 | static void at91udc_of_init(struct at91_udc *udc, struct device_node *np) | ||
1692 | { | 1783 | { |
1693 | struct at91_udc_data *board = &udc->board; | 1784 | struct at91_udc_data *board = &udc->board; |
1694 | u32 val; | 1785 | const struct of_device_id *match; |
1695 | enum of_gpio_flags flags; | 1786 | enum of_gpio_flags flags; |
1787 | u32 val; | ||
1696 | 1788 | ||
1697 | if (of_property_read_u32(np, "atmel,vbus-polled", &val) == 0) | 1789 | if (of_property_read_u32(np, "atmel,vbus-polled", &val) == 0) |
1698 | board->vbus_polled = 1; | 1790 | board->vbus_polled = 1; |
@@ -1705,6 +1797,10 @@ static void at91udc_of_init(struct at91_udc *udc, | |||
1705 | &flags); | 1797 | &flags); |
1706 | 1798 | ||
1707 | board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; | 1799 | board->pullup_active_low = (flags & OF_GPIO_ACTIVE_LOW) ? 1 : 0; |
1800 | |||
1801 | match = of_match_node(at91_udc_dt_ids, np); | ||
1802 | if (match) | ||
1803 | udc->caps = match->data; | ||
1708 | } | 1804 | } |
1709 | 1805 | ||
1710 | static int at91udc_probe(struct platform_device *pdev) | 1806 | static int at91udc_probe(struct platform_device *pdev) |
@@ -1713,97 +1809,67 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1713 | struct at91_udc *udc; | 1809 | struct at91_udc *udc; |
1714 | int retval; | 1810 | int retval; |
1715 | struct resource *res; | 1811 | struct resource *res; |
1812 | struct at91_ep *ep; | ||
1813 | int i; | ||
1716 | 1814 | ||
1717 | if (!dev_get_platdata(dev) && !pdev->dev.of_node) { | 1815 | udc = devm_kzalloc(dev, sizeof(*udc), GFP_KERNEL); |
1718 | /* small (so we copy it) but critical! */ | 1816 | if (!udc) |
1719 | DBG("missing platform_data\n"); | 1817 | return -ENOMEM; |
1720 | return -ENODEV; | ||
1721 | } | ||
1722 | |||
1723 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1724 | if (!res) | ||
1725 | return -ENXIO; | ||
1726 | |||
1727 | if (!request_mem_region(res->start, resource_size(res), driver_name)) { | ||
1728 | DBG("someone's using UDC memory\n"); | ||
1729 | return -EBUSY; | ||
1730 | } | ||
1731 | 1818 | ||
1732 | /* init software state */ | 1819 | /* init software state */ |
1733 | udc = &controller; | ||
1734 | udc->gadget.dev.parent = dev; | 1820 | udc->gadget.dev.parent = dev; |
1735 | if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) | 1821 | at91udc_of_init(udc, pdev->dev.of_node); |
1736 | at91udc_of_init(udc, pdev->dev.of_node); | ||
1737 | else | ||
1738 | memcpy(&udc->board, dev_get_platdata(dev), | ||
1739 | sizeof(struct at91_udc_data)); | ||
1740 | udc->pdev = pdev; | 1822 | udc->pdev = pdev; |
1741 | udc->enabled = 0; | 1823 | udc->enabled = 0; |
1742 | spin_lock_init(&udc->lock); | 1824 | spin_lock_init(&udc->lock); |
1743 | 1825 | ||
1744 | /* rm9200 needs manual D+ pullup; off by default */ | 1826 | udc->gadget.ops = &at91_udc_ops; |
1745 | if (cpu_is_at91rm9200()) { | 1827 | udc->gadget.ep0 = &udc->ep[0].ep; |
1746 | if (!gpio_is_valid(udc->board.pullup_pin)) { | 1828 | udc->gadget.name = driver_name; |
1747 | DBG("no D+ pullup?\n"); | 1829 | udc->gadget.dev.init_name = "gadget"; |
1748 | retval = -ENODEV; | ||
1749 | goto fail0; | ||
1750 | } | ||
1751 | retval = gpio_request(udc->board.pullup_pin, "udc_pullup"); | ||
1752 | if (retval) { | ||
1753 | DBG("D+ pullup is busy\n"); | ||
1754 | goto fail0; | ||
1755 | } | ||
1756 | gpio_direction_output(udc->board.pullup_pin, | ||
1757 | udc->board.pullup_active_low); | ||
1758 | } | ||
1759 | 1830 | ||
1760 | /* newer chips have more FIFO memory than rm9200 */ | 1831 | for (i = 0; i < NUM_ENDPOINTS; i++) { |
1761 | if (cpu_is_at91sam9260() || cpu_is_at91sam9g20()) { | 1832 | ep = &udc->ep[i]; |
1762 | udc->ep[0].maxpacket = 64; | 1833 | ep->ep.name = ep_names[i]; |
1763 | udc->ep[3].maxpacket = 64; | 1834 | ep->ep.ops = &at91_ep_ops; |
1764 | udc->ep[4].maxpacket = 512; | 1835 | ep->udc = udc; |
1765 | udc->ep[5].maxpacket = 512; | 1836 | ep->int_mask = BIT(i); |
1766 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { | 1837 | if (i != 0 && i != 3) |
1767 | udc->ep[3].maxpacket = 64; | 1838 | ep->is_pingpong = 1; |
1768 | } else if (cpu_is_at91sam9263()) { | ||
1769 | udc->ep[0].maxpacket = 64; | ||
1770 | udc->ep[3].maxpacket = 64; | ||
1771 | } | 1839 | } |
1772 | 1840 | ||
1773 | udc->udp_baseaddr = ioremap(res->start, resource_size(res)); | 1841 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1774 | if (!udc->udp_baseaddr) { | 1842 | udc->udp_baseaddr = devm_ioremap_resource(dev, res); |
1775 | retval = -ENOMEM; | 1843 | if (IS_ERR(udc->udp_baseaddr)) |
1776 | goto fail0a; | 1844 | return PTR_ERR(udc->udp_baseaddr); |
1845 | |||
1846 | if (udc->caps && udc->caps->init) { | ||
1847 | retval = udc->caps->init(udc); | ||
1848 | if (retval) | ||
1849 | return retval; | ||
1777 | } | 1850 | } |
1778 | 1851 | ||
1779 | udc_reinit(udc); | 1852 | udc_reinit(udc); |
1780 | 1853 | ||
1781 | /* get interface and function clocks */ | 1854 | /* get interface and function clocks */ |
1782 | udc->iclk = clk_get(dev, "udc_clk"); | 1855 | udc->iclk = devm_clk_get(dev, "pclk"); |
1783 | udc->fclk = clk_get(dev, "udpck"); | 1856 | if (IS_ERR(udc->iclk)) |
1784 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | 1857 | return PTR_ERR(udc->iclk); |
1785 | udc->uclk = clk_get(dev, "usb_clk"); | 1858 | |
1786 | if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk) || | 1859 | udc->fclk = devm_clk_get(dev, "hclk"); |
1787 | (IS_ENABLED(CONFIG_COMMON_CLK) && IS_ERR(udc->uclk))) { | 1860 | if (IS_ERR(udc->fclk)) |
1788 | DBG("clocks missing\n"); | 1861 | return PTR_ERR(udc->fclk); |
1789 | retval = -ENODEV; | ||
1790 | goto fail1; | ||
1791 | } | ||
1792 | 1862 | ||
1793 | /* don't do anything until we have both gadget driver and VBUS */ | 1863 | /* don't do anything until we have both gadget driver and VBUS */ |
1794 | if (IS_ENABLED(CONFIG_COMMON_CLK)) { | 1864 | clk_set_rate(udc->fclk, 48000000); |
1795 | clk_set_rate(udc->uclk, 48000000); | ||
1796 | retval = clk_prepare(udc->uclk); | ||
1797 | if (retval) | ||
1798 | goto fail1; | ||
1799 | } | ||
1800 | retval = clk_prepare(udc->fclk); | 1865 | retval = clk_prepare(udc->fclk); |
1801 | if (retval) | 1866 | if (retval) |
1802 | goto fail1a; | 1867 | return retval; |
1803 | 1868 | ||
1804 | retval = clk_prepare_enable(udc->iclk); | 1869 | retval = clk_prepare_enable(udc->iclk); |
1805 | if (retval) | 1870 | if (retval) |
1806 | goto fail1b; | 1871 | goto err_unprepare_fclk; |
1872 | |||
1807 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 1873 | at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
1808 | at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); | 1874 | at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); |
1809 | /* Clear all pending interrupts - UDP may be used by bootloader. */ | 1875 | /* Clear all pending interrupts - UDP may be used by bootloader. */ |
@@ -1812,18 +1878,21 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1812 | 1878 | ||
1813 | /* request UDC and maybe VBUS irqs */ | 1879 | /* request UDC and maybe VBUS irqs */ |
1814 | udc->udp_irq = platform_get_irq(pdev, 0); | 1880 | udc->udp_irq = platform_get_irq(pdev, 0); |
1815 | retval = request_irq(udc->udp_irq, at91_udc_irq, | 1881 | retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0, |
1816 | 0, driver_name, udc); | 1882 | driver_name, udc); |
1817 | if (retval < 0) { | 1883 | if (retval) { |
1818 | DBG("request irq %d failed\n", udc->udp_irq); | 1884 | DBG("request irq %d failed\n", udc->udp_irq); |
1819 | goto fail1c; | 1885 | goto err_unprepare_iclk; |
1820 | } | 1886 | } |
1887 | |||
1821 | if (gpio_is_valid(udc->board.vbus_pin)) { | 1888 | if (gpio_is_valid(udc->board.vbus_pin)) { |
1822 | retval = gpio_request(udc->board.vbus_pin, "udc_vbus"); | 1889 | retval = devm_gpio_request(dev, udc->board.vbus_pin, |
1823 | if (retval < 0) { | 1890 | "udc_vbus"); |
1891 | if (retval) { | ||
1824 | DBG("request vbus pin failed\n"); | 1892 | DBG("request vbus pin failed\n"); |
1825 | goto fail2; | 1893 | goto err_unprepare_iclk; |
1826 | } | 1894 | } |
1895 | |||
1827 | gpio_direction_input(udc->board.vbus_pin); | 1896 | gpio_direction_input(udc->board.vbus_pin); |
1828 | 1897 | ||
1829 | /* | 1898 | /* |
@@ -1840,12 +1909,13 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1840 | mod_timer(&udc->vbus_timer, | 1909 | mod_timer(&udc->vbus_timer, |
1841 | jiffies + VBUS_POLL_TIMEOUT); | 1910 | jiffies + VBUS_POLL_TIMEOUT); |
1842 | } else { | 1911 | } else { |
1843 | if (request_irq(gpio_to_irq(udc->board.vbus_pin), | 1912 | retval = devm_request_irq(dev, |
1844 | at91_vbus_irq, 0, driver_name, udc)) { | 1913 | gpio_to_irq(udc->board.vbus_pin), |
1914 | at91_vbus_irq, 0, driver_name, udc); | ||
1915 | if (retval) { | ||
1845 | DBG("request vbus irq %d failed\n", | 1916 | DBG("request vbus irq %d failed\n", |
1846 | udc->board.vbus_pin); | 1917 | udc->board.vbus_pin); |
1847 | retval = -EBUSY; | 1918 | goto err_unprepare_iclk; |
1848 | goto fail3; | ||
1849 | } | 1919 | } |
1850 | } | 1920 | } |
1851 | } else { | 1921 | } else { |
@@ -1854,49 +1924,27 @@ static int at91udc_probe(struct platform_device *pdev) | |||
1854 | } | 1924 | } |
1855 | retval = usb_add_gadget_udc(dev, &udc->gadget); | 1925 | retval = usb_add_gadget_udc(dev, &udc->gadget); |
1856 | if (retval) | 1926 | if (retval) |
1857 | goto fail4; | 1927 | goto err_unprepare_iclk; |
1858 | dev_set_drvdata(dev, udc); | 1928 | dev_set_drvdata(dev, udc); |
1859 | device_init_wakeup(dev, 1); | 1929 | device_init_wakeup(dev, 1); |
1860 | create_debug_file(udc); | 1930 | create_debug_file(udc); |
1861 | 1931 | ||
1862 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); | 1932 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); |
1863 | return 0; | 1933 | return 0; |
1864 | fail4: | 1934 | |
1865 | if (gpio_is_valid(udc->board.vbus_pin) && !udc->board.vbus_polled) | 1935 | err_unprepare_iclk: |
1866 | free_irq(gpio_to_irq(udc->board.vbus_pin), udc); | ||
1867 | fail3: | ||
1868 | if (gpio_is_valid(udc->board.vbus_pin)) | ||
1869 | gpio_free(udc->board.vbus_pin); | ||
1870 | fail2: | ||
1871 | free_irq(udc->udp_irq, udc); | ||
1872 | fail1c: | ||
1873 | clk_unprepare(udc->iclk); | 1936 | clk_unprepare(udc->iclk); |
1874 | fail1b: | 1937 | err_unprepare_fclk: |
1875 | clk_unprepare(udc->fclk); | 1938 | clk_unprepare(udc->fclk); |
1876 | fail1a: | 1939 | |
1877 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | ||
1878 | clk_unprepare(udc->uclk); | ||
1879 | fail1: | ||
1880 | if (IS_ENABLED(CONFIG_COMMON_CLK) && !IS_ERR(udc->uclk)) | ||
1881 | clk_put(udc->uclk); | ||
1882 | if (!IS_ERR(udc->fclk)) | ||
1883 | clk_put(udc->fclk); | ||
1884 | if (!IS_ERR(udc->iclk)) | ||
1885 | clk_put(udc->iclk); | ||
1886 | iounmap(udc->udp_baseaddr); | ||
1887 | fail0a: | ||
1888 | if (cpu_is_at91rm9200()) | ||
1889 | gpio_free(udc->board.pullup_pin); | ||
1890 | fail0: | ||
1891 | release_mem_region(res->start, resource_size(res)); | ||
1892 | DBG("%s probe failed, %d\n", driver_name, retval); | 1940 | DBG("%s probe failed, %d\n", driver_name, retval); |
1941 | |||
1893 | return retval; | 1942 | return retval; |
1894 | } | 1943 | } |
1895 | 1944 | ||
1896 | static int __exit at91udc_remove(struct platform_device *pdev) | 1945 | static int __exit at91udc_remove(struct platform_device *pdev) |
1897 | { | 1946 | { |
1898 | struct at91_udc *udc = platform_get_drvdata(pdev); | 1947 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1899 | struct resource *res; | ||
1900 | unsigned long flags; | 1948 | unsigned long flags; |
1901 | 1949 | ||
1902 | DBG("remove\n"); | 1950 | DBG("remove\n"); |
@@ -1911,29 +1959,9 @@ static int __exit at91udc_remove(struct platform_device *pdev) | |||
1911 | 1959 | ||
1912 | device_init_wakeup(&pdev->dev, 0); | 1960 | device_init_wakeup(&pdev->dev, 0); |
1913 | remove_debug_file(udc); | 1961 | remove_debug_file(udc); |
1914 | if (gpio_is_valid(udc->board.vbus_pin)) { | ||
1915 | free_irq(gpio_to_irq(udc->board.vbus_pin), udc); | ||
1916 | gpio_free(udc->board.vbus_pin); | ||
1917 | } | ||
1918 | free_irq(udc->udp_irq, udc); | ||
1919 | iounmap(udc->udp_baseaddr); | ||
1920 | |||
1921 | if (cpu_is_at91rm9200()) | ||
1922 | gpio_free(udc->board.pullup_pin); | ||
1923 | |||
1924 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1925 | release_mem_region(res->start, resource_size(res)); | ||
1926 | |||
1927 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | ||
1928 | clk_unprepare(udc->uclk); | ||
1929 | clk_unprepare(udc->fclk); | 1962 | clk_unprepare(udc->fclk); |
1930 | clk_unprepare(udc->iclk); | 1963 | clk_unprepare(udc->iclk); |
1931 | 1964 | ||
1932 | clk_put(udc->iclk); | ||
1933 | clk_put(udc->fclk); | ||
1934 | if (IS_ENABLED(CONFIG_COMMON_CLK)) | ||
1935 | clk_put(udc->uclk); | ||
1936 | |||
1937 | return 0; | 1965 | return 0; |
1938 | } | 1966 | } |
1939 | 1967 | ||
@@ -1989,15 +2017,6 @@ static int at91udc_resume(struct platform_device *pdev) | |||
1989 | #define at91udc_resume NULL | 2017 | #define at91udc_resume NULL |
1990 | #endif | 2018 | #endif |
1991 | 2019 | ||
1992 | #if defined(CONFIG_OF) | ||
1993 | static const struct of_device_id at91_udc_dt_ids[] = { | ||
1994 | { .compatible = "atmel,at91rm9200-udc" }, | ||
1995 | { /* sentinel */ } | ||
1996 | }; | ||
1997 | |||
1998 | MODULE_DEVICE_TABLE(of, at91_udc_dt_ids); | ||
1999 | #endif | ||
2000 | |||
2001 | static struct platform_driver at91_udc_driver = { | 2020 | static struct platform_driver at91_udc_driver = { |
2002 | .remove = __exit_p(at91udc_remove), | 2021 | .remove = __exit_p(at91udc_remove), |
2003 | .shutdown = at91udc_shutdown, | 2022 | .shutdown = at91udc_shutdown, |
@@ -2005,7 +2024,7 @@ static struct platform_driver at91_udc_driver = { | |||
2005 | .resume = at91udc_resume, | 2024 | .resume = at91udc_resume, |
2006 | .driver = { | 2025 | .driver = { |
2007 | .name = (char *) driver_name, | 2026 | .name = (char *) driver_name, |
2008 | .of_match_table = of_match_ptr(at91_udc_dt_ids), | 2027 | .of_match_table = at91_udc_dt_ids, |
2009 | }, | 2028 | }, |
2010 | }; | 2029 | }; |
2011 | 2030 | ||
diff --git a/drivers/usb/gadget/udc/at91_udc.h b/drivers/usb/gadget/udc/at91_udc.h index 467dcfb74a51..2679c8b217cc 100644 --- a/drivers/usb/gadget/udc/at91_udc.h +++ b/drivers/usb/gadget/udc/at91_udc.h | |||
@@ -107,6 +107,11 @@ struct at91_ep { | |||
107 | unsigned fifo_bank:1; | 107 | unsigned fifo_bank:1; |
108 | }; | 108 | }; |
109 | 109 | ||
110 | struct at91_udc_caps { | ||
111 | int (*init)(struct at91_udc *udc); | ||
112 | void (*pullup)(struct at91_udc *udc, int is_on); | ||
113 | }; | ||
114 | |||
110 | /* | 115 | /* |
111 | * driver is non-SMP, and just blocks IRQs whenever it needs | 116 | * driver is non-SMP, and just blocks IRQs whenever it needs |
112 | * access protection for chip registers or driver state | 117 | * access protection for chip registers or driver state |
@@ -115,6 +120,7 @@ struct at91_udc { | |||
115 | struct usb_gadget gadget; | 120 | struct usb_gadget gadget; |
116 | struct at91_ep ep[NUM_ENDPOINTS]; | 121 | struct at91_ep ep[NUM_ENDPOINTS]; |
117 | struct usb_gadget_driver *driver; | 122 | struct usb_gadget_driver *driver; |
123 | const struct at91_udc_caps *caps; | ||
118 | unsigned vbus:1; | 124 | unsigned vbus:1; |
119 | unsigned enabled:1; | 125 | unsigned enabled:1; |
120 | unsigned clocked:1; | 126 | unsigned clocked:1; |
@@ -125,7 +131,7 @@ struct at91_udc { | |||
125 | unsigned active_suspend:1; | 131 | unsigned active_suspend:1; |
126 | u8 addr; | 132 | u8 addr; |
127 | struct at91_udc_data board; | 133 | struct at91_udc_data board; |
128 | struct clk *iclk, *fclk, *uclk; | 134 | struct clk *iclk, *fclk; |
129 | struct platform_device *pdev; | 135 | struct platform_device *pdev; |
130 | struct proc_dir_entry *pde; | 136 | struct proc_dir_entry *pde; |
131 | void __iomem *udp_baseaddr; | 137 | void __iomem *udp_baseaddr; |
@@ -133,6 +139,7 @@ struct at91_udc { | |||
133 | spinlock_t lock; | 139 | spinlock_t lock; |
134 | struct timer_list vbus_timer; | 140 | struct timer_list vbus_timer; |
135 | struct work_struct vbus_timer_work; | 141 | struct work_struct vbus_timer_work; |
142 | struct regmap *matrix; | ||
136 | }; | 143 | }; |
137 | 144 | ||
138 | static inline struct at91_udc *to_udc(struct usb_gadget *g) | 145 | static inline struct at91_udc *to_udc(struct usb_gadget *g) |
diff --git a/include/dt-bindings/clock/sh73a0-clock.h b/include/dt-bindings/clock/sh73a0-clock.h new file mode 100644 index 000000000000..1dd3eb2b7d90 --- /dev/null +++ b/include/dt-bindings/clock/sh73a0-clock.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * Copyright 2014 Ulrich Hecht | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | */ | ||
9 | |||
10 | #ifndef __DT_BINDINGS_CLOCK_SH73A0_H__ | ||
11 | #define __DT_BINDINGS_CLOCK_SH73A0_H__ | ||
12 | |||
13 | /* CPG */ | ||
14 | #define SH73A0_CLK_MAIN 0 | ||
15 | #define SH73A0_CLK_PLL0 1 | ||
16 | #define SH73A0_CLK_PLL1 2 | ||
17 | #define SH73A0_CLK_PLL2 3 | ||
18 | #define SH73A0_CLK_PLL3 4 | ||
19 | #define SH73A0_CLK_DSI0PHY 5 | ||
20 | #define SH73A0_CLK_DSI1PHY 6 | ||
21 | #define SH73A0_CLK_ZG 7 | ||
22 | #define SH73A0_CLK_M3 8 | ||
23 | #define SH73A0_CLK_B 9 | ||
24 | #define SH73A0_CLK_M1 10 | ||
25 | #define SH73A0_CLK_M2 11 | ||
26 | #define SH73A0_CLK_Z 12 | ||
27 | #define SH73A0_CLK_ZX 13 | ||
28 | #define SH73A0_CLK_HP 14 | ||
29 | |||
30 | /* MSTP0 */ | ||
31 | #define SH73A0_CLK_IIC2 1 | ||
32 | |||
33 | /* MSTP1 */ | ||
34 | #define SH73A0_CLK_CEU1 29 | ||
35 | #define SH73A0_CLK_CSI2_RX1 28 | ||
36 | #define SH73A0_CLK_CEU0 27 | ||
37 | #define SH73A0_CLK_CSI2_RX0 26 | ||
38 | #define SH73A0_CLK_TMU0 25 | ||
39 | #define SH73A0_CLK_DSITX0 18 | ||
40 | #define SH73A0_CLK_IIC0 16 | ||
41 | #define SH73A0_CLK_SGX 12 | ||
42 | #define SH73A0_CLK_LCDC0 0 | ||
43 | |||
44 | /* MSTP2 */ | ||
45 | #define SH73A0_CLK_SCIFA7 19 | ||
46 | #define SH73A0_CLK_SY_DMAC 18 | ||
47 | #define SH73A0_CLK_MP_DMAC 17 | ||
48 | #define SH73A0_CLK_SCIFA5 7 | ||
49 | #define SH73A0_CLK_SCIFB 6 | ||
50 | #define SH73A0_CLK_SCIFA0 4 | ||
51 | #define SH73A0_CLK_SCIFA1 3 | ||
52 | #define SH73A0_CLK_SCIFA2 2 | ||
53 | #define SH73A0_CLK_SCIFA3 1 | ||
54 | #define SH73A0_CLK_SCIFA4 0 | ||
55 | |||
56 | /* MSTP3 */ | ||
57 | #define SH73A0_CLK_SCIFA6 31 | ||
58 | #define SH73A0_CLK_CMT1 29 | ||
59 | #define SH73A0_CLK_FSI 28 | ||
60 | #define SH73A0_CLK_IRDA 25 | ||
61 | #define SH73A0_CLK_IIC1 23 | ||
62 | #define SH73A0_CLK_USB 22 | ||
63 | #define SH73A0_CLK_FLCTL 15 | ||
64 | #define SH73A0_CLK_SDHI0 14 | ||
65 | #define SH73A0_CLK_SDHI1 13 | ||
66 | #define SH73A0_CLK_MMCIF0 12 | ||
67 | #define SH73A0_CLK_SDHI2 11 | ||
68 | #define SH73A0_CLK_TPU0 4 | ||
69 | #define SH73A0_CLK_TPU1 3 | ||
70 | #define SH73A0_CLK_TPU2 2 | ||
71 | #define SH73A0_CLK_TPU3 1 | ||
72 | #define SH73A0_CLK_TPU4 0 | ||
73 | |||
74 | /* MSTP4 */ | ||
75 | #define SH73A0_CLK_IIC3 11 | ||
76 | #define SH73A0_CLK_IIC4 10 | ||
77 | #define SH73A0_CLK_KEYSC 3 | ||
78 | |||
79 | #endif | ||
diff --git a/include/linux/mfd/syscon/atmel-matrix.h b/include/linux/mfd/syscon/atmel-matrix.h new file mode 100644 index 000000000000..8293c3e2a82a --- /dev/null +++ b/include/linux/mfd/syscon/atmel-matrix.h | |||
@@ -0,0 +1,117 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2014 Atmel Corporation. | ||
3 | * | ||
4 | * Memory Controllers (MATRIX, EBI) - System peripherals registers. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _LINUX_MFD_SYSCON_ATMEL_MATRIX_H | ||
13 | #define _LINUX_MFD_SYSCON_ATMEL_MATRIX_H | ||
14 | |||
15 | #define AT91SAM9260_MATRIX_MCFG 0x00 | ||
16 | #define AT91SAM9260_MATRIX_SCFG 0x40 | ||
17 | #define AT91SAM9260_MATRIX_PRS 0x80 | ||
18 | #define AT91SAM9260_MATRIX_MRCR 0x100 | ||
19 | #define AT91SAM9260_MATRIX_EBICSA 0x11c | ||
20 | |||
21 | #define AT91SAM9261_MATRIX_MRCR 0x0 | ||
22 | #define AT91SAM9261_MATRIX_SCFG 0x4 | ||
23 | #define AT91SAM9261_MATRIX_TCR 0x24 | ||
24 | #define AT91SAM9261_MATRIX_EBICSA 0x30 | ||
25 | #define AT91SAM9261_MATRIX_USBPUCR 0x34 | ||
26 | |||
27 | #define AT91SAM9263_MATRIX_MCFG 0x00 | ||
28 | #define AT91SAM9263_MATRIX_SCFG 0x40 | ||
29 | #define AT91SAM9263_MATRIX_PRS 0x80 | ||
30 | #define AT91SAM9263_MATRIX_MRCR 0x100 | ||
31 | #define AT91SAM9263_MATRIX_TCR 0x114 | ||
32 | #define AT91SAM9263_MATRIX_EBI0CSA 0x120 | ||
33 | #define AT91SAM9263_MATRIX_EBI1CSA 0x124 | ||
34 | |||
35 | #define AT91SAM9RL_MATRIX_MCFG 0x00 | ||
36 | #define AT91SAM9RL_MATRIX_SCFG 0x40 | ||
37 | #define AT91SAM9RL_MATRIX_PRS 0x80 | ||
38 | #define AT91SAM9RL_MATRIX_MRCR 0x100 | ||
39 | #define AT91SAM9RL_MATRIX_TCR 0x114 | ||
40 | #define AT91SAM9RL_MATRIX_EBICSA 0x120 | ||
41 | |||
42 | #define AT91SAM9G45_MATRIX_MCFG 0x00 | ||
43 | #define AT91SAM9G45_MATRIX_SCFG 0x40 | ||
44 | #define AT91SAM9G45_MATRIX_PRS 0x80 | ||
45 | #define AT91SAM9G45_MATRIX_MRCR 0x100 | ||
46 | #define AT91SAM9G45_MATRIX_TCR 0x110 | ||
47 | #define AT91SAM9G45_MATRIX_DDRMPR 0x118 | ||
48 | #define AT91SAM9G45_MATRIX_EBICSA 0x128 | ||
49 | |||
50 | #define AT91SAM9N12_MATRIX_MCFG 0x00 | ||
51 | #define AT91SAM9N12_MATRIX_SCFG 0x40 | ||
52 | #define AT91SAM9N12_MATRIX_PRS 0x80 | ||
53 | #define AT91SAM9N12_MATRIX_MRCR 0x100 | ||
54 | #define AT91SAM9N12_MATRIX_EBICSA 0x118 | ||
55 | |||
56 | #define AT91SAM9X5_MATRIX_MCFG 0x00 | ||
57 | #define AT91SAM9X5_MATRIX_SCFG 0x40 | ||
58 | #define AT91SAM9X5_MATRIX_PRS 0x80 | ||
59 | #define AT91SAM9X5_MATRIX_MRCR 0x100 | ||
60 | #define AT91SAM9X5_MATRIX_EBICSA 0x120 | ||
61 | |||
62 | #define SAMA5D3_MATRIX_MCFG 0x00 | ||
63 | #define SAMA5D3_MATRIX_SCFG 0x40 | ||
64 | #define SAMA5D3_MATRIX_PRS 0x80 | ||
65 | #define SAMA5D3_MATRIX_MRCR 0x100 | ||
66 | |||
67 | #define AT91_MATRIX_MCFG(o, x) ((o) + ((x) * 0x4)) | ||
68 | #define AT91_MATRIX_ULBT GENMASK(2, 0) | ||
69 | #define AT91_MATRIX_ULBT_INFINITE (0 << 0) | ||
70 | #define AT91_MATRIX_ULBT_SINGLE (1 << 0) | ||
71 | #define AT91_MATRIX_ULBT_FOUR (2 << 0) | ||
72 | #define AT91_MATRIX_ULBT_EIGHT (3 << 0) | ||
73 | #define AT91_MATRIX_ULBT_SIXTEEN (4 << 0) | ||
74 | |||
75 | #define AT91_MATRIX_SCFG(o, x) ((o) + ((x) * 0x4)) | ||
76 | #define AT91_MATRIX_SLOT_CYCLE GENMASK(7, 0) | ||
77 | #define AT91_MATRIX_DEFMSTR_TYPE GENMASK(17, 16) | ||
78 | #define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) | ||
79 | #define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) | ||
80 | #define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) | ||
81 | #define AT91_MATRIX_FIXED_DEFMSTR GENMASK(20, 18) | ||
82 | #define AT91_MATRIX_ARBT GENMASK(25, 24) | ||
83 | #define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) | ||
84 | #define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) | ||
85 | |||
86 | #define AT91_MATRIX_ITCM_SIZE GENMASK(3, 0) | ||
87 | #define AT91_MATRIX_ITCM_0 (0 << 0) | ||
88 | #define AT91_MATRIX_ITCM_16 (5 << 0) | ||
89 | #define AT91_MATRIX_ITCM_32 (6 << 0) | ||
90 | #define AT91_MATRIX_ITCM_64 (7 << 0) | ||
91 | #define AT91_MATRIX_DTCM_SIZE GENMASK(7, 4) | ||
92 | #define AT91_MATRIX_DTCM_0 (0 << 4) | ||
93 | #define AT91_MATRIX_DTCM_16 (5 << 4) | ||
94 | #define AT91_MATRIX_DTCM_32 (6 << 4) | ||
95 | #define AT91_MATRIX_DTCM_64 (7 << 4) | ||
96 | |||
97 | #define AT91_MATRIX_PRAS(o, x) ((o) + ((x) * 0x8)) | ||
98 | #define AT91_MATRIX_PRBS(o, x) ((o) + ((x) * 0x8) + 0x4) | ||
99 | #define AT91_MATRIX_MPR(x) GENMASK(((x) * 0x4) + 1, ((x) * 0x4)) | ||
100 | |||
101 | #define AT91_MATRIX_RCB(x) BIT(x) | ||
102 | |||
103 | #define AT91_MATRIX_CSA(cs, val) (val << (cs)) | ||
104 | #define AT91_MATRIX_DBPUC BIT(8) | ||
105 | #define AT91_MATRIX_DBPDC BIT(9) | ||
106 | #define AT91_MATRIX_VDDIOMSEL BIT(16) | ||
107 | #define AT91_MATRIX_VDDIOMSEL_1_8V (0 << 16) | ||
108 | #define AT91_MATRIX_VDDIOMSEL_3_3V (1 << 16) | ||
109 | #define AT91_MATRIX_EBI_IOSR BIT(17) | ||
110 | #define AT91_MATRIX_DDR_IOSR BIT(18) | ||
111 | #define AT91_MATRIX_NFD0_SELECT BIT(24) | ||
112 | #define AT91_MATRIX_DDR_MP_EN BIT(25) | ||
113 | #define AT91_MATRIX_EBI_NUM_CS 8 | ||
114 | |||
115 | #define AT91_MATRIX_USBPUCR_PUON BIT(30) | ||
116 | |||
117 | #endif /* _LINUX_MFD_SYSCON_ATMEL_MATRIX_H */ | ||
diff --git a/include/linux/mfd/syscon/atmel-smc.h b/include/linux/mfd/syscon/atmel-smc.h new file mode 100644 index 000000000000..be6ebe64eebe --- /dev/null +++ b/include/linux/mfd/syscon/atmel-smc.h | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Atmel SMC (Static Memory Controller) register offsets and bit definitions. | ||
3 | * | ||
4 | * Copyright (C) 2014 Atmel | ||
5 | * Copyright (C) 2014 Free Electrons | ||
6 | * | ||
7 | * Author: Boris Brezillon <boris.brezillon@free-electrons.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef _LINUX_MFD_SYSCON_ATMEL_SMC_H_ | ||
15 | #define _LINUX_MFD_SYSCON_ATMEL_SMC_H_ | ||
16 | |||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/regmap.h> | ||
19 | |||
20 | #define AT91SAM9_SMC_GENERIC 0x00 | ||
21 | #define AT91SAM9_SMC_GENERIC_BLK_SZ 0x10 | ||
22 | |||
23 | #define SAMA5_SMC_GENERIC 0x600 | ||
24 | #define SAMA5_SMC_GENERIC_BLK_SZ 0x14 | ||
25 | |||
26 | #define AT91SAM9_SMC_SETUP(o) ((o) + 0x00) | ||
27 | #define AT91SAM9_SMC_NWESETUP(x) (x) | ||
28 | #define AT91SAM9_SMC_NCS_WRSETUP(x) ((x) << 8) | ||
29 | #define AT91SAM9_SMC_NRDSETUP(x) ((x) << 16) | ||
30 | #define AT91SAM9_SMC_NCS_NRDSETUP(x) ((x) << 24) | ||
31 | |||
32 | #define AT91SAM9_SMC_PULSE(o) ((o) + 0x04) | ||
33 | #define AT91SAM9_SMC_NWEPULSE(x) (x) | ||
34 | #define AT91SAM9_SMC_NCS_WRPULSE(x) ((x) << 8) | ||
35 | #define AT91SAM9_SMC_NRDPULSE(x) ((x) << 16) | ||
36 | #define AT91SAM9_SMC_NCS_NRDPULSE(x) ((x) << 24) | ||
37 | |||
38 | #define AT91SAM9_SMC_CYCLE(o) ((o) + 0x08) | ||
39 | #define AT91SAM9_SMC_NWECYCLE(x) (x) | ||
40 | #define AT91SAM9_SMC_NRDCYCLE(x) ((x) << 16) | ||
41 | |||
42 | #define AT91SAM9_SMC_MODE(o) ((o) + 0x0c) | ||
43 | #define SAMA5_SMC_MODE(o) ((o) + 0x10) | ||
44 | #define AT91_SMC_READMODE BIT(0) | ||
45 | #define AT91_SMC_READMODE_NCS (0 << 0) | ||
46 | #define AT91_SMC_READMODE_NRD (1 << 0) | ||
47 | #define AT91_SMC_WRITEMODE BIT(1) | ||
48 | #define AT91_SMC_WRITEMODE_NCS (0 << 1) | ||
49 | #define AT91_SMC_WRITEMODE_NWE (1 << 1) | ||
50 | #define AT91_SMC_EXNWMODE GENMASK(5, 4) | ||
51 | #define AT91_SMC_EXNWMODE_DISABLE (0 << 4) | ||
52 | #define AT91_SMC_EXNWMODE_FROZEN (2 << 4) | ||
53 | #define AT91_SMC_EXNWMODE_READY (3 << 4) | ||
54 | #define AT91_SMC_BAT BIT(8) | ||
55 | #define AT91_SMC_BAT_SELECT (0 << 8) | ||
56 | #define AT91_SMC_BAT_WRITE (1 << 8) | ||
57 | #define AT91_SMC_DBW GENMASK(13, 12) | ||
58 | #define AT91_SMC_DBW_8 (0 << 12) | ||
59 | #define AT91_SMC_DBW_16 (1 << 12) | ||
60 | #define AT91_SMC_DBW_32 (2 << 12) | ||
61 | #define AT91_SMC_TDF GENMASK(19, 16) | ||
62 | #define AT91_SMC_TDF_(x) ((((x) - 1) << 16) & AT91_SMC_TDF) | ||
63 | #define AT91_SMC_TDF_MAX 16 | ||
64 | #define AT91_SMC_TDFMODE_OPTIMIZED BIT(20) | ||
65 | #define AT91_SMC_PMEN BIT(24) | ||
66 | #define AT91_SMC_PS GENMASK(29, 28) | ||
67 | #define AT91_SMC_PS_4 (0 << 28) | ||
68 | #define AT91_SMC_PS_8 (1 << 28) | ||
69 | #define AT91_SMC_PS_16 (2 << 28) | ||
70 | #define AT91_SMC_PS_32 (3 << 28) | ||
71 | |||
72 | |||
73 | /* | ||
74 | * This function converts a setup timing expressed in nanoseconds into an | ||
75 | * encoded value that can be written in the SMC_SETUP register. | ||
76 | * | ||
77 | * The following formula is described in atmel datasheets (section | ||
78 | * "SMC Setup Register"): | ||
79 | * | ||
80 | * setup length = (128* SETUP[5] + SETUP[4:0]) | ||
81 | * | ||
82 | * where setup length is the timing expressed in cycles. | ||
83 | */ | ||
84 | static inline u32 at91sam9_smc_setup_ns_to_cycles(unsigned int clk_rate, | ||
85 | u32 timing_ns) | ||
86 | { | ||
87 | u32 clk_period = DIV_ROUND_UP(NSEC_PER_SEC, clk_rate); | ||
88 | u32 coded_cycles = 0; | ||
89 | u32 cycles; | ||
90 | |||
91 | cycles = DIV_ROUND_UP(timing_ns, clk_period); | ||
92 | if (cycles / 32) { | ||
93 | coded_cycles |= 1 << 5; | ||
94 | if (cycles < 128) | ||
95 | cycles = 0; | ||
96 | } | ||
97 | |||
98 | coded_cycles |= cycles % 32; | ||
99 | |||
100 | return coded_cycles; | ||
101 | } | ||
102 | |||
103 | /* | ||
104 | * This function converts a pulse timing expressed in nanoseconds into an | ||
105 | * encoded value that can be written in the SMC_PULSE register. | ||
106 | * | ||
107 | * The following formula is described in atmel datasheets (section | ||
108 | * "SMC Pulse Register"): | ||
109 | * | ||
110 | * pulse length = (256* PULSE[6] + PULSE[5:0]) | ||
111 | * | ||
112 | * where pulse length is the timing expressed in cycles. | ||
113 | */ | ||
114 | static inline u32 at91sam9_smc_pulse_ns_to_cycles(unsigned int clk_rate, | ||
115 | u32 timing_ns) | ||
116 | { | ||
117 | u32 clk_period = DIV_ROUND_UP(NSEC_PER_SEC, clk_rate); | ||
118 | u32 coded_cycles = 0; | ||
119 | u32 cycles; | ||
120 | |||
121 | cycles = DIV_ROUND_UP(timing_ns, clk_period); | ||
122 | if (cycles / 64) { | ||
123 | coded_cycles |= 1 << 6; | ||
124 | if (cycles < 256) | ||
125 | cycles = 0; | ||
126 | } | ||
127 | |||
128 | coded_cycles |= cycles % 64; | ||
129 | |||
130 | return coded_cycles; | ||
131 | } | ||
132 | |||
133 | /* | ||
134 | * This function converts a cycle timing expressed in nanoseconds into an | ||
135 | * encoded value that can be written in the SMC_CYCLE register. | ||
136 | * | ||
137 | * The following formula is described in atmel datasheets (section | ||
138 | * "SMC Cycle Register"): | ||
139 | * | ||
140 | * cycle length = (CYCLE[8:7]*256 + CYCLE[6:0]) | ||
141 | * | ||
142 | * where cycle length is the timing expressed in cycles. | ||
143 | */ | ||
144 | static inline u32 at91sam9_smc_cycle_ns_to_cycles(unsigned int clk_rate, | ||
145 | u32 timing_ns) | ||
146 | { | ||
147 | u32 clk_period = DIV_ROUND_UP(NSEC_PER_SEC, clk_rate); | ||
148 | u32 coded_cycles = 0; | ||
149 | u32 cycles; | ||
150 | |||
151 | cycles = DIV_ROUND_UP(timing_ns, clk_period); | ||
152 | if (cycles / 128) { | ||
153 | coded_cycles = cycles / 256; | ||
154 | cycles %= 256; | ||
155 | if (cycles >= 128) { | ||
156 | coded_cycles++; | ||
157 | cycles = 0; | ||
158 | } | ||
159 | |||
160 | if (coded_cycles > 0x3) { | ||
161 | coded_cycles = 0x3; | ||
162 | cycles = 0x7f; | ||
163 | } | ||
164 | |||
165 | coded_cycles <<= 7; | ||
166 | } | ||
167 | |||
168 | coded_cycles |= cycles % 128; | ||
169 | |||
170 | return coded_cycles; | ||
171 | } | ||
172 | |||
173 | #endif /* _LINUX_MFD_SYSCON_ATMEL_SMC_H_ */ | ||
diff --git a/include/linux/platform_data/cpuidle-exynos.h b/include/linux/platform_data/cpuidle-exynos.h new file mode 100644 index 000000000000..bfa40e4c5d5f --- /dev/null +++ b/include/linux/platform_data/cpuidle-exynos.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Samsung Electronics Co., Ltd. | ||
3 | * http://www.samsung.com | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | */ | ||
9 | |||
10 | #ifndef __CPUIDLE_EXYNOS_H | ||
11 | #define __CPUIDLE_EXYNOS_H | ||
12 | |||
13 | struct cpuidle_exynos_data { | ||
14 | int (*cpu0_enter_aftr)(void); | ||
15 | int (*cpu1_powerdown)(void); | ||
16 | void (*pre_enter_aftr)(void); | ||
17 | void (*post_enter_aftr)(void); | ||
18 | }; | ||
19 | |||
20 | #endif | ||