diff options
Diffstat (limited to 'arch/arm')
216 files changed, 2362 insertions, 4159 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 32e215fd91ec..7af7d1368942 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -15,6 +15,7 @@ config ARM | |||
15 | select GENERIC_IRQ_SHOW | 15 | select GENERIC_IRQ_SHOW |
16 | select GENERIC_PCI_IOMAP | 16 | select GENERIC_PCI_IOMAP |
17 | select GENERIC_SMP_IDLE_THREAD | 17 | select GENERIC_SMP_IDLE_THREAD |
18 | select GENERIC_IDLE_POLL_SETUP | ||
18 | select GENERIC_STRNCPY_FROM_USER | 19 | select GENERIC_STRNCPY_FROM_USER |
19 | select GENERIC_STRNLEN_USER | 20 | select GENERIC_STRNLEN_USER |
20 | select HARDIRQS_SW_RESEND | 21 | select HARDIRQS_SW_RESEND |
@@ -544,6 +545,8 @@ config ARCH_IXP4XX | |||
544 | select GENERIC_CLOCKEVENTS | 545 | select GENERIC_CLOCKEVENTS |
545 | select MIGHT_HAVE_PCI | 546 | select MIGHT_HAVE_PCI |
546 | select NEED_MACH_IO_H | 547 | select NEED_MACH_IO_H |
548 | select USB_EHCI_BIG_ENDIAN_MMIO | ||
549 | select USB_EHCI_BIG_ENDIAN_DESC | ||
547 | help | 550 | help |
548 | Support for Intel's IXP4XX (XScale) family of processors. | 551 | Support for Intel's IXP4XX (XScale) family of processors. |
549 | 552 | ||
@@ -2153,33 +2156,8 @@ endmenu | |||
2153 | menu "CPU Power Management" | 2156 | menu "CPU Power Management" |
2154 | 2157 | ||
2155 | if ARCH_HAS_CPUFREQ | 2158 | if ARCH_HAS_CPUFREQ |
2156 | |||
2157 | source "drivers/cpufreq/Kconfig" | 2159 | source "drivers/cpufreq/Kconfig" |
2158 | 2160 | ||
2159 | config CPU_FREQ_SA1100 | ||
2160 | bool | ||
2161 | |||
2162 | config CPU_FREQ_SA1110 | ||
2163 | bool | ||
2164 | |||
2165 | config CPU_FREQ_INTEGRATOR | ||
2166 | tristate "CPUfreq driver for ARM Integrator CPUs" | ||
2167 | depends on ARCH_INTEGRATOR && CPU_FREQ | ||
2168 | default y | ||
2169 | help | ||
2170 | This enables the CPUfreq driver for ARM Integrator CPUs. | ||
2171 | |||
2172 | For details, take a look at <file:Documentation/cpu-freq>. | ||
2173 | |||
2174 | If in doubt, say Y. | ||
2175 | |||
2176 | config CPU_FREQ_PXA | ||
2177 | bool | ||
2178 | depends on CPU_FREQ && ARCH_PXA && PXA25x | ||
2179 | default y | ||
2180 | select CPU_FREQ_DEFAULT_GOV_USERSPACE | ||
2181 | select CPU_FREQ_TABLE | ||
2182 | |||
2183 | config CPU_FREQ_S3C | 2161 | config CPU_FREQ_S3C |
2184 | bool | 2162 | bool |
2185 | help | 2163 | help |
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 0957645b73af..91fe4f148f80 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi | |||
@@ -349,7 +349,7 @@ | |||
349 | rx_descs = <64>; | 349 | rx_descs = <64>; |
350 | mac_control = <0x20>; | 350 | mac_control = <0x20>; |
351 | slaves = <2>; | 351 | slaves = <2>; |
352 | cpts_active_slave = <0>; | 352 | active_slave = <0>; |
353 | cpts_clock_mult = <0x80000000>; | 353 | cpts_clock_mult = <0x80000000>; |
354 | cpts_clock_shift = <29>; | 354 | cpts_clock_shift = <29>; |
355 | reg = <0x4a100000 0x800 | 355 | reg = <0x4a100000 0x800 |
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index cb7bcc51608d..39253b9aedd1 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
@@ -322,6 +322,24 @@ | |||
322 | }; | 322 | }; |
323 | }; | 323 | }; |
324 | 324 | ||
325 | spi0 { | ||
326 | pinctrl_spi0: spi0-0 { | ||
327 | atmel,pins = | ||
328 | <0 0 0x1 0x0 /* PA0 periph A SPI0_MISO pin */ | ||
329 | 0 1 0x1 0x0 /* PA1 periph A SPI0_MOSI pin */ | ||
330 | 0 2 0x1 0x0>; /* PA2 periph A SPI0_SPCK pin */ | ||
331 | }; | ||
332 | }; | ||
333 | |||
334 | spi1 { | ||
335 | pinctrl_spi1: spi1-0 { | ||
336 | atmel,pins = | ||
337 | <1 0 0x1 0x0 /* PB0 periph A SPI1_MISO pin */ | ||
338 | 1 1 0x1 0x0 /* PB1 periph A SPI1_MOSI pin */ | ||
339 | 1 2 0x1 0x0>; /* PB2 periph A SPI1_SPCK pin */ | ||
340 | }; | ||
341 | }; | ||
342 | |||
325 | pioA: gpio@fffff400 { | 343 | pioA: gpio@fffff400 { |
326 | compatible = "atmel,at91rm9200-gpio"; | 344 | compatible = "atmel,at91rm9200-gpio"; |
327 | reg = <0xfffff400 0x200>; | 345 | reg = <0xfffff400 0x200>; |
@@ -471,6 +489,28 @@ | |||
471 | status = "disabled"; | 489 | status = "disabled"; |
472 | }; | 490 | }; |
473 | 491 | ||
492 | spi0: spi@fffc8000 { | ||
493 | #address-cells = <1>; | ||
494 | #size-cells = <0>; | ||
495 | compatible = "atmel,at91rm9200-spi"; | ||
496 | reg = <0xfffc8000 0x200>; | ||
497 | interrupts = <12 4 3>; | ||
498 | pinctrl-names = "default"; | ||
499 | pinctrl-0 = <&pinctrl_spi0>; | ||
500 | status = "disabled"; | ||
501 | }; | ||
502 | |||
503 | spi1: spi@fffcc000 { | ||
504 | #address-cells = <1>; | ||
505 | #size-cells = <0>; | ||
506 | compatible = "atmel,at91rm9200-spi"; | ||
507 | reg = <0xfffcc000 0x200>; | ||
508 | interrupts = <13 4 3>; | ||
509 | pinctrl-names = "default"; | ||
510 | pinctrl-0 = <&pinctrl_spi1>; | ||
511 | status = "disabled"; | ||
512 | }; | ||
513 | |||
474 | adc0: adc@fffe0000 { | 514 | adc0: adc@fffe0000 { |
475 | compatible = "atmel,at91sam9260-adc"; | 515 | compatible = "atmel,at91sam9260-adc"; |
476 | reg = <0xfffe0000 0x100>; | 516 | reg = <0xfffe0000 0x100>; |
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 271d4de026e9..94b58ab2cc08 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
@@ -303,6 +303,24 @@ | |||
303 | }; | 303 | }; |
304 | }; | 304 | }; |
305 | 305 | ||
306 | spi0 { | ||
307 | pinctrl_spi0: spi0-0 { | ||
308 | atmel,pins = | ||
309 | <0 0 0x2 0x0 /* PA0 periph B SPI0_MISO pin */ | ||
310 | 0 1 0x2 0x0 /* PA1 periph B SPI0_MOSI pin */ | ||
311 | 0 2 0x2 0x0>; /* PA2 periph B SPI0_SPCK pin */ | ||
312 | }; | ||
313 | }; | ||
314 | |||
315 | spi1 { | ||
316 | pinctrl_spi1: spi1-0 { | ||
317 | atmel,pins = | ||
318 | <1 12 0x1 0x0 /* PB12 periph A SPI1_MISO pin */ | ||
319 | 1 13 0x1 0x0 /* PB13 periph A SPI1_MOSI pin */ | ||
320 | 1 14 0x1 0x0>; /* PB14 periph A SPI1_SPCK pin */ | ||
321 | }; | ||
322 | }; | ||
323 | |||
306 | pioA: gpio@fffff200 { | 324 | pioA: gpio@fffff200 { |
307 | compatible = "atmel,at91rm9200-gpio"; | 325 | compatible = "atmel,at91rm9200-gpio"; |
308 | reg = <0xfffff200 0x200>; | 326 | reg = <0xfffff200 0x200>; |
@@ -462,6 +480,28 @@ | |||
462 | reg = <0xfffffd40 0x10>; | 480 | reg = <0xfffffd40 0x10>; |
463 | status = "disabled"; | 481 | status = "disabled"; |
464 | }; | 482 | }; |
483 | |||
484 | spi0: spi@fffa4000 { | ||
485 | #address-cells = <1>; | ||
486 | #size-cells = <0>; | ||
487 | compatible = "atmel,at91rm9200-spi"; | ||
488 | reg = <0xfffa4000 0x200>; | ||
489 | interrupts = <14 4 3>; | ||
490 | pinctrl-names = "default"; | ||
491 | pinctrl-0 = <&pinctrl_spi0>; | ||
492 | status = "disabled"; | ||
493 | }; | ||
494 | |||
495 | spi1: spi@fffa8000 { | ||
496 | #address-cells = <1>; | ||
497 | #size-cells = <0>; | ||
498 | compatible = "atmel,at91rm9200-spi"; | ||
499 | reg = <0xfffa8000 0x200>; | ||
500 | interrupts = <15 4 3>; | ||
501 | pinctrl-names = "default"; | ||
502 | pinctrl-0 = <&pinctrl_spi1>; | ||
503 | status = "disabled"; | ||
504 | }; | ||
465 | }; | 505 | }; |
466 | 506 | ||
467 | nand0: nand@40000000 { | 507 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9263ek.dts b/arch/arm/boot/dts/at91sam9263ek.dts index 1eb08728f527..a14e424b2e81 100644 --- a/arch/arm/boot/dts/at91sam9263ek.dts +++ b/arch/arm/boot/dts/at91sam9263ek.dts | |||
@@ -79,6 +79,16 @@ | |||
79 | }; | 79 | }; |
80 | }; | 80 | }; |
81 | }; | 81 | }; |
82 | |||
83 | spi0: spi@fffa4000 { | ||
84 | status = "okay"; | ||
85 | cs-gpios = <&pioA 5 0>, <0>, <0>, <0>; | ||
86 | mtd_dataflash@0 { | ||
87 | compatible = "atmel,at45", "atmel,dataflash"; | ||
88 | spi-max-frequency = <50000000>; | ||
89 | reg = <0>; | ||
90 | }; | ||
91 | }; | ||
82 | }; | 92 | }; |
83 | 93 | ||
84 | nand0: nand@40000000 { | 94 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi index da15e83e7f17..23d1f468f27f 100644 --- a/arch/arm/boot/dts/at91sam9g20ek_common.dtsi +++ b/arch/arm/boot/dts/at91sam9g20ek_common.dtsi | |||
@@ -96,6 +96,16 @@ | |||
96 | status = "okay"; | 96 | status = "okay"; |
97 | pinctrl-0 = <&pinctrl_ssc0_tx>; | 97 | pinctrl-0 = <&pinctrl_ssc0_tx>; |
98 | }; | 98 | }; |
99 | |||
100 | spi0: spi@fffc8000 { | ||
101 | status = "okay"; | ||
102 | cs-gpios = <0>, <&pioC 11 0>, <0>, <0>; | ||
103 | mtd_dataflash@0 { | ||
104 | compatible = "atmel,at45", "atmel,dataflash"; | ||
105 | spi-max-frequency = <50000000>; | ||
106 | reg = <1>; | ||
107 | }; | ||
108 | }; | ||
99 | }; | 109 | }; |
100 | 110 | ||
101 | nand0: nand@40000000 { | 111 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 6b1d4cab24c2..cfdf429578b5 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
@@ -322,6 +322,24 @@ | |||
322 | }; | 322 | }; |
323 | }; | 323 | }; |
324 | 324 | ||
325 | spi0 { | ||
326 | pinctrl_spi0: spi0-0 { | ||
327 | atmel,pins = | ||
328 | <1 0 0x1 0x0 /* PB0 periph A SPI0_MISO pin */ | ||
329 | 1 1 0x1 0x0 /* PB1 periph A SPI0_MOSI pin */ | ||
330 | 1 2 0x1 0x0>; /* PB2 periph A SPI0_SPCK pin */ | ||
331 | }; | ||
332 | }; | ||
333 | |||
334 | spi1 { | ||
335 | pinctrl_spi1: spi1-0 { | ||
336 | atmel,pins = | ||
337 | <1 14 0x1 0x0 /* PB14 periph A SPI1_MISO pin */ | ||
338 | 1 15 0x1 0x0 /* PB15 periph A SPI1_MOSI pin */ | ||
339 | 1 16 0x1 0x0>; /* PB16 periph A SPI1_SPCK pin */ | ||
340 | }; | ||
341 | }; | ||
342 | |||
325 | pioA: gpio@fffff200 { | 343 | pioA: gpio@fffff200 { |
326 | compatible = "atmel,at91rm9200-gpio"; | 344 | compatible = "atmel,at91rm9200-gpio"; |
327 | reg = <0xfffff200 0x200>; | 345 | reg = <0xfffff200 0x200>; |
@@ -531,6 +549,28 @@ | |||
531 | reg = <0xfffffd40 0x10>; | 549 | reg = <0xfffffd40 0x10>; |
532 | status = "disabled"; | 550 | status = "disabled"; |
533 | }; | 551 | }; |
552 | |||
553 | spi0: spi@fffa4000 { | ||
554 | #address-cells = <1>; | ||
555 | #size-cells = <0>; | ||
556 | compatible = "atmel,at91rm9200-spi"; | ||
557 | reg = <0xfffa4000 0x200>; | ||
558 | interrupts = <14 4 3>; | ||
559 | pinctrl-names = "default"; | ||
560 | pinctrl-0 = <&pinctrl_spi0>; | ||
561 | status = "disabled"; | ||
562 | }; | ||
563 | |||
564 | spi1: spi@fffa8000 { | ||
565 | #address-cells = <1>; | ||
566 | #size-cells = <0>; | ||
567 | compatible = "atmel,at91rm9200-spi"; | ||
568 | reg = <0xfffa8000 0x200>; | ||
569 | interrupts = <15 4 3>; | ||
570 | pinctrl-names = "default"; | ||
571 | pinctrl-0 = <&pinctrl_spi1>; | ||
572 | status = "disabled"; | ||
573 | }; | ||
534 | }; | 574 | }; |
535 | 575 | ||
536 | nand0: nand@40000000 { | 576 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index 20c31913c270..92c52a7d70bc 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
@@ -102,6 +102,16 @@ | |||
102 | }; | 102 | }; |
103 | }; | 103 | }; |
104 | }; | 104 | }; |
105 | |||
106 | spi0: spi@fffa4000{ | ||
107 | status = "okay"; | ||
108 | cs-gpios = <&pioB 3 0>, <0>, <0>, <0>; | ||
109 | mtd_dataflash@0 { | ||
110 | compatible = "atmel,at45", "atmel,dataflash"; | ||
111 | spi-max-frequency = <13000000>; | ||
112 | reg = <0>; | ||
113 | }; | ||
114 | }; | ||
105 | }; | 115 | }; |
106 | 116 | ||
107 | nand0: nand@40000000 { | 117 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index 7750f98dd764..b2961f1ea51b 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
@@ -261,6 +261,24 @@ | |||
261 | }; | 261 | }; |
262 | }; | 262 | }; |
263 | 263 | ||
264 | spi0 { | ||
265 | pinctrl_spi0: spi0-0 { | ||
266 | atmel,pins = | ||
267 | <0 11 0x1 0x0 /* PA11 periph A SPI0_MISO pin */ | ||
268 | 0 12 0x1 0x0 /* PA12 periph A SPI0_MOSI pin */ | ||
269 | 0 13 0x1 0x0>; /* PA13 periph A SPI0_SPCK pin */ | ||
270 | }; | ||
271 | }; | ||
272 | |||
273 | spi1 { | ||
274 | pinctrl_spi1: spi1-0 { | ||
275 | atmel,pins = | ||
276 | <0 21 0x2 0x0 /* PA21 periph B SPI1_MISO pin */ | ||
277 | 0 22 0x2 0x0 /* PA22 periph B SPI1_MOSI pin */ | ||
278 | 0 23 0x2 0x0>; /* PA23 periph B SPI1_SPCK pin */ | ||
279 | }; | ||
280 | }; | ||
281 | |||
264 | pioA: gpio@fffff400 { | 282 | pioA: gpio@fffff400 { |
265 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 283 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; |
266 | reg = <0xfffff400 0x200>; | 284 | reg = <0xfffff400 0x200>; |
@@ -373,6 +391,28 @@ | |||
373 | #size-cells = <0>; | 391 | #size-cells = <0>; |
374 | status = "disabled"; | 392 | status = "disabled"; |
375 | }; | 393 | }; |
394 | |||
395 | spi0: spi@f0000000 { | ||
396 | #address-cells = <1>; | ||
397 | #size-cells = <0>; | ||
398 | compatible = "atmel,at91rm9200-spi"; | ||
399 | reg = <0xf0000000 0x100>; | ||
400 | interrupts = <13 4 3>; | ||
401 | pinctrl-names = "default"; | ||
402 | pinctrl-0 = <&pinctrl_spi0>; | ||
403 | status = "disabled"; | ||
404 | }; | ||
405 | |||
406 | spi1: spi@f0004000 { | ||
407 | #address-cells = <1>; | ||
408 | #size-cells = <0>; | ||
409 | compatible = "atmel,at91rm9200-spi"; | ||
410 | reg = <0xf0004000 0x100>; | ||
411 | interrupts = <14 4 3>; | ||
412 | pinctrl-names = "default"; | ||
413 | pinctrl-0 = <&pinctrl_spi1>; | ||
414 | status = "disabled"; | ||
415 | }; | ||
376 | }; | 416 | }; |
377 | 417 | ||
378 | nand0: nand@40000000 { | 418 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index d400f8de4387..34c842b1efb2 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts | |||
@@ -67,6 +67,16 @@ | |||
67 | }; | 67 | }; |
68 | }; | 68 | }; |
69 | }; | 69 | }; |
70 | |||
71 | spi0: spi@f0000000 { | ||
72 | status = "okay"; | ||
73 | cs-gpios = <&pioA 14 0>, <0>, <0>, <0>; | ||
74 | m25p80@0 { | ||
75 | compatible = "atmel,at25df321a"; | ||
76 | spi-max-frequency = <50000000>; | ||
77 | reg = <0>; | ||
78 | }; | ||
79 | }; | ||
70 | }; | 80 | }; |
71 | 81 | ||
72 | nand0: nand@40000000 { | 82 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index a98c0d50fbbe..347b438d47fa 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
@@ -343,6 +343,24 @@ | |||
343 | }; | 343 | }; |
344 | }; | 344 | }; |
345 | 345 | ||
346 | spi0 { | ||
347 | pinctrl_spi0: spi0-0 { | ||
348 | atmel,pins = | ||
349 | <0 11 0x1 0x0 /* PA11 periph A SPI0_MISO pin */ | ||
350 | 0 12 0x1 0x0 /* PA12 periph A SPI0_MOSI pin */ | ||
351 | 0 13 0x1 0x0>; /* PA13 periph A SPI0_SPCK pin */ | ||
352 | }; | ||
353 | }; | ||
354 | |||
355 | spi1 { | ||
356 | pinctrl_spi1: spi1-0 { | ||
357 | atmel,pins = | ||
358 | <0 21 0x2 0x0 /* PA21 periph B SPI1_MISO pin */ | ||
359 | 0 22 0x2 0x0 /* PA22 periph B SPI1_MOSI pin */ | ||
360 | 0 23 0x2 0x0>; /* PA23 periph B SPI1_SPCK pin */ | ||
361 | }; | ||
362 | }; | ||
363 | |||
346 | pioA: gpio@fffff400 { | 364 | pioA: gpio@fffff400 { |
347 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; | 365 | compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio"; |
348 | reg = <0xfffff400 0x200>; | 366 | reg = <0xfffff400 0x200>; |
@@ -529,6 +547,28 @@ | |||
529 | trigger-value = <0x6>; | 547 | trigger-value = <0x6>; |
530 | }; | 548 | }; |
531 | }; | 549 | }; |
550 | |||
551 | spi0: spi@f0000000 { | ||
552 | #address-cells = <1>; | ||
553 | #size-cells = <0>; | ||
554 | compatible = "atmel,at91rm9200-spi"; | ||
555 | reg = <0xf0000000 0x100>; | ||
556 | interrupts = <13 4 3>; | ||
557 | pinctrl-names = "default"; | ||
558 | pinctrl-0 = <&pinctrl_spi0>; | ||
559 | status = "disabled"; | ||
560 | }; | ||
561 | |||
562 | spi1: spi@f0004000 { | ||
563 | #address-cells = <1>; | ||
564 | #size-cells = <0>; | ||
565 | compatible = "atmel,at91rm9200-spi"; | ||
566 | reg = <0xf0004000 0x100>; | ||
567 | interrupts = <14 4 3>; | ||
568 | pinctrl-names = "default"; | ||
569 | pinctrl-0 = <&pinctrl_spi1>; | ||
570 | status = "disabled"; | ||
571 | }; | ||
532 | }; | 572 | }; |
533 | 573 | ||
534 | nand0: nand@40000000 { | 574 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi index 8a7cf1d9cf5d..09f5e667ca7a 100644 --- a/arch/arm/boot/dts/at91sam9x5ek.dtsi +++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi | |||
@@ -84,6 +84,16 @@ | |||
84 | }; | 84 | }; |
85 | }; | 85 | }; |
86 | }; | 86 | }; |
87 | |||
88 | spi0: spi@f0000000 { | ||
89 | status = "okay"; | ||
90 | cs-gpios = <&pioA 14 0>, <0>, <0>, <0>; | ||
91 | m25p80@0 { | ||
92 | compatible = "atmel,at25df321a"; | ||
93 | spi-max-frequency = <50000000>; | ||
94 | reg = <0>; | ||
95 | }; | ||
96 | }; | ||
87 | }; | 97 | }; |
88 | 98 | ||
89 | usb0: ohci@00600000 { | 99 | usb0: ohci@00600000 { |
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/dbx5x0.dtsi index aaa63d0a8096..b6bc4ff17f26 100644 --- a/arch/arm/boot/dts/dbx5x0.dtsi +++ b/arch/arm/boot/dts/dbx5x0.dtsi | |||
@@ -191,7 +191,7 @@ | |||
191 | 191 | ||
192 | prcmu: prcmu@80157000 { | 192 | prcmu: prcmu@80157000 { |
193 | compatible = "stericsson,db8500-prcmu"; | 193 | compatible = "stericsson,db8500-prcmu"; |
194 | reg = <0x80157000 0x1000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>; | 194 | reg = <0x80157000 0x2000>, <0x801b0000 0x8000>, <0x801b8000 0x1000>; |
195 | reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm"; | 195 | reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm"; |
196 | interrupts = <0 47 0x4>; | 196 | interrupts = <0 47 0x4>; |
197 | #address-cells = <1>; | 197 | #address-cells = <1>; |
@@ -674,10 +674,13 @@ | |||
674 | compatible = "regulator-gpio"; | 674 | compatible = "regulator-gpio"; |
675 | 675 | ||
676 | regulator-min-microvolt = <1800000>; | 676 | regulator-min-microvolt = <1800000>; |
677 | regulator-max-microvolt = <2600000>; | 677 | regulator-max-microvolt = <2900000>; |
678 | regulator-name = "mmci-reg"; | 678 | regulator-name = "mmci-reg"; |
679 | regulator-type = "voltage"; | 679 | regulator-type = "voltage"; |
680 | 680 | ||
681 | startup-delay-us = <100>; | ||
682 | enable-active-high; | ||
683 | |||
681 | states = <1800000 0x1 | 684 | states = <1800000 0x1 |
682 | 2900000 0x0>; | 685 | 2900000 0x0>; |
683 | 686 | ||
diff --git a/arch/arm/boot/dts/href.dtsi b/arch/arm/boot/dts/href.dtsi index 379128eb9d98..c0bc426952ea 100644 --- a/arch/arm/boot/dts/href.dtsi +++ b/arch/arm/boot/dts/href.dtsi | |||
@@ -87,6 +87,7 @@ | |||
87 | mmc-cap-sd-highspeed; | 87 | mmc-cap-sd-highspeed; |
88 | mmc-cap-mmc-highspeed; | 88 | mmc-cap-mmc-highspeed; |
89 | vmmc-supply = <&ab8500_ldo_aux3_reg>; | 89 | vmmc-supply = <&ab8500_ldo_aux3_reg>; |
90 | vqmmc-supply = <&vmmci>; | ||
90 | 91 | ||
91 | cd-gpios = <&tc3589x_gpio 3 0x4>; | 92 | cd-gpios = <&tc3589x_gpio 3 0x4>; |
92 | 93 | ||
diff --git a/arch/arm/boot/dts/hrefprev60.dts b/arch/arm/boot/dts/hrefprev60.dts index eec29c4a86dc..c2d274815923 100644 --- a/arch/arm/boot/dts/hrefprev60.dts +++ b/arch/arm/boot/dts/hrefprev60.dts | |||
@@ -25,6 +25,14 @@ | |||
25 | }; | 25 | }; |
26 | 26 | ||
27 | soc-u9500 { | 27 | soc-u9500 { |
28 | prcmu@80157000 { | ||
29 | ab8500@5 { | ||
30 | ab8500-gpio { | ||
31 | compatible = "stericsson,ab8500-gpio"; | ||
32 | }; | ||
33 | }; | ||
34 | }; | ||
35 | |||
28 | i2c@80004000 { | 36 | i2c@80004000 { |
29 | tps61052@33 { | 37 | tps61052@33 { |
30 | compatible = "tps61052"; | 38 | compatible = "tps61052"; |
@@ -40,7 +48,7 @@ | |||
40 | 48 | ||
41 | vmmci: regulator-gpio { | 49 | vmmci: regulator-gpio { |
42 | gpios = <&tc3589x_gpio 18 0x4>; | 50 | gpios = <&tc3589x_gpio 18 0x4>; |
43 | gpio-enable = <&tc3589x_gpio 17 0x4>; | 51 | enable-gpio = <&tc3589x_gpio 17 0x4>; |
44 | 52 | ||
45 | status = "okay"; | 53 | status = "okay"; |
46 | }; | 54 | }; |
diff --git a/arch/arm/boot/dts/msm8660-surf.dts b/arch/arm/boot/dts/msm8660-surf.dts index 31f2157cd7d7..67f8670c4d6a 100644 --- a/arch/arm/boot/dts/msm8660-surf.dts +++ b/arch/arm/boot/dts/msm8660-surf.dts | |||
@@ -38,4 +38,10 @@ | |||
38 | <0x19c00000 0x1000>; | 38 | <0x19c00000 0x1000>; |
39 | interrupts = <0 195 0x0>; | 39 | interrupts = <0 195 0x0>; |
40 | }; | 40 | }; |
41 | |||
42 | qcom,ssbi@500000 { | ||
43 | compatible = "qcom,ssbi"; | ||
44 | reg = <0x500000 0x1000>; | ||
45 | qcom,controller-type = "pmic-arbiter"; | ||
46 | }; | ||
41 | }; | 47 | }; |
diff --git a/arch/arm/boot/dts/msm8960-cdp.dts b/arch/arm/boot/dts/msm8960-cdp.dts index 9e621b5ad3dd..c9b09a813a4b 100644 --- a/arch/arm/boot/dts/msm8960-cdp.dts +++ b/arch/arm/boot/dts/msm8960-cdp.dts | |||
@@ -38,4 +38,10 @@ | |||
38 | <0x16400000 0x1000>; | 38 | <0x16400000 0x1000>; |
39 | interrupts = <0 154 0x0>; | 39 | interrupts = <0 154 0x0>; |
40 | }; | 40 | }; |
41 | |||
42 | qcom,ssbi@500000 { | ||
43 | compatible = "qcom,ssbi"; | ||
44 | reg = <0x500000 0x1000>; | ||
45 | qcom,controller-type = "pmic-arbiter"; | ||
46 | }; | ||
41 | }; | 47 | }; |
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/snowball.dts index d3ec32f6b790..db5db24fd544 100644 --- a/arch/arm/boot/dts/snowball.dts +++ b/arch/arm/boot/dts/snowball.dts | |||
@@ -299,6 +299,10 @@ | |||
299 | }; | 299 | }; |
300 | 300 | ||
301 | ab8500 { | 301 | ab8500 { |
302 | ab8500-gpio { | ||
303 | compatible = "stericsson,ab8500-gpio"; | ||
304 | }; | ||
305 | |||
302 | ab8500-regulators { | 306 | ab8500-regulators { |
303 | ab8500_ldo_aux1_reg: ab8500_ldo_aux1 { | 307 | ab8500_ldo_aux1_reg: ab8500_ldo_aux1 { |
304 | regulator-name = "V-DISPLAY"; | 308 | regulator-name = "V-DISPLAY"; |
diff --git a/arch/arm/boot/dts/spear1310.dtsi b/arch/arm/boot/dts/spear1310.dtsi index 1513c1927cc8..122ae94076c8 100644 --- a/arch/arm/boot/dts/spear1310.dtsi +++ b/arch/arm/boot/dts/spear1310.dtsi | |||
@@ -89,7 +89,7 @@ | |||
89 | pinmux: pinmux@e0700000 { | 89 | pinmux: pinmux@e0700000 { |
90 | compatible = "st,spear1310-pinmux"; | 90 | compatible = "st,spear1310-pinmux"; |
91 | reg = <0xe0700000 0x1000>; | 91 | reg = <0xe0700000 0x1000>; |
92 | #gpio-range-cells = <2>; | 92 | #gpio-range-cells = <3>; |
93 | }; | 93 | }; |
94 | 94 | ||
95 | apb { | 95 | apb { |
@@ -212,7 +212,7 @@ | |||
212 | interrupt-controller; | 212 | interrupt-controller; |
213 | gpio-controller; | 213 | gpio-controller; |
214 | #gpio-cells = <2>; | 214 | #gpio-cells = <2>; |
215 | gpio-ranges = <&pinmux 0 246>; | 215 | gpio-ranges = <&pinmux 0 0 246>; |
216 | status = "disabled"; | 216 | status = "disabled"; |
217 | 217 | ||
218 | st-plgpio,ngpio = <246>; | 218 | st-plgpio,ngpio = <246>; |
diff --git a/arch/arm/boot/dts/spear1340.dtsi b/arch/arm/boot/dts/spear1340.dtsi index 34da11aa6795..c511c4772efd 100644 --- a/arch/arm/boot/dts/spear1340.dtsi +++ b/arch/arm/boot/dts/spear1340.dtsi | |||
@@ -63,7 +63,7 @@ | |||
63 | pinmux: pinmux@e0700000 { | 63 | pinmux: pinmux@e0700000 { |
64 | compatible = "st,spear1340-pinmux"; | 64 | compatible = "st,spear1340-pinmux"; |
65 | reg = <0xe0700000 0x1000>; | 65 | reg = <0xe0700000 0x1000>; |
66 | #gpio-range-cells = <2>; | 66 | #gpio-range-cells = <3>; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | pwm: pwm@e0180000 { | 69 | pwm: pwm@e0180000 { |
@@ -127,7 +127,7 @@ | |||
127 | interrupt-controller; | 127 | interrupt-controller; |
128 | gpio-controller; | 128 | gpio-controller; |
129 | #gpio-cells = <2>; | 129 | #gpio-cells = <2>; |
130 | gpio-ranges = <&pinmux 0 252>; | 130 | gpio-ranges = <&pinmux 0 0 252>; |
131 | status = "disabled"; | 131 | status = "disabled"; |
132 | 132 | ||
133 | st-plgpio,ngpio = <250>; | 133 | st-plgpio,ngpio = <250>; |
diff --git a/arch/arm/boot/dts/spear310.dtsi b/arch/arm/boot/dts/spear310.dtsi index ab45b8c81982..95372080eea6 100644 --- a/arch/arm/boot/dts/spear310.dtsi +++ b/arch/arm/boot/dts/spear310.dtsi | |||
@@ -25,7 +25,7 @@ | |||
25 | pinmux: pinmux@b4000000 { | 25 | pinmux: pinmux@b4000000 { |
26 | compatible = "st,spear310-pinmux"; | 26 | compatible = "st,spear310-pinmux"; |
27 | reg = <0xb4000000 0x1000>; | 27 | reg = <0xb4000000 0x1000>; |
28 | #gpio-range-cells = <2>; | 28 | #gpio-range-cells = <3>; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | fsmc: flash@44000000 { | 31 | fsmc: flash@44000000 { |
@@ -102,7 +102,7 @@ | |||
102 | interrupt-controller; | 102 | interrupt-controller; |
103 | gpio-controller; | 103 | gpio-controller; |
104 | #gpio-cells = <2>; | 104 | #gpio-cells = <2>; |
105 | gpio-ranges = <&pinmux 0 102>; | 105 | gpio-ranges = <&pinmux 0 0 102>; |
106 | status = "disabled"; | 106 | status = "disabled"; |
107 | 107 | ||
108 | st-plgpio,ngpio = <102>; | 108 | st-plgpio,ngpio = <102>; |
diff --git a/arch/arm/boot/dts/spear320.dtsi b/arch/arm/boot/dts/spear320.dtsi index caa5520b1fd4..ffea342aeec9 100644 --- a/arch/arm/boot/dts/spear320.dtsi +++ b/arch/arm/boot/dts/spear320.dtsi | |||
@@ -24,7 +24,7 @@ | |||
24 | pinmux: pinmux@b3000000 { | 24 | pinmux: pinmux@b3000000 { |
25 | compatible = "st,spear320-pinmux"; | 25 | compatible = "st,spear320-pinmux"; |
26 | reg = <0xb3000000 0x1000>; | 26 | reg = <0xb3000000 0x1000>; |
27 | #gpio-range-cells = <2>; | 27 | #gpio-range-cells = <3>; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | clcd@90000000 { | 30 | clcd@90000000 { |
@@ -130,7 +130,7 @@ | |||
130 | interrupt-controller; | 130 | interrupt-controller; |
131 | gpio-controller; | 131 | gpio-controller; |
132 | #gpio-cells = <2>; | 132 | #gpio-cells = <2>; |
133 | gpio-ranges = <&pinmux 0 102>; | 133 | gpio-ranges = <&pinmux 0 0 102>; |
134 | status = "disabled"; | 134 | status = "disabled"; |
135 | 135 | ||
136 | st-plgpio,ngpio = <102>; | 136 | st-plgpio,ngpio = <102>; |
diff --git a/arch/arm/boot/dts/stuib.dtsi b/arch/arm/boot/dts/stuib.dtsi index 39446a247e79..615392a75676 100644 --- a/arch/arm/boot/dts/stuib.dtsi +++ b/arch/arm/boot/dts/stuib.dtsi | |||
@@ -15,7 +15,7 @@ | |||
15 | stmpe1601: stmpe1601@40 { | 15 | stmpe1601: stmpe1601@40 { |
16 | compatible = "st,stmpe1601"; | 16 | compatible = "st,stmpe1601"; |
17 | reg = <0x40>; | 17 | reg = <0x40>; |
18 | interrupts = <26 0x1>; | 18 | interrupts = <26 0x2>; |
19 | interrupt-parent = <&gpio6>; | 19 | interrupt-parent = <&gpio6>; |
20 | interrupt-controller; | 20 | interrupt-controller; |
21 | 21 | ||
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts index 73187173117c..9420053acc14 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts | |||
@@ -117,7 +117,7 @@ | |||
117 | }; | 117 | }; |
118 | 118 | ||
119 | pmu { | 119 | pmu { |
120 | compatible = "arm,cortex-a15-pmu", "arm,cortex-a9-pmu"; | 120 | compatible = "arm,cortex-a15-pmu"; |
121 | interrupts = <0 68 4>, | 121 | interrupts = <0 68 4>, |
122 | <0 69 4>; | 122 | <0 69 4>; |
123 | }; | 123 | }; |
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index dfe371ec2749..d2803be4e1a8 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts | |||
@@ -134,7 +134,7 @@ | |||
134 | }; | 134 | }; |
135 | 135 | ||
136 | pmu { | 136 | pmu { |
137 | compatible = "arm,cortex-a15-pmu", "arm,cortex-a9-pmu"; | 137 | compatible = "arm,cortex-a15-pmu"; |
138 | interrupts = <0 68 4>, | 138 | interrupts = <0 68 4>, |
139 | <0 69 4>; | 139 | <0 69 4>; |
140 | }; | 140 | }; |
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts index 6328cbc71d30..c544a5504591 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca5s.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca5s.dts | |||
@@ -111,7 +111,7 @@ | |||
111 | }; | 111 | }; |
112 | 112 | ||
113 | pmu { | 113 | pmu { |
114 | compatible = "arm,cortex-a5-pmu", "arm,cortex-a9-pmu"; | 114 | compatible = "arm,cortex-a5-pmu"; |
115 | interrupts = <0 68 4>, | 115 | interrupts = <0 68 4>, |
116 | <0 69 4>; | 116 | <0 69 4>; |
117 | }; | 117 | }; |
diff --git a/arch/arm/boot/dts/vt8500-bv07.dts b/arch/arm/boot/dts/vt8500-bv07.dts index 567cf4e8ab84..877b33afa7ed 100644 --- a/arch/arm/boot/dts/vt8500-bv07.dts +++ b/arch/arm/boot/dts/vt8500-bv07.dts | |||
@@ -11,26 +11,22 @@ | |||
11 | 11 | ||
12 | / { | 12 | / { |
13 | model = "Benign BV07 Netbook"; | 13 | model = "Benign BV07 Netbook"; |
14 | }; | ||
14 | 15 | ||
15 | /* | 16 | &fb { |
16 | * Display node is based on Sascha Hauer's patch on dri-devel. | 17 | bits-per-pixel = <16>; |
17 | * Added a bpp property to calculate the size of the framebuffer | 18 | display-timings { |
18 | * until the binding is formalized. | 19 | native-mode = <&timing0>; |
19 | */ | 20 | timing0: 800x480 { |
20 | display: display@0 { | 21 | clock-frequency = <0>; /* unused but required */ |
21 | modes { | 22 | hactive = <800>; |
22 | mode0: mode@0 { | 23 | vactive = <480>; |
23 | hactive = <800>; | 24 | hfront-porch = <40>; |
24 | vactive = <480>; | 25 | hback-porch = <88>; |
25 | hback-porch = <88>; | 26 | hsync-len = <0>; |
26 | hfront-porch = <40>; | 27 | vback-porch = <32>; |
27 | hsync-len = <0>; | 28 | vfront-porch = <11>; |
28 | vback-porch = <32>; | 29 | vsync-len = <1>; |
29 | vfront-porch = <11>; | ||
30 | vsync-len = <1>; | ||
31 | clock = <0>; /* unused but required */ | ||
32 | bpp = <16>; /* non-standard but required */ | ||
33 | }; | ||
34 | }; | 30 | }; |
35 | }; | 31 | }; |
36 | }; | 32 | }; |
diff --git a/arch/arm/boot/dts/vt8500.dtsi b/arch/arm/boot/dts/vt8500.dtsi index cf31ced46602..68c8dc644383 100644 --- a/arch/arm/boot/dts/vt8500.dtsi +++ b/arch/arm/boot/dts/vt8500.dtsi | |||
@@ -98,12 +98,10 @@ | |||
98 | interrupts = <43>; | 98 | interrupts = <43>; |
99 | }; | 99 | }; |
100 | 100 | ||
101 | fb@d800e400 { | 101 | fb: fb@d8050800 { |
102 | compatible = "via,vt8500-fb"; | 102 | compatible = "via,vt8500-fb"; |
103 | reg = <0xd800e400 0x400>; | 103 | reg = <0xd800e400 0x400>; |
104 | interrupts = <12>; | 104 | interrupts = <12>; |
105 | display = <&display>; | ||
106 | default-mode = <&mode0>; | ||
107 | }; | 105 | }; |
108 | 106 | ||
109 | ge_rops@d8050400 { | 107 | ge_rops@d8050400 { |
diff --git a/arch/arm/boot/dts/wm8505-ref.dts b/arch/arm/boot/dts/wm8505-ref.dts index fd4e248074c6..edd2cec3d37f 100644 --- a/arch/arm/boot/dts/wm8505-ref.dts +++ b/arch/arm/boot/dts/wm8505-ref.dts | |||
@@ -11,26 +11,22 @@ | |||
11 | 11 | ||
12 | / { | 12 | / { |
13 | model = "Wondermedia WM8505 Netbook"; | 13 | model = "Wondermedia WM8505 Netbook"; |
14 | }; | ||
14 | 15 | ||
15 | /* | 16 | &fb { |
16 | * Display node is based on Sascha Hauer's patch on dri-devel. | 17 | bits-per-pixel = <32>; |
17 | * Added a bpp property to calculate the size of the framebuffer | 18 | display-timings { |
18 | * until the binding is formalized. | 19 | native-mode = <&timing0>; |
19 | */ | 20 | timing0: 800x480 { |
20 | display: display@0 { | 21 | clock-frequency = <0>; /* unused but required */ |
21 | modes { | 22 | hactive = <800>; |
22 | mode0: mode@0 { | 23 | vactive = <480>; |
23 | hactive = <800>; | 24 | hfront-porch = <40>; |
24 | vactive = <480>; | 25 | hback-porch = <88>; |
25 | hback-porch = <88>; | 26 | hsync-len = <0>; |
26 | hfront-porch = <40>; | 27 | vback-porch = <32>; |
27 | hsync-len = <0>; | 28 | vfront-porch = <11>; |
28 | vback-porch = <32>; | 29 | vsync-len = <1>; |
29 | vfront-porch = <11>; | ||
30 | vsync-len = <1>; | ||
31 | clock = <0>; /* unused but required */ | ||
32 | bpp = <32>; /* non-standard but required */ | ||
33 | }; | ||
34 | }; | 30 | }; |
35 | }; | 31 | }; |
36 | }; | 32 | }; |
diff --git a/arch/arm/boot/dts/wm8505.dtsi b/arch/arm/boot/dts/wm8505.dtsi index e74a1c0fb9a2..bcf668d31b28 100644 --- a/arch/arm/boot/dts/wm8505.dtsi +++ b/arch/arm/boot/dts/wm8505.dtsi | |||
@@ -128,11 +128,9 @@ | |||
128 | interrupts = <0>; | 128 | interrupts = <0>; |
129 | }; | 129 | }; |
130 | 130 | ||
131 | fb@d8050800 { | 131 | fb: fb@d8050800 { |
132 | compatible = "wm,wm8505-fb"; | 132 | compatible = "wm,wm8505-fb"; |
133 | reg = <0xd8050800 0x200>; | 133 | reg = <0xd8050800 0x200>; |
134 | display = <&display>; | ||
135 | default-mode = <&mode0>; | ||
136 | }; | 134 | }; |
137 | 135 | ||
138 | ge_rops@d8050400 { | 136 | ge_rops@d8050400 { |
diff --git a/arch/arm/boot/dts/wm8650-mid.dts b/arch/arm/boot/dts/wm8650-mid.dts index cefd938f842f..61671a0d9ede 100644 --- a/arch/arm/boot/dts/wm8650-mid.dts +++ b/arch/arm/boot/dts/wm8650-mid.dts | |||
@@ -11,26 +11,24 @@ | |||
11 | 11 | ||
12 | / { | 12 | / { |
13 | model = "Wondermedia WM8650-MID Tablet"; | 13 | model = "Wondermedia WM8650-MID Tablet"; |
14 | }; | ||
15 | |||
16 | &fb { | ||
17 | bits-per-pixel = <16>; | ||
14 | 18 | ||
15 | /* | 19 | display-timings { |
16 | * Display node is based on Sascha Hauer's patch on dri-devel. | 20 | native-mode = <&timing0>; |
17 | * Added a bpp property to calculate the size of the framebuffer | 21 | timing0: 800x480 { |
18 | * until the binding is formalized. | 22 | clock-frequency = <0>; /* unused but required */ |
19 | */ | 23 | hactive = <800>; |
20 | display: display@0 { | 24 | vactive = <480>; |
21 | modes { | 25 | hfront-porch = <40>; |
22 | mode0: mode@0 { | 26 | hback-porch = <88>; |
23 | hactive = <800>; | 27 | hsync-len = <0>; |
24 | vactive = <480>; | 28 | vback-porch = <32>; |
25 | hback-porch = <88>; | 29 | vfront-porch = <11>; |
26 | hfront-porch = <40>; | 30 | vsync-len = <1>; |
27 | hsync-len = <0>; | ||
28 | vback-porch = <32>; | ||
29 | vfront-porch = <11>; | ||
30 | vsync-len = <1>; | ||
31 | clock = <0>; /* unused but required */ | ||
32 | bpp = <16>; /* non-standard but required */ | ||
33 | }; | ||
34 | }; | 31 | }; |
35 | }; | 32 | }; |
36 | }; | 33 | }; |
34 | |||
diff --git a/arch/arm/boot/dts/wm8650.dtsi b/arch/arm/boot/dts/wm8650.dtsi index db3c0a12e052..9313407bbc30 100644 --- a/arch/arm/boot/dts/wm8650.dtsi +++ b/arch/arm/boot/dts/wm8650.dtsi | |||
@@ -128,11 +128,9 @@ | |||
128 | interrupts = <43>; | 128 | interrupts = <43>; |
129 | }; | 129 | }; |
130 | 130 | ||
131 | fb@d8050800 { | 131 | fb: fb@d8050800 { |
132 | compatible = "wm,wm8505-fb"; | 132 | compatible = "wm,wm8505-fb"; |
133 | reg = <0xd8050800 0x200>; | 133 | reg = <0xd8050800 0x200>; |
134 | display = <&display>; | ||
135 | default-mode = <&mode0>; | ||
136 | }; | 134 | }; |
137 | 135 | ||
138 | ge_rops@d8050400 { | 136 | ge_rops@d8050400 { |
diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts index fcc660c89540..32d22532cd6c 100644 --- a/arch/arm/boot/dts/wm8850-w70v2.dts +++ b/arch/arm/boot/dts/wm8850-w70v2.dts | |||
@@ -15,28 +15,6 @@ | |||
15 | / { | 15 | / { |
16 | model = "Wondermedia WM8850-W70v2 Tablet"; | 16 | model = "Wondermedia WM8850-W70v2 Tablet"; |
17 | 17 | ||
18 | /* | ||
19 | * Display node is based on Sascha Hauer's patch on dri-devel. | ||
20 | * Added a bpp property to calculate the size of the framebuffer | ||
21 | * until the binding is formalized. | ||
22 | */ | ||
23 | display: display@0 { | ||
24 | modes { | ||
25 | mode0: mode@0 { | ||
26 | hactive = <800>; | ||
27 | vactive = <480>; | ||
28 | hback-porch = <88>; | ||
29 | hfront-porch = <40>; | ||
30 | hsync-len = <0>; | ||
31 | vback-porch = <32>; | ||
32 | vfront-porch = <11>; | ||
33 | vsync-len = <1>; | ||
34 | clock = <0>; /* unused but required */ | ||
35 | bpp = <16>; /* non-standard but required */ | ||
36 | }; | ||
37 | }; | ||
38 | }; | ||
39 | |||
40 | backlight { | 18 | backlight { |
41 | compatible = "pwm-backlight"; | 19 | compatible = "pwm-backlight"; |
42 | pwms = <&pwm 0 50000 1>; /* duty inverted */ | 20 | pwms = <&pwm 0 50000 1>; /* duty inverted */ |
@@ -45,3 +23,21 @@ | |||
45 | default-brightness-level = <5>; | 23 | default-brightness-level = <5>; |
46 | }; | 24 | }; |
47 | }; | 25 | }; |
26 | |||
27 | &fb { | ||
28 | bits-per-pixel = <16>; | ||
29 | display-timings { | ||
30 | native-mode = <&timing0>; | ||
31 | timing0: 800x480 { | ||
32 | clock-frequency = <0>; /* unused but required */ | ||
33 | hactive = <800>; | ||
34 | vactive = <480>; | ||
35 | hfront-porch = <40>; | ||
36 | hback-porch = <88>; | ||
37 | hsync-len = <0>; | ||
38 | vback-porch = <32>; | ||
39 | vfront-porch = <11>; | ||
40 | vsync-len = <1>; | ||
41 | }; | ||
42 | }; | ||
43 | }; | ||
diff --git a/arch/arm/boot/dts/wm8850.dtsi b/arch/arm/boot/dts/wm8850.dtsi index e8cbfdc87bba..7149cd13e3b9 100644 --- a/arch/arm/boot/dts/wm8850.dtsi +++ b/arch/arm/boot/dts/wm8850.dtsi | |||
@@ -135,11 +135,9 @@ | |||
135 | }; | 135 | }; |
136 | }; | 136 | }; |
137 | 137 | ||
138 | fb@d8051700 { | 138 | fb: fb@d8051700 { |
139 | compatible = "wm,wm8505-fb"; | 139 | compatible = "wm,wm8505-fb"; |
140 | reg = <0xd8051700 0x200>; | 140 | reg = <0xd8051700 0x200>; |
141 | display = <&display>; | ||
142 | default-mode = <&mode0>; | ||
143 | }; | 141 | }; |
144 | 142 | ||
145 | ge_rops@d8050400 { | 143 | ge_rops@d8050400 { |
diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig index e36b01025321..088d6c11a0fa 100644 --- a/arch/arm/configs/imx_v6_v7_defconfig +++ b/arch/arm/configs/imx_v6_v7_defconfig | |||
@@ -188,6 +188,7 @@ CONFIG_USB_EHCI_HCD=y | |||
188 | CONFIG_USB_EHCI_MXC=y | 188 | CONFIG_USB_EHCI_MXC=y |
189 | CONFIG_USB_CHIPIDEA=y | 189 | CONFIG_USB_CHIPIDEA=y |
190 | CONFIG_USB_CHIPIDEA_HOST=y | 190 | CONFIG_USB_CHIPIDEA_HOST=y |
191 | CONFIG_USB_PHY=y | ||
191 | CONFIG_USB_MXS_PHY=y | 192 | CONFIG_USB_MXS_PHY=y |
192 | CONFIG_USB_STORAGE=y | 193 | CONFIG_USB_STORAGE=y |
193 | CONFIG_MMC=y | 194 | CONFIG_MMC=y |
diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig index 13482ea58b09..93f3794ba5cb 100644 --- a/arch/arm/configs/kirkwood_defconfig +++ b/arch/arm/configs/kirkwood_defconfig | |||
@@ -56,7 +56,6 @@ CONFIG_AEABI=y | |||
56 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 56 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
57 | CONFIG_ZBOOT_ROM_BSS=0x0 | 57 | CONFIG_ZBOOT_ROM_BSS=0x0 |
58 | CONFIG_CPU_IDLE=y | 58 | CONFIG_CPU_IDLE=y |
59 | CONFIG_CPU_IDLE_KIRKWOOD=y | ||
60 | CONFIG_NET=y | 59 | CONFIG_NET=y |
61 | CONFIG_PACKET=y | 60 | CONFIG_PACKET=y |
62 | CONFIG_UNIX=y | 61 | CONFIG_UNIX=y |
diff --git a/arch/arm/configs/lpc32xx_defconfig b/arch/arm/configs/lpc32xx_defconfig index 92386b20bd09..afa7249fac6e 100644 --- a/arch/arm/configs/lpc32xx_defconfig +++ b/arch/arm/configs/lpc32xx_defconfig | |||
@@ -134,6 +134,7 @@ CONFIG_SND_DEBUG_VERBOSE=y | |||
134 | # CONFIG_SND_SPI is not set | 134 | # CONFIG_SND_SPI is not set |
135 | CONFIG_SND_SOC=y | 135 | CONFIG_SND_SOC=y |
136 | CONFIG_USB=y | 136 | CONFIG_USB=y |
137 | CONFIG_USB_PHY=y | ||
137 | CONFIG_USB_OHCI_HCD=y | 138 | CONFIG_USB_OHCI_HCD=y |
138 | CONFIG_USB_STORAGE=y | 139 | CONFIG_USB_STORAGE=y |
139 | CONFIG_USB_GADGET=y | 140 | CONFIG_USB_GADGET=y |
diff --git a/arch/arm/configs/mxs_defconfig b/arch/arm/configs/mxs_defconfig index 6a99e30f81d2..87924d671115 100644 --- a/arch/arm/configs/mxs_defconfig +++ b/arch/arm/configs/mxs_defconfig | |||
@@ -120,6 +120,7 @@ CONFIG_USB_EHCI_HCD=y | |||
120 | CONFIG_USB_CHIPIDEA=y | 120 | CONFIG_USB_CHIPIDEA=y |
121 | CONFIG_USB_CHIPIDEA_HOST=y | 121 | CONFIG_USB_CHIPIDEA_HOST=y |
122 | CONFIG_USB_STORAGE=y | 122 | CONFIG_USB_STORAGE=y |
123 | CONFIG_USB_PHY=y | ||
123 | CONFIG_USB_MXS_PHY=y | 124 | CONFIG_USB_MXS_PHY=y |
124 | CONFIG_MMC=y | 125 | CONFIG_MMC=y |
125 | CONFIG_MMC_MXS=y | 126 | CONFIG_MMC_MXS=y |
diff --git a/arch/arm/configs/omap1_defconfig b/arch/arm/configs/omap1_defconfig index 42eab9a2a0fd..7e0ebb64a7f9 100644 --- a/arch/arm/configs/omap1_defconfig +++ b/arch/arm/configs/omap1_defconfig | |||
@@ -195,6 +195,7 @@ CONFIG_SND_SOC=y | |||
195 | CONFIG_SND_OMAP_SOC=y | 195 | CONFIG_SND_OMAP_SOC=y |
196 | # CONFIG_USB_HID is not set | 196 | # CONFIG_USB_HID is not set |
197 | CONFIG_USB=y | 197 | CONFIG_USB=y |
198 | CONFIG_USB_PHY=y | ||
198 | CONFIG_USB_DEBUG=y | 199 | CONFIG_USB_DEBUG=y |
199 | CONFIG_USB_DEVICEFS=y | 200 | CONFIG_USB_DEVICEFS=y |
200 | # CONFIG_USB_DEVICE_CLASS is not set | 201 | # CONFIG_USB_DEVICE_CLASS is not set |
diff --git a/arch/arm/include/asm/glue-cache.h b/arch/arm/include/asm/glue-cache.h index cca9f15704ed..ea289e1435e7 100644 --- a/arch/arm/include/asm/glue-cache.h +++ b/arch/arm/include/asm/glue-cache.h | |||
@@ -19,14 +19,6 @@ | |||
19 | #undef _CACHE | 19 | #undef _CACHE |
20 | #undef MULTI_CACHE | 20 | #undef MULTI_CACHE |
21 | 21 | ||
22 | #if defined(CONFIG_CPU_CACHE_V3) | ||
23 | # ifdef _CACHE | ||
24 | # define MULTI_CACHE 1 | ||
25 | # else | ||
26 | # define _CACHE v3 | ||
27 | # endif | ||
28 | #endif | ||
29 | |||
30 | #if defined(CONFIG_CPU_CACHE_V4) | 22 | #if defined(CONFIG_CPU_CACHE_V4) |
31 | # ifdef _CACHE | 23 | # ifdef _CACHE |
32 | # define MULTI_CACHE 1 | 24 | # define MULTI_CACHE 1 |
diff --git a/arch/arm/include/asm/hardware/iop3xx.h b/arch/arm/include/asm/hardware/iop3xx.h index 02fe2fbe2477..ed94b1a366ae 100644 --- a/arch/arm/include/asm/hardware/iop3xx.h +++ b/arch/arm/include/asm/hardware/iop3xx.h | |||
@@ -37,7 +37,7 @@ extern int iop3xx_get_init_atu(void); | |||
37 | * IOP3XX processor registers | 37 | * IOP3XX processor registers |
38 | */ | 38 | */ |
39 | #define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000 | 39 | #define IOP3XX_PERIPHERAL_PHYS_BASE 0xffffe000 |
40 | #define IOP3XX_PERIPHERAL_VIRT_BASE 0xfeffe000 | 40 | #define IOP3XX_PERIPHERAL_VIRT_BASE 0xfedfe000 |
41 | #define IOP3XX_PERIPHERAL_SIZE 0x00002000 | 41 | #define IOP3XX_PERIPHERAL_SIZE 0x00002000 |
42 | #define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\ | 42 | #define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\ |
43 | IOP3XX_PERIPHERAL_SIZE - 1) | 43 | IOP3XX_PERIPHERAL_SIZE - 1) |
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index 6ef8afd1b64c..86b8fe398b95 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h | |||
@@ -111,7 +111,7 @@ | |||
111 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ | 111 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ |
112 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ | 112 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ |
113 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ | 113 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
114 | #define L_PTE_S2_RDWR (_AT(pteval_t, 2) << 6) /* HAP[2:1] */ | 114 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
115 | 115 | ||
116 | /* | 116 | /* |
117 | * Hyp-mode PL2 PTE definitions for LPAE. | 117 | * Hyp-mode PL2 PTE definitions for LPAE. |
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 80d6fc4dbe4a..9bcd262a9008 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -61,6 +61,15 @@ extern void __pgd_error(const char *file, int line, pgd_t); | |||
61 | #define FIRST_USER_ADDRESS PAGE_SIZE | 61 | #define FIRST_USER_ADDRESS PAGE_SIZE |
62 | 62 | ||
63 | /* | 63 | /* |
64 | * Use TASK_SIZE as the ceiling argument for free_pgtables() and | ||
65 | * free_pgd_range() to avoid freeing the modules pmd when LPAE is enabled (pmd | ||
66 | * page shared between user and kernel). | ||
67 | */ | ||
68 | #ifdef CONFIG_ARM_LPAE | ||
69 | #define USER_PGTABLES_CEILING TASK_SIZE | ||
70 | #endif | ||
71 | |||
72 | /* | ||
64 | * The pgprot_* and protection_map entries will be fixed up in runtime | 73 | * The pgprot_* and protection_map entries will be fixed up in runtime |
65 | * to include the cachable and bufferable bits based on memory policy, | 74 | * to include the cachable and bufferable bits based on memory policy, |
66 | * as well as any architecture dependent bits like global/ASID and SMP | 75 | * as well as any architecture dependent bits like global/ASID and SMP |
diff --git a/arch/arm/include/asm/system_misc.h b/arch/arm/include/asm/system_misc.h index 5a85f148b607..21a23e378bbe 100644 --- a/arch/arm/include/asm/system_misc.h +++ b/arch/arm/include/asm/system_misc.h | |||
@@ -21,9 +21,6 @@ extern void (*arm_pm_idle)(void); | |||
21 | 21 | ||
22 | extern unsigned int user_debug; | 22 | extern unsigned int user_debug; |
23 | 23 | ||
24 | extern void disable_hlt(void); | ||
25 | extern void enable_hlt(void); | ||
26 | |||
27 | #endif /* !__ASSEMBLY__ */ | 24 | #endif /* !__ASSEMBLY__ */ |
28 | 25 | ||
29 | #endif /* __ASM_ARM_SYSTEM_MISC_H */ | 26 | #endif /* __ASM_ARM_SYSTEM_MISC_H */ |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 9e9c041358ca..ab865e65a84c 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
@@ -14,7 +14,6 @@ | |||
14 | 14 | ||
15 | #include <asm/glue.h> | 15 | #include <asm/glue.h> |
16 | 16 | ||
17 | #define TLB_V3_PAGE (1 << 0) | ||
18 | #define TLB_V4_U_PAGE (1 << 1) | 17 | #define TLB_V4_U_PAGE (1 << 1) |
19 | #define TLB_V4_D_PAGE (1 << 2) | 18 | #define TLB_V4_D_PAGE (1 << 2) |
20 | #define TLB_V4_I_PAGE (1 << 3) | 19 | #define TLB_V4_I_PAGE (1 << 3) |
@@ -22,7 +21,6 @@ | |||
22 | #define TLB_V6_D_PAGE (1 << 5) | 21 | #define TLB_V6_D_PAGE (1 << 5) |
23 | #define TLB_V6_I_PAGE (1 << 6) | 22 | #define TLB_V6_I_PAGE (1 << 6) |
24 | 23 | ||
25 | #define TLB_V3_FULL (1 << 8) | ||
26 | #define TLB_V4_U_FULL (1 << 9) | 24 | #define TLB_V4_U_FULL (1 << 9) |
27 | #define TLB_V4_D_FULL (1 << 10) | 25 | #define TLB_V4_D_FULL (1 << 10) |
28 | #define TLB_V4_I_FULL (1 << 11) | 26 | #define TLB_V4_I_FULL (1 << 11) |
@@ -52,7 +50,6 @@ | |||
52 | * ============= | 50 | * ============= |
53 | * | 51 | * |
54 | * We have the following to choose from: | 52 | * We have the following to choose from: |
55 | * v3 - ARMv3 | ||
56 | * v4 - ARMv4 without write buffer | 53 | * v4 - ARMv4 without write buffer |
57 | * v4wb - ARMv4 with write buffer without I TLB flush entry instruction | 54 | * v4wb - ARMv4 with write buffer without I TLB flush entry instruction |
58 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction | 55 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction |
@@ -330,7 +327,6 @@ static inline void local_flush_tlb_all(void) | |||
330 | if (tlb_flag(TLB_WB)) | 327 | if (tlb_flag(TLB_WB)) |
331 | dsb(); | 328 | dsb(); |
332 | 329 | ||
333 | tlb_op(TLB_V3_FULL, "c6, c0, 0", zero); | ||
334 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); | 330 | tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); |
335 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); | 331 | tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); |
336 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); | 332 | tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); |
@@ -351,9 +347,8 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm) | |||
351 | if (tlb_flag(TLB_WB)) | 347 | if (tlb_flag(TLB_WB)) |
352 | dsb(); | 348 | dsb(); |
353 | 349 | ||
354 | if (possible_tlb_flags & (TLB_V3_FULL|TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { | 350 | if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { |
355 | if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { | 351 | if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { |
356 | tlb_op(TLB_V3_FULL, "c6, c0, 0", zero); | ||
357 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); | 352 | tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); |
358 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); | 353 | tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); |
359 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); | 354 | tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); |
@@ -385,9 +380,8 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) | |||
385 | if (tlb_flag(TLB_WB)) | 380 | if (tlb_flag(TLB_WB)) |
386 | dsb(); | 381 | dsb(); |
387 | 382 | ||
388 | if (possible_tlb_flags & (TLB_V3_PAGE|TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && | 383 | if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && |
389 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { | 384 | cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { |
390 | tlb_op(TLB_V3_PAGE, "c6, c0, 0", uaddr); | ||
391 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); | 385 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); |
392 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr); | 386 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", uaddr); |
393 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr); | 387 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", uaddr); |
@@ -418,7 +412,6 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr) | |||
418 | if (tlb_flag(TLB_WB)) | 412 | if (tlb_flag(TLB_WB)) |
419 | dsb(); | 413 | dsb(); |
420 | 414 | ||
421 | tlb_op(TLB_V3_PAGE, "c6, c0, 0", kaddr); | ||
422 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); | 415 | tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); |
423 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); | 416 | tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); |
424 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); | 417 | tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index e4ddfb39ca34..141baa3f9a72 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
@@ -44,14 +44,6 @@ | |||
44 | #define __ARCH_WANT_SYS_CLONE | 44 | #define __ARCH_WANT_SYS_CLONE |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * "Conditional" syscalls | ||
48 | * | ||
49 | * What we want is __attribute__((weak,alias("sys_ni_syscall"))), | ||
50 | * but it doesn't work on all toolchains, so we just do it by hand | ||
51 | */ | ||
52 | #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") | ||
53 | |||
54 | /* | ||
55 | * Unimplemented (or alternatively implemented) syscalls | 47 | * Unimplemented (or alternatively implemented) syscalls |
56 | */ | 48 | */ |
57 | #define __IGNORE_fadvise64_64 | 49 | #define __IGNORE_fadvise64_64 |
diff --git a/arch/arm/kernel/atags_proc.c b/arch/arm/kernel/atags_proc.c index 42a1a1415fa6..c7ff8073416f 100644 --- a/arch/arm/kernel/atags_proc.c +++ b/arch/arm/kernel/atags_proc.c | |||
@@ -9,24 +9,18 @@ struct buffer { | |||
9 | char data[]; | 9 | char data[]; |
10 | }; | 10 | }; |
11 | 11 | ||
12 | static int | 12 | static ssize_t atags_read(struct file *file, char __user *buf, |
13 | read_buffer(char* page, char** start, off_t off, int count, | 13 | size_t count, loff_t *ppos) |
14 | int* eof, void* data) | ||
15 | { | 14 | { |
16 | struct buffer *buffer = (struct buffer *)data; | 15 | struct buffer *b = PDE_DATA(file_inode(file)); |
17 | 16 | return simple_read_from_buffer(buf, count, ppos, b->data, b->size); | |
18 | if (off >= buffer->size) { | ||
19 | *eof = 1; | ||
20 | return 0; | ||
21 | } | ||
22 | |||
23 | count = min((int) (buffer->size - off), count); | ||
24 | |||
25 | memcpy(page, &buffer->data[off], count); | ||
26 | |||
27 | return count; | ||
28 | } | 17 | } |
29 | 18 | ||
19 | static const struct file_operations atags_fops = { | ||
20 | .read = atags_read, | ||
21 | .llseek = default_llseek, | ||
22 | }; | ||
23 | |||
30 | #define BOOT_PARAMS_SIZE 1536 | 24 | #define BOOT_PARAMS_SIZE 1536 |
31 | static char __initdata atags_copy[BOOT_PARAMS_SIZE]; | 25 | static char __initdata atags_copy[BOOT_PARAMS_SIZE]; |
32 | 26 | ||
@@ -66,9 +60,7 @@ static int __init init_atags_procfs(void) | |||
66 | b->size = size; | 60 | b->size = size; |
67 | memcpy(b->data, atags_copy, size); | 61 | memcpy(b->data, atags_copy, size); |
68 | 62 | ||
69 | tags_entry = create_proc_read_entry("atags", 0400, | 63 | tags_entry = proc_create_data("atags", 0400, NULL, &atags_fops, b); |
70 | NULL, read_buffer, b); | ||
71 | |||
72 | if (!tags_entry) | 64 | if (!tags_entry) |
73 | goto nomem; | 65 | goto nomem; |
74 | 66 | ||
diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c index 85aa2b292692..43076536965c 100644 --- a/arch/arm/kernel/early_printk.c +++ b/arch/arm/kernel/early_printk.c | |||
@@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n) | |||
29 | early_write(s, n); | 29 | early_write(s, n); |
30 | } | 30 | } |
31 | 31 | ||
32 | static struct console early_console = { | 32 | static struct console early_console_dev = { |
33 | .name = "earlycon", | 33 | .name = "earlycon", |
34 | .write = early_console_write, | 34 | .write = early_console_write, |
35 | .flags = CON_PRINTBUFFER | CON_BOOT, | 35 | .flags = CON_PRINTBUFFER | CON_BOOT, |
36 | .index = -1, | 36 | .index = -1, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | asmlinkage void early_printk(const char *fmt, ...) | ||
40 | { | ||
41 | char buf[512]; | ||
42 | int n; | ||
43 | va_list ap; | ||
44 | |||
45 | va_start(ap, fmt); | ||
46 | n = vscnprintf(buf, sizeof(buf), fmt, ap); | ||
47 | early_write(buf, n); | ||
48 | va_end(ap); | ||
49 | } | ||
50 | |||
51 | static int __init setup_early_printk(char *buf) | 39 | static int __init setup_early_printk(char *buf) |
52 | { | 40 | { |
53 | register_console(&early_console); | 41 | early_console = &early_console_dev; |
42 | register_console(&early_console_dev); | ||
54 | return 0; | 43 | return 0; |
55 | } | 44 | } |
56 | 45 | ||
diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index 9b6de8c988f3..8ff0ecdc637f 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c | |||
@@ -254,7 +254,7 @@ static void sysrq_etm_dump(int key) | |||
254 | 254 | ||
255 | static struct sysrq_key_op sysrq_etm_op = { | 255 | static struct sysrq_key_op sysrq_etm_op = { |
256 | .handler = sysrq_etm_dump, | 256 | .handler = sysrq_etm_dump, |
257 | .help_msg = "ETM buffer dump", | 257 | .help_msg = "etm-buffer-dump(v)", |
258 | .action_msg = "etm", | 258 | .action_msg = "etm", |
259 | }; | 259 | }; |
260 | 260 | ||
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 5dc1aa6f0f7d..1fd749ee4a1b 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
@@ -1043,7 +1043,7 @@ static int dbg_cpu_pm_notify(struct notifier_block *self, unsigned long action, | |||
1043 | return NOTIFY_OK; | 1043 | return NOTIFY_OK; |
1044 | } | 1044 | } |
1045 | 1045 | ||
1046 | static struct notifier_block __cpuinitdata dbg_cpu_pm_nb = { | 1046 | static struct notifier_block dbg_cpu_pm_nb = { |
1047 | .notifier_call = dbg_cpu_pm_notify, | 1047 | .notifier_call = dbg_cpu_pm_notify, |
1048 | }; | 1048 | }; |
1049 | 1049 | ||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 146157dfe27c..8c3094d0f7b7 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -253,7 +253,10 @@ validate_event(struct pmu_hw_events *hw_events, | |||
253 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); | 253 | struct arm_pmu *armpmu = to_arm_pmu(event->pmu); |
254 | struct pmu *leader_pmu = event->group_leader->pmu; | 254 | struct pmu *leader_pmu = event->group_leader->pmu; |
255 | 255 | ||
256 | if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) | 256 | if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF) |
257 | return 1; | ||
258 | |||
259 | if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) | ||
257 | return 1; | 260 | return 1; |
258 | 261 | ||
259 | return armpmu->get_event_idx(hw_events, event) >= 0; | 262 | return armpmu->get_event_idx(hw_events, event) >= 0; |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 047d3e40e470..ae58d3b37d9d 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -57,38 +57,6 @@ static const char *isa_modes[] = { | |||
57 | "ARM" , "Thumb" , "Jazelle", "ThumbEE" | 57 | "ARM" , "Thumb" , "Jazelle", "ThumbEE" |
58 | }; | 58 | }; |
59 | 59 | ||
60 | static volatile int hlt_counter; | ||
61 | |||
62 | void disable_hlt(void) | ||
63 | { | ||
64 | hlt_counter++; | ||
65 | } | ||
66 | |||
67 | EXPORT_SYMBOL(disable_hlt); | ||
68 | |||
69 | void enable_hlt(void) | ||
70 | { | ||
71 | hlt_counter--; | ||
72 | BUG_ON(hlt_counter < 0); | ||
73 | } | ||
74 | |||
75 | EXPORT_SYMBOL(enable_hlt); | ||
76 | |||
77 | static int __init nohlt_setup(char *__unused) | ||
78 | { | ||
79 | hlt_counter = 1; | ||
80 | return 1; | ||
81 | } | ||
82 | |||
83 | static int __init hlt_setup(char *__unused) | ||
84 | { | ||
85 | hlt_counter = 0; | ||
86 | return 1; | ||
87 | } | ||
88 | |||
89 | __setup("nohlt", nohlt_setup); | ||
90 | __setup("hlt", hlt_setup); | ||
91 | |||
92 | extern void call_with_stack(void (*fn)(void *), void *arg, void *sp); | 60 | extern void call_with_stack(void (*fn)(void *), void *arg, void *sp); |
93 | typedef void (*phys_reset_t)(unsigned long); | 61 | typedef void (*phys_reset_t)(unsigned long); |
94 | 62 | ||
@@ -172,54 +140,38 @@ static void default_idle(void) | |||
172 | local_irq_enable(); | 140 | local_irq_enable(); |
173 | } | 141 | } |
174 | 142 | ||
175 | /* | 143 | void arch_cpu_idle_prepare(void) |
176 | * The idle thread. | ||
177 | * We always respect 'hlt_counter' to prevent low power idle. | ||
178 | */ | ||
179 | void cpu_idle(void) | ||
180 | { | 144 | { |
181 | local_fiq_enable(); | 145 | local_fiq_enable(); |
146 | } | ||
182 | 147 | ||
183 | /* endless idle loop with no priority at all */ | 148 | void arch_cpu_idle_enter(void) |
184 | while (1) { | 149 | { |
185 | tick_nohz_idle_enter(); | 150 | ledtrig_cpu(CPU_LED_IDLE_START); |
186 | rcu_idle_enter(); | 151 | #ifdef CONFIG_PL310_ERRATA_769419 |
187 | ledtrig_cpu(CPU_LED_IDLE_START); | 152 | wmb(); |
188 | while (!need_resched()) { | ||
189 | #ifdef CONFIG_HOTPLUG_CPU | ||
190 | if (cpu_is_offline(smp_processor_id())) | ||
191 | cpu_die(); | ||
192 | #endif | 153 | #endif |
154 | } | ||
193 | 155 | ||
194 | /* | 156 | void arch_cpu_idle_exit(void) |
195 | * We need to disable interrupts here | 157 | { |
196 | * to ensure we don't miss a wakeup call. | 158 | ledtrig_cpu(CPU_LED_IDLE_END); |
197 | */ | 159 | } |
198 | local_irq_disable(); | 160 | |
199 | #ifdef CONFIG_PL310_ERRATA_769419 | 161 | #ifdef CONFIG_HOTPLUG_CPU |
200 | wmb(); | 162 | void arch_cpu_idle_dead(void) |
163 | { | ||
164 | cpu_die(); | ||
165 | } | ||
201 | #endif | 166 | #endif |
202 | if (hlt_counter) { | 167 | |
203 | local_irq_enable(); | 168 | /* |
204 | cpu_relax(); | 169 | * Called from the core idle loop. |
205 | } else if (!need_resched()) { | 170 | */ |
206 | stop_critical_timings(); | 171 | void arch_cpu_idle(void) |
207 | if (cpuidle_idle_call()) | 172 | { |
208 | default_idle(); | 173 | if (cpuidle_idle_call()) |
209 | start_critical_timings(); | 174 | default_idle(); |
210 | /* | ||
211 | * default_idle functions must always | ||
212 | * return with IRQs enabled. | ||
213 | */ | ||
214 | WARN_ON(irqs_disabled()); | ||
215 | } else | ||
216 | local_irq_enable(); | ||
217 | } | ||
218 | ledtrig_cpu(CPU_LED_IDLE_END); | ||
219 | rcu_idle_exit(); | ||
220 | tick_nohz_idle_exit(); | ||
221 | schedule_preempt_disabled(); | ||
222 | } | ||
223 | } | 175 | } |
224 | 176 | ||
225 | static char reboot_mode = 'h'; | 177 | static char reboot_mode = 'h'; |
@@ -273,11 +225,8 @@ void __show_regs(struct pt_regs *regs) | |||
273 | unsigned long flags; | 225 | unsigned long flags; |
274 | char buf[64]; | 226 | char buf[64]; |
275 | 227 | ||
276 | printk("CPU: %d %s (%s %.*s)\n", | 228 | show_regs_print_info(KERN_DEFAULT); |
277 | raw_smp_processor_id(), print_tainted(), | 229 | |
278 | init_utsname()->release, | ||
279 | (int)strcspn(init_utsname()->version, " "), | ||
280 | init_utsname()->version); | ||
281 | print_symbol("PC is at %s\n", instruction_pointer(regs)); | 230 | print_symbol("PC is at %s\n", instruction_pointer(regs)); |
282 | print_symbol("LR is at %s\n", regs->ARM_lr); | 231 | print_symbol("LR is at %s\n", regs->ARM_lr); |
283 | printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n" | 232 | printk("pc : [<%08lx>] lr : [<%08lx>] psr: %08lx\n" |
@@ -332,7 +281,6 @@ void __show_regs(struct pt_regs *regs) | |||
332 | void show_regs(struct pt_regs * regs) | 281 | void show_regs(struct pt_regs * regs) |
333 | { | 282 | { |
334 | printk("\n"); | 283 | printk("\n"); |
335 | printk("Pid: %d, comm: %20s\n", task_pid_nr(current), current->comm); | ||
336 | __show_regs(regs); | 284 | __show_regs(regs); |
337 | dump_stack(); | 285 | dump_stack(); |
338 | } | 286 | } |
diff --git a/arch/arm/kernel/sched_clock.c b/arch/arm/kernel/sched_clock.c index bd6f56b9ec21..59d2adb764a9 100644 --- a/arch/arm/kernel/sched_clock.c +++ b/arch/arm/kernel/sched_clock.c | |||
@@ -45,12 +45,12 @@ static u32 notrace jiffy_sched_clock_read(void) | |||
45 | 45 | ||
46 | static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read; | 46 | static u32 __read_mostly (*read_sched_clock)(void) = jiffy_sched_clock_read; |
47 | 47 | ||
48 | static inline u64 cyc_to_ns(u64 cyc, u32 mult, u32 shift) | 48 | static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift) |
49 | { | 49 | { |
50 | return (cyc * mult) >> shift; | 50 | return (cyc * mult) >> shift; |
51 | } | 51 | } |
52 | 52 | ||
53 | static unsigned long long cyc_to_sched_clock(u32 cyc, u32 mask) | 53 | static unsigned long long notrace cyc_to_sched_clock(u32 cyc, u32 mask) |
54 | { | 54 | { |
55 | u64 epoch_ns; | 55 | u64 epoch_ns; |
56 | u32 epoch_cyc; | 56 | u32 epoch_cyc; |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index d343a6c3a6d1..234e339196c0 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -56,7 +56,6 @@ | |||
56 | #include <asm/virt.h> | 56 | #include <asm/virt.h> |
57 | 57 | ||
58 | #include "atags.h" | 58 | #include "atags.h" |
59 | #include "tcm.h" | ||
60 | 59 | ||
61 | 60 | ||
62 | #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE) | 61 | #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE) |
@@ -798,8 +797,6 @@ void __init setup_arch(char **cmdline_p) | |||
798 | 797 | ||
799 | reserve_crashkernel(); | 798 | reserve_crashkernel(); |
800 | 799 | ||
801 | tcm_init(); | ||
802 | |||
803 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 800 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
804 | handle_arch_irq = mdesc->handle_irq; | 801 | handle_arch_irq = mdesc->handle_irq; |
805 | #endif | 802 | #endif |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 1f2ccccaf009..4619177bcfe6 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -336,7 +336,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void) | |||
336 | /* | 336 | /* |
337 | * OK, it's off to the idle thread for us | 337 | * OK, it's off to the idle thread for us |
338 | */ | 338 | */ |
339 | cpu_idle(); | 339 | cpu_startup_entry(CPUHP_ONLINE); |
340 | } | 340 | } |
341 | 341 | ||
342 | void __init smp_cpus_done(unsigned int max_cpus) | 342 | void __init smp_cpus_done(unsigned int max_cpus) |
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c index ab1017bd1667..087fc321e9e5 100644 --- a/arch/arm/kernel/swp_emulate.c +++ b/arch/arm/kernel/swp_emulate.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
23 | #include <linux/proc_fs.h> | 23 | #include <linux/proc_fs.h> |
24 | #include <linux/seq_file.h> | ||
24 | #include <linux/sched.h> | 25 | #include <linux/sched.h> |
25 | #include <linux/syscalls.h> | 26 | #include <linux/syscalls.h> |
26 | #include <linux/perf_event.h> | 27 | #include <linux/perf_event.h> |
@@ -79,27 +80,27 @@ static unsigned long abtcounter; | |||
79 | static pid_t previous_pid; | 80 | static pid_t previous_pid; |
80 | 81 | ||
81 | #ifdef CONFIG_PROC_FS | 82 | #ifdef CONFIG_PROC_FS |
82 | static int proc_read_status(char *page, char **start, off_t off, int count, | 83 | static int proc_status_show(struct seq_file *m, void *v) |
83 | int *eof, void *data) | ||
84 | { | 84 | { |
85 | char *p = page; | 85 | seq_printf(m, "Emulated SWP:\t\t%lu\n", swpcounter); |
86 | int len; | 86 | seq_printf(m, "Emulated SWPB:\t\t%lu\n", swpbcounter); |
87 | 87 | seq_printf(m, "Aborted SWP{B}:\t\t%lu\n", abtcounter); | |
88 | p += sprintf(p, "Emulated SWP:\t\t%lu\n", swpcounter); | ||
89 | p += sprintf(p, "Emulated SWPB:\t\t%lu\n", swpbcounter); | ||
90 | p += sprintf(p, "Aborted SWP{B}:\t\t%lu\n", abtcounter); | ||
91 | if (previous_pid != 0) | 88 | if (previous_pid != 0) |
92 | p += sprintf(p, "Last process:\t\t%d\n", previous_pid); | 89 | seq_printf(m, "Last process:\t\t%d\n", previous_pid); |
93 | 90 | return 0; | |
94 | len = (p - page) - off; | 91 | } |
95 | if (len < 0) | ||
96 | len = 0; | ||
97 | |||
98 | *eof = (len <= count) ? 1 : 0; | ||
99 | *start = page + off; | ||
100 | 92 | ||
101 | return len; | 93 | static int proc_status_open(struct inode *inode, struct file *file) |
94 | { | ||
95 | return single_open(file, proc_status_show, PDE_DATA(inode)); | ||
102 | } | 96 | } |
97 | |||
98 | static const struct file_operations proc_status_fops = { | ||
99 | .open = proc_status_open, | ||
100 | .read = seq_read, | ||
101 | .llseek = seq_lseek, | ||
102 | .release = seq_release, | ||
103 | }; | ||
103 | #endif | 104 | #endif |
104 | 105 | ||
105 | /* | 106 | /* |
@@ -266,14 +267,8 @@ static struct undef_hook swp_hook = { | |||
266 | static int __init swp_emulation_init(void) | 267 | static int __init swp_emulation_init(void) |
267 | { | 268 | { |
268 | #ifdef CONFIG_PROC_FS | 269 | #ifdef CONFIG_PROC_FS |
269 | struct proc_dir_entry *res; | 270 | if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops)) |
270 | |||
271 | res = create_proc_entry("cpu/swp_emulation", S_IRUGO, NULL); | ||
272 | |||
273 | if (!res) | ||
274 | return -ENOMEM; | 271 | return -ENOMEM; |
275 | |||
276 | res->read_proc = proc_read_status; | ||
277 | #endif /* CONFIG_PROC_FS */ | 272 | #endif /* CONFIG_PROC_FS */ |
278 | 273 | ||
279 | printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n"); | 274 | printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n"); |
diff --git a/arch/arm/kernel/tcm.c b/arch/arm/kernel/tcm.c index 30ae6bb4a310..f50f19e5c138 100644 --- a/arch/arm/kernel/tcm.c +++ b/arch/arm/kernel/tcm.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <asm/mach/map.h> | 17 | #include <asm/mach/map.h> |
18 | #include <asm/memory.h> | 18 | #include <asm/memory.h> |
19 | #include <asm/system_info.h> | 19 | #include <asm/system_info.h> |
20 | #include "tcm.h" | ||
21 | 20 | ||
22 | static struct gen_pool *tcm_pool; | 21 | static struct gen_pool *tcm_pool; |
23 | static bool dtcm_present; | 22 | static bool dtcm_present; |
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 79282ebcd939..f10316b4ecdc 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c | |||
@@ -100,7 +100,7 @@ static void __init parse_dt_topology(void) | |||
100 | int alloc_size, cpu = 0; | 100 | int alloc_size, cpu = 0; |
101 | 101 | ||
102 | alloc_size = nr_cpu_ids * sizeof(struct cpu_capacity); | 102 | alloc_size = nr_cpu_ids * sizeof(struct cpu_capacity); |
103 | cpu_capacity = (struct cpu_capacity *)kzalloc(alloc_size, GFP_NOWAIT); | 103 | cpu_capacity = kzalloc(alloc_size, GFP_NOWAIT); |
104 | 104 | ||
105 | while ((cn = of_find_node_by_type(cn, "cpu"))) { | 105 | while ((cn = of_find_node_by_type(cn, "cpu"))) { |
106 | const u32 *rate, *reg; | 106 | const u32 *rate, *reg; |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 1c089119b2d7..18b32e8e4497 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -204,13 +204,6 @@ static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) | |||
204 | } | 204 | } |
205 | #endif | 205 | #endif |
206 | 206 | ||
207 | void dump_stack(void) | ||
208 | { | ||
209 | dump_backtrace(NULL, NULL); | ||
210 | } | ||
211 | |||
212 | EXPORT_SYMBOL(dump_stack); | ||
213 | |||
214 | void show_stack(struct task_struct *tsk, unsigned long *sp) | 207 | void show_stack(struct task_struct *tsk, unsigned long *sp) |
215 | { | 208 | { |
216 | dump_backtrace(NULL, tsk); | 209 | dump_backtrace(NULL, tsk); |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 5a936988eb24..842098d78f58 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -201,6 +201,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
201 | break; | 201 | break; |
202 | case KVM_CAP_ARM_SET_DEVICE_ADDR: | 202 | case KVM_CAP_ARM_SET_DEVICE_ADDR: |
203 | r = 1; | 203 | r = 1; |
204 | break; | ||
204 | case KVM_CAP_NR_VCPUS: | 205 | case KVM_CAP_NR_VCPUS: |
205 | r = num_online_cpus(); | 206 | r = num_online_cpus(); |
206 | break; | 207 | break; |
@@ -613,7 +614,7 @@ static int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run, | |||
613 | 614 | ||
614 | if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) | 615 | if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) |
615 | || !arm_exit_handlers[hsr_ec]) { | 616 | || !arm_exit_handlers[hsr_ec]) { |
616 | kvm_err("Unkown exception class: %#08lx, " | 617 | kvm_err("Unknown exception class: %#08lx, " |
617 | "hsr: %#08x\n", hsr_ec, | 618 | "hsr: %#08x\n", hsr_ec, |
618 | (unsigned int)vcpu->arch.hsr); | 619 | (unsigned int)vcpu->arch.hsr); |
619 | BUG(); | 620 | BUG(); |
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c index 4ea9a982269c..7bed7556077a 100644 --- a/arch/arm/kvm/coproc.c +++ b/arch/arm/kvm/coproc.c | |||
@@ -79,11 +79,11 @@ static bool access_dcsw(struct kvm_vcpu *vcpu, | |||
79 | u32 val; | 79 | u32 val; |
80 | int cpu; | 80 | int cpu; |
81 | 81 | ||
82 | cpu = get_cpu(); | ||
83 | |||
84 | if (!p->is_write) | 82 | if (!p->is_write) |
85 | return read_from_write_only(vcpu, p); | 83 | return read_from_write_only(vcpu, p); |
86 | 84 | ||
85 | cpu = get_cpu(); | ||
86 | |||
87 | cpumask_setall(&vcpu->arch.require_dcache_flush); | 87 | cpumask_setall(&vcpu->arch.require_dcache_flush); |
88 | cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush); | 88 | cpumask_clear_cpu(cpu, &vcpu->arch.require_dcache_flush); |
89 | 89 | ||
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index b67cd5374117..44199bc2c665 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -232,6 +232,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
232 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), | 232 | CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk), |
233 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), | 233 | CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk), |
234 | CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk), | 234 | CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk), |
235 | CLKDEV_CON_DEV_ID("spi_clk", "fffc8000.spi", &spi0_clk), | ||
236 | CLKDEV_CON_DEV_ID("spi_clk", "fffcc000.spi", &spi1_clk), | ||
235 | /* fake hclk clock */ | 237 | /* fake hclk clock */ |
236 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), | 238 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), |
237 | CLKDEV_CON_ID("pioA", &pioA_clk), | 239 | CLKDEV_CON_ID("pioA", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index d3addee43d8d..2ec5efea3f03 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -262,6 +262,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
262 | CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk), | 262 | CLKDEV_CON_DEV_ID("mci_clk", "fffd0000.mmc", &mmc1_clk), |
263 | CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk), | 263 | CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk), |
264 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk), | 264 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk), |
265 | CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk), | ||
266 | CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), | ||
265 | /* fake hclk clock */ | 267 | /* fake hclk clock */ |
266 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), | 268 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), |
267 | CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), | 269 | CLKDEV_CON_DEV_ID(NULL, "fffff200.gpio", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c index 5dfc8fd87103..ccd078355eed 100644 --- a/arch/arm/mach-at91/at91sam9n12.c +++ b/arch/arm/mach-at91/at91sam9n12.c | |||
@@ -172,6 +172,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
172 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), | 172 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), |
173 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | 173 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), |
174 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | 174 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), |
175 | CLKDEV_CON_DEV_ID("spi_clk", "f0000000.spi", &spi0_clk), | ||
176 | CLKDEV_CON_DEV_ID("spi_clk", "f0004000.spi", &spi1_clk), | ||
175 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), | 177 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), |
176 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), | 178 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), |
177 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), | 179 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index 44a9a62dcc13..a200d8a17123 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
@@ -237,6 +237,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
237 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | 237 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), |
238 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | 238 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), |
239 | CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), | 239 | CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), |
240 | CLKDEV_CON_DEV_ID("spi_clk", "f0000000.spi", &spi0_clk), | ||
241 | CLKDEV_CON_DEV_ID("spi_clk", "f0004000.spi", &spi1_clk), | ||
240 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), | 242 | CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioAB_clk), |
241 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), | 243 | CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioAB_clk), |
242 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), | 244 | CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/cpuidle.c b/arch/arm/mach-at91/cpuidle.c index 0c6381516a5a..48f1228c611c 100644 --- a/arch/arm/mach-at91/cpuidle.c +++ b/arch/arm/mach-at91/cpuidle.c | |||
@@ -27,8 +27,6 @@ | |||
27 | 27 | ||
28 | #define AT91_MAX_STATES 2 | 28 | #define AT91_MAX_STATES 2 |
29 | 29 | ||
30 | static DEFINE_PER_CPU(struct cpuidle_device, at91_cpuidle_device); | ||
31 | |||
32 | /* Actual code that puts the SoC in different idle states */ | 30 | /* Actual code that puts the SoC in different idle states */ |
33 | static int at91_enter_idle(struct cpuidle_device *dev, | 31 | static int at91_enter_idle(struct cpuidle_device *dev, |
34 | struct cpuidle_driver *drv, | 32 | struct cpuidle_driver *drv, |
@@ -47,7 +45,6 @@ static int at91_enter_idle(struct cpuidle_device *dev, | |||
47 | static struct cpuidle_driver at91_idle_driver = { | 45 | static struct cpuidle_driver at91_idle_driver = { |
48 | .name = "at91_idle", | 46 | .name = "at91_idle", |
49 | .owner = THIS_MODULE, | 47 | .owner = THIS_MODULE, |
50 | .en_core_tk_irqen = 1, | ||
51 | .states[0] = ARM_CPUIDLE_WFI_STATE, | 48 | .states[0] = ARM_CPUIDLE_WFI_STATE, |
52 | .states[1] = { | 49 | .states[1] = { |
53 | .enter = at91_enter_idle, | 50 | .enter = at91_enter_idle, |
@@ -61,20 +58,9 @@ static struct cpuidle_driver at91_idle_driver = { | |||
61 | }; | 58 | }; |
62 | 59 | ||
63 | /* Initialize CPU idle by registering the idle states */ | 60 | /* Initialize CPU idle by registering the idle states */ |
64 | static int at91_init_cpuidle(void) | 61 | static int __init at91_init_cpuidle(void) |
65 | { | 62 | { |
66 | struct cpuidle_device *device; | 63 | return cpuidle_register(&at91_idle_driver, NULL); |
67 | |||
68 | device = &per_cpu(at91_cpuidle_device, smp_processor_id()); | ||
69 | device->state_count = AT91_MAX_STATES; | ||
70 | |||
71 | cpuidle_register_driver(&at91_idle_driver); | ||
72 | |||
73 | if (cpuidle_register_device(device)) { | ||
74 | printk(KERN_ERR "at91_init_cpuidle: Failed registering\n"); | ||
75 | return -EIO; | ||
76 | } | ||
77 | return 0; | ||
78 | } | 64 | } |
79 | 65 | ||
80 | device_initcall(at91_init_cpuidle); | 66 | device_initcall(at91_init_cpuidle); |
diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig index bf02471d7e7c..f11289519c39 100644 --- a/arch/arm/mach-bcm/Kconfig +++ b/arch/arm/mach-bcm/Kconfig | |||
@@ -6,6 +6,7 @@ config ARCH_BCM | |||
6 | select ARM_ERRATA_764369 if SMP | 6 | select ARM_ERRATA_764369 if SMP |
7 | select ARM_GIC | 7 | select ARM_GIC |
8 | select CPU_V7 | 8 | select CPU_V7 |
9 | select CLKSRC_OF | ||
9 | select GENERIC_CLOCKEVENTS | 10 | select GENERIC_CLOCKEVENTS |
10 | select GENERIC_TIME | 11 | select GENERIC_TIME |
11 | select GPIO_BCM | 12 | select GPIO_BCM |
diff --git a/arch/arm/mach-bcm/board_bcm.c b/arch/arm/mach-bcm/board_bcm.c index f0f9abafad29..259593540477 100644 --- a/arch/arm/mach-bcm/board_bcm.c +++ b/arch/arm/mach-bcm/board_bcm.c | |||
@@ -16,14 +16,11 @@ | |||
16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/irqchip.h> | 18 | #include <linux/irqchip.h> |
19 | #include <linux/clocksource.h> | ||
19 | 20 | ||
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
22 | 23 | ||
23 | static void timer_init(void) | ||
24 | { | ||
25 | } | ||
26 | |||
27 | 24 | ||
28 | static void __init board_init(void) | 25 | static void __init board_init(void) |
29 | { | 26 | { |
@@ -35,7 +32,7 @@ static const char * const bcm11351_dt_compat[] = { "bcm,bcm11351", NULL, }; | |||
35 | 32 | ||
36 | DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor") | 33 | DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor") |
37 | .init_irq = irqchip_init, | 34 | .init_irq = irqchip_init, |
38 | .init_time = timer_init, | 35 | .init_time = clocksource_of_init, |
39 | .init_machine = board_init, | 36 | .init_machine = board_init, |
40 | .dt_compat = bcm11351_dt_compat, | 37 | .dt_compat = bcm11351_dt_compat, |
41 | MACHINE_END | 38 | MACHINE_END |
diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c index 52e4bb5cf12d..126f74f6087c 100644 --- a/arch/arm/mach-cns3xxx/core.c +++ b/arch/arm/mach-cns3xxx/core.c | |||
@@ -32,16 +32,6 @@ static struct map_desc cns3xxx_io_desc[] __initdata = { | |||
32 | .length = SZ_4K, | 32 | .length = SZ_4K, |
33 | .type = MT_DEVICE, | 33 | .type = MT_DEVICE, |
34 | }, { | 34 | }, { |
35 | .virtual = CNS3XXX_GPIOA_BASE_VIRT, | ||
36 | .pfn = __phys_to_pfn(CNS3XXX_GPIOA_BASE), | ||
37 | .length = SZ_4K, | ||
38 | .type = MT_DEVICE, | ||
39 | }, { | ||
40 | .virtual = CNS3XXX_GPIOB_BASE_VIRT, | ||
41 | .pfn = __phys_to_pfn(CNS3XXX_GPIOB_BASE), | ||
42 | .length = SZ_4K, | ||
43 | .type = MT_DEVICE, | ||
44 | }, { | ||
45 | .virtual = CNS3XXX_MISC_BASE_VIRT, | 35 | .virtual = CNS3XXX_MISC_BASE_VIRT, |
46 | .pfn = __phys_to_pfn(CNS3XXX_MISC_BASE), | 36 | .pfn = __phys_to_pfn(CNS3XXX_MISC_BASE), |
47 | .length = SZ_4K, | 37 | .length = SZ_4K, |
diff --git a/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h b/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h index b1021aafa481..9b145b1e48ea 100644 --- a/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h +++ b/arch/arm/mach-cns3xxx/include/mach/cns3xxx.h | |||
@@ -20,22 +20,16 @@ | |||
20 | #define CNS3XXX_SPI_FLASH_BASE 0x60000000 /* SPI Serial Flash Memory */ | 20 | #define CNS3XXX_SPI_FLASH_BASE 0x60000000 /* SPI Serial Flash Memory */ |
21 | 21 | ||
22 | #define CNS3XXX_SWITCH_BASE 0x70000000 /* Switch and HNAT Control */ | 22 | #define CNS3XXX_SWITCH_BASE 0x70000000 /* Switch and HNAT Control */ |
23 | #define CNS3XXX_SWITCH_BASE_VIRT 0xFFF00000 | ||
24 | 23 | ||
25 | #define CNS3XXX_PPE_BASE 0x70001000 /* HANT */ | 24 | #define CNS3XXX_PPE_BASE 0x70001000 /* HANT */ |
26 | #define CNS3XXX_PPE_BASE_VIRT 0xFFF50000 | ||
27 | 25 | ||
28 | #define CNS3XXX_EMBEDDED_SRAM_BASE 0x70002000 /* HANT Embedded SRAM */ | 26 | #define CNS3XXX_EMBEDDED_SRAM_BASE 0x70002000 /* HANT Embedded SRAM */ |
29 | #define CNS3XXX_EMBEDDED_SRAM_BASE_VIRT 0xFFF60000 | ||
30 | 27 | ||
31 | #define CNS3XXX_SSP_BASE 0x71000000 /* Synchronous Serial Port - SPI/PCM/I2C */ | 28 | #define CNS3XXX_SSP_BASE 0x71000000 /* Synchronous Serial Port - SPI/PCM/I2C */ |
32 | #define CNS3XXX_SSP_BASE_VIRT 0xFFF01000 | ||
33 | 29 | ||
34 | #define CNS3XXX_DMC_BASE 0x72000000 /* DMC Control (DDR2 SDRAM) */ | 30 | #define CNS3XXX_DMC_BASE 0x72000000 /* DMC Control (DDR2 SDRAM) */ |
35 | #define CNS3XXX_DMC_BASE_VIRT 0xFFF02000 | ||
36 | 31 | ||
37 | #define CNS3XXX_SMC_BASE 0x73000000 /* SMC Control */ | 32 | #define CNS3XXX_SMC_BASE 0x73000000 /* SMC Control */ |
38 | #define CNS3XXX_SMC_BASE_VIRT 0xFFF03000 | ||
39 | 33 | ||
40 | #define SMC_MEMC_STATUS_OFFSET 0x000 | 34 | #define SMC_MEMC_STATUS_OFFSET 0x000 |
41 | #define SMC_MEMIF_CFG_OFFSET 0x004 | 35 | #define SMC_MEMIF_CFG_OFFSET 0x004 |
@@ -74,13 +68,10 @@ | |||
74 | #define SMC_PCELL_ID_3_OFFSET 0xFFC | 68 | #define SMC_PCELL_ID_3_OFFSET 0xFFC |
75 | 69 | ||
76 | #define CNS3XXX_GPIOA_BASE 0x74000000 /* GPIO port A */ | 70 | #define CNS3XXX_GPIOA_BASE 0x74000000 /* GPIO port A */ |
77 | #define CNS3XXX_GPIOA_BASE_VIRT 0xFFF04000 | ||
78 | 71 | ||
79 | #define CNS3XXX_GPIOB_BASE 0x74800000 /* GPIO port B */ | 72 | #define CNS3XXX_GPIOB_BASE 0x74800000 /* GPIO port B */ |
80 | #define CNS3XXX_GPIOB_BASE_VIRT 0xFFF05000 | ||
81 | 73 | ||
82 | #define CNS3XXX_RTC_BASE 0x75000000 /* Real Time Clock */ | 74 | #define CNS3XXX_RTC_BASE 0x75000000 /* Real Time Clock */ |
83 | #define CNS3XXX_RTC_BASE_VIRT 0xFFF06000 | ||
84 | 75 | ||
85 | #define RTC_SEC_OFFSET 0x00 | 76 | #define RTC_SEC_OFFSET 0x00 |
86 | #define RTC_MIN_OFFSET 0x04 | 77 | #define RTC_MIN_OFFSET 0x04 |
@@ -112,22 +103,16 @@ | |||
112 | #define CNS3XXX_UART0_BASE_VIRT 0xFB002000 | 103 | #define CNS3XXX_UART0_BASE_VIRT 0xFB002000 |
113 | 104 | ||
114 | #define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */ | 105 | #define CNS3XXX_UART1_BASE 0x78400000 /* UART 1 */ |
115 | #define CNS3XXX_UART1_BASE_VIRT 0xFFF0A000 | ||
116 | 106 | ||
117 | #define CNS3XXX_UART2_BASE 0x78800000 /* UART 2 */ | 107 | #define CNS3XXX_UART2_BASE 0x78800000 /* UART 2 */ |
118 | #define CNS3XXX_UART2_BASE_VIRT 0xFFF0B000 | ||
119 | 108 | ||
120 | #define CNS3XXX_DMAC_BASE 0x79000000 /* Generic DMA Control */ | 109 | #define CNS3XXX_DMAC_BASE 0x79000000 /* Generic DMA Control */ |
121 | #define CNS3XXX_DMAC_BASE_VIRT 0xFFF0D000 | ||
122 | 110 | ||
123 | #define CNS3XXX_CORESIGHT_BASE 0x7A000000 /* CoreSight */ | 111 | #define CNS3XXX_CORESIGHT_BASE 0x7A000000 /* CoreSight */ |
124 | #define CNS3XXX_CORESIGHT_BASE_VIRT 0xFFF0E000 | ||
125 | 112 | ||
126 | #define CNS3XXX_CRYPTO_BASE 0x7B000000 /* Crypto */ | 113 | #define CNS3XXX_CRYPTO_BASE 0x7B000000 /* Crypto */ |
127 | #define CNS3XXX_CRYPTO_BASE_VIRT 0xFFF0F000 | ||
128 | 114 | ||
129 | #define CNS3XXX_I2S_BASE 0x7C000000 /* I2S */ | 115 | #define CNS3XXX_I2S_BASE 0x7C000000 /* I2S */ |
130 | #define CNS3XXX_I2S_BASE_VIRT 0xFFF10000 | ||
131 | 116 | ||
132 | #define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */ | 117 | #define CNS3XXX_TIMER1_2_3_BASE 0x7C800000 /* Timer */ |
133 | #define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFB003000 | 118 | #define CNS3XXX_TIMER1_2_3_BASE_VIRT 0xFB003000 |
@@ -150,42 +135,31 @@ | |||
150 | #define TIMER_FREERUN_CONTROL_OFFSET 0x44 | 135 | #define TIMER_FREERUN_CONTROL_OFFSET 0x44 |
151 | 136 | ||
152 | #define CNS3XXX_HCIE_BASE 0x7D000000 /* HCIE Control */ | 137 | #define CNS3XXX_HCIE_BASE 0x7D000000 /* HCIE Control */ |
153 | #define CNS3XXX_HCIE_BASE_VIRT 0xFFF30000 | ||
154 | 138 | ||
155 | #define CNS3XXX_RAID_BASE 0x7E000000 /* RAID Control */ | 139 | #define CNS3XXX_RAID_BASE 0x7E000000 /* RAID Control */ |
156 | #define CNS3XXX_RAID_BASE_VIRT 0xFFF12000 | ||
157 | 140 | ||
158 | #define CNS3XXX_AXI_IXC_BASE 0x7F000000 /* AXI IXC */ | 141 | #define CNS3XXX_AXI_IXC_BASE 0x7F000000 /* AXI IXC */ |
159 | #define CNS3XXX_AXI_IXC_BASE_VIRT 0xFFF13000 | ||
160 | 142 | ||
161 | #define CNS3XXX_CLCD_BASE 0x80000000 /* LCD Control */ | 143 | #define CNS3XXX_CLCD_BASE 0x80000000 /* LCD Control */ |
162 | #define CNS3XXX_CLCD_BASE_VIRT 0xFFF14000 | ||
163 | 144 | ||
164 | #define CNS3XXX_USBOTG_BASE 0x81000000 /* USB OTG Control */ | 145 | #define CNS3XXX_USBOTG_BASE 0x81000000 /* USB OTG Control */ |
165 | #define CNS3XXX_USBOTG_BASE_VIRT 0xFFF15000 | ||
166 | 146 | ||
167 | #define CNS3XXX_USB_BASE 0x82000000 /* USB Host Control */ | 147 | #define CNS3XXX_USB_BASE 0x82000000 /* USB Host Control */ |
168 | 148 | ||
169 | #define CNS3XXX_SATA2_BASE 0x83000000 /* SATA */ | 149 | #define CNS3XXX_SATA2_BASE 0x83000000 /* SATA */ |
170 | #define CNS3XXX_SATA2_SIZE SZ_16M | 150 | #define CNS3XXX_SATA2_SIZE SZ_16M |
171 | #define CNS3XXX_SATA2_BASE_VIRT 0xFFF17000 | ||
172 | 151 | ||
173 | #define CNS3XXX_CAMERA_BASE 0x84000000 /* Camera Interface */ | 152 | #define CNS3XXX_CAMERA_BASE 0x84000000 /* Camera Interface */ |
174 | #define CNS3XXX_CAMERA_BASE_VIRT 0xFFF18000 | ||
175 | 153 | ||
176 | #define CNS3XXX_SDIO_BASE 0x85000000 /* SDIO */ | 154 | #define CNS3XXX_SDIO_BASE 0x85000000 /* SDIO */ |
177 | #define CNS3XXX_SDIO_BASE_VIRT 0xFFF19000 | ||
178 | 155 | ||
179 | #define CNS3XXX_I2S_TDM_BASE 0x86000000 /* I2S TDM */ | 156 | #define CNS3XXX_I2S_TDM_BASE 0x86000000 /* I2S TDM */ |
180 | #define CNS3XXX_I2S_TDM_BASE_VIRT 0xFFF1A000 | ||
181 | 157 | ||
182 | #define CNS3XXX_2DG_BASE 0x87000000 /* 2D Graphic Control */ | 158 | #define CNS3XXX_2DG_BASE 0x87000000 /* 2D Graphic Control */ |
183 | #define CNS3XXX_2DG_BASE_VIRT 0xFFF1B000 | ||
184 | 159 | ||
185 | #define CNS3XXX_USB_OHCI_BASE 0x88000000 /* USB OHCI */ | 160 | #define CNS3XXX_USB_OHCI_BASE 0x88000000 /* USB OHCI */ |
186 | 161 | ||
187 | #define CNS3XXX_L2C_BASE 0x92000000 /* L2 Cache Control */ | 162 | #define CNS3XXX_L2C_BASE 0x92000000 /* L2 Cache Control */ |
188 | #define CNS3XXX_L2C_BASE_VIRT 0xFFF27000 | ||
189 | 163 | ||
190 | #define CNS3XXX_PCIE0_MEM_BASE 0xA0000000 /* PCIe Port 0 IO/Memory Space */ | 164 | #define CNS3XXX_PCIE0_MEM_BASE 0xA0000000 /* PCIe Port 0 IO/Memory Space */ |
191 | #define CNS3XXX_PCIE0_MEM_BASE_VIRT 0xE0000000 | 165 | #define CNS3XXX_PCIE0_MEM_BASE_VIRT 0xE0000000 |
@@ -239,7 +213,6 @@ | |||
239 | #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000) | 213 | #define CNS3XXX_TC11MP_GIC_DIST_BASE_VIRT (CNS3XXX_TC11MP_SCU_BASE_VIRT + 0x1000) |
240 | 214 | ||
241 | #define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */ | 215 | #define CNS3XXX_TC11MP_L220_BASE 0x92002000 /* L220 registers */ |
242 | #define CNS3XXX_TC11MP_L220_BASE_VIRT 0xFF002000 | ||
243 | 216 | ||
244 | /* | 217 | /* |
245 | * Misc block | 218 | * Misc block |
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index fb5c1aa98a63..dd1ffccc75e9 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile | |||
@@ -37,7 +37,6 @@ obj-$(CONFIG_MACH_MITYOMAPL138) += board-mityomapl138.o | |||
37 | obj-$(CONFIG_MACH_OMAPL138_HAWKBOARD) += board-omapl138-hawk.o | 37 | obj-$(CONFIG_MACH_OMAPL138_HAWKBOARD) += board-omapl138-hawk.o |
38 | 38 | ||
39 | # Power Management | 39 | # Power Management |
40 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | ||
41 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | 40 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o |
42 | obj-$(CONFIG_SUSPEND) += pm.o sleep.o | 41 | obj-$(CONFIG_SUSPEND) += pm.o sleep.o |
43 | obj-$(CONFIG_HAVE_CLK) += pm_domain.o | 42 | obj-$(CONFIG_HAVE_CLK) += pm_domain.o |
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c index 147b8e1a4407..886481c12173 100644 --- a/arch/arm/mach-davinci/board-dm355-evm.c +++ b/arch/arm/mach-davinci/board-dm355-evm.c | |||
@@ -242,6 +242,73 @@ static struct vpfe_config vpfe_cfg = { | |||
242 | .ccdc = "DM355 CCDC", | 242 | .ccdc = "DM355 CCDC", |
243 | }; | 243 | }; |
244 | 244 | ||
245 | /* venc standards timings */ | ||
246 | static struct vpbe_enc_mode_info dm355evm_enc_preset_timing[] = { | ||
247 | { | ||
248 | .name = "ntsc", | ||
249 | .timings_type = VPBE_ENC_STD, | ||
250 | .std_id = V4L2_STD_NTSC, | ||
251 | .interlaced = 1, | ||
252 | .xres = 720, | ||
253 | .yres = 480, | ||
254 | .aspect = {11, 10}, | ||
255 | .fps = {30000, 1001}, | ||
256 | .left_margin = 0x79, | ||
257 | .upper_margin = 0x10, | ||
258 | }, | ||
259 | { | ||
260 | .name = "pal", | ||
261 | .timings_type = VPBE_ENC_STD, | ||
262 | .std_id = V4L2_STD_PAL, | ||
263 | .interlaced = 1, | ||
264 | .xres = 720, | ||
265 | .yres = 576, | ||
266 | .aspect = {54, 59}, | ||
267 | .fps = {25, 1}, | ||
268 | .left_margin = 0x7E, | ||
269 | .upper_margin = 0x16 | ||
270 | }, | ||
271 | }; | ||
272 | |||
273 | #define VENC_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) | ||
274 | |||
275 | /* | ||
276 | * The outputs available from VPBE + ecnoders. Keep the | ||
277 | * the order same as that of encoders. First those from venc followed by that | ||
278 | * from encoders. Index in the output refers to index on a particular encoder. | ||
279 | * Driver uses this index to pass it to encoder when it supports more than | ||
280 | * one output. Application uses index of the array to set an output. | ||
281 | */ | ||
282 | static struct vpbe_output dm355evm_vpbe_outputs[] = { | ||
283 | { | ||
284 | .output = { | ||
285 | .index = 0, | ||
286 | .name = "Composite", | ||
287 | .type = V4L2_OUTPUT_TYPE_ANALOG, | ||
288 | .std = VENC_STD_ALL, | ||
289 | .capabilities = V4L2_OUT_CAP_STD, | ||
290 | }, | ||
291 | .subdev_name = DM355_VPBE_VENC_SUBDEV_NAME, | ||
292 | .default_mode = "ntsc", | ||
293 | .num_modes = ARRAY_SIZE(dm355evm_enc_preset_timing), | ||
294 | .modes = dm355evm_enc_preset_timing, | ||
295 | .if_params = V4L2_MBUS_FMT_FIXED, | ||
296 | }, | ||
297 | }; | ||
298 | |||
299 | static struct vpbe_config dm355evm_display_cfg = { | ||
300 | .module_name = "dm355-vpbe-display", | ||
301 | .i2c_adapter_id = 1, | ||
302 | .osd = { | ||
303 | .module_name = DM355_VPBE_OSD_SUBDEV_NAME, | ||
304 | }, | ||
305 | .venc = { | ||
306 | .module_name = DM355_VPBE_VENC_SUBDEV_NAME, | ||
307 | }, | ||
308 | .num_outputs = ARRAY_SIZE(dm355evm_vpbe_outputs), | ||
309 | .outputs = dm355evm_vpbe_outputs, | ||
310 | }; | ||
311 | |||
245 | static struct platform_device *davinci_evm_devices[] __initdata = { | 312 | static struct platform_device *davinci_evm_devices[] __initdata = { |
246 | &dm355evm_dm9000, | 313 | &dm355evm_dm9000, |
247 | &davinci_nand_device, | 314 | &davinci_nand_device, |
@@ -253,8 +320,6 @@ static struct davinci_uart_config uart_config __initdata = { | |||
253 | 320 | ||
254 | static void __init dm355_evm_map_io(void) | 321 | static void __init dm355_evm_map_io(void) |
255 | { | 322 | { |
256 | /* setup input configuration for VPFE input devices */ | ||
257 | dm355_set_vpfe_config(&vpfe_cfg); | ||
258 | dm355_init(); | 323 | dm355_init(); |
259 | } | 324 | } |
260 | 325 | ||
@@ -344,6 +409,8 @@ static __init void dm355_evm_init(void) | |||
344 | davinci_setup_mmc(0, &dm355evm_mmc_config); | 409 | davinci_setup_mmc(0, &dm355evm_mmc_config); |
345 | davinci_setup_mmc(1, &dm355evm_mmc_config); | 410 | davinci_setup_mmc(1, &dm355evm_mmc_config); |
346 | 411 | ||
412 | dm355_init_video(&vpfe_cfg, &dm355evm_display_cfg); | ||
413 | |||
347 | dm355_init_spi0(BIT(0), dm355_evm_spi_info, | 414 | dm355_init_spi0(BIT(0), dm355_evm_spi_info, |
348 | ARRAY_SIZE(dm355_evm_spi_info)); | 415 | ARRAY_SIZE(dm355_evm_spi_info)); |
349 | 416 | ||
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c index c2d4958a0cb6..2a6674356585 100644 --- a/arch/arm/mach-davinci/board-dm365-evm.c +++ b/arch/arm/mach-davinci/board-dm365-evm.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/input.h> | 27 | #include <linux/input.h> |
28 | #include <linux/spi/spi.h> | 28 | #include <linux/spi/spi.h> |
29 | #include <linux/spi/eeprom.h> | 29 | #include <linux/spi/eeprom.h> |
30 | #include <linux/v4l2-dv-timings.h> | ||
30 | 31 | ||
31 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
@@ -39,6 +40,7 @@ | |||
39 | #include <linux/platform_data/mtd-davinci.h> | 40 | #include <linux/platform_data/mtd-davinci.h> |
40 | #include <linux/platform_data/keyscan-davinci.h> | 41 | #include <linux/platform_data/keyscan-davinci.h> |
41 | 42 | ||
43 | #include <media/ths7303.h> | ||
42 | #include <media/tvp514x.h> | 44 | #include <media/tvp514x.h> |
43 | 45 | ||
44 | #include "davinci.h" | 46 | #include "davinci.h" |
@@ -374,6 +376,166 @@ static struct vpfe_config vpfe_cfg = { | |||
374 | .ccdc = "ISIF", | 376 | .ccdc = "ISIF", |
375 | }; | 377 | }; |
376 | 378 | ||
379 | /* venc standards timings */ | ||
380 | static struct vpbe_enc_mode_info dm365evm_enc_std_timing[] = { | ||
381 | { | ||
382 | .name = "ntsc", | ||
383 | .timings_type = VPBE_ENC_STD, | ||
384 | .std_id = V4L2_STD_NTSC, | ||
385 | .interlaced = 1, | ||
386 | .xres = 720, | ||
387 | .yres = 480, | ||
388 | .aspect = {11, 10}, | ||
389 | .fps = {30000, 1001}, | ||
390 | .left_margin = 0x79, | ||
391 | .upper_margin = 0x10, | ||
392 | }, | ||
393 | { | ||
394 | .name = "pal", | ||
395 | .timings_type = VPBE_ENC_STD, | ||
396 | .std_id = V4L2_STD_PAL, | ||
397 | .interlaced = 1, | ||
398 | .xres = 720, | ||
399 | .yres = 576, | ||
400 | .aspect = {54, 59}, | ||
401 | .fps = {25, 1}, | ||
402 | .left_margin = 0x7E, | ||
403 | .upper_margin = 0x16, | ||
404 | }, | ||
405 | }; | ||
406 | |||
407 | /* venc dv timings */ | ||
408 | static struct vpbe_enc_mode_info dm365evm_enc_preset_timing[] = { | ||
409 | { | ||
410 | .name = "480p59_94", | ||
411 | .timings_type = VPBE_ENC_DV_TIMINGS, | ||
412 | .dv_timings = V4L2_DV_BT_CEA_720X480P59_94, | ||
413 | .interlaced = 0, | ||
414 | .xres = 720, | ||
415 | .yres = 480, | ||
416 | .aspect = {1, 1}, | ||
417 | .fps = {5994, 100}, | ||
418 | .left_margin = 0x8F, | ||
419 | .upper_margin = 0x2D, | ||
420 | }, | ||
421 | { | ||
422 | .name = "576p50", | ||
423 | .timings_type = VPBE_ENC_DV_TIMINGS, | ||
424 | .dv_timings = V4L2_DV_BT_CEA_720X576P50, | ||
425 | .interlaced = 0, | ||
426 | .xres = 720, | ||
427 | .yres = 576, | ||
428 | .aspect = {1, 1}, | ||
429 | .fps = {50, 1}, | ||
430 | .left_margin = 0x8C, | ||
431 | .upper_margin = 0x36, | ||
432 | }, | ||
433 | { | ||
434 | .name = "720p60", | ||
435 | .timings_type = VPBE_ENC_DV_TIMINGS, | ||
436 | .dv_timings = V4L2_DV_BT_CEA_1280X720P60, | ||
437 | .interlaced = 0, | ||
438 | .xres = 1280, | ||
439 | .yres = 720, | ||
440 | .aspect = {1, 1}, | ||
441 | .fps = {60, 1}, | ||
442 | .left_margin = 0x117, | ||
443 | .right_margin = 70, | ||
444 | .upper_margin = 38, | ||
445 | .lower_margin = 3, | ||
446 | .hsync_len = 80, | ||
447 | .vsync_len = 5, | ||
448 | }, | ||
449 | { | ||
450 | .name = "1080i60", | ||
451 | .timings_type = VPBE_ENC_DV_TIMINGS, | ||
452 | .dv_timings = V4L2_DV_BT_CEA_1920X1080I60, | ||
453 | .interlaced = 1, | ||
454 | .xres = 1920, | ||
455 | .yres = 1080, | ||
456 | .aspect = {1, 1}, | ||
457 | .fps = {30, 1}, | ||
458 | .left_margin = 0xc9, | ||
459 | .right_margin = 80, | ||
460 | .upper_margin = 30, | ||
461 | .lower_margin = 3, | ||
462 | .hsync_len = 88, | ||
463 | .vsync_len = 5, | ||
464 | }, | ||
465 | }; | ||
466 | |||
467 | #define VENC_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) | ||
468 | |||
469 | /* | ||
470 | * The outputs available from VPBE + ecnoders. Keep the | ||
471 | * the order same as that of encoders. First those from venc followed by that | ||
472 | * from encoders. Index in the output refers to index on a particular | ||
473 | * encoder.Driver uses this index to pass it to encoder when it supports more | ||
474 | * than one output. Application uses index of the array to set an output. | ||
475 | */ | ||
476 | static struct vpbe_output dm365evm_vpbe_outputs[] = { | ||
477 | { | ||
478 | .output = { | ||
479 | .index = 0, | ||
480 | .name = "Composite", | ||
481 | .type = V4L2_OUTPUT_TYPE_ANALOG, | ||
482 | .std = VENC_STD_ALL, | ||
483 | .capabilities = V4L2_OUT_CAP_STD, | ||
484 | }, | ||
485 | .subdev_name = DM365_VPBE_VENC_SUBDEV_NAME, | ||
486 | .default_mode = "ntsc", | ||
487 | .num_modes = ARRAY_SIZE(dm365evm_enc_std_timing), | ||
488 | .modes = dm365evm_enc_std_timing, | ||
489 | .if_params = V4L2_MBUS_FMT_FIXED, | ||
490 | }, | ||
491 | { | ||
492 | .output = { | ||
493 | .index = 1, | ||
494 | .name = "Component", | ||
495 | .type = V4L2_OUTPUT_TYPE_ANALOG, | ||
496 | .capabilities = V4L2_OUT_CAP_DV_TIMINGS, | ||
497 | }, | ||
498 | .subdev_name = DM365_VPBE_VENC_SUBDEV_NAME, | ||
499 | .default_mode = "480p59_94", | ||
500 | .num_modes = ARRAY_SIZE(dm365evm_enc_preset_timing), | ||
501 | .modes = dm365evm_enc_preset_timing, | ||
502 | .if_params = V4L2_MBUS_FMT_FIXED, | ||
503 | }, | ||
504 | }; | ||
505 | |||
506 | /* | ||
507 | * Amplifiers on the board | ||
508 | */ | ||
509 | struct ths7303_platform_data ths7303_pdata = { | ||
510 | .ch_1 = 3, | ||
511 | .ch_2 = 3, | ||
512 | .ch_3 = 3, | ||
513 | .init_enable = 1, | ||
514 | }; | ||
515 | |||
516 | static struct amp_config_info vpbe_amp = { | ||
517 | .module_name = "ths7303", | ||
518 | .is_i2c = 1, | ||
519 | .board_info = { | ||
520 | I2C_BOARD_INFO("ths7303", 0x2c), | ||
521 | .platform_data = &ths7303_pdata, | ||
522 | } | ||
523 | }; | ||
524 | |||
525 | static struct vpbe_config dm365evm_display_cfg = { | ||
526 | .module_name = "dm365-vpbe-display", | ||
527 | .i2c_adapter_id = 1, | ||
528 | .amp = &vpbe_amp, | ||
529 | .osd = { | ||
530 | .module_name = DM365_VPBE_OSD_SUBDEV_NAME, | ||
531 | }, | ||
532 | .venc = { | ||
533 | .module_name = DM365_VPBE_VENC_SUBDEV_NAME, | ||
534 | }, | ||
535 | .num_outputs = ARRAY_SIZE(dm365evm_vpbe_outputs), | ||
536 | .outputs = dm365evm_vpbe_outputs, | ||
537 | }; | ||
538 | |||
377 | static void __init evm_init_i2c(void) | 539 | static void __init evm_init_i2c(void) |
378 | { | 540 | { |
379 | davinci_init_i2c(&i2c_pdata); | 541 | davinci_init_i2c(&i2c_pdata); |
@@ -564,8 +726,6 @@ static struct davinci_uart_config uart_config __initdata = { | |||
564 | 726 | ||
565 | static void __init dm365_evm_map_io(void) | 727 | static void __init dm365_evm_map_io(void) |
566 | { | 728 | { |
567 | /* setup input configuration for VPFE input devices */ | ||
568 | dm365_set_vpfe_config(&vpfe_cfg); | ||
569 | dm365_init(); | 729 | dm365_init(); |
570 | } | 730 | } |
571 | 731 | ||
@@ -597,6 +757,8 @@ static __init void dm365_evm_init(void) | |||
597 | 757 | ||
598 | davinci_setup_mmc(0, &dm365evm_mmc_config); | 758 | davinci_setup_mmc(0, &dm365evm_mmc_config); |
599 | 759 | ||
760 | dm365_init_video(&vpfe_cfg, &dm365evm_display_cfg); | ||
761 | |||
600 | /* maybe setup mmc1/etc ... _after_ mmc0 */ | 762 | /* maybe setup mmc1/etc ... _after_ mmc0 */ |
601 | evm_init_cpld(); | 763 | evm_init_cpld(); |
602 | 764 | ||
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 71735e7797cc..745280d4144c 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c | |||
@@ -622,7 +622,7 @@ static struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { | |||
622 | { | 622 | { |
623 | .name = "ntsc", | 623 | .name = "ntsc", |
624 | .timings_type = VPBE_ENC_STD, | 624 | .timings_type = VPBE_ENC_STD, |
625 | .std_id = V4L2_STD_525_60, | 625 | .std_id = V4L2_STD_NTSC, |
626 | .interlaced = 1, | 626 | .interlaced = 1, |
627 | .xres = 720, | 627 | .xres = 720, |
628 | .yres = 480, | 628 | .yres = 480, |
@@ -634,7 +634,7 @@ static struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { | |||
634 | { | 634 | { |
635 | .name = "pal", | 635 | .name = "pal", |
636 | .timings_type = VPBE_ENC_STD, | 636 | .timings_type = VPBE_ENC_STD, |
637 | .std_id = V4L2_STD_625_50, | 637 | .std_id = V4L2_STD_PAL, |
638 | .interlaced = 1, | 638 | .interlaced = 1, |
639 | .xres = 720, | 639 | .xres = 720, |
640 | .yres = 576, | 640 | .yres = 576, |
@@ -649,7 +649,7 @@ static struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { | |||
649 | static struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { | 649 | static struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { |
650 | { | 650 | { |
651 | .name = "480p59_94", | 651 | .name = "480p59_94", |
652 | .timings_type = VPBE_ENC_CUSTOM_TIMINGS, | 652 | .timings_type = VPBE_ENC_DV_TIMINGS, |
653 | .dv_timings = V4L2_DV_BT_CEA_720X480P59_94, | 653 | .dv_timings = V4L2_DV_BT_CEA_720X480P59_94, |
654 | .interlaced = 0, | 654 | .interlaced = 0, |
655 | .xres = 720, | 655 | .xres = 720, |
@@ -661,7 +661,7 @@ static struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { | |||
661 | }, | 661 | }, |
662 | { | 662 | { |
663 | .name = "576p50", | 663 | .name = "576p50", |
664 | .timings_type = VPBE_ENC_CUSTOM_TIMINGS, | 664 | .timings_type = VPBE_ENC_DV_TIMINGS, |
665 | .dv_timings = V4L2_DV_BT_CEA_720X576P50, | 665 | .dv_timings = V4L2_DV_BT_CEA_720X576P50, |
666 | .interlaced = 0, | 666 | .interlaced = 0, |
667 | .xres = 720, | 667 | .xres = 720, |
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c index de7adff324dc..fc4871ac1c2c 100644 --- a/arch/arm/mach-davinci/board-dm646x-evm.c +++ b/arch/arm/mach-davinci/board-dm646x-evm.c | |||
@@ -514,7 +514,7 @@ static const struct vpif_output dm6467_ch0_outputs[] = { | |||
514 | .index = 1, | 514 | .index = 1, |
515 | .name = "Component", | 515 | .name = "Component", |
516 | .type = V4L2_OUTPUT_TYPE_ANALOG, | 516 | .type = V4L2_OUTPUT_TYPE_ANALOG, |
517 | .capabilities = V4L2_OUT_CAP_CUSTOM_TIMINGS, | 517 | .capabilities = V4L2_OUT_CAP_DV_TIMINGS, |
518 | }, | 518 | }, |
519 | .subdev_name = "adv7343", | 519 | .subdev_name = "adv7343", |
520 | .output_route = ADV7343_COMPONENT_ID, | 520 | .output_route = ADV7343_COMPONENT_ID, |
diff --git a/arch/arm/mach-davinci/cpufreq.c b/arch/arm/mach-davinci/cpufreq.c deleted file mode 100644 index 4729eaab0f40..000000000000 --- a/arch/arm/mach-davinci/cpufreq.c +++ /dev/null | |||
@@ -1,248 +0,0 @@ | |||
1 | /* | ||
2 | * CPU frequency scaling for DaVinci | ||
3 | * | ||
4 | * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/ | ||
5 | * | ||
6 | * Based on linux/arch/arm/plat-omap/cpu-omap.c. Original Copyright follows: | ||
7 | * | ||
8 | * Copyright (C) 2005 Nokia Corporation | ||
9 | * Written by Tony Lindgren <tony@atomide.com> | ||
10 | * | ||
11 | * Based on cpu-sa1110.c, Copyright (C) 2001 Russell King | ||
12 | * | ||
13 | * Copyright (C) 2007-2008 Texas Instruments, Inc. | ||
14 | * Updated to support OMAP3 | ||
15 | * Rajendra Nayak <rnayak@ti.com> | ||
16 | * | ||
17 | * This program is free software; you can redistribute it and/or modify | ||
18 | * it under the terms of the GNU General Public License version 2 as | ||
19 | * published by the Free Software Foundation. | ||
20 | */ | ||
21 | #include <linux/types.h> | ||
22 | #include <linux/cpufreq.h> | ||
23 | #include <linux/init.h> | ||
24 | #include <linux/err.h> | ||
25 | #include <linux/clk.h> | ||
26 | #include <linux/platform_device.h> | ||
27 | #include <linux/export.h> | ||
28 | |||
29 | #include <mach/hardware.h> | ||
30 | #include <mach/cpufreq.h> | ||
31 | #include <mach/common.h> | ||
32 | |||
33 | #include "clock.h" | ||
34 | |||
35 | struct davinci_cpufreq { | ||
36 | struct device *dev; | ||
37 | struct clk *armclk; | ||
38 | struct clk *asyncclk; | ||
39 | unsigned long asyncrate; | ||
40 | }; | ||
41 | static struct davinci_cpufreq cpufreq; | ||
42 | |||
43 | static int davinci_verify_speed(struct cpufreq_policy *policy) | ||
44 | { | ||
45 | struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; | ||
46 | struct cpufreq_frequency_table *freq_table = pdata->freq_table; | ||
47 | struct clk *armclk = cpufreq.armclk; | ||
48 | |||
49 | if (freq_table) | ||
50 | return cpufreq_frequency_table_verify(policy, freq_table); | ||
51 | |||
52 | if (policy->cpu) | ||
53 | return -EINVAL; | ||
54 | |||
55 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | ||
56 | policy->cpuinfo.max_freq); | ||
57 | |||
58 | policy->min = clk_round_rate(armclk, policy->min * 1000) / 1000; | ||
59 | policy->max = clk_round_rate(armclk, policy->max * 1000) / 1000; | ||
60 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | ||
61 | policy->cpuinfo.max_freq); | ||
62 | return 0; | ||
63 | } | ||
64 | |||
65 | static unsigned int davinci_getspeed(unsigned int cpu) | ||
66 | { | ||
67 | if (cpu) | ||
68 | return 0; | ||
69 | |||
70 | return clk_get_rate(cpufreq.armclk) / 1000; | ||
71 | } | ||
72 | |||
73 | static int davinci_target(struct cpufreq_policy *policy, | ||
74 | unsigned int target_freq, unsigned int relation) | ||
75 | { | ||
76 | int ret = 0; | ||
77 | unsigned int idx; | ||
78 | struct cpufreq_freqs freqs; | ||
79 | struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; | ||
80 | struct clk *armclk = cpufreq.armclk; | ||
81 | |||
82 | /* | ||
83 | * Ensure desired rate is within allowed range. Some govenors | ||
84 | * (ondemand) will just pass target_freq=0 to get the minimum. | ||
85 | */ | ||
86 | if (target_freq < policy->cpuinfo.min_freq) | ||
87 | target_freq = policy->cpuinfo.min_freq; | ||
88 | if (target_freq > policy->cpuinfo.max_freq) | ||
89 | target_freq = policy->cpuinfo.max_freq; | ||
90 | |||
91 | freqs.old = davinci_getspeed(0); | ||
92 | freqs.new = clk_round_rate(armclk, target_freq * 1000) / 1000; | ||
93 | freqs.cpu = 0; | ||
94 | |||
95 | if (freqs.old == freqs.new) | ||
96 | return ret; | ||
97 | |||
98 | dev_dbg(cpufreq.dev, "transition: %u --> %u\n", freqs.old, freqs.new); | ||
99 | |||
100 | ret = cpufreq_frequency_table_target(policy, pdata->freq_table, | ||
101 | freqs.new, relation, &idx); | ||
102 | if (ret) | ||
103 | return -EINVAL; | ||
104 | |||
105 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
106 | |||
107 | /* if moving to higher frequency, up the voltage beforehand */ | ||
108 | if (pdata->set_voltage && freqs.new > freqs.old) { | ||
109 | ret = pdata->set_voltage(idx); | ||
110 | if (ret) | ||
111 | goto out; | ||
112 | } | ||
113 | |||
114 | ret = clk_set_rate(armclk, idx); | ||
115 | if (ret) | ||
116 | goto out; | ||
117 | |||
118 | if (cpufreq.asyncclk) { | ||
119 | ret = clk_set_rate(cpufreq.asyncclk, cpufreq.asyncrate); | ||
120 | if (ret) | ||
121 | goto out; | ||
122 | } | ||
123 | |||
124 | /* if moving to lower freq, lower the voltage after lowering freq */ | ||
125 | if (pdata->set_voltage && freqs.new < freqs.old) | ||
126 | pdata->set_voltage(idx); | ||
127 | |||
128 | out: | ||
129 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
130 | |||
131 | return ret; | ||
132 | } | ||
133 | |||
134 | static int davinci_cpu_init(struct cpufreq_policy *policy) | ||
135 | { | ||
136 | int result = 0; | ||
137 | struct davinci_cpufreq_config *pdata = cpufreq.dev->platform_data; | ||
138 | struct cpufreq_frequency_table *freq_table = pdata->freq_table; | ||
139 | |||
140 | if (policy->cpu != 0) | ||
141 | return -EINVAL; | ||
142 | |||
143 | /* Finish platform specific initialization */ | ||
144 | if (pdata->init) { | ||
145 | result = pdata->init(); | ||
146 | if (result) | ||
147 | return result; | ||
148 | } | ||
149 | |||
150 | policy->cur = policy->min = policy->max = davinci_getspeed(0); | ||
151 | |||
152 | if (freq_table) { | ||
153 | result = cpufreq_frequency_table_cpuinfo(policy, freq_table); | ||
154 | if (!result) | ||
155 | cpufreq_frequency_table_get_attr(freq_table, | ||
156 | policy->cpu); | ||
157 | } else { | ||
158 | policy->cpuinfo.min_freq = policy->min; | ||
159 | policy->cpuinfo.max_freq = policy->max; | ||
160 | } | ||
161 | |||
162 | policy->min = policy->cpuinfo.min_freq; | ||
163 | policy->max = policy->cpuinfo.max_freq; | ||
164 | policy->cur = davinci_getspeed(0); | ||
165 | |||
166 | /* | ||
167 | * Time measurement across the target() function yields ~1500-1800us | ||
168 | * time taken with no drivers on notification list. | ||
169 | * Setting the latency to 2000 us to accommodate addition of drivers | ||
170 | * to pre/post change notification list. | ||
171 | */ | ||
172 | policy->cpuinfo.transition_latency = 2000 * 1000; | ||
173 | return 0; | ||
174 | } | ||
175 | |||
176 | static int davinci_cpu_exit(struct cpufreq_policy *policy) | ||
177 | { | ||
178 | cpufreq_frequency_table_put_attr(policy->cpu); | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | static struct freq_attr *davinci_cpufreq_attr[] = { | ||
183 | &cpufreq_freq_attr_scaling_available_freqs, | ||
184 | NULL, | ||
185 | }; | ||
186 | |||
187 | static struct cpufreq_driver davinci_driver = { | ||
188 | .flags = CPUFREQ_STICKY, | ||
189 | .verify = davinci_verify_speed, | ||
190 | .target = davinci_target, | ||
191 | .get = davinci_getspeed, | ||
192 | .init = davinci_cpu_init, | ||
193 | .exit = davinci_cpu_exit, | ||
194 | .name = "davinci", | ||
195 | .attr = davinci_cpufreq_attr, | ||
196 | }; | ||
197 | |||
198 | static int __init davinci_cpufreq_probe(struct platform_device *pdev) | ||
199 | { | ||
200 | struct davinci_cpufreq_config *pdata = pdev->dev.platform_data; | ||
201 | struct clk *asyncclk; | ||
202 | |||
203 | if (!pdata) | ||
204 | return -EINVAL; | ||
205 | if (!pdata->freq_table) | ||
206 | return -EINVAL; | ||
207 | |||
208 | cpufreq.dev = &pdev->dev; | ||
209 | |||
210 | cpufreq.armclk = clk_get(NULL, "arm"); | ||
211 | if (IS_ERR(cpufreq.armclk)) { | ||
212 | dev_err(cpufreq.dev, "Unable to get ARM clock\n"); | ||
213 | return PTR_ERR(cpufreq.armclk); | ||
214 | } | ||
215 | |||
216 | asyncclk = clk_get(cpufreq.dev, "async"); | ||
217 | if (!IS_ERR(asyncclk)) { | ||
218 | cpufreq.asyncclk = asyncclk; | ||
219 | cpufreq.asyncrate = clk_get_rate(asyncclk); | ||
220 | } | ||
221 | |||
222 | return cpufreq_register_driver(&davinci_driver); | ||
223 | } | ||
224 | |||
225 | static int __exit davinci_cpufreq_remove(struct platform_device *pdev) | ||
226 | { | ||
227 | clk_put(cpufreq.armclk); | ||
228 | |||
229 | if (cpufreq.asyncclk) | ||
230 | clk_put(cpufreq.asyncclk); | ||
231 | |||
232 | return cpufreq_unregister_driver(&davinci_driver); | ||
233 | } | ||
234 | |||
235 | static struct platform_driver davinci_cpufreq_driver = { | ||
236 | .driver = { | ||
237 | .name = "cpufreq-davinci", | ||
238 | .owner = THIS_MODULE, | ||
239 | }, | ||
240 | .remove = __exit_p(davinci_cpufreq_remove), | ||
241 | }; | ||
242 | |||
243 | int __init davinci_cpufreq_init(void) | ||
244 | { | ||
245 | return platform_driver_probe(&davinci_cpufreq_driver, | ||
246 | davinci_cpufreq_probe); | ||
247 | } | ||
248 | |||
diff --git a/arch/arm/mach-davinci/cpuidle.c b/arch/arm/mach-davinci/cpuidle.c index 5ac9e9384b15..36aef3a7dedb 100644 --- a/arch/arm/mach-davinci/cpuidle.c +++ b/arch/arm/mach-davinci/cpuidle.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #define DAVINCI_CPUIDLE_MAX_STATES 2 | 26 | #define DAVINCI_CPUIDLE_MAX_STATES 2 |
27 | 27 | ||
28 | static DEFINE_PER_CPU(struct cpuidle_device, davinci_cpuidle_device); | ||
29 | static void __iomem *ddr2_reg_base; | 28 | static void __iomem *ddr2_reg_base; |
30 | static bool ddr2_pdown; | 29 | static bool ddr2_pdown; |
31 | 30 | ||
@@ -50,14 +49,10 @@ static void davinci_save_ddr_power(int enter, bool pdown) | |||
50 | 49 | ||
51 | /* Actual code that puts the SoC in different idle states */ | 50 | /* Actual code that puts the SoC in different idle states */ |
52 | static int davinci_enter_idle(struct cpuidle_device *dev, | 51 | static int davinci_enter_idle(struct cpuidle_device *dev, |
53 | struct cpuidle_driver *drv, | 52 | struct cpuidle_driver *drv, int index) |
54 | int index) | ||
55 | { | 53 | { |
56 | davinci_save_ddr_power(1, ddr2_pdown); | 54 | davinci_save_ddr_power(1, ddr2_pdown); |
57 | 55 | cpu_do_idle(); | |
58 | index = cpuidle_wrap_enter(dev, drv, index, | ||
59 | arm_cpuidle_simple_enter); | ||
60 | |||
61 | davinci_save_ddr_power(0, ddr2_pdown); | 56 | davinci_save_ddr_power(0, ddr2_pdown); |
62 | 57 | ||
63 | return index; | 58 | return index; |
@@ -66,7 +61,6 @@ static int davinci_enter_idle(struct cpuidle_device *dev, | |||
66 | static struct cpuidle_driver davinci_idle_driver = { | 61 | static struct cpuidle_driver davinci_idle_driver = { |
67 | .name = "cpuidle-davinci", | 62 | .name = "cpuidle-davinci", |
68 | .owner = THIS_MODULE, | 63 | .owner = THIS_MODULE, |
69 | .en_core_tk_irqen = 1, | ||
70 | .states[0] = ARM_CPUIDLE_WFI_STATE, | 64 | .states[0] = ARM_CPUIDLE_WFI_STATE, |
71 | .states[1] = { | 65 | .states[1] = { |
72 | .enter = davinci_enter_idle, | 66 | .enter = davinci_enter_idle, |
@@ -81,12 +75,8 @@ static struct cpuidle_driver davinci_idle_driver = { | |||
81 | 75 | ||
82 | static int __init davinci_cpuidle_probe(struct platform_device *pdev) | 76 | static int __init davinci_cpuidle_probe(struct platform_device *pdev) |
83 | { | 77 | { |
84 | int ret; | ||
85 | struct cpuidle_device *device; | ||
86 | struct davinci_cpuidle_config *pdata = pdev->dev.platform_data; | 78 | struct davinci_cpuidle_config *pdata = pdev->dev.platform_data; |
87 | 79 | ||
88 | device = &per_cpu(davinci_cpuidle_device, smp_processor_id()); | ||
89 | |||
90 | if (!pdata) { | 80 | if (!pdata) { |
91 | dev_err(&pdev->dev, "cannot get platform data\n"); | 81 | dev_err(&pdev->dev, "cannot get platform data\n"); |
92 | return -ENOENT; | 82 | return -ENOENT; |
@@ -96,20 +86,7 @@ static int __init davinci_cpuidle_probe(struct platform_device *pdev) | |||
96 | 86 | ||
97 | ddr2_pdown = pdata->ddr2_pdown; | 87 | ddr2_pdown = pdata->ddr2_pdown; |
98 | 88 | ||
99 | ret = cpuidle_register_driver(&davinci_idle_driver); | 89 | return cpuidle_register(&davinci_idle_driver, NULL); |
100 | if (ret) { | ||
101 | dev_err(&pdev->dev, "failed to register driver\n"); | ||
102 | return ret; | ||
103 | } | ||
104 | |||
105 | ret = cpuidle_register_device(device); | ||
106 | if (ret) { | ||
107 | dev_err(&pdev->dev, "failed to register device\n"); | ||
108 | cpuidle_unregister_driver(&davinci_idle_driver); | ||
109 | return ret; | ||
110 | } | ||
111 | |||
112 | return 0; | ||
113 | } | 90 | } |
114 | 91 | ||
115 | static struct platform_driver davinci_cpuidle_driver = { | 92 | static struct platform_driver davinci_cpuidle_driver = { |
diff --git a/arch/arm/mach-davinci/davinci.h b/arch/arm/mach-davinci/davinci.h index 12d544befcfa..1ab3df423dac 100644 --- a/arch/arm/mach-davinci/davinci.h +++ b/arch/arm/mach-davinci/davinci.h | |||
@@ -36,12 +36,19 @@ | |||
36 | #include <media/davinci/vpbe_osd.h> | 36 | #include <media/davinci/vpbe_osd.h> |
37 | 37 | ||
38 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01c40000 | 38 | #define DAVINCI_SYSTEM_MODULE_BASE 0x01c40000 |
39 | #define SYSMOD_VDAC_CONFIG 0x2c | ||
39 | #define SYSMOD_VIDCLKCTL 0x38 | 40 | #define SYSMOD_VIDCLKCTL 0x38 |
40 | #define SYSMOD_VPSS_CLKCTL 0x44 | 41 | #define SYSMOD_VPSS_CLKCTL 0x44 |
41 | #define SYSMOD_VDD3P3VPWDN 0x48 | 42 | #define SYSMOD_VDD3P3VPWDN 0x48 |
42 | #define SYSMOD_VSCLKDIS 0x6c | 43 | #define SYSMOD_VSCLKDIS 0x6c |
43 | #define SYSMOD_PUPDCTL1 0x7c | 44 | #define SYSMOD_PUPDCTL1 0x7c |
44 | 45 | ||
46 | /* VPSS CLKCTL bit definitions */ | ||
47 | #define VPSS_MUXSEL_EXTCLK_ENABLE BIT(1) | ||
48 | #define VPSS_VENCCLKEN_ENABLE BIT(3) | ||
49 | #define VPSS_DACCLKEN_ENABLE BIT(4) | ||
50 | #define VPSS_PLLC2SYSCLK5_ENABLE BIT(5) | ||
51 | |||
45 | extern void __iomem *davinci_sysmod_base; | 52 | extern void __iomem *davinci_sysmod_base; |
46 | #define DAVINCI_SYSMOD_VIRT(x) (davinci_sysmod_base + (x)) | 53 | #define DAVINCI_SYSMOD_VIRT(x) (davinci_sysmod_base + (x)) |
47 | void davinci_map_sysmod(void); | 54 | void davinci_map_sysmod(void); |
@@ -74,7 +81,7 @@ void __init dm355_init(void); | |||
74 | void dm355_init_spi0(unsigned chipselect_mask, | 81 | void dm355_init_spi0(unsigned chipselect_mask, |
75 | const struct spi_board_info *info, unsigned len); | 82 | const struct spi_board_info *info, unsigned len); |
76 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata); | 83 | void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata); |
77 | void dm355_set_vpfe_config(struct vpfe_config *cfg); | 84 | int dm355_init_video(struct vpfe_config *, struct vpbe_config *); |
78 | 85 | ||
79 | /* DM365 function declarations */ | 86 | /* DM365 function declarations */ |
80 | void __init dm365_init(void); | 87 | void __init dm365_init(void); |
@@ -84,7 +91,7 @@ void __init dm365_init_ks(struct davinci_ks_platform_data *pdata); | |||
84 | void __init dm365_init_rtc(void); | 91 | void __init dm365_init_rtc(void); |
85 | void dm365_init_spi0(unsigned chipselect_mask, | 92 | void dm365_init_spi0(unsigned chipselect_mask, |
86 | const struct spi_board_info *info, unsigned len); | 93 | const struct spi_board_info *info, unsigned len); |
87 | void dm365_set_vpfe_config(struct vpfe_config *cfg); | 94 | int dm365_init_video(struct vpfe_config *, struct vpbe_config *); |
88 | 95 | ||
89 | /* DM644x function declarations */ | 96 | /* DM644x function declarations */ |
90 | void __init dm644x_init(void); | 97 | void __init dm644x_init(void); |
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index b49c3b77d55e..bf9a9d4ad9f5 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c | |||
@@ -35,6 +35,8 @@ | |||
35 | #include "asp.h" | 35 | #include "asp.h" |
36 | 36 | ||
37 | #define DM355_UART2_BASE (IO_PHYS + 0x206000) | 37 | #define DM355_UART2_BASE (IO_PHYS + 0x206000) |
38 | #define DM355_OSD_BASE (IO_PHYS + 0x70200) | ||
39 | #define DM355_VENC_BASE (IO_PHYS + 0x70400) | ||
38 | 40 | ||
39 | /* | 41 | /* |
40 | * Device specific clocks | 42 | * Device specific clocks |
@@ -345,8 +347,8 @@ static struct clk_lookup dm355_clks[] = { | |||
345 | CLK(NULL, "pll1_aux", &pll1_aux_clk), | 347 | CLK(NULL, "pll1_aux", &pll1_aux_clk), |
346 | CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp), | 348 | CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp), |
347 | CLK(NULL, "vpss_dac", &vpss_dac_clk), | 349 | CLK(NULL, "vpss_dac", &vpss_dac_clk), |
348 | CLK(NULL, "vpss_master", &vpss_master_clk), | 350 | CLK("vpss", "master", &vpss_master_clk), |
349 | CLK(NULL, "vpss_slave", &vpss_slave_clk), | 351 | CLK("vpss", "slave", &vpss_slave_clk), |
350 | CLK(NULL, "clkout1", &clkout1_clk), | 352 | CLK(NULL, "clkout1", &clkout1_clk), |
351 | CLK(NULL, "clkout2", &clkout2_clk), | 353 | CLK(NULL, "clkout2", &clkout2_clk), |
352 | CLK(NULL, "pll2", &pll2_clk), | 354 | CLK(NULL, "pll2", &pll2_clk), |
@@ -744,11 +746,146 @@ static struct platform_device vpfe_capture_dev = { | |||
744 | }, | 746 | }, |
745 | }; | 747 | }; |
746 | 748 | ||
747 | void dm355_set_vpfe_config(struct vpfe_config *cfg) | 749 | static struct resource dm355_osd_resources[] = { |
750 | { | ||
751 | .start = DM355_OSD_BASE, | ||
752 | .end = DM355_OSD_BASE + 0x17f, | ||
753 | .flags = IORESOURCE_MEM, | ||
754 | }, | ||
755 | }; | ||
756 | |||
757 | static struct platform_device dm355_osd_dev = { | ||
758 | .name = DM355_VPBE_OSD_SUBDEV_NAME, | ||
759 | .id = -1, | ||
760 | .num_resources = ARRAY_SIZE(dm355_osd_resources), | ||
761 | .resource = dm355_osd_resources, | ||
762 | .dev = { | ||
763 | .dma_mask = &vpfe_capture_dma_mask, | ||
764 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
765 | }, | ||
766 | }; | ||
767 | |||
768 | static struct resource dm355_venc_resources[] = { | ||
769 | { | ||
770 | .start = IRQ_VENCINT, | ||
771 | .end = IRQ_VENCINT, | ||
772 | .flags = IORESOURCE_IRQ, | ||
773 | }, | ||
774 | /* venc registers io space */ | ||
775 | { | ||
776 | .start = DM355_VENC_BASE, | ||
777 | .end = DM355_VENC_BASE + 0x17f, | ||
778 | .flags = IORESOURCE_MEM, | ||
779 | }, | ||
780 | /* VDAC config register io space */ | ||
781 | { | ||
782 | .start = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG, | ||
783 | .end = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG + 3, | ||
784 | .flags = IORESOURCE_MEM, | ||
785 | }, | ||
786 | }; | ||
787 | |||
788 | static struct resource dm355_v4l2_disp_resources[] = { | ||
789 | { | ||
790 | .start = IRQ_VENCINT, | ||
791 | .end = IRQ_VENCINT, | ||
792 | .flags = IORESOURCE_IRQ, | ||
793 | }, | ||
794 | /* venc registers io space */ | ||
795 | { | ||
796 | .start = DM355_VENC_BASE, | ||
797 | .end = DM355_VENC_BASE + 0x17f, | ||
798 | .flags = IORESOURCE_MEM, | ||
799 | }, | ||
800 | }; | ||
801 | |||
802 | static int dm355_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type, | ||
803 | int field) | ||
804 | { | ||
805 | switch (if_type) { | ||
806 | case V4L2_MBUS_FMT_SGRBG8_1X8: | ||
807 | davinci_cfg_reg(DM355_VOUT_FIELD_G70); | ||
808 | break; | ||
809 | case V4L2_MBUS_FMT_YUYV10_1X20: | ||
810 | if (field) | ||
811 | davinci_cfg_reg(DM355_VOUT_FIELD); | ||
812 | else | ||
813 | davinci_cfg_reg(DM355_VOUT_FIELD_G70); | ||
814 | break; | ||
815 | default: | ||
816 | return -EINVAL; | ||
817 | } | ||
818 | |||
819 | davinci_cfg_reg(DM355_VOUT_COUTL_EN); | ||
820 | davinci_cfg_reg(DM355_VOUT_COUTH_EN); | ||
821 | |||
822 | return 0; | ||
823 | } | ||
824 | |||
825 | static int dm355_venc_setup_clock(enum vpbe_enc_timings_type type, | ||
826 | unsigned int pclock) | ||
748 | { | 827 | { |
749 | vpfe_capture_dev.dev.platform_data = cfg; | 828 | void __iomem *vpss_clk_ctrl_reg; |
829 | |||
830 | vpss_clk_ctrl_reg = DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL); | ||
831 | |||
832 | switch (type) { | ||
833 | case VPBE_ENC_STD: | ||
834 | writel(VPSS_DACCLKEN_ENABLE | VPSS_VENCCLKEN_ENABLE, | ||
835 | vpss_clk_ctrl_reg); | ||
836 | break; | ||
837 | case VPBE_ENC_DV_TIMINGS: | ||
838 | if (pclock > 27000000) | ||
839 | /* | ||
840 | * For HD, use external clock source since we cannot | ||
841 | * support HD mode with internal clocks. | ||
842 | */ | ||
843 | writel(VPSS_MUXSEL_EXTCLK_ENABLE, vpss_clk_ctrl_reg); | ||
844 | break; | ||
845 | default: | ||
846 | return -EINVAL; | ||
847 | } | ||
848 | |||
849 | return 0; | ||
750 | } | 850 | } |
751 | 851 | ||
852 | static struct platform_device dm355_vpbe_display = { | ||
853 | .name = "vpbe-v4l2", | ||
854 | .id = -1, | ||
855 | .num_resources = ARRAY_SIZE(dm355_v4l2_disp_resources), | ||
856 | .resource = dm355_v4l2_disp_resources, | ||
857 | .dev = { | ||
858 | .dma_mask = &vpfe_capture_dma_mask, | ||
859 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
860 | }, | ||
861 | }; | ||
862 | |||
863 | struct venc_platform_data dm355_venc_pdata = { | ||
864 | .setup_pinmux = dm355_vpbe_setup_pinmux, | ||
865 | .setup_clock = dm355_venc_setup_clock, | ||
866 | }; | ||
867 | |||
868 | static struct platform_device dm355_venc_dev = { | ||
869 | .name = DM355_VPBE_VENC_SUBDEV_NAME, | ||
870 | .id = -1, | ||
871 | .num_resources = ARRAY_SIZE(dm355_venc_resources), | ||
872 | .resource = dm355_venc_resources, | ||
873 | .dev = { | ||
874 | .dma_mask = &vpfe_capture_dma_mask, | ||
875 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
876 | .platform_data = (void *)&dm355_venc_pdata, | ||
877 | }, | ||
878 | }; | ||
879 | |||
880 | static struct platform_device dm355_vpbe_dev = { | ||
881 | .name = "vpbe_controller", | ||
882 | .id = -1, | ||
883 | .dev = { | ||
884 | .dma_mask = &vpfe_capture_dma_mask, | ||
885 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
886 | }, | ||
887 | }; | ||
888 | |||
752 | /*----------------------------------------------------------------------*/ | 889 | /*----------------------------------------------------------------------*/ |
753 | 890 | ||
754 | static struct map_desc dm355_io_desc[] = { | 891 | static struct map_desc dm355_io_desc[] = { |
@@ -868,19 +1005,36 @@ void __init dm355_init(void) | |||
868 | davinci_map_sysmod(); | 1005 | davinci_map_sysmod(); |
869 | } | 1006 | } |
870 | 1007 | ||
1008 | int __init dm355_init_video(struct vpfe_config *vpfe_cfg, | ||
1009 | struct vpbe_config *vpbe_cfg) | ||
1010 | { | ||
1011 | if (vpfe_cfg || vpbe_cfg) | ||
1012 | platform_device_register(&dm355_vpss_device); | ||
1013 | |||
1014 | if (vpfe_cfg) { | ||
1015 | vpfe_capture_dev.dev.platform_data = vpfe_cfg; | ||
1016 | platform_device_register(&dm355_ccdc_dev); | ||
1017 | platform_device_register(&vpfe_capture_dev); | ||
1018 | } | ||
1019 | |||
1020 | if (vpbe_cfg) { | ||
1021 | dm355_vpbe_dev.dev.platform_data = vpbe_cfg; | ||
1022 | platform_device_register(&dm355_osd_dev); | ||
1023 | platform_device_register(&dm355_venc_dev); | ||
1024 | platform_device_register(&dm355_vpbe_dev); | ||
1025 | platform_device_register(&dm355_vpbe_display); | ||
1026 | } | ||
1027 | |||
1028 | return 0; | ||
1029 | } | ||
1030 | |||
871 | static int __init dm355_init_devices(void) | 1031 | static int __init dm355_init_devices(void) |
872 | { | 1032 | { |
873 | if (!cpu_is_davinci_dm355()) | 1033 | if (!cpu_is_davinci_dm355()) |
874 | return 0; | 1034 | return 0; |
875 | 1035 | ||
876 | /* Add ccdc clock aliases */ | ||
877 | clk_add_alias("master", dm355_ccdc_dev.name, "vpss_master", NULL); | ||
878 | clk_add_alias("slave", dm355_ccdc_dev.name, "vpss_master", NULL); | ||
879 | davinci_cfg_reg(DM355_INT_EDMA_CC); | 1036 | davinci_cfg_reg(DM355_INT_EDMA_CC); |
880 | platform_device_register(&dm355_edma_device); | 1037 | platform_device_register(&dm355_edma_device); |
881 | platform_device_register(&dm355_vpss_device); | ||
882 | platform_device_register(&dm355_ccdc_dev); | ||
883 | platform_device_register(&vpfe_capture_dev); | ||
884 | 1038 | ||
885 | return 0; | 1039 | return 0; |
886 | } | 1040 | } |
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 6c3980540be0..ff771ceac3f1 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c | |||
@@ -39,16 +39,13 @@ | |||
39 | #include "asp.h" | 39 | #include "asp.h" |
40 | 40 | ||
41 | #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */ | 41 | #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */ |
42 | |||
43 | /* Base of key scan register bank */ | ||
44 | #define DM365_KEYSCAN_BASE 0x01c69400 | ||
45 | |||
46 | #define DM365_RTC_BASE 0x01c69000 | 42 | #define DM365_RTC_BASE 0x01c69000 |
47 | 43 | #define DM365_KEYSCAN_BASE 0x01c69400 | |
44 | #define DM365_OSD_BASE 0x01c71c00 | ||
45 | #define DM365_VENC_BASE 0x01c71e00 | ||
48 | #define DAVINCI_DM365_VC_BASE 0x01d0c000 | 46 | #define DAVINCI_DM365_VC_BASE 0x01d0c000 |
49 | #define DAVINCI_DMA_VC_TX 2 | 47 | #define DAVINCI_DMA_VC_TX 2 |
50 | #define DAVINCI_DMA_VC_RX 3 | 48 | #define DAVINCI_DMA_VC_RX 3 |
51 | |||
52 | #define DM365_EMAC_BASE 0x01d07000 | 49 | #define DM365_EMAC_BASE 0x01d07000 |
53 | #define DM365_EMAC_MDIO_BASE (DM365_EMAC_BASE + 0x4000) | 50 | #define DM365_EMAC_MDIO_BASE (DM365_EMAC_BASE + 0x4000) |
54 | #define DM365_EMAC_CNTRL_OFFSET 0x0000 | 51 | #define DM365_EMAC_CNTRL_OFFSET 0x0000 |
@@ -257,6 +254,12 @@ static struct clk vpss_master_clk = { | |||
257 | .flags = CLK_PSC, | 254 | .flags = CLK_PSC, |
258 | }; | 255 | }; |
259 | 256 | ||
257 | static struct clk vpss_slave_clk = { | ||
258 | .name = "vpss_slave", | ||
259 | .parent = &pll1_sysclk5, | ||
260 | .lpsc = DAVINCI_LPSC_VPSSSLV, | ||
261 | }; | ||
262 | |||
260 | static struct clk arm_clk = { | 263 | static struct clk arm_clk = { |
261 | .name = "arm_clk", | 264 | .name = "arm_clk", |
262 | .parent = &pll2_sysclk2, | 265 | .parent = &pll2_sysclk2, |
@@ -449,7 +452,8 @@ static struct clk_lookup dm365_clks[] = { | |||
449 | CLK(NULL, "pll2_sysclk8", &pll2_sysclk8), | 452 | CLK(NULL, "pll2_sysclk8", &pll2_sysclk8), |
450 | CLK(NULL, "pll2_sysclk9", &pll2_sysclk9), | 453 | CLK(NULL, "pll2_sysclk9", &pll2_sysclk9), |
451 | CLK(NULL, "vpss_dac", &vpss_dac_clk), | 454 | CLK(NULL, "vpss_dac", &vpss_dac_clk), |
452 | CLK(NULL, "vpss_master", &vpss_master_clk), | 455 | CLK("vpss", "master", &vpss_master_clk), |
456 | CLK("vpss", "slave", &vpss_slave_clk), | ||
453 | CLK(NULL, "arm", &arm_clk), | 457 | CLK(NULL, "arm", &arm_clk), |
454 | CLK(NULL, "uart0", &uart0_clk), | 458 | CLK(NULL, "uart0", &uart0_clk), |
455 | CLK(NULL, "uart1", &uart1_clk), | 459 | CLK(NULL, "uart1", &uart1_clk), |
@@ -1226,6 +1230,173 @@ static struct platform_device dm365_isif_dev = { | |||
1226 | }, | 1230 | }, |
1227 | }; | 1231 | }; |
1228 | 1232 | ||
1233 | static struct resource dm365_osd_resources[] = { | ||
1234 | { | ||
1235 | .start = DM365_OSD_BASE, | ||
1236 | .end = DM365_OSD_BASE + 0xff, | ||
1237 | .flags = IORESOURCE_MEM, | ||
1238 | }, | ||
1239 | }; | ||
1240 | |||
1241 | static u64 dm365_video_dma_mask = DMA_BIT_MASK(32); | ||
1242 | |||
1243 | static struct platform_device dm365_osd_dev = { | ||
1244 | .name = DM365_VPBE_OSD_SUBDEV_NAME, | ||
1245 | .id = -1, | ||
1246 | .num_resources = ARRAY_SIZE(dm365_osd_resources), | ||
1247 | .resource = dm365_osd_resources, | ||
1248 | .dev = { | ||
1249 | .dma_mask = &dm365_video_dma_mask, | ||
1250 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1251 | }, | ||
1252 | }; | ||
1253 | |||
1254 | static struct resource dm365_venc_resources[] = { | ||
1255 | { | ||
1256 | .start = IRQ_VENCINT, | ||
1257 | .end = IRQ_VENCINT, | ||
1258 | .flags = IORESOURCE_IRQ, | ||
1259 | }, | ||
1260 | /* venc registers io space */ | ||
1261 | { | ||
1262 | .start = DM365_VENC_BASE, | ||
1263 | .end = DM365_VENC_BASE + 0x177, | ||
1264 | .flags = IORESOURCE_MEM, | ||
1265 | }, | ||
1266 | /* vdaccfg registers io space */ | ||
1267 | { | ||
1268 | .start = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG, | ||
1269 | .end = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG + 3, | ||
1270 | .flags = IORESOURCE_MEM, | ||
1271 | }, | ||
1272 | }; | ||
1273 | |||
1274 | static struct resource dm365_v4l2_disp_resources[] = { | ||
1275 | { | ||
1276 | .start = IRQ_VENCINT, | ||
1277 | .end = IRQ_VENCINT, | ||
1278 | .flags = IORESOURCE_IRQ, | ||
1279 | }, | ||
1280 | /* venc registers io space */ | ||
1281 | { | ||
1282 | .start = DM365_VENC_BASE, | ||
1283 | .end = DM365_VENC_BASE + 0x177, | ||
1284 | .flags = IORESOURCE_MEM, | ||
1285 | }, | ||
1286 | }; | ||
1287 | |||
1288 | static int dm365_vpbe_setup_pinmux(enum v4l2_mbus_pixelcode if_type, | ||
1289 | int field) | ||
1290 | { | ||
1291 | switch (if_type) { | ||
1292 | case V4L2_MBUS_FMT_SGRBG8_1X8: | ||
1293 | davinci_cfg_reg(DM365_VOUT_FIELD_G81); | ||
1294 | davinci_cfg_reg(DM365_VOUT_COUTL_EN); | ||
1295 | davinci_cfg_reg(DM365_VOUT_COUTH_EN); | ||
1296 | break; | ||
1297 | case V4L2_MBUS_FMT_YUYV10_1X20: | ||
1298 | if (field) | ||
1299 | davinci_cfg_reg(DM365_VOUT_FIELD); | ||
1300 | else | ||
1301 | davinci_cfg_reg(DM365_VOUT_FIELD_G81); | ||
1302 | davinci_cfg_reg(DM365_VOUT_COUTL_EN); | ||
1303 | davinci_cfg_reg(DM365_VOUT_COUTH_EN); | ||
1304 | break; | ||
1305 | default: | ||
1306 | return -EINVAL; | ||
1307 | } | ||
1308 | |||
1309 | return 0; | ||
1310 | } | ||
1311 | |||
1312 | static int dm365_venc_setup_clock(enum vpbe_enc_timings_type type, | ||
1313 | unsigned int pclock) | ||
1314 | { | ||
1315 | void __iomem *vpss_clkctl_reg; | ||
1316 | u32 val; | ||
1317 | |||
1318 | vpss_clkctl_reg = DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL); | ||
1319 | |||
1320 | switch (type) { | ||
1321 | case VPBE_ENC_STD: | ||
1322 | val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE; | ||
1323 | break; | ||
1324 | case VPBE_ENC_DV_TIMINGS: | ||
1325 | if (pclock <= 27000000) { | ||
1326 | val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE; | ||
1327 | } else { | ||
1328 | /* set sysclk4 to output 74.25 MHz from pll1 */ | ||
1329 | val = VPSS_PLLC2SYSCLK5_ENABLE | VPSS_DACCLKEN_ENABLE | | ||
1330 | VPSS_VENCCLKEN_ENABLE; | ||
1331 | } | ||
1332 | break; | ||
1333 | default: | ||
1334 | return -EINVAL; | ||
1335 | } | ||
1336 | writel(val, vpss_clkctl_reg); | ||
1337 | |||
1338 | return 0; | ||
1339 | } | ||
1340 | |||
1341 | static struct platform_device dm365_vpbe_display = { | ||
1342 | .name = "vpbe-v4l2", | ||
1343 | .id = -1, | ||
1344 | .num_resources = ARRAY_SIZE(dm365_v4l2_disp_resources), | ||
1345 | .resource = dm365_v4l2_disp_resources, | ||
1346 | .dev = { | ||
1347 | .dma_mask = &dm365_video_dma_mask, | ||
1348 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1349 | }, | ||
1350 | }; | ||
1351 | |||
1352 | struct venc_platform_data dm365_venc_pdata = { | ||
1353 | .setup_pinmux = dm365_vpbe_setup_pinmux, | ||
1354 | .setup_clock = dm365_venc_setup_clock, | ||
1355 | }; | ||
1356 | |||
1357 | static struct platform_device dm365_venc_dev = { | ||
1358 | .name = DM365_VPBE_VENC_SUBDEV_NAME, | ||
1359 | .id = -1, | ||
1360 | .num_resources = ARRAY_SIZE(dm365_venc_resources), | ||
1361 | .resource = dm365_venc_resources, | ||
1362 | .dev = { | ||
1363 | .dma_mask = &dm365_video_dma_mask, | ||
1364 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1365 | .platform_data = (void *)&dm365_venc_pdata, | ||
1366 | }, | ||
1367 | }; | ||
1368 | |||
1369 | static struct platform_device dm365_vpbe_dev = { | ||
1370 | .name = "vpbe_controller", | ||
1371 | .id = -1, | ||
1372 | .dev = { | ||
1373 | .dma_mask = &dm365_video_dma_mask, | ||
1374 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
1375 | }, | ||
1376 | }; | ||
1377 | |||
1378 | int __init dm365_init_video(struct vpfe_config *vpfe_cfg, | ||
1379 | struct vpbe_config *vpbe_cfg) | ||
1380 | { | ||
1381 | if (vpfe_cfg || vpbe_cfg) | ||
1382 | platform_device_register(&dm365_vpss_device); | ||
1383 | |||
1384 | if (vpfe_cfg) { | ||
1385 | vpfe_capture_dev.dev.platform_data = vpfe_cfg; | ||
1386 | platform_device_register(&dm365_isif_dev); | ||
1387 | platform_device_register(&vpfe_capture_dev); | ||
1388 | } | ||
1389 | if (vpbe_cfg) { | ||
1390 | dm365_vpbe_dev.dev.platform_data = vpbe_cfg; | ||
1391 | platform_device_register(&dm365_osd_dev); | ||
1392 | platform_device_register(&dm365_venc_dev); | ||
1393 | platform_device_register(&dm365_vpbe_dev); | ||
1394 | platform_device_register(&dm365_vpbe_display); | ||
1395 | } | ||
1396 | |||
1397 | return 0; | ||
1398 | } | ||
1399 | |||
1229 | static int __init dm365_init_devices(void) | 1400 | static int __init dm365_init_devices(void) |
1230 | { | 1401 | { |
1231 | if (!cpu_is_davinci_dm365()) | 1402 | if (!cpu_is_davinci_dm365()) |
@@ -1239,16 +1410,6 @@ static int __init dm365_init_devices(void) | |||
1239 | clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev), | 1410 | clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev), |
1240 | NULL, &dm365_emac_device.dev); | 1411 | NULL, &dm365_emac_device.dev); |
1241 | 1412 | ||
1242 | /* Add isif clock alias */ | ||
1243 | clk_add_alias("master", dm365_isif_dev.name, "vpss_master", NULL); | ||
1244 | platform_device_register(&dm365_vpss_device); | ||
1245 | platform_device_register(&dm365_isif_dev); | ||
1246 | platform_device_register(&vpfe_capture_dev); | ||
1247 | return 0; | 1413 | return 0; |
1248 | } | 1414 | } |
1249 | postcore_initcall(dm365_init_devices); | 1415 | postcore_initcall(dm365_init_devices); |
1250 | |||
1251 | void dm365_set_vpfe_config(struct vpfe_config *cfg) | ||
1252 | { | ||
1253 | vpfe_capture_dev.dev.platform_data = cfg; | ||
1254 | } | ||
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index db1dd92e00af..c2a9273330bf 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
@@ -300,8 +300,8 @@ static struct clk_lookup dm644x_clks[] = { | |||
300 | CLK(NULL, "dsp", &dsp_clk), | 300 | CLK(NULL, "dsp", &dsp_clk), |
301 | CLK(NULL, "arm", &arm_clk), | 301 | CLK(NULL, "arm", &arm_clk), |
302 | CLK(NULL, "vicp", &vicp_clk), | 302 | CLK(NULL, "vicp", &vicp_clk), |
303 | CLK(NULL, "vpss_master", &vpss_master_clk), | 303 | CLK("vpss", "master", &vpss_master_clk), |
304 | CLK(NULL, "vpss_slave", &vpss_slave_clk), | 304 | CLK("vpss", "slave", &vpss_slave_clk), |
305 | CLK(NULL, "arm", &arm_clk), | 305 | CLK(NULL, "arm", &arm_clk), |
306 | CLK(NULL, "uart0", &uart0_clk), | 306 | CLK(NULL, "uart0", &uart0_clk), |
307 | CLK(NULL, "uart1", &uart1_clk), | 307 | CLK(NULL, "uart1", &uart1_clk), |
@@ -706,7 +706,7 @@ static int dm644x_venc_setup_clock(enum vpbe_enc_timings_type type, | |||
706 | v |= DM644X_VPSS_DACCLKEN; | 706 | v |= DM644X_VPSS_DACCLKEN; |
707 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); | 707 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); |
708 | break; | 708 | break; |
709 | case VPBE_ENC_CUSTOM_TIMINGS: | 709 | case VPBE_ENC_DV_TIMINGS: |
710 | if (pclock <= 27000000) { | 710 | if (pclock <= 27000000) { |
711 | v |= DM644X_VPSS_DACCLKEN; | 711 | v |= DM644X_VPSS_DACCLKEN; |
712 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); | 712 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); |
@@ -901,11 +901,6 @@ int __init dm644x_init_video(struct vpfe_config *vpfe_cfg, | |||
901 | dm644x_vpfe_dev.dev.platform_data = vpfe_cfg; | 901 | dm644x_vpfe_dev.dev.platform_data = vpfe_cfg; |
902 | platform_device_register(&dm644x_ccdc_dev); | 902 | platform_device_register(&dm644x_ccdc_dev); |
903 | platform_device_register(&dm644x_vpfe_dev); | 903 | platform_device_register(&dm644x_vpfe_dev); |
904 | /* Add ccdc clock aliases */ | ||
905 | clk_add_alias("master", dm644x_ccdc_dev.name, | ||
906 | "vpss_master", NULL); | ||
907 | clk_add_alias("slave", dm644x_ccdc_dev.name, | ||
908 | "vpss_slave", NULL); | ||
909 | } | 904 | } |
910 | 905 | ||
911 | if (vpbe_cfg) { | 906 | if (vpbe_cfg) { |
diff --git a/arch/arm/mach-davinci/pm_domain.c b/arch/arm/mach-davinci/pm_domain.c index c90250e3bef8..6b98413cebd6 100644 --- a/arch/arm/mach-davinci/pm_domain.c +++ b/arch/arm/mach-davinci/pm_domain.c | |||
@@ -53,7 +53,7 @@ static struct dev_pm_domain davinci_pm_domain = { | |||
53 | 53 | ||
54 | static struct pm_clk_notifier_block platform_bus_notifier = { | 54 | static struct pm_clk_notifier_block platform_bus_notifier = { |
55 | .pm_domain = &davinci_pm_domain, | 55 | .pm_domain = &davinci_pm_domain, |
56 | .con_ids = { "fck", NULL, }, | 56 | .con_ids = { "fck", "master", "slave", NULL }, |
57 | }; | 57 | }; |
58 | 58 | ||
59 | static int __init davinci_pm_runtime_init(void) | 59 | static int __init davinci_pm_runtime_init(void) |
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index 0a6c127f834c..42378fb90167 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig | |||
@@ -72,10 +72,12 @@ config SOC_EXYNOS5440 | |||
72 | bool "SAMSUNG EXYNOS5440" | 72 | bool "SAMSUNG EXYNOS5440" |
73 | default y | 73 | default y |
74 | depends on ARCH_EXYNOS5 | 74 | depends on ARCH_EXYNOS5 |
75 | select ARCH_HAS_OPP | ||
75 | select ARM_ARCH_TIMER | 76 | select ARM_ARCH_TIMER |
76 | select AUTO_ZRELADDR | 77 | select AUTO_ZRELADDR |
77 | select PINCTRL | 78 | select PINCTRL |
78 | select PINCTRL_EXYNOS5440 | 79 | select PINCTRL_EXYNOS5440 |
80 | select PM_OPP | ||
79 | help | 81 | help |
80 | Enable EXYNOS5440 SoC support | 82 | Enable EXYNOS5440 SoC support |
81 | 83 | ||
diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c index fcfe0251aa3e..498a7a23e260 100644 --- a/arch/arm/mach-exynos/cpuidle.c +++ b/arch/arm/mach-exynos/cpuidle.c | |||
@@ -58,7 +58,6 @@ static DEFINE_PER_CPU(struct cpuidle_device, exynos4_cpuidle_device); | |||
58 | static struct cpuidle_driver exynos4_idle_driver = { | 58 | static struct cpuidle_driver exynos4_idle_driver = { |
59 | .name = "exynos4_idle", | 59 | .name = "exynos4_idle", |
60 | .owner = THIS_MODULE, | 60 | .owner = THIS_MODULE, |
61 | .en_core_tk_irqen = 1, | ||
62 | }; | 61 | }; |
63 | 62 | ||
64 | /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ | 63 | /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 497fcb793dc1..d28c7fbaba2d 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -97,6 +97,19 @@ static struct s3c2410_uartcfg universal_uartcfgs[] __initdata = { | |||
97 | static struct regulator_consumer_supply max8952_consumer = | 97 | static struct regulator_consumer_supply max8952_consumer = |
98 | REGULATOR_SUPPLY("vdd_arm", NULL); | 98 | REGULATOR_SUPPLY("vdd_arm", NULL); |
99 | 99 | ||
100 | static struct regulator_init_data universal_max8952_reg_data = { | ||
101 | .constraints = { | ||
102 | .name = "VARM_1.2V", | ||
103 | .min_uV = 770000, | ||
104 | .max_uV = 1400000, | ||
105 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, | ||
106 | .always_on = 1, | ||
107 | .boot_on = 1, | ||
108 | }, | ||
109 | .num_consumer_supplies = 1, | ||
110 | .consumer_supplies = &max8952_consumer, | ||
111 | }; | ||
112 | |||
100 | static struct max8952_platform_data universal_max8952_pdata __initdata = { | 113 | static struct max8952_platform_data universal_max8952_pdata __initdata = { |
101 | .gpio_vid0 = EXYNOS4_GPX0(3), | 114 | .gpio_vid0 = EXYNOS4_GPX0(3), |
102 | .gpio_vid1 = EXYNOS4_GPX0(4), | 115 | .gpio_vid1 = EXYNOS4_GPX0(4), |
@@ -105,19 +118,7 @@ static struct max8952_platform_data universal_max8952_pdata __initdata = { | |||
105 | .dvs_mode = { 48, 32, 28, 18 }, /* 1.25, 1.20, 1.05, 0.95V */ | 118 | .dvs_mode = { 48, 32, 28, 18 }, /* 1.25, 1.20, 1.05, 0.95V */ |
106 | .sync_freq = 0, /* default: fastest */ | 119 | .sync_freq = 0, /* default: fastest */ |
107 | .ramp_speed = 0, /* default: fastest */ | 120 | .ramp_speed = 0, /* default: fastest */ |
108 | 121 | .reg_data = &universal_max8952_reg_data, | |
109 | .reg_data = { | ||
110 | .constraints = { | ||
111 | .name = "VARM_1.2V", | ||
112 | .min_uV = 770000, | ||
113 | .max_uV = 1400000, | ||
114 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, | ||
115 | .always_on = 1, | ||
116 | .boot_on = 1, | ||
117 | }, | ||
118 | .num_consumer_supplies = 1, | ||
119 | .consumer_supplies = &max8952_consumer, | ||
120 | }, | ||
121 | }; | 122 | }; |
122 | 123 | ||
123 | static struct regulator_consumer_supply lp3974_buck1_consumer = | 124 | static struct regulator_consumer_supply lp3974_buck1_consumer = |
diff --git a/arch/arm/mach-exynos/setup-usb-phy.c b/arch/arm/mach-exynos/setup-usb-phy.c index b81cc569a8dd..6af40662a449 100644 --- a/arch/arm/mach-exynos/setup-usb-phy.c +++ b/arch/arm/mach-exynos/setup-usb-phy.c | |||
@@ -204,9 +204,9 @@ static int exynos4210_usb_phy1_exit(struct platform_device *pdev) | |||
204 | 204 | ||
205 | int s5p_usb_phy_init(struct platform_device *pdev, int type) | 205 | int s5p_usb_phy_init(struct platform_device *pdev, int type) |
206 | { | 206 | { |
207 | if (type == S5P_USB_PHY_DEVICE) | 207 | if (type == USB_PHY_TYPE_DEVICE) |
208 | return exynos4210_usb_phy0_init(pdev); | 208 | return exynos4210_usb_phy0_init(pdev); |
209 | else if (type == S5P_USB_PHY_HOST) | 209 | else if (type == USB_PHY_TYPE_HOST) |
210 | return exynos4210_usb_phy1_init(pdev); | 210 | return exynos4210_usb_phy1_init(pdev); |
211 | 211 | ||
212 | return -EINVAL; | 212 | return -EINVAL; |
@@ -214,9 +214,9 @@ int s5p_usb_phy_init(struct platform_device *pdev, int type) | |||
214 | 214 | ||
215 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) | 215 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) |
216 | { | 216 | { |
217 | if (type == S5P_USB_PHY_DEVICE) | 217 | if (type == USB_PHY_TYPE_DEVICE) |
218 | return exynos4210_usb_phy0_exit(pdev); | 218 | return exynos4210_usb_phy0_exit(pdev); |
219 | else if (type == S5P_USB_PHY_HOST) | 219 | else if (type == USB_PHY_TYPE_HOST) |
220 | return exynos4210_usb_phy1_exit(pdev); | 220 | return exynos4210_usb_phy1_exit(pdev); |
221 | 221 | ||
222 | return -EINVAL; | 222 | return -EINVAL; |
diff --git a/arch/arm/mach-gemini/idle.c b/arch/arm/mach-gemini/idle.c index 92bbd6bb600a..87dff4f5059e 100644 --- a/arch/arm/mach-gemini/idle.c +++ b/arch/arm/mach-gemini/idle.c | |||
@@ -13,9 +13,11 @@ static void gemini_idle(void) | |||
13 | * will never wakeup... Acctualy it is not very good to enable | 13 | * will never wakeup... Acctualy it is not very good to enable |
14 | * interrupts first since scheduler can miss a tick, but there is | 14 | * interrupts first since scheduler can miss a tick, but there is |
15 | * no other way around this. Platforms that needs it for power saving | 15 | * no other way around this. Platforms that needs it for power saving |
16 | * should call enable_hlt() in init code, since by default it is | 16 | * should enable it in init code, since by default it is |
17 | * disabled. | 17 | * disabled. |
18 | */ | 18 | */ |
19 | |||
20 | /* FIXME: Enabling interrupts here is racy! */ | ||
19 | local_irq_enable(); | 21 | local_irq_enable(); |
20 | cpu_do_idle(); | 22 | cpu_do_idle(); |
21 | } | 23 | } |
diff --git a/arch/arm/mach-gemini/irq.c b/arch/arm/mach-gemini/irq.c index 30bef116691e..44f50dcb616d 100644 --- a/arch/arm/mach-gemini/irq.c +++ b/arch/arm/mach-gemini/irq.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/stddef.h> | 15 | #include <linux/stddef.h> |
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/cpu.h> | ||
19 | |||
18 | #include <asm/irq.h> | 20 | #include <asm/irq.h> |
19 | #include <asm/mach/irq.h> | 21 | #include <asm/mach/irq.h> |
20 | #include <asm/system_misc.h> | 22 | #include <asm/system_misc.h> |
@@ -77,7 +79,7 @@ void __init gemini_init_irq(void) | |||
77 | * Disable the idle handler by default since it is buggy | 79 | * Disable the idle handler by default since it is buggy |
78 | * For more info see arch/arm/mach-gemini/idle.c | 80 | * For more info see arch/arm/mach-gemini/idle.c |
79 | */ | 81 | */ |
80 | disable_hlt(); | 82 | cpu_idle_poll_ctrl(true); |
81 | 83 | ||
82 | request_resource(&iomem_resource, &irq_resource); | 84 | request_resource(&iomem_resource, &irq_resource); |
83 | 85 | ||
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 23555b0c08a9..fbe60a145344 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
@@ -29,7 +29,7 @@ obj-$(CONFIG_MXC_USE_EPIT) += epit.o | |||
29 | obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o | 29 | obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o |
30 | 30 | ||
31 | ifeq ($(CONFIG_CPU_IDLE),y) | 31 | ifeq ($(CONFIG_CPU_IDLE),y) |
32 | obj-y += cpuidle.o | 32 | obj-$(CONFIG_SOC_IMX5) += cpuidle-imx5.o |
33 | obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o | 33 | obj-$(CONFIG_SOC_IMX6Q) += cpuidle-imx6q.o |
34 | endif | 34 | endif |
35 | 35 | ||
diff --git a/arch/arm/mach-imx/avic.c b/arch/arm/mach-imx/avic.c index 49c87e7aa817..e163ec7a8441 100644 --- a/arch/arm/mach-imx/avic.c +++ b/arch/arm/mach-imx/avic.c | |||
@@ -51,7 +51,7 @@ | |||
51 | 51 | ||
52 | #define AVIC_NUM_IRQS 64 | 52 | #define AVIC_NUM_IRQS 64 |
53 | 53 | ||
54 | void __iomem *avic_base; | 54 | static void __iomem *avic_base; |
55 | static struct irq_domain *domain; | 55 | static struct irq_domain *domain; |
56 | 56 | ||
57 | #ifdef CONFIG_MXC_IRQ_PRIOR | 57 | #ifdef CONFIG_MXC_IRQ_PRIOR |
diff --git a/arch/arm/mach-imx/clk-busy.c b/arch/arm/mach-imx/clk-busy.c index 85b728cc27ab..4bb1bc419b79 100644 --- a/arch/arm/mach-imx/clk-busy.c +++ b/arch/arm/mach-imx/clk-busy.c | |||
@@ -147,7 +147,7 @@ static int clk_busy_mux_set_parent(struct clk_hw *hw, u8 index) | |||
147 | return ret; | 147 | return ret; |
148 | } | 148 | } |
149 | 149 | ||
150 | struct clk_ops clk_busy_mux_ops = { | 150 | static struct clk_ops clk_busy_mux_ops = { |
151 | .get_parent = clk_busy_mux_get_parent, | 151 | .get_parent = clk_busy_mux_get_parent, |
152 | .set_parent = clk_busy_mux_set_parent, | 152 | .set_parent = clk_busy_mux_set_parent, |
153 | }; | 153 | }; |
diff --git a/arch/arm/mach-imx/clk-gate2.c b/arch/arm/mach-imx/clk-gate2.c index cc49c7ae186e..a63e415609a8 100644 --- a/arch/arm/mach-imx/clk-gate2.c +++ b/arch/arm/mach-imx/clk-gate2.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/string.h> | 17 | #include <linux/string.h> |
18 | #include "clk.h" | ||
18 | 19 | ||
19 | /** | 20 | /** |
20 | * DOC: basic gatable clock which can gate and ungate it's ouput | 21 | * DOC: basic gatable clock which can gate and ungate it's ouput |
diff --git a/arch/arm/mach-imx/clk-pllv1.c b/arch/arm/mach-imx/clk-pllv1.c index abff350ba24c..c1eaee346954 100644 --- a/arch/arm/mach-imx/clk-pllv1.c +++ b/arch/arm/mach-imx/clk-pllv1.c | |||
@@ -78,7 +78,7 @@ static unsigned long clk_pllv1_recalc_rate(struct clk_hw *hw, | |||
78 | return ll; | 78 | return ll; |
79 | } | 79 | } |
80 | 80 | ||
81 | struct clk_ops clk_pllv1_ops = { | 81 | static struct clk_ops clk_pllv1_ops = { |
82 | .recalc_rate = clk_pllv1_recalc_rate, | 82 | .recalc_rate = clk_pllv1_recalc_rate, |
83 | }; | 83 | }; |
84 | 84 | ||
diff --git a/arch/arm/mach-imx/clk-pllv2.c b/arch/arm/mach-imx/clk-pllv2.c index 0440379e3628..20889d59b44d 100644 --- a/arch/arm/mach-imx/clk-pllv2.c +++ b/arch/arm/mach-imx/clk-pllv2.c | |||
@@ -229,7 +229,7 @@ static void clk_pllv2_unprepare(struct clk_hw *hw) | |||
229 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); | 229 | __raw_writel(reg, pllbase + MXC_PLL_DP_CTL); |
230 | } | 230 | } |
231 | 231 | ||
232 | struct clk_ops clk_pllv2_ops = { | 232 | static struct clk_ops clk_pllv2_ops = { |
233 | .prepare = clk_pllv2_prepare, | 233 | .prepare = clk_pllv2_prepare, |
234 | .unprepare = clk_pllv2_unprepare, | 234 | .unprepare = clk_pllv2_unprepare, |
235 | .recalc_rate = clk_pllv2_recalc_rate, | 235 | .recalc_rate = clk_pllv2_recalc_rate, |
diff --git a/arch/arm/mach-imx/clk.c b/arch/arm/mach-imx/clk.c index f5e8be8e7f11..37e884ed1cd4 100644 --- a/arch/arm/mach-imx/clk.c +++ b/arch/arm/mach-imx/clk.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #include <linux/spinlock.h> | 1 | #include <linux/spinlock.h> |
2 | #include "clk.h" | ||
2 | 3 | ||
3 | DEFINE_SPINLOCK(imx_ccm_lock); | 4 | DEFINE_SPINLOCK(imx_ccm_lock); |
diff --git a/arch/arm/mach-imx/cpu-imx5.c b/arch/arm/mach-imx/cpu-imx5.c index d7ce72252a4e..c1c99a72c6a1 100644 --- a/arch/arm/mach-imx/cpu-imx5.c +++ b/arch/arm/mach-imx/cpu-imx5.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | 19 | ||
20 | #include "hardware.h" | 20 | #include "hardware.h" |
21 | #include "common.h" | ||
21 | 22 | ||
22 | static int mx5_cpu_rev = -1; | 23 | static int mx5_cpu_rev = -1; |
23 | 24 | ||
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index 03fcbd082593..e70e3acbf9bd 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <linux/io.h> | 3 | #include <linux/io.h> |
4 | 4 | ||
5 | #include "hardware.h" | 5 | #include "hardware.h" |
6 | #include "common.h" | ||
6 | 7 | ||
7 | unsigned int __mxc_cpu_type; | 8 | unsigned int __mxc_cpu_type; |
8 | EXPORT_SYMBOL(__mxc_cpu_type); | 9 | EXPORT_SYMBOL(__mxc_cpu_type); |
diff --git a/arch/arm/mach-imx/cpuidle-imx5.c b/arch/arm/mach-imx/cpuidle-imx5.c new file mode 100644 index 000000000000..5a47e3c6172f --- /dev/null +++ b/arch/arm/mach-imx/cpuidle-imx5.c | |||
@@ -0,0 +1,37 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012 Freescale Semiconductor, Inc. | ||
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 version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/cpuidle.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <asm/system_misc.h> | ||
12 | |||
13 | static int imx5_cpuidle_enter(struct cpuidle_device *dev, | ||
14 | struct cpuidle_driver *drv, int index) | ||
15 | { | ||
16 | arm_pm_idle(); | ||
17 | return index; | ||
18 | } | ||
19 | |||
20 | static struct cpuidle_driver imx5_cpuidle_driver = { | ||
21 | .name = "imx5_cpuidle", | ||
22 | .owner = THIS_MODULE, | ||
23 | .states[0] = { | ||
24 | .enter = imx5_cpuidle_enter, | ||
25 | .exit_latency = 2, | ||
26 | .target_residency = 1, | ||
27 | .flags = CPUIDLE_FLAG_TIME_VALID, | ||
28 | .name = "IMX5 SRPG", | ||
29 | .desc = "CPU state retained,powered off", | ||
30 | }, | ||
31 | .state_count = 1, | ||
32 | }; | ||
33 | |||
34 | int __init imx5_cpuidle_init(void) | ||
35 | { | ||
36 | return cpuidle_register(&imx5_cpuidle_driver, NULL); | ||
37 | } | ||
diff --git a/arch/arm/mach-imx/cpuidle-imx6q.c b/arch/arm/mach-imx/cpuidle-imx6q.c index d533e2695f0e..23ddfb693b2d 100644 --- a/arch/arm/mach-imx/cpuidle-imx6q.c +++ b/arch/arm/mach-imx/cpuidle-imx6q.c | |||
@@ -6,7 +6,6 @@ | |||
6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/clockchips.h> | ||
10 | #include <linux/cpuidle.h> | 9 | #include <linux/cpuidle.h> |
11 | #include <linux/module.h> | 10 | #include <linux/module.h> |
12 | #include <asm/cpuidle.h> | 11 | #include <asm/cpuidle.h> |
@@ -21,10 +20,6 @@ static DEFINE_SPINLOCK(master_lock); | |||
21 | static int imx6q_enter_wait(struct cpuidle_device *dev, | 20 | static int imx6q_enter_wait(struct cpuidle_device *dev, |
22 | struct cpuidle_driver *drv, int index) | 21 | struct cpuidle_driver *drv, int index) |
23 | { | 22 | { |
24 | int cpu = dev->cpu; | ||
25 | |||
26 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); | ||
27 | |||
28 | if (atomic_inc_return(&master) == num_online_cpus()) { | 23 | if (atomic_inc_return(&master) == num_online_cpus()) { |
29 | /* | 24 | /* |
30 | * With this lock, we prevent other cpu to exit and enter | 25 | * With this lock, we prevent other cpu to exit and enter |
@@ -43,26 +38,13 @@ idle: | |||
43 | cpu_do_idle(); | 38 | cpu_do_idle(); |
44 | done: | 39 | done: |
45 | atomic_dec(&master); | 40 | atomic_dec(&master); |
46 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); | ||
47 | 41 | ||
48 | return index; | 42 | return index; |
49 | } | 43 | } |
50 | 44 | ||
51 | /* | ||
52 | * For each cpu, setup the broadcast timer because local timer | ||
53 | * stops for the states other than WFI. | ||
54 | */ | ||
55 | static void imx6q_setup_broadcast_timer(void *arg) | ||
56 | { | ||
57 | int cpu = smp_processor_id(); | ||
58 | |||
59 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); | ||
60 | } | ||
61 | |||
62 | static struct cpuidle_driver imx6q_cpuidle_driver = { | 45 | static struct cpuidle_driver imx6q_cpuidle_driver = { |
63 | .name = "imx6q_cpuidle", | 46 | .name = "imx6q_cpuidle", |
64 | .owner = THIS_MODULE, | 47 | .owner = THIS_MODULE, |
65 | .en_core_tk_irqen = 1, | ||
66 | .states = { | 48 | .states = { |
67 | /* WFI */ | 49 | /* WFI */ |
68 | ARM_CPUIDLE_WFI_STATE, | 50 | ARM_CPUIDLE_WFI_STATE, |
@@ -70,7 +52,8 @@ static struct cpuidle_driver imx6q_cpuidle_driver = { | |||
70 | { | 52 | { |
71 | .exit_latency = 50, | 53 | .exit_latency = 50, |
72 | .target_residency = 75, | 54 | .target_residency = 75, |
73 | .flags = CPUIDLE_FLAG_TIME_VALID, | 55 | .flags = CPUIDLE_FLAG_TIME_VALID | |
56 | CPUIDLE_FLAG_TIMER_STOP, | ||
74 | .enter = imx6q_enter_wait, | 57 | .enter = imx6q_enter_wait, |
75 | .name = "WAIT", | 58 | .name = "WAIT", |
76 | .desc = "Clock off", | 59 | .desc = "Clock off", |
@@ -88,8 +71,5 @@ int __init imx6q_cpuidle_init(void) | |||
88 | /* Set chicken bit to get a reliable WAIT mode support */ | 71 | /* Set chicken bit to get a reliable WAIT mode support */ |
89 | imx6q_set_chicken_bit(); | 72 | imx6q_set_chicken_bit(); |
90 | 73 | ||
91 | /* Configure the broadcast timer on each cpu */ | 74 | return cpuidle_register(&imx6q_cpuidle_driver, NULL); |
92 | on_each_cpu(imx6q_setup_broadcast_timer, NULL, 1); | ||
93 | |||
94 | return imx_cpuidle_init(&imx6q_cpuidle_driver); | ||
95 | } | 75 | } |
diff --git a/arch/arm/mach-imx/cpuidle.c b/arch/arm/mach-imx/cpuidle.c deleted file mode 100644 index d4cb511a44a8..000000000000 --- a/arch/arm/mach-imx/cpuidle.c +++ /dev/null | |||
@@ -1,80 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2012 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2012 Linaro Ltd. | ||
4 | * | ||
5 | * The code contained herein is licensed under the GNU General Public | ||
6 | * License. You may obtain a copy of the GNU General Public License | ||
7 | * Version 2 or later at the following locations: | ||
8 | * | ||
9 | * http://www.opensource.org/licenses/gpl-license.html | ||
10 | * http://www.gnu.org/copyleft/gpl.html | ||
11 | */ | ||
12 | |||
13 | #include <linux/cpuidle.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/hrtimer.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/slab.h> | ||
19 | |||
20 | static struct cpuidle_device __percpu * imx_cpuidle_devices; | ||
21 | |||
22 | static void __init imx_cpuidle_devices_uninit(void) | ||
23 | { | ||
24 | int cpu_id; | ||
25 | struct cpuidle_device *dev; | ||
26 | |||
27 | for_each_possible_cpu(cpu_id) { | ||
28 | dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id); | ||
29 | cpuidle_unregister_device(dev); | ||
30 | } | ||
31 | |||
32 | free_percpu(imx_cpuidle_devices); | ||
33 | } | ||
34 | |||
35 | int __init imx_cpuidle_init(struct cpuidle_driver *drv) | ||
36 | { | ||
37 | struct cpuidle_device *dev; | ||
38 | int cpu_id, ret; | ||
39 | |||
40 | if (drv->state_count > CPUIDLE_STATE_MAX) { | ||
41 | pr_err("%s: state_count exceeds maximum\n", __func__); | ||
42 | return -EINVAL; | ||
43 | } | ||
44 | |||
45 | ret = cpuidle_register_driver(drv); | ||
46 | if (ret) { | ||
47 | pr_err("%s: Failed to register cpuidle driver with error: %d\n", | ||
48 | __func__, ret); | ||
49 | return ret; | ||
50 | } | ||
51 | |||
52 | imx_cpuidle_devices = alloc_percpu(struct cpuidle_device); | ||
53 | if (imx_cpuidle_devices == NULL) { | ||
54 | ret = -ENOMEM; | ||
55 | goto unregister_drv; | ||
56 | } | ||
57 | |||
58 | /* initialize state data for each cpuidle_device */ | ||
59 | for_each_possible_cpu(cpu_id) { | ||
60 | dev = per_cpu_ptr(imx_cpuidle_devices, cpu_id); | ||
61 | dev->cpu = cpu_id; | ||
62 | dev->state_count = drv->state_count; | ||
63 | |||
64 | ret = cpuidle_register_device(dev); | ||
65 | if (ret) { | ||
66 | pr_err("%s: Failed to register cpu %u, error: %d\n", | ||
67 | __func__, cpu_id, ret); | ||
68 | goto uninit; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | return 0; | ||
73 | |||
74 | uninit: | ||
75 | imx_cpuidle_devices_uninit(); | ||
76 | |||
77 | unregister_drv: | ||
78 | cpuidle_unregister_driver(drv); | ||
79 | return ret; | ||
80 | } | ||
diff --git a/arch/arm/mach-imx/cpuidle.h b/arch/arm/mach-imx/cpuidle.h index e092d1359d94..786f98ecc145 100644 --- a/arch/arm/mach-imx/cpuidle.h +++ b/arch/arm/mach-imx/cpuidle.h | |||
@@ -10,18 +10,16 @@ | |||
10 | * http://www.gnu.org/copyleft/gpl.html | 10 | * http://www.gnu.org/copyleft/gpl.html |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/cpuidle.h> | ||
14 | |||
15 | #ifdef CONFIG_CPU_IDLE | 13 | #ifdef CONFIG_CPU_IDLE |
16 | extern int imx_cpuidle_init(struct cpuidle_driver *drv); | 14 | extern int imx5_cpuidle_init(void); |
17 | extern int imx6q_cpuidle_init(void); | 15 | extern int imx6q_cpuidle_init(void); |
18 | #else | 16 | #else |
19 | static inline int imx_cpuidle_init(struct cpuidle_driver *drv) | 17 | static inline int imx5_cpuidle_init(void) |
20 | { | 18 | { |
21 | return -ENODEV; | 19 | return 0; |
22 | } | 20 | } |
23 | static inline int imx6q_cpuidle_init(void) | 21 | static inline int imx6q_cpuidle_init(void) |
24 | { | 22 | { |
25 | return -ENODEV; | 23 | return 0; |
26 | } | 24 | } |
27 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c b/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c index b4c70028d359..b2f08bfbbdd3 100644 --- a/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c +++ b/arch/arm/mach-imx/eukrea_mbimx27-baseboard.c | |||
@@ -46,7 +46,7 @@ static const int eukrea_mbimx27_pins[] __initconst = { | |||
46 | PE10_PF_UART3_CTS, | 46 | PE10_PF_UART3_CTS, |
47 | PE11_PF_UART3_RTS, | 47 | PE11_PF_UART3_RTS, |
48 | /* UART4 */ | 48 | /* UART4 */ |
49 | #if !defined(MACH_EUKREA_CPUIMX27_USEUART4) | 49 | #if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4) |
50 | PB26_AF_UART4_RTS, | 50 | PB26_AF_UART4_RTS, |
51 | PB28_AF_UART4_TXD, | 51 | PB28_AF_UART4_TXD, |
52 | PB29_AF_UART4_CTS, | 52 | PB29_AF_UART4_CTS, |
@@ -306,7 +306,7 @@ void __init eukrea_mbimx27_baseboard_init(void) | |||
306 | 306 | ||
307 | imx27_add_imx_uart1(&uart_pdata); | 307 | imx27_add_imx_uart1(&uart_pdata); |
308 | imx27_add_imx_uart2(&uart_pdata); | 308 | imx27_add_imx_uart2(&uart_pdata); |
309 | #if !defined(MACH_EUKREA_CPUIMX27_USEUART4) | 309 | #if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4) |
310 | imx27_add_imx_uart3(&uart_pdata); | 310 | imx27_add_imx_uart3(&uart_pdata); |
311 | #endif | 311 | #endif |
312 | 312 | ||
diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c index a96ccc7f5012..02b61cdf39b9 100644 --- a/arch/arm/mach-imx/gpc.c +++ b/arch/arm/mach-imx/gpc.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/of_address.h> | 16 | #include <linux/of_address.h> |
17 | #include <linux/of_irq.h> | 17 | #include <linux/of_irq.h> |
18 | #include <linux/irqchip/arm-gic.h> | 18 | #include <linux/irqchip/arm-gic.h> |
19 | #include "common.h" | ||
19 | 20 | ||
20 | #define GPC_IMR1 0x008 | 21 | #define GPC_IMR1 0x008 |
21 | #define GPC_PGC_CPU_PDN 0x2a0 | 22 | #define GPC_PGC_CPU_PDN 0x2a0 |
diff --git a/arch/arm/mach-imx/iomux-imx31.c b/arch/arm/mach-imx/iomux-imx31.c index cabefbc5e7c1..7c66805d2cc0 100644 --- a/arch/arm/mach-imx/iomux-imx31.c +++ b/arch/arm/mach-imx/iomux-imx31.c | |||
@@ -40,7 +40,7 @@ static DEFINE_SPINLOCK(gpio_mux_lock); | |||
40 | 40 | ||
41 | #define IOMUX_REG_MASK (IOMUX_PADNUM_MASK & ~0x3) | 41 | #define IOMUX_REG_MASK (IOMUX_PADNUM_MASK & ~0x3) |
42 | 42 | ||
43 | unsigned long mxc_pin_alloc_map[NB_PORTS * 32 / BITS_PER_LONG]; | 43 | static unsigned long mxc_pin_alloc_map[NB_PORTS * 32 / BITS_PER_LONG]; |
44 | /* | 44 | /* |
45 | * set the mode for a IOMUX pin. | 45 | * set the mode for a IOMUX pin. |
46 | */ | 46 | */ |
diff --git a/arch/arm/mach-imx/irq-common.c b/arch/arm/mach-imx/irq-common.c index b6e11458e5ae..4b34f52dc46b 100644 --- a/arch/arm/mach-imx/irq-common.c +++ b/arch/arm/mach-imx/irq-common.c | |||
@@ -21,25 +21,6 @@ | |||
21 | 21 | ||
22 | #include "irq-common.h" | 22 | #include "irq-common.h" |
23 | 23 | ||
24 | int imx_irq_set_priority(unsigned char irq, unsigned char prio) | ||
25 | { | ||
26 | struct irq_chip_generic *gc; | ||
27 | struct mxc_extra_irq *exirq; | ||
28 | int ret; | ||
29 | |||
30 | ret = -ENOSYS; | ||
31 | |||
32 | gc = irq_get_chip_data(irq); | ||
33 | if (gc && gc->private) { | ||
34 | exirq = gc->private; | ||
35 | if (exirq->set_priority) | ||
36 | ret = exirq->set_priority(irq, prio); | ||
37 | } | ||
38 | |||
39 | return ret; | ||
40 | } | ||
41 | EXPORT_SYMBOL(imx_irq_set_priority); | ||
42 | |||
43 | int mxc_set_irq_fiq(unsigned int irq, unsigned int type) | 24 | int mxc_set_irq_fiq(unsigned int irq, unsigned int type) |
44 | { | 25 | { |
45 | struct irq_chip_generic *gc; | 26 | struct irq_chip_generic *gc; |
diff --git a/arch/arm/mach-imx/mach-cpuimx27.c b/arch/arm/mach-imx/mach-cpuimx27.c index 146559311bd2..ea50870bda80 100644 --- a/arch/arm/mach-imx/mach-cpuimx27.c +++ b/arch/arm/mach-imx/mach-cpuimx27.c | |||
@@ -48,7 +48,7 @@ static const int eukrea_cpuimx27_pins[] __initconst = { | |||
48 | PE14_PF_UART1_CTS, | 48 | PE14_PF_UART1_CTS, |
49 | PE15_PF_UART1_RTS, | 49 | PE15_PF_UART1_RTS, |
50 | /* UART4 */ | 50 | /* UART4 */ |
51 | #if defined(MACH_EUKREA_CPUIMX27_USEUART4) | 51 | #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4) |
52 | PB26_AF_UART4_RTS, | 52 | PB26_AF_UART4_RTS, |
53 | PB28_AF_UART4_TXD, | 53 | PB28_AF_UART4_TXD, |
54 | PB29_AF_UART4_CTS, | 54 | PB29_AF_UART4_CTS, |
@@ -272,7 +272,7 @@ static void __init eukrea_cpuimx27_init(void) | |||
272 | /* SDHC2 can be used for Wifi */ | 272 | /* SDHC2 can be used for Wifi */ |
273 | imx27_add_mxc_mmc(1, NULL); | 273 | imx27_add_mxc_mmc(1, NULL); |
274 | #endif | 274 | #endif |
275 | #if defined(MACH_EUKREA_CPUIMX27_USEUART4) | 275 | #if defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4) |
276 | /* in which case UART4 is also used for Bluetooth */ | 276 | /* in which case UART4 is also used for Bluetooth */ |
277 | imx27_add_imx_uart3(&uart_pdata); | 277 | imx27_add_imx_uart3(&uart_pdata); |
278 | #endif | 278 | #endif |
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index b59ddcb57c78..99502eeefdf7 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
@@ -72,7 +72,7 @@ static int imx6q_revision(void) | |||
72 | } | 72 | } |
73 | } | 73 | } |
74 | 74 | ||
75 | void imx6q_restart(char mode, const char *cmd) | 75 | static void imx6q_restart(char mode, const char *cmd) |
76 | { | 76 | { |
77 | struct device_node *np; | 77 | struct device_node *np; |
78 | void __iomem *wdog_base; | 78 | void __iomem *wdog_base; |
@@ -255,7 +255,7 @@ put_node: | |||
255 | of_node_put(np); | 255 | of_node_put(np); |
256 | } | 256 | } |
257 | 257 | ||
258 | struct platform_device imx6q_cpufreq_pdev = { | 258 | static struct platform_device imx6q_cpufreq_pdev = { |
259 | .name = "imx6q-cpufreq", | 259 | .name = "imx6q-cpufreq", |
260 | }; | 260 | }; |
261 | 261 | ||
diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index cefa047c4053..e0e69a682174 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c | |||
@@ -82,7 +82,7 @@ static void __iomem *imx3_ioremap_caller(unsigned long phys_addr, size_t size, | |||
82 | return __arm_ioremap_caller(phys_addr, size, mtype, caller); | 82 | return __arm_ioremap_caller(phys_addr, size, mtype, caller); |
83 | } | 83 | } |
84 | 84 | ||
85 | void __init imx3_init_l2x0(void) | 85 | static void __init imx3_init_l2x0(void) |
86 | { | 86 | { |
87 | #ifdef CONFIG_CACHE_L2X0 | 87 | #ifdef CONFIG_CACHE_L2X0 |
88 | void __iomem *l2x0_base; | 88 | void __iomem *l2x0_base; |
diff --git a/arch/arm/mach-imx/pm-imx5.c b/arch/arm/mach-imx/pm-imx5.c index f67fd7ee8127..82e79c658eb2 100644 --- a/arch/arm/mach-imx/pm-imx5.c +++ b/arch/arm/mach-imx/pm-imx5.c | |||
@@ -149,33 +149,6 @@ static void imx5_pm_idle(void) | |||
149 | imx5_cpu_do_idle(); | 149 | imx5_cpu_do_idle(); |
150 | } | 150 | } |
151 | 151 | ||
152 | static int imx5_cpuidle_enter(struct cpuidle_device *dev, | ||
153 | struct cpuidle_driver *drv, int idx) | ||
154 | { | ||
155 | int ret; | ||
156 | |||
157 | ret = imx5_cpu_do_idle(); | ||
158 | if (ret < 0) | ||
159 | return ret; | ||
160 | |||
161 | return idx; | ||
162 | } | ||
163 | |||
164 | static struct cpuidle_driver imx5_cpuidle_driver = { | ||
165 | .name = "imx5_cpuidle", | ||
166 | .owner = THIS_MODULE, | ||
167 | .en_core_tk_irqen = 1, | ||
168 | .states[0] = { | ||
169 | .enter = imx5_cpuidle_enter, | ||
170 | .exit_latency = 2, | ||
171 | .target_residency = 1, | ||
172 | .flags = CPUIDLE_FLAG_TIME_VALID, | ||
173 | .name = "IMX5 SRPG", | ||
174 | .desc = "CPU state retained,powered off", | ||
175 | }, | ||
176 | .state_count = 1, | ||
177 | }; | ||
178 | |||
179 | static int __init imx5_pm_common_init(void) | 152 | static int __init imx5_pm_common_init(void) |
180 | { | 153 | { |
181 | int ret; | 154 | int ret; |
@@ -193,8 +166,7 @@ static int __init imx5_pm_common_init(void) | |||
193 | /* Set the registers to the default cpu idle state. */ | 166 | /* Set the registers to the default cpu idle state. */ |
194 | mx5_cpu_lp_set(IMX5_DEFAULT_CPU_IDLE_STATE); | 167 | mx5_cpu_lp_set(IMX5_DEFAULT_CPU_IDLE_STATE); |
195 | 168 | ||
196 | imx_cpuidle_init(&imx5_cpuidle_driver); | 169 | return imx5_cpuidle_init(); |
197 | return 0; | ||
198 | } | 170 | } |
199 | 171 | ||
200 | void __init imx51_pm_init(void) | 172 | void __init imx51_pm_init(void) |
diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index 09a742f8c7ab..324731c2a441 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/of_address.h> | 16 | #include <linux/of_address.h> |
17 | #include <linux/smp.h> | 17 | #include <linux/smp.h> |
18 | #include <asm/smp_plat.h> | 18 | #include <asm/smp_plat.h> |
19 | #include "common.h" | ||
19 | 20 | ||
20 | #define SRC_SCR 0x000 | 21 | #define SRC_SCR 0x000 |
21 | #define SRC_GPR1 0x020 | 22 | #define SRC_GPR1 0x020 |
diff --git a/arch/arm/mach-imx/tzic.c b/arch/arm/mach-imx/tzic.c index 9721161f208f..8183178d5aa3 100644 --- a/arch/arm/mach-imx/tzic.c +++ b/arch/arm/mach-imx/tzic.c | |||
@@ -49,7 +49,7 @@ | |||
49 | #define TZIC_SWINT 0x0F00 /* Software Interrupt Rigger Register */ | 49 | #define TZIC_SWINT 0x0F00 /* Software Interrupt Rigger Register */ |
50 | #define TZIC_ID0 0x0FD0 /* Indentification Register 0 */ | 50 | #define TZIC_ID0 0x0FD0 /* Indentification Register 0 */ |
51 | 51 | ||
52 | void __iomem *tzic_base; /* Used as irq controller base in entry-macro.S */ | 52 | static void __iomem *tzic_base; |
53 | static struct irq_domain *domain; | 53 | static struct irq_domain *domain; |
54 | 54 | ||
55 | #define TZIC_NUM_IRQS 128 | 55 | #define TZIC_NUM_IRQS 128 |
diff --git a/arch/arm/mach-integrator/Makefile b/arch/arm/mach-integrator/Makefile index 5521d18bf19a..d14d6b76f4c2 100644 --- a/arch/arm/mach-integrator/Makefile +++ b/arch/arm/mach-integrator/Makefile | |||
@@ -9,5 +9,4 @@ obj-$(CONFIG_ARCH_INTEGRATOR_AP) += integrator_ap.o | |||
9 | obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o | 9 | obj-$(CONFIG_ARCH_INTEGRATOR_CP) += integrator_cp.o |
10 | 10 | ||
11 | obj-$(CONFIG_PCI) += pci_v3.o pci.o | 11 | obj-$(CONFIG_PCI) += pci_v3.o pci.o |
12 | obj-$(CONFIG_CPU_FREQ_INTEGRATOR) += cpu.o | ||
13 | obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o | 12 | obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o |
diff --git a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c deleted file mode 100644 index 590c192cdf4d..000000000000 --- a/arch/arm/mach-integrator/cpu.c +++ /dev/null | |||
@@ -1,224 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-integrator/cpu.c | ||
3 | * | ||
4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. | ||
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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * CPU support functions | ||
11 | */ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/cpufreq.h> | ||
16 | #include <linux/sched.h> | ||
17 | #include <linux/smp.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/io.h> | ||
20 | |||
21 | #include <mach/hardware.h> | ||
22 | #include <mach/platform.h> | ||
23 | #include <asm/mach-types.h> | ||
24 | #include <asm/hardware/icst.h> | ||
25 | |||
26 | static struct cpufreq_driver integrator_driver; | ||
27 | |||
28 | #define CM_ID __io_address(INTEGRATOR_HDR_ID) | ||
29 | #define CM_OSC __io_address(INTEGRATOR_HDR_OSC) | ||
30 | #define CM_STAT __io_address(INTEGRATOR_HDR_STAT) | ||
31 | #define CM_LOCK __io_address(INTEGRATOR_HDR_LOCK) | ||
32 | |||
33 | static const struct icst_params lclk_params = { | ||
34 | .ref = 24000000, | ||
35 | .vco_max = ICST525_VCO_MAX_5V, | ||
36 | .vco_min = ICST525_VCO_MIN, | ||
37 | .vd_min = 8, | ||
38 | .vd_max = 132, | ||
39 | .rd_min = 24, | ||
40 | .rd_max = 24, | ||
41 | .s2div = icst525_s2div, | ||
42 | .idx2s = icst525_idx2s, | ||
43 | }; | ||
44 | |||
45 | static const struct icst_params cclk_params = { | ||
46 | .ref = 24000000, | ||
47 | .vco_max = ICST525_VCO_MAX_5V, | ||
48 | .vco_min = ICST525_VCO_MIN, | ||
49 | .vd_min = 12, | ||
50 | .vd_max = 160, | ||
51 | .rd_min = 24, | ||
52 | .rd_max = 24, | ||
53 | .s2div = icst525_s2div, | ||
54 | .idx2s = icst525_idx2s, | ||
55 | }; | ||
56 | |||
57 | /* | ||
58 | * Validate the speed policy. | ||
59 | */ | ||
60 | static int integrator_verify_policy(struct cpufreq_policy *policy) | ||
61 | { | ||
62 | struct icst_vco vco; | ||
63 | |||
64 | cpufreq_verify_within_limits(policy, | ||
65 | policy->cpuinfo.min_freq, | ||
66 | policy->cpuinfo.max_freq); | ||
67 | |||
68 | vco = icst_hz_to_vco(&cclk_params, policy->max * 1000); | ||
69 | policy->max = icst_hz(&cclk_params, vco) / 1000; | ||
70 | |||
71 | vco = icst_hz_to_vco(&cclk_params, policy->min * 1000); | ||
72 | policy->min = icst_hz(&cclk_params, vco) / 1000; | ||
73 | |||
74 | cpufreq_verify_within_limits(policy, | ||
75 | policy->cpuinfo.min_freq, | ||
76 | policy->cpuinfo.max_freq); | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | |||
82 | static int integrator_set_target(struct cpufreq_policy *policy, | ||
83 | unsigned int target_freq, | ||
84 | unsigned int relation) | ||
85 | { | ||
86 | cpumask_t cpus_allowed; | ||
87 | int cpu = policy->cpu; | ||
88 | struct icst_vco vco; | ||
89 | struct cpufreq_freqs freqs; | ||
90 | u_int cm_osc; | ||
91 | |||
92 | /* | ||
93 | * Save this threads cpus_allowed mask. | ||
94 | */ | ||
95 | cpus_allowed = current->cpus_allowed; | ||
96 | |||
97 | /* | ||
98 | * Bind to the specified CPU. When this call returns, | ||
99 | * we should be running on the right CPU. | ||
100 | */ | ||
101 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | ||
102 | BUG_ON(cpu != smp_processor_id()); | ||
103 | |||
104 | /* get current setting */ | ||
105 | cm_osc = __raw_readl(CM_OSC); | ||
106 | |||
107 | if (machine_is_integrator()) { | ||
108 | vco.s = (cm_osc >> 8) & 7; | ||
109 | } else if (machine_is_cintegrator()) { | ||
110 | vco.s = 1; | ||
111 | } | ||
112 | vco.v = cm_osc & 255; | ||
113 | vco.r = 22; | ||
114 | freqs.old = icst_hz(&cclk_params, vco) / 1000; | ||
115 | |||
116 | /* icst_hz_to_vco rounds down -- so we need the next | ||
117 | * larger freq in case of CPUFREQ_RELATION_L. | ||
118 | */ | ||
119 | if (relation == CPUFREQ_RELATION_L) | ||
120 | target_freq += 999; | ||
121 | if (target_freq > policy->max) | ||
122 | target_freq = policy->max; | ||
123 | vco = icst_hz_to_vco(&cclk_params, target_freq * 1000); | ||
124 | freqs.new = icst_hz(&cclk_params, vco) / 1000; | ||
125 | |||
126 | freqs.cpu = policy->cpu; | ||
127 | |||
128 | if (freqs.old == freqs.new) { | ||
129 | set_cpus_allowed(current, cpus_allowed); | ||
130 | return 0; | ||
131 | } | ||
132 | |||
133 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
134 | |||
135 | cm_osc = __raw_readl(CM_OSC); | ||
136 | |||
137 | if (machine_is_integrator()) { | ||
138 | cm_osc &= 0xfffff800; | ||
139 | cm_osc |= vco.s << 8; | ||
140 | } else if (machine_is_cintegrator()) { | ||
141 | cm_osc &= 0xffffff00; | ||
142 | } | ||
143 | cm_osc |= vco.v; | ||
144 | |||
145 | __raw_writel(0xa05f, CM_LOCK); | ||
146 | __raw_writel(cm_osc, CM_OSC); | ||
147 | __raw_writel(0, CM_LOCK); | ||
148 | |||
149 | /* | ||
150 | * Restore the CPUs allowed mask. | ||
151 | */ | ||
152 | set_cpus_allowed(current, cpus_allowed); | ||
153 | |||
154 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
155 | |||
156 | return 0; | ||
157 | } | ||
158 | |||
159 | static unsigned int integrator_get(unsigned int cpu) | ||
160 | { | ||
161 | cpumask_t cpus_allowed; | ||
162 | unsigned int current_freq; | ||
163 | u_int cm_osc; | ||
164 | struct icst_vco vco; | ||
165 | |||
166 | cpus_allowed = current->cpus_allowed; | ||
167 | |||
168 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | ||
169 | BUG_ON(cpu != smp_processor_id()); | ||
170 | |||
171 | /* detect memory etc. */ | ||
172 | cm_osc = __raw_readl(CM_OSC); | ||
173 | |||
174 | if (machine_is_integrator()) { | ||
175 | vco.s = (cm_osc >> 8) & 7; | ||
176 | } else { | ||
177 | vco.s = 1; | ||
178 | } | ||
179 | vco.v = cm_osc & 255; | ||
180 | vco.r = 22; | ||
181 | |||
182 | current_freq = icst_hz(&cclk_params, vco) / 1000; /* current freq */ | ||
183 | |||
184 | set_cpus_allowed(current, cpus_allowed); | ||
185 | |||
186 | return current_freq; | ||
187 | } | ||
188 | |||
189 | static int integrator_cpufreq_init(struct cpufreq_policy *policy) | ||
190 | { | ||
191 | |||
192 | /* set default policy and cpuinfo */ | ||
193 | policy->cpuinfo.max_freq = 160000; | ||
194 | policy->cpuinfo.min_freq = 12000; | ||
195 | policy->cpuinfo.transition_latency = 1000000; /* 1 ms, assumed */ | ||
196 | policy->cur = policy->min = policy->max = integrator_get(policy->cpu); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | static struct cpufreq_driver integrator_driver = { | ||
202 | .verify = integrator_verify_policy, | ||
203 | .target = integrator_set_target, | ||
204 | .get = integrator_get, | ||
205 | .init = integrator_cpufreq_init, | ||
206 | .name = "integrator", | ||
207 | }; | ||
208 | |||
209 | static int __init integrator_cpu_init(void) | ||
210 | { | ||
211 | return cpufreq_register_driver(&integrator_driver); | ||
212 | } | ||
213 | |||
214 | static void __exit integrator_cpu_exit(void) | ||
215 | { | ||
216 | cpufreq_unregister_driver(&integrator_driver); | ||
217 | } | ||
218 | |||
219 | MODULE_AUTHOR ("Russell M. King"); | ||
220 | MODULE_DESCRIPTION ("cpufreq driver for ARM Integrator CPUs"); | ||
221 | MODULE_LICENSE ("GPL"); | ||
222 | |||
223 | module_init(integrator_cpu_init); | ||
224 | module_exit(integrator_cpu_exit); | ||
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 1dbeb7c99d58..6600cff6bd92 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/io.h> | 29 | #include <linux/io.h> |
30 | #include <linux/export.h> | 30 | #include <linux/export.h> |
31 | #include <linux/gpio.h> | 31 | #include <linux/gpio.h> |
32 | #include <linux/cpu.h> | ||
32 | 33 | ||
33 | #include <mach/udc.h> | 34 | #include <mach/udc.h> |
34 | #include <mach/hardware.h> | 35 | #include <mach/hardware.h> |
@@ -239,7 +240,7 @@ void __init ixp4xx_init_irq(void) | |||
239 | * ixp4xx does not implement the XScale PWRMODE register | 240 | * ixp4xx does not implement the XScale PWRMODE register |
240 | * so it must not call cpu_do_idle(). | 241 | * so it must not call cpu_do_idle(). |
241 | */ | 242 | */ |
242 | disable_hlt(); | 243 | cpu_idle_poll_ctrl(true); |
243 | 244 | ||
244 | /* Route all sources to IRQ instead of FIQ */ | 245 | /* Route all sources to IRQ instead of FIQ */ |
245 | *IXP4XX_ICLR = 0x0; | 246 | *IXP4XX_ICLR = 0x0; |
diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 9f64d5632e07..76901f4ce611 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c | |||
@@ -223,13 +223,7 @@ static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = { | |||
223 | }; | 223 | }; |
224 | 224 | ||
225 | #if defined(CONFIG_USB_EHCI_MV) | 225 | #if defined(CONFIG_USB_EHCI_MV) |
226 | static char *pxa168_sph_clock_name[] = { | ||
227 | [0] = "PXA168-USBCLK", | ||
228 | }; | ||
229 | |||
230 | static struct mv_usb_platform_data pxa168_sph_pdata = { | 226 | static struct mv_usb_platform_data pxa168_sph_pdata = { |
231 | .clknum = 1, | ||
232 | .clkname = pxa168_sph_clock_name, | ||
233 | .mode = MV_USB_MODE_HOST, | 227 | .mode = MV_USB_MODE_HOST, |
234 | .phy_init = pxa_usb_phy_init, | 228 | .phy_init = pxa_usb_phy_init, |
235 | .phy_deinit = pxa_usb_phy_deinit, | 229 | .phy_deinit = pxa_usb_phy_deinit, |
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c index 22a9058f9f4d..6528a5fa6a26 100644 --- a/arch/arm/mach-mmp/ttc_dkb.c +++ b/arch/arm/mach-mmp/ttc_dkb.c | |||
@@ -162,13 +162,7 @@ static struct i2c_board_info ttc_dkb_i2c_info[] = { | |||
162 | #ifdef CONFIG_USB_SUPPORT | 162 | #ifdef CONFIG_USB_SUPPORT |
163 | #if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O) | 163 | #if defined(CONFIG_USB_MV_UDC) || defined(CONFIG_USB_EHCI_MV_U2O) |
164 | 164 | ||
165 | static char *pxa910_usb_clock_name[] = { | ||
166 | [0] = "U2OCLK", | ||
167 | }; | ||
168 | |||
169 | static struct mv_usb_platform_data ttc_usb_pdata = { | 165 | static struct mv_usb_platform_data ttc_usb_pdata = { |
170 | .clknum = 1, | ||
171 | .clkname = pxa910_usb_clock_name, | ||
172 | .vbus = NULL, | 166 | .vbus = NULL, |
173 | .mode = MV_USB_MODE_OTG, | 167 | .mode = MV_USB_MODE_OTG, |
174 | .otg_force_a_bus_req = 1, | 168 | .otg_force_a_bus_req = 1, |
diff --git a/arch/arm/mach-msm/include/mach/uncompress.h b/arch/arm/mach-msm/include/mach/uncompress.h index fa97a10d8695..94324870fb04 100644 --- a/arch/arm/mach-msm/include/mach/uncompress.h +++ b/arch/arm/mach-msm/include/mach/uncompress.h | |||
@@ -37,7 +37,7 @@ static void putc(int c) | |||
37 | * Wait for TX_READY to be set; but skip it if we have a | 37 | * Wait for TX_READY to be set; but skip it if we have a |
38 | * TX underrun. | 38 | * TX underrun. |
39 | */ | 39 | */ |
40 | if (UART_DM_SR & 0x08) | 40 | if (!(UART_DM_SR & 0x08)) |
41 | while (!(UART_DM_ISR & 0x80)) | 41 | while (!(UART_DM_ISR & 0x80)) |
42 | cpu_relax(); | 42 | cpu_relax(); |
43 | 43 | ||
diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c index 1e243f46a969..7777767ee89a 100644 --- a/arch/arm/mach-msm/last_radio_log.c +++ b/arch/arm/mach-msm/last_radio_log.c | |||
@@ -31,20 +31,8 @@ extern void *smem_item(unsigned id, unsigned *size); | |||
31 | static ssize_t last_radio_log_read(struct file *file, char __user *buf, | 31 | static ssize_t last_radio_log_read(struct file *file, char __user *buf, |
32 | size_t len, loff_t *offset) | 32 | size_t len, loff_t *offset) |
33 | { | 33 | { |
34 | loff_t pos = *offset; | 34 | return simple_read_from_buffer(buf, len, offset, |
35 | ssize_t count; | 35 | radio_log_base, radio_log_size); |
36 | |||
37 | if (pos >= radio_log_size) | ||
38 | return 0; | ||
39 | |||
40 | count = min(len, (size_t)(radio_log_size - pos)); | ||
41 | if (copy_to_user(buf, radio_log_base + pos, count)) { | ||
42 | pr_err("%s: copy to user failed\n", __func__); | ||
43 | return -EFAULT; | ||
44 | } | ||
45 | |||
46 | *offset += count; | ||
47 | return count; | ||
48 | } | 36 | } |
49 | 37 | ||
50 | static struct file_operations last_radio_log_fops = { | 38 | static struct file_operations last_radio_log_fops = { |
@@ -67,7 +55,8 @@ void msm_init_last_radio_log(struct module *owner) | |||
67 | return; | 55 | return; |
68 | } | 56 | } |
69 | 57 | ||
70 | entry = create_proc_entry("last_radio_log", S_IFREG | S_IRUGO, NULL); | 58 | entry = proc_create("last_radio_log", S_IRUGO, NULL, |
59 | &last_radio_log_fops); | ||
71 | if (!entry) { | 60 | if (!entry) { |
72 | pr_err("%s: could not create proc entry for radio log\n", | 61 | pr_err("%s: could not create proc entry for radio log\n", |
73 | __func__); | 62 | __func__); |
@@ -77,7 +66,6 @@ void msm_init_last_radio_log(struct module *owner) | |||
77 | pr_err("%s: last radio log is %d bytes long\n", __func__, | 66 | pr_err("%s: last radio log is %d bytes long\n", __func__, |
78 | radio_log_size); | 67 | radio_log_size); |
79 | last_radio_log_fops.owner = owner; | 68 | last_radio_log_fops.owner = owner; |
80 | entry->proc_fops = &last_radio_log_fops; | ||
81 | entry->size = radio_log_size; | 69 | entry->size = radio_log_size; |
82 | } | 70 | } |
83 | EXPORT_SYMBOL(msm_init_last_radio_log); | 71 | EXPORT_SYMBOL(msm_init_last_radio_log); |
diff --git a/arch/arm/mach-mvebu/irq-armada-370-xp.c b/arch/arm/mach-mvebu/irq-armada-370-xp.c index d5970f5a1e8d..830139a3e2ba 100644 --- a/arch/arm/mach-mvebu/irq-armada-370-xp.c +++ b/arch/arm/mach-mvebu/irq-armada-370-xp.c | |||
@@ -57,7 +57,7 @@ static struct irq_domain *armada_370_xp_mpic_domain; | |||
57 | /* | 57 | /* |
58 | * In SMP mode: | 58 | * In SMP mode: |
59 | * For shared global interrupts, mask/unmask global enable bit | 59 | * For shared global interrupts, mask/unmask global enable bit |
60 | * For CPU interrtups, mask/unmask the calling CPU's bit | 60 | * For CPU interrupts, mask/unmask the calling CPU's bit |
61 | */ | 61 | */ |
62 | static void armada_370_xp_irq_mask(struct irq_data *d) | 62 | static void armada_370_xp_irq_mask(struct irq_data *d) |
63 | { | 63 | { |
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index 903da8eb886c..cdd05f2e67ee 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig | |||
@@ -55,12 +55,6 @@ config MACH_OMAP_H3 | |||
55 | TI OMAP 1710 H3 board support. Say Y here if you have such | 55 | TI OMAP 1710 H3 board support. Say Y here if you have such |
56 | a board. | 56 | a board. |
57 | 57 | ||
58 | config MACH_OMAP_HTCWIZARD | ||
59 | bool "HTC Wizard" | ||
60 | depends on ARCH_OMAP850 | ||
61 | help | ||
62 | HTC Wizard smartphone support (AKA QTEK 9100, ...) | ||
63 | |||
64 | config MACH_HERALD | 58 | config MACH_HERALD |
65 | bool "HTC Herald" | 59 | bool "HTC Herald" |
66 | depends on ARCH_OMAP850 | 60 | depends on ARCH_OMAP850 |
diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index 7a7690ab6cb8..dd712f109738 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c | |||
@@ -37,12 +37,14 @@ | |||
37 | 37 | ||
38 | #include <linux/suspend.h> | 38 | #include <linux/suspend.h> |
39 | #include <linux/sched.h> | 39 | #include <linux/sched.h> |
40 | #include <linux/proc_fs.h> | 40 | #include <linux/debugfs.h> |
41 | #include <linux/seq_file.h> | ||
41 | #include <linux/interrupt.h> | 42 | #include <linux/interrupt.h> |
42 | #include <linux/sysfs.h> | 43 | #include <linux/sysfs.h> |
43 | #include <linux/module.h> | 44 | #include <linux/module.h> |
44 | #include <linux/io.h> | 45 | #include <linux/io.h> |
45 | #include <linux/atomic.h> | 46 | #include <linux/atomic.h> |
47 | #include <linux/cpu.h> | ||
46 | 48 | ||
47 | #include <asm/fncpy.h> | 49 | #include <asm/fncpy.h> |
48 | #include <asm/system_misc.h> | 50 | #include <asm/system_misc.h> |
@@ -422,23 +424,12 @@ void omap1_pm_suspend(void) | |||
422 | omap_rev()); | 424 | omap_rev()); |
423 | } | 425 | } |
424 | 426 | ||
425 | #if defined(DEBUG) && defined(CONFIG_PROC_FS) | 427 | #ifdef CONFIG_DEBUG_FS |
426 | static int g_read_completed; | ||
427 | |||
428 | /* | 428 | /* |
429 | * Read system PM registers for debugging | 429 | * Read system PM registers for debugging |
430 | */ | 430 | */ |
431 | static int omap_pm_read_proc( | 431 | static int omap_pm_debug_show(struct seq_file *m, void *v) |
432 | char *page_buffer, | ||
433 | char **my_first_byte, | ||
434 | off_t virtual_start, | ||
435 | int length, | ||
436 | int *eof, | ||
437 | void *data) | ||
438 | { | 432 | { |
439 | int my_buffer_offset = 0; | ||
440 | char * const my_base = page_buffer; | ||
441 | |||
442 | ARM_SAVE(ARM_CKCTL); | 433 | ARM_SAVE(ARM_CKCTL); |
443 | ARM_SAVE(ARM_IDLECT1); | 434 | ARM_SAVE(ARM_IDLECT1); |
444 | ARM_SAVE(ARM_IDLECT2); | 435 | ARM_SAVE(ARM_IDLECT2); |
@@ -479,10 +470,7 @@ static int omap_pm_read_proc( | |||
479 | MPUI1610_SAVE(EMIFS_CONFIG); | 470 | MPUI1610_SAVE(EMIFS_CONFIG); |
480 | } | 471 | } |
481 | 472 | ||
482 | if (virtual_start == 0) { | 473 | seq_printf(m, |
483 | g_read_completed = 0; | ||
484 | |||
485 | my_buffer_offset += sprintf(my_base + my_buffer_offset, | ||
486 | "ARM_CKCTL_REG: 0x%-8x \n" | 474 | "ARM_CKCTL_REG: 0x%-8x \n" |
487 | "ARM_IDLECT1_REG: 0x%-8x \n" | 475 | "ARM_IDLECT1_REG: 0x%-8x \n" |
488 | "ARM_IDLECT2_REG: 0x%-8x \n" | 476 | "ARM_IDLECT2_REG: 0x%-8x \n" |
@@ -512,8 +500,8 @@ static int omap_pm_read_proc( | |||
512 | ULPD_SHOW(ULPD_STATUS_REQ), | 500 | ULPD_SHOW(ULPD_STATUS_REQ), |
513 | ULPD_SHOW(ULPD_POWER_CTRL)); | 501 | ULPD_SHOW(ULPD_POWER_CTRL)); |
514 | 502 | ||
515 | if (cpu_is_omap7xx()) { | 503 | if (cpu_is_omap7xx()) { |
516 | my_buffer_offset += sprintf(my_base + my_buffer_offset, | 504 | seq_printf(m, |
517 | "MPUI7XX_CTRL_REG 0x%-8x \n" | 505 | "MPUI7XX_CTRL_REG 0x%-8x \n" |
518 | "MPUI7XX_DSP_STATUS_REG: 0x%-8x \n" | 506 | "MPUI7XX_DSP_STATUS_REG: 0x%-8x \n" |
519 | "MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n" | 507 | "MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n" |
@@ -526,8 +514,8 @@ static int omap_pm_read_proc( | |||
526 | MPUI7XX_SHOW(MPUI_DSP_API_CONFIG), | 514 | MPUI7XX_SHOW(MPUI_DSP_API_CONFIG), |
527 | MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG), | 515 | MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG), |
528 | MPUI7XX_SHOW(EMIFS_CONFIG)); | 516 | MPUI7XX_SHOW(EMIFS_CONFIG)); |
529 | } else if (cpu_is_omap15xx()) { | 517 | } else if (cpu_is_omap15xx()) { |
530 | my_buffer_offset += sprintf(my_base + my_buffer_offset, | 518 | seq_printf(m, |
531 | "MPUI1510_CTRL_REG 0x%-8x \n" | 519 | "MPUI1510_CTRL_REG 0x%-8x \n" |
532 | "MPUI1510_DSP_STATUS_REG: 0x%-8x \n" | 520 | "MPUI1510_DSP_STATUS_REG: 0x%-8x \n" |
533 | "MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n" | 521 | "MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n" |
@@ -540,8 +528,8 @@ static int omap_pm_read_proc( | |||
540 | MPUI1510_SHOW(MPUI_DSP_API_CONFIG), | 528 | MPUI1510_SHOW(MPUI_DSP_API_CONFIG), |
541 | MPUI1510_SHOW(EMIFF_SDRAM_CONFIG), | 529 | MPUI1510_SHOW(EMIFF_SDRAM_CONFIG), |
542 | MPUI1510_SHOW(EMIFS_CONFIG)); | 530 | MPUI1510_SHOW(EMIFS_CONFIG)); |
543 | } else if (cpu_is_omap16xx()) { | 531 | } else if (cpu_is_omap16xx()) { |
544 | my_buffer_offset += sprintf(my_base + my_buffer_offset, | 532 | seq_printf(m, |
545 | "MPUI1610_CTRL_REG 0x%-8x \n" | 533 | "MPUI1610_CTRL_REG 0x%-8x \n" |
546 | "MPUI1610_DSP_STATUS_REG: 0x%-8x \n" | 534 | "MPUI1610_DSP_STATUS_REG: 0x%-8x \n" |
547 | "MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n" | 535 | "MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n" |
@@ -554,28 +542,37 @@ static int omap_pm_read_proc( | |||
554 | MPUI1610_SHOW(MPUI_DSP_API_CONFIG), | 542 | MPUI1610_SHOW(MPUI_DSP_API_CONFIG), |
555 | MPUI1610_SHOW(EMIFF_SDRAM_CONFIG), | 543 | MPUI1610_SHOW(EMIFF_SDRAM_CONFIG), |
556 | MPUI1610_SHOW(EMIFS_CONFIG)); | 544 | MPUI1610_SHOW(EMIFS_CONFIG)); |
557 | } | ||
558 | |||
559 | g_read_completed++; | ||
560 | } else if (g_read_completed >= 1) { | ||
561 | *eof = 1; | ||
562 | return 0; | ||
563 | } | 545 | } |
564 | g_read_completed++; | ||
565 | 546 | ||
566 | *my_first_byte = page_buffer; | 547 | return 0; |
567 | return my_buffer_offset; | ||
568 | } | 548 | } |
569 | 549 | ||
570 | static void omap_pm_init_proc(void) | 550 | static int omap_pm_debug_open(struct inode *inode, struct file *file) |
571 | { | 551 | { |
572 | /* XXX Appears to leak memory */ | 552 | return single_open(file, omap_pm_debug_show, |
573 | create_proc_read_entry("driver/omap_pm", | 553 | &inode->i_private); |
574 | S_IWUSR | S_IRUGO, NULL, | ||
575 | omap_pm_read_proc, NULL); | ||
576 | } | 554 | } |
577 | 555 | ||
578 | #endif /* DEBUG && CONFIG_PROC_FS */ | 556 | static const struct file_operations omap_pm_debug_fops = { |
557 | .open = omap_pm_debug_open, | ||
558 | .read = seq_read, | ||
559 | .llseek = seq_lseek, | ||
560 | .release = seq_release, | ||
561 | }; | ||
562 | |||
563 | static void omap_pm_init_debugfs(void) | ||
564 | { | ||
565 | struct dentry *d; | ||
566 | |||
567 | d = debugfs_create_dir("pm_debug", NULL); | ||
568 | if (!d) | ||
569 | return; | ||
570 | |||
571 | (void) debugfs_create_file("omap_pm", S_IWUSR | S_IRUGO, | ||
572 | d, NULL, &omap_pm_debug_fops); | ||
573 | } | ||
574 | |||
575 | #endif /* CONFIG_DEBUG_FS */ | ||
579 | 576 | ||
580 | /* | 577 | /* |
581 | * omap_pm_prepare - Do preliminary suspend work. | 578 | * omap_pm_prepare - Do preliminary suspend work. |
@@ -584,8 +581,7 @@ static void omap_pm_init_proc(void) | |||
584 | static int omap_pm_prepare(void) | 581 | static int omap_pm_prepare(void) |
585 | { | 582 | { |
586 | /* We cannot sleep in idle until we have resumed */ | 583 | /* We cannot sleep in idle until we have resumed */ |
587 | disable_hlt(); | 584 | cpu_idle_poll_ctrl(true); |
588 | |||
589 | return 0; | 585 | return 0; |
590 | } | 586 | } |
591 | 587 | ||
@@ -621,7 +617,7 @@ static int omap_pm_enter(suspend_state_t state) | |||
621 | 617 | ||
622 | static void omap_pm_finish(void) | 618 | static void omap_pm_finish(void) |
623 | { | 619 | { |
624 | enable_hlt(); | 620 | cpu_idle_poll_ctrl(false); |
625 | } | 621 | } |
626 | 622 | ||
627 | 623 | ||
@@ -701,8 +697,8 @@ static int __init omap_pm_init(void) | |||
701 | 697 | ||
702 | suspend_set_ops(&omap_pm_ops); | 698 | suspend_set_ops(&omap_pm_ops); |
703 | 699 | ||
704 | #if defined(DEBUG) && defined(CONFIG_PROC_FS) | 700 | #ifdef CONFIG_DEBUG_FS |
705 | omap_pm_init_proc(); | 701 | omap_pm_init_debugfs(); |
706 | #endif | 702 | #endif |
707 | 703 | ||
708 | #ifdef CONFIG_OMAP_32K_TIMER | 704 | #ifdef CONFIG_OMAP_32K_TIMER |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 8111cd9ff3e5..4dc34ae6a857 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -55,6 +55,7 @@ config SOC_HAS_REALTIME_COUNTER | |||
55 | config ARCH_OMAP2 | 55 | config ARCH_OMAP2 |
56 | bool "TI OMAP2" | 56 | bool "TI OMAP2" |
57 | depends on ARCH_OMAP2PLUS | 57 | depends on ARCH_OMAP2PLUS |
58 | depends on ARCH_MULTI_V6 | ||
58 | default y | 59 | default y |
59 | select CPU_V6 | 60 | select CPU_V6 |
60 | select MULTI_IRQ_HANDLER | 61 | select MULTI_IRQ_HANDLER |
@@ -64,6 +65,7 @@ config ARCH_OMAP2 | |||
64 | config ARCH_OMAP3 | 65 | config ARCH_OMAP3 |
65 | bool "TI OMAP3" | 66 | bool "TI OMAP3" |
66 | depends on ARCH_OMAP2PLUS | 67 | depends on ARCH_OMAP2PLUS |
68 | depends on ARCH_MULTI_V7 | ||
67 | default y | 69 | default y |
68 | select ARCH_HAS_OPP | 70 | select ARCH_HAS_OPP |
69 | select ARM_CPU_SUSPEND if PM | 71 | select ARM_CPU_SUSPEND if PM |
@@ -80,6 +82,7 @@ config ARCH_OMAP4 | |||
80 | bool "TI OMAP4" | 82 | bool "TI OMAP4" |
81 | default y | 83 | default y |
82 | depends on ARCH_OMAP2PLUS | 84 | depends on ARCH_OMAP2PLUS |
85 | depends on ARCH_MULTI_V7 | ||
83 | select ARCH_HAS_OPP | 86 | select ARCH_HAS_OPP |
84 | select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP | 87 | select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP |
85 | select ARM_CPU_SUSPEND if PM | 88 | select ARM_CPU_SUSPEND if PM |
@@ -99,6 +102,7 @@ config ARCH_OMAP4 | |||
99 | 102 | ||
100 | config SOC_OMAP5 | 103 | config SOC_OMAP5 |
101 | bool "TI OMAP5" | 104 | bool "TI OMAP5" |
105 | depends on ARCH_MULTI_V7 | ||
102 | select ARM_CPU_SUSPEND if PM | 106 | select ARM_CPU_SUSPEND if PM |
103 | select ARM_GIC | 107 | select ARM_GIC |
104 | select CPU_V7 | 108 | select CPU_V7 |
@@ -135,6 +139,7 @@ config SOC_TI81XX | |||
135 | 139 | ||
136 | config SOC_AM33XX | 140 | config SOC_AM33XX |
137 | bool "AM33XX support" | 141 | bool "AM33XX support" |
142 | depends on ARCH_MULTI_V7 | ||
138 | default y | 143 | default y |
139 | select ARM_CPU_SUSPEND if PM | 144 | select ARM_CPU_SUSPEND if PM |
140 | select CPU_V7 | 145 | select CPU_V7 |
@@ -408,7 +413,7 @@ config OMAP3_SDRC_AC_TIMING | |||
408 | 413 | ||
409 | config OMAP4_ERRATA_I688 | 414 | config OMAP4_ERRATA_I688 |
410 | bool "OMAP4 errata: Async Bridge Corruption" | 415 | bool "OMAP4 errata: Async Bridge Corruption" |
411 | depends on ARCH_OMAP4 && !ARCH_MULTIPLATFORM | 416 | depends on (ARCH_OMAP4 || SOC_OMAP5) && !ARCH_MULTIPLATFORM |
412 | select ARCH_HAS_BARRIERS | 417 | select ARCH_HAS_BARRIERS |
413 | help | 418 | help |
414 | If a data is stalled inside asynchronous bridge because of back | 419 | If a data is stalled inside asynchronous bridge because of back |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index a3e0aaa4886b..cb0596b631cf 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -166,7 +166,7 @@ static void __init sdp2430_display_init(void) | |||
166 | omap_display_init(&sdp2430_dss_data); | 166 | omap_display_init(&sdp2430_dss_data); |
167 | } | 167 | } |
168 | 168 | ||
169 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91x_MODULE) | 169 | #if IS_ENABLED(CONFIG_SMC91X) |
170 | 170 | ||
171 | static struct omap_smc91x_platform_data board_smc91x_data = { | 171 | static struct omap_smc91x_platform_data board_smc91x_data = { |
172 | .cs = 5, | 172 | .cs = 5, |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 812c829fa46f..5b4ec51c385f 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -246,7 +246,7 @@ static u32 is_gpmc_muxed(void) | |||
246 | return 0; | 246 | return 0; |
247 | } | 247 | } |
248 | 248 | ||
249 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91x_MODULE) | 249 | #if IS_ENABLED(CONFIG_SMC91X) |
250 | 250 | ||
251 | static struct omap_smc91x_platform_data board_smc91x_data = { | 251 | static struct omap_smc91x_platform_data board_smc91x_data = { |
252 | .cs = 1, | 252 | .cs = 1, |
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c index dcc5bf57a263..332c6d3e55a9 100644 --- a/arch/arm/mach-omap2/cclock33xx_data.c +++ b/arch/arm/mach-omap2/cclock33xx_data.c | |||
@@ -947,6 +947,14 @@ int __init am33xx_clk_init(void) | |||
947 | 947 | ||
948 | clk_set_parent(&timer3_fck, &sys_clkin_ck); | 948 | clk_set_parent(&timer3_fck, &sys_clkin_ck); |
949 | clk_set_parent(&timer6_fck, &sys_clkin_ck); | 949 | clk_set_parent(&timer6_fck, &sys_clkin_ck); |
950 | /* | ||
951 | * The On-Chip 32K RC Osc clock is not an accurate clock-source as per | ||
952 | * the design/spec, so as a result, for example, timer which supposed | ||
953 | * to get expired @60Sec, but will expire somewhere ~@40Sec, which is | ||
954 | * not expected by any use-case, so change WDT1 clock source to PRCM | ||
955 | * 32KHz clock. | ||
956 | */ | ||
957 | clk_set_parent(&wdt1_fck, &clkdiv32k_ick); | ||
950 | 958 | ||
951 | return 0; | 959 | return 0; |
952 | } | 960 | } |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index d6ba13e1c540..14522d077c88 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -249,7 +249,6 @@ extern int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state); | |||
249 | extern int omap4_finish_suspend(unsigned long cpu_state); | 249 | extern int omap4_finish_suspend(unsigned long cpu_state); |
250 | extern void omap4_cpu_resume(void); | 250 | extern void omap4_cpu_resume(void); |
251 | extern int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state); | 251 | extern int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state); |
252 | extern u32 omap4_mpuss_read_prev_context_state(void); | ||
253 | #else | 252 | #else |
254 | static inline int omap4_enter_lowpower(unsigned int cpu, | 253 | static inline int omap4_enter_lowpower(unsigned int cpu, |
255 | unsigned int power_state) | 254 | unsigned int power_state) |
@@ -277,10 +276,6 @@ static inline int omap4_finish_suspend(unsigned long cpu_state) | |||
277 | static inline void omap4_cpu_resume(void) | 276 | static inline void omap4_cpu_resume(void) |
278 | {} | 277 | {} |
279 | 278 | ||
280 | static inline u32 omap4_mpuss_read_prev_context_state(void) | ||
281 | { | ||
282 | return 0; | ||
283 | } | ||
284 | #endif | 279 | #endif |
285 | 280 | ||
286 | struct omap_sdrc_params; | 281 | struct omap_sdrc_params; |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 06f567faf993..e18709d3b95d 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/cpuidle.h> | 26 | #include <linux/cpuidle.h> |
27 | #include <linux/export.h> | 27 | #include <linux/export.h> |
28 | #include <linux/cpu_pm.h> | 28 | #include <linux/cpu_pm.h> |
29 | #include <asm/cpuidle.h> | ||
29 | 30 | ||
30 | #include "powerdomain.h" | 31 | #include "powerdomain.h" |
31 | #include "clockdomain.h" | 32 | #include "clockdomain.h" |
@@ -99,11 +100,15 @@ static struct omap3_idle_statedata omap3_idle_data[] = { | |||
99 | }, | 100 | }, |
100 | }; | 101 | }; |
101 | 102 | ||
102 | /* Private functions */ | 103 | /** |
103 | 104 | * omap3_enter_idle - Programs OMAP3 to enter the specified state | |
104 | static int __omap3_enter_idle(struct cpuidle_device *dev, | 105 | * @dev: cpuidle device |
105 | struct cpuidle_driver *drv, | 106 | * @drv: cpuidle driver |
106 | int index) | 107 | * @index: the index of state to be entered |
108 | */ | ||
109 | static int omap3_enter_idle(struct cpuidle_device *dev, | ||
110 | struct cpuidle_driver *drv, | ||
111 | int index) | ||
107 | { | 112 | { |
108 | struct omap3_idle_statedata *cx = &omap3_idle_data[index]; | 113 | struct omap3_idle_statedata *cx = &omap3_idle_data[index]; |
109 | 114 | ||
@@ -146,22 +151,6 @@ return_sleep_time: | |||
146 | } | 151 | } |
147 | 152 | ||
148 | /** | 153 | /** |
149 | * omap3_enter_idle - Programs OMAP3 to enter the specified state | ||
150 | * @dev: cpuidle device | ||
151 | * @drv: cpuidle driver | ||
152 | * @index: the index of state to be entered | ||
153 | * | ||
154 | * Called from the CPUidle framework to program the device to the | ||
155 | * specified target state selected by the governor. | ||
156 | */ | ||
157 | static inline int omap3_enter_idle(struct cpuidle_device *dev, | ||
158 | struct cpuidle_driver *drv, | ||
159 | int index) | ||
160 | { | ||
161 | return cpuidle_wrap_enter(dev, drv, index, __omap3_enter_idle); | ||
162 | } | ||
163 | |||
164 | /** | ||
165 | * next_valid_state - Find next valid C-state | 154 | * next_valid_state - Find next valid C-state |
166 | * @dev: cpuidle device | 155 | * @dev: cpuidle device |
167 | * @drv: cpuidle driver | 156 | * @drv: cpuidle driver |
@@ -268,11 +257,9 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | |||
268 | return ret; | 257 | return ret; |
269 | } | 258 | } |
270 | 259 | ||
271 | static DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); | ||
272 | |||
273 | static struct cpuidle_driver omap3_idle_driver = { | 260 | static struct cpuidle_driver omap3_idle_driver = { |
274 | .name = "omap3_idle", | 261 | .name = "omap3_idle", |
275 | .owner = THIS_MODULE, | 262 | .owner = THIS_MODULE, |
276 | .states = { | 263 | .states = { |
277 | { | 264 | { |
278 | .enter = omap3_enter_idle_bm, | 265 | .enter = omap3_enter_idle_bm, |
@@ -345,8 +332,6 @@ static struct cpuidle_driver omap3_idle_driver = { | |||
345 | */ | 332 | */ |
346 | int __init omap3_idle_init(void) | 333 | int __init omap3_idle_init(void) |
347 | { | 334 | { |
348 | struct cpuidle_device *dev; | ||
349 | |||
350 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); | 335 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); |
351 | core_pd = pwrdm_lookup("core_pwrdm"); | 336 | core_pd = pwrdm_lookup("core_pwrdm"); |
352 | per_pd = pwrdm_lookup("per_pwrdm"); | 337 | per_pd = pwrdm_lookup("per_pwrdm"); |
@@ -355,16 +340,5 @@ int __init omap3_idle_init(void) | |||
355 | if (!mpu_pd || !core_pd || !per_pd || !cam_pd) | 340 | if (!mpu_pd || !core_pd || !per_pd || !cam_pd) |
356 | return -ENODEV; | 341 | return -ENODEV; |
357 | 342 | ||
358 | cpuidle_register_driver(&omap3_idle_driver); | 343 | return cpuidle_register(&omap3_idle_driver, NULL); |
359 | |||
360 | dev = &per_cpu(omap3_idle_dev, smp_processor_id()); | ||
361 | dev->cpu = 0; | ||
362 | |||
363 | if (cpuidle_register_device(dev)) { | ||
364 | printk(KERN_ERR "%s: CPUidle register device failed\n", | ||
365 | __func__); | ||
366 | return -EIO; | ||
367 | } | ||
368 | |||
369 | return 0; | ||
370 | } | 344 | } |
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index 9de47a70628f..c443f2e97e10 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * OMAP4 CPU idle Routines | 2 | * OMAP4+ CPU idle Routines |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Texas Instruments, Inc. | 4 | * Copyright (C) 2011-2013 Texas Instruments, Inc. |
5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | 5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
6 | * Rajendra Nayak <rnayak@ti.com> | 6 | * Rajendra Nayak <rnayak@ti.com> |
7 | * | 7 | * |
@@ -14,8 +14,8 @@ | |||
14 | #include <linux/cpuidle.h> | 14 | #include <linux/cpuidle.h> |
15 | #include <linux/cpu_pm.h> | 15 | #include <linux/cpu_pm.h> |
16 | #include <linux/export.h> | 16 | #include <linux/export.h> |
17 | #include <linux/clockchips.h> | ||
18 | 17 | ||
18 | #include <asm/cpuidle.h> | ||
19 | #include <asm/proc-fns.h> | 19 | #include <asm/proc-fns.h> |
20 | 20 | ||
21 | #include "common.h" | 21 | #include "common.h" |
@@ -24,13 +24,13 @@ | |||
24 | #include "clockdomain.h" | 24 | #include "clockdomain.h" |
25 | 25 | ||
26 | /* Machine specific information */ | 26 | /* Machine specific information */ |
27 | struct omap4_idle_statedata { | 27 | struct idle_statedata { |
28 | u32 cpu_state; | 28 | u32 cpu_state; |
29 | u32 mpu_logic_state; | 29 | u32 mpu_logic_state; |
30 | u32 mpu_state; | 30 | u32 mpu_state; |
31 | }; | 31 | }; |
32 | 32 | ||
33 | static struct omap4_idle_statedata omap4_idle_data[] = { | 33 | static struct idle_statedata omap4_idle_data[] = { |
34 | { | 34 | { |
35 | .cpu_state = PWRDM_POWER_ON, | 35 | .cpu_state = PWRDM_POWER_ON, |
36 | .mpu_state = PWRDM_POWER_ON, | 36 | .mpu_state = PWRDM_POWER_ON, |
@@ -53,11 +53,12 @@ static struct clockdomain *cpu_clkdm[NR_CPUS]; | |||
53 | 53 | ||
54 | static atomic_t abort_barrier; | 54 | static atomic_t abort_barrier; |
55 | static bool cpu_done[NR_CPUS]; | 55 | static bool cpu_done[NR_CPUS]; |
56 | static struct idle_statedata *state_ptr = &omap4_idle_data[0]; | ||
56 | 57 | ||
57 | /* Private functions */ | 58 | /* Private functions */ |
58 | 59 | ||
59 | /** | 60 | /** |
60 | * omap4_enter_idle_coupled_[simple/coupled] - OMAP4 cpuidle entry functions | 61 | * omap_enter_idle_[simple/coupled] - OMAP4PLUS cpuidle entry functions |
61 | * @dev: cpuidle device | 62 | * @dev: cpuidle device |
62 | * @drv: cpuidle driver | 63 | * @drv: cpuidle driver |
63 | * @index: the index of state to be entered | 64 | * @index: the index of state to be entered |
@@ -66,7 +67,7 @@ static bool cpu_done[NR_CPUS]; | |||
66 | * specified low power state selected by the governor. | 67 | * specified low power state selected by the governor. |
67 | * Returns the amount of time spent in the low power state. | 68 | * Returns the amount of time spent in the low power state. |
68 | */ | 69 | */ |
69 | static int omap4_enter_idle_simple(struct cpuidle_device *dev, | 70 | static int omap_enter_idle_simple(struct cpuidle_device *dev, |
70 | struct cpuidle_driver *drv, | 71 | struct cpuidle_driver *drv, |
71 | int index) | 72 | int index) |
72 | { | 73 | { |
@@ -74,12 +75,11 @@ static int omap4_enter_idle_simple(struct cpuidle_device *dev, | |||
74 | return index; | 75 | return index; |
75 | } | 76 | } |
76 | 77 | ||
77 | static int omap4_enter_idle_coupled(struct cpuidle_device *dev, | 78 | static int omap_enter_idle_coupled(struct cpuidle_device *dev, |
78 | struct cpuidle_driver *drv, | 79 | struct cpuidle_driver *drv, |
79 | int index) | 80 | int index) |
80 | { | 81 | { |
81 | struct omap4_idle_statedata *cx = &omap4_idle_data[index]; | 82 | struct idle_statedata *cx = state_ptr + index; |
82 | int cpu_id = smp_processor_id(); | ||
83 | 83 | ||
84 | /* | 84 | /* |
85 | * CPU0 has to wait and stay ON until CPU1 is OFF state. | 85 | * CPU0 has to wait and stay ON until CPU1 is OFF state. |
@@ -104,8 +104,6 @@ static int omap4_enter_idle_coupled(struct cpuidle_device *dev, | |||
104 | } | 104 | } |
105 | } | 105 | } |
106 | 106 | ||
107 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu_id); | ||
108 | |||
109 | /* | 107 | /* |
110 | * Call idle CPU PM enter notifier chain so that | 108 | * Call idle CPU PM enter notifier chain so that |
111 | * VFP and per CPU interrupt context is saved. | 109 | * VFP and per CPU interrupt context is saved. |
@@ -145,11 +143,10 @@ static int omap4_enter_idle_coupled(struct cpuidle_device *dev, | |||
145 | * Call idle CPU cluster PM exit notifier chain | 143 | * Call idle CPU cluster PM exit notifier chain |
146 | * to restore GIC and wakeupgen context. | 144 | * to restore GIC and wakeupgen context. |
147 | */ | 145 | */ |
148 | if (omap4_mpuss_read_prev_context_state()) | 146 | if ((cx->mpu_state == PWRDM_POWER_RET) && |
147 | (cx->mpu_logic_state == PWRDM_POWER_OFF)) | ||
149 | cpu_cluster_pm_exit(); | 148 | cpu_cluster_pm_exit(); |
150 | 149 | ||
151 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu_id); | ||
152 | |||
153 | fail: | 150 | fail: |
154 | cpuidle_coupled_parallel_barrier(dev, &abort_barrier); | 151 | cpuidle_coupled_parallel_barrier(dev, &abort_barrier); |
155 | cpu_done[dev->cpu] = false; | 152 | cpu_done[dev->cpu] = false; |
@@ -157,49 +154,38 @@ fail: | |||
157 | return index; | 154 | return index; |
158 | } | 155 | } |
159 | 156 | ||
160 | /* | ||
161 | * For each cpu, setup the broadcast timer because local timers | ||
162 | * stops for the states above C1. | ||
163 | */ | ||
164 | static void omap_setup_broadcast_timer(void *arg) | ||
165 | { | ||
166 | int cpu = smp_processor_id(); | ||
167 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); | ||
168 | } | ||
169 | |||
170 | static DEFINE_PER_CPU(struct cpuidle_device, omap4_idle_dev); | ||
171 | |||
172 | static struct cpuidle_driver omap4_idle_driver = { | 157 | static struct cpuidle_driver omap4_idle_driver = { |
173 | .name = "omap4_idle", | 158 | .name = "omap4_idle", |
174 | .owner = THIS_MODULE, | 159 | .owner = THIS_MODULE, |
175 | .en_core_tk_irqen = 1, | ||
176 | .states = { | 160 | .states = { |
177 | { | 161 | { |
178 | /* C1 - CPU0 ON + CPU1 ON + MPU ON */ | 162 | /* C1 - CPU0 ON + CPU1 ON + MPU ON */ |
179 | .exit_latency = 2 + 2, | 163 | .exit_latency = 2 + 2, |
180 | .target_residency = 5, | 164 | .target_residency = 5, |
181 | .flags = CPUIDLE_FLAG_TIME_VALID, | 165 | .flags = CPUIDLE_FLAG_TIME_VALID, |
182 | .enter = omap4_enter_idle_simple, | 166 | .enter = omap_enter_idle_simple, |
183 | .name = "C1", | 167 | .name = "C1", |
184 | .desc = "MPUSS ON" | 168 | .desc = "CPUx ON, MPUSS ON" |
185 | }, | 169 | }, |
186 | { | 170 | { |
187 | /* C2 - CPU0 OFF + CPU1 OFF + MPU CSWR */ | 171 | /* C2 - CPU0 OFF + CPU1 OFF + MPU CSWR */ |
188 | .exit_latency = 328 + 440, | 172 | .exit_latency = 328 + 440, |
189 | .target_residency = 960, | 173 | .target_residency = 960, |
190 | .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED, | 174 | .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED | |
191 | .enter = omap4_enter_idle_coupled, | 175 | CPUIDLE_FLAG_TIMER_STOP, |
176 | .enter = omap_enter_idle_coupled, | ||
192 | .name = "C2", | 177 | .name = "C2", |
193 | .desc = "MPUSS CSWR", | 178 | .desc = "CPUx OFF, MPUSS CSWR", |
194 | }, | 179 | }, |
195 | { | 180 | { |
196 | /* C3 - CPU0 OFF + CPU1 OFF + MPU OSWR */ | 181 | /* C3 - CPU0 OFF + CPU1 OFF + MPU OSWR */ |
197 | .exit_latency = 460 + 518, | 182 | .exit_latency = 460 + 518, |
198 | .target_residency = 1100, | 183 | .target_residency = 1100, |
199 | .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED, | 184 | .flags = CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_COUPLED | |
200 | .enter = omap4_enter_idle_coupled, | 185 | CPUIDLE_FLAG_TIMER_STOP, |
186 | .enter = omap_enter_idle_coupled, | ||
201 | .name = "C3", | 187 | .name = "C3", |
202 | .desc = "MPUSS OSWR", | 188 | .desc = "CPUx OFF, MPUSS OSWR", |
203 | }, | 189 | }, |
204 | }, | 190 | }, |
205 | .state_count = ARRAY_SIZE(omap4_idle_data), | 191 | .state_count = ARRAY_SIZE(omap4_idle_data), |
@@ -209,16 +195,13 @@ static struct cpuidle_driver omap4_idle_driver = { | |||
209 | /* Public functions */ | 195 | /* Public functions */ |
210 | 196 | ||
211 | /** | 197 | /** |
212 | * omap4_idle_init - Init routine for OMAP4 idle | 198 | * omap4_idle_init - Init routine for OMAP4+ idle |
213 | * | 199 | * |
214 | * Registers the OMAP4 specific cpuidle driver to the cpuidle | 200 | * Registers the OMAP4+ specific cpuidle driver to the cpuidle |
215 | * framework with the valid set of states. | 201 | * framework with the valid set of states. |
216 | */ | 202 | */ |
217 | int __init omap4_idle_init(void) | 203 | int __init omap4_idle_init(void) |
218 | { | 204 | { |
219 | struct cpuidle_device *dev; | ||
220 | unsigned int cpu_id = 0; | ||
221 | |||
222 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); | 205 | mpu_pd = pwrdm_lookup("mpu_pwrdm"); |
223 | cpu_pd[0] = pwrdm_lookup("cpu0_pwrdm"); | 206 | cpu_pd[0] = pwrdm_lookup("cpu0_pwrdm"); |
224 | cpu_pd[1] = pwrdm_lookup("cpu1_pwrdm"); | 207 | cpu_pd[1] = pwrdm_lookup("cpu1_pwrdm"); |
@@ -230,22 +213,5 @@ int __init omap4_idle_init(void) | |||
230 | if (!cpu_clkdm[0] || !cpu_clkdm[1]) | 213 | if (!cpu_clkdm[0] || !cpu_clkdm[1]) |
231 | return -ENODEV; | 214 | return -ENODEV; |
232 | 215 | ||
233 | /* Configure the broadcast timer on each cpu */ | 216 | return cpuidle_register(&omap4_idle_driver, cpu_online_mask); |
234 | on_each_cpu(omap_setup_broadcast_timer, NULL, 1); | ||
235 | |||
236 | for_each_cpu(cpu_id, cpu_online_mask) { | ||
237 | dev = &per_cpu(omap4_idle_dev, cpu_id); | ||
238 | dev->cpu = cpu_id; | ||
239 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | ||
240 | dev->coupled_cpus = *cpu_online_mask; | ||
241 | #endif | ||
242 | cpuidle_register_driver(&omap4_idle_driver); | ||
243 | |||
244 | if (cpuidle_register_device(dev)) { | ||
245 | pr_err("%s: CPUidle register failed\n", __func__); | ||
246 | return -EIO; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | return 0; | ||
251 | } | 217 | } |
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index 3aed4b0b9563..3a0296cfcace 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
@@ -307,10 +307,10 @@ static int omap3_noncore_dpll_program(struct clk_hw_omap *clk, u16 freqsel) | |||
307 | _omap3_noncore_dpll_bypass(clk); | 307 | _omap3_noncore_dpll_bypass(clk); |
308 | 308 | ||
309 | /* | 309 | /* |
310 | * Set jitter correction. No jitter correction for OMAP4 and 3630 | 310 | * Set jitter correction. Jitter correction applicable for OMAP343X |
311 | * since freqsel field is no longer present | 311 | * only since freqsel field is no longer present on other devices. |
312 | */ | 312 | */ |
313 | if (!soc_is_am33xx() && !cpu_is_omap44xx() && !cpu_is_omap3630()) { | 313 | if (cpu_is_omap343x()) { |
314 | v = __raw_readl(dd->control_reg); | 314 | v = __raw_readl(dd->control_reg); |
315 | v &= ~dd->freqsel_mask; | 315 | v &= ~dd->freqsel_mask; |
316 | v |= freqsel << __ffs(dd->freqsel_mask); | 316 | v |= freqsel << __ffs(dd->freqsel_mask); |
@@ -480,29 +480,30 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
480 | if (!dd) | 480 | if (!dd) |
481 | return -EINVAL; | 481 | return -EINVAL; |
482 | 482 | ||
483 | __clk_prepare(dd->clk_bypass); | ||
484 | clk_enable(dd->clk_bypass); | ||
485 | __clk_prepare(dd->clk_ref); | ||
486 | clk_enable(dd->clk_ref); | ||
487 | |||
488 | if (__clk_get_rate(dd->clk_bypass) == rate && | 483 | if (__clk_get_rate(dd->clk_bypass) == rate && |
489 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { | 484 | (dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) { |
490 | pr_debug("%s: %s: set rate: entering bypass.\n", | 485 | pr_debug("%s: %s: set rate: entering bypass.\n", |
491 | __func__, __clk_get_name(hw->clk)); | 486 | __func__, __clk_get_name(hw->clk)); |
492 | 487 | ||
488 | __clk_prepare(dd->clk_bypass); | ||
489 | clk_enable(dd->clk_bypass); | ||
493 | ret = _omap3_noncore_dpll_bypass(clk); | 490 | ret = _omap3_noncore_dpll_bypass(clk); |
494 | if (!ret) | 491 | if (!ret) |
495 | new_parent = dd->clk_bypass; | 492 | new_parent = dd->clk_bypass; |
493 | clk_disable(dd->clk_bypass); | ||
494 | __clk_unprepare(dd->clk_bypass); | ||
496 | } else { | 495 | } else { |
496 | __clk_prepare(dd->clk_ref); | ||
497 | clk_enable(dd->clk_ref); | ||
498 | |||
497 | if (dd->last_rounded_rate != rate) | 499 | if (dd->last_rounded_rate != rate) |
498 | rate = __clk_round_rate(hw->clk, rate); | 500 | rate = __clk_round_rate(hw->clk, rate); |
499 | 501 | ||
500 | if (dd->last_rounded_rate == 0) | 502 | if (dd->last_rounded_rate == 0) |
501 | return -EINVAL; | 503 | return -EINVAL; |
502 | 504 | ||
503 | /* No freqsel on AM335x, OMAP4 and OMAP3630 */ | 505 | /* Freqsel is available only on OMAP343X devices */ |
504 | if (!soc_is_am33xx() && !cpu_is_omap44xx() && | 506 | if (cpu_is_omap343x()) { |
505 | !cpu_is_omap3630()) { | ||
506 | freqsel = _omap3_dpll_compute_freqsel(clk, | 507 | freqsel = _omap3_dpll_compute_freqsel(clk, |
507 | dd->last_rounded_n); | 508 | dd->last_rounded_n); |
508 | WARN_ON(!freqsel); | 509 | WARN_ON(!freqsel); |
@@ -514,6 +515,8 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
514 | ret = omap3_noncore_dpll_program(clk, freqsel); | 515 | ret = omap3_noncore_dpll_program(clk, freqsel); |
515 | if (!ret) | 516 | if (!ret) |
516 | new_parent = dd->clk_ref; | 517 | new_parent = dd->clk_ref; |
518 | clk_disable(dd->clk_ref); | ||
519 | __clk_unprepare(dd->clk_ref); | ||
517 | } | 520 | } |
518 | /* | 521 | /* |
519 | * FIXME - this is all wrong. common code handles reparenting and | 522 | * FIXME - this is all wrong. common code handles reparenting and |
@@ -525,11 +528,6 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
525 | if (!ret) | 528 | if (!ret) |
526 | __clk_reparent(hw->clk, new_parent); | 529 | __clk_reparent(hw->clk, new_parent); |
527 | 530 | ||
528 | clk_disable(dd->clk_ref); | ||
529 | __clk_unprepare(dd->clk_ref); | ||
530 | clk_disable(dd->clk_bypass); | ||
531 | __clk_unprepare(dd->clk_bypass); | ||
532 | |||
533 | return 0; | 531 | return 0; |
534 | } | 532 | } |
535 | 533 | ||
diff --git a/arch/arm/mach-omap2/dsp.c b/arch/arm/mach-omap2/dsp.c index b155500e84a8..b8208b4b1bd9 100644 --- a/arch/arm/mach-omap2/dsp.c +++ b/arch/arm/mach-omap2/dsp.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include "control.h" | 26 | #include "control.h" |
27 | #include "cm2xxx_3xxx.h" | 27 | #include "cm2xxx_3xxx.h" |
28 | #include "prm2xxx_3xxx.h" | 28 | #include "prm2xxx_3xxx.h" |
29 | #ifdef CONFIG_BRIDGE_DVFS | 29 | #ifdef CONFIG_TIDSPBRIDGE_DVFS |
30 | #include "omap-pm.h" | 30 | #include "omap-pm.h" |
31 | #endif | 31 | #endif |
32 | 32 | ||
@@ -35,7 +35,7 @@ | |||
35 | static struct platform_device *omap_dsp_pdev; | 35 | static struct platform_device *omap_dsp_pdev; |
36 | 36 | ||
37 | static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { | 37 | static struct omap_dsp_platform_data omap_dsp_pdata __initdata = { |
38 | #ifdef CONFIG_BRIDGE_DVFS | 38 | #ifdef CONFIG_TIDSPBRIDGE_DVFS |
39 | .dsp_set_min_opp = omap_pm_dsp_set_min_opp, | 39 | .dsp_set_min_opp = omap_pm_dsp_set_min_opp, |
40 | .dsp_get_opp = omap_pm_dsp_get_opp, | 40 | .dsp_get_opp = omap_pm_dsp_get_opp, |
41 | .cpu_set_freq = omap_pm_cpu_set_freq, | 41 | .cpu_set_freq = omap_pm_cpu_set_freq, |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 8a68f1ec66b9..ff0bc9e51aa7 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -529,22 +529,28 @@ void __init omap5xxx_check_revision(void) | |||
529 | case 0xb942: | 529 | case 0xb942: |
530 | switch (rev) { | 530 | switch (rev) { |
531 | case 0: | 531 | case 0: |
532 | default: | ||
533 | omap_revision = OMAP5430_REV_ES1_0; | 532 | omap_revision = OMAP5430_REV_ES1_0; |
533 | break; | ||
534 | case 1: | ||
535 | default: | ||
536 | omap_revision = OMAP5430_REV_ES2_0; | ||
534 | } | 537 | } |
535 | break; | 538 | break; |
536 | 539 | ||
537 | case 0xb998: | 540 | case 0xb998: |
538 | switch (rev) { | 541 | switch (rev) { |
539 | case 0: | 542 | case 0: |
540 | default: | ||
541 | omap_revision = OMAP5432_REV_ES1_0; | 543 | omap_revision = OMAP5432_REV_ES1_0; |
544 | break; | ||
545 | case 1: | ||
546 | default: | ||
547 | omap_revision = OMAP5432_REV_ES2_0; | ||
542 | } | 548 | } |
543 | break; | 549 | break; |
544 | 550 | ||
545 | default: | 551 | default: |
546 | /* Unknown default to latest silicon rev as default*/ | 552 | /* Unknown default to latest silicon rev as default*/ |
547 | omap_revision = OMAP5430_REV_ES1_0; | 553 | omap_revision = OMAP5430_REV_ES2_0; |
548 | } | 554 | } |
549 | 555 | ||
550 | pr_info("OMAP%04x ES%d.0\n", | 556 | pr_info("OMAP%04x ES%d.0\n", |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 5c445ca1e271..e210fa830f8d 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -277,6 +277,14 @@ static struct map_desc omap54xx_io_desc[] __initdata = { | |||
277 | .length = L4_PER_54XX_SIZE, | 277 | .length = L4_PER_54XX_SIZE, |
278 | .type = MT_DEVICE, | 278 | .type = MT_DEVICE, |
279 | }, | 279 | }, |
280 | #ifdef CONFIG_OMAP4_ERRATA_I688 | ||
281 | { | ||
282 | .virtual = OMAP4_SRAM_VA, | ||
283 | .pfn = __phys_to_pfn(OMAP4_SRAM_PA), | ||
284 | .length = PAGE_SIZE, | ||
285 | .type = MT_MEMORY_SO, | ||
286 | }, | ||
287 | #endif | ||
280 | }; | 288 | }; |
281 | #endif | 289 | #endif |
282 | 290 | ||
@@ -329,6 +337,7 @@ void __init omap4_map_io(void) | |||
329 | void __init omap5_map_io(void) | 337 | void __init omap5_map_io(void) |
330 | { | 338 | { |
331 | iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); | 339 | iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); |
340 | omap_barriers_init(); | ||
332 | } | 341 | } |
333 | #endif | 342 | #endif |
334 | /* | 343 | /* |
diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c index 8bcb64bcdcdb..e80327b6c81f 100644 --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c | |||
@@ -139,20 +139,6 @@ static inline void cpu_clear_prev_logic_pwrst(unsigned int cpu_id) | |||
139 | } | 139 | } |
140 | } | 140 | } |
141 | 141 | ||
142 | /** | ||
143 | * omap4_mpuss_read_prev_context_state: | ||
144 | * Function returns the MPUSS previous context state | ||
145 | */ | ||
146 | u32 omap4_mpuss_read_prev_context_state(void) | ||
147 | { | ||
148 | u32 reg; | ||
149 | |||
150 | reg = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, | ||
151 | OMAP4430_PRM_MPU_INST, OMAP4_RM_MPU_MPU_CONTEXT_OFFSET); | ||
152 | reg &= OMAP4430_LOSTCONTEXT_DFF_MASK; | ||
153 | return reg; | ||
154 | } | ||
155 | |||
156 | /* | 142 | /* |
157 | * Store the CPU cluster state for L2X0 low power operations. | 143 | * Store the CPU cluster state for L2X0 low power operations. |
158 | */ | 144 | */ |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 20bf3c754bfd..13b27ffaf45e 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -241,15 +241,21 @@ void __iomem *omap4_get_sar_ram_base(void) | |||
241 | */ | 241 | */ |
242 | static int __init omap4_sar_ram_init(void) | 242 | static int __init omap4_sar_ram_init(void) |
243 | { | 243 | { |
244 | unsigned long sar_base; | ||
245 | |||
244 | /* | 246 | /* |
245 | * To avoid code running on other OMAPs in | 247 | * To avoid code running on other OMAPs in |
246 | * multi-omap builds | 248 | * multi-omap builds |
247 | */ | 249 | */ |
248 | if (!cpu_is_omap44xx()) | 250 | if (cpu_is_omap44xx()) |
251 | sar_base = OMAP44XX_SAR_RAM_BASE; | ||
252 | else if (soc_is_omap54xx()) | ||
253 | sar_base = OMAP54XX_SAR_RAM_BASE; | ||
254 | else | ||
249 | return -ENOMEM; | 255 | return -ENOMEM; |
250 | 256 | ||
251 | /* Static mapping, never released */ | 257 | /* Static mapping, never released */ |
252 | sar_ram_base = ioremap(OMAP44XX_SAR_RAM_BASE, SZ_16K); | 258 | sar_ram_base = ioremap(sar_base, SZ_16K); |
253 | if (WARN_ON(!sar_ram_base)) | 259 | if (WARN_ON(!sar_ram_base)) |
254 | return -ENOMEM; | 260 | return -ENOMEM; |
255 | 261 | ||
diff --git a/arch/arm/mach-omap2/omap4-sar-layout.h b/arch/arm/mach-omap2/omap4-sar-layout.h index 6822d0a7324f..792b1069f724 100644 --- a/arch/arm/mach-omap2/omap4-sar-layout.h +++ b/arch/arm/mach-omap2/omap4-sar-layout.h | |||
@@ -48,13 +48,13 @@ | |||
48 | #define SAR_BACKUP_STATUS_WAKEUPGEN 0x10 | 48 | #define SAR_BACKUP_STATUS_WAKEUPGEN 0x10 |
49 | 49 | ||
50 | /* WakeUpGen save restore offset from OMAP54XX_SAR_RAM_BASE */ | 50 | /* WakeUpGen save restore offset from OMAP54XX_SAR_RAM_BASE */ |
51 | #define OMAP5_WAKEUPGENENB_OFFSET_CPU0 (SAR_BANK3_OFFSET + 0x8d4) | 51 | #define OMAP5_WAKEUPGENENB_OFFSET_CPU0 (SAR_BANK3_OFFSET + 0x9dc) |
52 | #define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU0 (SAR_BANK3_OFFSET + 0x8e8) | 52 | #define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU0 (SAR_BANK3_OFFSET + 0x9f0) |
53 | #define OMAP5_WAKEUPGENENB_OFFSET_CPU1 (SAR_BANK3_OFFSET + 0x8fc) | 53 | #define OMAP5_WAKEUPGENENB_OFFSET_CPU1 (SAR_BANK3_OFFSET + 0xa04) |
54 | #define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU1 (SAR_BANK3_OFFSET + 0x910) | 54 | #define OMAP5_WAKEUPGENENB_SECURE_OFFSET_CPU1 (SAR_BANK3_OFFSET + 0xa18) |
55 | #define OMAP5_AUXCOREBOOT0_OFFSET (SAR_BANK3_OFFSET + 0x924) | 55 | #define OMAP5_AUXCOREBOOT0_OFFSET (SAR_BANK3_OFFSET + 0xa2c) |
56 | #define OMAP5_AUXCOREBOOT1_OFFSET (SAR_BANK3_OFFSET + 0x928) | 56 | #define OMAP5_AUXCOREBOOT1_OFFSET (SAR_BANK3_OFFSET + 0x930) |
57 | #define OMAP5_AMBA_IF_MODE_OFFSET (SAR_BANK3_OFFSET + 0x92c) | 57 | #define OMAP5_AMBA_IF_MODE_OFFSET (SAR_BANK3_OFFSET + 0xa34) |
58 | #define OMAP5_SAR_BACKUP_STATUS_OFFSET (SAR_BANK3_OFFSET + 0x800) | 58 | #define OMAP5_SAR_BACKUP_STATUS_OFFSET (SAR_BANK3_OFFSET + 0x800) |
59 | 59 | ||
60 | #endif | 60 | #endif |
diff --git a/arch/arm/mach-omap2/omap54xx.h b/arch/arm/mach-omap2/omap54xx.h index a2582bb3cab3..a086ba15868b 100644 --- a/arch/arm/mach-omap2/omap54xx.h +++ b/arch/arm/mach-omap2/omap54xx.h | |||
@@ -28,5 +28,6 @@ | |||
28 | #define OMAP54XX_PRCM_MPU_BASE 0x48243000 | 28 | #define OMAP54XX_PRCM_MPU_BASE 0x48243000 |
29 | #define OMAP54XX_SCM_BASE 0x4a002000 | 29 | #define OMAP54XX_SCM_BASE 0x4a002000 |
30 | #define OMAP54XX_CTRL_BASE 0x4a002800 | 30 | #define OMAP54XX_CTRL_BASE 0x4a002800 |
31 | #define OMAP54XX_SAR_RAM_BASE 0x4ae26000 | ||
31 | 32 | ||
32 | #endif /* __ASM_SOC_OMAP555554XX_H */ | 33 | #endif /* __ASM_SOC_OMAP555554XX_H */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index a202a4785104..9553c9907d40 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -138,6 +138,7 @@ | |||
138 | #include <linux/spinlock.h> | 138 | #include <linux/spinlock.h> |
139 | #include <linux/slab.h> | 139 | #include <linux/slab.h> |
140 | #include <linux/bootmem.h> | 140 | #include <linux/bootmem.h> |
141 | #include <linux/cpu.h> | ||
141 | 142 | ||
142 | #include <asm/system_misc.h> | 143 | #include <asm/system_misc.h> |
143 | 144 | ||
@@ -610,8 +611,6 @@ static int _enable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
610 | 611 | ||
611 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ | 612 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ |
612 | 613 | ||
613 | oh->_int_flags |= _HWMOD_WAKEUP_ENABLED; | ||
614 | |||
615 | return 0; | 614 | return 0; |
616 | } | 615 | } |
617 | 616 | ||
@@ -645,8 +644,6 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v) | |||
645 | 644 | ||
646 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ | 645 | /* XXX test pwrdm_get_wken for this hwmod's subsystem */ |
647 | 646 | ||
648 | oh->_int_flags &= ~_HWMOD_WAKEUP_ENABLED; | ||
649 | |||
650 | return 0; | 647 | return 0; |
651 | } | 648 | } |
652 | 649 | ||
@@ -2157,7 +2154,7 @@ static int _enable(struct omap_hwmod *oh) | |||
2157 | if (soc_ops.enable_module) | 2154 | if (soc_ops.enable_module) |
2158 | soc_ops.enable_module(oh); | 2155 | soc_ops.enable_module(oh); |
2159 | if (oh->flags & HWMOD_BLOCK_WFI) | 2156 | if (oh->flags & HWMOD_BLOCK_WFI) |
2160 | disable_hlt(); | 2157 | cpu_idle_poll_ctrl(true); |
2161 | 2158 | ||
2162 | if (soc_ops.update_context_lost) | 2159 | if (soc_ops.update_context_lost) |
2163 | soc_ops.update_context_lost(oh); | 2160 | soc_ops.update_context_lost(oh); |
@@ -2221,7 +2218,7 @@ static int _idle(struct omap_hwmod *oh) | |||
2221 | _del_initiator_dep(oh, mpu_oh); | 2218 | _del_initiator_dep(oh, mpu_oh); |
2222 | 2219 | ||
2223 | if (oh->flags & HWMOD_BLOCK_WFI) | 2220 | if (oh->flags & HWMOD_BLOCK_WFI) |
2224 | enable_hlt(); | 2221 | cpu_idle_poll_ctrl(false); |
2225 | if (soc_ops.disable_module) | 2222 | if (soc_ops.disable_module) |
2226 | soc_ops.disable_module(oh); | 2223 | soc_ops.disable_module(oh); |
2227 | 2224 | ||
@@ -2331,7 +2328,7 @@ static int _shutdown(struct omap_hwmod *oh) | |||
2331 | _del_initiator_dep(oh, mpu_oh); | 2328 | _del_initiator_dep(oh, mpu_oh); |
2332 | /* XXX what about the other system initiators here? dma, dsp */ | 2329 | /* XXX what about the other system initiators here? dma, dsp */ |
2333 | if (oh->flags & HWMOD_BLOCK_WFI) | 2330 | if (oh->flags & HWMOD_BLOCK_WFI) |
2334 | enable_hlt(); | 2331 | cpu_idle_poll_ctrl(false); |
2335 | if (soc_ops.disable_module) | 2332 | if (soc_ops.disable_module) |
2336 | soc_ops.disable_module(oh); | 2333 | soc_ops.disable_module(oh); |
2337 | _disable_clocks(oh); | 2334 | _disable_clocks(oh); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index d5dc935f6060..fe5962921f07 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -482,15 +482,13 @@ struct omap_hwmod_omap4_prcm { | |||
482 | * These are for internal use only and are managed by the omap_hwmod code. | 482 | * These are for internal use only and are managed by the omap_hwmod code. |
483 | * | 483 | * |
484 | * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module | 484 | * _HWMOD_NO_MPU_PORT: no path exists for the MPU to write to this module |
485 | * _HWMOD_WAKEUP_ENABLED: set when the omap_hwmod code has enabled ENAWAKEUP | ||
486 | * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached | 485 | * _HWMOD_SYSCONFIG_LOADED: set when the OCP_SYSCONFIG value has been cached |
487 | * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) - | 486 | * _HWMOD_SKIP_ENABLE: set if hwmod enabled during init (HWMOD_INIT_NO_IDLE) - |
488 | * causes the first call to _enable() to only update the pinmux | 487 | * causes the first call to _enable() to only update the pinmux |
489 | */ | 488 | */ |
490 | #define _HWMOD_NO_MPU_PORT (1 << 0) | 489 | #define _HWMOD_NO_MPU_PORT (1 << 0) |
491 | #define _HWMOD_WAKEUP_ENABLED (1 << 1) | 490 | #define _HWMOD_SYSCONFIG_LOADED (1 << 1) |
492 | #define _HWMOD_SYSCONFIG_LOADED (1 << 2) | 491 | #define _HWMOD_SKIP_ENABLE (1 << 2) |
493 | #define _HWMOD_SKIP_ENABLE (1 << 3) | ||
494 | 492 | ||
495 | /* | 493 | /* |
496 | * omap_hwmod._state definitions | 494 | * omap_hwmod._state definitions |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 26eee4a556ad..31bea1ce3de1 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "prm-regbits-33xx.h" | 28 | #include "prm-regbits-33xx.h" |
29 | #include "i2c.h" | 29 | #include "i2c.h" |
30 | #include "mmc.h" | 30 | #include "mmc.h" |
31 | #include "wd_timer.h" | ||
31 | 32 | ||
32 | /* | 33 | /* |
33 | * IP blocks | 34 | * IP blocks |
@@ -2087,8 +2088,21 @@ static struct omap_hwmod am33xx_uart6_hwmod = { | |||
2087 | }; | 2088 | }; |
2088 | 2089 | ||
2089 | /* 'wd_timer' class */ | 2090 | /* 'wd_timer' class */ |
2091 | static struct omap_hwmod_class_sysconfig wdt_sysc = { | ||
2092 | .rev_offs = 0x0, | ||
2093 | .sysc_offs = 0x10, | ||
2094 | .syss_offs = 0x14, | ||
2095 | .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE | | ||
2096 | SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS), | ||
2097 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | | ||
2098 | SIDLE_SMART_WKUP), | ||
2099 | .sysc_fields = &omap_hwmod_sysc_type1, | ||
2100 | }; | ||
2101 | |||
2090 | static struct omap_hwmod_class am33xx_wd_timer_hwmod_class = { | 2102 | static struct omap_hwmod_class am33xx_wd_timer_hwmod_class = { |
2091 | .name = "wd_timer", | 2103 | .name = "wd_timer", |
2104 | .sysc = &wdt_sysc, | ||
2105 | .pre_shutdown = &omap2_wd_timer_disable, | ||
2092 | }; | 2106 | }; |
2093 | 2107 | ||
2094 | /* | 2108 | /* |
@@ -2099,6 +2113,7 @@ static struct omap_hwmod am33xx_wd_timer1_hwmod = { | |||
2099 | .name = "wd_timer2", | 2113 | .name = "wd_timer2", |
2100 | .class = &am33xx_wd_timer_hwmod_class, | 2114 | .class = &am33xx_wd_timer_hwmod_class, |
2101 | .clkdm_name = "l4_wkup_clkdm", | 2115 | .clkdm_name = "l4_wkup_clkdm", |
2116 | .flags = HWMOD_SWSUP_SIDLE, | ||
2102 | .main_clk = "wdt1_fck", | 2117 | .main_clk = "wdt1_fck", |
2103 | .prcm = { | 2118 | .prcm = { |
2104 | .omap4 = { | 2119 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 673a4c1d1d76..e742118fcfd2 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
@@ -218,7 +218,7 @@ static int omap_pm_enter(suspend_state_t suspend_state) | |||
218 | 218 | ||
219 | static int omap_pm_begin(suspend_state_t state) | 219 | static int omap_pm_begin(suspend_state_t state) |
220 | { | 220 | { |
221 | disable_hlt(); | 221 | cpu_idle_poll_ctrl(true); |
222 | if (cpu_is_omap34xx()) | 222 | if (cpu_is_omap34xx()) |
223 | omap_prcm_irq_prepare(); | 223 | omap_prcm_irq_prepare(); |
224 | return 0; | 224 | return 0; |
@@ -226,8 +226,7 @@ static int omap_pm_begin(suspend_state_t state) | |||
226 | 226 | ||
227 | static void omap_pm_end(void) | 227 | static void omap_pm_end(void) |
228 | { | 228 | { |
229 | enable_hlt(); | 229 | cpu_idle_poll_ctrl(false); |
230 | return; | ||
231 | } | 230 | } |
232 | 231 | ||
233 | static void omap_pm_finish(void) | 232 | static void omap_pm_finish(void) |
@@ -265,6 +264,12 @@ static void __init omap4_init_voltages(void) | |||
265 | omap2_set_init_voltage("iva", "dpll_iva_m5x2_ck", "iva"); | 264 | omap2_set_init_voltage("iva", "dpll_iva_m5x2_ck", "iva"); |
266 | } | 265 | } |
267 | 266 | ||
267 | static inline void omap_init_cpufreq(void) | ||
268 | { | ||
269 | struct platform_device_info devinfo = { .name = "omap-cpufreq", }; | ||
270 | platform_device_register_full(&devinfo); | ||
271 | } | ||
272 | |||
268 | static int __init omap2_common_pm_init(void) | 273 | static int __init omap2_common_pm_init(void) |
269 | { | 274 | { |
270 | if (!of_have_populated_dt()) | 275 | if (!of_have_populated_dt()) |
@@ -294,6 +299,9 @@ int __init omap2_common_pm_late_init(void) | |||
294 | 299 | ||
295 | /* Smartreflex device init */ | 300 | /* Smartreflex device init */ |
296 | omap_devinit_smartreflex(); | 301 | omap_devinit_smartreflex(); |
302 | |||
303 | /* cpufreq dummy device instantiation */ | ||
304 | omap_init_cpufreq(); | ||
297 | } | 305 | } |
298 | 306 | ||
299 | #ifdef CONFIG_SUSPEND | 307 | #ifdef CONFIG_SUSPEND |
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 5ba6d888d6ff..a251f87fa2a2 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -126,8 +126,8 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused) | |||
126 | * omap_default_idle - OMAP4 default ilde routine.' | 126 | * omap_default_idle - OMAP4 default ilde routine.' |
127 | * | 127 | * |
128 | * Implements OMAP4 memory, IO ordering requirements which can't be addressed | 128 | * Implements OMAP4 memory, IO ordering requirements which can't be addressed |
129 | * with default cpu_do_idle() hook. Used by all CPUs with !CONFIG_CPUIDLE and | 129 | * with default cpu_do_idle() hook. Used by all CPUs with !CONFIG_CPU_IDLE and |
130 | * by secondary CPU with CONFIG_CPUIDLE. | 130 | * by secondary CPU with CONFIG_CPU_IDLE. |
131 | */ | 131 | */ |
132 | static void omap_default_idle(void) | 132 | static void omap_default_idle(void) |
133 | { | 133 | { |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 8e61d80bf6b3..89cad4a605dd 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -52,7 +52,6 @@ enum { | |||
52 | #define ALREADYACTIVE_SWITCH 0 | 52 | #define ALREADYACTIVE_SWITCH 0 |
53 | #define FORCEWAKEUP_SWITCH 1 | 53 | #define FORCEWAKEUP_SWITCH 1 |
54 | #define LOWPOWERSTATE_SWITCH 2 | 54 | #define LOWPOWERSTATE_SWITCH 2 |
55 | #define ERROR_SWITCH 3 | ||
56 | 55 | ||
57 | /* pwrdm_list contains all registered struct powerdomains */ | 56 | /* pwrdm_list contains all registered struct powerdomains */ |
58 | static LIST_HEAD(pwrdm_list); | 57 | static LIST_HEAD(pwrdm_list); |
@@ -233,10 +232,7 @@ static u8 _pwrdm_save_clkdm_state_and_activate(struct powerdomain *pwrdm, | |||
233 | { | 232 | { |
234 | u8 sleep_switch; | 233 | u8 sleep_switch; |
235 | 234 | ||
236 | if (curr_pwrst < 0) { | 235 | if (curr_pwrst < PWRDM_POWER_ON) { |
237 | WARN_ON(1); | ||
238 | sleep_switch = ERROR_SWITCH; | ||
239 | } else if (curr_pwrst < PWRDM_POWER_ON) { | ||
240 | if (curr_pwrst > pwrst && | 236 | if (curr_pwrst > pwrst && |
241 | pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && | 237 | pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && |
242 | arch_pwrdm->pwrdm_set_lowpwrstchange) { | 238 | arch_pwrdm->pwrdm_set_lowpwrstchange) { |
@@ -1091,7 +1087,8 @@ int pwrdm_post_transition(struct powerdomain *pwrdm) | |||
1091 | */ | 1087 | */ |
1092 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) | 1088 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) |
1093 | { | 1089 | { |
1094 | u8 curr_pwrst, next_pwrst, sleep_switch; | 1090 | u8 next_pwrst, sleep_switch; |
1091 | int curr_pwrst; | ||
1095 | int ret = 0; | 1092 | int ret = 0; |
1096 | bool hwsup = false; | 1093 | bool hwsup = false; |
1097 | 1094 | ||
@@ -1107,16 +1104,17 @@ int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) | |||
1107 | pwrdm_lock(pwrdm); | 1104 | pwrdm_lock(pwrdm); |
1108 | 1105 | ||
1109 | curr_pwrst = pwrdm_read_pwrst(pwrdm); | 1106 | curr_pwrst = pwrdm_read_pwrst(pwrdm); |
1107 | if (curr_pwrst < 0) { | ||
1108 | ret = -EINVAL; | ||
1109 | goto osps_out; | ||
1110 | } | ||
1111 | |||
1110 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); | 1112 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); |
1111 | if (curr_pwrst == pwrst && next_pwrst == pwrst) | 1113 | if (curr_pwrst == pwrst && next_pwrst == pwrst) |
1112 | goto osps_out; | 1114 | goto osps_out; |
1113 | 1115 | ||
1114 | sleep_switch = _pwrdm_save_clkdm_state_and_activate(pwrdm, curr_pwrst, | 1116 | sleep_switch = _pwrdm_save_clkdm_state_and_activate(pwrdm, curr_pwrst, |
1115 | pwrst, &hwsup); | 1117 | pwrst, &hwsup); |
1116 | if (sleep_switch == ERROR_SWITCH) { | ||
1117 | ret = -EINVAL; | ||
1118 | goto osps_out; | ||
1119 | } | ||
1120 | 1118 | ||
1121 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); | 1119 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); |
1122 | if (ret) | 1120 | if (ret) |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index d35f98aabf7a..415c7e0c9393 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -81,13 +81,13 @@ static struct prm_reset_src_map omap44xx_prm_reset_src_map[] = { | |||
81 | /* Read a register in a CM/PRM instance in the PRM module */ | 81 | /* Read a register in a CM/PRM instance in the PRM module */ |
82 | u32 omap4_prm_read_inst_reg(s16 inst, u16 reg) | 82 | u32 omap4_prm_read_inst_reg(s16 inst, u16 reg) |
83 | { | 83 | { |
84 | return __raw_readl(OMAP44XX_PRM_REGADDR(inst, reg)); | 84 | return __raw_readl(prm_base + inst + reg); |
85 | } | 85 | } |
86 | 86 | ||
87 | /* Write into a register in a CM/PRM instance in the PRM module */ | 87 | /* Write into a register in a CM/PRM instance in the PRM module */ |
88 | void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg) | 88 | void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 reg) |
89 | { | 89 | { |
90 | __raw_writel(val, OMAP44XX_PRM_REGADDR(inst, reg)); | 90 | __raw_writel(val, prm_base + inst + reg); |
91 | } | 91 | } |
92 | 92 | ||
93 | /* Read-modify-write a register in a PRM module. Caller must lock */ | 93 | /* Read-modify-write a register in a PRM module. Caller must lock */ |
@@ -650,7 +650,7 @@ static struct prm_ll_data omap44xx_prm_ll_data = { | |||
650 | 650 | ||
651 | int __init omap44xx_prm_init(void) | 651 | int __init omap44xx_prm_init(void) |
652 | { | 652 | { |
653 | if (!cpu_is_omap44xx()) | 653 | if (!cpu_is_omap44xx() && !soc_is_omap54xx()) |
654 | return 0; | 654 | return 0; |
655 | 655 | ||
656 | return prm_register(&omap44xx_prm_ll_data); | 656 | return prm_register(&omap44xx_prm_ll_data); |
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h index c62116bbc760..18fdeeb3a44a 100644 --- a/arch/arm/mach-omap2/soc.h +++ b/arch/arm/mach-omap2/soc.h | |||
@@ -413,7 +413,9 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
413 | 413 | ||
414 | #define OMAP54XX_CLASS 0x54000054 | 414 | #define OMAP54XX_CLASS 0x54000054 |
415 | #define OMAP5430_REV_ES1_0 (OMAP54XX_CLASS | (0x30 << 16) | (0x10 << 8)) | 415 | #define OMAP5430_REV_ES1_0 (OMAP54XX_CLASS | (0x30 << 16) | (0x10 << 8)) |
416 | #define OMAP5430_REV_ES2_0 (OMAP54XX_CLASS | (0x30 << 16) | (0x20 << 8)) | ||
416 | #define OMAP5432_REV_ES1_0 (OMAP54XX_CLASS | (0x32 << 16) | (0x10 << 8)) | 417 | #define OMAP5432_REV_ES1_0 (OMAP54XX_CLASS | (0x32 << 16) | (0x10 << 8)) |
418 | #define OMAP5432_REV_ES2_0 (OMAP54XX_CLASS | (0x32 << 16) | (0x20 << 8)) | ||
417 | 419 | ||
418 | void omap2xxx_check_revision(void); | 420 | void omap2xxx_check_revision(void); |
419 | void omap3xxx_check_revision(void); | 421 | void omap3xxx_check_revision(void); |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index ee7a6bf67c9e..ea6ea9aab092 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -62,6 +62,7 @@ | |||
62 | #define OMAP2_MPU_SOURCE "sys_ck" | 62 | #define OMAP2_MPU_SOURCE "sys_ck" |
63 | #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE | 63 | #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE |
64 | #define OMAP4_MPU_SOURCE "sys_clkin_ck" | 64 | #define OMAP4_MPU_SOURCE "sys_clkin_ck" |
65 | #define OMAP5_MPU_SOURCE "sys_clkin" | ||
65 | #define OMAP2_32K_SOURCE "func_32k_ck" | 66 | #define OMAP2_32K_SOURCE "func_32k_ck" |
66 | #define OMAP3_32K_SOURCE "omap_32k_fck" | 67 | #define OMAP3_32K_SOURCE "omap_32k_fck" |
67 | #define OMAP4_32K_SOURCE "sys_32k_ck" | 68 | #define OMAP4_32K_SOURCE "sys_32k_ck" |
@@ -487,7 +488,7 @@ static void __init realtime_counter_init(void) | |||
487 | pr_err("%s: ioremap failed\n", __func__); | 488 | pr_err("%s: ioremap failed\n", __func__); |
488 | return; | 489 | return; |
489 | } | 490 | } |
490 | sys_clk = clk_get(NULL, "sys_clkin_ck"); | 491 | sys_clk = clk_get(NULL, OMAP5_MPU_SOURCE); |
491 | if (IS_ERR(sys_clk)) { | 492 | if (IS_ERR(sys_clk)) { |
492 | pr_err("%s: failed to get system clock handle\n", __func__); | 493 | pr_err("%s: failed to get system clock handle\n", __func__); |
493 | iounmap(base); | 494 | iounmap(base); |
@@ -620,7 +621,7 @@ void __init omap4_local_timer_init(void) | |||
620 | 621 | ||
621 | #ifdef CONFIG_SOC_OMAP5 | 622 | #ifdef CONFIG_SOC_OMAP5 |
622 | OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", | 623 | OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", |
623 | 2, OMAP4_MPU_SOURCE); | 624 | 2, OMAP5_MPU_SOURCE); |
624 | void __init omap5_realtime_timer_init(void) | 625 | void __init omap5_realtime_timer_init(void) |
625 | { | 626 | { |
626 | int err; | 627 | int err; |
diff --git a/arch/arm/mach-orion5x/board-dt.c b/arch/arm/mach-orion5x/board-dt.c index 35a8014529ca..94fbb815680c 100644 --- a/arch/arm/mach-orion5x/board-dt.c +++ b/arch/arm/mach-orion5x/board-dt.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/of.h> | 15 | #include <linux/of.h> |
16 | #include <linux/of_platform.h> | 16 | #include <linux/of_platform.h> |
17 | #include <linux/cpu.h> | ||
17 | #include <asm/system_misc.h> | 18 | #include <asm/system_misc.h> |
18 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
19 | #include <mach/orion5x.h> | 20 | #include <mach/orion5x.h> |
@@ -52,7 +53,7 @@ static void __init orion5x_dt_init(void) | |||
52 | */ | 53 | */ |
53 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | 54 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { |
54 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | 55 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); |
55 | disable_hlt(); | 56 | cpu_idle_poll_ctrl(true); |
56 | } | 57 | } |
57 | 58 | ||
58 | if (of_machine_is_compatible("lacie,ethernet-disk-mini-v2")) | 59 | if (of_machine_is_compatible("lacie,ethernet-disk-mini-v2")) |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index d068f1431c40..2075bf8e3d90 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/clk-provider.h> | 21 | #include <linux/clk-provider.h> |
22 | #include <linux/cpu.h> | ||
22 | #include <net/dsa.h> | 23 | #include <net/dsa.h> |
23 | #include <asm/page.h> | 24 | #include <asm/page.h> |
24 | #include <asm/setup.h> | 25 | #include <asm/setup.h> |
@@ -293,7 +294,7 @@ void __init orion5x_init(void) | |||
293 | */ | 294 | */ |
294 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | 295 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { |
295 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | 296 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); |
296 | disable_hlt(); | 297 | cpu_idle_poll_ctrl(true); |
297 | } | 298 | } |
298 | 299 | ||
299 | /* | 300 | /* |
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 12c500558387..648867a8caa8 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
@@ -7,12 +7,6 @@ obj-y += clock.o devices.o generic.o irq.o \ | |||
7 | time.o reset.o | 7 | time.o reset.o |
8 | obj-$(CONFIG_PM) += pm.o sleep.o standby.o | 8 | obj-$(CONFIG_PM) += pm.o sleep.o standby.o |
9 | 9 | ||
10 | ifeq ($(CONFIG_CPU_FREQ),y) | ||
11 | obj-$(CONFIG_PXA25x) += cpufreq-pxa2xx.o | ||
12 | obj-$(CONFIG_PXA27x) += cpufreq-pxa2xx.o | ||
13 | obj-$(CONFIG_PXA3xx) += cpufreq-pxa3xx.o | ||
14 | endif | ||
15 | |||
16 | # Generic drivers that other drivers may depend upon | 10 | # Generic drivers that other drivers may depend upon |
17 | 11 | ||
18 | # SoC-specific code | 12 | # SoC-specific code |
diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c deleted file mode 100644 index 6a7aeab42f6c..000000000000 --- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c +++ /dev/null | |||
@@ -1,494 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-pxa/cpufreq-pxa2xx.c | ||
3 | * | ||
4 | * Copyright (C) 2002,2003 Intrinsyc Software | ||
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 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | * History: | ||
21 | * 31-Jul-2002 : Initial version [FB] | ||
22 | * 29-Jan-2003 : added PXA255 support [FB] | ||
23 | * 20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.) | ||
24 | * | ||
25 | * Note: | ||
26 | * This driver may change the memory bus clock rate, but will not do any | ||
27 | * platform specific access timing changes... for example if you have flash | ||
28 | * memory connected to CS0, you will need to register a platform specific | ||
29 | * notifier which will adjust the memory access strobes to maintain a | ||
30 | * minimum strobe width. | ||
31 | * | ||
32 | */ | ||
33 | |||
34 | #include <linux/kernel.h> | ||
35 | #include <linux/module.h> | ||
36 | #include <linux/sched.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/cpufreq.h> | ||
39 | #include <linux/err.h> | ||
40 | #include <linux/regulator/consumer.h> | ||
41 | #include <linux/io.h> | ||
42 | |||
43 | #include <mach/pxa2xx-regs.h> | ||
44 | #include <mach/smemc.h> | ||
45 | |||
46 | #ifdef DEBUG | ||
47 | static unsigned int freq_debug; | ||
48 | module_param(freq_debug, uint, 0); | ||
49 | MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); | ||
50 | #else | ||
51 | #define freq_debug 0 | ||
52 | #endif | ||
53 | |||
54 | static struct regulator *vcc_core; | ||
55 | |||
56 | static unsigned int pxa27x_maxfreq; | ||
57 | module_param(pxa27x_maxfreq, uint, 0); | ||
58 | MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz" | ||
59 | "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)"); | ||
60 | |||
61 | typedef struct { | ||
62 | unsigned int khz; | ||
63 | unsigned int membus; | ||
64 | unsigned int cccr; | ||
65 | unsigned int div2; | ||
66 | unsigned int cclkcfg; | ||
67 | int vmin; | ||
68 | int vmax; | ||
69 | } pxa_freqs_t; | ||
70 | |||
71 | /* Define the refresh period in mSec for the SDRAM and the number of rows */ | ||
72 | #define SDRAM_TREF 64 /* standard 64ms SDRAM */ | ||
73 | static unsigned int sdram_rows; | ||
74 | |||
75 | #define CCLKCFG_TURBO 0x1 | ||
76 | #define CCLKCFG_FCS 0x2 | ||
77 | #define CCLKCFG_HALFTURBO 0x4 | ||
78 | #define CCLKCFG_FASTBUS 0x8 | ||
79 | #define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2) | ||
80 | #define MDREFR_DRI_MASK 0xFFF | ||
81 | |||
82 | #define MDCNFG_DRAC2(mdcnfg) (((mdcnfg) >> 21) & 0x3) | ||
83 | #define MDCNFG_DRAC0(mdcnfg) (((mdcnfg) >> 5) & 0x3) | ||
84 | |||
85 | /* | ||
86 | * PXA255 definitions | ||
87 | */ | ||
88 | /* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */ | ||
89 | #define CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS | ||
90 | |||
91 | static pxa_freqs_t pxa255_run_freqs[] = | ||
92 | { | ||
93 | /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ | ||
94 | { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ | ||
95 | {132700, 132700, 0x123, 1, CCLKCFG, -1, -1}, /* 133, 133, 66, 66 */ | ||
96 | {199100, 99500, 0x141, 0, CCLKCFG, -1, -1}, /* 199, 199, 99, 99 */ | ||
97 | {265400, 132700, 0x143, 1, CCLKCFG, -1, -1}, /* 265, 265, 133, 66 */ | ||
98 | {331800, 165900, 0x145, 1, CCLKCFG, -1, -1}, /* 331, 331, 166, 83 */ | ||
99 | {398100, 99500, 0x161, 0, CCLKCFG, -1, -1}, /* 398, 398, 196, 99 */ | ||
100 | }; | ||
101 | |||
102 | /* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */ | ||
103 | static pxa_freqs_t pxa255_turbo_freqs[] = | ||
104 | { | ||
105 | /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ | ||
106 | { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ | ||
107 | {199100, 99500, 0x221, 0, CCLKCFG, -1, -1}, /* 99, 199, 50, 99 */ | ||
108 | {298500, 99500, 0x321, 0, CCLKCFG, -1, -1}, /* 99, 287, 50, 99 */ | ||
109 | {298600, 99500, 0x1c1, 0, CCLKCFG, -1, -1}, /* 199, 287, 99, 99 */ | ||
110 | {398100, 99500, 0x241, 0, CCLKCFG, -1, -1}, /* 199, 398, 99, 99 */ | ||
111 | }; | ||
112 | |||
113 | #define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs) | ||
114 | #define NUM_PXA25x_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs) | ||
115 | |||
116 | static struct cpufreq_frequency_table | ||
117 | pxa255_run_freq_table[NUM_PXA25x_RUN_FREQS+1]; | ||
118 | static struct cpufreq_frequency_table | ||
119 | pxa255_turbo_freq_table[NUM_PXA25x_TURBO_FREQS+1]; | ||
120 | |||
121 | static unsigned int pxa255_turbo_table; | ||
122 | module_param(pxa255_turbo_table, uint, 0); | ||
123 | MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table, !0 = turbo table)"); | ||
124 | |||
125 | /* | ||
126 | * PXA270 definitions | ||
127 | * | ||
128 | * For the PXA27x: | ||
129 | * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG. | ||
130 | * | ||
131 | * A = 0 => memory controller clock from table 3-7, | ||
132 | * A = 1 => memory controller clock = system bus clock | ||
133 | * Run mode frequency = 13 MHz * L | ||
134 | * Turbo mode frequency = 13 MHz * L * N | ||
135 | * System bus frequency = 13 MHz * L / (B + 1) | ||
136 | * | ||
137 | * In CCCR: | ||
138 | * A = 1 | ||
139 | * L = 16 oscillator to run mode ratio | ||
140 | * 2N = 6 2 * (turbo mode to run mode ratio) | ||
141 | * | ||
142 | * In CCLKCFG: | ||
143 | * B = 1 Fast bus mode | ||
144 | * HT = 0 Half-Turbo mode | ||
145 | * T = 1 Turbo mode | ||
146 | * | ||
147 | * For now, just support some of the combinations in table 3-7 of | ||
148 | * PXA27x Processor Family Developer's Manual to simplify frequency | ||
149 | * change sequences. | ||
150 | */ | ||
151 | #define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L) | ||
152 | #define CCLKCFG2(B, HT, T) \ | ||
153 | (CCLKCFG_FCS | \ | ||
154 | ((B) ? CCLKCFG_FASTBUS : 0) | \ | ||
155 | ((HT) ? CCLKCFG_HALFTURBO : 0) | \ | ||
156 | ((T) ? CCLKCFG_TURBO : 0)) | ||
157 | |||
158 | static pxa_freqs_t pxa27x_freqs[] = { | ||
159 | {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, | ||
160 | {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 }, | ||
161 | {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, | ||
162 | {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, | ||
163 | {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, | ||
164 | {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1), 1450000, 1705000 }, | ||
165 | {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1), 1550000, 1705000 } | ||
166 | }; | ||
167 | |||
168 | #define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs) | ||
169 | static struct cpufreq_frequency_table | ||
170 | pxa27x_freq_table[NUM_PXA27x_FREQS+1]; | ||
171 | |||
172 | extern unsigned get_clk_frequency_khz(int info); | ||
173 | |||
174 | #ifdef CONFIG_REGULATOR | ||
175 | |||
176 | static int pxa_cpufreq_change_voltage(pxa_freqs_t *pxa_freq) | ||
177 | { | ||
178 | int ret = 0; | ||
179 | int vmin, vmax; | ||
180 | |||
181 | if (!cpu_is_pxa27x()) | ||
182 | return 0; | ||
183 | |||
184 | vmin = pxa_freq->vmin; | ||
185 | vmax = pxa_freq->vmax; | ||
186 | if ((vmin == -1) || (vmax == -1)) | ||
187 | return 0; | ||
188 | |||
189 | ret = regulator_set_voltage(vcc_core, vmin, vmax); | ||
190 | if (ret) | ||
191 | pr_err("cpufreq: Failed to set vcc_core in [%dmV..%dmV]\n", | ||
192 | vmin, vmax); | ||
193 | return ret; | ||
194 | } | ||
195 | |||
196 | static __init void pxa_cpufreq_init_voltages(void) | ||
197 | { | ||
198 | vcc_core = regulator_get(NULL, "vcc_core"); | ||
199 | if (IS_ERR(vcc_core)) { | ||
200 | pr_info("cpufreq: Didn't find vcc_core regulator\n"); | ||
201 | vcc_core = NULL; | ||
202 | } else { | ||
203 | pr_info("cpufreq: Found vcc_core regulator\n"); | ||
204 | } | ||
205 | } | ||
206 | #else | ||
207 | static int pxa_cpufreq_change_voltage(pxa_freqs_t *pxa_freq) | ||
208 | { | ||
209 | return 0; | ||
210 | } | ||
211 | |||
212 | static __init void pxa_cpufreq_init_voltages(void) { } | ||
213 | #endif | ||
214 | |||
215 | static void find_freq_tables(struct cpufreq_frequency_table **freq_table, | ||
216 | pxa_freqs_t **pxa_freqs) | ||
217 | { | ||
218 | if (cpu_is_pxa25x()) { | ||
219 | if (!pxa255_turbo_table) { | ||
220 | *pxa_freqs = pxa255_run_freqs; | ||
221 | *freq_table = pxa255_run_freq_table; | ||
222 | } else { | ||
223 | *pxa_freqs = pxa255_turbo_freqs; | ||
224 | *freq_table = pxa255_turbo_freq_table; | ||
225 | } | ||
226 | } | ||
227 | if (cpu_is_pxa27x()) { | ||
228 | *pxa_freqs = pxa27x_freqs; | ||
229 | *freq_table = pxa27x_freq_table; | ||
230 | } | ||
231 | } | ||
232 | |||
233 | static void pxa27x_guess_max_freq(void) | ||
234 | { | ||
235 | if (!pxa27x_maxfreq) { | ||
236 | pxa27x_maxfreq = 416000; | ||
237 | printk(KERN_INFO "PXA CPU 27x max frequency not defined " | ||
238 | "(pxa27x_maxfreq), assuming pxa271 with %dkHz maxfreq\n", | ||
239 | pxa27x_maxfreq); | ||
240 | } else { | ||
241 | pxa27x_maxfreq *= 1000; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | static void init_sdram_rows(void) | ||
246 | { | ||
247 | uint32_t mdcnfg = __raw_readl(MDCNFG); | ||
248 | unsigned int drac2 = 0, drac0 = 0; | ||
249 | |||
250 | if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3)) | ||
251 | drac2 = MDCNFG_DRAC2(mdcnfg); | ||
252 | |||
253 | if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1)) | ||
254 | drac0 = MDCNFG_DRAC0(mdcnfg); | ||
255 | |||
256 | sdram_rows = 1 << (11 + max(drac0, drac2)); | ||
257 | } | ||
258 | |||
259 | static u32 mdrefr_dri(unsigned int freq) | ||
260 | { | ||
261 | u32 interval = freq * SDRAM_TREF / sdram_rows; | ||
262 | |||
263 | return (interval - (cpu_is_pxa27x() ? 31 : 0)) / 32; | ||
264 | } | ||
265 | |||
266 | /* find a valid frequency point */ | ||
267 | static int pxa_verify_policy(struct cpufreq_policy *policy) | ||
268 | { | ||
269 | struct cpufreq_frequency_table *pxa_freqs_table; | ||
270 | pxa_freqs_t *pxa_freqs; | ||
271 | int ret; | ||
272 | |||
273 | find_freq_tables(&pxa_freqs_table, &pxa_freqs); | ||
274 | ret = cpufreq_frequency_table_verify(policy, pxa_freqs_table); | ||
275 | |||
276 | if (freq_debug) | ||
277 | pr_debug("Verified CPU policy: %dKhz min to %dKhz max\n", | ||
278 | policy->min, policy->max); | ||
279 | |||
280 | return ret; | ||
281 | } | ||
282 | |||
283 | static unsigned int pxa_cpufreq_get(unsigned int cpu) | ||
284 | { | ||
285 | return get_clk_frequency_khz(0); | ||
286 | } | ||
287 | |||
288 | static int pxa_set_target(struct cpufreq_policy *policy, | ||
289 | unsigned int target_freq, | ||
290 | unsigned int relation) | ||
291 | { | ||
292 | struct cpufreq_frequency_table *pxa_freqs_table; | ||
293 | pxa_freqs_t *pxa_freq_settings; | ||
294 | struct cpufreq_freqs freqs; | ||
295 | unsigned int idx; | ||
296 | unsigned long flags; | ||
297 | unsigned int new_freq_cpu, new_freq_mem; | ||
298 | unsigned int unused, preset_mdrefr, postset_mdrefr, cclkcfg; | ||
299 | int ret = 0; | ||
300 | |||
301 | /* Get the current policy */ | ||
302 | find_freq_tables(&pxa_freqs_table, &pxa_freq_settings); | ||
303 | |||
304 | /* Lookup the next frequency */ | ||
305 | if (cpufreq_frequency_table_target(policy, pxa_freqs_table, | ||
306 | target_freq, relation, &idx)) { | ||
307 | return -EINVAL; | ||
308 | } | ||
309 | |||
310 | new_freq_cpu = pxa_freq_settings[idx].khz; | ||
311 | new_freq_mem = pxa_freq_settings[idx].membus; | ||
312 | freqs.old = policy->cur; | ||
313 | freqs.new = new_freq_cpu; | ||
314 | freqs.cpu = policy->cpu; | ||
315 | |||
316 | if (freq_debug) | ||
317 | pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", | ||
318 | freqs.new / 1000, (pxa_freq_settings[idx].div2) ? | ||
319 | (new_freq_mem / 2000) : (new_freq_mem / 1000)); | ||
320 | |||
321 | if (vcc_core && freqs.new > freqs.old) | ||
322 | ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]); | ||
323 | if (ret) | ||
324 | return ret; | ||
325 | /* | ||
326 | * Tell everyone what we're about to do... | ||
327 | * you should add a notify client with any platform specific | ||
328 | * Vcc changing capability | ||
329 | */ | ||
330 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
331 | |||
332 | /* Calculate the next MDREFR. If we're slowing down the SDRAM clock | ||
333 | * we need to preset the smaller DRI before the change. If we're | ||
334 | * speeding up we need to set the larger DRI value after the change. | ||
335 | */ | ||
336 | preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR); | ||
337 | if ((preset_mdrefr & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) { | ||
338 | preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK); | ||
339 | preset_mdrefr |= mdrefr_dri(new_freq_mem); | ||
340 | } | ||
341 | postset_mdrefr = | ||
342 | (postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem); | ||
343 | |||
344 | /* If we're dividing the memory clock by two for the SDRAM clock, this | ||
345 | * must be set prior to the change. Clearing the divide must be done | ||
346 | * after the change. | ||
347 | */ | ||
348 | if (pxa_freq_settings[idx].div2) { | ||
349 | preset_mdrefr |= MDREFR_DB2_MASK; | ||
350 | postset_mdrefr |= MDREFR_DB2_MASK; | ||
351 | } else { | ||
352 | postset_mdrefr &= ~MDREFR_DB2_MASK; | ||
353 | } | ||
354 | |||
355 | local_irq_save(flags); | ||
356 | |||
357 | /* Set new the CCCR and prepare CCLKCFG */ | ||
358 | CCCR = pxa_freq_settings[idx].cccr; | ||
359 | cclkcfg = pxa_freq_settings[idx].cclkcfg; | ||
360 | |||
361 | asm volatile(" \n\ | ||
362 | ldr r4, [%1] /* load MDREFR */ \n\ | ||
363 | b 2f \n\ | ||
364 | .align 5 \n\ | ||
365 | 1: \n\ | ||
366 | str %3, [%1] /* preset the MDREFR */ \n\ | ||
367 | mcr p14, 0, %2, c6, c0, 0 /* set CCLKCFG[FCS] */ \n\ | ||
368 | str %4, [%1] /* postset the MDREFR */ \n\ | ||
369 | \n\ | ||
370 | b 3f \n\ | ||
371 | 2: b 1b \n\ | ||
372 | 3: nop \n\ | ||
373 | " | ||
374 | : "=&r" (unused) | ||
375 | : "r" (MDREFR), "r" (cclkcfg), | ||
376 | "r" (preset_mdrefr), "r" (postset_mdrefr) | ||
377 | : "r4", "r5"); | ||
378 | local_irq_restore(flags); | ||
379 | |||
380 | /* | ||
381 | * Tell everyone what we've just done... | ||
382 | * you should add a notify client with any platform specific | ||
383 | * SDRAM refresh timer adjustments | ||
384 | */ | ||
385 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
386 | |||
387 | /* | ||
388 | * Even if voltage setting fails, we don't report it, as the frequency | ||
389 | * change succeeded. The voltage reduction is not a critical failure, | ||
390 | * only power savings will suffer from this. | ||
391 | * | ||
392 | * Note: if the voltage change fails, and a return value is returned, a | ||
393 | * bug is triggered (seems a deadlock). Should anybody find out where, | ||
394 | * the "return 0" should become a "return ret". | ||
395 | */ | ||
396 | if (vcc_core && freqs.new < freqs.old) | ||
397 | ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]); | ||
398 | |||
399 | return 0; | ||
400 | } | ||
401 | |||
402 | static int pxa_cpufreq_init(struct cpufreq_policy *policy) | ||
403 | { | ||
404 | int i; | ||
405 | unsigned int freq; | ||
406 | struct cpufreq_frequency_table *pxa255_freq_table; | ||
407 | pxa_freqs_t *pxa255_freqs; | ||
408 | |||
409 | /* try to guess pxa27x cpu */ | ||
410 | if (cpu_is_pxa27x()) | ||
411 | pxa27x_guess_max_freq(); | ||
412 | |||
413 | pxa_cpufreq_init_voltages(); | ||
414 | |||
415 | init_sdram_rows(); | ||
416 | |||
417 | /* set default policy and cpuinfo */ | ||
418 | policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ | ||
419 | policy->cur = get_clk_frequency_khz(0); /* current freq */ | ||
420 | policy->min = policy->max = policy->cur; | ||
421 | |||
422 | /* Generate pxa25x the run cpufreq_frequency_table struct */ | ||
423 | for (i = 0; i < NUM_PXA25x_RUN_FREQS; i++) { | ||
424 | pxa255_run_freq_table[i].frequency = pxa255_run_freqs[i].khz; | ||
425 | pxa255_run_freq_table[i].index = i; | ||
426 | } | ||
427 | pxa255_run_freq_table[i].frequency = CPUFREQ_TABLE_END; | ||
428 | |||
429 | /* Generate pxa25x the turbo cpufreq_frequency_table struct */ | ||
430 | for (i = 0; i < NUM_PXA25x_TURBO_FREQS; i++) { | ||
431 | pxa255_turbo_freq_table[i].frequency = | ||
432 | pxa255_turbo_freqs[i].khz; | ||
433 | pxa255_turbo_freq_table[i].index = i; | ||
434 | } | ||
435 | pxa255_turbo_freq_table[i].frequency = CPUFREQ_TABLE_END; | ||
436 | |||
437 | pxa255_turbo_table = !!pxa255_turbo_table; | ||
438 | |||
439 | /* Generate the pxa27x cpufreq_frequency_table struct */ | ||
440 | for (i = 0; i < NUM_PXA27x_FREQS; i++) { | ||
441 | freq = pxa27x_freqs[i].khz; | ||
442 | if (freq > pxa27x_maxfreq) | ||
443 | break; | ||
444 | pxa27x_freq_table[i].frequency = freq; | ||
445 | pxa27x_freq_table[i].index = i; | ||
446 | } | ||
447 | pxa27x_freq_table[i].index = i; | ||
448 | pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END; | ||
449 | |||
450 | /* | ||
451 | * Set the policy's minimum and maximum frequencies from the tables | ||
452 | * just constructed. This sets cpuinfo.mxx_freq, min and max. | ||
453 | */ | ||
454 | if (cpu_is_pxa25x()) { | ||
455 | find_freq_tables(&pxa255_freq_table, &pxa255_freqs); | ||
456 | pr_info("PXA255 cpufreq using %s frequency table\n", | ||
457 | pxa255_turbo_table ? "turbo" : "run"); | ||
458 | cpufreq_frequency_table_cpuinfo(policy, pxa255_freq_table); | ||
459 | } | ||
460 | else if (cpu_is_pxa27x()) | ||
461 | cpufreq_frequency_table_cpuinfo(policy, pxa27x_freq_table); | ||
462 | |||
463 | printk(KERN_INFO "PXA CPU frequency change support initialized\n"); | ||
464 | |||
465 | return 0; | ||
466 | } | ||
467 | |||
468 | static struct cpufreq_driver pxa_cpufreq_driver = { | ||
469 | .verify = pxa_verify_policy, | ||
470 | .target = pxa_set_target, | ||
471 | .init = pxa_cpufreq_init, | ||
472 | .get = pxa_cpufreq_get, | ||
473 | .name = "PXA2xx", | ||
474 | }; | ||
475 | |||
476 | static int __init pxa_cpu_init(void) | ||
477 | { | ||
478 | int ret = -ENODEV; | ||
479 | if (cpu_is_pxa25x() || cpu_is_pxa27x()) | ||
480 | ret = cpufreq_register_driver(&pxa_cpufreq_driver); | ||
481 | return ret; | ||
482 | } | ||
483 | |||
484 | static void __exit pxa_cpu_exit(void) | ||
485 | { | ||
486 | cpufreq_unregister_driver(&pxa_cpufreq_driver); | ||
487 | } | ||
488 | |||
489 | |||
490 | MODULE_AUTHOR("Intrinsyc Software Inc."); | ||
491 | MODULE_DESCRIPTION("CPU frequency changing driver for the PXA architecture"); | ||
492 | MODULE_LICENSE("GPL"); | ||
493 | module_init(pxa_cpu_init); | ||
494 | module_exit(pxa_cpu_exit); | ||
diff --git a/arch/arm/mach-pxa/cpufreq-pxa3xx.c b/arch/arm/mach-pxa/cpufreq-pxa3xx.c deleted file mode 100644 index b85b4ab7aac6..000000000000 --- a/arch/arm/mach-pxa/cpufreq-pxa3xx.c +++ /dev/null | |||
@@ -1,258 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-pxa/cpufreq-pxa3xx.c | ||
3 | * | ||
4 | * Copyright (C) 2008 Marvell International Ltd. | ||
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 | #include <linux/kernel.h> | ||
13 | #include <linux/module.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/cpufreq.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include <mach/pxa3xx-regs.h> | ||
21 | |||
22 | #include "generic.h" | ||
23 | |||
24 | #define HSS_104M (0) | ||
25 | #define HSS_156M (1) | ||
26 | #define HSS_208M (2) | ||
27 | #define HSS_312M (3) | ||
28 | |||
29 | #define SMCFS_78M (0) | ||
30 | #define SMCFS_104M (2) | ||
31 | #define SMCFS_208M (5) | ||
32 | |||
33 | #define SFLFS_104M (0) | ||
34 | #define SFLFS_156M (1) | ||
35 | #define SFLFS_208M (2) | ||
36 | #define SFLFS_312M (3) | ||
37 | |||
38 | #define XSPCLK_156M (0) | ||
39 | #define XSPCLK_NONE (3) | ||
40 | |||
41 | #define DMCFS_26M (0) | ||
42 | #define DMCFS_260M (3) | ||
43 | |||
44 | struct pxa3xx_freq_info { | ||
45 | unsigned int cpufreq_mhz; | ||
46 | unsigned int core_xl : 5; | ||
47 | unsigned int core_xn : 3; | ||
48 | unsigned int hss : 2; | ||
49 | unsigned int dmcfs : 2; | ||
50 | unsigned int smcfs : 3; | ||
51 | unsigned int sflfs : 2; | ||
52 | unsigned int df_clkdiv : 3; | ||
53 | |||
54 | int vcc_core; /* in mV */ | ||
55 | int vcc_sram; /* in mV */ | ||
56 | }; | ||
57 | |||
58 | #define OP(cpufreq, _xl, _xn, _hss, _dmc, _smc, _sfl, _dfi, vcore, vsram) \ | ||
59 | { \ | ||
60 | .cpufreq_mhz = cpufreq, \ | ||
61 | .core_xl = _xl, \ | ||
62 | .core_xn = _xn, \ | ||
63 | .hss = HSS_##_hss##M, \ | ||
64 | .dmcfs = DMCFS_##_dmc##M, \ | ||
65 | .smcfs = SMCFS_##_smc##M, \ | ||
66 | .sflfs = SFLFS_##_sfl##M, \ | ||
67 | .df_clkdiv = _dfi, \ | ||
68 | .vcc_core = vcore, \ | ||
69 | .vcc_sram = vsram, \ | ||
70 | } | ||
71 | |||
72 | static struct pxa3xx_freq_info pxa300_freqs[] = { | ||
73 | /* CPU XL XN HSS DMEM SMEM SRAM DFI VCC_CORE VCC_SRAM */ | ||
74 | OP(104, 8, 1, 104, 260, 78, 104, 3, 1000, 1100), /* 104MHz */ | ||
75 | OP(208, 16, 1, 104, 260, 104, 156, 2, 1000, 1100), /* 208MHz */ | ||
76 | OP(416, 16, 2, 156, 260, 104, 208, 2, 1100, 1200), /* 416MHz */ | ||
77 | OP(624, 24, 2, 208, 260, 208, 312, 3, 1375, 1400), /* 624MHz */ | ||
78 | }; | ||
79 | |||
80 | static struct pxa3xx_freq_info pxa320_freqs[] = { | ||
81 | /* CPU XL XN HSS DMEM SMEM SRAM DFI VCC_CORE VCC_SRAM */ | ||
82 | OP(104, 8, 1, 104, 260, 78, 104, 3, 1000, 1100), /* 104MHz */ | ||
83 | OP(208, 16, 1, 104, 260, 104, 156, 2, 1000, 1100), /* 208MHz */ | ||
84 | OP(416, 16, 2, 156, 260, 104, 208, 2, 1100, 1200), /* 416MHz */ | ||
85 | OP(624, 24, 2, 208, 260, 208, 312, 3, 1375, 1400), /* 624MHz */ | ||
86 | OP(806, 31, 2, 208, 260, 208, 312, 3, 1400, 1400), /* 806MHz */ | ||
87 | }; | ||
88 | |||
89 | static unsigned int pxa3xx_freqs_num; | ||
90 | static struct pxa3xx_freq_info *pxa3xx_freqs; | ||
91 | static struct cpufreq_frequency_table *pxa3xx_freqs_table; | ||
92 | |||
93 | static int setup_freqs_table(struct cpufreq_policy *policy, | ||
94 | struct pxa3xx_freq_info *freqs, int num) | ||
95 | { | ||
96 | struct cpufreq_frequency_table *table; | ||
97 | int i; | ||
98 | |||
99 | table = kzalloc((num + 1) * sizeof(*table), GFP_KERNEL); | ||
100 | if (table == NULL) | ||
101 | return -ENOMEM; | ||
102 | |||
103 | for (i = 0; i < num; i++) { | ||
104 | table[i].index = i; | ||
105 | table[i].frequency = freqs[i].cpufreq_mhz * 1000; | ||
106 | } | ||
107 | table[num].index = i; | ||
108 | table[num].frequency = CPUFREQ_TABLE_END; | ||
109 | |||
110 | pxa3xx_freqs = freqs; | ||
111 | pxa3xx_freqs_num = num; | ||
112 | pxa3xx_freqs_table = table; | ||
113 | |||
114 | return cpufreq_frequency_table_cpuinfo(policy, table); | ||
115 | } | ||
116 | |||
117 | static void __update_core_freq(struct pxa3xx_freq_info *info) | ||
118 | { | ||
119 | uint32_t mask = ACCR_XN_MASK | ACCR_XL_MASK; | ||
120 | uint32_t accr = ACCR; | ||
121 | uint32_t xclkcfg; | ||
122 | |||
123 | accr &= ~(ACCR_XN_MASK | ACCR_XL_MASK | ACCR_XSPCLK_MASK); | ||
124 | accr |= ACCR_XN(info->core_xn) | ACCR_XL(info->core_xl); | ||
125 | |||
126 | /* No clock until core PLL is re-locked */ | ||
127 | accr |= ACCR_XSPCLK(XSPCLK_NONE); | ||
128 | |||
129 | xclkcfg = (info->core_xn == 2) ? 0x3 : 0x2; /* turbo bit */ | ||
130 | |||
131 | ACCR = accr; | ||
132 | __asm__("mcr p14, 0, %0, c6, c0, 0\n" : : "r"(xclkcfg)); | ||
133 | |||
134 | while ((ACSR & mask) != (accr & mask)) | ||
135 | cpu_relax(); | ||
136 | } | ||
137 | |||
138 | static void __update_bus_freq(struct pxa3xx_freq_info *info) | ||
139 | { | ||
140 | uint32_t mask; | ||
141 | uint32_t accr = ACCR; | ||
142 | |||
143 | mask = ACCR_SMCFS_MASK | ACCR_SFLFS_MASK | ACCR_HSS_MASK | | ||
144 | ACCR_DMCFS_MASK; | ||
145 | |||
146 | accr &= ~mask; | ||
147 | accr |= ACCR_SMCFS(info->smcfs) | ACCR_SFLFS(info->sflfs) | | ||
148 | ACCR_HSS(info->hss) | ACCR_DMCFS(info->dmcfs); | ||
149 | |||
150 | ACCR = accr; | ||
151 | |||
152 | while ((ACSR & mask) != (accr & mask)) | ||
153 | cpu_relax(); | ||
154 | } | ||
155 | |||
156 | static int pxa3xx_cpufreq_verify(struct cpufreq_policy *policy) | ||
157 | { | ||
158 | return cpufreq_frequency_table_verify(policy, pxa3xx_freqs_table); | ||
159 | } | ||
160 | |||
161 | static unsigned int pxa3xx_cpufreq_get(unsigned int cpu) | ||
162 | { | ||
163 | return pxa3xx_get_clk_frequency_khz(0); | ||
164 | } | ||
165 | |||
166 | static int pxa3xx_cpufreq_set(struct cpufreq_policy *policy, | ||
167 | unsigned int target_freq, | ||
168 | unsigned int relation) | ||
169 | { | ||
170 | struct pxa3xx_freq_info *next; | ||
171 | struct cpufreq_freqs freqs; | ||
172 | unsigned long flags; | ||
173 | int idx; | ||
174 | |||
175 | if (policy->cpu != 0) | ||
176 | return -EINVAL; | ||
177 | |||
178 | /* Lookup the next frequency */ | ||
179 | if (cpufreq_frequency_table_target(policy, pxa3xx_freqs_table, | ||
180 | target_freq, relation, &idx)) | ||
181 | return -EINVAL; | ||
182 | |||
183 | next = &pxa3xx_freqs[idx]; | ||
184 | |||
185 | freqs.old = policy->cur; | ||
186 | freqs.new = next->cpufreq_mhz * 1000; | ||
187 | freqs.cpu = policy->cpu; | ||
188 | |||
189 | pr_debug("CPU frequency from %d MHz to %d MHz%s\n", | ||
190 | freqs.old / 1000, freqs.new / 1000, | ||
191 | (freqs.old == freqs.new) ? " (skipped)" : ""); | ||
192 | |||
193 | if (freqs.old == target_freq) | ||
194 | return 0; | ||
195 | |||
196 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
197 | |||
198 | local_irq_save(flags); | ||
199 | __update_core_freq(next); | ||
200 | __update_bus_freq(next); | ||
201 | local_irq_restore(flags); | ||
202 | |||
203 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
204 | |||
205 | return 0; | ||
206 | } | ||
207 | |||
208 | static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy) | ||
209 | { | ||
210 | int ret = -EINVAL; | ||
211 | |||
212 | /* set default policy and cpuinfo */ | ||
213 | policy->cpuinfo.min_freq = 104000; | ||
214 | policy->cpuinfo.max_freq = (cpu_is_pxa320()) ? 806000 : 624000; | ||
215 | policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ | ||
216 | policy->max = pxa3xx_get_clk_frequency_khz(0); | ||
217 | policy->cur = policy->min = policy->max; | ||
218 | |||
219 | if (cpu_is_pxa300() || cpu_is_pxa310()) | ||
220 | ret = setup_freqs_table(policy, ARRAY_AND_SIZE(pxa300_freqs)); | ||
221 | |||
222 | if (cpu_is_pxa320()) | ||
223 | ret = setup_freqs_table(policy, ARRAY_AND_SIZE(pxa320_freqs)); | ||
224 | |||
225 | if (ret) { | ||
226 | pr_err("failed to setup frequency table\n"); | ||
227 | return ret; | ||
228 | } | ||
229 | |||
230 | pr_info("CPUFREQ support for PXA3xx initialized\n"); | ||
231 | return 0; | ||
232 | } | ||
233 | |||
234 | static struct cpufreq_driver pxa3xx_cpufreq_driver = { | ||
235 | .verify = pxa3xx_cpufreq_verify, | ||
236 | .target = pxa3xx_cpufreq_set, | ||
237 | .init = pxa3xx_cpufreq_init, | ||
238 | .get = pxa3xx_cpufreq_get, | ||
239 | .name = "pxa3xx-cpufreq", | ||
240 | }; | ||
241 | |||
242 | static int __init cpufreq_init(void) | ||
243 | { | ||
244 | if (cpu_is_pxa3xx()) | ||
245 | return cpufreq_register_driver(&pxa3xx_cpufreq_driver); | ||
246 | |||
247 | return 0; | ||
248 | } | ||
249 | module_init(cpufreq_init); | ||
250 | |||
251 | static void __exit cpufreq_exit(void) | ||
252 | { | ||
253 | cpufreq_unregister_driver(&pxa3xx_cpufreq_driver); | ||
254 | } | ||
255 | module_exit(cpufreq_exit); | ||
256 | |||
257 | MODULE_DESCRIPTION("CPU frequency scaling driver for PXA3xx"); | ||
258 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/arm/mach-pxa/include/mach/generic.h b/arch/arm/mach-pxa/include/mach/generic.h new file mode 100644 index 000000000000..665542e0c9e2 --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/generic.h | |||
@@ -0,0 +1 @@ | |||
#include "../../generic.h" | |||
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2440.c b/arch/arm/mach-s3c24xx/clock-s3c2440.c index 04b87ec92537..1069b5680826 100644 --- a/arch/arm/mach-s3c24xx/clock-s3c2440.c +++ b/arch/arm/mach-s3c24xx/clock-s3c2440.c | |||
@@ -123,6 +123,11 @@ static struct clk s3c2440_clk_ac97 = { | |||
123 | .ctrlbit = S3C2440_CLKCON_AC97, | 123 | .ctrlbit = S3C2440_CLKCON_AC97, |
124 | }; | 124 | }; |
125 | 125 | ||
126 | #define S3C24XX_VA_UART0 (S3C_VA_UART) | ||
127 | #define S3C24XX_VA_UART1 (S3C_VA_UART + 0x4000 ) | ||
128 | #define S3C24XX_VA_UART2 (S3C_VA_UART + 0x8000 ) | ||
129 | #define S3C24XX_VA_UART3 (S3C_VA_UART + 0xC000 ) | ||
130 | |||
126 | static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) | 131 | static unsigned long s3c2440_fclk_n_getrate(struct clk *clk) |
127 | { | 132 | { |
128 | unsigned long ucon0, ucon1, ucon2, divisor; | 133 | unsigned long ucon0, ucon1, ucon2, divisor; |
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c index d97533d21ac4..c157103ed8eb 100644 --- a/arch/arm/mach-s3c24xx/common.c +++ b/arch/arm/mach-s3c24xx/common.c | |||
@@ -236,6 +236,11 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) | |||
236 | 236 | ||
237 | /* Serial port registrations */ | 237 | /* Serial port registrations */ |
238 | 238 | ||
239 | #define S3C2410_PA_UART0 (S3C24XX_PA_UART) | ||
240 | #define S3C2410_PA_UART1 (S3C24XX_PA_UART + 0x4000 ) | ||
241 | #define S3C2410_PA_UART2 (S3C24XX_PA_UART + 0x8000 ) | ||
242 | #define S3C2443_PA_UART3 (S3C24XX_PA_UART + 0xC000 ) | ||
243 | |||
239 | static struct resource s3c2410_uart0_resource[] = { | 244 | static struct resource s3c2410_uart0_resource[] = { |
240 | [0] = DEFINE_RES_MEM(S3C2410_PA_UART0, SZ_16K), | 245 | [0] = DEFINE_RES_MEM(S3C2410_PA_UART0, SZ_16K), |
241 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX0, \ | 246 | [1] = DEFINE_RES_NAMED(IRQ_S3CUART_RX0, \ |
diff --git a/arch/arm/mach-s3c24xx/cpufreq.c b/arch/arm/mach-s3c24xx/cpufreq.c index 5f181e733eee..3c0e78ede0da 100644 --- a/arch/arm/mach-s3c24xx/cpufreq.c +++ b/arch/arm/mach-s3c24xx/cpufreq.c | |||
@@ -204,7 +204,6 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy, | |||
204 | freqs.old = cpu_cur.freq; | 204 | freqs.old = cpu_cur.freq; |
205 | freqs.new = cpu_new.freq; | 205 | freqs.new = cpu_new.freq; |
206 | 206 | ||
207 | freqs.freqs.cpu = 0; | ||
208 | freqs.freqs.old = cpu_cur.freq.armclk / 1000; | 207 | freqs.freqs.old = cpu_cur.freq.armclk / 1000; |
209 | freqs.freqs.new = cpu_new.freq.armclk / 1000; | 208 | freqs.freqs.new = cpu_new.freq.armclk / 1000; |
210 | 209 | ||
@@ -218,9 +217,7 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy, | |||
218 | s3c_cpufreq_updateclk(clk_pclk, cpu_new.freq.pclk); | 217 | s3c_cpufreq_updateclk(clk_pclk, cpu_new.freq.pclk); |
219 | 218 | ||
220 | /* start the frequency change */ | 219 | /* start the frequency change */ |
221 | 220 | cpufreq_notify_transition(policy, &freqs.freqs, CPUFREQ_PRECHANGE); | |
222 | if (policy) | ||
223 | cpufreq_notify_transition(&freqs.freqs, CPUFREQ_PRECHANGE); | ||
224 | 221 | ||
225 | /* If hclk is staying the same, then we do not need to | 222 | /* If hclk is staying the same, then we do not need to |
226 | * re-write the IO or the refresh timings whilst we are changing | 223 | * re-write the IO or the refresh timings whilst we are changing |
@@ -264,8 +261,7 @@ static int s3c_cpufreq_settarget(struct cpufreq_policy *policy, | |||
264 | local_irq_restore(flags); | 261 | local_irq_restore(flags); |
265 | 262 | ||
266 | /* notify everyone we've done this */ | 263 | /* notify everyone we've done this */ |
267 | if (policy) | 264 | cpufreq_notify_transition(policy, &freqs.freqs, CPUFREQ_POSTCHANGE); |
268 | cpufreq_notify_transition(&freqs.freqs, CPUFREQ_POSTCHANGE); | ||
269 | 265 | ||
270 | s3c_freq_dbg("%s: finished\n", __func__); | 266 | s3c_freq_dbg("%s: finished\n", __func__); |
271 | return 0; | 267 | return 0; |
diff --git a/arch/arm/mach-s3c64xx/cpuidle.c b/arch/arm/mach-s3c64xx/cpuidle.c index ead5fab0dbb5..3c8ab07c2012 100644 --- a/arch/arm/mach-s3c64xx/cpuidle.c +++ b/arch/arm/mach-s3c64xx/cpuidle.c | |||
@@ -40,12 +40,9 @@ static int s3c64xx_enter_idle(struct cpuidle_device *dev, | |||
40 | return index; | 40 | return index; |
41 | } | 41 | } |
42 | 42 | ||
43 | static DEFINE_PER_CPU(struct cpuidle_device, s3c64xx_cpuidle_device); | ||
44 | |||
45 | static struct cpuidle_driver s3c64xx_cpuidle_driver = { | 43 | static struct cpuidle_driver s3c64xx_cpuidle_driver = { |
46 | .name = "s3c64xx_cpuidle", | 44 | .name = "s3c64xx_cpuidle", |
47 | .owner = THIS_MODULE, | 45 | .owner = THIS_MODULE, |
48 | .en_core_tk_irqen = 1, | ||
49 | .states = { | 46 | .states = { |
50 | { | 47 | { |
51 | .enter = s3c64xx_enter_idle, | 48 | .enter = s3c64xx_enter_idle, |
@@ -61,16 +58,6 @@ static struct cpuidle_driver s3c64xx_cpuidle_driver = { | |||
61 | 58 | ||
62 | static int __init s3c64xx_init_cpuidle(void) | 59 | static int __init s3c64xx_init_cpuidle(void) |
63 | { | 60 | { |
64 | int ret; | 61 | return cpuidle_register(&s3c64xx_cpuidle_driver, NULL); |
65 | |||
66 | cpuidle_register_driver(&s3c64xx_cpuidle_driver); | ||
67 | |||
68 | ret = cpuidle_register_device(&s3c64xx_cpuidle_device); | ||
69 | if (ret) { | ||
70 | pr_err("Failed to register cpuidle device: %d\n", ret); | ||
71 | return ret; | ||
72 | } | ||
73 | |||
74 | return 0; | ||
75 | } | 62 | } |
76 | device_initcall(s3c64xx_init_cpuidle); | 63 | device_initcall(s3c64xx_init_cpuidle); |
diff --git a/arch/arm/mach-s3c64xx/setup-usb-phy.c b/arch/arm/mach-s3c64xx/setup-usb-phy.c index c8174d95339b..ca960bda02fd 100644 --- a/arch/arm/mach-s3c64xx/setup-usb-phy.c +++ b/arch/arm/mach-s3c64xx/setup-usb-phy.c | |||
@@ -76,7 +76,7 @@ static int s3c_usb_otgphy_exit(struct platform_device *pdev) | |||
76 | 76 | ||
77 | int s5p_usb_phy_init(struct platform_device *pdev, int type) | 77 | int s5p_usb_phy_init(struct platform_device *pdev, int type) |
78 | { | 78 | { |
79 | if (type == S5P_USB_PHY_DEVICE) | 79 | if (type == USB_PHY_TYPE_DEVICE) |
80 | return s3c_usb_otgphy_init(pdev); | 80 | return s3c_usb_otgphy_init(pdev); |
81 | 81 | ||
82 | return -EINVAL; | 82 | return -EINVAL; |
@@ -84,7 +84,7 @@ int s5p_usb_phy_init(struct platform_device *pdev, int type) | |||
84 | 84 | ||
85 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) | 85 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) |
86 | { | 86 | { |
87 | if (type == S5P_USB_PHY_DEVICE) | 87 | if (type == USB_PHY_TYPE_DEVICE) |
88 | return s3c_usb_otgphy_exit(pdev); | 88 | return s3c_usb_otgphy_exit(pdev); |
89 | 89 | ||
90 | return -EINVAL; | 90 | return -EINVAL; |
diff --git a/arch/arm/mach-s5pv210/setup-usb-phy.c b/arch/arm/mach-s5pv210/setup-usb-phy.c index 356a0900af03..b2ee5333f89c 100644 --- a/arch/arm/mach-s5pv210/setup-usb-phy.c +++ b/arch/arm/mach-s5pv210/setup-usb-phy.c | |||
@@ -80,7 +80,7 @@ static int s5pv210_usb_otgphy_exit(struct platform_device *pdev) | |||
80 | 80 | ||
81 | int s5p_usb_phy_init(struct platform_device *pdev, int type) | 81 | int s5p_usb_phy_init(struct platform_device *pdev, int type) |
82 | { | 82 | { |
83 | if (type == S5P_USB_PHY_DEVICE) | 83 | if (type == USB_PHY_TYPE_DEVICE) |
84 | return s5pv210_usb_otgphy_init(pdev); | 84 | return s5pv210_usb_otgphy_init(pdev); |
85 | 85 | ||
86 | return -EINVAL; | 86 | return -EINVAL; |
@@ -88,7 +88,7 @@ int s5p_usb_phy_init(struct platform_device *pdev, int type) | |||
88 | 88 | ||
89 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) | 89 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) |
90 | { | 90 | { |
91 | if (type == S5P_USB_PHY_DEVICE) | 91 | if (type == USB_PHY_TYPE_DEVICE) |
92 | return s5pv210_usb_otgphy_exit(pdev); | 92 | return s5pv210_usb_otgphy_exit(pdev); |
93 | 93 | ||
94 | return -EINVAL; | 94 | return -EINVAL; |
diff --git a/arch/arm/mach-sa1100/Kconfig b/arch/arm/mach-sa1100/Kconfig index ca14dbdcfb22..04f9784ff0ed 100644 --- a/arch/arm/mach-sa1100/Kconfig +++ b/arch/arm/mach-sa1100/Kconfig | |||
@@ -4,7 +4,7 @@ menu "SA11x0 Implementations" | |||
4 | 4 | ||
5 | config SA1100_ASSABET | 5 | config SA1100_ASSABET |
6 | bool "Assabet" | 6 | bool "Assabet" |
7 | select CPU_FREQ_SA1110 | 7 | select ARM_SA1110_CPUFREQ |
8 | help | 8 | help |
9 | Say Y here if you are using the Intel(R) StrongARM(R) SA-1110 | 9 | Say Y here if you are using the Intel(R) StrongARM(R) SA-1110 |
10 | Microprocessor Development Board (also known as the Assabet). | 10 | Microprocessor Development Board (also known as the Assabet). |
@@ -20,7 +20,7 @@ config ASSABET_NEPONSET | |||
20 | 20 | ||
21 | config SA1100_CERF | 21 | config SA1100_CERF |
22 | bool "CerfBoard" | 22 | bool "CerfBoard" |
23 | select CPU_FREQ_SA1110 | 23 | select ARM_SA1110_CPUFREQ |
24 | help | 24 | help |
25 | The Intrinsyc CerfBoard is based on the StrongARM 1110 (Discontinued). | 25 | The Intrinsyc CerfBoard is based on the StrongARM 1110 (Discontinued). |
26 | More information is available at: | 26 | More information is available at: |
@@ -47,7 +47,7 @@ endchoice | |||
47 | 47 | ||
48 | config SA1100_COLLIE | 48 | config SA1100_COLLIE |
49 | bool "Sharp Zaurus SL5500" | 49 | bool "Sharp Zaurus SL5500" |
50 | # FIXME: select CPU_FREQ_SA11x0 | 50 | # FIXME: select ARM_SA11x0_CPUFREQ |
51 | select SHARP_LOCOMO | 51 | select SHARP_LOCOMO |
52 | select SHARP_PARAM | 52 | select SHARP_PARAM |
53 | select SHARP_SCOOP | 53 | select SHARP_SCOOP |
@@ -56,7 +56,7 @@ config SA1100_COLLIE | |||
56 | 56 | ||
57 | config SA1100_H3100 | 57 | config SA1100_H3100 |
58 | bool "Compaq iPAQ H3100" | 58 | bool "Compaq iPAQ H3100" |
59 | select CPU_FREQ_SA1110 | 59 | select ARM_SA1110_CPUFREQ |
60 | select HTC_EGPIO | 60 | select HTC_EGPIO |
61 | help | 61 | help |
62 | Say Y here if you intend to run this kernel on the Compaq iPAQ | 62 | Say Y here if you intend to run this kernel on the Compaq iPAQ |
@@ -67,7 +67,7 @@ config SA1100_H3100 | |||
67 | 67 | ||
68 | config SA1100_H3600 | 68 | config SA1100_H3600 |
69 | bool "Compaq iPAQ H3600/H3700" | 69 | bool "Compaq iPAQ H3600/H3700" |
70 | select CPU_FREQ_SA1110 | 70 | select ARM_SA1110_CPUFREQ |
71 | select HTC_EGPIO | 71 | select HTC_EGPIO |
72 | help | 72 | help |
73 | Say Y here if you intend to run this kernel on the Compaq iPAQ | 73 | Say Y here if you intend to run this kernel on the Compaq iPAQ |
@@ -78,7 +78,7 @@ config SA1100_H3600 | |||
78 | 78 | ||
79 | config SA1100_BADGE4 | 79 | config SA1100_BADGE4 |
80 | bool "HP Labs BadgePAD 4" | 80 | bool "HP Labs BadgePAD 4" |
81 | select CPU_FREQ_SA1100 | 81 | select ARM_SA1100_CPUFREQ |
82 | select SA1111 | 82 | select SA1111 |
83 | help | 83 | help |
84 | Say Y here if you want to build a kernel for the HP Laboratories | 84 | Say Y here if you want to build a kernel for the HP Laboratories |
@@ -86,7 +86,7 @@ config SA1100_BADGE4 | |||
86 | 86 | ||
87 | config SA1100_JORNADA720 | 87 | config SA1100_JORNADA720 |
88 | bool "HP Jornada 720" | 88 | bool "HP Jornada 720" |
89 | # FIXME: select CPU_FREQ_SA11x0 | 89 | # FIXME: select ARM_SA11x0_CPUFREQ |
90 | select SA1111 | 90 | select SA1111 |
91 | help | 91 | help |
92 | Say Y here if you want to build a kernel for the HP Jornada 720 | 92 | Say Y here if you want to build a kernel for the HP Jornada 720 |
@@ -105,14 +105,14 @@ config SA1100_JORNADA720_SSP | |||
105 | 105 | ||
106 | config SA1100_HACKKIT | 106 | config SA1100_HACKKIT |
107 | bool "HackKit Core CPU Board" | 107 | bool "HackKit Core CPU Board" |
108 | select CPU_FREQ_SA1100 | 108 | select ARM_SA1100_CPUFREQ |
109 | help | 109 | help |
110 | Say Y here to support the HackKit Core CPU Board | 110 | Say Y here to support the HackKit Core CPU Board |
111 | <http://hackkit.eletztrick.de>; | 111 | <http://hackkit.eletztrick.de>; |
112 | 112 | ||
113 | config SA1100_LART | 113 | config SA1100_LART |
114 | bool "LART" | 114 | bool "LART" |
115 | select CPU_FREQ_SA1100 | 115 | select ARM_SA1100_CPUFREQ |
116 | help | 116 | help |
117 | Say Y here if you are using the Linux Advanced Radio Terminal | 117 | Say Y here if you are using the Linux Advanced Radio Terminal |
118 | (also known as the LART). See <http://www.lartmaker.nl/> for | 118 | (also known as the LART). See <http://www.lartmaker.nl/> for |
@@ -120,7 +120,7 @@ config SA1100_LART | |||
120 | 120 | ||
121 | config SA1100_NANOENGINE | 121 | config SA1100_NANOENGINE |
122 | bool "nanoEngine" | 122 | bool "nanoEngine" |
123 | select CPU_FREQ_SA1110 | 123 | select ARM_SA1110_CPUFREQ |
124 | select PCI | 124 | select PCI |
125 | select PCI_NANOENGINE | 125 | select PCI_NANOENGINE |
126 | help | 126 | help |
@@ -130,7 +130,7 @@ config SA1100_NANOENGINE | |||
130 | 130 | ||
131 | config SA1100_PLEB | 131 | config SA1100_PLEB |
132 | bool "PLEB" | 132 | bool "PLEB" |
133 | select CPU_FREQ_SA1100 | 133 | select ARM_SA1100_CPUFREQ |
134 | help | 134 | help |
135 | Say Y here if you are using version 1 of the Portable Linux | 135 | Say Y here if you are using version 1 of the Portable Linux |
136 | Embedded Board (also known as PLEB). | 136 | Embedded Board (also known as PLEB). |
@@ -139,7 +139,7 @@ config SA1100_PLEB | |||
139 | 139 | ||
140 | config SA1100_SHANNON | 140 | config SA1100_SHANNON |
141 | bool "Shannon" | 141 | bool "Shannon" |
142 | select CPU_FREQ_SA1100 | 142 | select ARM_SA1100_CPUFREQ |
143 | help | 143 | help |
144 | The Shannon (also known as a Tuxscreen, and also as a IS2630) was a | 144 | The Shannon (also known as a Tuxscreen, and also as a IS2630) was a |
145 | limited edition webphone produced by Philips. The Shannon is a SA1100 | 145 | limited edition webphone produced by Philips. The Shannon is a SA1100 |
@@ -148,7 +148,7 @@ config SA1100_SHANNON | |||
148 | 148 | ||
149 | config SA1100_SIMPAD | 149 | config SA1100_SIMPAD |
150 | bool "Simpad" | 150 | bool "Simpad" |
151 | select CPU_FREQ_SA1110 | 151 | select ARM_SA1110_CPUFREQ |
152 | help | 152 | help |
153 | The SIEMENS webpad SIMpad is based on the StrongARM 1110. There | 153 | The SIEMENS webpad SIMpad is based on the StrongARM 1110. There |
154 | are two different versions CL4 and SL4. CL4 has 32MB RAM and 16MB | 154 | are two different versions CL4 and SL4. CL4 has 32MB RAM and 16MB |
diff --git a/arch/arm/mach-sa1100/Makefile b/arch/arm/mach-sa1100/Makefile index 1aed9e70465d..2732eef48966 100644 --- a/arch/arm/mach-sa1100/Makefile +++ b/arch/arm/mach-sa1100/Makefile | |||
@@ -8,9 +8,6 @@ obj-m := | |||
8 | obj-n := | 8 | obj-n := |
9 | obj- := | 9 | obj- := |
10 | 10 | ||
11 | obj-$(CONFIG_CPU_FREQ_SA1100) += cpu-sa1100.o | ||
12 | obj-$(CONFIG_CPU_FREQ_SA1110) += cpu-sa1110.o | ||
13 | |||
14 | # Specific board support | 11 | # Specific board support |
15 | obj-$(CONFIG_SA1100_ASSABET) += assabet.o | 12 | obj-$(CONFIG_SA1100_ASSABET) += assabet.o |
16 | obj-$(CONFIG_ASSABET_NEPONSET) += neponset.o | 13 | obj-$(CONFIG_ASSABET_NEPONSET) += neponset.o |
diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c deleted file mode 100644 index e8f4d1e19233..000000000000 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ /dev/null | |||
@@ -1,249 +0,0 @@ | |||
1 | /* | ||
2 | * cpu-sa1100.c: clock scaling for the SA1100 | ||
3 | * | ||
4 | * Copyright (C) 2000 2001, The Delft University of Technology | ||
5 | * | ||
6 | * Authors: | ||
7 | * - Johan Pouwelse (J.A.Pouwelse@its.tudelft.nl): initial version | ||
8 | * - Erik Mouw (J.A.K.Mouw@its.tudelft.nl): | ||
9 | * - major rewrite for linux-2.3.99 | ||
10 | * - rewritten for the more generic power management scheme in | ||
11 | * linux-2.4.5-rmk1 | ||
12 | * | ||
13 | * This software has been developed while working on the LART | ||
14 | * computing board (http://www.lartmaker.nl/), which is | ||
15 | * sponsored by the Mobile Multi-media Communications | ||
16 | * (http://www.mobimedia.org/) and Ubiquitous Communications | ||
17 | * (http://www.ubicom.tudelft.nl/) projects. | ||
18 | * | ||
19 | * The authors can be reached at: | ||
20 | * | ||
21 | * Erik Mouw | ||
22 | * Information and Communication Theory Group | ||
23 | * Faculty of Information Technology and Systems | ||
24 | * Delft University of Technology | ||
25 | * P.O. Box 5031 | ||
26 | * 2600 GA Delft | ||
27 | * The Netherlands | ||
28 | * | ||
29 | * | ||
30 | * This program is free software; you can redistribute it and/or modify | ||
31 | * it under the terms of the GNU General Public License as published by | ||
32 | * the Free Software Foundation; either version 2 of the License, or | ||
33 | * (at your option) any later version. | ||
34 | * | ||
35 | * This program is distributed in the hope that it will be useful, | ||
36 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
37 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
38 | * GNU General Public License for more details. | ||
39 | * | ||
40 | * You should have received a copy of the GNU General Public License | ||
41 | * along with this program; if not, write to the Free Software | ||
42 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
43 | * | ||
44 | * | ||
45 | * Theory of operations | ||
46 | * ==================== | ||
47 | * | ||
48 | * Clock scaling can be used to lower the power consumption of the CPU | ||
49 | * core. This will give you a somewhat longer running time. | ||
50 | * | ||
51 | * The SA-1100 has a single register to change the core clock speed: | ||
52 | * | ||
53 | * PPCR 0x90020014 PLL config | ||
54 | * | ||
55 | * However, the DRAM timings are closely related to the core clock | ||
56 | * speed, so we need to change these, too. The used registers are: | ||
57 | * | ||
58 | * MDCNFG 0xA0000000 DRAM config | ||
59 | * MDCAS0 0xA0000004 Access waveform | ||
60 | * MDCAS1 0xA0000008 Access waveform | ||
61 | * MDCAS2 0xA000000C Access waveform | ||
62 | * | ||
63 | * Care must be taken to change the DRAM parameters the correct way, | ||
64 | * because otherwise the DRAM becomes unusable and the kernel will | ||
65 | * crash. | ||
66 | * | ||
67 | * The simple solution to avoid a kernel crash is to put the actual | ||
68 | * clock change in ROM and jump to that code from the kernel. The main | ||
69 | * disadvantage is that the ROM has to be modified, which is not | ||
70 | * possible on all SA-1100 platforms. Another disadvantage is that | ||
71 | * jumping to ROM makes clock switching unnecessary complicated. | ||
72 | * | ||
73 | * The idea behind this driver is that the memory configuration can be | ||
74 | * changed while running from DRAM (even with interrupts turned on!) | ||
75 | * as long as all re-configuration steps yield a valid DRAM | ||
76 | * configuration. The advantages are clear: it will run on all SA-1100 | ||
77 | * platforms, and the code is very simple. | ||
78 | * | ||
79 | * If you really want to understand what is going on in | ||
80 | * sa1100_update_dram_timings(), you'll have to read sections 8.2, | ||
81 | * 9.5.7.3, and 10.2 from the "Intel StrongARM SA-1100 Microprocessor | ||
82 | * Developers Manual" (available for free from Intel). | ||
83 | * | ||
84 | */ | ||
85 | |||
86 | #include <linux/kernel.h> | ||
87 | #include <linux/types.h> | ||
88 | #include <linux/init.h> | ||
89 | #include <linux/cpufreq.h> | ||
90 | #include <linux/io.h> | ||
91 | |||
92 | #include <asm/cputype.h> | ||
93 | |||
94 | #include <mach/hardware.h> | ||
95 | |||
96 | #include "generic.h" | ||
97 | |||
98 | struct sa1100_dram_regs { | ||
99 | int speed; | ||
100 | u32 mdcnfg; | ||
101 | u32 mdcas0; | ||
102 | u32 mdcas1; | ||
103 | u32 mdcas2; | ||
104 | }; | ||
105 | |||
106 | |||
107 | static struct cpufreq_driver sa1100_driver; | ||
108 | |||
109 | static struct sa1100_dram_regs sa1100_dram_settings[] = { | ||
110 | /*speed, mdcnfg, mdcas0, mdcas1, mdcas2, clock freq */ | ||
111 | { 59000, 0x00dc88a3, 0xcccccccf, 0xfffffffc, 0xffffffff},/* 59.0 MHz */ | ||
112 | { 73700, 0x011490a3, 0xcccccccf, 0xfffffffc, 0xffffffff},/* 73.7 MHz */ | ||
113 | { 88500, 0x014e90a3, 0xcccccccf, 0xfffffffc, 0xffffffff},/* 88.5 MHz */ | ||
114 | {103200, 0x01889923, 0xcccccccf, 0xfffffffc, 0xffffffff},/* 103.2 MHz */ | ||
115 | {118000, 0x01c29923, 0x9999998f, 0xfffffff9, 0xffffffff},/* 118.0 MHz */ | ||
116 | {132700, 0x01fb2123, 0x9999998f, 0xfffffff9, 0xffffffff},/* 132.7 MHz */ | ||
117 | {147500, 0x02352123, 0x3333330f, 0xfffffff3, 0xffffffff},/* 147.5 MHz */ | ||
118 | {162200, 0x026b29a3, 0x38e38e1f, 0xfff8e38e, 0xffffffff},/* 162.2 MHz */ | ||
119 | {176900, 0x02a329a3, 0x71c71c1f, 0xfff1c71c, 0xffffffff},/* 176.9 MHz */ | ||
120 | {191700, 0x02dd31a3, 0xe38e383f, 0xffe38e38, 0xffffffff},/* 191.7 MHz */ | ||
121 | {206400, 0x03153223, 0xc71c703f, 0xffc71c71, 0xffffffff},/* 206.4 MHz */ | ||
122 | {221200, 0x034fba23, 0xc71c703f, 0xffc71c71, 0xffffffff},/* 221.2 MHz */ | ||
123 | {235900, 0x03853a23, 0xe1e1e07f, 0xe1e1e1e1, 0xffffffe1},/* 235.9 MHz */ | ||
124 | {250700, 0x03bf3aa3, 0xc3c3c07f, 0xc3c3c3c3, 0xffffffc3},/* 250.7 MHz */ | ||
125 | {265400, 0x03f7c2a3, 0xc3c3c07f, 0xc3c3c3c3, 0xffffffc3},/* 265.4 MHz */ | ||
126 | {280200, 0x0431c2a3, 0x878780ff, 0x87878787, 0xffffff87},/* 280.2 MHz */ | ||
127 | { 0, 0, 0, 0, 0 } /* last entry */ | ||
128 | }; | ||
129 | |||
130 | static void sa1100_update_dram_timings(int current_speed, int new_speed) | ||
131 | { | ||
132 | struct sa1100_dram_regs *settings = sa1100_dram_settings; | ||
133 | |||
134 | /* find speed */ | ||
135 | while (settings->speed != 0) { | ||
136 | if (new_speed == settings->speed) | ||
137 | break; | ||
138 | |||
139 | settings++; | ||
140 | } | ||
141 | |||
142 | if (settings->speed == 0) { | ||
143 | panic("%s: couldn't find dram setting for speed %d\n", | ||
144 | __func__, new_speed); | ||
145 | } | ||
146 | |||
147 | /* No risk, no fun: run with interrupts on! */ | ||
148 | if (new_speed > current_speed) { | ||
149 | /* We're going FASTER, so first relax the memory | ||
150 | * timings before changing the core frequency | ||
151 | */ | ||
152 | |||
153 | /* Half the memory access clock */ | ||
154 | MDCNFG |= MDCNFG_CDB2; | ||
155 | |||
156 | /* The order of these statements IS important, keep 8 | ||
157 | * pulses!! | ||
158 | */ | ||
159 | MDCAS2 = settings->mdcas2; | ||
160 | MDCAS1 = settings->mdcas1; | ||
161 | MDCAS0 = settings->mdcas0; | ||
162 | MDCNFG = settings->mdcnfg; | ||
163 | } else { | ||
164 | /* We're going SLOWER: first decrease the core | ||
165 | * frequency and then tighten the memory settings. | ||
166 | */ | ||
167 | |||
168 | /* Half the memory access clock */ | ||
169 | MDCNFG |= MDCNFG_CDB2; | ||
170 | |||
171 | /* The order of these statements IS important, keep 8 | ||
172 | * pulses!! | ||
173 | */ | ||
174 | MDCAS0 = settings->mdcas0; | ||
175 | MDCAS1 = settings->mdcas1; | ||
176 | MDCAS2 = settings->mdcas2; | ||
177 | MDCNFG = settings->mdcnfg; | ||
178 | } | ||
179 | } | ||
180 | |||
181 | static int sa1100_target(struct cpufreq_policy *policy, | ||
182 | unsigned int target_freq, | ||
183 | unsigned int relation) | ||
184 | { | ||
185 | unsigned int cur = sa11x0_getspeed(0); | ||
186 | unsigned int new_ppcr; | ||
187 | struct cpufreq_freqs freqs; | ||
188 | |||
189 | new_ppcr = sa11x0_freq_to_ppcr(target_freq); | ||
190 | switch (relation) { | ||
191 | case CPUFREQ_RELATION_L: | ||
192 | if (sa11x0_ppcr_to_freq(new_ppcr) > policy->max) | ||
193 | new_ppcr--; | ||
194 | break; | ||
195 | case CPUFREQ_RELATION_H: | ||
196 | if ((sa11x0_ppcr_to_freq(new_ppcr) > target_freq) && | ||
197 | (sa11x0_ppcr_to_freq(new_ppcr - 1) >= policy->min)) | ||
198 | new_ppcr--; | ||
199 | break; | ||
200 | } | ||
201 | |||
202 | freqs.old = cur; | ||
203 | freqs.new = sa11x0_ppcr_to_freq(new_ppcr); | ||
204 | freqs.cpu = 0; | ||
205 | |||
206 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
207 | |||
208 | if (freqs.new > cur) | ||
209 | sa1100_update_dram_timings(cur, freqs.new); | ||
210 | |||
211 | PPCR = new_ppcr; | ||
212 | |||
213 | if (freqs.new < cur) | ||
214 | sa1100_update_dram_timings(cur, freqs.new); | ||
215 | |||
216 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | static int __init sa1100_cpu_init(struct cpufreq_policy *policy) | ||
222 | { | ||
223 | if (policy->cpu != 0) | ||
224 | return -EINVAL; | ||
225 | policy->cur = policy->min = policy->max = sa11x0_getspeed(0); | ||
226 | policy->cpuinfo.min_freq = 59000; | ||
227 | policy->cpuinfo.max_freq = 287000; | ||
228 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | ||
229 | return 0; | ||
230 | } | ||
231 | |||
232 | static struct cpufreq_driver sa1100_driver __refdata = { | ||
233 | .flags = CPUFREQ_STICKY, | ||
234 | .verify = sa11x0_verify_speed, | ||
235 | .target = sa1100_target, | ||
236 | .get = sa11x0_getspeed, | ||
237 | .init = sa1100_cpu_init, | ||
238 | .name = "sa1100", | ||
239 | }; | ||
240 | |||
241 | static int __init sa1100_dram_init(void) | ||
242 | { | ||
243 | if (cpu_is_sa1100()) | ||
244 | return cpufreq_register_driver(&sa1100_driver); | ||
245 | else | ||
246 | return -ENODEV; | ||
247 | } | ||
248 | |||
249 | arch_initcall(sa1100_dram_init); | ||
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c deleted file mode 100644 index 48c45b0c92bb..000000000000 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ /dev/null | |||
@@ -1,408 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-sa1100/cpu-sa1110.c | ||
3 | * | ||
4 | * Copyright (C) 2001 Russell King | ||
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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * Note: there are two erratas that apply to the SA1110 here: | ||
11 | * 7 - SDRAM auto-power-up failure (rev A0) | ||
12 | * 13 - Corruption of internal register reads/writes following | ||
13 | * SDRAM reads (rev A0, B0, B1) | ||
14 | * | ||
15 | * We ignore rev. A0 and B0 devices; I don't think they're worth supporting. | ||
16 | * | ||
17 | * The SDRAM type can be passed on the command line as cpu_sa1110.sdram=type | ||
18 | */ | ||
19 | #include <linux/cpufreq.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/init.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/kernel.h> | ||
24 | #include <linux/moduleparam.h> | ||
25 | #include <linux/types.h> | ||
26 | |||
27 | #include <asm/cputype.h> | ||
28 | #include <asm/mach-types.h> | ||
29 | |||
30 | #include <mach/hardware.h> | ||
31 | |||
32 | #include "generic.h" | ||
33 | |||
34 | #undef DEBUG | ||
35 | |||
36 | struct sdram_params { | ||
37 | const char name[20]; | ||
38 | u_char rows; /* bits */ | ||
39 | u_char cas_latency; /* cycles */ | ||
40 | u_char tck; /* clock cycle time (ns) */ | ||
41 | u_char trcd; /* activate to r/w (ns) */ | ||
42 | u_char trp; /* precharge to activate (ns) */ | ||
43 | u_char twr; /* write recovery time (ns) */ | ||
44 | u_short refresh; /* refresh time for array (us) */ | ||
45 | }; | ||
46 | |||
47 | struct sdram_info { | ||
48 | u_int mdcnfg; | ||
49 | u_int mdrefr; | ||
50 | u_int mdcas[3]; | ||
51 | }; | ||
52 | |||
53 | static struct sdram_params sdram_tbl[] __initdata = { | ||
54 | { /* Toshiba TC59SM716 CL2 */ | ||
55 | .name = "TC59SM716-CL2", | ||
56 | .rows = 12, | ||
57 | .tck = 10, | ||
58 | .trcd = 20, | ||
59 | .trp = 20, | ||
60 | .twr = 10, | ||
61 | .refresh = 64000, | ||
62 | .cas_latency = 2, | ||
63 | }, { /* Toshiba TC59SM716 CL3 */ | ||
64 | .name = "TC59SM716-CL3", | ||
65 | .rows = 12, | ||
66 | .tck = 8, | ||
67 | .trcd = 20, | ||
68 | .trp = 20, | ||
69 | .twr = 8, | ||
70 | .refresh = 64000, | ||
71 | .cas_latency = 3, | ||
72 | }, { /* Samsung K4S641632D TC75 */ | ||
73 | .name = "K4S641632D", | ||
74 | .rows = 14, | ||
75 | .tck = 9, | ||
76 | .trcd = 27, | ||
77 | .trp = 20, | ||
78 | .twr = 9, | ||
79 | .refresh = 64000, | ||
80 | .cas_latency = 3, | ||
81 | }, { /* Samsung K4S281632B-1H */ | ||
82 | .name = "K4S281632B-1H", | ||
83 | .rows = 12, | ||
84 | .tck = 10, | ||
85 | .trp = 20, | ||
86 | .twr = 10, | ||
87 | .refresh = 64000, | ||
88 | .cas_latency = 3, | ||
89 | }, { /* Samsung KM416S4030CT */ | ||
90 | .name = "KM416S4030CT", | ||
91 | .rows = 13, | ||
92 | .tck = 8, | ||
93 | .trcd = 24, /* 3 CLKs */ | ||
94 | .trp = 24, /* 3 CLKs */ | ||
95 | .twr = 16, /* Trdl: 2 CLKs */ | ||
96 | .refresh = 64000, | ||
97 | .cas_latency = 3, | ||
98 | }, { /* Winbond W982516AH75L CL3 */ | ||
99 | .name = "W982516AH75L", | ||
100 | .rows = 16, | ||
101 | .tck = 8, | ||
102 | .trcd = 20, | ||
103 | .trp = 20, | ||
104 | .twr = 8, | ||
105 | .refresh = 64000, | ||
106 | .cas_latency = 3, | ||
107 | }, { /* Micron MT48LC8M16A2TG-75 */ | ||
108 | .name = "MT48LC8M16A2TG-75", | ||
109 | .rows = 12, | ||
110 | .tck = 8, | ||
111 | .trcd = 20, | ||
112 | .trp = 20, | ||
113 | .twr = 8, | ||
114 | .refresh = 64000, | ||
115 | .cas_latency = 3, | ||
116 | }, | ||
117 | }; | ||
118 | |||
119 | static struct sdram_params sdram_params; | ||
120 | |||
121 | /* | ||
122 | * Given a period in ns and frequency in khz, calculate the number of | ||
123 | * cycles of frequency in period. Note that we round up to the next | ||
124 | * cycle, even if we are only slightly over. | ||
125 | */ | ||
126 | static inline u_int ns_to_cycles(u_int ns, u_int khz) | ||
127 | { | ||
128 | return (ns * khz + 999999) / 1000000; | ||
129 | } | ||
130 | |||
131 | /* | ||
132 | * Create the MDCAS register bit pattern. | ||
133 | */ | ||
134 | static inline void set_mdcas(u_int *mdcas, int delayed, u_int rcd) | ||
135 | { | ||
136 | u_int shift; | ||
137 | |||
138 | rcd = 2 * rcd - 1; | ||
139 | shift = delayed + 1 + rcd; | ||
140 | |||
141 | mdcas[0] = (1 << rcd) - 1; | ||
142 | mdcas[0] |= 0x55555555 << shift; | ||
143 | mdcas[1] = mdcas[2] = 0x55555555 << (shift & 1); | ||
144 | } | ||
145 | |||
146 | static void | ||
147 | sdram_calculate_timing(struct sdram_info *sd, u_int cpu_khz, | ||
148 | struct sdram_params *sdram) | ||
149 | { | ||
150 | u_int mem_khz, sd_khz, trp, twr; | ||
151 | |||
152 | mem_khz = cpu_khz / 2; | ||
153 | sd_khz = mem_khz; | ||
154 | |||
155 | /* | ||
156 | * If SDCLK would invalidate the SDRAM timings, | ||
157 | * run SDCLK at half speed. | ||
158 | * | ||
159 | * CPU steppings prior to B2 must either run the memory at | ||
160 | * half speed or use delayed read latching (errata 13). | ||
161 | */ | ||
162 | if ((ns_to_cycles(sdram->tck, sd_khz) > 1) || | ||
163 | (CPU_REVISION < CPU_SA1110_B2 && sd_khz < 62000)) | ||
164 | sd_khz /= 2; | ||
165 | |||
166 | sd->mdcnfg = MDCNFG & 0x007f007f; | ||
167 | |||
168 | twr = ns_to_cycles(sdram->twr, mem_khz); | ||
169 | |||
170 | /* trp should always be >1 */ | ||
171 | trp = ns_to_cycles(sdram->trp, mem_khz) - 1; | ||
172 | if (trp < 1) | ||
173 | trp = 1; | ||
174 | |||
175 | sd->mdcnfg |= trp << 8; | ||
176 | sd->mdcnfg |= trp << 24; | ||
177 | sd->mdcnfg |= sdram->cas_latency << 12; | ||
178 | sd->mdcnfg |= sdram->cas_latency << 28; | ||
179 | sd->mdcnfg |= twr << 14; | ||
180 | sd->mdcnfg |= twr << 30; | ||
181 | |||
182 | sd->mdrefr = MDREFR & 0xffbffff0; | ||
183 | sd->mdrefr |= 7; | ||
184 | |||
185 | if (sd_khz != mem_khz) | ||
186 | sd->mdrefr |= MDREFR_K1DB2; | ||
187 | |||
188 | /* initial number of '1's in MDCAS + 1 */ | ||
189 | set_mdcas(sd->mdcas, sd_khz >= 62000, | ||
190 | ns_to_cycles(sdram->trcd, mem_khz)); | ||
191 | |||
192 | #ifdef DEBUG | ||
193 | printk(KERN_DEBUG "MDCNFG: %08x MDREFR: %08x MDCAS0: %08x MDCAS1: %08x MDCAS2: %08x\n", | ||
194 | sd->mdcnfg, sd->mdrefr, sd->mdcas[0], sd->mdcas[1], | ||
195 | sd->mdcas[2]); | ||
196 | #endif | ||
197 | } | ||
198 | |||
199 | /* | ||
200 | * Set the SDRAM refresh rate. | ||
201 | */ | ||
202 | static inline void sdram_set_refresh(u_int dri) | ||
203 | { | ||
204 | MDREFR = (MDREFR & 0xffff000f) | (dri << 4); | ||
205 | (void) MDREFR; | ||
206 | } | ||
207 | |||
208 | /* | ||
209 | * Update the refresh period. We do this such that we always refresh | ||
210 | * the SDRAMs within their permissible period. The refresh period is | ||
211 | * always a multiple of the memory clock (fixed at cpu_clock / 2). | ||
212 | * | ||
213 | * FIXME: we don't currently take account of burst accesses here, | ||
214 | * but neither do Intels DM nor Angel. | ||
215 | */ | ||
216 | static void | ||
217 | sdram_update_refresh(u_int cpu_khz, struct sdram_params *sdram) | ||
218 | { | ||
219 | u_int ns_row = (sdram->refresh * 1000) >> sdram->rows; | ||
220 | u_int dri = ns_to_cycles(ns_row, cpu_khz / 2) / 32; | ||
221 | |||
222 | #ifdef DEBUG | ||
223 | mdelay(250); | ||
224 | printk(KERN_DEBUG "new dri value = %d\n", dri); | ||
225 | #endif | ||
226 | |||
227 | sdram_set_refresh(dri); | ||
228 | } | ||
229 | |||
230 | /* | ||
231 | * Ok, set the CPU frequency. | ||
232 | */ | ||
233 | static int sa1110_target(struct cpufreq_policy *policy, | ||
234 | unsigned int target_freq, | ||
235 | unsigned int relation) | ||
236 | { | ||
237 | struct sdram_params *sdram = &sdram_params; | ||
238 | struct cpufreq_freqs freqs; | ||
239 | struct sdram_info sd; | ||
240 | unsigned long flags; | ||
241 | unsigned int ppcr, unused; | ||
242 | |||
243 | switch (relation) { | ||
244 | case CPUFREQ_RELATION_L: | ||
245 | ppcr = sa11x0_freq_to_ppcr(target_freq); | ||
246 | if (sa11x0_ppcr_to_freq(ppcr) > policy->max) | ||
247 | ppcr--; | ||
248 | break; | ||
249 | case CPUFREQ_RELATION_H: | ||
250 | ppcr = sa11x0_freq_to_ppcr(target_freq); | ||
251 | if (ppcr && (sa11x0_ppcr_to_freq(ppcr) > target_freq) && | ||
252 | (sa11x0_ppcr_to_freq(ppcr-1) >= policy->min)) | ||
253 | ppcr--; | ||
254 | break; | ||
255 | default: | ||
256 | return -EINVAL; | ||
257 | } | ||
258 | |||
259 | freqs.old = sa11x0_getspeed(0); | ||
260 | freqs.new = sa11x0_ppcr_to_freq(ppcr); | ||
261 | freqs.cpu = 0; | ||
262 | |||
263 | sdram_calculate_timing(&sd, freqs.new, sdram); | ||
264 | |||
265 | #if 0 | ||
266 | /* | ||
267 | * These values are wrong according to the SA1110 documentation | ||
268 | * and errata, but they seem to work. Need to get a storage | ||
269 | * scope on to the SDRAM signals to work out why. | ||
270 | */ | ||
271 | if (policy->max < 147500) { | ||
272 | sd.mdrefr |= MDREFR_K1DB2; | ||
273 | sd.mdcas[0] = 0xaaaaaa7f; | ||
274 | } else { | ||
275 | sd.mdrefr &= ~MDREFR_K1DB2; | ||
276 | sd.mdcas[0] = 0xaaaaaa9f; | ||
277 | } | ||
278 | sd.mdcas[1] = 0xaaaaaaaa; | ||
279 | sd.mdcas[2] = 0xaaaaaaaa; | ||
280 | #endif | ||
281 | |||
282 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
283 | |||
284 | /* | ||
285 | * The clock could be going away for some time. Set the SDRAMs | ||
286 | * to refresh rapidly (every 64 memory clock cycles). To get | ||
287 | * through the whole array, we need to wait 262144 mclk cycles. | ||
288 | * We wait 20ms to be safe. | ||
289 | */ | ||
290 | sdram_set_refresh(2); | ||
291 | if (!irqs_disabled()) | ||
292 | msleep(20); | ||
293 | else | ||
294 | mdelay(20); | ||
295 | |||
296 | /* | ||
297 | * Reprogram the DRAM timings with interrupts disabled, and | ||
298 | * ensure that we are doing this within a complete cache line. | ||
299 | * This means that we won't access SDRAM for the duration of | ||
300 | * the programming. | ||
301 | */ | ||
302 | local_irq_save(flags); | ||
303 | asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (0)); | ||
304 | udelay(10); | ||
305 | __asm__ __volatile__("\n\ | ||
306 | b 2f \n\ | ||
307 | .align 5 \n\ | ||
308 | 1: str %3, [%1, #0] @ MDCNFG \n\ | ||
309 | str %4, [%1, #28] @ MDREFR \n\ | ||
310 | str %5, [%1, #4] @ MDCAS0 \n\ | ||
311 | str %6, [%1, #8] @ MDCAS1 \n\ | ||
312 | str %7, [%1, #12] @ MDCAS2 \n\ | ||
313 | str %8, [%2, #0] @ PPCR \n\ | ||
314 | ldr %0, [%1, #0] \n\ | ||
315 | b 3f \n\ | ||
316 | 2: b 1b \n\ | ||
317 | 3: nop \n\ | ||
318 | nop" | ||
319 | : "=&r" (unused) | ||
320 | : "r" (&MDCNFG), "r" (&PPCR), "0" (sd.mdcnfg), | ||
321 | "r" (sd.mdrefr), "r" (sd.mdcas[0]), | ||
322 | "r" (sd.mdcas[1]), "r" (sd.mdcas[2]), "r" (ppcr)); | ||
323 | local_irq_restore(flags); | ||
324 | |||
325 | /* | ||
326 | * Now, return the SDRAM refresh back to normal. | ||
327 | */ | ||
328 | sdram_update_refresh(freqs.new, sdram); | ||
329 | |||
330 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
331 | |||
332 | return 0; | ||
333 | } | ||
334 | |||
335 | static int __init sa1110_cpu_init(struct cpufreq_policy *policy) | ||
336 | { | ||
337 | if (policy->cpu != 0) | ||
338 | return -EINVAL; | ||
339 | policy->cur = policy->min = policy->max = sa11x0_getspeed(0); | ||
340 | policy->cpuinfo.min_freq = 59000; | ||
341 | policy->cpuinfo.max_freq = 287000; | ||
342 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | ||
343 | return 0; | ||
344 | } | ||
345 | |||
346 | /* sa1110_driver needs __refdata because it must remain after init registers | ||
347 | * it with cpufreq_register_driver() */ | ||
348 | static struct cpufreq_driver sa1110_driver __refdata = { | ||
349 | .flags = CPUFREQ_STICKY, | ||
350 | .verify = sa11x0_verify_speed, | ||
351 | .target = sa1110_target, | ||
352 | .get = sa11x0_getspeed, | ||
353 | .init = sa1110_cpu_init, | ||
354 | .name = "sa1110", | ||
355 | }; | ||
356 | |||
357 | static struct sdram_params *sa1110_find_sdram(const char *name) | ||
358 | { | ||
359 | struct sdram_params *sdram; | ||
360 | |||
361 | for (sdram = sdram_tbl; sdram < sdram_tbl + ARRAY_SIZE(sdram_tbl); | ||
362 | sdram++) | ||
363 | if (strcmp(name, sdram->name) == 0) | ||
364 | return sdram; | ||
365 | |||
366 | return NULL; | ||
367 | } | ||
368 | |||
369 | static char sdram_name[16]; | ||
370 | |||
371 | static int __init sa1110_clk_init(void) | ||
372 | { | ||
373 | struct sdram_params *sdram; | ||
374 | const char *name = sdram_name; | ||
375 | |||
376 | if (!cpu_is_sa1110()) | ||
377 | return -ENODEV; | ||
378 | |||
379 | if (!name[0]) { | ||
380 | if (machine_is_assabet()) | ||
381 | name = "TC59SM716-CL3"; | ||
382 | if (machine_is_pt_system3()) | ||
383 | name = "K4S641632D"; | ||
384 | if (machine_is_h3100()) | ||
385 | name = "KM416S4030CT"; | ||
386 | if (machine_is_jornada720()) | ||
387 | name = "K4S281632B-1H"; | ||
388 | if (machine_is_nanoengine()) | ||
389 | name = "MT48LC8M16A2TG-75"; | ||
390 | } | ||
391 | |||
392 | sdram = sa1110_find_sdram(name); | ||
393 | if (sdram) { | ||
394 | printk(KERN_DEBUG "SDRAM: tck: %d trcd: %d trp: %d" | ||
395 | " twr: %d refresh: %d cas_latency: %d\n", | ||
396 | sdram->tck, sdram->trcd, sdram->trp, | ||
397 | sdram->twr, sdram->refresh, sdram->cas_latency); | ||
398 | |||
399 | memcpy(&sdram_params, sdram, sizeof(sdram_params)); | ||
400 | |||
401 | return cpufreq_register_driver(&sa1110_driver); | ||
402 | } | ||
403 | |||
404 | return 0; | ||
405 | } | ||
406 | |||
407 | module_param_string(sdram, sdram_name, sizeof(sdram_name), 0); | ||
408 | arch_initcall(sa1110_clk_init); | ||
diff --git a/arch/arm/mach-sa1100/include/mach/generic.h b/arch/arm/mach-sa1100/include/mach/generic.h new file mode 100644 index 000000000000..665542e0c9e2 --- /dev/null +++ b/arch/arm/mach-sa1100/include/mach/generic.h | |||
@@ -0,0 +1 @@ | |||
#include "../../generic.h" | |||
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index b63dec848195..153555724988 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/sched.h> | 10 | #include <linux/sched.h> |
11 | #include <linux/serial_8250.h> | 11 | #include <linux/serial_8250.h> |
12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <linux/cpu.h> | ||
13 | 14 | ||
14 | #include <asm/setup.h> | 15 | #include <asm/setup.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
@@ -130,7 +131,7 @@ static void __init shark_timer_init(void) | |||
130 | 131 | ||
131 | static void shark_init_early(void) | 132 | static void shark_init_early(void) |
132 | { | 133 | { |
133 | disable_hlt(); | 134 | cpu_idle_poll_ctrl(true); |
134 | } | 135 | } |
135 | 136 | ||
136 | MACHINE_START(SHARK, "Shark") | 137 | MACHINE_START(SHARK, "Shark") |
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index f2ec0777cfbe..881e5c0e41dd 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/input.h> | 26 | #include <linux/input.h> |
27 | #include <linux/platform_data/st1232_pdata.h> | ||
27 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
28 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
29 | #include <linux/gpio.h> | 30 | #include <linux/gpio.h> |
@@ -169,7 +170,7 @@ static int usbhsf_get_id(struct platform_device *pdev) | |||
169 | return USBHS_GADGET; | 170 | return USBHS_GADGET; |
170 | } | 171 | } |
171 | 172 | ||
172 | static void usbhsf_power_ctrl(struct platform_device *pdev, | 173 | static int usbhsf_power_ctrl(struct platform_device *pdev, |
173 | void __iomem *base, int enable) | 174 | void __iomem *base, int enable) |
174 | { | 175 | { |
175 | struct usbhsf_private *priv = usbhsf_get_priv(pdev); | 176 | struct usbhsf_private *priv = usbhsf_get_priv(pdev); |
@@ -223,6 +224,8 @@ static void usbhsf_power_ctrl(struct platform_device *pdev, | |||
223 | clk_disable(priv->pci); /* usb work around */ | 224 | clk_disable(priv->pci); /* usb work around */ |
224 | clk_disable(priv->usb24); /* usb work around */ | 225 | clk_disable(priv->usb24); /* usb work around */ |
225 | } | 226 | } |
227 | |||
228 | return 0; | ||
226 | } | 229 | } |
227 | 230 | ||
228 | static int usbhsf_get_vbus(struct platform_device *pdev) | 231 | static int usbhsf_get_vbus(struct platform_device *pdev) |
@@ -239,7 +242,7 @@ static irqreturn_t usbhsf_interrupt(int irq, void *data) | |||
239 | return IRQ_HANDLED; | 242 | return IRQ_HANDLED; |
240 | } | 243 | } |
241 | 244 | ||
242 | static void usbhsf_hardware_exit(struct platform_device *pdev) | 245 | static int usbhsf_hardware_exit(struct platform_device *pdev) |
243 | { | 246 | { |
244 | struct usbhsf_private *priv = usbhsf_get_priv(pdev); | 247 | struct usbhsf_private *priv = usbhsf_get_priv(pdev); |
245 | 248 | ||
@@ -264,6 +267,8 @@ static void usbhsf_hardware_exit(struct platform_device *pdev) | |||
264 | priv->usbh_base = NULL; | 267 | priv->usbh_base = NULL; |
265 | 268 | ||
266 | free_irq(IRQ7, pdev); | 269 | free_irq(IRQ7, pdev); |
270 | |||
271 | return 0; | ||
267 | } | 272 | } |
268 | 273 | ||
269 | static int usbhsf_hardware_init(struct platform_device *pdev) | 274 | static int usbhsf_hardware_init(struct platform_device *pdev) |
@@ -878,10 +883,15 @@ static struct platform_device i2c_gpio_device = { | |||
878 | }; | 883 | }; |
879 | 884 | ||
880 | /* I2C */ | 885 | /* I2C */ |
886 | static struct st1232_pdata st1232_i2c0_pdata = { | ||
887 | .reset_gpio = 166, | ||
888 | }; | ||
889 | |||
881 | static struct i2c_board_info i2c0_devices[] = { | 890 | static struct i2c_board_info i2c0_devices[] = { |
882 | { | 891 | { |
883 | I2C_BOARD_INFO("st1232-ts", 0x55), | 892 | I2C_BOARD_INFO("st1232-ts", 0x55), |
884 | .irq = evt2irq(0x0340), | 893 | .irq = evt2irq(0x0340), |
894 | .platform_data = &st1232_i2c0_pdata, | ||
885 | }, | 895 | }, |
886 | { | 896 | { |
887 | I2C_BOARD_INFO("wm8978", 0x1a), | 897 | I2C_BOARD_INFO("wm8978", 0x1a), |
@@ -1005,7 +1015,6 @@ static void __init eva_init(void) | |||
1005 | 1015 | ||
1006 | /* Touchscreen */ | 1016 | /* Touchscreen */ |
1007 | gpio_request(GPIO_FN_IRQ10, NULL); /* TP_INT */ | 1017 | gpio_request(GPIO_FN_IRQ10, NULL); /* TP_INT */ |
1008 | gpio_request_one(GPIO_PORT166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */ | ||
1009 | 1018 | ||
1010 | /* GETHER */ | 1019 | /* GETHER */ |
1011 | gpio_request(GPIO_FN_ET_CRS, NULL); | 1020 | gpio_request(GPIO_FN_ET_CRS, NULL); |
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index 7f3a6b7e7b7c..a385f570bbfc 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c | |||
@@ -155,12 +155,14 @@ static int usbhs_get_vbus(struct platform_device *pdev) | |||
155 | return !((1 << 7) & __raw_readw(priv->cr2)); | 155 | return !((1 << 7) & __raw_readw(priv->cr2)); |
156 | } | 156 | } |
157 | 157 | ||
158 | static void usbhs_phy_reset(struct platform_device *pdev) | 158 | static int usbhs_phy_reset(struct platform_device *pdev) |
159 | { | 159 | { |
160 | struct usbhs_private *priv = usbhs_get_priv(pdev); | 160 | struct usbhs_private *priv = usbhs_get_priv(pdev); |
161 | 161 | ||
162 | /* init phy */ | 162 | /* init phy */ |
163 | __raw_writew(0x8a0a, priv->cr2); | 163 | __raw_writew(0x8a0a, priv->cr2); |
164 | |||
165 | return 0; | ||
164 | } | 166 | } |
165 | 167 | ||
166 | static int usbhs_get_id(struct platform_device *pdev) | 168 | static int usbhs_get_id(struct platform_device *pdev) |
@@ -202,7 +204,7 @@ static int usbhs_hardware_init(struct platform_device *pdev) | |||
202 | return 0; | 204 | return 0; |
203 | } | 205 | } |
204 | 206 | ||
205 | static void usbhs_hardware_exit(struct platform_device *pdev) | 207 | static int usbhs_hardware_exit(struct platform_device *pdev) |
206 | { | 208 | { |
207 | struct usbhs_private *priv = usbhs_get_priv(pdev); | 209 | struct usbhs_private *priv = usbhs_get_priv(pdev); |
208 | 210 | ||
@@ -210,6 +212,8 @@ static void usbhs_hardware_exit(struct platform_device *pdev) | |||
210 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy); | 212 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->phy); |
211 | 213 | ||
212 | free_irq(IRQ15, pdev); | 214 | free_irq(IRQ15, pdev); |
215 | |||
216 | return 0; | ||
213 | } | 217 | } |
214 | 218 | ||
215 | static u32 usbhs_pipe_cfg[] = { | 219 | static u32 usbhs_pipe_cfg[] = { |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index db968a585ff0..979237c18dad 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
@@ -596,12 +596,14 @@ static int usbhs_get_vbus(struct platform_device *pdev) | |||
596 | return usbhs_is_connected(usbhs_get_priv(pdev)); | 596 | return usbhs_is_connected(usbhs_get_priv(pdev)); |
597 | } | 597 | } |
598 | 598 | ||
599 | static void usbhs_phy_reset(struct platform_device *pdev) | 599 | static int usbhs_phy_reset(struct platform_device *pdev) |
600 | { | 600 | { |
601 | struct usbhs_private *priv = usbhs_get_priv(pdev); | 601 | struct usbhs_private *priv = usbhs_get_priv(pdev); |
602 | 602 | ||
603 | /* init phy */ | 603 | /* init phy */ |
604 | __raw_writew(0x8a0a, priv->usbcrcaddr); | 604 | __raw_writew(0x8a0a, priv->usbcrcaddr); |
605 | |||
606 | return 0; | ||
605 | } | 607 | } |
606 | 608 | ||
607 | static int usbhs0_get_id(struct platform_device *pdev) | 609 | static int usbhs0_get_id(struct platform_device *pdev) |
@@ -628,11 +630,13 @@ static int usbhs0_hardware_init(struct platform_device *pdev) | |||
628 | return 0; | 630 | return 0; |
629 | } | 631 | } |
630 | 632 | ||
631 | static void usbhs0_hardware_exit(struct platform_device *pdev) | 633 | static int usbhs0_hardware_exit(struct platform_device *pdev) |
632 | { | 634 | { |
633 | struct usbhs_private *priv = usbhs_get_priv(pdev); | 635 | struct usbhs_private *priv = usbhs_get_priv(pdev); |
634 | 636 | ||
635 | cancel_delayed_work_sync(&priv->work); | 637 | cancel_delayed_work_sync(&priv->work); |
638 | |||
639 | return 0; | ||
636 | } | 640 | } |
637 | 641 | ||
638 | static struct usbhs_private usbhs0_private = { | 642 | static struct usbhs_private usbhs0_private = { |
@@ -735,7 +739,7 @@ static int usbhs1_hardware_init(struct platform_device *pdev) | |||
735 | return 0; | 739 | return 0; |
736 | } | 740 | } |
737 | 741 | ||
738 | static void usbhs1_hardware_exit(struct platform_device *pdev) | 742 | static int usbhs1_hardware_exit(struct platform_device *pdev) |
739 | { | 743 | { |
740 | struct usbhs_private *priv = usbhs_get_priv(pdev); | 744 | struct usbhs_private *priv = usbhs_get_priv(pdev); |
741 | 745 | ||
@@ -743,6 +747,8 @@ static void usbhs1_hardware_exit(struct platform_device *pdev) | |||
743 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); | 747 | __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); |
744 | 748 | ||
745 | free_irq(IRQ8, pdev); | 749 | free_irq(IRQ8, pdev); |
750 | |||
751 | return 0; | ||
746 | } | 752 | } |
747 | 753 | ||
748 | static int usbhs1_get_id(struct platform_device *pdev) | 754 | static int usbhs1_get_id(struct platform_device *pdev) |
diff --git a/arch/arm/mach-shmobile/cpuidle.c b/arch/arm/mach-shmobile/cpuidle.c index 9e050268cde4..0afeb5c7061c 100644 --- a/arch/arm/mach-shmobile/cpuidle.c +++ b/arch/arm/mach-shmobile/cpuidle.c | |||
@@ -16,39 +16,22 @@ | |||
16 | #include <asm/cpuidle.h> | 16 | #include <asm/cpuidle.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | 18 | ||
19 | int shmobile_enter_wfi(struct cpuidle_device *dev, struct cpuidle_driver *drv, | ||
20 | int index) | ||
21 | { | ||
22 | cpu_do_idle(); | ||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | static struct cpuidle_device shmobile_cpuidle_dev; | ||
27 | static struct cpuidle_driver shmobile_cpuidle_default_driver = { | 19 | static struct cpuidle_driver shmobile_cpuidle_default_driver = { |
28 | .name = "shmobile_cpuidle", | 20 | .name = "shmobile_cpuidle", |
29 | .owner = THIS_MODULE, | 21 | .owner = THIS_MODULE, |
30 | .en_core_tk_irqen = 1, | ||
31 | .states[0] = ARM_CPUIDLE_WFI_STATE, | 22 | .states[0] = ARM_CPUIDLE_WFI_STATE, |
32 | .states[0].enter = shmobile_enter_wfi, | ||
33 | .safe_state_index = 0, /* C1 */ | 23 | .safe_state_index = 0, /* C1 */ |
34 | .state_count = 1, | 24 | .state_count = 1, |
35 | }; | 25 | }; |
36 | 26 | ||
37 | static struct cpuidle_driver *cpuidle_drv = &shmobile_cpuidle_default_driver; | 27 | static struct cpuidle_driver *cpuidle_drv = &shmobile_cpuidle_default_driver; |
38 | 28 | ||
39 | void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv) | 29 | void __init shmobile_cpuidle_set_driver(struct cpuidle_driver *drv) |
40 | { | 30 | { |
41 | cpuidle_drv = drv; | 31 | cpuidle_drv = drv; |
42 | } | 32 | } |
43 | 33 | ||
44 | int shmobile_cpuidle_init(void) | 34 | int __init shmobile_cpuidle_init(void) |
45 | { | 35 | { |
46 | struct cpuidle_device *dev = &shmobile_cpuidle_dev; | 36 | return cpuidle_register(cpuidle_drv, NULL); |
47 | |||
48 | cpuidle_register_driver(cpuidle_drv); | ||
49 | |||
50 | dev->state_count = cpuidle_drv->state_count; | ||
51 | cpuidle_register_device(dev); | ||
52 | |||
53 | return 0; | ||
54 | } | 37 | } |
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index e48606d8a2be..362f9b2d2c02 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -13,9 +13,6 @@ extern int shmobile_clk_init(void); | |||
13 | extern void shmobile_handle_irq_intc(struct pt_regs *); | 13 | extern void shmobile_handle_irq_intc(struct pt_regs *); |
14 | extern struct platform_suspend_ops shmobile_suspend_ops; | 14 | extern struct platform_suspend_ops shmobile_suspend_ops; |
15 | struct cpuidle_driver; | 15 | struct cpuidle_driver; |
16 | struct cpuidle_device; | ||
17 | extern int shmobile_enter_wfi(struct cpuidle_device *dev, | ||
18 | struct cpuidle_driver *drv, int index); | ||
19 | extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv); | 16 | extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv); |
20 | 17 | ||
21 | extern void sh7372_init_irq(void); | 18 | extern void sh7372_init_irq(void); |
diff --git a/arch/arm/mach-shmobile/pm-sh7372.c b/arch/arm/mach-shmobile/pm-sh7372.c index a0826a48dd08..dec9293bb90d 100644 --- a/arch/arm/mach-shmobile/pm-sh7372.c +++ b/arch/arm/mach-shmobile/pm-sh7372.c | |||
@@ -410,11 +410,9 @@ static int sh7372_enter_a4s(struct cpuidle_device *dev, | |||
410 | static struct cpuidle_driver sh7372_cpuidle_driver = { | 410 | static struct cpuidle_driver sh7372_cpuidle_driver = { |
411 | .name = "sh7372_cpuidle", | 411 | .name = "sh7372_cpuidle", |
412 | .owner = THIS_MODULE, | 412 | .owner = THIS_MODULE, |
413 | .en_core_tk_irqen = 1, | ||
414 | .state_count = 5, | 413 | .state_count = 5, |
415 | .safe_state_index = 0, /* C1 */ | 414 | .safe_state_index = 0, /* C1 */ |
416 | .states[0] = ARM_CPUIDLE_WFI_STATE, | 415 | .states[0] = ARM_CPUIDLE_WFI_STATE, |
417 | .states[0].enter = shmobile_enter_wfi, | ||
418 | .states[1] = { | 416 | .states[1] = { |
419 | .name = "C2", | 417 | .name = "C2", |
420 | .desc = "Core Standby Mode", | 418 | .desc = "Core Standby Mode", |
@@ -450,12 +448,12 @@ static struct cpuidle_driver sh7372_cpuidle_driver = { | |||
450 | }, | 448 | }, |
451 | }; | 449 | }; |
452 | 450 | ||
453 | static void sh7372_cpuidle_init(void) | 451 | static void __init sh7372_cpuidle_init(void) |
454 | { | 452 | { |
455 | shmobile_cpuidle_set_driver(&sh7372_cpuidle_driver); | 453 | shmobile_cpuidle_set_driver(&sh7372_cpuidle_driver); |
456 | } | 454 | } |
457 | #else | 455 | #else |
458 | static void sh7372_cpuidle_init(void) {} | 456 | static void __init sh7372_cpuidle_init(void) {} |
459 | #endif | 457 | #endif |
460 | 458 | ||
461 | #ifdef CONFIG_SUSPEND | 459 | #ifdef CONFIG_SUSPEND |
diff --git a/arch/arm/mach-shmobile/suspend.c b/arch/arm/mach-shmobile/suspend.c index 47d83f7a70b6..5d92b5dd486b 100644 --- a/arch/arm/mach-shmobile/suspend.c +++ b/arch/arm/mach-shmobile/suspend.c | |||
@@ -12,6 +12,8 @@ | |||
12 | #include <linux/suspend.h> | 12 | #include <linux/suspend.h> |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/err.h> | 14 | #include <linux/err.h> |
15 | #include <linux/cpu.h> | ||
16 | |||
15 | #include <asm/io.h> | 17 | #include <asm/io.h> |
16 | #include <asm/system_misc.h> | 18 | #include <asm/system_misc.h> |
17 | 19 | ||
@@ -23,13 +25,13 @@ static int shmobile_suspend_default_enter(suspend_state_t suspend_state) | |||
23 | 25 | ||
24 | static int shmobile_suspend_begin(suspend_state_t state) | 26 | static int shmobile_suspend_begin(suspend_state_t state) |
25 | { | 27 | { |
26 | disable_hlt(); | 28 | cpu_idle_poll_ctrl(true); |
27 | return 0; | 29 | return 0; |
28 | } | 30 | } |
29 | 31 | ||
30 | static void shmobile_suspend_end(void) | 32 | static void shmobile_suspend_end(void) |
31 | { | 33 | { |
32 | enable_hlt(); | 34 | cpu_idle_poll_ctrl(false); |
33 | } | 35 | } |
34 | 36 | ||
35 | struct platform_suspend_ops shmobile_suspend_ops = { | 37 | struct platform_suspend_ops shmobile_suspend_ops = { |
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index d1c4893894ce..dbc653ea851c 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig | |||
@@ -18,8 +18,8 @@ config ARCH_TEGRA_2x_SOC | |||
18 | select PL310_ERRATA_727915 if CACHE_L2X0 | 18 | select PL310_ERRATA_727915 if CACHE_L2X0 |
19 | select PL310_ERRATA_769419 if CACHE_L2X0 | 19 | select PL310_ERRATA_769419 if CACHE_L2X0 |
20 | select USB_ARCH_HAS_EHCI if USB_SUPPORT | 20 | select USB_ARCH_HAS_EHCI if USB_SUPPORT |
21 | select USB_ULPI if USB | 21 | select USB_ULPI if USB_PHY |
22 | select USB_ULPI_VIEWPORT if USB_SUPPORT | 22 | select USB_ULPI_VIEWPORT if USB_PHY |
23 | help | 23 | help |
24 | Support for NVIDIA Tegra AP20 and T20 processors, based on the | 24 | Support for NVIDIA Tegra AP20 and T20 processors, based on the |
25 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller | 25 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller |
@@ -37,8 +37,8 @@ config ARCH_TEGRA_3x_SOC | |||
37 | select PINCTRL_TEGRA30 | 37 | select PINCTRL_TEGRA30 |
38 | select PL310_ERRATA_769419 if CACHE_L2X0 | 38 | select PL310_ERRATA_769419 if CACHE_L2X0 |
39 | select USB_ARCH_HAS_EHCI if USB_SUPPORT | 39 | select USB_ARCH_HAS_EHCI if USB_SUPPORT |
40 | select USB_ULPI if USB | 40 | select USB_ULPI if USB_PHY |
41 | select USB_ULPI_VIEWPORT if USB_SUPPORT | 41 | select USB_ULPI_VIEWPORT if USB_PHY |
42 | help | 42 | help |
43 | Support for NVIDIA Tegra T30 processor family, based on the | 43 | Support for NVIDIA Tegra T30 processor family, based on the |
44 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller | 44 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller |
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 92703f955a37..c1970005f805 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile | |||
@@ -25,7 +25,6 @@ obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += cpuidle-tegra30.o | |||
25 | endif | 25 | endif |
26 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 26 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
27 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 27 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
28 | obj-$(CONFIG_CPU_FREQ) += cpu-tegra.o | ||
29 | obj-$(CONFIG_TEGRA_PCI) += pcie.o | 28 | obj-$(CONFIG_TEGRA_PCI) += pcie.o |
30 | 29 | ||
31 | ifeq ($(CONFIG_CPU_IDLE),y) | 30 | ifeq ($(CONFIG_CPU_IDLE),y) |
diff --git a/arch/arm/mach-tegra/cpu-tegra.c b/arch/arm/mach-tegra/cpu-tegra.c deleted file mode 100644 index e3d6e15ff188..000000000000 --- a/arch/arm/mach-tegra/cpu-tegra.c +++ /dev/null | |||
@@ -1,293 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/cpu-tegra.c | ||
3 | * | ||
4 | * Copyright (C) 2010 Google, Inc. | ||
5 | * | ||
6 | * Author: | ||
7 | * Colin Cross <ccross@google.com> | ||
8 | * Based on arch/arm/plat-omap/cpu-omap.c, (C) 2005 Nokia Corporation | ||
9 | * | ||
10 | * This software is licensed under the terms of the GNU General Public | ||
11 | * License version 2, as published by the Free Software Foundation, and | ||
12 | * may be copied, distributed, and modified under those terms. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/types.h> | ||
24 | #include <linux/sched.h> | ||
25 | #include <linux/cpufreq.h> | ||
26 | #include <linux/delay.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <linux/err.h> | ||
29 | #include <linux/clk.h> | ||
30 | #include <linux/io.h> | ||
31 | #include <linux/suspend.h> | ||
32 | |||
33 | /* Frequency table index must be sequential starting at 0 */ | ||
34 | static struct cpufreq_frequency_table freq_table[] = { | ||
35 | { 0, 216000 }, | ||
36 | { 1, 312000 }, | ||
37 | { 2, 456000 }, | ||
38 | { 3, 608000 }, | ||
39 | { 4, 760000 }, | ||
40 | { 5, 816000 }, | ||
41 | { 6, 912000 }, | ||
42 | { 7, 1000000 }, | ||
43 | { 8, CPUFREQ_TABLE_END }, | ||
44 | }; | ||
45 | |||
46 | #define NUM_CPUS 2 | ||
47 | |||
48 | static struct clk *cpu_clk; | ||
49 | static struct clk *pll_x_clk; | ||
50 | static struct clk *pll_p_clk; | ||
51 | static struct clk *emc_clk; | ||
52 | |||
53 | static unsigned long target_cpu_speed[NUM_CPUS]; | ||
54 | static DEFINE_MUTEX(tegra_cpu_lock); | ||
55 | static bool is_suspended; | ||
56 | |||
57 | static int tegra_verify_speed(struct cpufreq_policy *policy) | ||
58 | { | ||
59 | return cpufreq_frequency_table_verify(policy, freq_table); | ||
60 | } | ||
61 | |||
62 | static unsigned int tegra_getspeed(unsigned int cpu) | ||
63 | { | ||
64 | unsigned long rate; | ||
65 | |||
66 | if (cpu >= NUM_CPUS) | ||
67 | return 0; | ||
68 | |||
69 | rate = clk_get_rate(cpu_clk) / 1000; | ||
70 | return rate; | ||
71 | } | ||
72 | |||
73 | static int tegra_cpu_clk_set_rate(unsigned long rate) | ||
74 | { | ||
75 | int ret; | ||
76 | |||
77 | /* | ||
78 | * Take an extra reference to the main pll so it doesn't turn | ||
79 | * off when we move the cpu off of it | ||
80 | */ | ||
81 | clk_prepare_enable(pll_x_clk); | ||
82 | |||
83 | ret = clk_set_parent(cpu_clk, pll_p_clk); | ||
84 | if (ret) { | ||
85 | pr_err("Failed to switch cpu to clock pll_p\n"); | ||
86 | goto out; | ||
87 | } | ||
88 | |||
89 | if (rate == clk_get_rate(pll_p_clk)) | ||
90 | goto out; | ||
91 | |||
92 | ret = clk_set_rate(pll_x_clk, rate); | ||
93 | if (ret) { | ||
94 | pr_err("Failed to change pll_x to %lu\n", rate); | ||
95 | goto out; | ||
96 | } | ||
97 | |||
98 | ret = clk_set_parent(cpu_clk, pll_x_clk); | ||
99 | if (ret) { | ||
100 | pr_err("Failed to switch cpu to clock pll_x\n"); | ||
101 | goto out; | ||
102 | } | ||
103 | |||
104 | out: | ||
105 | clk_disable_unprepare(pll_x_clk); | ||
106 | return ret; | ||
107 | } | ||
108 | |||
109 | static int tegra_update_cpu_speed(unsigned long rate) | ||
110 | { | ||
111 | int ret = 0; | ||
112 | struct cpufreq_freqs freqs; | ||
113 | |||
114 | freqs.old = tegra_getspeed(0); | ||
115 | freqs.new = rate; | ||
116 | |||
117 | if (freqs.old == freqs.new) | ||
118 | return ret; | ||
119 | |||
120 | /* | ||
121 | * Vote on memory bus frequency based on cpu frequency | ||
122 | * This sets the minimum frequency, display or avp may request higher | ||
123 | */ | ||
124 | if (rate >= 816000) | ||
125 | clk_set_rate(emc_clk, 600000000); /* cpu 816 MHz, emc max */ | ||
126 | else if (rate >= 456000) | ||
127 | clk_set_rate(emc_clk, 300000000); /* cpu 456 MHz, emc 150Mhz */ | ||
128 | else | ||
129 | clk_set_rate(emc_clk, 100000000); /* emc 50Mhz */ | ||
130 | |||
131 | for_each_online_cpu(freqs.cpu) | ||
132 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | ||
133 | |||
134 | #ifdef CONFIG_CPU_FREQ_DEBUG | ||
135 | printk(KERN_DEBUG "cpufreq-tegra: transition: %u --> %u\n", | ||
136 | freqs.old, freqs.new); | ||
137 | #endif | ||
138 | |||
139 | ret = tegra_cpu_clk_set_rate(freqs.new * 1000); | ||
140 | if (ret) { | ||
141 | pr_err("cpu-tegra: Failed to set cpu frequency to %d kHz\n", | ||
142 | freqs.new); | ||
143 | return ret; | ||
144 | } | ||
145 | |||
146 | for_each_online_cpu(freqs.cpu) | ||
147 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static unsigned long tegra_cpu_highest_speed(void) | ||
153 | { | ||
154 | unsigned long rate = 0; | ||
155 | int i; | ||
156 | |||
157 | for_each_online_cpu(i) | ||
158 | rate = max(rate, target_cpu_speed[i]); | ||
159 | return rate; | ||
160 | } | ||
161 | |||
162 | static int tegra_target(struct cpufreq_policy *policy, | ||
163 | unsigned int target_freq, | ||
164 | unsigned int relation) | ||
165 | { | ||
166 | unsigned int idx; | ||
167 | unsigned int freq; | ||
168 | int ret = 0; | ||
169 | |||
170 | mutex_lock(&tegra_cpu_lock); | ||
171 | |||
172 | if (is_suspended) { | ||
173 | ret = -EBUSY; | ||
174 | goto out; | ||
175 | } | ||
176 | |||
177 | cpufreq_frequency_table_target(policy, freq_table, target_freq, | ||
178 | relation, &idx); | ||
179 | |||
180 | freq = freq_table[idx].frequency; | ||
181 | |||
182 | target_cpu_speed[policy->cpu] = freq; | ||
183 | |||
184 | ret = tegra_update_cpu_speed(tegra_cpu_highest_speed()); | ||
185 | |||
186 | out: | ||
187 | mutex_unlock(&tegra_cpu_lock); | ||
188 | return ret; | ||
189 | } | ||
190 | |||
191 | static int tegra_pm_notify(struct notifier_block *nb, unsigned long event, | ||
192 | void *dummy) | ||
193 | { | ||
194 | mutex_lock(&tegra_cpu_lock); | ||
195 | if (event == PM_SUSPEND_PREPARE) { | ||
196 | is_suspended = true; | ||
197 | pr_info("Tegra cpufreq suspend: setting frequency to %d kHz\n", | ||
198 | freq_table[0].frequency); | ||
199 | tegra_update_cpu_speed(freq_table[0].frequency); | ||
200 | } else if (event == PM_POST_SUSPEND) { | ||
201 | is_suspended = false; | ||
202 | } | ||
203 | mutex_unlock(&tegra_cpu_lock); | ||
204 | |||
205 | return NOTIFY_OK; | ||
206 | } | ||
207 | |||
208 | static struct notifier_block tegra_cpu_pm_notifier = { | ||
209 | .notifier_call = tegra_pm_notify, | ||
210 | }; | ||
211 | |||
212 | static int tegra_cpu_init(struct cpufreq_policy *policy) | ||
213 | { | ||
214 | if (policy->cpu >= NUM_CPUS) | ||
215 | return -EINVAL; | ||
216 | |||
217 | clk_prepare_enable(emc_clk); | ||
218 | clk_prepare_enable(cpu_clk); | ||
219 | |||
220 | cpufreq_frequency_table_cpuinfo(policy, freq_table); | ||
221 | cpufreq_frequency_table_get_attr(freq_table, policy->cpu); | ||
222 | policy->cur = tegra_getspeed(policy->cpu); | ||
223 | target_cpu_speed[policy->cpu] = policy->cur; | ||
224 | |||
225 | /* FIXME: what's the actual transition time? */ | ||
226 | policy->cpuinfo.transition_latency = 300 * 1000; | ||
227 | |||
228 | cpumask_copy(policy->cpus, cpu_possible_mask); | ||
229 | |||
230 | if (policy->cpu == 0) | ||
231 | register_pm_notifier(&tegra_cpu_pm_notifier); | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static int tegra_cpu_exit(struct cpufreq_policy *policy) | ||
237 | { | ||
238 | cpufreq_frequency_table_cpuinfo(policy, freq_table); | ||
239 | clk_disable_unprepare(emc_clk); | ||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | static struct freq_attr *tegra_cpufreq_attr[] = { | ||
244 | &cpufreq_freq_attr_scaling_available_freqs, | ||
245 | NULL, | ||
246 | }; | ||
247 | |||
248 | static struct cpufreq_driver tegra_cpufreq_driver = { | ||
249 | .verify = tegra_verify_speed, | ||
250 | .target = tegra_target, | ||
251 | .get = tegra_getspeed, | ||
252 | .init = tegra_cpu_init, | ||
253 | .exit = tegra_cpu_exit, | ||
254 | .name = "tegra", | ||
255 | .attr = tegra_cpufreq_attr, | ||
256 | }; | ||
257 | |||
258 | static int __init tegra_cpufreq_init(void) | ||
259 | { | ||
260 | cpu_clk = clk_get_sys(NULL, "cpu"); | ||
261 | if (IS_ERR(cpu_clk)) | ||
262 | return PTR_ERR(cpu_clk); | ||
263 | |||
264 | pll_x_clk = clk_get_sys(NULL, "pll_x"); | ||
265 | if (IS_ERR(pll_x_clk)) | ||
266 | return PTR_ERR(pll_x_clk); | ||
267 | |||
268 | pll_p_clk = clk_get_sys(NULL, "pll_p_cclk"); | ||
269 | if (IS_ERR(pll_p_clk)) | ||
270 | return PTR_ERR(pll_p_clk); | ||
271 | |||
272 | emc_clk = clk_get_sys("cpu", "emc"); | ||
273 | if (IS_ERR(emc_clk)) { | ||
274 | clk_put(cpu_clk); | ||
275 | return PTR_ERR(emc_clk); | ||
276 | } | ||
277 | |||
278 | return cpufreq_register_driver(&tegra_cpufreq_driver); | ||
279 | } | ||
280 | |||
281 | static void __exit tegra_cpufreq_exit(void) | ||
282 | { | ||
283 | cpufreq_unregister_driver(&tegra_cpufreq_driver); | ||
284 | clk_put(emc_clk); | ||
285 | clk_put(cpu_clk); | ||
286 | } | ||
287 | |||
288 | |||
289 | MODULE_AUTHOR("Colin Cross <ccross@android.com>"); | ||
290 | MODULE_DESCRIPTION("cpufreq driver for Nvidia Tegra2"); | ||
291 | MODULE_LICENSE("GPL"); | ||
292 | module_init(tegra_cpufreq_init); | ||
293 | module_exit(tegra_cpufreq_exit); | ||
diff --git a/arch/arm/mach-tegra/cpuidle-tegra114.c b/arch/arm/mach-tegra/cpuidle-tegra114.c index 0f4e8c483b34..1d1c6023f4a2 100644 --- a/arch/arm/mach-tegra/cpuidle-tegra114.c +++ b/arch/arm/mach-tegra/cpuidle-tegra114.c | |||
@@ -23,39 +23,13 @@ | |||
23 | static struct cpuidle_driver tegra_idle_driver = { | 23 | static struct cpuidle_driver tegra_idle_driver = { |
24 | .name = "tegra_idle", | 24 | .name = "tegra_idle", |
25 | .owner = THIS_MODULE, | 25 | .owner = THIS_MODULE, |
26 | .en_core_tk_irqen = 1, | ||
27 | .state_count = 1, | 26 | .state_count = 1, |
28 | .states = { | 27 | .states = { |
29 | [0] = ARM_CPUIDLE_WFI_STATE_PWR(600), | 28 | [0] = ARM_CPUIDLE_WFI_STATE_PWR(600), |
30 | }, | 29 | }, |
31 | }; | 30 | }; |
32 | 31 | ||
33 | static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); | ||
34 | |||
35 | int __init tegra114_cpuidle_init(void) | 32 | int __init tegra114_cpuidle_init(void) |
36 | { | 33 | { |
37 | int ret; | 34 | return cpuidle_register(&tegra_idle_driver, NULL); |
38 | unsigned int cpu; | ||
39 | struct cpuidle_device *dev; | ||
40 | struct cpuidle_driver *drv = &tegra_idle_driver; | ||
41 | |||
42 | ret = cpuidle_register_driver(&tegra_idle_driver); | ||
43 | if (ret) { | ||
44 | pr_err("CPUidle driver registration failed\n"); | ||
45 | return ret; | ||
46 | } | ||
47 | |||
48 | for_each_possible_cpu(cpu) { | ||
49 | dev = &per_cpu(tegra_idle_device, cpu); | ||
50 | dev->cpu = cpu; | ||
51 | |||
52 | dev->state_count = drv->state_count; | ||
53 | ret = cpuidle_register_device(dev); | ||
54 | if (ret) { | ||
55 | pr_err("CPU%u: CPUidle device registration failed\n", | ||
56 | cpu); | ||
57 | return ret; | ||
58 | } | ||
59 | } | ||
60 | return 0; | ||
61 | } | 35 | } |
diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c index 825ced4f7a40..590ec25855dd 100644 --- a/arch/arm/mach-tegra/cpuidle-tegra20.c +++ b/arch/arm/mach-tegra/cpuidle-tegra20.c | |||
@@ -43,32 +43,33 @@ static atomic_t abort_barrier; | |||
43 | static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, | 43 | static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, |
44 | struct cpuidle_driver *drv, | 44 | struct cpuidle_driver *drv, |
45 | int index); | 45 | int index); |
46 | #define TEGRA20_MAX_STATES 2 | ||
47 | #else | ||
48 | #define TEGRA20_MAX_STATES 1 | ||
46 | #endif | 49 | #endif |
47 | 50 | ||
48 | static struct cpuidle_state tegra_idle_states[] = { | ||
49 | [0] = ARM_CPUIDLE_WFI_STATE_PWR(600), | ||
50 | #ifdef CONFIG_PM_SLEEP | ||
51 | [1] = { | ||
52 | .enter = tegra20_idle_lp2_coupled, | ||
53 | .exit_latency = 5000, | ||
54 | .target_residency = 10000, | ||
55 | .power_usage = 0, | ||
56 | .flags = CPUIDLE_FLAG_TIME_VALID | | ||
57 | CPUIDLE_FLAG_COUPLED, | ||
58 | .name = "powered-down", | ||
59 | .desc = "CPU power gated", | ||
60 | }, | ||
61 | #endif | ||
62 | }; | ||
63 | |||
64 | static struct cpuidle_driver tegra_idle_driver = { | 51 | static struct cpuidle_driver tegra_idle_driver = { |
65 | .name = "tegra_idle", | 52 | .name = "tegra_idle", |
66 | .owner = THIS_MODULE, | 53 | .owner = THIS_MODULE, |
67 | .en_core_tk_irqen = 1, | 54 | .states = { |
55 | ARM_CPUIDLE_WFI_STATE_PWR(600), | ||
56 | #ifdef CONFIG_PM_SLEEP | ||
57 | { | ||
58 | .enter = tegra20_idle_lp2_coupled, | ||
59 | .exit_latency = 5000, | ||
60 | .target_residency = 10000, | ||
61 | .power_usage = 0, | ||
62 | .flags = CPUIDLE_FLAG_TIME_VALID | | ||
63 | CPUIDLE_FLAG_COUPLED, | ||
64 | .name = "powered-down", | ||
65 | .desc = "CPU power gated", | ||
66 | }, | ||
67 | #endif | ||
68 | }, | ||
69 | .state_count = TEGRA20_MAX_STATES, | ||
70 | .safe_state_index = 0, | ||
68 | }; | 71 | }; |
69 | 72 | ||
70 | static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); | ||
71 | |||
72 | #ifdef CONFIG_PM_SLEEP | 73 | #ifdef CONFIG_PM_SLEEP |
73 | #ifdef CONFIG_SMP | 74 | #ifdef CONFIG_SMP |
74 | static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); | 75 | static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); |
@@ -217,39 +218,8 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, | |||
217 | 218 | ||
218 | int __init tegra20_cpuidle_init(void) | 219 | int __init tegra20_cpuidle_init(void) |
219 | { | 220 | { |
220 | int ret; | ||
221 | unsigned int cpu; | ||
222 | struct cpuidle_device *dev; | ||
223 | struct cpuidle_driver *drv = &tegra_idle_driver; | ||
224 | |||
225 | #ifdef CONFIG_PM_SLEEP | 221 | #ifdef CONFIG_PM_SLEEP |
226 | tegra_tear_down_cpu = tegra20_tear_down_cpu; | 222 | tegra_tear_down_cpu = tegra20_tear_down_cpu; |
227 | #endif | 223 | #endif |
228 | 224 | return cpuidle_register(&tegra_idle_driver, cpu_possible_mask); | |
229 | drv->state_count = ARRAY_SIZE(tegra_idle_states); | ||
230 | memcpy(drv->states, tegra_idle_states, | ||
231 | drv->state_count * sizeof(drv->states[0])); | ||
232 | |||
233 | ret = cpuidle_register_driver(&tegra_idle_driver); | ||
234 | if (ret) { | ||
235 | pr_err("CPUidle driver registration failed\n"); | ||
236 | return ret; | ||
237 | } | ||
238 | |||
239 | for_each_possible_cpu(cpu) { | ||
240 | dev = &per_cpu(tegra_idle_device, cpu); | ||
241 | dev->cpu = cpu; | ||
242 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | ||
243 | dev->coupled_cpus = *cpu_possible_mask; | ||
244 | #endif | ||
245 | |||
246 | dev->state_count = drv->state_count; | ||
247 | ret = cpuidle_register_device(dev); | ||
248 | if (ret) { | ||
249 | pr_err("CPU%u: CPUidle device registration failed\n", | ||
250 | cpu); | ||
251 | return ret; | ||
252 | } | ||
253 | } | ||
254 | return 0; | ||
255 | } | 225 | } |
diff --git a/arch/arm/mach-tegra/cpuidle-tegra30.c b/arch/arm/mach-tegra/cpuidle-tegra30.c index 80445ed33d95..9387daeeadc8 100644 --- a/arch/arm/mach-tegra/cpuidle-tegra30.c +++ b/arch/arm/mach-tegra/cpuidle-tegra30.c | |||
@@ -43,7 +43,6 @@ static int tegra30_idle_lp2(struct cpuidle_device *dev, | |||
43 | static struct cpuidle_driver tegra_idle_driver = { | 43 | static struct cpuidle_driver tegra_idle_driver = { |
44 | .name = "tegra_idle", | 44 | .name = "tegra_idle", |
45 | .owner = THIS_MODULE, | 45 | .owner = THIS_MODULE, |
46 | .en_core_tk_irqen = 1, | ||
47 | #ifdef CONFIG_PM_SLEEP | 46 | #ifdef CONFIG_PM_SLEEP |
48 | .state_count = 2, | 47 | .state_count = 2, |
49 | #else | 48 | #else |
@@ -65,8 +64,6 @@ static struct cpuidle_driver tegra_idle_driver = { | |||
65 | }, | 64 | }, |
66 | }; | 65 | }; |
67 | 66 | ||
68 | static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); | ||
69 | |||
70 | #ifdef CONFIG_PM_SLEEP | 67 | #ifdef CONFIG_PM_SLEEP |
71 | static bool tegra30_cpu_cluster_power_down(struct cpuidle_device *dev, | 68 | static bool tegra30_cpu_cluster_power_down(struct cpuidle_device *dev, |
72 | struct cpuidle_driver *drv, | 69 | struct cpuidle_driver *drv, |
@@ -153,32 +150,8 @@ static int tegra30_idle_lp2(struct cpuidle_device *dev, | |||
153 | 150 | ||
154 | int __init tegra30_cpuidle_init(void) | 151 | int __init tegra30_cpuidle_init(void) |
155 | { | 152 | { |
156 | int ret; | ||
157 | unsigned int cpu; | ||
158 | struct cpuidle_device *dev; | ||
159 | struct cpuidle_driver *drv = &tegra_idle_driver; | ||
160 | |||
161 | #ifdef CONFIG_PM_SLEEP | 153 | #ifdef CONFIG_PM_SLEEP |
162 | tegra_tear_down_cpu = tegra30_tear_down_cpu; | 154 | tegra_tear_down_cpu = tegra30_tear_down_cpu; |
163 | #endif | 155 | #endif |
164 | 156 | return cpuidle_register(&tegra_idle_driver, NULL); | |
165 | ret = cpuidle_register_driver(&tegra_idle_driver); | ||
166 | if (ret) { | ||
167 | pr_err("CPUidle driver registration failed\n"); | ||
168 | return ret; | ||
169 | } | ||
170 | |||
171 | for_each_possible_cpu(cpu) { | ||
172 | dev = &per_cpu(tegra_idle_device, cpu); | ||
173 | dev->cpu = cpu; | ||
174 | |||
175 | dev->state_count = drv->state_count; | ||
176 | ret = cpuidle_register_device(dev); | ||
177 | if (ret) { | ||
178 | pr_err("CPU%u: CPUidle device registration failed\n", | ||
179 | cpu); | ||
180 | return ret; | ||
181 | } | ||
182 | } | ||
183 | return 0; | ||
184 | } | 157 | } |
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c index acacbe8d1afc..891fb70d0aa7 100644 --- a/arch/arm/mach-tegra/pm.c +++ b/arch/arm/mach-tegra/pm.c | |||
@@ -162,6 +162,11 @@ bool tegra_set_cpu_in_lp2(int phy_cpu_id) | |||
162 | return last_cpu; | 162 | return last_cpu; |
163 | } | 163 | } |
164 | 164 | ||
165 | int tegra_cpu_do_idle(void) | ||
166 | { | ||
167 | return cpu_do_idle(); | ||
168 | } | ||
169 | |||
165 | static int tegra_sleep_cpu(unsigned long v2p) | 170 | static int tegra_sleep_cpu(unsigned long v2p) |
166 | { | 171 | { |
167 | setup_mm_for_reboot(); | 172 | setup_mm_for_reboot(); |
diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S index 1676aba5e7b8..e6de88a2ea06 100644 --- a/arch/arm/mach-tegra/reset-handler.S +++ b/arch/arm/mach-tegra/reset-handler.S | |||
@@ -44,6 +44,7 @@ ENTRY(tegra_resume) | |||
44 | 44 | ||
45 | cpu_id r0 | 45 | cpu_id r0 |
46 | cmp r0, #0 @ CPU0? | 46 | cmp r0, #0 @ CPU0? |
47 | THUMB( it ne ) | ||
47 | bne cpu_resume @ no | 48 | bne cpu_resume @ no |
48 | 49 | ||
49 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | 50 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC |
diff --git a/arch/arm/mach-tegra/sleep-tegra20.S b/arch/arm/mach-tegra/sleep-tegra20.S index 9f6bfafdd512..e3f2417c420e 100644 --- a/arch/arm/mach-tegra/sleep-tegra20.S +++ b/arch/arm/mach-tegra/sleep-tegra20.S | |||
@@ -197,7 +197,7 @@ ENTRY(tegra20_sleep_cpu_secondary_finish) | |||
197 | mov r3, #CPU_RESETTABLE | 197 | mov r3, #CPU_RESETTABLE |
198 | str r3, [r0] | 198 | str r3, [r0] |
199 | 199 | ||
200 | bl cpu_do_idle | 200 | bl tegra_cpu_do_idle |
201 | 201 | ||
202 | /* | 202 | /* |
203 | * cpu may be reset while in wfi, which will return through | 203 | * cpu may be reset while in wfi, which will return through |
diff --git a/arch/arm/mach-tegra/sleep-tegra30.S b/arch/arm/mach-tegra/sleep-tegra30.S index 63a15bd9b653..d29dfcce948d 100644 --- a/arch/arm/mach-tegra/sleep-tegra30.S +++ b/arch/arm/mach-tegra/sleep-tegra30.S | |||
@@ -66,7 +66,9 @@ ENTRY(tegra30_cpu_shutdown) | |||
66 | FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \ | 66 | FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \ |
67 | FLOW_CTRL_CSR_ENABLE | 67 | FLOW_CTRL_CSR_ENABLE |
68 | mov r4, #(1 << 4) | 68 | mov r4, #(1 << 4) |
69 | orr r12, r12, r4, lsl r3 | 69 | ARM( orr r12, r12, r4, lsl r3 ) |
70 | THUMB( lsl r4, r4, r3 ) | ||
71 | THUMB( orr r12, r12, r4 ) | ||
70 | str r12, [r1] | 72 | str r12, [r1] |
71 | 73 | ||
72 | /* Halt this CPU. */ | 74 | /* Halt this CPU. */ |
diff --git a/arch/arm/mach-tegra/sleep.h b/arch/arm/mach-tegra/sleep.h index 970ebd5138b9..2080fb12ce26 100644 --- a/arch/arm/mach-tegra/sleep.h +++ b/arch/arm/mach-tegra/sleep.h | |||
@@ -92,7 +92,7 @@ | |||
92 | 92 | ||
93 | #ifdef CONFIG_CACHE_L2X0 | 93 | #ifdef CONFIG_CACHE_L2X0 |
94 | .macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs | 94 | .macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs |
95 | adr \tmp1, \phys_l2x0_saved_regs | 95 | W(adr) \tmp1, \phys_l2x0_saved_regs |
96 | ldr \tmp1, [\tmp1] | 96 | ldr \tmp1, [\tmp1] |
97 | ldr \tmp2, [\tmp1, #L2X0_R_PHY_BASE] | 97 | ldr \tmp2, [\tmp1, #L2X0_R_PHY_BASE] |
98 | ldr \tmp3, [\tmp2, #L2X0_CTRL] | 98 | ldr \tmp3, [\tmp2, #L2X0_CTRL] |
diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h index 1e49d901f2c9..0320495efc4d 100644 --- a/arch/arm/mach-u300/include/mach/u300-regs.h +++ b/arch/arm/mach-u300/include/mach/u300-regs.h | |||
@@ -95,7 +95,7 @@ | |||
95 | #define U300_SPI_BASE (U300_FAST_PER_PHYS_BASE+0x6000) | 95 | #define U300_SPI_BASE (U300_FAST_PER_PHYS_BASE+0x6000) |
96 | 96 | ||
97 | /* Fast UART1 on U335 only */ | 97 | /* Fast UART1 on U335 only */ |
98 | #define U300_UART1_BASE (U300_SLOW_PER_PHYS_BASE+0x7000) | 98 | #define U300_UART1_BASE (U300_FAST_PER_PHYS_BASE+0x7000) |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * SLOW peripherals | 101 | * SLOW peripherals |
diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 2a17bc506cff..33c353bc1c4a 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Authors: Sundar Iyer <sundar.iyer@stericsson.com> | 6 | * Authors: Sundar Iyer <sundar.iyer@stericsson.com> |
7 | * Bengt Jonsson <bengt.g.jonsson@stericsson.com> | 7 | * Bengt Jonsson <bengt.g.jonsson@stericsson.com> |
8 | * Daniel Willerud <daniel.willerud@stericsson.com> | ||
8 | * | 9 | * |
9 | * MOP500 board specific initialization for regulators | 10 | * MOP500 board specific initialization for regulators |
10 | */ | 11 | */ |
@@ -12,6 +13,7 @@ | |||
12 | #include <linux/regulator/machine.h> | 13 | #include <linux/regulator/machine.h> |
13 | #include <linux/regulator/ab8500.h> | 14 | #include <linux/regulator/ab8500.h> |
14 | #include "board-mop500-regulators.h" | 15 | #include "board-mop500-regulators.h" |
16 | #include "id.h" | ||
15 | 17 | ||
16 | static struct regulator_consumer_supply gpio_en_3v3_consumers[] = { | 18 | static struct regulator_consumer_supply gpio_en_3v3_consumers[] = { |
17 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), | 19 | REGULATOR_SUPPLY("vdd33a", "smsc911x.0"), |
@@ -28,6 +30,20 @@ struct regulator_init_data gpio_en_3v3_regulator = { | |||
28 | .consumer_supplies = gpio_en_3v3_consumers, | 30 | .consumer_supplies = gpio_en_3v3_consumers, |
29 | }; | 31 | }; |
30 | 32 | ||
33 | static struct regulator_consumer_supply sdi0_reg_consumers[] = { | ||
34 | REGULATOR_SUPPLY("vqmmc", "sdi0"), | ||
35 | }; | ||
36 | |||
37 | struct regulator_init_data sdi0_reg_init_data = { | ||
38 | .constraints = { | ||
39 | .min_uV = 1800000, | ||
40 | .max_uV = 2900000, | ||
41 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE|REGULATOR_CHANGE_STATUS, | ||
42 | }, | ||
43 | .num_consumer_supplies = ARRAY_SIZE(sdi0_reg_consumers), | ||
44 | .consumer_supplies = sdi0_reg_consumers, | ||
45 | }; | ||
46 | |||
31 | /* | 47 | /* |
32 | * TPS61052 regulator | 48 | * TPS61052 regulator |
33 | */ | 49 | */ |
@@ -53,21 +69,37 @@ struct regulator_init_data tps61052_regulator = { | |||
53 | }; | 69 | }; |
54 | 70 | ||
55 | static struct regulator_consumer_supply ab8500_vaux1_consumers[] = { | 71 | static struct regulator_consumer_supply ab8500_vaux1_consumers[] = { |
56 | /* External displays, connector on board 2v5 power supply */ | 72 | /* Main display, u8500 R3 uib */ |
57 | REGULATOR_SUPPLY("vaux12v5", "mcde.0"), | 73 | REGULATOR_SUPPLY("vddi", "mcde_disp_sony_acx424akp.0"), |
74 | /* Main display, u8500 uib and ST uib */ | ||
75 | REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.0"), | ||
76 | /* Secondary display, ST uib */ | ||
77 | REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.1"), | ||
58 | /* SFH7741 proximity sensor */ | 78 | /* SFH7741 proximity sensor */ |
59 | REGULATOR_SUPPLY("vcc", "gpio-keys.0"), | 79 | REGULATOR_SUPPLY("vcc", "gpio-keys.0"), |
60 | /* BH1780GLS ambient light sensor */ | 80 | /* BH1780GLS ambient light sensor */ |
61 | REGULATOR_SUPPLY("vcc", "2-0029"), | 81 | REGULATOR_SUPPLY("vcc", "2-0029"), |
62 | /* lsm303dlh accelerometer */ | 82 | /* lsm303dlh accelerometer */ |
63 | REGULATOR_SUPPLY("vdd", "3-0018"), | 83 | REGULATOR_SUPPLY("vdd", "2-0018"), |
84 | /* lsm303dlhc accelerometer */ | ||
85 | REGULATOR_SUPPLY("vdd", "2-0019"), | ||
64 | /* lsm303dlh magnetometer */ | 86 | /* lsm303dlh magnetometer */ |
65 | REGULATOR_SUPPLY("vdd", "3-001e"), | 87 | REGULATOR_SUPPLY("vdd", "2-001e"), |
66 | /* Rohm BU21013 Touchscreen devices */ | 88 | /* Rohm BU21013 Touchscreen devices */ |
67 | REGULATOR_SUPPLY("avdd", "3-005c"), | 89 | REGULATOR_SUPPLY("avdd", "3-005c"), |
68 | REGULATOR_SUPPLY("avdd", "3-005d"), | 90 | REGULATOR_SUPPLY("avdd", "3-005d"), |
69 | /* Synaptics RMI4 Touchscreen device */ | 91 | /* Synaptics RMI4 Touchscreen device */ |
70 | REGULATOR_SUPPLY("vdd", "3-004b"), | 92 | REGULATOR_SUPPLY("vdd", "3-004b"), |
93 | /* L3G4200D Gyroscope device */ | ||
94 | REGULATOR_SUPPLY("vdd", "2-0068"), | ||
95 | /* Ambient light sensor device */ | ||
96 | REGULATOR_SUPPLY("vdd", "3-0029"), | ||
97 | /* Pressure sensor device */ | ||
98 | REGULATOR_SUPPLY("vdd", "2-005c"), | ||
99 | /* Cypress TrueTouch Touchscreen device */ | ||
100 | REGULATOR_SUPPLY("vcpin", "spi8.0"), | ||
101 | /* Camera device */ | ||
102 | REGULATOR_SUPPLY("vaux12v5", "mmio_camera"), | ||
71 | }; | 103 | }; |
72 | 104 | ||
73 | static struct regulator_consumer_supply ab8500_vaux2_consumers[] = { | 105 | static struct regulator_consumer_supply ab8500_vaux2_consumers[] = { |
@@ -75,18 +107,50 @@ static struct regulator_consumer_supply ab8500_vaux2_consumers[] = { | |||
75 | REGULATOR_SUPPLY("vmmc", "sdi4"), | 107 | REGULATOR_SUPPLY("vmmc", "sdi4"), |
76 | /* AB8500 audio codec */ | 108 | /* AB8500 audio codec */ |
77 | REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"), | 109 | REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"), |
110 | /* AB8500 accessory detect 1 */ | ||
111 | REGULATOR_SUPPLY("vcc-N2158", "ab8500-acc-det.0"), | ||
112 | /* AB8500 Tv-out device */ | ||
113 | REGULATOR_SUPPLY("vcc-N2158", "mcde_tv_ab8500.4"), | ||
114 | /* AV8100 HDMI device */ | ||
115 | REGULATOR_SUPPLY("vcc-N2158", "av8100_hdmi.3"), | ||
78 | }; | 116 | }; |
79 | 117 | ||
80 | static struct regulator_consumer_supply ab8500_vaux3_consumers[] = { | 118 | static struct regulator_consumer_supply ab8500_vaux3_consumers[] = { |
119 | REGULATOR_SUPPLY("v-SD-STM", "stm"), | ||
81 | /* External MMC slot power */ | 120 | /* External MMC slot power */ |
82 | REGULATOR_SUPPLY("vmmc", "sdi0"), | 121 | REGULATOR_SUPPLY("vmmc", "sdi0"), |
83 | }; | 122 | }; |
84 | 123 | ||
124 | static struct regulator_consumer_supply ab8505_vaux4_consumers[] = { | ||
125 | }; | ||
126 | |||
127 | static struct regulator_consumer_supply ab8505_vaux5_consumers[] = { | ||
128 | }; | ||
129 | |||
130 | static struct regulator_consumer_supply ab8505_vaux6_consumers[] = { | ||
131 | }; | ||
132 | |||
133 | static struct regulator_consumer_supply ab8505_vaux8_consumers[] = { | ||
134 | /* AB8500 audio codec device */ | ||
135 | REGULATOR_SUPPLY("v-aux8", NULL), | ||
136 | }; | ||
137 | |||
138 | static struct regulator_consumer_supply ab8505_vadc_consumers[] = { | ||
139 | /* Internal general-purpose ADC */ | ||
140 | REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), | ||
141 | /* ADC for charger */ | ||
142 | REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"), | ||
143 | }; | ||
144 | |||
85 | static struct regulator_consumer_supply ab8500_vtvout_consumers[] = { | 145 | static struct regulator_consumer_supply ab8500_vtvout_consumers[] = { |
86 | /* TV-out DENC supply */ | 146 | /* TV-out DENC supply */ |
87 | REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"), | 147 | REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"), |
88 | /* Internal general-purpose ADC */ | 148 | /* Internal general-purpose ADC */ |
89 | REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), | 149 | REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), |
150 | /* ADC for charger */ | ||
151 | REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"), | ||
152 | /* AB8500 Tv-out device */ | ||
153 | REGULATOR_SUPPLY("vtvout", "mcde_tv_ab8500.4"), | ||
90 | }; | 154 | }; |
91 | 155 | ||
92 | static struct regulator_consumer_supply ab8500_vaud_consumers[] = { | 156 | static struct regulator_consumer_supply ab8500_vaud_consumers[] = { |
@@ -114,77 +178,90 @@ static struct regulator_consumer_supply ab8500_vintcore_consumers[] = { | |||
114 | REGULATOR_SUPPLY("v-intcore", NULL), | 178 | REGULATOR_SUPPLY("v-intcore", NULL), |
115 | /* USB Transceiver */ | 179 | /* USB Transceiver */ |
116 | REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"), | 180 | REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"), |
181 | /* Handled by abx500 clk driver */ | ||
182 | REGULATOR_SUPPLY("v-intcore", "abx500-clk.0"), | ||
183 | }; | ||
184 | |||
185 | static struct regulator_consumer_supply ab8505_usb_consumers[] = { | ||
186 | /* HS USB OTG physical interface */ | ||
187 | REGULATOR_SUPPLY("v-ape", NULL), | ||
117 | }; | 188 | }; |
118 | 189 | ||
119 | static struct regulator_consumer_supply ab8500_vana_consumers[] = { | 190 | static struct regulator_consumer_supply ab8500_vana_consumers[] = { |
120 | /* External displays, connector on board, 1v8 power supply */ | 191 | /* DB8500 DSI */ |
121 | REGULATOR_SUPPLY("vsmps2", "mcde.0"), | 192 | REGULATOR_SUPPLY("vdddsi1v2", "mcde"), |
193 | REGULATOR_SUPPLY("vdddsi1v2", "b2r2_core"), | ||
194 | REGULATOR_SUPPLY("vdddsi1v2", "b2r2_1_core"), | ||
195 | REGULATOR_SUPPLY("vdddsi1v2", "dsilink.0"), | ||
196 | REGULATOR_SUPPLY("vdddsi1v2", "dsilink.1"), | ||
197 | REGULATOR_SUPPLY("vdddsi1v2", "dsilink.2"), | ||
198 | /* DB8500 CSI */ | ||
199 | REGULATOR_SUPPLY("vddcsi1v2", "mmio_camera"), | ||
122 | }; | 200 | }; |
123 | 201 | ||
124 | /* ab8500 regulator register initialization */ | 202 | /* ab8500 regulator register initialization */ |
125 | struct ab8500_regulator_reg_init | 203 | static struct ab8500_regulator_reg_init ab8500_reg_init[] = { |
126 | ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | ||
127 | /* | 204 | /* |
128 | * VanaRequestCtrl = HP/LP depending on VxRequest | 205 | * VanaRequestCtrl = HP/LP depending on VxRequest |
129 | * VextSupply1RequestCtrl = HP/LP depending on VxRequest | 206 | * VextSupply1RequestCtrl = HP/LP depending on VxRequest |
130 | */ | 207 | */ |
131 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2, 0x00), | 208 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2, 0xf0, 0x00), |
132 | /* | 209 | /* |
133 | * VextSupply2RequestCtrl = HP/LP depending on VxRequest | 210 | * VextSupply2RequestCtrl = HP/LP depending on VxRequest |
134 | * VextSupply3RequestCtrl = HP/LP depending on VxRequest | 211 | * VextSupply3RequestCtrl = HP/LP depending on VxRequest |
135 | * Vaux1RequestCtrl = HP/LP depending on VxRequest | 212 | * Vaux1RequestCtrl = HP/LP depending on VxRequest |
136 | * Vaux2RequestCtrl = HP/LP depending on VxRequest | 213 | * Vaux2RequestCtrl = HP/LP depending on VxRequest |
137 | */ | 214 | */ |
138 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3, 0x00), | 215 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3, 0xff, 0x00), |
139 | /* | 216 | /* |
140 | * Vaux3RequestCtrl = HP/LP depending on VxRequest | 217 | * Vaux3RequestCtrl = HP/LP depending on VxRequest |
141 | * SwHPReq = Control through SWValid disabled | 218 | * SwHPReq = Control through SWValid disabled |
142 | */ | 219 | */ |
143 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4, 0x00), | 220 | INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4, 0x07, 0x00), |
144 | /* | 221 | /* |
145 | * VanaSysClkReq1HPValid = disabled | 222 | * VanaSysClkReq1HPValid = disabled |
146 | * Vaux1SysClkReq1HPValid = disabled | 223 | * Vaux1SysClkReq1HPValid = disabled |
147 | * Vaux2SysClkReq1HPValid = disabled | 224 | * Vaux2SysClkReq1HPValid = disabled |
148 | * Vaux3SysClkReq1HPValid = disabled | 225 | * Vaux3SysClkReq1HPValid = disabled |
149 | */ | 226 | */ |
150 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0x00), | 227 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00), |
151 | /* | 228 | /* |
152 | * VextSupply1SysClkReq1HPValid = disabled | 229 | * VextSupply1SysClkReq1HPValid = disabled |
153 | * VextSupply2SysClkReq1HPValid = disabled | 230 | * VextSupply2SysClkReq1HPValid = disabled |
154 | * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled | 231 | * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled |
155 | */ | 232 | */ |
156 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x40), | 233 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x70, 0x40), |
157 | /* | 234 | /* |
158 | * VanaHwHPReq1Valid = disabled | 235 | * VanaHwHPReq1Valid = disabled |
159 | * Vaux1HwHPreq1Valid = disabled | 236 | * Vaux1HwHPreq1Valid = disabled |
160 | * Vaux2HwHPReq1Valid = disabled | 237 | * Vaux2HwHPReq1Valid = disabled |
161 | * Vaux3HwHPReqValid = disabled | 238 | * Vaux3HwHPReqValid = disabled |
162 | */ | 239 | */ |
163 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1, 0x00), | 240 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1, 0xe8, 0x00), |
164 | /* | 241 | /* |
165 | * VextSupply1HwHPReq1Valid = disabled | 242 | * VextSupply1HwHPReq1Valid = disabled |
166 | * VextSupply2HwHPReq1Valid = disabled | 243 | * VextSupply2HwHPReq1Valid = disabled |
167 | * VextSupply3HwHPReq1Valid = disabled | 244 | * VextSupply3HwHPReq1Valid = disabled |
168 | */ | 245 | */ |
169 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2, 0x00), | 246 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2, 0x07, 0x00), |
170 | /* | 247 | /* |
171 | * VanaHwHPReq2Valid = disabled | 248 | * VanaHwHPReq2Valid = disabled |
172 | * Vaux1HwHPReq2Valid = disabled | 249 | * Vaux1HwHPReq2Valid = disabled |
173 | * Vaux2HwHPReq2Valid = disabled | 250 | * Vaux2HwHPReq2Valid = disabled |
174 | * Vaux3HwHPReq2Valid = disabled | 251 | * Vaux3HwHPReq2Valid = disabled |
175 | */ | 252 | */ |
176 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1, 0x00), | 253 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1, 0xe8, 0x00), |
177 | /* | 254 | /* |
178 | * VextSupply1HwHPReq2Valid = disabled | 255 | * VextSupply1HwHPReq2Valid = disabled |
179 | * VextSupply2HwHPReq2Valid = disabled | 256 | * VextSupply2HwHPReq2Valid = disabled |
180 | * VextSupply3HwHPReq2Valid = HWReq2 controlled | 257 | * VextSupply3HwHPReq2Valid = HWReq2 controlled |
181 | */ | 258 | */ |
182 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2, 0x04), | 259 | INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2, 0x07, 0x04), |
183 | /* | 260 | /* |
184 | * VanaSwHPReqValid = disabled | 261 | * VanaSwHPReqValid = disabled |
185 | * Vaux1SwHPReqValid = disabled | 262 | * Vaux1SwHPReqValid = disabled |
186 | */ | 263 | */ |
187 | INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1, 0x00), | 264 | INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1, 0xa0, 0x00), |
188 | /* | 265 | /* |
189 | * Vaux2SwHPReqValid = disabled | 266 | * Vaux2SwHPReqValid = disabled |
190 | * Vaux3SwHPReqValid = disabled | 267 | * Vaux3SwHPReqValid = disabled |
@@ -192,7 +269,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | |||
192 | * VextSupply2SwHPReqValid = disabled | 269 | * VextSupply2SwHPReqValid = disabled |
193 | * VextSupply3SwHPReqValid = disabled | 270 | * VextSupply3SwHPReqValid = disabled |
194 | */ | 271 | */ |
195 | INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2, 0x00), | 272 | INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2, 0x1f, 0x00), |
196 | /* | 273 | /* |
197 | * SysClkReq2Valid1 = SysClkReq2 controlled | 274 | * SysClkReq2Valid1 = SysClkReq2 controlled |
198 | * SysClkReq3Valid1 = disabled | 275 | * SysClkReq3Valid1 = disabled |
@@ -202,7 +279,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | |||
202 | * SysClkReq7Valid1 = disabled | 279 | * SysClkReq7Valid1 = disabled |
203 | * SysClkReq8Valid1 = disabled | 280 | * SysClkReq8Valid1 = disabled |
204 | */ | 281 | */ |
205 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1, 0x2a), | 282 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1, 0xfe, 0x2a), |
206 | /* | 283 | /* |
207 | * SysClkReq2Valid2 = disabled | 284 | * SysClkReq2Valid2 = disabled |
208 | * SysClkReq3Valid2 = disabled | 285 | * SysClkReq3Valid2 = disabled |
@@ -212,7 +289,7 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | |||
212 | * SysClkReq7Valid2 = disabled | 289 | * SysClkReq7Valid2 = disabled |
213 | * SysClkReq8Valid2 = disabled | 290 | * SysClkReq8Valid2 = disabled |
214 | */ | 291 | */ |
215 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2, 0x20), | 292 | INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2, 0xfe, 0x20), |
216 | /* | 293 | /* |
217 | * VTVoutEna = disabled | 294 | * VTVoutEna = disabled |
218 | * Vintcore12Ena = disabled | 295 | * Vintcore12Ena = disabled |
@@ -220,66 +297,62 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | |||
220 | * Vintcore12LP = inactive (HP) | 297 | * Vintcore12LP = inactive (HP) |
221 | * VTVoutLP = inactive (HP) | 298 | * VTVoutLP = inactive (HP) |
222 | */ | 299 | */ |
223 | INIT_REGULATOR_REGISTER(AB8500_REGUMISC1, 0x10), | 300 | INIT_REGULATOR_REGISTER(AB8500_REGUMISC1, 0xfe, 0x10), |
224 | /* | 301 | /* |
225 | * VaudioEna = disabled | 302 | * VaudioEna = disabled |
226 | * VdmicEna = disabled | 303 | * VdmicEna = disabled |
227 | * Vamic1Ena = disabled | 304 | * Vamic1Ena = disabled |
228 | * Vamic2Ena = disabled | 305 | * Vamic2Ena = disabled |
229 | */ | 306 | */ |
230 | INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY, 0x00), | 307 | INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY, 0x1e, 0x00), |
231 | /* | 308 | /* |
232 | * Vamic1_dzout = high-Z when Vamic1 is disabled | 309 | * Vamic1_dzout = high-Z when Vamic1 is disabled |
233 | * Vamic2_dzout = high-Z when Vamic2 is disabled | 310 | * Vamic2_dzout = high-Z when Vamic2 is disabled |
234 | */ | 311 | */ |
235 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC, 0x00), | 312 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC, 0x03, 0x00), |
236 | /* | 313 | /* |
237 | * VPll = Hw controlled | 314 | * VPll = Hw controlled (NOTE! PRCMU bits) |
238 | * VanaRegu = force off | 315 | * VanaRegu = force off |
239 | */ | 316 | */ |
240 | INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU, 0x02), | 317 | INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU, 0x0f, 0x02), |
241 | /* | 318 | /* |
242 | * VrefDDREna = disabled | 319 | * VrefDDREna = disabled |
243 | * VrefDDRSleepMode = inactive (no pulldown) | 320 | * VrefDDRSleepMode = inactive (no pulldown) |
244 | */ | 321 | */ |
245 | INIT_REGULATOR_REGISTER(AB8500_VREFDDR, 0x00), | 322 | INIT_REGULATOR_REGISTER(AB8500_VREFDDR, 0x03, 0x00), |
246 | /* | 323 | /* |
247 | * VextSupply1Regu = HW control | 324 | * VextSupply1Regu = force LP |
248 | * VextSupply2Regu = HW control | 325 | * VextSupply2Regu = force OFF |
249 | * VextSupply3Regu = HW control | 326 | * VextSupply3Regu = force HP (-> STBB2=LP and TPS=LP) |
250 | * ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0 | 327 | * ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0 |
251 | * ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0 | 328 | * ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0 |
252 | */ | 329 | */ |
253 | INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU, 0x2a), | 330 | INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU, 0xff, 0x13), |
254 | /* | 331 | /* |
255 | * Vaux1Regu = force HP | 332 | * Vaux1Regu = force HP |
256 | * Vaux2Regu = force off | 333 | * Vaux2Regu = force off |
257 | */ | 334 | */ |
258 | INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU, 0x01), | 335 | INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU, 0x0f, 0x01), |
259 | /* | ||
260 | * Vaux3regu = force off | ||
261 | */ | ||
262 | INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU, 0x00), | ||
263 | /* | 336 | /* |
264 | * Vsmps1 = 1.15V | 337 | * Vaux3Regu = force off |
265 | */ | 338 | */ |
266 | INIT_REGULATOR_REGISTER(AB8500_VSMPS1SEL1, 0x24), | 339 | INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU, 0x03, 0x00), |
267 | /* | 340 | /* |
268 | * Vaux1Sel = 2.5 V | 341 | * Vaux1Sel = 2.8 V |
269 | */ | 342 | */ |
270 | INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL, 0x08), | 343 | INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL, 0x0f, 0x0C), |
271 | /* | 344 | /* |
272 | * Vaux2Sel = 2.9 V | 345 | * Vaux2Sel = 2.9 V |
273 | */ | 346 | */ |
274 | INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL, 0x0d), | 347 | INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL, 0x0f, 0x0d), |
275 | /* | 348 | /* |
276 | * Vaux3Sel = 2.91 V | 349 | * Vaux3Sel = 2.91 V |
277 | */ | 350 | */ |
278 | INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL, 0x07), | 351 | INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL, 0x07, 0x07), |
279 | /* | 352 | /* |
280 | * VextSupply12LP = disabled (no LP) | 353 | * VextSupply12LP = disabled (no LP) |
281 | */ | 354 | */ |
282 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE, 0x00), | 355 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE, 0x01, 0x00), |
283 | /* | 356 | /* |
284 | * Vaux1Disch = short discharge time | 357 | * Vaux1Disch = short discharge time |
285 | * Vaux2Disch = short discharge time | 358 | * Vaux2Disch = short discharge time |
@@ -288,33 +361,26 @@ ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS] = { | |||
288 | * VTVoutDisch = short discharge time | 361 | * VTVoutDisch = short discharge time |
289 | * VaudioDisch = short discharge time | 362 | * VaudioDisch = short discharge time |
290 | */ | 363 | */ |
291 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH, 0x00), | 364 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH, 0xfc, 0x00), |
292 | /* | 365 | /* |
293 | * VanaDisch = short discharge time | 366 | * VanaDisch = short discharge time |
294 | * VdmicPullDownEna = pulldown disabled when Vdmic is disabled | 367 | * VdmicPullDownEna = pulldown disabled when Vdmic is disabled |
295 | * VdmicDisch = short discharge time | 368 | * VdmicDisch = short discharge time |
296 | */ | 369 | */ |
297 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2, 0x00), | 370 | INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2, 0x16, 0x00), |
298 | }; | 371 | }; |
299 | 372 | ||
300 | /* AB8500 regulators */ | 373 | /* AB8500 regulators */ |
301 | struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | 374 | static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { |
302 | /* supplies to the display/camera */ | 375 | /* supplies to the display/camera */ |
303 | [AB8500_LDO_AUX1] = { | 376 | [AB8500_LDO_AUX1] = { |
304 | .constraints = { | 377 | .constraints = { |
305 | .name = "V-DISPLAY", | 378 | .name = "V-DISPLAY", |
306 | .min_uV = 2500000, | 379 | .min_uV = 2800000, |
307 | .max_uV = 2900000, | 380 | .max_uV = 3300000, |
308 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | 381 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | |
309 | REGULATOR_CHANGE_STATUS, | 382 | REGULATOR_CHANGE_STATUS, |
310 | .boot_on = 1, /* display is on at boot */ | 383 | .boot_on = 1, /* display is on at boot */ |
311 | /* | ||
312 | * This voltage cannot be disabled right now because | ||
313 | * it is somehow affecting the external MMC | ||
314 | * functionality, though that typically will use | ||
315 | * AUX3. | ||
316 | */ | ||
317 | .always_on = 1, | ||
318 | }, | 384 | }, |
319 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers), | 385 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers), |
320 | .consumer_supplies = ab8500_vaux1_consumers, | 386 | .consumer_supplies = ab8500_vaux1_consumers, |
@@ -326,7 +392,10 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
326 | .min_uV = 1100000, | 392 | .min_uV = 1100000, |
327 | .max_uV = 3300000, | 393 | .max_uV = 3300000, |
328 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | 394 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | |
329 | REGULATOR_CHANGE_STATUS, | 395 | REGULATOR_CHANGE_STATUS | |
396 | REGULATOR_CHANGE_MODE, | ||
397 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
398 | REGULATOR_MODE_IDLE, | ||
330 | }, | 399 | }, |
331 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers), | 400 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers), |
332 | .consumer_supplies = ab8500_vaux2_consumers, | 401 | .consumer_supplies = ab8500_vaux2_consumers, |
@@ -338,7 +407,10 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
338 | .min_uV = 1100000, | 407 | .min_uV = 1100000, |
339 | .max_uV = 3300000, | 408 | .max_uV = 3300000, |
340 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | 409 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | |
341 | REGULATOR_CHANGE_STATUS, | 410 | REGULATOR_CHANGE_STATUS | |
411 | REGULATOR_CHANGE_MODE, | ||
412 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
413 | REGULATOR_MODE_IDLE, | ||
342 | }, | 414 | }, |
343 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers), | 415 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers), |
344 | .consumer_supplies = ab8500_vaux3_consumers, | 416 | .consumer_supplies = ab8500_vaux3_consumers, |
@@ -392,18 +464,614 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
392 | [AB8500_LDO_INTCORE] = { | 464 | [AB8500_LDO_INTCORE] = { |
393 | .constraints = { | 465 | .constraints = { |
394 | .name = "V-INTCORE", | 466 | .name = "V-INTCORE", |
395 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 467 | .min_uV = 1250000, |
468 | .max_uV = 1350000, | ||
469 | .input_uV = 1800000, | ||
470 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
471 | REGULATOR_CHANGE_STATUS | | ||
472 | REGULATOR_CHANGE_MODE | | ||
473 | REGULATOR_CHANGE_DRMS, | ||
474 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
475 | REGULATOR_MODE_IDLE, | ||
396 | }, | 476 | }, |
397 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers), | 477 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers), |
398 | .consumer_supplies = ab8500_vintcore_consumers, | 478 | .consumer_supplies = ab8500_vintcore_consumers, |
399 | }, | 479 | }, |
400 | /* supply for U8500 CSI/DSI, VANA LDO */ | 480 | /* supply for U8500 CSI-DSI, VANA LDO */ |
401 | [AB8500_LDO_ANA] = { | 481 | [AB8500_LDO_ANA] = { |
402 | .constraints = { | 482 | .constraints = { |
403 | .name = "V-CSI/DSI", | 483 | .name = "V-CSI-DSI", |
404 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 484 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
405 | }, | 485 | }, |
406 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers), | 486 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers), |
407 | .consumer_supplies = ab8500_vana_consumers, | 487 | .consumer_supplies = ab8500_vana_consumers, |
408 | }, | 488 | }, |
409 | }; | 489 | }; |
490 | |||
491 | /* supply for VextSupply3 */ | ||
492 | static struct regulator_consumer_supply ab8500_ext_supply3_consumers[] = { | ||
493 | /* SIM supply for 3 V SIM cards */ | ||
494 | REGULATOR_SUPPLY("vinvsim", "sim-detect.0"), | ||
495 | }; | ||
496 | |||
497 | /* extended configuration for VextSupply2, only used for HREFP_V20 boards */ | ||
498 | static struct ab8500_ext_regulator_cfg ab8500_ext_supply2 = { | ||
499 | .hwreq = true, | ||
500 | }; | ||
501 | |||
502 | /* | ||
503 | * AB8500 external regulators | ||
504 | */ | ||
505 | static struct regulator_init_data ab8500_ext_regulators[] = { | ||
506 | /* fixed Vbat supplies VSMPS1_EXT_1V8 */ | ||
507 | [AB8500_EXT_SUPPLY1] = { | ||
508 | .constraints = { | ||
509 | .name = "ab8500-ext-supply1", | ||
510 | .min_uV = 1800000, | ||
511 | .max_uV = 1800000, | ||
512 | .initial_mode = REGULATOR_MODE_IDLE, | ||
513 | .boot_on = 1, | ||
514 | .always_on = 1, | ||
515 | }, | ||
516 | }, | ||
517 | /* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */ | ||
518 | [AB8500_EXT_SUPPLY2] = { | ||
519 | .constraints = { | ||
520 | .name = "ab8500-ext-supply2", | ||
521 | .min_uV = 1360000, | ||
522 | .max_uV = 1360000, | ||
523 | }, | ||
524 | }, | ||
525 | /* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */ | ||
526 | [AB8500_EXT_SUPPLY3] = { | ||
527 | .constraints = { | ||
528 | .name = "ab8500-ext-supply3", | ||
529 | .min_uV = 3400000, | ||
530 | .max_uV = 3400000, | ||
531 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
532 | .boot_on = 1, | ||
533 | }, | ||
534 | .num_consumer_supplies = | ||
535 | ARRAY_SIZE(ab8500_ext_supply3_consumers), | ||
536 | .consumer_supplies = ab8500_ext_supply3_consumers, | ||
537 | }, | ||
538 | }; | ||
539 | |||
540 | /* ab8505 regulator register initialization */ | ||
541 | static struct ab8500_regulator_reg_init ab8505_reg_init[] = { | ||
542 | /* | ||
543 | * VarmRequestCtrl | ||
544 | * VsmpsCRequestCtrl | ||
545 | * VsmpsARequestCtrl | ||
546 | * VsmpsBRequestCtrl | ||
547 | */ | ||
548 | INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL1, 0x00, 0x00), | ||
549 | /* | ||
550 | * VsafeRequestCtrl | ||
551 | * VpllRequestCtrl | ||
552 | * VanaRequestCtrl = HP/LP depending on VxRequest | ||
553 | */ | ||
554 | INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL2, 0x30, 0x00), | ||
555 | /* | ||
556 | * Vaux1RequestCtrl = HP/LP depending on VxRequest | ||
557 | * Vaux2RequestCtrl = HP/LP depending on VxRequest | ||
558 | */ | ||
559 | INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL3, 0xf0, 0x00), | ||
560 | /* | ||
561 | * Vaux3RequestCtrl = HP/LP depending on VxRequest | ||
562 | * SwHPReq = Control through SWValid disabled | ||
563 | */ | ||
564 | INIT_REGULATOR_REGISTER(AB8505_REGUREQUESTCTRL4, 0x07, 0x00), | ||
565 | /* | ||
566 | * VsmpsASysClkReq1HPValid | ||
567 | * VsmpsBSysClkReq1HPValid | ||
568 | * VsafeSysClkReq1HPValid | ||
569 | * VanaSysClkReq1HPValid = disabled | ||
570 | * VpllSysClkReq1HPValid | ||
571 | * Vaux1SysClkReq1HPValid = disabled | ||
572 | * Vaux2SysClkReq1HPValid = disabled | ||
573 | * Vaux3SysClkReq1HPValid = disabled | ||
574 | */ | ||
575 | INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00), | ||
576 | /* | ||
577 | * VsmpsCSysClkReq1HPValid | ||
578 | * VarmSysClkReq1HPValid | ||
579 | * VbbSysClkReq1HPValid | ||
580 | * VsmpsMSysClkReq1HPValid | ||
581 | */ | ||
582 | INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQ1HPVALID2, 0x00, 0x00), | ||
583 | /* | ||
584 | * VsmpsAHwHPReq1Valid | ||
585 | * VsmpsBHwHPReq1Valid | ||
586 | * VsafeHwHPReq1Valid | ||
587 | * VanaHwHPReq1Valid = disabled | ||
588 | * VpllHwHPReq1Valid | ||
589 | * Vaux1HwHPreq1Valid = disabled | ||
590 | * Vaux2HwHPReq1Valid = disabled | ||
591 | * Vaux3HwHPReqValid = disabled | ||
592 | */ | ||
593 | INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ1VALID1, 0xe8, 0x00), | ||
594 | /* | ||
595 | * VsmpsMHwHPReq1Valid | ||
596 | */ | ||
597 | INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ1VALID2, 0x00, 0x00), | ||
598 | /* | ||
599 | * VsmpsAHwHPReq2Valid | ||
600 | * VsmpsBHwHPReq2Valid | ||
601 | * VsafeHwHPReq2Valid | ||
602 | * VanaHwHPReq2Valid = disabled | ||
603 | * VpllHwHPReq2Valid | ||
604 | * Vaux1HwHPReq2Valid = disabled | ||
605 | * Vaux2HwHPReq2Valid = disabled | ||
606 | * Vaux3HwHPReq2Valid = disabled | ||
607 | */ | ||
608 | INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ2VALID1, 0xe8, 0x00), | ||
609 | /* | ||
610 | * VsmpsMHwHPReq2Valid | ||
611 | */ | ||
612 | INIT_REGULATOR_REGISTER(AB8505_REGUHWHPREQ2VALID2, 0x00, 0x00), | ||
613 | /** | ||
614 | * VsmpsCSwHPReqValid | ||
615 | * VarmSwHPReqValid | ||
616 | * VsmpsASwHPReqValid | ||
617 | * VsmpsBSwHPReqValid | ||
618 | * VsafeSwHPReqValid | ||
619 | * VanaSwHPReqValid | ||
620 | * VanaSwHPReqValid = disabled | ||
621 | * VpllSwHPReqValid | ||
622 | * Vaux1SwHPReqValid = disabled | ||
623 | */ | ||
624 | INIT_REGULATOR_REGISTER(AB8505_REGUSWHPREQVALID1, 0xa0, 0x00), | ||
625 | /* | ||
626 | * Vaux2SwHPReqValid = disabled | ||
627 | * Vaux3SwHPReqValid = disabled | ||
628 | * VsmpsMSwHPReqValid | ||
629 | */ | ||
630 | INIT_REGULATOR_REGISTER(AB8505_REGUSWHPREQVALID2, 0x03, 0x00), | ||
631 | /* | ||
632 | * SysClkReq2Valid1 = SysClkReq2 controlled | ||
633 | * SysClkReq3Valid1 = disabled | ||
634 | * SysClkReq4Valid1 = SysClkReq4 controlled | ||
635 | */ | ||
636 | INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQVALID1, 0x0e, 0x0a), | ||
637 | /* | ||
638 | * SysClkReq2Valid2 = disabled | ||
639 | * SysClkReq3Valid2 = disabled | ||
640 | * SysClkReq4Valid2 = disabled | ||
641 | */ | ||
642 | INIT_REGULATOR_REGISTER(AB8505_REGUSYSCLKREQVALID2, 0x0e, 0x00), | ||
643 | /* | ||
644 | * Vaux4SwHPReqValid | ||
645 | * Vaux4HwHPReq2Valid | ||
646 | * Vaux4HwHPReq1Valid | ||
647 | * Vaux4SysClkReq1HPValid | ||
648 | */ | ||
649 | INIT_REGULATOR_REGISTER(AB8505_REGUVAUX4REQVALID, 0x00, 0x00), | ||
650 | /* | ||
651 | * VadcEna = disabled | ||
652 | * VintCore12Ena = disabled | ||
653 | * VintCore12Sel = 1.25 V | ||
654 | * VintCore12LP = inactive (HP) | ||
655 | * VadcLP = inactive (HP) | ||
656 | */ | ||
657 | INIT_REGULATOR_REGISTER(AB8505_REGUMISC1, 0xfe, 0x10), | ||
658 | /* | ||
659 | * VaudioEna = disabled | ||
660 | * Vaux8Ena = disabled | ||
661 | * Vamic1Ena = disabled | ||
662 | * Vamic2Ena = disabled | ||
663 | */ | ||
664 | INIT_REGULATOR_REGISTER(AB8505_VAUDIOSUPPLY, 0x1e, 0x00), | ||
665 | /* | ||
666 | * Vamic1_dzout = high-Z when Vamic1 is disabled | ||
667 | * Vamic2_dzout = high-Z when Vamic2 is disabled | ||
668 | */ | ||
669 | INIT_REGULATOR_REGISTER(AB8505_REGUCTRL1VAMIC, 0x03, 0x00), | ||
670 | /* | ||
671 | * VsmpsARegu | ||
672 | * VsmpsASelCtrl | ||
673 | * VsmpsAAutoMode | ||
674 | * VsmpsAPWMMode | ||
675 | */ | ||
676 | INIT_REGULATOR_REGISTER(AB8505_VSMPSAREGU, 0x00, 0x00), | ||
677 | /* | ||
678 | * VsmpsBRegu | ||
679 | * VsmpsBSelCtrl | ||
680 | * VsmpsBAutoMode | ||
681 | * VsmpsBPWMMode | ||
682 | */ | ||
683 | INIT_REGULATOR_REGISTER(AB8505_VSMPSBREGU, 0x00, 0x00), | ||
684 | /* | ||
685 | * VsafeRegu | ||
686 | * VsafeSelCtrl | ||
687 | * VsafeAutoMode | ||
688 | * VsafePWMMode | ||
689 | */ | ||
690 | INIT_REGULATOR_REGISTER(AB8505_VSAFEREGU, 0x00, 0x00), | ||
691 | /* | ||
692 | * VPll = Hw controlled (NOTE! PRCMU bits) | ||
693 | * VanaRegu = force off | ||
694 | */ | ||
695 | INIT_REGULATOR_REGISTER(AB8505_VPLLVANAREGU, 0x0f, 0x02), | ||
696 | /* | ||
697 | * VextSupply1Regu = force OFF (OTP_ExtSupply12LPnPolarity 1) | ||
698 | * VextSupply2Regu = force OFF (OTP_ExtSupply12LPnPolarity 1) | ||
699 | * VextSupply3Regu = force OFF (OTP_ExtSupply3LPnPolarity 0) | ||
700 | * ExtSupply2Bypass = ExtSupply12LPn ball is 0 when Ena is 0 | ||
701 | * ExtSupply3Bypass = ExtSupply3LPn ball is 0 when Ena is 0 | ||
702 | */ | ||
703 | INIT_REGULATOR_REGISTER(AB8505_EXTSUPPLYREGU, 0xff, 0x30), | ||
704 | /* | ||
705 | * Vaux1Regu = force HP | ||
706 | * Vaux2Regu = force off | ||
707 | */ | ||
708 | INIT_REGULATOR_REGISTER(AB8505_VAUX12REGU, 0x0f, 0x01), | ||
709 | /* | ||
710 | * Vaux3Regu = force off | ||
711 | */ | ||
712 | INIT_REGULATOR_REGISTER(AB8505_VRF1VAUX3REGU, 0x03, 0x00), | ||
713 | /* | ||
714 | * VsmpsASel1 | ||
715 | */ | ||
716 | INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL1, 0x00, 0x00), | ||
717 | /* | ||
718 | * VsmpsASel2 | ||
719 | */ | ||
720 | INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL2, 0x00, 0x00), | ||
721 | /* | ||
722 | * VsmpsASel3 | ||
723 | */ | ||
724 | INIT_REGULATOR_REGISTER(AB8505_VSMPSASEL3, 0x00, 0x00), | ||
725 | /* | ||
726 | * VsmpsBSel1 | ||
727 | */ | ||
728 | INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL1, 0x00, 0x00), | ||
729 | /* | ||
730 | * VsmpsBSel2 | ||
731 | */ | ||
732 | INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL2, 0x00, 0x00), | ||
733 | /* | ||
734 | * VsmpsBSel3 | ||
735 | */ | ||
736 | INIT_REGULATOR_REGISTER(AB8505_VSMPSBSEL3, 0x00, 0x00), | ||
737 | /* | ||
738 | * VsafeSel1 | ||
739 | */ | ||
740 | INIT_REGULATOR_REGISTER(AB8505_VSAFESEL1, 0x00, 0x00), | ||
741 | /* | ||
742 | * VsafeSel2 | ||
743 | */ | ||
744 | INIT_REGULATOR_REGISTER(AB8505_VSAFESEL2, 0x00, 0x00), | ||
745 | /* | ||
746 | * VsafeSel3 | ||
747 | */ | ||
748 | INIT_REGULATOR_REGISTER(AB8505_VSAFESEL3, 0x00, 0x00), | ||
749 | /* | ||
750 | * Vaux1Sel = 2.8 V | ||
751 | */ | ||
752 | INIT_REGULATOR_REGISTER(AB8505_VAUX1SEL, 0x0f, 0x0C), | ||
753 | /* | ||
754 | * Vaux2Sel = 2.9 V | ||
755 | */ | ||
756 | INIT_REGULATOR_REGISTER(AB8505_VAUX2SEL, 0x0f, 0x0d), | ||
757 | /* | ||
758 | * Vaux3Sel = 2.91 V | ||
759 | */ | ||
760 | INIT_REGULATOR_REGISTER(AB8505_VRF1VAUX3SEL, 0x07, 0x07), | ||
761 | /* | ||
762 | * Vaux4RequestCtrl | ||
763 | */ | ||
764 | INIT_REGULATOR_REGISTER(AB8505_VAUX4REQCTRL, 0x00, 0x00), | ||
765 | /* | ||
766 | * Vaux4Regu | ||
767 | */ | ||
768 | INIT_REGULATOR_REGISTER(AB8505_VAUX4REGU, 0x00, 0x00), | ||
769 | /* | ||
770 | * Vaux4Sel | ||
771 | */ | ||
772 | INIT_REGULATOR_REGISTER(AB8505_VAUX4SEL, 0x00, 0x00), | ||
773 | /* | ||
774 | * Vaux1Disch = short discharge time | ||
775 | * Vaux2Disch = short discharge time | ||
776 | * Vaux3Disch = short discharge time | ||
777 | * Vintcore12Disch = short discharge time | ||
778 | * VTVoutDisch = short discharge time | ||
779 | * VaudioDisch = short discharge time | ||
780 | */ | ||
781 | INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH, 0xfc, 0x00), | ||
782 | /* | ||
783 | * VanaDisch = short discharge time | ||
784 | * Vaux8PullDownEna = pulldown disabled when Vaux8 is disabled | ||
785 | * Vaux8Disch = short discharge time | ||
786 | */ | ||
787 | INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH2, 0x16, 0x00), | ||
788 | /* | ||
789 | * Vaux4Disch = short discharge time | ||
790 | */ | ||
791 | INIT_REGULATOR_REGISTER(AB8505_REGUCTRLDISCH3, 0x01, 0x00), | ||
792 | /* | ||
793 | * Vaux5Sel | ||
794 | * Vaux5LP | ||
795 | * Vaux5Ena | ||
796 | * Vaux5Disch | ||
797 | * Vaux5DisSfst | ||
798 | * Vaux5DisPulld | ||
799 | */ | ||
800 | INIT_REGULATOR_REGISTER(AB8505_CTRLVAUX5, 0x00, 0x00), | ||
801 | /* | ||
802 | * Vaux6Sel | ||
803 | * Vaux6LP | ||
804 | * Vaux6Ena | ||
805 | * Vaux6DisPulld | ||
806 | */ | ||
807 | INIT_REGULATOR_REGISTER(AB8505_CTRLVAUX6, 0x00, 0x00), | ||
808 | }; | ||
809 | |||
810 | struct regulator_init_data ab8505_regulators[AB8505_NUM_REGULATORS] = { | ||
811 | /* supplies to the display/camera */ | ||
812 | [AB8505_LDO_AUX1] = { | ||
813 | .constraints = { | ||
814 | .name = "V-DISPLAY", | ||
815 | .min_uV = 2800000, | ||
816 | .max_uV = 3300000, | ||
817 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
818 | REGULATOR_CHANGE_STATUS, | ||
819 | .boot_on = 1, /* display is on at boot */ | ||
820 | }, | ||
821 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers), | ||
822 | .consumer_supplies = ab8500_vaux1_consumers, | ||
823 | }, | ||
824 | /* supplies to the on-board eMMC */ | ||
825 | [AB8505_LDO_AUX2] = { | ||
826 | .constraints = { | ||
827 | .name = "V-eMMC1", | ||
828 | .min_uV = 1100000, | ||
829 | .max_uV = 3300000, | ||
830 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
831 | REGULATOR_CHANGE_STATUS | | ||
832 | REGULATOR_CHANGE_MODE, | ||
833 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
834 | REGULATOR_MODE_IDLE, | ||
835 | }, | ||
836 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers), | ||
837 | .consumer_supplies = ab8500_vaux2_consumers, | ||
838 | }, | ||
839 | /* supply for VAUX3, supplies to SDcard slots */ | ||
840 | [AB8505_LDO_AUX3] = { | ||
841 | .constraints = { | ||
842 | .name = "V-MMC-SD", | ||
843 | .min_uV = 1100000, | ||
844 | .max_uV = 3300000, | ||
845 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
846 | REGULATOR_CHANGE_STATUS | | ||
847 | REGULATOR_CHANGE_MODE, | ||
848 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
849 | REGULATOR_MODE_IDLE, | ||
850 | }, | ||
851 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers), | ||
852 | .consumer_supplies = ab8500_vaux3_consumers, | ||
853 | }, | ||
854 | /* supply for VAUX4, supplies to NFC and standalone secure element */ | ||
855 | [AB8505_LDO_AUX4] = { | ||
856 | .constraints = { | ||
857 | .name = "V-NFC-SE", | ||
858 | .min_uV = 1100000, | ||
859 | .max_uV = 3300000, | ||
860 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
861 | REGULATOR_CHANGE_STATUS | | ||
862 | REGULATOR_CHANGE_MODE, | ||
863 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
864 | REGULATOR_MODE_IDLE, | ||
865 | }, | ||
866 | .num_consumer_supplies = ARRAY_SIZE(ab8505_vaux4_consumers), | ||
867 | .consumer_supplies = ab8505_vaux4_consumers, | ||
868 | }, | ||
869 | /* supply for VAUX5, supplies to TBD */ | ||
870 | [AB8505_LDO_AUX5] = { | ||
871 | .constraints = { | ||
872 | .name = "V-AUX5", | ||
873 | .min_uV = 1050000, | ||
874 | .max_uV = 2790000, | ||
875 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
876 | REGULATOR_CHANGE_STATUS | | ||
877 | REGULATOR_CHANGE_MODE, | ||
878 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
879 | REGULATOR_MODE_IDLE, | ||
880 | }, | ||
881 | .num_consumer_supplies = ARRAY_SIZE(ab8505_vaux5_consumers), | ||
882 | .consumer_supplies = ab8505_vaux5_consumers, | ||
883 | }, | ||
884 | /* supply for VAUX6, supplies to TBD */ | ||
885 | [AB8505_LDO_AUX6] = { | ||
886 | .constraints = { | ||
887 | .name = "V-AUX6", | ||
888 | .min_uV = 1050000, | ||
889 | .max_uV = 2790000, | ||
890 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
891 | REGULATOR_CHANGE_STATUS | | ||
892 | REGULATOR_CHANGE_MODE, | ||
893 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
894 | REGULATOR_MODE_IDLE, | ||
895 | }, | ||
896 | .num_consumer_supplies = ARRAY_SIZE(ab8505_vaux6_consumers), | ||
897 | .consumer_supplies = ab8505_vaux6_consumers, | ||
898 | }, | ||
899 | /* supply for gpadc, ADC LDO */ | ||
900 | [AB8505_LDO_ADC] = { | ||
901 | .constraints = { | ||
902 | .name = "V-ADC", | ||
903 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
904 | }, | ||
905 | .num_consumer_supplies = ARRAY_SIZE(ab8505_vadc_consumers), | ||
906 | .consumer_supplies = ab8505_vadc_consumers, | ||
907 | }, | ||
908 | /* supply for ab8500-vaudio, VAUDIO LDO */ | ||
909 | [AB8505_LDO_AUDIO] = { | ||
910 | .constraints = { | ||
911 | .name = "V-AUD", | ||
912 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
913 | }, | ||
914 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers), | ||
915 | .consumer_supplies = ab8500_vaud_consumers, | ||
916 | }, | ||
917 | /* supply for v-anamic1 VAMic1-LDO */ | ||
918 | [AB8505_LDO_ANAMIC1] = { | ||
919 | .constraints = { | ||
920 | .name = "V-AMIC1", | ||
921 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | | ||
922 | REGULATOR_CHANGE_MODE, | ||
923 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
924 | REGULATOR_MODE_IDLE, | ||
925 | }, | ||
926 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers), | ||
927 | .consumer_supplies = ab8500_vamic1_consumers, | ||
928 | }, | ||
929 | /* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ | ||
930 | [AB8505_LDO_ANAMIC2] = { | ||
931 | .constraints = { | ||
932 | .name = "V-AMIC2", | ||
933 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | | ||
934 | REGULATOR_CHANGE_MODE, | ||
935 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
936 | REGULATOR_MODE_IDLE, | ||
937 | }, | ||
938 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers), | ||
939 | .consumer_supplies = ab8500_vamic2_consumers, | ||
940 | }, | ||
941 | /* supply for v-aux8, VAUX8 LDO */ | ||
942 | [AB8505_LDO_AUX8] = { | ||
943 | .constraints = { | ||
944 | .name = "V-AUX8", | ||
945 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
946 | }, | ||
947 | .num_consumer_supplies = ARRAY_SIZE(ab8505_vaux8_consumers), | ||
948 | .consumer_supplies = ab8505_vaux8_consumers, | ||
949 | }, | ||
950 | /* supply for v-intcore12, VINTCORE12 LDO */ | ||
951 | [AB8505_LDO_INTCORE] = { | ||
952 | .constraints = { | ||
953 | .name = "V-INTCORE", | ||
954 | .min_uV = 1250000, | ||
955 | .max_uV = 1350000, | ||
956 | .input_uV = 1800000, | ||
957 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
958 | REGULATOR_CHANGE_STATUS | | ||
959 | REGULATOR_CHANGE_MODE | | ||
960 | REGULATOR_CHANGE_DRMS, | ||
961 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
962 | REGULATOR_MODE_IDLE, | ||
963 | }, | ||
964 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers), | ||
965 | .consumer_supplies = ab8500_vintcore_consumers, | ||
966 | }, | ||
967 | /* supply for LDO USB */ | ||
968 | [AB8505_LDO_USB] = { | ||
969 | .constraints = { | ||
970 | .name = "V-USB", | ||
971 | .valid_ops_mask = REGULATOR_CHANGE_STATUS | | ||
972 | REGULATOR_CHANGE_MODE, | ||
973 | .valid_modes_mask = REGULATOR_MODE_NORMAL | | ||
974 | REGULATOR_MODE_IDLE, | ||
975 | }, | ||
976 | .num_consumer_supplies = ARRAY_SIZE(ab8505_usb_consumers), | ||
977 | .consumer_supplies = ab8505_usb_consumers, | ||
978 | }, | ||
979 | /* supply for U8500 CSI-DSI, VANA LDO */ | ||
980 | [AB8505_LDO_ANA] = { | ||
981 | .constraints = { | ||
982 | .name = "V-CSI-DSI", | ||
983 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | ||
984 | }, | ||
985 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers), | ||
986 | .consumer_supplies = ab8500_vana_consumers, | ||
987 | }, | ||
988 | }; | ||
989 | |||
990 | struct ab8500_regulator_platform_data ab8500_regulator_plat_data = { | ||
991 | .reg_init = ab8500_reg_init, | ||
992 | .num_reg_init = ARRAY_SIZE(ab8500_reg_init), | ||
993 | .regulator = ab8500_regulators, | ||
994 | .num_regulator = ARRAY_SIZE(ab8500_regulators), | ||
995 | .ext_regulator = ab8500_ext_regulators, | ||
996 | .num_ext_regulator = ARRAY_SIZE(ab8500_ext_regulators), | ||
997 | }; | ||
998 | |||
999 | /* Use the AB8500 init settings for AB8505 as they are the same right now */ | ||
1000 | struct ab8500_regulator_platform_data ab8505_regulator_plat_data = { | ||
1001 | .reg_init = ab8505_reg_init, | ||
1002 | .num_reg_init = ARRAY_SIZE(ab8505_reg_init), | ||
1003 | .regulator = ab8505_regulators, | ||
1004 | .num_regulator = ARRAY_SIZE(ab8505_regulators), | ||
1005 | }; | ||
1006 | |||
1007 | static void ab8500_modify_reg_init(int id, u8 mask, u8 value) | ||
1008 | { | ||
1009 | int i; | ||
1010 | |||
1011 | if (cpu_is_u8520()) { | ||
1012 | for (i = ARRAY_SIZE(ab8505_reg_init) - 1; i >= 0; i--) { | ||
1013 | if (ab8505_reg_init[i].id == id) { | ||
1014 | u8 initval = ab8505_reg_init[i].value; | ||
1015 | initval = (initval & ~mask) | (value & mask); | ||
1016 | ab8505_reg_init[i].value = initval; | ||
1017 | |||
1018 | BUG_ON(mask & ~ab8505_reg_init[i].mask); | ||
1019 | return; | ||
1020 | } | ||
1021 | } | ||
1022 | } else { | ||
1023 | for (i = ARRAY_SIZE(ab8500_reg_init) - 1; i >= 0; i--) { | ||
1024 | if (ab8500_reg_init[i].id == id) { | ||
1025 | u8 initval = ab8500_reg_init[i].value; | ||
1026 | initval = (initval & ~mask) | (value & mask); | ||
1027 | ab8500_reg_init[i].value = initval; | ||
1028 | |||
1029 | BUG_ON(mask & ~ab8500_reg_init[i].mask); | ||
1030 | return; | ||
1031 | } | ||
1032 | } | ||
1033 | } | ||
1034 | |||
1035 | BUG_ON(1); | ||
1036 | } | ||
1037 | |||
1038 | void mop500_regulator_init(void) | ||
1039 | { | ||
1040 | struct regulator_init_data *regulator; | ||
1041 | |||
1042 | /* | ||
1043 | * Temporarily turn on Vaux2 on 8520 machine | ||
1044 | */ | ||
1045 | if (cpu_is_u8520()) { | ||
1046 | /* Vaux2 initialized to be on */ | ||
1047 | ab8500_modify_reg_init(AB8505_VAUX12REGU, 0x0f, 0x05); | ||
1048 | } | ||
1049 | |||
1050 | /* | ||
1051 | * Handle AB8500_EXT_SUPPLY2 on HREFP_V20_V50 boards (do it for | ||
1052 | * all HREFP_V20 boards) | ||
1053 | */ | ||
1054 | if (cpu_is_u8500v20()) { | ||
1055 | /* VextSupply2RequestCtrl = HP/OFF depending on VxRequest */ | ||
1056 | ab8500_modify_reg_init(AB8500_REGUREQUESTCTRL3, 0x01, 0x01); | ||
1057 | |||
1058 | /* VextSupply2SysClkReq1HPValid = SysClkReq1 controlled */ | ||
1059 | ab8500_modify_reg_init(AB8500_REGUSYSCLKREQ1HPVALID2, | ||
1060 | 0x20, 0x20); | ||
1061 | |||
1062 | /* VextSupply2 = force HP at initialization */ | ||
1063 | ab8500_modify_reg_init(AB8500_EXTSUPPLYREGU, 0x0c, 0x04); | ||
1064 | |||
1065 | /* enable VextSupply2 during platform active */ | ||
1066 | regulator = &ab8500_ext_regulators[AB8500_EXT_SUPPLY2]; | ||
1067 | regulator->constraints.always_on = 1; | ||
1068 | |||
1069 | /* disable VextSupply2 in suspend */ | ||
1070 | regulator = &ab8500_ext_regulators[AB8500_EXT_SUPPLY2]; | ||
1071 | regulator->constraints.state_mem.disabled = 1; | ||
1072 | regulator->constraints.state_standby.disabled = 1; | ||
1073 | |||
1074 | /* enable VextSupply2 HW control (used in suspend) */ | ||
1075 | regulator->driver_data = (void *)&ab8500_ext_supply2; | ||
1076 | } | ||
1077 | } | ||
diff --git a/arch/arm/mach-ux500/board-mop500-regulators.h b/arch/arm/mach-ux500/board-mop500-regulators.h index 78a0642a2206..039f5132c370 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.h +++ b/arch/arm/mach-ux500/board-mop500-regulators.h | |||
@@ -14,10 +14,12 @@ | |||
14 | #include <linux/regulator/machine.h> | 14 | #include <linux/regulator/machine.h> |
15 | #include <linux/regulator/ab8500.h> | 15 | #include <linux/regulator/ab8500.h> |
16 | 16 | ||
17 | extern struct ab8500_regulator_reg_init | 17 | extern struct ab8500_regulator_platform_data ab8500_regulator_plat_data; |
18 | ab8500_regulator_reg_init[AB8500_NUM_REGULATOR_REGISTERS]; | 18 | extern struct ab8500_regulator_platform_data ab8505_regulator_plat_data; |
19 | extern struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS]; | ||
20 | extern struct regulator_init_data tps61052_regulator; | 19 | extern struct regulator_init_data tps61052_regulator; |
21 | extern struct regulator_init_data gpio_en_3v3_regulator; | 20 | extern struct regulator_init_data gpio_en_3v3_regulator; |
21 | extern struct regulator_init_data sdi0_reg_init_data; | ||
22 | |||
23 | void mop500_regulator_init(void); | ||
22 | 24 | ||
23 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 7f2cb6c5e2c1..6db0740128de 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
@@ -31,35 +31,6 @@ | |||
31 | * SDI 0 (MicroSD slot) | 31 | * SDI 0 (MicroSD slot) |
32 | */ | 32 | */ |
33 | 33 | ||
34 | /* GPIO pins used by the sdi0 level shifter */ | ||
35 | static int sdi0_en = -1; | ||
36 | static int sdi0_vsel = -1; | ||
37 | |||
38 | static int mop500_sdi0_ios_handler(struct device *dev, struct mmc_ios *ios) | ||
39 | { | ||
40 | switch (ios->power_mode) { | ||
41 | case MMC_POWER_UP: | ||
42 | case MMC_POWER_ON: | ||
43 | /* | ||
44 | * Level shifter voltage should depend on vdd to when deciding | ||
45 | * on either 1.8V or 2.9V. Once the decision has been made the | ||
46 | * level shifter must be disabled and re-enabled with a changed | ||
47 | * select signal in order to switch the voltage. Since there is | ||
48 | * no framework support yet for indicating 1.8V in vdd, use the | ||
49 | * default 2.9V. | ||
50 | */ | ||
51 | gpio_direction_output(sdi0_vsel, 0); | ||
52 | gpio_direction_output(sdi0_en, 1); | ||
53 | break; | ||
54 | case MMC_POWER_OFF: | ||
55 | gpio_direction_output(sdi0_vsel, 0); | ||
56 | gpio_direction_output(sdi0_en, 0); | ||
57 | break; | ||
58 | } | ||
59 | |||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | #ifdef CONFIG_STE_DMA40 | 34 | #ifdef CONFIG_STE_DMA40 |
64 | struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = { | 35 | struct stedma40_chan_cfg mop500_sdi0_dma_cfg_rx = { |
65 | .mode = STEDMA40_MODE_LOGICAL, | 36 | .mode = STEDMA40_MODE_LOGICAL, |
@@ -100,22 +71,6 @@ struct mmci_platform_data mop500_sdi0_data = { | |||
100 | 71 | ||
101 | static void sdi0_configure(struct device *parent) | 72 | static void sdi0_configure(struct device *parent) |
102 | { | 73 | { |
103 | int ret; | ||
104 | |||
105 | ret = gpio_request(sdi0_en, "level shifter enable"); | ||
106 | if (!ret) | ||
107 | ret = gpio_request(sdi0_vsel, | ||
108 | "level shifter 1v8-3v select"); | ||
109 | |||
110 | if (ret) { | ||
111 | pr_warning("unable to config sdi0 gpios for level shifter.\n"); | ||
112 | return; | ||
113 | } | ||
114 | |||
115 | /* Select the default 2.9V and enable level shifter */ | ||
116 | gpio_direction_output(sdi0_vsel, 0); | ||
117 | gpio_direction_output(sdi0_en, 1); | ||
118 | |||
119 | /* Add the device, force v2 to subrevision 1 */ | 74 | /* Add the device, force v2 to subrevision 1 */ |
120 | db8500_add_sdi0(parent, &mop500_sdi0_data, U8500_SDI_V2_PERIPHID); | 75 | db8500_add_sdi0(parent, &mop500_sdi0_data, U8500_SDI_V2_PERIPHID); |
121 | } | 76 | } |
@@ -123,8 +78,6 @@ static void sdi0_configure(struct device *parent) | |||
123 | void mop500_sdi_tc35892_init(struct device *parent) | 78 | void mop500_sdi_tc35892_init(struct device *parent) |
124 | { | 79 | { |
125 | mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD; | 80 | mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD; |
126 | sdi0_en = GPIO_SDMMC_EN; | ||
127 | sdi0_vsel = GPIO_SDMMC_1V8_3V_SEL; | ||
128 | sdi0_configure(parent); | 81 | sdi0_configure(parent); |
129 | } | 82 | } |
130 | 83 | ||
@@ -263,8 +216,6 @@ void __init snowball_sdi_init(struct device *parent) | |||
263 | /* External Micro SD slot */ | 216 | /* External Micro SD slot */ |
264 | mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO; | 217 | mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO; |
265 | mop500_sdi0_data.cd_invert = true; | 218 | mop500_sdi0_data.cd_invert = true; |
266 | sdi0_en = SNOWBALL_SDMMC_EN_GPIO; | ||
267 | sdi0_vsel = SNOWBALL_SDMMC_1V8_3V_GPIO; | ||
268 | sdi0_configure(parent); | 219 | sdi0_configure(parent); |
269 | } | 220 | } |
270 | 221 | ||
@@ -276,8 +227,6 @@ void __init hrefv60_sdi_init(struct device *parent) | |||
276 | db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID); | 227 | db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID); |
277 | /* External Micro SD slot */ | 228 | /* External Micro SD slot */ |
278 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; | 229 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; |
279 | sdi0_en = HREFV60_SDMMC_EN_GPIO; | ||
280 | sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO; | ||
281 | sdi0_configure(parent); | 230 | sdi0_configure(parent); |
282 | /* WLAN SDIO channel */ | 231 | /* WLAN SDIO channel */ |
283 | db8500_add_sdi1(parent, &mop500_sdi1_data, U8500_SDI_V2_PERIPHID); | 232 | db8500_add_sdi1(parent, &mop500_sdi1_data, U8500_SDI_V2_PERIPHID); |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 87d2d7b38ce9..574916b70b2e 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <linux/mfd/abx500/ab8500.h> | 25 | #include <linux/mfd/abx500/ab8500.h> |
26 | #include <linux/regulator/ab8500.h> | 26 | #include <linux/regulator/ab8500.h> |
27 | #include <linux/regulator/fixed.h> | 27 | #include <linux/regulator/fixed.h> |
28 | #include <linux/regulator/driver.h> | ||
29 | #include <linux/regulator/gpio-regulator.h> | ||
28 | #include <linux/mfd/tc3589x.h> | 30 | #include <linux/mfd/tc3589x.h> |
29 | #include <linux/mfd/tps6105x.h> | 31 | #include <linux/mfd/tps6105x.h> |
30 | #include <linux/mfd/abx500/ab8500-gpio.h> | 32 | #include <linux/mfd/abx500/ab8500-gpio.h> |
@@ -90,6 +92,37 @@ static struct platform_device snowball_gpio_en_3v3_regulator_dev = { | |||
90 | }, | 92 | }, |
91 | }; | 93 | }; |
92 | 94 | ||
95 | /* Dynamically populated. */ | ||
96 | static struct gpio sdi0_reg_gpios[] = { | ||
97 | { 0, GPIOF_OUT_INIT_LOW, "mmci_vsel" }, | ||
98 | }; | ||
99 | |||
100 | static struct gpio_regulator_state sdi0_reg_states[] = { | ||
101 | { .value = 2900000, .gpios = (0 << 0) }, | ||
102 | { .value = 1800000, .gpios = (1 << 0) }, | ||
103 | }; | ||
104 | |||
105 | static struct gpio_regulator_config sdi0_reg_info = { | ||
106 | .supply_name = "ext-mmc-level-shifter", | ||
107 | .gpios = sdi0_reg_gpios, | ||
108 | .nr_gpios = ARRAY_SIZE(sdi0_reg_gpios), | ||
109 | .states = sdi0_reg_states, | ||
110 | .nr_states = ARRAY_SIZE(sdi0_reg_states), | ||
111 | .type = REGULATOR_VOLTAGE, | ||
112 | .enable_high = 1, | ||
113 | .enabled_at_boot = 0, | ||
114 | .init_data = &sdi0_reg_init_data, | ||
115 | .startup_delay = 100, | ||
116 | }; | ||
117 | |||
118 | static struct platform_device sdi0_regulator = { | ||
119 | .name = "gpio-regulator", | ||
120 | .id = -1, | ||
121 | .dev = { | ||
122 | .platform_data = &sdi0_reg_info, | ||
123 | }, | ||
124 | }; | ||
125 | |||
93 | static struct abx500_gpio_platform_data ab8500_gpio_pdata = { | 126 | static struct abx500_gpio_platform_data ab8500_gpio_pdata = { |
94 | .gpio_base = MOP500_AB8500_PIN_GPIO(1), | 127 | .gpio_base = MOP500_AB8500_PIN_GPIO(1), |
95 | }; | 128 | }; |
@@ -199,10 +232,7 @@ static struct platform_device snowball_sbnet_dev = { | |||
199 | 232 | ||
200 | struct ab8500_platform_data ab8500_platdata = { | 233 | struct ab8500_platform_data ab8500_platdata = { |
201 | .irq_base = MOP500_AB8500_IRQ_BASE, | 234 | .irq_base = MOP500_AB8500_IRQ_BASE, |
202 | .regulator_reg_init = ab8500_regulator_reg_init, | 235 | .regulator = &ab8500_regulator_plat_data, |
203 | .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init), | ||
204 | .regulator = ab8500_regulators, | ||
205 | .num_regulator = ARRAY_SIZE(ab8500_regulators), | ||
206 | .gpio = &ab8500_gpio_pdata, | 236 | .gpio = &ab8500_gpio_pdata, |
207 | .codec = &ab8500_codec_pdata, | 237 | .codec = &ab8500_codec_pdata, |
208 | }; | 238 | }; |
@@ -491,6 +521,7 @@ static struct hash_platform_data u8500_hash1_platform_data = { | |||
491 | /* add any platform devices here - TODO */ | 521 | /* add any platform devices here - TODO */ |
492 | static struct platform_device *mop500_platform_devs[] __initdata = { | 522 | static struct platform_device *mop500_platform_devs[] __initdata = { |
493 | &mop500_gpio_keys_device, | 523 | &mop500_gpio_keys_device, |
524 | &sdi0_regulator, | ||
494 | }; | 525 | }; |
495 | 526 | ||
496 | #ifdef CONFIG_STE_DMA40 | 527 | #ifdef CONFIG_STE_DMA40 |
@@ -634,6 +665,7 @@ static struct platform_device *snowball_platform_devs[] __initdata = { | |||
634 | &snowball_gpio_en_3v3_regulator_dev, | 665 | &snowball_gpio_en_3v3_regulator_dev, |
635 | &u8500_thsens_device, | 666 | &u8500_thsens_device, |
636 | &u8500_cpufreq_cooling_device, | 667 | &u8500_cpufreq_cooling_device, |
668 | &sdi0_regulator, | ||
637 | }; | 669 | }; |
638 | 670 | ||
639 | static void __init mop500_init_machine(void) | 671 | static void __init mop500_init_machine(void) |
@@ -645,6 +677,9 @@ static void __init mop500_init_machine(void) | |||
645 | platform_device_register(&db8500_prcmu_device); | 677 | platform_device_register(&db8500_prcmu_device); |
646 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; | 678 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; |
647 | 679 | ||
680 | sdi0_reg_info.enable_gpio = GPIO_SDMMC_EN; | ||
681 | sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL; | ||
682 | |||
648 | mop500_pinmaps_init(); | 683 | mop500_pinmaps_init(); |
649 | parent = u8500_init_devices(&ab8500_platdata); | 684 | parent = u8500_init_devices(&ab8500_platdata); |
650 | 685 | ||
@@ -678,6 +713,10 @@ static void __init snowball_init_machine(void) | |||
678 | int i; | 713 | int i; |
679 | 714 | ||
680 | platform_device_register(&db8500_prcmu_device); | 715 | platform_device_register(&db8500_prcmu_device); |
716 | |||
717 | sdi0_reg_info.enable_gpio = SNOWBALL_SDMMC_EN_GPIO; | ||
718 | sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO; | ||
719 | |||
681 | snowball_pinmaps_init(); | 720 | snowball_pinmaps_init(); |
682 | parent = u8500_init_devices(&ab8500_platdata); | 721 | parent = u8500_init_devices(&ab8500_platdata); |
683 | 722 | ||
@@ -713,6 +752,9 @@ static void __init hrefv60_init_machine(void) | |||
713 | */ | 752 | */ |
714 | mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; | 753 | mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; |
715 | 754 | ||
755 | sdi0_reg_info.enable_gpio = HREFV60_SDMMC_EN_GPIO; | ||
756 | sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO; | ||
757 | |||
716 | hrefv60_pinmaps_init(); | 758 | hrefv60_pinmaps_init(); |
717 | parent = u8500_init_devices(&ab8500_platdata); | 759 | parent = u8500_init_devices(&ab8500_platdata); |
718 | 760 | ||
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index f1a581844372..5c6c2e633868 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -282,6 +282,7 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | |||
282 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), | 282 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), |
283 | OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", | 283 | OF_DEV_AUXDATA("stericsson,db8500-prcmu", 0x80157000, "db8500-prcmu", |
284 | &db8500_prcmu_pdata), | 284 | &db8500_prcmu_pdata), |
285 | OF_DEV_AUXDATA("smsc,lan9115", 0x50000000, "smsc911x", NULL), | ||
285 | /* Requires device name bindings. */ | 286 | /* Requires device name bindings. */ |
286 | OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE, | 287 | OF_DEV_AUXDATA("stericsson,nmk-pinctrl", U8500_PRCMU_BASE, |
287 | "pinctrl-db8500", NULL), | 288 | "pinctrl-db8500", NULL), |
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c index ce9149302cc3..488e07472d98 100644 --- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/cpuidle.h> | 13 | #include <linux/cpuidle.h> |
14 | #include <linux/clockchips.h> | ||
15 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
16 | #include <linux/atomic.h> | 15 | #include <linux/atomic.h> |
17 | #include <linux/smp.h> | 16 | #include <linux/smp.h> |
@@ -22,7 +21,6 @@ | |||
22 | 21 | ||
23 | static atomic_t master = ATOMIC_INIT(0); | 22 | static atomic_t master = ATOMIC_INIT(0); |
24 | static DEFINE_SPINLOCK(master_lock); | 23 | static DEFINE_SPINLOCK(master_lock); |
25 | static DEFINE_PER_CPU(struct cpuidle_device, ux500_cpuidle_device); | ||
26 | 24 | ||
27 | static inline int ux500_enter_idle(struct cpuidle_device *dev, | 25 | static inline int ux500_enter_idle(struct cpuidle_device *dev, |
28 | struct cpuidle_driver *drv, int index) | 26 | struct cpuidle_driver *drv, int index) |
@@ -30,8 +28,6 @@ static inline int ux500_enter_idle(struct cpuidle_device *dev, | |||
30 | int this_cpu = smp_processor_id(); | 28 | int this_cpu = smp_processor_id(); |
31 | bool recouple = false; | 29 | bool recouple = false; |
32 | 30 | ||
33 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &this_cpu); | ||
34 | |||
35 | if (atomic_inc_return(&master) == num_online_cpus()) { | 31 | if (atomic_inc_return(&master) == num_online_cpus()) { |
36 | 32 | ||
37 | /* With this lock, we prevent the other cpu to exit and enter | 33 | /* With this lock, we prevent the other cpu to exit and enter |
@@ -91,22 +87,20 @@ out: | |||
91 | spin_unlock(&master_lock); | 87 | spin_unlock(&master_lock); |
92 | } | 88 | } |
93 | 89 | ||
94 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &this_cpu); | ||
95 | |||
96 | return index; | 90 | return index; |
97 | } | 91 | } |
98 | 92 | ||
99 | static struct cpuidle_driver ux500_idle_driver = { | 93 | static struct cpuidle_driver ux500_idle_driver = { |
100 | .name = "ux500_idle", | 94 | .name = "ux500_idle", |
101 | .owner = THIS_MODULE, | 95 | .owner = THIS_MODULE, |
102 | .en_core_tk_irqen = 1, | ||
103 | .states = { | 96 | .states = { |
104 | ARM_CPUIDLE_WFI_STATE, | 97 | ARM_CPUIDLE_WFI_STATE, |
105 | { | 98 | { |
106 | .enter = ux500_enter_idle, | 99 | .enter = ux500_enter_idle, |
107 | .exit_latency = 70, | 100 | .exit_latency = 70, |
108 | .target_residency = 260, | 101 | .target_residency = 260, |
109 | .flags = CPUIDLE_FLAG_TIME_VALID, | 102 | .flags = CPUIDLE_FLAG_TIME_VALID | |
103 | CPUIDLE_FLAG_TIMER_STOP, | ||
110 | .name = "ApIdle", | 104 | .name = "ApIdle", |
111 | .desc = "ARM Retention", | 105 | .desc = "ARM Retention", |
112 | }, | 106 | }, |
@@ -115,59 +109,13 @@ static struct cpuidle_driver ux500_idle_driver = { | |||
115 | .state_count = 2, | 109 | .state_count = 2, |
116 | }; | 110 | }; |
117 | 111 | ||
118 | /* | ||
119 | * For each cpu, setup the broadcast timer because we will | ||
120 | * need to migrate the timers for the states >= ApIdle. | ||
121 | */ | ||
122 | static void ux500_setup_broadcast_timer(void *arg) | ||
123 | { | ||
124 | int cpu = smp_processor_id(); | ||
125 | clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); | ||
126 | } | ||
127 | |||
128 | int __init ux500_idle_init(void) | 112 | int __init ux500_idle_init(void) |
129 | { | 113 | { |
130 | int ret, cpu; | ||
131 | struct cpuidle_device *device; | ||
132 | |||
133 | /* Configure wake up reasons */ | 114 | /* Configure wake up reasons */ |
134 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | | 115 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | |
135 | PRCMU_WAKEUP(ABB)); | 116 | PRCMU_WAKEUP(ABB)); |
136 | 117 | ||
137 | /* | 118 | return cpuidle_register(&ux500_idle_driver, NULL); |
138 | * Configure the timer broadcast for each cpu, that must | ||
139 | * be done from the cpu context, so we use a smp cross | ||
140 | * call with 'on_each_cpu'. | ||
141 | */ | ||
142 | on_each_cpu(ux500_setup_broadcast_timer, NULL, 1); | ||
143 | |||
144 | ret = cpuidle_register_driver(&ux500_idle_driver); | ||
145 | if (ret) { | ||
146 | printk(KERN_ERR "failed to register ux500 idle driver\n"); | ||
147 | return ret; | ||
148 | } | ||
149 | |||
150 | for_each_online_cpu(cpu) { | ||
151 | device = &per_cpu(ux500_cpuidle_device, cpu); | ||
152 | device->cpu = cpu; | ||
153 | ret = cpuidle_register_device(device); | ||
154 | if (ret) { | ||
155 | printk(KERN_ERR "Failed to register cpuidle " | ||
156 | "device for cpu%d\n", cpu); | ||
157 | goto out_unregister; | ||
158 | } | ||
159 | } | ||
160 | out: | ||
161 | return ret; | ||
162 | |||
163 | out_unregister: | ||
164 | for_each_online_cpu(cpu) { | ||
165 | device = &per_cpu(ux500_cpuidle_device, cpu); | ||
166 | cpuidle_unregister_device(device); | ||
167 | } | ||
168 | |||
169 | cpuidle_unregister_driver(&ux500_idle_driver); | ||
170 | goto out; | ||
171 | } | 119 | } |
172 | 120 | ||
173 | device_initcall(ux500_idle_init); | 121 | device_initcall(ux500_idle_init); |
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig index 52d315b792c8..0f1c5e53fb27 100644 --- a/arch/arm/mach-vexpress/Kconfig +++ b/arch/arm/mach-vexpress/Kconfig | |||
@@ -17,6 +17,9 @@ config ARCH_VEXPRESS | |||
17 | select NO_IOPORT | 17 | select NO_IOPORT |
18 | select PLAT_VERSATILE | 18 | select PLAT_VERSATILE |
19 | select PLAT_VERSATILE_CLCD | 19 | select PLAT_VERSATILE_CLCD |
20 | select POWER_RESET | ||
21 | select POWER_RESET_VEXPRESS | ||
22 | select POWER_SUPPLY | ||
20 | select REGULATOR_FIXED_VOLTAGE if REGULATOR | 23 | select REGULATOR_FIXED_VOLTAGE if REGULATOR |
21 | select VEXPRESS_CONFIG | 24 | select VEXPRESS_CONFIG |
22 | help | 25 | help |
diff --git a/arch/arm/mach-vexpress/Makefile b/arch/arm/mach-vexpress/Makefile index 80b64971fbdd..42703e8b4d3b 100644 --- a/arch/arm/mach-vexpress/Makefile +++ b/arch/arm/mach-vexpress/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ | 4 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ |
5 | -I$(srctree)/arch/arm/plat-versatile/include | 5 | -I$(srctree)/arch/arm/plat-versatile/include |
6 | 6 | ||
7 | obj-y := v2m.o reset.o | 7 | obj-y := v2m.o |
8 | obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o | 8 | obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o |
9 | obj-$(CONFIG_SMP) += platsmp.o | 9 | obj-$(CONFIG_SMP) += platsmp.o |
10 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 10 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
diff --git a/arch/arm/mach-vexpress/reset.c b/arch/arm/mach-vexpress/reset.c deleted file mode 100644 index 465923aa3819..000000000000 --- a/arch/arm/mach-vexpress/reset.c +++ /dev/null | |||
@@ -1,141 +0,0 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License version 2 as | ||
4 | * published by the Free Software Foundation. | ||
5 | * | ||
6 | * This program is distributed in the hope that it will be useful, | ||
7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
9 | * GNU General Public License for more details. | ||
10 | * | ||
11 | * Copyright (C) 2012 ARM Limited | ||
12 | */ | ||
13 | |||
14 | #include <linux/jiffies.h> | ||
15 | #include <linux/of.h> | ||
16 | #include <linux/of_device.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/stat.h> | ||
19 | #include <linux/vexpress.h> | ||
20 | |||
21 | static void vexpress_reset_do(struct device *dev, const char *what) | ||
22 | { | ||
23 | int err = -ENOENT; | ||
24 | struct vexpress_config_func *func = | ||
25 | vexpress_config_func_get_by_dev(dev); | ||
26 | |||
27 | if (func) { | ||
28 | unsigned long timeout; | ||
29 | |||
30 | err = vexpress_config_write(func, 0, 0); | ||
31 | |||
32 | timeout = jiffies + HZ; | ||
33 | while (time_before(jiffies, timeout)) | ||
34 | cpu_relax(); | ||
35 | } | ||
36 | |||
37 | dev_emerg(dev, "Unable to %s (%d)\n", what, err); | ||
38 | } | ||
39 | |||
40 | static struct device *vexpress_power_off_device; | ||
41 | |||
42 | void vexpress_power_off(void) | ||
43 | { | ||
44 | vexpress_reset_do(vexpress_power_off_device, "power off"); | ||
45 | } | ||
46 | |||
47 | static struct device *vexpress_restart_device; | ||
48 | |||
49 | void vexpress_restart(char str, const char *cmd) | ||
50 | { | ||
51 | vexpress_reset_do(vexpress_restart_device, "restart"); | ||
52 | } | ||
53 | |||
54 | static ssize_t vexpress_reset_active_show(struct device *dev, | ||
55 | struct device_attribute *attr, char *buf) | ||
56 | { | ||
57 | return sprintf(buf, "%d\n", vexpress_restart_device == dev); | ||
58 | } | ||
59 | |||
60 | static ssize_t vexpress_reset_active_store(struct device *dev, | ||
61 | struct device_attribute *attr, const char *buf, size_t count) | ||
62 | { | ||
63 | long value; | ||
64 | int err = kstrtol(buf, 0, &value); | ||
65 | |||
66 | if (!err && value) | ||
67 | vexpress_restart_device = dev; | ||
68 | |||
69 | return err ? err : count; | ||
70 | } | ||
71 | |||
72 | DEVICE_ATTR(active, S_IRUGO | S_IWUSR, vexpress_reset_active_show, | ||
73 | vexpress_reset_active_store); | ||
74 | |||
75 | |||
76 | enum vexpress_reset_func { FUNC_RESET, FUNC_SHUTDOWN, FUNC_REBOOT }; | ||
77 | |||
78 | static struct of_device_id vexpress_reset_of_match[] = { | ||
79 | { | ||
80 | .compatible = "arm,vexpress-reset", | ||
81 | .data = (void *)FUNC_RESET, | ||
82 | }, { | ||
83 | .compatible = "arm,vexpress-shutdown", | ||
84 | .data = (void *)FUNC_SHUTDOWN | ||
85 | }, { | ||
86 | .compatible = "arm,vexpress-reboot", | ||
87 | .data = (void *)FUNC_REBOOT | ||
88 | }, | ||
89 | {} | ||
90 | }; | ||
91 | |||
92 | static int vexpress_reset_probe(struct platform_device *pdev) | ||
93 | { | ||
94 | enum vexpress_reset_func func; | ||
95 | const struct of_device_id *match = | ||
96 | of_match_device(vexpress_reset_of_match, &pdev->dev); | ||
97 | |||
98 | if (match) | ||
99 | func = (enum vexpress_reset_func)match->data; | ||
100 | else | ||
101 | func = pdev->id_entry->driver_data; | ||
102 | |||
103 | switch (func) { | ||
104 | case FUNC_SHUTDOWN: | ||
105 | vexpress_power_off_device = &pdev->dev; | ||
106 | break; | ||
107 | case FUNC_RESET: | ||
108 | if (!vexpress_restart_device) | ||
109 | vexpress_restart_device = &pdev->dev; | ||
110 | device_create_file(&pdev->dev, &dev_attr_active); | ||
111 | break; | ||
112 | case FUNC_REBOOT: | ||
113 | vexpress_restart_device = &pdev->dev; | ||
114 | device_create_file(&pdev->dev, &dev_attr_active); | ||
115 | break; | ||
116 | }; | ||
117 | |||
118 | return 0; | ||
119 | } | ||
120 | |||
121 | static const struct platform_device_id vexpress_reset_id_table[] = { | ||
122 | { .name = "vexpress-reset", .driver_data = FUNC_RESET, }, | ||
123 | { .name = "vexpress-shutdown", .driver_data = FUNC_SHUTDOWN, }, | ||
124 | { .name = "vexpress-reboot", .driver_data = FUNC_REBOOT, }, | ||
125 | {} | ||
126 | }; | ||
127 | |||
128 | static struct platform_driver vexpress_reset_driver = { | ||
129 | .probe = vexpress_reset_probe, | ||
130 | .driver = { | ||
131 | .name = "vexpress-reset", | ||
132 | .of_match_table = vexpress_reset_of_match, | ||
133 | }, | ||
134 | .id_table = vexpress_reset_id_table, | ||
135 | }; | ||
136 | |||
137 | static int __init vexpress_reset_init(void) | ||
138 | { | ||
139 | return platform_driver_register(&vexpress_reset_driver); | ||
140 | } | ||
141 | device_initcall(vexpress_reset_init); | ||
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index d0ad78998cb6..9366f37902d9 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <linux/regulator/fixed.h> | 22 | #include <linux/regulator/fixed.h> |
23 | #include <linux/regulator/machine.h> | 23 | #include <linux/regulator/machine.h> |
24 | #include <linux/vexpress.h> | 24 | #include <linux/vexpress.h> |
25 | #include <linux/clk-provider.h> | ||
26 | #include <linux/clkdev.h> | ||
25 | 27 | ||
26 | #include <asm/arch_timer.h> | 28 | #include <asm/arch_timer.h> |
27 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
@@ -361,8 +363,6 @@ static void __init v2m_init(void) | |||
361 | for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++) | 363 | for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++) |
362 | amba_device_register(v2m_amba_devs[i], &iomem_resource); | 364 | amba_device_register(v2m_amba_devs[i], &iomem_resource); |
363 | 365 | ||
364 | pm_power_off = vexpress_power_off; | ||
365 | |||
366 | ct_desc->init_tile(); | 366 | ct_desc->init_tile(); |
367 | } | 367 | } |
368 | 368 | ||
@@ -374,7 +374,6 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express") | |||
374 | .init_irq = v2m_init_irq, | 374 | .init_irq = v2m_init_irq, |
375 | .init_time = v2m_timer_init, | 375 | .init_time = v2m_timer_init, |
376 | .init_machine = v2m_init, | 376 | .init_machine = v2m_init, |
377 | .restart = vexpress_restart, | ||
378 | MACHINE_END | 377 | MACHINE_END |
379 | 378 | ||
380 | static struct map_desc v2m_rs1_io_desc __initdata = { | 379 | static struct map_desc v2m_rs1_io_desc __initdata = { |
@@ -433,7 +432,7 @@ static void __init v2m_dt_timer_init(void) | |||
433 | { | 432 | { |
434 | struct device_node *node = NULL; | 433 | struct device_node *node = NULL; |
435 | 434 | ||
436 | vexpress_clk_of_init(); | 435 | of_clk_init(NULL); |
437 | 436 | ||
438 | clocksource_of_init(); | 437 | clocksource_of_init(); |
439 | do { | 438 | do { |
@@ -442,6 +441,10 @@ static void __init v2m_dt_timer_init(void) | |||
442 | if (node) { | 441 | if (node) { |
443 | pr_info("Using SP804 '%s' as a clock & events source\n", | 442 | pr_info("Using SP804 '%s' as a clock & events source\n", |
444 | node->full_name); | 443 | node->full_name); |
444 | WARN_ON(clk_register_clkdev(of_clk_get_by_name(node, | ||
445 | "timclken1"), "v2m-timer0", "sp804")); | ||
446 | WARN_ON(clk_register_clkdev(of_clk_get_by_name(node, | ||
447 | "timclken2"), "v2m-timer1", "sp804")); | ||
445 | v2m_sp804_init(of_iomap(node, 0), | 448 | v2m_sp804_init(of_iomap(node, 0), |
446 | irq_of_parse_and_map(node, 0)); | 449 | irq_of_parse_and_map(node, 0)); |
447 | } | 450 | } |
@@ -464,7 +467,6 @@ static void __init v2m_dt_init(void) | |||
464 | { | 467 | { |
465 | l2x0_of_init(0x00400000, 0xfe0fffff); | 468 | l2x0_of_init(0x00400000, 0xfe0fffff); |
466 | of_platform_populate(NULL, v2m_dt_bus_match, NULL, NULL); | 469 | of_platform_populate(NULL, v2m_dt_bus_match, NULL, NULL); |
467 | pm_power_off = vexpress_power_off; | ||
468 | } | 470 | } |
469 | 471 | ||
470 | static const char * const v2m_dt_match[] __initconst = { | 472 | static const char * const v2m_dt_match[] __initconst = { |
@@ -481,5 +483,4 @@ DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express") | |||
481 | .init_irq = irqchip_init, | 483 | .init_irq = irqchip_init, |
482 | .init_time = v2m_dt_timer_init, | 484 | .init_time = v2m_dt_timer_init, |
483 | .init_machine = v2m_dt_init, | 485 | .init_machine = v2m_dt_init, |
484 | .restart = vexpress_restart, | ||
485 | MACHINE_END | 486 | MACHINE_END |
diff --git a/arch/arm/mach-w90x900/dev.c b/arch/arm/mach-w90x900/dev.c index 7abdb9645c5b..e65a80a1ac75 100644 --- a/arch/arm/mach-w90x900/dev.c +++ b/arch/arm/mach-w90x900/dev.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
22 | #include <linux/cpu.h> | ||
22 | 23 | ||
23 | #include <linux/mtd/physmap.h> | 24 | #include <linux/mtd/physmap.h> |
24 | #include <linux/mtd/mtd.h> | 25 | #include <linux/mtd/mtd.h> |
@@ -531,7 +532,7 @@ static struct platform_device *nuc900_public_dev[] __initdata = { | |||
531 | 532 | ||
532 | void __init nuc900_board_init(struct platform_device **device, int size) | 533 | void __init nuc900_board_init(struct platform_device **device, int size) |
533 | { | 534 | { |
534 | disable_hlt(); | 535 | cpu_idle_poll_ctrl(true); |
535 | platform_add_devices(device, size); | 536 | platform_add_devices(device, size); |
536 | platform_add_devices(nuc900_public_dev, ARRAY_SIZE(nuc900_public_dev)); | 537 | platform_add_devices(nuc900_public_dev, ARRAY_SIZE(nuc900_public_dev)); |
537 | spi_register_board_info(nuc900_spi_board_info, | 538 | spi_register_board_info(nuc900_spi_board_info, |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 025d17328730..4045c4931a30 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -43,7 +43,7 @@ config CPU_ARM740T | |||
43 | depends on !MMU | 43 | depends on !MMU |
44 | select CPU_32v4T | 44 | select CPU_32v4T |
45 | select CPU_ABRT_LV4T | 45 | select CPU_ABRT_LV4T |
46 | select CPU_CACHE_V3 # although the core is v4t | 46 | select CPU_CACHE_V4 |
47 | select CPU_CP15_MPU | 47 | select CPU_CP15_MPU |
48 | select CPU_PABRT_LEGACY | 48 | select CPU_PABRT_LEGACY |
49 | help | 49 | help |
@@ -469,9 +469,6 @@ config CPU_PABRT_V7 | |||
469 | bool | 469 | bool |
470 | 470 | ||
471 | # The cache model | 471 | # The cache model |
472 | config CPU_CACHE_V3 | ||
473 | bool | ||
474 | |||
475 | config CPU_CACHE_V4 | 472 | config CPU_CACHE_V4 |
476 | bool | 473 | bool |
477 | 474 | ||
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 4e333fa2756f..9e51be96f635 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -33,7 +33,6 @@ obj-$(CONFIG_CPU_PABRT_LEGACY) += pabort-legacy.o | |||
33 | obj-$(CONFIG_CPU_PABRT_V6) += pabort-v6.o | 33 | obj-$(CONFIG_CPU_PABRT_V6) += pabort-v6.o |
34 | obj-$(CONFIG_CPU_PABRT_V7) += pabort-v7.o | 34 | obj-$(CONFIG_CPU_PABRT_V7) += pabort-v7.o |
35 | 35 | ||
36 | obj-$(CONFIG_CPU_CACHE_V3) += cache-v3.o | ||
37 | obj-$(CONFIG_CPU_CACHE_V4) += cache-v4.o | 36 | obj-$(CONFIG_CPU_CACHE_V4) += cache-v4.o |
38 | obj-$(CONFIG_CPU_CACHE_V4WT) += cache-v4wt.o | 37 | obj-$(CONFIG_CPU_CACHE_V4WT) += cache-v4wt.o |
39 | obj-$(CONFIG_CPU_CACHE_V4WB) += cache-v4wb.o | 38 | obj-$(CONFIG_CPU_CACHE_V4WB) += cache-v4wb.o |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index dd3d59122cc3..48bc3c0a87ce 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
@@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override) | |||
343 | outer_cache.inv_range = feroceon_l2_inv_range; | 343 | outer_cache.inv_range = feroceon_l2_inv_range; |
344 | outer_cache.clean_range = feroceon_l2_clean_range; | 344 | outer_cache.clean_range = feroceon_l2_clean_range; |
345 | outer_cache.flush_range = feroceon_l2_flush_range; | 345 | outer_cache.flush_range = feroceon_l2_flush_range; |
346 | outer_cache.inv_all = l2_inv_all; | ||
346 | 347 | ||
347 | enable_l2(); | 348 | enable_l2(); |
348 | 349 | ||
diff --git a/arch/arm/mm/cache-v3.S b/arch/arm/mm/cache-v3.S deleted file mode 100644 index 8a3fadece8d3..000000000000 --- a/arch/arm/mm/cache-v3.S +++ /dev/null | |||
@@ -1,137 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/cache-v3.S | ||
3 | * | ||
4 | * Copyright (C) 1997-2002 Russell king | ||
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 version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | #include <linux/linkage.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <asm/page.h> | ||
13 | #include "proc-macros.S" | ||
14 | |||
15 | /* | ||
16 | * flush_icache_all() | ||
17 | * | ||
18 | * Unconditionally clean and invalidate the entire icache. | ||
19 | */ | ||
20 | ENTRY(v3_flush_icache_all) | ||
21 | mov pc, lr | ||
22 | ENDPROC(v3_flush_icache_all) | ||
23 | |||
24 | /* | ||
25 | * flush_user_cache_all() | ||
26 | * | ||
27 | * Invalidate all cache entries in a particular address | ||
28 | * space. | ||
29 | * | ||
30 | * - mm - mm_struct describing address space | ||
31 | */ | ||
32 | ENTRY(v3_flush_user_cache_all) | ||
33 | /* FALLTHROUGH */ | ||
34 | /* | ||
35 | * flush_kern_cache_all() | ||
36 | * | ||
37 | * Clean and invalidate the entire cache. | ||
38 | */ | ||
39 | ENTRY(v3_flush_kern_cache_all) | ||
40 | /* FALLTHROUGH */ | ||
41 | |||
42 | /* | ||
43 | * flush_user_cache_range(start, end, flags) | ||
44 | * | ||
45 | * Invalidate a range of cache entries in the specified | ||
46 | * address space. | ||
47 | * | ||
48 | * - start - start address (may not be aligned) | ||
49 | * - end - end address (exclusive, may not be aligned) | ||
50 | * - flags - vma_area_struct flags describing address space | ||
51 | */ | ||
52 | ENTRY(v3_flush_user_cache_range) | ||
53 | mov ip, #0 | ||
54 | mcreq p15, 0, ip, c7, c0, 0 @ flush ID cache | ||
55 | mov pc, lr | ||
56 | |||
57 | /* | ||
58 | * coherent_kern_range(start, end) | ||
59 | * | ||
60 | * Ensure coherency between the Icache and the Dcache in the | ||
61 | * region described by start. If you have non-snooping | ||
62 | * Harvard caches, you need to implement this function. | ||
63 | * | ||
64 | * - start - virtual start address | ||
65 | * - end - virtual end address | ||
66 | */ | ||
67 | ENTRY(v3_coherent_kern_range) | ||
68 | /* FALLTHROUGH */ | ||
69 | |||
70 | /* | ||
71 | * coherent_user_range(start, end) | ||
72 | * | ||
73 | * Ensure coherency between the Icache and the Dcache in the | ||
74 | * region described by start. If you have non-snooping | ||
75 | * Harvard caches, you need to implement this function. | ||
76 | * | ||
77 | * - start - virtual start address | ||
78 | * - end - virtual end address | ||
79 | */ | ||
80 | ENTRY(v3_coherent_user_range) | ||
81 | mov r0, #0 | ||
82 | mov pc, lr | ||
83 | |||
84 | /* | ||
85 | * flush_kern_dcache_area(void *page, size_t size) | ||
86 | * | ||
87 | * Ensure no D cache aliasing occurs, either with itself or | ||
88 | * the I cache | ||
89 | * | ||
90 | * - addr - kernel address | ||
91 | * - size - region size | ||
92 | */ | ||
93 | ENTRY(v3_flush_kern_dcache_area) | ||
94 | /* FALLTHROUGH */ | ||
95 | |||
96 | /* | ||
97 | * dma_flush_range(start, end) | ||
98 | * | ||
99 | * Clean and invalidate the specified virtual address range. | ||
100 | * | ||
101 | * - start - virtual start address | ||
102 | * - end - virtual end address | ||
103 | */ | ||
104 | ENTRY(v3_dma_flush_range) | ||
105 | mov r0, #0 | ||
106 | mcr p15, 0, r0, c7, c0, 0 @ flush ID cache | ||
107 | mov pc, lr | ||
108 | |||
109 | /* | ||
110 | * dma_unmap_area(start, size, dir) | ||
111 | * - start - kernel virtual start address | ||
112 | * - size - size of region | ||
113 | * - dir - DMA direction | ||
114 | */ | ||
115 | ENTRY(v3_dma_unmap_area) | ||
116 | teq r2, #DMA_TO_DEVICE | ||
117 | bne v3_dma_flush_range | ||
118 | /* FALLTHROUGH */ | ||
119 | |||
120 | /* | ||
121 | * dma_map_area(start, size, dir) | ||
122 | * - start - kernel virtual start address | ||
123 | * - size - size of region | ||
124 | * - dir - DMA direction | ||
125 | */ | ||
126 | ENTRY(v3_dma_map_area) | ||
127 | mov pc, lr | ||
128 | ENDPROC(v3_dma_unmap_area) | ||
129 | ENDPROC(v3_dma_map_area) | ||
130 | |||
131 | .globl v3_flush_kern_cache_louis | ||
132 | .equ v3_flush_kern_cache_louis, v3_flush_kern_cache_all | ||
133 | |||
134 | __INITDATA | ||
135 | |||
136 | @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S) | ||
137 | define_cache_functions v3 | ||
diff --git a/arch/arm/mm/cache-v4.S b/arch/arm/mm/cache-v4.S index 43e5d77be677..a7ba68f59f0c 100644 --- a/arch/arm/mm/cache-v4.S +++ b/arch/arm/mm/cache-v4.S | |||
@@ -58,7 +58,7 @@ ENTRY(v4_flush_kern_cache_all) | |||
58 | ENTRY(v4_flush_user_cache_range) | 58 | ENTRY(v4_flush_user_cache_range) |
59 | #ifdef CONFIG_CPU_CP15 | 59 | #ifdef CONFIG_CPU_CP15 |
60 | mov ip, #0 | 60 | mov ip, #0 |
61 | mcreq p15, 0, ip, c7, c7, 0 @ flush ID cache | 61 | mcr p15, 0, ip, c7, c7, 0 @ flush ID cache |
62 | mov pc, lr | 62 | mov pc, lr |
63 | #else | 63 | #else |
64 | /* FALLTHROUGH */ | 64 | /* FALLTHROUGH */ |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index ad722f1208a5..9a5cdc01fcdf 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -99,6 +99,9 @@ void show_mem(unsigned int filter) | |||
99 | printk("Mem-info:\n"); | 99 | printk("Mem-info:\n"); |
100 | show_free_areas(filter); | 100 | show_free_areas(filter); |
101 | 101 | ||
102 | if (filter & SHOW_MEM_FILTER_PAGE_COUNT) | ||
103 | return; | ||
104 | |||
102 | for_each_bank (i, mi) { | 105 | for_each_bank (i, mi) { |
103 | struct membank *bank = &mi->bank[i]; | 106 | struct membank *bank = &mi->bank[i]; |
104 | unsigned int pfn1, pfn2; | 107 | unsigned int pfn1, pfn2; |
@@ -424,24 +427,6 @@ void __init bootmem_init(void) | |||
424 | max_pfn = max_high - PHYS_PFN_OFFSET; | 427 | max_pfn = max_high - PHYS_PFN_OFFSET; |
425 | } | 428 | } |
426 | 429 | ||
427 | static inline int free_area(unsigned long pfn, unsigned long end, char *s) | ||
428 | { | ||
429 | unsigned int pages = 0, size = (end - pfn) << (PAGE_SHIFT - 10); | ||
430 | |||
431 | for (; pfn < end; pfn++) { | ||
432 | struct page *page = pfn_to_page(pfn); | ||
433 | ClearPageReserved(page); | ||
434 | init_page_count(page); | ||
435 | __free_page(page); | ||
436 | pages++; | ||
437 | } | ||
438 | |||
439 | if (size && s) | ||
440 | printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); | ||
441 | |||
442 | return pages; | ||
443 | } | ||
444 | |||
445 | /* | 430 | /* |
446 | * Poison init memory with an undefined instruction (ARM) or a branch to an | 431 | * Poison init memory with an undefined instruction (ARM) or a branch to an |
447 | * undefined instruction (Thumb). | 432 | * undefined instruction (Thumb). |
@@ -534,6 +519,14 @@ static void __init free_unused_memmap(struct meminfo *mi) | |||
534 | #endif | 519 | #endif |
535 | } | 520 | } |
536 | 521 | ||
522 | #ifdef CONFIG_HIGHMEM | ||
523 | static inline void free_area_high(unsigned long pfn, unsigned long end) | ||
524 | { | ||
525 | for (; pfn < end; pfn++) | ||
526 | free_highmem_page(pfn_to_page(pfn)); | ||
527 | } | ||
528 | #endif | ||
529 | |||
537 | static void __init free_highpages(void) | 530 | static void __init free_highpages(void) |
538 | { | 531 | { |
539 | #ifdef CONFIG_HIGHMEM | 532 | #ifdef CONFIG_HIGHMEM |
@@ -569,8 +562,7 @@ static void __init free_highpages(void) | |||
569 | if (res_end > end) | 562 | if (res_end > end) |
570 | res_end = end; | 563 | res_end = end; |
571 | if (res_start != start) | 564 | if (res_start != start) |
572 | totalhigh_pages += free_area(start, res_start, | 565 | free_area_high(start, res_start); |
573 | NULL); | ||
574 | start = res_end; | 566 | start = res_end; |
575 | if (start == end) | 567 | if (start == end) |
576 | break; | 568 | break; |
@@ -578,9 +570,8 @@ static void __init free_highpages(void) | |||
578 | 570 | ||
579 | /* And now free anything which remains */ | 571 | /* And now free anything which remains */ |
580 | if (start < end) | 572 | if (start < end) |
581 | totalhigh_pages += free_area(start, end, NULL); | 573 | free_area_high(start, end); |
582 | } | 574 | } |
583 | totalram_pages += totalhigh_pages; | ||
584 | #endif | 575 | #endif |
585 | } | 576 | } |
586 | 577 | ||
@@ -609,8 +600,7 @@ void __init mem_init(void) | |||
609 | 600 | ||
610 | #ifdef CONFIG_SA1111 | 601 | #ifdef CONFIG_SA1111 |
611 | /* now that our DMA memory is actually so designated, we can free it */ | 602 | /* now that our DMA memory is actually so designated, we can free it */ |
612 | totalram_pages += free_area(PHYS_PFN_OFFSET, | 603 | free_reserved_area(__va(PHYS_PFN_OFFSET), swapper_pg_dir, 0, NULL); |
613 | __phys_to_pfn(__pa(swapper_pg_dir)), NULL); | ||
614 | #endif | 604 | #endif |
615 | 605 | ||
616 | free_highpages(); | 606 | free_highpages(); |
@@ -738,16 +728,12 @@ void free_initmem(void) | |||
738 | extern char __tcm_start, __tcm_end; | 728 | extern char __tcm_start, __tcm_end; |
739 | 729 | ||
740 | poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); | 730 | poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); |
741 | totalram_pages += free_area(__phys_to_pfn(__pa(&__tcm_start)), | 731 | free_reserved_area(&__tcm_start, &__tcm_end, 0, "TCM link"); |
742 | __phys_to_pfn(__pa(&__tcm_end)), | ||
743 | "TCM link"); | ||
744 | #endif | 732 | #endif |
745 | 733 | ||
746 | poison_init_mem(__init_begin, __init_end - __init_begin); | 734 | poison_init_mem(__init_begin, __init_end - __init_begin); |
747 | if (!machine_is_integrator() && !machine_is_cintegrator()) | 735 | if (!machine_is_integrator() && !machine_is_cintegrator()) |
748 | totalram_pages += free_area(__phys_to_pfn(__pa(__init_begin)), | 736 | free_initmem_default(0); |
749 | __phys_to_pfn(__pa(__init_end)), | ||
750 | "init"); | ||
751 | } | 737 | } |
752 | 738 | ||
753 | #ifdef CONFIG_BLK_DEV_INITRD | 739 | #ifdef CONFIG_BLK_DEV_INITRD |
@@ -758,9 +744,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
758 | { | 744 | { |
759 | if (!keep_initrd) { | 745 | if (!keep_initrd) { |
760 | poison_init_mem((void *)start, PAGE_ALIGN(end) - start); | 746 | poison_init_mem((void *)start, PAGE_ALIGN(end) - start); |
761 | totalram_pages += free_area(__phys_to_pfn(__pa(start)), | 747 | free_reserved_area(start, end, 0, "initrd"); |
762 | __phys_to_pfn(__pa(end)), | ||
763 | "initrd"); | ||
764 | } | 748 | } |
765 | } | 749 | } |
766 | 750 | ||
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 78978945492a..a84ff763ac39 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/mach/pci.h> | 34 | #include <asm/mach/pci.h> |
35 | 35 | ||
36 | #include "mm.h" | 36 | #include "mm.h" |
37 | #include "tcm.h" | ||
37 | 38 | ||
38 | /* | 39 | /* |
39 | * empty_zero_page is a special page that is used for | 40 | * empty_zero_page is a special page that is used for |
@@ -1277,6 +1278,7 @@ void __init paging_init(struct machine_desc *mdesc) | |||
1277 | dma_contiguous_remap(); | 1278 | dma_contiguous_remap(); |
1278 | devicemaps_init(mdesc); | 1279 | devicemaps_init(mdesc); |
1279 | kmap_init(); | 1280 | kmap_init(); |
1281 | tcm_init(); | ||
1280 | 1282 | ||
1281 | top_pmd = pmd_off_k(0xffff0000); | 1283 | top_pmd = pmd_off_k(0xffff0000); |
1282 | 1284 | ||
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index dc5de5d53f20..fde2d2a794cf 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S | |||
@@ -77,24 +77,27 @@ __arm740_setup: | |||
77 | mcr p15, 0, r0, c6, c0 @ set area 0, default | 77 | mcr p15, 0, r0, c6, c0 @ set area 0, default |
78 | 78 | ||
79 | ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM | 79 | ldr r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM |
80 | ldr r1, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB) | 80 | ldr r3, =(CONFIG_DRAM_SIZE >> 12) @ size of RAM (must be >= 4KB) |
81 | mov r2, #10 @ 11 is the minimum (4KB) | 81 | mov r4, #10 @ 11 is the minimum (4KB) |
82 | 1: add r2, r2, #1 @ area size *= 2 | 82 | 1: add r4, r4, #1 @ area size *= 2 |
83 | mov r1, r1, lsr #1 | 83 | movs r3, r3, lsr #1 |
84 | bne 1b @ count not zero r-shift | 84 | bne 1b @ count not zero r-shift |
85 | orr r0, r0, r2, lsl #1 @ the area register value | 85 | orr r0, r0, r4, lsl #1 @ the area register value |
86 | orr r0, r0, #1 @ set enable bit | 86 | orr r0, r0, #1 @ set enable bit |
87 | mcr p15, 0, r0, c6, c1 @ set area 1, RAM | 87 | mcr p15, 0, r0, c6, c1 @ set area 1, RAM |
88 | 88 | ||
89 | ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH | 89 | ldr r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH |
90 | ldr r1, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB) | 90 | ldr r3, =(CONFIG_FLASH_SIZE >> 12) @ size of FLASH (must be >= 4KB) |
91 | mov r2, #10 @ 11 is the minimum (4KB) | 91 | cmp r3, #0 |
92 | 1: add r2, r2, #1 @ area size *= 2 | 92 | moveq r0, #0 |
93 | mov r1, r1, lsr #1 | 93 | beq 2f |
94 | mov r4, #10 @ 11 is the minimum (4KB) | ||
95 | 1: add r4, r4, #1 @ area size *= 2 | ||
96 | movs r3, r3, lsr #1 | ||
94 | bne 1b @ count not zero r-shift | 97 | bne 1b @ count not zero r-shift |
95 | orr r0, r0, r2, lsl #1 @ the area register value | 98 | orr r0, r0, r4, lsl #1 @ the area register value |
96 | orr r0, r0, #1 @ set enable bit | 99 | orr r0, r0, #1 @ set enable bit |
97 | mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH | 100 | 2: mcr p15, 0, r0, c6, c2 @ set area 2, ROM/FLASH |
98 | 101 | ||
99 | mov r0, #0x06 | 102 | mov r0, #0x06 |
100 | mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable | 103 | mcr p15, 0, r0, c2, c0 @ Region 1&2 cacheable |
@@ -137,13 +140,14 @@ __arm740_proc_info: | |||
137 | .long 0x41807400 | 140 | .long 0x41807400 |
138 | .long 0xfffffff0 | 141 | .long 0xfffffff0 |
139 | .long 0 | 142 | .long 0 |
143 | .long 0 | ||
140 | b __arm740_setup | 144 | b __arm740_setup |
141 | .long cpu_arch_name | 145 | .long cpu_arch_name |
142 | .long cpu_elf_name | 146 | .long cpu_elf_name |
143 | .long HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT | 147 | .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT |
144 | .long cpu_arm740_name | 148 | .long cpu_arm740_name |
145 | .long arm740_processor_functions | 149 | .long arm740_processor_functions |
146 | .long 0 | 150 | .long 0 |
147 | .long 0 | 151 | .long 0 |
148 | .long v3_cache_fns @ cache model | 152 | .long v4_cache_fns @ cache model |
149 | .size __arm740_proc_info, . - __arm740_proc_info | 153 | .size __arm740_proc_info, . - __arm740_proc_info |
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 2c3b9421ab5e..2556cf1c2da1 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -387,7 +387,7 @@ ENTRY(cpu_arm920_set_pte_ext) | |||
387 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | 387 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
388 | .globl cpu_arm920_suspend_size | 388 | .globl cpu_arm920_suspend_size |
389 | .equ cpu_arm920_suspend_size, 4 * 3 | 389 | .equ cpu_arm920_suspend_size, 4 * 3 |
390 | #ifdef CONFIG_PM_SLEEP | 390 | #ifdef CONFIG_ARM_CPU_SUSPEND |
391 | ENTRY(cpu_arm920_do_suspend) | 391 | ENTRY(cpu_arm920_do_suspend) |
392 | stmfd sp!, {r4 - r6, lr} | 392 | stmfd sp!, {r4 - r6, lr} |
393 | mrc p15, 0, r4, c13, c0, 0 @ PID | 393 | mrc p15, 0, r4, c13, c0, 0 @ PID |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index f1803f7e2972..344c8a548cc0 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -402,7 +402,7 @@ ENTRY(cpu_arm926_set_pte_ext) | |||
402 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ | 402 | /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */ |
403 | .globl cpu_arm926_suspend_size | 403 | .globl cpu_arm926_suspend_size |
404 | .equ cpu_arm926_suspend_size, 4 * 3 | 404 | .equ cpu_arm926_suspend_size, 4 * 3 |
405 | #ifdef CONFIG_PM_SLEEP | 405 | #ifdef CONFIG_ARM_CPU_SUSPEND |
406 | ENTRY(cpu_arm926_do_suspend) | 406 | ENTRY(cpu_arm926_do_suspend) |
407 | stmfd sp!, {r4 - r6, lr} | 407 | stmfd sp!, {r4 - r6, lr} |
408 | mrc p15, 0, r4, c13, c0, 0 @ PID | 408 | mrc p15, 0, r4, c13, c0, 0 @ PID |
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index 82f9cdc751d6..0b60dd3d742a 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S | |||
@@ -350,7 +350,7 @@ ENTRY(cpu_mohawk_set_pte_ext) | |||
350 | 350 | ||
351 | .globl cpu_mohawk_suspend_size | 351 | .globl cpu_mohawk_suspend_size |
352 | .equ cpu_mohawk_suspend_size, 4 * 6 | 352 | .equ cpu_mohawk_suspend_size, 4 * 6 |
353 | #ifdef CONFIG_PM_SLEEP | 353 | #ifdef CONFIG_ARM_CPU_SUSPEND |
354 | ENTRY(cpu_mohawk_do_suspend) | 354 | ENTRY(cpu_mohawk_do_suspend) |
355 | stmfd sp!, {r4 - r9, lr} | 355 | stmfd sp!, {r4 - r9, lr} |
356 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | 356 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 3aa0da11fd84..d92dfd081429 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -172,7 +172,7 @@ ENTRY(cpu_sa1100_set_pte_ext) | |||
172 | 172 | ||
173 | .globl cpu_sa1100_suspend_size | 173 | .globl cpu_sa1100_suspend_size |
174 | .equ cpu_sa1100_suspend_size, 4 * 3 | 174 | .equ cpu_sa1100_suspend_size, 4 * 3 |
175 | #ifdef CONFIG_PM_SLEEP | 175 | #ifdef CONFIG_ARM_CPU_SUSPEND |
176 | ENTRY(cpu_sa1100_do_suspend) | 176 | ENTRY(cpu_sa1100_do_suspend) |
177 | stmfd sp!, {r4 - r6, lr} | 177 | stmfd sp!, {r4 - r6, lr} |
178 | mrc p15, 0, r4, c3, c0, 0 @ domain ID | 178 | mrc p15, 0, r4, c3, c0, 0 @ domain ID |
diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c index 3e6210b4d6d4..054b491ff764 100644 --- a/arch/arm/mm/proc-syms.c +++ b/arch/arm/mm/proc-syms.c | |||
@@ -17,7 +17,9 @@ | |||
17 | 17 | ||
18 | #ifndef MULTI_CPU | 18 | #ifndef MULTI_CPU |
19 | EXPORT_SYMBOL(cpu_dcache_clean_area); | 19 | EXPORT_SYMBOL(cpu_dcache_clean_area); |
20 | #ifdef CONFIG_MMU | ||
20 | EXPORT_SYMBOL(cpu_set_pte_ext); | 21 | EXPORT_SYMBOL(cpu_set_pte_ext); |
22 | #endif | ||
21 | #else | 23 | #else |
22 | EXPORT_SYMBOL(processor); | 24 | EXPORT_SYMBOL(processor); |
23 | #endif | 25 | #endif |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index bcaaa8de9325..5c07ee4fe3eb 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -138,7 +138,7 @@ ENTRY(cpu_v6_set_pte_ext) | |||
138 | /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */ | 138 | /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */ |
139 | .globl cpu_v6_suspend_size | 139 | .globl cpu_v6_suspend_size |
140 | .equ cpu_v6_suspend_size, 4 * 6 | 140 | .equ cpu_v6_suspend_size, 4 * 6 |
141 | #ifdef CONFIG_PM_SLEEP | 141 | #ifdef CONFIG_ARM_CPU_SUSPEND |
142 | ENTRY(cpu_v6_do_suspend) | 142 | ENTRY(cpu_v6_do_suspend) |
143 | stmfd sp!, {r4 - r9, lr} | 143 | stmfd sp!, {r4 - r9, lr} |
144 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID | 144 | mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index eb93d6487f35..e8efd83b6f25 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
@@ -413,7 +413,7 @@ ENTRY(cpu_xsc3_set_pte_ext) | |||
413 | 413 | ||
414 | .globl cpu_xsc3_suspend_size | 414 | .globl cpu_xsc3_suspend_size |
415 | .equ cpu_xsc3_suspend_size, 4 * 6 | 415 | .equ cpu_xsc3_suspend_size, 4 * 6 |
416 | #ifdef CONFIG_PM_SLEEP | 416 | #ifdef CONFIG_ARM_CPU_SUSPEND |
417 | ENTRY(cpu_xsc3_do_suspend) | 417 | ENTRY(cpu_xsc3_do_suspend) |
418 | stmfd sp!, {r4 - r9, lr} | 418 | stmfd sp!, {r4 - r9, lr} |
419 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | 419 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 25510361aa18..e766f889bfd6 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -528,7 +528,7 @@ ENTRY(cpu_xscale_set_pte_ext) | |||
528 | 528 | ||
529 | .globl cpu_xscale_suspend_size | 529 | .globl cpu_xscale_suspend_size |
530 | .equ cpu_xscale_suspend_size, 4 * 6 | 530 | .equ cpu_xscale_suspend_size, 4 * 6 |
531 | #ifdef CONFIG_PM_SLEEP | 531 | #ifdef CONFIG_ARM_CPU_SUSPEND |
532 | ENTRY(cpu_xscale_do_suspend) | 532 | ENTRY(cpu_xscale_do_suspend) |
533 | stmfd sp!, {r4 - r9, lr} | 533 | stmfd sp!, {r4 - r9, lr} |
534 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode | 534 | mrc p14, 0, r4, c6, c0, 0 @ clock configuration, for turbo mode |
diff --git a/arch/arm/kernel/tcm.h b/arch/arm/mm/tcm.h index 8015ad434a40..8015ad434a40 100644 --- a/arch/arm/kernel/tcm.h +++ b/arch/arm/mm/tcm.h | |||
diff --git a/arch/arm/net/bpf_jit_32.c b/arch/arm/net/bpf_jit_32.c index a0bd8a755bdf..1a643ee8e082 100644 --- a/arch/arm/net/bpf_jit_32.c +++ b/arch/arm/net/bpf_jit_32.c | |||
@@ -918,9 +918,8 @@ void bpf_jit_compile(struct sk_filter *fp) | |||
918 | #endif | 918 | #endif |
919 | 919 | ||
920 | if (bpf_jit_enable > 1) | 920 | if (bpf_jit_enable > 1) |
921 | print_hex_dump(KERN_INFO, "BPF JIT code: ", | 921 | /* there are 2 passes here */ |
922 | DUMP_PREFIX_ADDRESS, 16, 4, ctx.target, | 922 | bpf_jit_dump(fp->len, alloc_size, 2, ctx.target); |
923 | alloc_size, false); | ||
924 | 923 | ||
925 | fp->bpf_func = (void *)ctx.target; | 924 | fp->bpf_func = (void *)ctx.target; |
926 | out: | 925 | out: |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index 2d4b6414609f..251f827271e9 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
@@ -238,6 +238,7 @@ static __init void ge_complete( | |||
238 | struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, | 238 | struct mv643xx_eth_shared_platform_data *orion_ge_shared_data, |
239 | struct resource *orion_ge_resource, unsigned long irq, | 239 | struct resource *orion_ge_resource, unsigned long irq, |
240 | struct platform_device *orion_ge_shared, | 240 | struct platform_device *orion_ge_shared, |
241 | struct platform_device *orion_ge_mvmdio, | ||
241 | struct mv643xx_eth_platform_data *eth_data, | 242 | struct mv643xx_eth_platform_data *eth_data, |
242 | struct platform_device *orion_ge) | 243 | struct platform_device *orion_ge) |
243 | { | 244 | { |
@@ -247,6 +248,8 @@ static __init void ge_complete( | |||
247 | orion_ge->dev.platform_data = eth_data; | 248 | orion_ge->dev.platform_data = eth_data; |
248 | 249 | ||
249 | platform_device_register(orion_ge_shared); | 250 | platform_device_register(orion_ge_shared); |
251 | if (orion_ge_mvmdio) | ||
252 | platform_device_register(orion_ge_mvmdio); | ||
250 | platform_device_register(orion_ge); | 253 | platform_device_register(orion_ge); |
251 | } | 254 | } |
252 | 255 | ||
@@ -258,8 +261,6 @@ struct mv643xx_eth_shared_platform_data orion_ge00_shared_data; | |||
258 | static struct resource orion_ge00_shared_resources[] = { | 261 | static struct resource orion_ge00_shared_resources[] = { |
259 | { | 262 | { |
260 | .name = "ge00 base", | 263 | .name = "ge00 base", |
261 | }, { | ||
262 | .name = "ge00 err irq", | ||
263 | }, | 264 | }, |
264 | }; | 265 | }; |
265 | 266 | ||
@@ -271,6 +272,19 @@ static struct platform_device orion_ge00_shared = { | |||
271 | }, | 272 | }, |
272 | }; | 273 | }; |
273 | 274 | ||
275 | static struct resource orion_ge_mvmdio_resources[] = { | ||
276 | { | ||
277 | .name = "ge00 mvmdio base", | ||
278 | }, { | ||
279 | .name = "ge00 mvmdio err irq", | ||
280 | }, | ||
281 | }; | ||
282 | |||
283 | static struct platform_device orion_ge_mvmdio = { | ||
284 | .name = "orion-mdio", | ||
285 | .id = -1, | ||
286 | }; | ||
287 | |||
274 | static struct resource orion_ge00_resources[] = { | 288 | static struct resource orion_ge00_resources[] = { |
275 | { | 289 | { |
276 | .name = "ge00 irq", | 290 | .name = "ge00 irq", |
@@ -295,26 +309,25 @@ void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, | |||
295 | unsigned int tx_csum_limit) | 309 | unsigned int tx_csum_limit) |
296 | { | 310 | { |
297 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, | 311 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, |
298 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 312 | mapbase + 0x2000, SZ_16K - 1, NO_IRQ); |
313 | fill_resources(&orion_ge_mvmdio, orion_ge_mvmdio_resources, | ||
314 | mapbase + 0x2004, 0x84 - 1, irq_err); | ||
299 | orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; | 315 | orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; |
300 | ge_complete(&orion_ge00_shared_data, | 316 | ge_complete(&orion_ge00_shared_data, |
301 | orion_ge00_resources, irq, &orion_ge00_shared, | 317 | orion_ge00_resources, irq, &orion_ge00_shared, |
318 | &orion_ge_mvmdio, | ||
302 | eth_data, &orion_ge00); | 319 | eth_data, &orion_ge00); |
303 | } | 320 | } |
304 | 321 | ||
305 | /***************************************************************************** | 322 | /***************************************************************************** |
306 | * GE01 | 323 | * GE01 |
307 | ****************************************************************************/ | 324 | ****************************************************************************/ |
308 | struct mv643xx_eth_shared_platform_data orion_ge01_shared_data = { | 325 | struct mv643xx_eth_shared_platform_data orion_ge01_shared_data; |
309 | .shared_smi = &orion_ge00_shared, | ||
310 | }; | ||
311 | 326 | ||
312 | static struct resource orion_ge01_shared_resources[] = { | 327 | static struct resource orion_ge01_shared_resources[] = { |
313 | { | 328 | { |
314 | .name = "ge01 base", | 329 | .name = "ge01 base", |
315 | }, { | 330 | } |
316 | .name = "ge01 err irq", | ||
317 | }, | ||
318 | }; | 331 | }; |
319 | 332 | ||
320 | static struct platform_device orion_ge01_shared = { | 333 | static struct platform_device orion_ge01_shared = { |
@@ -349,26 +362,23 @@ void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, | |||
349 | unsigned int tx_csum_limit) | 362 | unsigned int tx_csum_limit) |
350 | { | 363 | { |
351 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, | 364 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, |
352 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 365 | mapbase + 0x2000, SZ_16K - 1, NO_IRQ); |
353 | orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; | 366 | orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; |
354 | ge_complete(&orion_ge01_shared_data, | 367 | ge_complete(&orion_ge01_shared_data, |
355 | orion_ge01_resources, irq, &orion_ge01_shared, | 368 | orion_ge01_resources, irq, &orion_ge01_shared, |
369 | NULL, | ||
356 | eth_data, &orion_ge01); | 370 | eth_data, &orion_ge01); |
357 | } | 371 | } |
358 | 372 | ||
359 | /***************************************************************************** | 373 | /***************************************************************************** |
360 | * GE10 | 374 | * GE10 |
361 | ****************************************************************************/ | 375 | ****************************************************************************/ |
362 | struct mv643xx_eth_shared_platform_data orion_ge10_shared_data = { | 376 | struct mv643xx_eth_shared_platform_data orion_ge10_shared_data; |
363 | .shared_smi = &orion_ge00_shared, | ||
364 | }; | ||
365 | 377 | ||
366 | static struct resource orion_ge10_shared_resources[] = { | 378 | static struct resource orion_ge10_shared_resources[] = { |
367 | { | 379 | { |
368 | .name = "ge10 base", | 380 | .name = "ge10 base", |
369 | }, { | 381 | } |
370 | .name = "ge10 err irq", | ||
371 | }, | ||
372 | }; | 382 | }; |
373 | 383 | ||
374 | static struct platform_device orion_ge10_shared = { | 384 | static struct platform_device orion_ge10_shared = { |
@@ -402,24 +412,21 @@ void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, | |||
402 | unsigned long irq_err) | 412 | unsigned long irq_err) |
403 | { | 413 | { |
404 | fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, | 414 | fill_resources(&orion_ge10_shared, orion_ge10_shared_resources, |
405 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 415 | mapbase + 0x2000, SZ_16K - 1, NO_IRQ); |
406 | ge_complete(&orion_ge10_shared_data, | 416 | ge_complete(&orion_ge10_shared_data, |
407 | orion_ge10_resources, irq, &orion_ge10_shared, | 417 | orion_ge10_resources, irq, &orion_ge10_shared, |
418 | NULL, | ||
408 | eth_data, &orion_ge10); | 419 | eth_data, &orion_ge10); |
409 | } | 420 | } |
410 | 421 | ||
411 | /***************************************************************************** | 422 | /***************************************************************************** |
412 | * GE11 | 423 | * GE11 |
413 | ****************************************************************************/ | 424 | ****************************************************************************/ |
414 | struct mv643xx_eth_shared_platform_data orion_ge11_shared_data = { | 425 | struct mv643xx_eth_shared_platform_data orion_ge11_shared_data; |
415 | .shared_smi = &orion_ge00_shared, | ||
416 | }; | ||
417 | 426 | ||
418 | static struct resource orion_ge11_shared_resources[] = { | 427 | static struct resource orion_ge11_shared_resources[] = { |
419 | { | 428 | { |
420 | .name = "ge11 base", | 429 | .name = "ge11 base", |
421 | }, { | ||
422 | .name = "ge11 err irq", | ||
423 | }, | 430 | }, |
424 | }; | 431 | }; |
425 | 432 | ||
@@ -454,9 +461,10 @@ void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data, | |||
454 | unsigned long irq_err) | 461 | unsigned long irq_err) |
455 | { | 462 | { |
456 | fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, | 463 | fill_resources(&orion_ge11_shared, orion_ge11_shared_resources, |
457 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 464 | mapbase + 0x2000, SZ_16K - 1, NO_IRQ); |
458 | ge_complete(&orion_ge11_shared_data, | 465 | ge_complete(&orion_ge11_shared_data, |
459 | orion_ge11_resources, irq, &orion_ge11_shared, | 466 | orion_ge11_resources, irq, &orion_ge11_shared, |
467 | NULL, | ||
460 | eth_data, &orion_ge11); | 468 | eth_data, &orion_ge11); |
461 | } | 469 | } |
462 | 470 | ||
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 51afedda9ab6..03db14d8ace9 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/amba/pl330.h> | ||
13 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
14 | #include <linux/types.h> | 15 | #include <linux/types.h> |
15 | #include <linux/interrupt.h> | 16 | #include <linux/interrupt.h> |
@@ -1552,6 +1553,9 @@ void __init s3c64xx_spi0_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1552 | pd.num_cs = num_cs; | 1553 | pd.num_cs = num_cs; |
1553 | pd.src_clk_nr = src_clk_nr; | 1554 | pd.src_clk_nr = src_clk_nr; |
1554 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; | 1555 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi0_cfg_gpio; |
1556 | #ifdef CONFIG_PL330_DMA | ||
1557 | pd.filter = pl330_filter; | ||
1558 | #endif | ||
1555 | 1559 | ||
1556 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0); | 1560 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi0); |
1557 | } | 1561 | } |
@@ -1590,6 +1594,9 @@ void __init s3c64xx_spi1_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1590 | pd.num_cs = num_cs; | 1594 | pd.num_cs = num_cs; |
1591 | pd.src_clk_nr = src_clk_nr; | 1595 | pd.src_clk_nr = src_clk_nr; |
1592 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; | 1596 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi1_cfg_gpio; |
1597 | #ifdef CONFIG_PL330_DMA | ||
1598 | pd.filter = pl330_filter; | ||
1599 | #endif | ||
1593 | 1600 | ||
1594 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1); | 1601 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi1); |
1595 | } | 1602 | } |
@@ -1628,6 +1635,9 @@ void __init s3c64xx_spi2_set_platdata(int (*cfg_gpio)(void), int src_clk_nr, | |||
1628 | pd.num_cs = num_cs; | 1635 | pd.num_cs = num_cs; |
1629 | pd.src_clk_nr = src_clk_nr; | 1636 | pd.src_clk_nr = src_clk_nr; |
1630 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; | 1637 | pd.cfg_gpio = (cfg_gpio) ? cfg_gpio : s3c64xx_spi2_cfg_gpio; |
1638 | #ifdef CONFIG_PL330_DMA | ||
1639 | pd.filter = pl330_filter; | ||
1640 | #endif | ||
1631 | 1641 | ||
1632 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2); | 1642 | s3c_set_platdata(&pd, sizeof(pd), &s3c64xx_device_spi2); |
1633 | } | 1643 | } |
diff --git a/arch/arm/plat-samsung/include/plat/fb.h b/arch/arm/plat-samsung/include/plat/fb.h index b885322717a1..9ae507270785 100644 --- a/arch/arm/plat-samsung/include/plat/fb.h +++ b/arch/arm/plat-samsung/include/plat/fb.h | |||
@@ -15,55 +15,7 @@ | |||
15 | #ifndef __PLAT_S3C_FB_H | 15 | #ifndef __PLAT_S3C_FB_H |
16 | #define __PLAT_S3C_FB_H __FILE__ | 16 | #define __PLAT_S3C_FB_H __FILE__ |
17 | 17 | ||
18 | /* S3C_FB_MAX_WIN | 18 | #include <linux/platform_data/video_s3c.h> |
19 | * Set to the maximum number of windows that any of the supported hardware | ||
20 | * can use. Since the platform data uses this for an array size, having it | ||
21 | * set to the maximum of any version of the hardware can do is safe. | ||
22 | */ | ||
23 | #define S3C_FB_MAX_WIN (5) | ||
24 | |||
25 | /** | ||
26 | * struct s3c_fb_pd_win - per window setup data | ||
27 | * @xres : The window X size. | ||
28 | * @yres : The window Y size. | ||
29 | * @virtual_x: The virtual X size. | ||
30 | * @virtual_y: The virtual Y size. | ||
31 | */ | ||
32 | struct s3c_fb_pd_win { | ||
33 | unsigned short default_bpp; | ||
34 | unsigned short max_bpp; | ||
35 | unsigned short xres; | ||
36 | unsigned short yres; | ||
37 | unsigned short virtual_x; | ||
38 | unsigned short virtual_y; | ||
39 | }; | ||
40 | |||
41 | /** | ||
42 | * struct s3c_fb_platdata - S3C driver platform specific information | ||
43 | * @setup_gpio: Setup the external GPIO pins to the right state to transfer | ||
44 | * the data from the display system to the connected display | ||
45 | * device. | ||
46 | * @vidcon0: The base vidcon0 values to control the panel data format. | ||
47 | * @vidcon1: The base vidcon1 values to control the panel data output. | ||
48 | * @vtiming: Video timing when connected to a RGB type panel. | ||
49 | * @win: The setup data for each hardware window, or NULL for unused. | ||
50 | * @display_mode: The LCD output display mode. | ||
51 | * | ||
52 | * The platform data supplies the video driver with all the information | ||
53 | * it requires to work with the display(s) attached to the machine. It | ||
54 | * controls the initial mode, the number of display windows (0 is always | ||
55 | * the base framebuffer) that are initialised etc. | ||
56 | * | ||
57 | */ | ||
58 | struct s3c_fb_platdata { | ||
59 | void (*setup_gpio)(void); | ||
60 | |||
61 | struct s3c_fb_pd_win *win[S3C_FB_MAX_WIN]; | ||
62 | struct fb_videomode *vtiming; | ||
63 | |||
64 | u32 vidcon0; | ||
65 | u32 vidcon1; | ||
66 | }; | ||
67 | 19 | ||
68 | /** | 20 | /** |
69 | * s3c_fb_set_platdata() - Setup the FB device with platform data. | 21 | * s3c_fb_set_platdata() - Setup the FB device with platform data. |
diff --git a/arch/arm/plat-samsung/include/plat/regs-serial.h b/arch/arm/plat-samsung/include/plat/regs-serial.h index 29c26a818842..f05f2afa440d 100644 --- a/arch/arm/plat-samsung/include/plat/regs-serial.h +++ b/arch/arm/plat-samsung/include/plat/regs-serial.h | |||
@@ -1,281 +1 @@ | |||
1 | /* arch/arm/plat-samsung/include/plat/regs-serial.h | #include <linux/serial_s3c.h> | |
2 | * | ||
3 | * From linux/include/asm-arm/hardware/serial_s3c2410.h | ||
4 | * | ||
5 | * Internal header file for Samsung S3C2410 serial ports (UART0-2) | ||
6 | * | ||
7 | * Copyright (C) 2002 Shane Nay (shane@minirl.com) | ||
8 | * | ||
9 | * Additional defines, Copyright 2003 Simtec Electronics (linux@simtec.co.uk) | ||
10 | * | ||
11 | * Adapted from: | ||
12 | * | ||
13 | * Internal header file for MX1ADS serial ports (UART1 & 2) | ||
14 | * | ||
15 | * Copyright (C) 2002 Shane Nay (shane@minirl.com) | ||
16 | * | ||
17 | * This program is free software; you can redistribute it and/or modify | ||
18 | * it under the terms of the GNU General Public License as published by | ||
19 | * the Free Software Foundation; either version 2 of the License, or | ||
20 | * (at your option) any later version. | ||
21 | * | ||
22 | * This program is distributed in the hope that it will be useful, | ||
23 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
24 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
25 | * GNU General Public License for more details. | ||
26 | * | ||
27 | * You should have received a copy of the GNU General Public License | ||
28 | * along with this program; if not, write to the Free Software | ||
29 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
30 | */ | ||
31 | |||
32 | #ifndef __ASM_ARM_REGS_SERIAL_H | ||
33 | #define __ASM_ARM_REGS_SERIAL_H | ||
34 | |||
35 | #define S3C24XX_VA_UART0 (S3C_VA_UART) | ||
36 | #define S3C24XX_VA_UART1 (S3C_VA_UART + 0x4000 ) | ||
37 | #define S3C24XX_VA_UART2 (S3C_VA_UART + 0x8000 ) | ||
38 | #define S3C24XX_VA_UART3 (S3C_VA_UART + 0xC000 ) | ||
39 | |||
40 | #define S3C2410_PA_UART0 (S3C24XX_PA_UART) | ||
41 | #define S3C2410_PA_UART1 (S3C24XX_PA_UART + 0x4000 ) | ||
42 | #define S3C2410_PA_UART2 (S3C24XX_PA_UART + 0x8000 ) | ||
43 | #define S3C2443_PA_UART3 (S3C24XX_PA_UART + 0xC000 ) | ||
44 | |||
45 | #define S3C2410_URXH (0x24) | ||
46 | #define S3C2410_UTXH (0x20) | ||
47 | #define S3C2410_ULCON (0x00) | ||
48 | #define S3C2410_UCON (0x04) | ||
49 | #define S3C2410_UFCON (0x08) | ||
50 | #define S3C2410_UMCON (0x0C) | ||
51 | #define S3C2410_UBRDIV (0x28) | ||
52 | #define S3C2410_UTRSTAT (0x10) | ||
53 | #define S3C2410_UERSTAT (0x14) | ||
54 | #define S3C2410_UFSTAT (0x18) | ||
55 | #define S3C2410_UMSTAT (0x1C) | ||
56 | |||
57 | #define S3C2410_LCON_CFGMASK ((0xF<<3)|(0x3)) | ||
58 | |||
59 | #define S3C2410_LCON_CS5 (0x0) | ||
60 | #define S3C2410_LCON_CS6 (0x1) | ||
61 | #define S3C2410_LCON_CS7 (0x2) | ||
62 | #define S3C2410_LCON_CS8 (0x3) | ||
63 | #define S3C2410_LCON_CSMASK (0x3) | ||
64 | |||
65 | #define S3C2410_LCON_PNONE (0x0) | ||
66 | #define S3C2410_LCON_PEVEN (0x5 << 3) | ||
67 | #define S3C2410_LCON_PODD (0x4 << 3) | ||
68 | #define S3C2410_LCON_PMASK (0x7 << 3) | ||
69 | |||
70 | #define S3C2410_LCON_STOPB (1<<2) | ||
71 | #define S3C2410_LCON_IRM (1<<6) | ||
72 | |||
73 | #define S3C2440_UCON_CLKMASK (3<<10) | ||
74 | #define S3C2440_UCON_CLKSHIFT (10) | ||
75 | #define S3C2440_UCON_PCLK (0<<10) | ||
76 | #define S3C2440_UCON_UCLK (1<<10) | ||
77 | #define S3C2440_UCON_PCLK2 (2<<10) | ||
78 | #define S3C2440_UCON_FCLK (3<<10) | ||
79 | #define S3C2443_UCON_EPLL (3<<10) | ||
80 | |||
81 | #define S3C6400_UCON_CLKMASK (3<<10) | ||
82 | #define S3C6400_UCON_CLKSHIFT (10) | ||
83 | #define S3C6400_UCON_PCLK (0<<10) | ||
84 | #define S3C6400_UCON_PCLK2 (2<<10) | ||
85 | #define S3C6400_UCON_UCLK0 (1<<10) | ||
86 | #define S3C6400_UCON_UCLK1 (3<<10) | ||
87 | |||
88 | #define S3C2440_UCON2_FCLK_EN (1<<15) | ||
89 | #define S3C2440_UCON0_DIVMASK (15 << 12) | ||
90 | #define S3C2440_UCON1_DIVMASK (15 << 12) | ||
91 | #define S3C2440_UCON2_DIVMASK (7 << 12) | ||
92 | #define S3C2440_UCON_DIVSHIFT (12) | ||
93 | |||
94 | #define S3C2412_UCON_CLKMASK (3<<10) | ||
95 | #define S3C2412_UCON_CLKSHIFT (10) | ||
96 | #define S3C2412_UCON_UCLK (1<<10) | ||
97 | #define S3C2412_UCON_USYSCLK (3<<10) | ||
98 | #define S3C2412_UCON_PCLK (0<<10) | ||
99 | #define S3C2412_UCON_PCLK2 (2<<10) | ||
100 | |||
101 | #define S3C2410_UCON_CLKMASK (1 << 10) | ||
102 | #define S3C2410_UCON_CLKSHIFT (10) | ||
103 | #define S3C2410_UCON_UCLK (1<<10) | ||
104 | #define S3C2410_UCON_SBREAK (1<<4) | ||
105 | |||
106 | #define S3C2410_UCON_TXILEVEL (1<<9) | ||
107 | #define S3C2410_UCON_RXILEVEL (1<<8) | ||
108 | #define S3C2410_UCON_TXIRQMODE (1<<2) | ||
109 | #define S3C2410_UCON_RXIRQMODE (1<<0) | ||
110 | #define S3C2410_UCON_RXFIFO_TOI (1<<7) | ||
111 | #define S3C2443_UCON_RXERR_IRQEN (1<<6) | ||
112 | #define S3C2443_UCON_LOOPBACK (1<<5) | ||
113 | |||
114 | #define S3C2410_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
115 | S3C2410_UCON_RXILEVEL | \ | ||
116 | S3C2410_UCON_TXIRQMODE | \ | ||
117 | S3C2410_UCON_RXIRQMODE | \ | ||
118 | S3C2410_UCON_RXFIFO_TOI) | ||
119 | |||
120 | #define S3C2410_UFCON_FIFOMODE (1<<0) | ||
121 | #define S3C2410_UFCON_TXTRIG0 (0<<6) | ||
122 | #define S3C2410_UFCON_RXTRIG8 (1<<4) | ||
123 | #define S3C2410_UFCON_RXTRIG12 (2<<4) | ||
124 | |||
125 | /* S3C2440 FIFO trigger levels */ | ||
126 | #define S3C2440_UFCON_RXTRIG1 (0<<4) | ||
127 | #define S3C2440_UFCON_RXTRIG8 (1<<4) | ||
128 | #define S3C2440_UFCON_RXTRIG16 (2<<4) | ||
129 | #define S3C2440_UFCON_RXTRIG32 (3<<4) | ||
130 | |||
131 | #define S3C2440_UFCON_TXTRIG0 (0<<6) | ||
132 | #define S3C2440_UFCON_TXTRIG16 (1<<6) | ||
133 | #define S3C2440_UFCON_TXTRIG32 (2<<6) | ||
134 | #define S3C2440_UFCON_TXTRIG48 (3<<6) | ||
135 | |||
136 | #define S3C2410_UFCON_RESETBOTH (3<<1) | ||
137 | #define S3C2410_UFCON_RESETTX (1<<2) | ||
138 | #define S3C2410_UFCON_RESETRX (1<<1) | ||
139 | |||
140 | #define S3C2410_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
141 | S3C2410_UFCON_TXTRIG0 | \ | ||
142 | S3C2410_UFCON_RXTRIG8 ) | ||
143 | |||
144 | #define S3C2410_UMCOM_AFC (1<<4) | ||
145 | #define S3C2410_UMCOM_RTS_LOW (1<<0) | ||
146 | |||
147 | #define S3C2412_UMCON_AFC_63 (0<<5) /* same as s3c2443 */ | ||
148 | #define S3C2412_UMCON_AFC_56 (1<<5) | ||
149 | #define S3C2412_UMCON_AFC_48 (2<<5) | ||
150 | #define S3C2412_UMCON_AFC_40 (3<<5) | ||
151 | #define S3C2412_UMCON_AFC_32 (4<<5) | ||
152 | #define S3C2412_UMCON_AFC_24 (5<<5) | ||
153 | #define S3C2412_UMCON_AFC_16 (6<<5) | ||
154 | #define S3C2412_UMCON_AFC_8 (7<<5) | ||
155 | |||
156 | #define S3C2410_UFSTAT_TXFULL (1<<9) | ||
157 | #define S3C2410_UFSTAT_RXFULL (1<<8) | ||
158 | #define S3C2410_UFSTAT_TXMASK (15<<4) | ||
159 | #define S3C2410_UFSTAT_TXSHIFT (4) | ||
160 | #define S3C2410_UFSTAT_RXMASK (15<<0) | ||
161 | #define S3C2410_UFSTAT_RXSHIFT (0) | ||
162 | |||
163 | /* UFSTAT S3C2443 same as S3C2440 */ | ||
164 | #define S3C2440_UFSTAT_TXFULL (1<<14) | ||
165 | #define S3C2440_UFSTAT_RXFULL (1<<6) | ||
166 | #define S3C2440_UFSTAT_TXSHIFT (8) | ||
167 | #define S3C2440_UFSTAT_RXSHIFT (0) | ||
168 | #define S3C2440_UFSTAT_TXMASK (63<<8) | ||
169 | #define S3C2440_UFSTAT_RXMASK (63) | ||
170 | |||
171 | #define S3C2410_UTRSTAT_TXE (1<<2) | ||
172 | #define S3C2410_UTRSTAT_TXFE (1<<1) | ||
173 | #define S3C2410_UTRSTAT_RXDR (1<<0) | ||
174 | |||
175 | #define S3C2410_UERSTAT_OVERRUN (1<<0) | ||
176 | #define S3C2410_UERSTAT_FRAME (1<<2) | ||
177 | #define S3C2410_UERSTAT_BREAK (1<<3) | ||
178 | #define S3C2443_UERSTAT_PARITY (1<<1) | ||
179 | |||
180 | #define S3C2410_UERSTAT_ANY (S3C2410_UERSTAT_OVERRUN | \ | ||
181 | S3C2410_UERSTAT_FRAME | \ | ||
182 | S3C2410_UERSTAT_BREAK) | ||
183 | |||
184 | #define S3C2410_UMSTAT_CTS (1<<0) | ||
185 | #define S3C2410_UMSTAT_DeltaCTS (1<<2) | ||
186 | |||
187 | #define S3C2443_DIVSLOT (0x2C) | ||
188 | |||
189 | /* S3C64XX interrupt registers. */ | ||
190 | #define S3C64XX_UINTP 0x30 | ||
191 | #define S3C64XX_UINTSP 0x34 | ||
192 | #define S3C64XX_UINTM 0x38 | ||
193 | |||
194 | #define S3C64XX_UINTM_RXD (0) | ||
195 | #define S3C64XX_UINTM_TXD (2) | ||
196 | #define S3C64XX_UINTM_RXD_MSK (1 << S3C64XX_UINTM_RXD) | ||
197 | #define S3C64XX_UINTM_TXD_MSK (1 << S3C64XX_UINTM_TXD) | ||
198 | |||
199 | /* Following are specific to S5PV210 */ | ||
200 | #define S5PV210_UCON_CLKMASK (1<<10) | ||
201 | #define S5PV210_UCON_CLKSHIFT (10) | ||
202 | #define S5PV210_UCON_PCLK (0<<10) | ||
203 | #define S5PV210_UCON_UCLK (1<<10) | ||
204 | |||
205 | #define S5PV210_UFCON_TXTRIG0 (0<<8) | ||
206 | #define S5PV210_UFCON_TXTRIG4 (1<<8) | ||
207 | #define S5PV210_UFCON_TXTRIG8 (2<<8) | ||
208 | #define S5PV210_UFCON_TXTRIG16 (3<<8) | ||
209 | #define S5PV210_UFCON_TXTRIG32 (4<<8) | ||
210 | #define S5PV210_UFCON_TXTRIG64 (5<<8) | ||
211 | #define S5PV210_UFCON_TXTRIG128 (6<<8) | ||
212 | #define S5PV210_UFCON_TXTRIG256 (7<<8) | ||
213 | |||
214 | #define S5PV210_UFCON_RXTRIG1 (0<<4) | ||
215 | #define S5PV210_UFCON_RXTRIG4 (1<<4) | ||
216 | #define S5PV210_UFCON_RXTRIG8 (2<<4) | ||
217 | #define S5PV210_UFCON_RXTRIG16 (3<<4) | ||
218 | #define S5PV210_UFCON_RXTRIG32 (4<<4) | ||
219 | #define S5PV210_UFCON_RXTRIG64 (5<<4) | ||
220 | #define S5PV210_UFCON_RXTRIG128 (6<<4) | ||
221 | #define S5PV210_UFCON_RXTRIG256 (7<<4) | ||
222 | |||
223 | #define S5PV210_UFSTAT_TXFULL (1<<24) | ||
224 | #define S5PV210_UFSTAT_RXFULL (1<<8) | ||
225 | #define S5PV210_UFSTAT_TXMASK (255<<16) | ||
226 | #define S5PV210_UFSTAT_TXSHIFT (16) | ||
227 | #define S5PV210_UFSTAT_RXMASK (255<<0) | ||
228 | #define S5PV210_UFSTAT_RXSHIFT (0) | ||
229 | |||
230 | #define S3C2410_UCON_CLKSEL0 (1 << 0) | ||
231 | #define S3C2410_UCON_CLKSEL1 (1 << 1) | ||
232 | #define S3C2410_UCON_CLKSEL2 (1 << 2) | ||
233 | #define S3C2410_UCON_CLKSEL3 (1 << 3) | ||
234 | |||
235 | /* Default values for s5pv210 UCON and UFCON uart registers */ | ||
236 | #define S5PV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \ | ||
237 | S3C2410_UCON_RXILEVEL | \ | ||
238 | S3C2410_UCON_TXIRQMODE | \ | ||
239 | S3C2410_UCON_RXIRQMODE | \ | ||
240 | S3C2410_UCON_RXFIFO_TOI | \ | ||
241 | S3C2443_UCON_RXERR_IRQEN) | ||
242 | |||
243 | #define S5PV210_UFCON_DEFAULT (S3C2410_UFCON_FIFOMODE | \ | ||
244 | S5PV210_UFCON_TXTRIG4 | \ | ||
245 | S5PV210_UFCON_RXTRIG4) | ||
246 | |||
247 | #ifndef __ASSEMBLY__ | ||
248 | |||
249 | /* configuration structure for per-machine configurations for the | ||
250 | * serial port | ||
251 | * | ||
252 | * the pointer is setup by the machine specific initialisation from the | ||
253 | * arch/arm/mach-s3c2410/ directory. | ||
254 | */ | ||
255 | |||
256 | struct s3c2410_uartcfg { | ||
257 | unsigned char hwport; /* hardware port number */ | ||
258 | unsigned char unused; | ||
259 | unsigned short flags; | ||
260 | upf_t uart_flags; /* default uart flags */ | ||
261 | unsigned int clk_sel; | ||
262 | |||
263 | unsigned int has_fracval; | ||
264 | |||
265 | unsigned long ucon; /* value of ucon for port */ | ||
266 | unsigned long ulcon; /* value of ulcon for port */ | ||
267 | unsigned long ufcon; /* value of ufcon for port */ | ||
268 | }; | ||
269 | |||
270 | /* s3c24xx_uart_devs | ||
271 | * | ||
272 | * this is exported from the core as we cannot use driver_register(), | ||
273 | * or platform_add_device() before the console_initcall() | ||
274 | */ | ||
275 | |||
276 | extern struct platform_device *s3c24xx_uart_devs[4]; | ||
277 | |||
278 | #endif /* __ASSEMBLY__ */ | ||
279 | |||
280 | #endif /* __ASM_ARM_REGS_SERIAL_H */ | ||
281 | |||
diff --git a/arch/arm/plat-samsung/include/plat/usb-phy.h b/arch/arm/plat-samsung/include/plat/usb-phy.h index 959bcdb03a25..ab34dfadb7f9 100644 --- a/arch/arm/plat-samsung/include/plat/usb-phy.h +++ b/arch/arm/plat-samsung/include/plat/usb-phy.h | |||
@@ -11,10 +11,7 @@ | |||
11 | #ifndef __PLAT_SAMSUNG_USB_PHY_H | 11 | #ifndef __PLAT_SAMSUNG_USB_PHY_H |
12 | #define __PLAT_SAMSUNG_USB_PHY_H __FILE__ | 12 | #define __PLAT_SAMSUNG_USB_PHY_H __FILE__ |
13 | 13 | ||
14 | enum s5p_usb_phy_type { | 14 | #include <linux/usb/samsung_usb_phy.h> |
15 | S5P_USB_PHY_DEVICE, | ||
16 | S5P_USB_PHY_HOST, | ||
17 | }; | ||
18 | 15 | ||
19 | extern int s5p_usb_phy_init(struct platform_device *pdev, int type); | 16 | extern int s5p_usb_phy_init(struct platform_device *pdev, int type); |
20 | extern int s5p_usb_phy_exit(struct platform_device *pdev, int type); | 17 | extern int s5p_usb_phy_exit(struct platform_device *pdev, int type); |