diff options
438 files changed, 4777 insertions, 3815 deletions
diff --git a/Documentation/arm/memory.txt b/Documentation/arm/memory.txt index 771d48d3b335..208a2d465b92 100644 --- a/Documentation/arm/memory.txt +++ b/Documentation/arm/memory.txt | |||
@@ -51,15 +51,14 @@ ffc00000 ffefffff DMA memory mapping region. Memory returned | |||
51 | ff000000 ffbfffff Reserved for future expansion of DMA | 51 | ff000000 ffbfffff Reserved for future expansion of DMA |
52 | mapping region. | 52 | mapping region. |
53 | 53 | ||
54 | VMALLOC_END feffffff Free for platform use, recommended. | ||
55 | VMALLOC_END must be aligned to a 2MB | ||
56 | boundary. | ||
57 | |||
58 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. | 54 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. |
59 | Memory returned by vmalloc/ioremap will | 55 | Memory returned by vmalloc/ioremap will |
60 | be dynamically placed in this region. | 56 | be dynamically placed in this region. |
61 | VMALLOC_START may be based upon the value | 57 | Machine specific static mappings are also |
62 | of the high_memory variable. | 58 | located here through iotable_init(). |
59 | VMALLOC_START is based upon the value | ||
60 | of the high_memory variable, and VMALLOC_END | ||
61 | is equal to 0xff000000. | ||
63 | 62 | ||
64 | PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region. | 63 | PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region. |
65 | This maps the platforms RAM, and typically | 64 | This maps the platforms RAM, and typically |
diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt index 52916b4aa1fe..9b4b82a721b6 100644 --- a/Documentation/devicetree/bindings/arm/gic.txt +++ b/Documentation/devicetree/bindings/arm/gic.txt | |||
@@ -42,6 +42,10 @@ Optional | |||
42 | - interrupts : Interrupt source of the parent interrupt controller. Only | 42 | - interrupts : Interrupt source of the parent interrupt controller. Only |
43 | present on secondary GICs. | 43 | present on secondary GICs. |
44 | 44 | ||
45 | - cpu-offset : per-cpu offset within the distributor and cpu interface | ||
46 | regions, used when the GIC doesn't have banked registers. The offset is | ||
47 | cpu-offset * cpu-nr. | ||
48 | |||
45 | Example: | 49 | Example: |
46 | 50 | ||
47 | intc: interrupt-controller@fff11000 { | 51 | intc: interrupt-controller@fff11000 { |
diff --git a/Documentation/devicetree/bindings/arm/tegra.txt b/Documentation/devicetree/bindings/arm/tegra.txt new file mode 100644 index 000000000000..6e69d2e5e766 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/tegra.txt | |||
@@ -0,0 +1,14 @@ | |||
1 | NVIDIA Tegra device tree bindings | ||
2 | ------------------------------------------- | ||
3 | |||
4 | Boards with the tegra20 SoC shall have the following properties: | ||
5 | |||
6 | Required root node property: | ||
7 | |||
8 | compatible = "nvidia,tegra20"; | ||
9 | |||
10 | Boards with the tegra30 SoC shall have the following properties: | ||
11 | |||
12 | Required root node property: | ||
13 | |||
14 | compatible = "nvidia,tegra30"; | ||
diff --git a/Documentation/devicetree/bindings/arm/vic.txt b/Documentation/devicetree/bindings/arm/vic.txt new file mode 100644 index 000000000000..266716b23437 --- /dev/null +++ b/Documentation/devicetree/bindings/arm/vic.txt | |||
@@ -0,0 +1,29 @@ | |||
1 | * ARM Vectored Interrupt Controller | ||
2 | |||
3 | One or more Vectored Interrupt Controllers (VIC's) can be connected in an ARM | ||
4 | system for interrupt routing. For multiple controllers they can either be | ||
5 | nested or have the outputs wire-OR'd together. | ||
6 | |||
7 | Required properties: | ||
8 | |||
9 | - compatible : should be one of | ||
10 | "arm,pl190-vic" | ||
11 | "arm,pl192-vic" | ||
12 | - interrupt-controller : Identifies the node as an interrupt controller | ||
13 | - #interrupt-cells : The number of cells to define the interrupts. Must be 1 as | ||
14 | the VIC has no configuration options for interrupt sources. The cell is a u32 | ||
15 | and defines the interrupt number. | ||
16 | - reg : The register bank for the VIC. | ||
17 | |||
18 | Optional properties: | ||
19 | |||
20 | - interrupts : Interrupt source for parent controllers if the VIC is nested. | ||
21 | |||
22 | Example: | ||
23 | |||
24 | vic0: interrupt-controller@60000 { | ||
25 | compatible = "arm,pl192-vic"; | ||
26 | interrupt-controller; | ||
27 | #interrupt-cells = <1>; | ||
28 | reg = <0x60000 0x1000>; | ||
29 | }; | ||
diff --git a/Documentation/devicetree/bindings/usb/tegra-usb.txt b/Documentation/devicetree/bindings/usb/tegra-usb.txt new file mode 100644 index 000000000000..035d63d5646d --- /dev/null +++ b/Documentation/devicetree/bindings/usb/tegra-usb.txt | |||
@@ -0,0 +1,13 @@ | |||
1 | Tegra SOC USB controllers | ||
2 | |||
3 | The device node for a USB controller that is part of a Tegra | ||
4 | SOC is as described in the document "Open Firmware Recommended | ||
5 | Practice : Universal Serial Bus" with the following modifications | ||
6 | and additions : | ||
7 | |||
8 | Required properties : | ||
9 | - compatible : Should be "nvidia,tegra20-ehci" for USB controllers | ||
10 | used in host mode. | ||
11 | - phy_type : Should be one of "ulpi" or "utmi". | ||
12 | - nvidia,vbus-gpio : If present, specifies a gpio that needs to be | ||
13 | activated for the bus to be powered. | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index e084b7e981e8..abba5b8c9d74 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1971,7 +1971,7 @@ endchoice | |||
1971 | 1971 | ||
1972 | config XIP_KERNEL | 1972 | config XIP_KERNEL |
1973 | bool "Kernel Execute-In-Place from ROM" | 1973 | bool "Kernel Execute-In-Place from ROM" |
1974 | depends on !ZBOOT_ROM | 1974 | depends on !ZBOOT_ROM && !ARM_LPAE |
1975 | help | 1975 | help |
1976 | Execute-In-Place allows the kernel to run from non-volatile storage | 1976 | Execute-In-Place allows the kernel to run from non-volatile storage |
1977 | directly addressable by the CPU, such as NOR flash. This saves RAM | 1977 | directly addressable by the CPU, such as NOR flash. This saves RAM |
@@ -2001,7 +2001,7 @@ config XIP_PHYS_ADDR | |||
2001 | 2001 | ||
2002 | config KEXEC | 2002 | config KEXEC |
2003 | bool "Kexec system call (EXPERIMENTAL)" | 2003 | bool "Kexec system call (EXPERIMENTAL)" |
2004 | depends on EXPERIMENTAL | 2004 | depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU) |
2005 | help | 2005 | help |
2006 | kexec is a system call that implements the ability to shutdown your | 2006 | kexec is a system call that implements the ability to shutdown your |
2007 | current kernel, and to start another kernel. It is like a reboot | 2007 | current kernel, and to start another kernel. It is like a reboot |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index c2effc917254..c5d60250d43d 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -659,6 +659,7 @@ __armv7_mmu_cache_on: | |||
659 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer | 659 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer |
660 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control | 660 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control |
661 | #endif | 661 | #endif |
662 | mcr p15, 0, r0, c7, c5, 4 @ ISB | ||
662 | mcr p15, 0, r0, c1, c0, 0 @ load control register | 663 | mcr p15, 0, r0, c1, c0, 0 @ load control register |
663 | mrc p15, 0, r0, c1, c0, 0 @ and read it back | 664 | mrc p15, 0, r0, c1, c0, 0 @ and read it back |
664 | mov r0, #0 | 665 | mov r0, #0 |
diff --git a/arch/arm/boot/dts/tegra-cardhu.dts b/arch/arm/boot/dts/tegra-cardhu.dts new file mode 100644 index 000000000000..70c41fc897d7 --- /dev/null +++ b/arch/arm/boot/dts/tegra-cardhu.dts | |||
@@ -0,0 +1,36 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "tegra30.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "NVIDIA Tegra30 Cardhu evaluation board"; | ||
7 | compatible = "nvidia,cardhu", "nvidia,tegra30"; | ||
8 | |||
9 | memory { | ||
10 | reg = < 0x80000000 0x40000000 >; | ||
11 | }; | ||
12 | |||
13 | serial@70006000 { | ||
14 | clock-frequency = < 408000000 >; | ||
15 | }; | ||
16 | |||
17 | i2c@7000c000 { | ||
18 | clock-frequency = <100000>; | ||
19 | }; | ||
20 | |||
21 | i2c@7000c400 { | ||
22 | clock-frequency = <100000>; | ||
23 | }; | ||
24 | |||
25 | i2c@7000c500 { | ||
26 | clock-frequency = <100000>; | ||
27 | }; | ||
28 | |||
29 | i2c@7000c700 { | ||
30 | clock-frequency = <100000>; | ||
31 | }; | ||
32 | |||
33 | i2c@7000d000 { | ||
34 | clock-frequency = <100000>; | ||
35 | }; | ||
36 | }; | ||
diff --git a/arch/arm/boot/dts/tegra-harmony.dts b/arch/arm/boot/dts/tegra-harmony.dts index 0e225b86b652..80afa1b70b80 100644 --- a/arch/arm/boot/dts/tegra-harmony.dts +++ b/arch/arm/boot/dts/tegra-harmony.dts | |||
@@ -1,16 +1,11 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /memreserve/ 0x1c000000 0x04000000; | ||
4 | /include/ "tegra20.dtsi" | 3 | /include/ "tegra20.dtsi" |
5 | 4 | ||
6 | / { | 5 | / { |
7 | model = "NVIDIA Tegra2 Harmony evaluation board"; | 6 | model = "NVIDIA Tegra2 Harmony evaluation board"; |
8 | compatible = "nvidia,harmony", "nvidia,tegra20"; | 7 | compatible = "nvidia,harmony", "nvidia,tegra20"; |
9 | 8 | ||
10 | chosen { | ||
11 | bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootwait"; | ||
12 | }; | ||
13 | |||
14 | memory@0 { | 9 | memory@0 { |
15 | reg = < 0x00000000 0x40000000 >; | 10 | reg = < 0x00000000 0x40000000 >; |
16 | }; | 11 | }; |
@@ -52,16 +47,40 @@ | |||
52 | ext-mic-en-gpios = <&gpio 185 0>; | 47 | ext-mic-en-gpios = <&gpio 185 0>; |
53 | }; | 48 | }; |
54 | 49 | ||
50 | serial@70006000 { | ||
51 | status = "disable"; | ||
52 | }; | ||
53 | |||
54 | serial@70006040 { | ||
55 | status = "disable"; | ||
56 | }; | ||
57 | |||
58 | serial@70006200 { | ||
59 | status = "disable"; | ||
60 | }; | ||
61 | |||
55 | serial@70006300 { | 62 | serial@70006300 { |
56 | clock-frequency = < 216000000 >; | 63 | clock-frequency = < 216000000 >; |
57 | }; | 64 | }; |
58 | 65 | ||
66 | serial@70006400 { | ||
67 | status = "disable"; | ||
68 | }; | ||
69 | |||
70 | sdhci@c8000000 { | ||
71 | status = "disable"; | ||
72 | }; | ||
73 | |||
59 | sdhci@c8000200 { | 74 | sdhci@c8000200 { |
60 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | 75 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
61 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 76 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
62 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ | 77 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ |
63 | }; | 78 | }; |
64 | 79 | ||
80 | sdhci@c8000400 { | ||
81 | status = "disable"; | ||
82 | }; | ||
83 | |||
65 | sdhci@c8000600 { | 84 | sdhci@c8000600 { |
66 | cd-gpios = <&gpio 58 0>; /* gpio PH2 */ | 85 | cd-gpios = <&gpio 58 0>; /* gpio PH2 */ |
67 | wp-gpios = <&gpio 59 0>; /* gpio PH3 */ | 86 | wp-gpios = <&gpio 59 0>; /* gpio PH3 */ |
diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts new file mode 100644 index 000000000000..1a1d7023b69b --- /dev/null +++ b/arch/arm/boot/dts/tegra-paz00.dts | |||
@@ -0,0 +1,77 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "tegra20.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Toshiba AC100 / Dynabook AZ"; | ||
7 | compatible = "compal,paz00", "nvidia,tegra20"; | ||
8 | |||
9 | memory@0 { | ||
10 | reg = <0x00000000 0x20000000>; | ||
11 | }; | ||
12 | |||
13 | i2c@7000c000 { | ||
14 | clock-frequency = <400000>; | ||
15 | }; | ||
16 | |||
17 | i2c@7000c400 { | ||
18 | clock-frequency = <400000>; | ||
19 | }; | ||
20 | |||
21 | i2c@7000c500 { | ||
22 | status = "disable"; | ||
23 | }; | ||
24 | |||
25 | nvec@7000c500 { | ||
26 | #address-cells = <1>; | ||
27 | #size-cells = <0>; | ||
28 | compatible = "nvidia,nvec"; | ||
29 | reg = <0x7000C500 0x100>; | ||
30 | interrupts = <0 92 0x04>; | ||
31 | clock-frequency = <80000>; | ||
32 | request-gpios = <&gpio 170 0>; | ||
33 | slave-addr = <138>; | ||
34 | }; | ||
35 | |||
36 | i2c@7000d000 { | ||
37 | clock-frequency = <400000>; | ||
38 | }; | ||
39 | |||
40 | serial@70006000 { | ||
41 | clock-frequency = <216000000>; | ||
42 | }; | ||
43 | |||
44 | serial@70006040 { | ||
45 | status = "disable"; | ||
46 | }; | ||
47 | |||
48 | serial@70006200 { | ||
49 | status = "disable"; | ||
50 | }; | ||
51 | |||
52 | serial@70006300 { | ||
53 | clock-frequency = <216000000>; | ||
54 | }; | ||
55 | |||
56 | serial@70006400 { | ||
57 | status = "disable"; | ||
58 | }; | ||
59 | |||
60 | sdhci@c8000000 { | ||
61 | cd-gpios = <&gpio 173 0>; /* gpio PV5 */ | ||
62 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | ||
63 | power-gpios = <&gpio 155 0>; /* gpio PT3 */ | ||
64 | }; | ||
65 | |||
66 | sdhci@c8000200 { | ||
67 | status = "disable"; | ||
68 | }; | ||
69 | |||
70 | sdhci@c8000400 { | ||
71 | status = "disable"; | ||
72 | }; | ||
73 | |||
74 | sdhci@c8000600 { | ||
75 | support-8bit; | ||
76 | }; | ||
77 | }; | ||
diff --git a/arch/arm/boot/dts/tegra-seaboard.dts b/arch/arm/boot/dts/tegra-seaboard.dts index a72299b8e668..f552bcc04412 100644 --- a/arch/arm/boot/dts/tegra-seaboard.dts +++ b/arch/arm/boot/dts/tegra-seaboard.dts | |||
@@ -1,25 +1,60 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /memreserve/ 0x1c000000 0x04000000; | ||
4 | /include/ "tegra20.dtsi" | 3 | /include/ "tegra20.dtsi" |
5 | 4 | ||
6 | / { | 5 | / { |
7 | model = "NVIDIA Seaboard"; | 6 | model = "NVIDIA Seaboard"; |
8 | compatible = "nvidia,seaboard", "nvidia,tegra20"; | 7 | compatible = "nvidia,seaboard", "nvidia,tegra20"; |
9 | 8 | ||
10 | chosen { | ||
11 | bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait"; | ||
12 | }; | ||
13 | |||
14 | memory { | 9 | memory { |
15 | device_type = "memory"; | 10 | device_type = "memory"; |
16 | reg = < 0x00000000 0x40000000 >; | 11 | reg = < 0x00000000 0x40000000 >; |
17 | }; | 12 | }; |
18 | 13 | ||
14 | i2c@7000c000 { | ||
15 | clock-frequency = <400000>; | ||
16 | }; | ||
17 | |||
18 | i2c@7000c400 { | ||
19 | clock-frequency = <400000>; | ||
20 | }; | ||
21 | |||
22 | i2c@7000c500 { | ||
23 | clock-frequency = <400000>; | ||
24 | }; | ||
25 | |||
26 | i2c@7000d000 { | ||
27 | clock-frequency = <400000>; | ||
28 | }; | ||
29 | |||
30 | serial@70006000 { | ||
31 | status = "disable"; | ||
32 | }; | ||
33 | |||
34 | serial@70006040 { | ||
35 | status = "disable"; | ||
36 | }; | ||
37 | |||
38 | serial@70006200 { | ||
39 | status = "disable"; | ||
40 | }; | ||
41 | |||
19 | serial@70006300 { | 42 | serial@70006300 { |
20 | clock-frequency = < 216000000 >; | 43 | clock-frequency = < 216000000 >; |
21 | }; | 44 | }; |
22 | 45 | ||
46 | serial@70006400 { | ||
47 | status = "disable"; | ||
48 | }; | ||
49 | |||
50 | sdhci@c8000000 { | ||
51 | status = "disable"; | ||
52 | }; | ||
53 | |||
54 | sdhci@c8000200 { | ||
55 | status = "disable"; | ||
56 | }; | ||
57 | |||
23 | sdhci@c8000400 { | 58 | sdhci@c8000400 { |
24 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | 59 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
25 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 60 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
@@ -29,4 +64,8 @@ | |||
29 | sdhci@c8000600 { | 64 | sdhci@c8000600 { |
30 | support-8bit; | 65 | support-8bit; |
31 | }; | 66 | }; |
67 | |||
68 | usb@c5000000 { | ||
69 | nvidia,vbus-gpio = <&gpio 24 0>; /* PD0 */ | ||
70 | }; | ||
32 | }; | 71 | }; |
diff --git a/arch/arm/boot/dts/tegra-trimslice.dts b/arch/arm/boot/dts/tegra-trimslice.dts new file mode 100644 index 000000000000..3b3ee7db99f3 --- /dev/null +++ b/arch/arm/boot/dts/tegra-trimslice.dts | |||
@@ -0,0 +1,65 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "tegra20.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Compulab TrimSlice board"; | ||
7 | compatible = "compulab,trimslice", "nvidia,tegra20"; | ||
8 | |||
9 | memory@0 { | ||
10 | reg = < 0x00000000 0x40000000 >; | ||
11 | }; | ||
12 | |||
13 | i2c@7000c000 { | ||
14 | clock-frequency = <400000>; | ||
15 | }; | ||
16 | |||
17 | i2c@7000c400 { | ||
18 | clock-frequency = <400000>; | ||
19 | }; | ||
20 | |||
21 | i2c@7000c500 { | ||
22 | clock-frequency = <400000>; | ||
23 | }; | ||
24 | |||
25 | i2c@7000d000 { | ||
26 | status = "disable"; | ||
27 | }; | ||
28 | |||
29 | serial@70006000 { | ||
30 | clock-frequency = < 216000000 >; | ||
31 | }; | ||
32 | |||
33 | serial@70006040 { | ||
34 | status = "disable"; | ||
35 | }; | ||
36 | |||
37 | serial@70006200 { | ||
38 | status = "disable"; | ||
39 | }; | ||
40 | |||
41 | serial@70006300 { | ||
42 | status = "disable"; | ||
43 | }; | ||
44 | |||
45 | serial@70006400 { | ||
46 | status = "disable"; | ||
47 | }; | ||
48 | |||
49 | sdhci@c8000000 { | ||
50 | status = "disable"; | ||
51 | }; | ||
52 | |||
53 | sdhci@c8000200 { | ||
54 | status = "disable"; | ||
55 | }; | ||
56 | |||
57 | sdhci@c8000400 { | ||
58 | status = "disable"; | ||
59 | }; | ||
60 | |||
61 | sdhci@c8000600 { | ||
62 | cd-gpios = <&gpio 121 0>; | ||
63 | wp-gpios = <&gpio 122 0>; | ||
64 | }; | ||
65 | }; | ||
diff --git a/arch/arm/boot/dts/tegra-ventana.dts b/arch/arm/boot/dts/tegra-ventana.dts index 3f9abd6b6964..c7d3b87f29df 100644 --- a/arch/arm/boot/dts/tegra-ventana.dts +++ b/arch/arm/boot/dts/tegra-ventana.dts | |||
@@ -1,24 +1,59 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /memreserve/ 0x1c000000 0x04000000; | ||
4 | /include/ "tegra20.dtsi" | 3 | /include/ "tegra20.dtsi" |
5 | 4 | ||
6 | / { | 5 | / { |
7 | model = "NVIDIA Tegra2 Ventana evaluation board"; | 6 | model = "NVIDIA Tegra2 Ventana evaluation board"; |
8 | compatible = "nvidia,ventana", "nvidia,tegra20"; | 7 | compatible = "nvidia,ventana", "nvidia,tegra20"; |
9 | 8 | ||
10 | chosen { | ||
11 | bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/ram rdinit=/sbin/init"; | ||
12 | }; | ||
13 | |||
14 | memory { | 9 | memory { |
15 | reg = < 0x00000000 0x40000000 >; | 10 | reg = < 0x00000000 0x40000000 >; |
16 | }; | 11 | }; |
17 | 12 | ||
13 | i2c@7000c000 { | ||
14 | clock-frequency = <400000>; | ||
15 | }; | ||
16 | |||
17 | i2c@7000c400 { | ||
18 | clock-frequency = <400000>; | ||
19 | }; | ||
20 | |||
21 | i2c@7000c500 { | ||
22 | clock-frequency = <400000>; | ||
23 | }; | ||
24 | |||
25 | i2c@7000d000 { | ||
26 | clock-frequency = <400000>; | ||
27 | }; | ||
28 | |||
29 | serial@70006000 { | ||
30 | status = "disable"; | ||
31 | }; | ||
32 | |||
33 | serial@70006040 { | ||
34 | status = "disable"; | ||
35 | }; | ||
36 | |||
37 | serial@70006200 { | ||
38 | status = "disable"; | ||
39 | }; | ||
40 | |||
18 | serial@70006300 { | 41 | serial@70006300 { |
19 | clock-frequency = < 216000000 >; | 42 | clock-frequency = < 216000000 >; |
20 | }; | 43 | }; |
21 | 44 | ||
45 | serial@70006400 { | ||
46 | status = "disable"; | ||
47 | }; | ||
48 | |||
49 | sdhci@c8000000 { | ||
50 | status = "disable"; | ||
51 | }; | ||
52 | |||
53 | sdhci@c8000200 { | ||
54 | status = "disable"; | ||
55 | }; | ||
56 | |||
22 | sdhci@c8000400 { | 57 | sdhci@c8000400 { |
23 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ | 58 | cd-gpios = <&gpio 69 0>; /* gpio PI5 */ |
24 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ | 59 | wp-gpios = <&gpio 57 0>; /* gpio PH1 */ |
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index 65d7e6a333eb..660c8ad537c0 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi | |||
@@ -5,9 +5,9 @@ | |||
5 | interrupt-parent = <&intc>; | 5 | interrupt-parent = <&intc>; |
6 | 6 | ||
7 | intc: interrupt-controller@50041000 { | 7 | intc: interrupt-controller@50041000 { |
8 | compatible = "nvidia,tegra20-gic"; | 8 | compatible = "arm,cortex-a9-gic"; |
9 | interrupt-controller; | 9 | interrupt-controller; |
10 | #interrupt-cells = <1>; | 10 | #interrupt-cells = <3>; |
11 | reg = < 0x50041000 0x1000 >, | 11 | reg = < 0x50041000 0x1000 >, |
12 | < 0x50040100 0x0100 >; | 12 | < 0x50040100 0x0100 >; |
13 | }; | 13 | }; |
@@ -17,7 +17,7 @@ | |||
17 | #size-cells = <0>; | 17 | #size-cells = <0>; |
18 | compatible = "nvidia,tegra20-i2c"; | 18 | compatible = "nvidia,tegra20-i2c"; |
19 | reg = <0x7000C000 0x100>; | 19 | reg = <0x7000C000 0x100>; |
20 | interrupts = < 70 >; | 20 | interrupts = < 0 38 0x04 >; |
21 | }; | 21 | }; |
22 | 22 | ||
23 | i2c@7000c400 { | 23 | i2c@7000c400 { |
@@ -25,7 +25,7 @@ | |||
25 | #size-cells = <0>; | 25 | #size-cells = <0>; |
26 | compatible = "nvidia,tegra20-i2c"; | 26 | compatible = "nvidia,tegra20-i2c"; |
27 | reg = <0x7000C400 0x100>; | 27 | reg = <0x7000C400 0x100>; |
28 | interrupts = < 116 >; | 28 | interrupts = < 0 84 0x04 >; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | i2c@7000c500 { | 31 | i2c@7000c500 { |
@@ -33,7 +33,7 @@ | |||
33 | #size-cells = <0>; | 33 | #size-cells = <0>; |
34 | compatible = "nvidia,tegra20-i2c"; | 34 | compatible = "nvidia,tegra20-i2c"; |
35 | reg = <0x7000C500 0x100>; | 35 | reg = <0x7000C500 0x100>; |
36 | interrupts = < 124 >; | 36 | interrupts = < 0 92 0x04 >; |
37 | }; | 37 | }; |
38 | 38 | ||
39 | i2c@7000d000 { | 39 | i2c@7000d000 { |
@@ -41,30 +41,24 @@ | |||
41 | #size-cells = <0>; | 41 | #size-cells = <0>; |
42 | compatible = "nvidia,tegra20-i2c"; | 42 | compatible = "nvidia,tegra20-i2c"; |
43 | reg = <0x7000D000 0x200>; | 43 | reg = <0x7000D000 0x200>; |
44 | interrupts = < 85 >; | 44 | interrupts = < 0 53 0x04 >; |
45 | }; | 45 | }; |
46 | 46 | ||
47 | i2s@70002800 { | 47 | i2s@70002800 { |
48 | #address-cells = <1>; | ||
49 | #size-cells = <0>; | ||
50 | compatible = "nvidia,tegra20-i2s"; | 48 | compatible = "nvidia,tegra20-i2s"; |
51 | reg = <0x70002800 0x200>; | 49 | reg = <0x70002800 0x200>; |
52 | interrupts = < 45 >; | 50 | interrupts = < 0 13 0x04 >; |
53 | dma-channel = < 2 >; | 51 | dma-channel = < 2 >; |
54 | }; | 52 | }; |
55 | 53 | ||
56 | i2s@70002a00 { | 54 | i2s@70002a00 { |
57 | #address-cells = <1>; | ||
58 | #size-cells = <0>; | ||
59 | compatible = "nvidia,tegra20-i2s"; | 55 | compatible = "nvidia,tegra20-i2s"; |
60 | reg = <0x70002a00 0x200>; | 56 | reg = <0x70002a00 0x200>; |
61 | interrupts = < 35 >; | 57 | interrupts = < 0 3 0x04 >; |
62 | dma-channel = < 1 >; | 58 | dma-channel = < 1 >; |
63 | }; | 59 | }; |
64 | 60 | ||
65 | das@70000c00 { | 61 | das@70000c00 { |
66 | #address-cells = <1>; | ||
67 | #size-cells = <0>; | ||
68 | compatible = "nvidia,tegra20-das"; | 62 | compatible = "nvidia,tegra20-das"; |
69 | reg = <0x70000c00 0x80>; | 63 | reg = <0x70000c00 0x80>; |
70 | }; | 64 | }; |
@@ -72,7 +66,13 @@ | |||
72 | gpio: gpio@6000d000 { | 66 | gpio: gpio@6000d000 { |
73 | compatible = "nvidia,tegra20-gpio"; | 67 | compatible = "nvidia,tegra20-gpio"; |
74 | reg = < 0x6000d000 0x1000 >; | 68 | reg = < 0x6000d000 0x1000 >; |
75 | interrupts = < 64 65 66 67 87 119 121 >; | 69 | interrupts = < 0 32 0x04 |
70 | 0 33 0x04 | ||
71 | 0 34 0x04 | ||
72 | 0 35 0x04 | ||
73 | 0 55 0x04 | ||
74 | 0 87 0x04 | ||
75 | 0 89 0x04 >; | ||
76 | #gpio-cells = <2>; | 76 | #gpio-cells = <2>; |
77 | gpio-controller; | 77 | gpio-controller; |
78 | }; | 78 | }; |
@@ -89,59 +89,80 @@ | |||
89 | compatible = "nvidia,tegra20-uart"; | 89 | compatible = "nvidia,tegra20-uart"; |
90 | reg = <0x70006000 0x40>; | 90 | reg = <0x70006000 0x40>; |
91 | reg-shift = <2>; | 91 | reg-shift = <2>; |
92 | interrupts = < 68 >; | 92 | interrupts = < 0 36 0x04 >; |
93 | }; | 93 | }; |
94 | 94 | ||
95 | serial@70006040 { | 95 | serial@70006040 { |
96 | compatible = "nvidia,tegra20-uart"; | 96 | compatible = "nvidia,tegra20-uart"; |
97 | reg = <0x70006040 0x40>; | 97 | reg = <0x70006040 0x40>; |
98 | reg-shift = <2>; | 98 | reg-shift = <2>; |
99 | interrupts = < 69 >; | 99 | interrupts = < 0 37 0x04 >; |
100 | }; | 100 | }; |
101 | 101 | ||
102 | serial@70006200 { | 102 | serial@70006200 { |
103 | compatible = "nvidia,tegra20-uart"; | 103 | compatible = "nvidia,tegra20-uart"; |
104 | reg = <0x70006200 0x100>; | 104 | reg = <0x70006200 0x100>; |
105 | reg-shift = <2>; | 105 | reg-shift = <2>; |
106 | interrupts = < 78 >; | 106 | interrupts = < 0 46 0x04 >; |
107 | }; | 107 | }; |
108 | 108 | ||
109 | serial@70006300 { | 109 | serial@70006300 { |
110 | compatible = "nvidia,tegra20-uart"; | 110 | compatible = "nvidia,tegra20-uart"; |
111 | reg = <0x70006300 0x100>; | 111 | reg = <0x70006300 0x100>; |
112 | reg-shift = <2>; | 112 | reg-shift = <2>; |
113 | interrupts = < 122 >; | 113 | interrupts = < 0 90 0x04 >; |
114 | }; | 114 | }; |
115 | 115 | ||
116 | serial@70006400 { | 116 | serial@70006400 { |
117 | compatible = "nvidia,tegra20-uart"; | 117 | compatible = "nvidia,tegra20-uart"; |
118 | reg = <0x70006400 0x100>; | 118 | reg = <0x70006400 0x100>; |
119 | reg-shift = <2>; | 119 | reg-shift = <2>; |
120 | interrupts = < 123 >; | 120 | interrupts = < 0 91 0x04 >; |
121 | }; | 121 | }; |
122 | 122 | ||
123 | sdhci@c8000000 { | 123 | sdhci@c8000000 { |
124 | compatible = "nvidia,tegra20-sdhci"; | 124 | compatible = "nvidia,tegra20-sdhci"; |
125 | reg = <0xc8000000 0x200>; | 125 | reg = <0xc8000000 0x200>; |
126 | interrupts = < 46 >; | 126 | interrupts = < 0 14 0x04 >; |
127 | }; | 127 | }; |
128 | 128 | ||
129 | sdhci@c8000200 { | 129 | sdhci@c8000200 { |
130 | compatible = "nvidia,tegra20-sdhci"; | 130 | compatible = "nvidia,tegra20-sdhci"; |
131 | reg = <0xc8000200 0x200>; | 131 | reg = <0xc8000200 0x200>; |
132 | interrupts = < 47 >; | 132 | interrupts = < 0 15 0x04 >; |
133 | }; | 133 | }; |
134 | 134 | ||
135 | sdhci@c8000400 { | 135 | sdhci@c8000400 { |
136 | compatible = "nvidia,tegra20-sdhci"; | 136 | compatible = "nvidia,tegra20-sdhci"; |
137 | reg = <0xc8000400 0x200>; | 137 | reg = <0xc8000400 0x200>; |
138 | interrupts = < 51 >; | 138 | interrupts = < 0 19 0x04 >; |
139 | }; | 139 | }; |
140 | 140 | ||
141 | sdhci@c8000600 { | 141 | sdhci@c8000600 { |
142 | compatible = "nvidia,tegra20-sdhci"; | 142 | compatible = "nvidia,tegra20-sdhci"; |
143 | reg = <0xc8000600 0x200>; | 143 | reg = <0xc8000600 0x200>; |
144 | interrupts = < 63 >; | 144 | interrupts = < 0 31 0x04 >; |
145 | }; | ||
146 | |||
147 | usb@c5000000 { | ||
148 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | ||
149 | reg = <0xc5000000 0x4000>; | ||
150 | interrupts = < 0 20 0x04 >; | ||
151 | phy_type = "utmi"; | ||
152 | }; | ||
153 | |||
154 | usb@c5004000 { | ||
155 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | ||
156 | reg = <0xc5004000 0x4000>; | ||
157 | interrupts = < 0 21 0x04 >; | ||
158 | phy_type = "ulpi"; | ||
159 | }; | ||
160 | |||
161 | usb@c5008000 { | ||
162 | compatible = "nvidia,tegra20-ehci", "usb-ehci"; | ||
163 | reg = <0xc5008000 0x4000>; | ||
164 | interrupts = < 0 97 0x04 >; | ||
165 | phy_type = "utmi"; | ||
145 | }; | 166 | }; |
146 | }; | 167 | }; |
147 | 168 | ||
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi new file mode 100644 index 000000000000..ee7db9892e02 --- /dev/null +++ b/arch/arm/boot/dts/tegra30.dtsi | |||
@@ -0,0 +1,127 @@ | |||
1 | /include/ "skeleton.dtsi" | ||
2 | |||
3 | / { | ||
4 | compatible = "nvidia,tegra30"; | ||
5 | interrupt-parent = <&intc>; | ||
6 | |||
7 | intc: interrupt-controller@50041000 { | ||
8 | compatible = "arm,cortex-a9-gic"; | ||
9 | interrupt-controller; | ||
10 | #interrupt-cells = <3>; | ||
11 | reg = < 0x50041000 0x1000 >, | ||
12 | < 0x50040100 0x0100 >; | ||
13 | }; | ||
14 | |||
15 | i2c@7000c000 { | ||
16 | #address-cells = <1>; | ||
17 | #size-cells = <0>; | ||
18 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
19 | reg = <0x7000C000 0x100>; | ||
20 | interrupts = < 0 38 0x04 >; | ||
21 | }; | ||
22 | |||
23 | i2c@7000c400 { | ||
24 | #address-cells = <1>; | ||
25 | #size-cells = <0>; | ||
26 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
27 | reg = <0x7000C400 0x100>; | ||
28 | interrupts = < 0 84 0x04 >; | ||
29 | }; | ||
30 | |||
31 | i2c@7000c500 { | ||
32 | #address-cells = <1>; | ||
33 | #size-cells = <0>; | ||
34 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
35 | reg = <0x7000C500 0x100>; | ||
36 | interrupts = < 0 92 0x04 >; | ||
37 | }; | ||
38 | |||
39 | i2c@7000c700 { | ||
40 | #address-cells = <1>; | ||
41 | #size-cells = <0>; | ||
42 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
43 | reg = <0x7000c700 0x100>; | ||
44 | interrupts = < 0 120 0x04 >; | ||
45 | }; | ||
46 | |||
47 | i2c@7000d000 { | ||
48 | #address-cells = <1>; | ||
49 | #size-cells = <0>; | ||
50 | compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; | ||
51 | reg = <0x7000D000 0x100>; | ||
52 | interrupts = < 0 53 0x04 >; | ||
53 | }; | ||
54 | |||
55 | gpio: gpio@6000d000 { | ||
56 | compatible = "nvidia,tegra30-gpio", "nvidia,tegra20-gpio"; | ||
57 | reg = < 0x6000d000 0x1000 >; | ||
58 | interrupts = < 0 32 0x04 0 33 0x04 0 34 0x04 0 35 0x04 0 55 0x04 0 87 0x04 0 89 0x04 >; | ||
59 | #gpio-cells = <2>; | ||
60 | gpio-controller; | ||
61 | }; | ||
62 | |||
63 | serial@70006000 { | ||
64 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | ||
65 | reg = <0x70006000 0x40>; | ||
66 | reg-shift = <2>; | ||
67 | interrupts = < 0 36 0x04 >; | ||
68 | }; | ||
69 | |||
70 | serial@70006040 { | ||
71 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | ||
72 | reg = <0x70006040 0x40>; | ||
73 | reg-shift = <2>; | ||
74 | interrupts = < 0 37 0x04 >; | ||
75 | }; | ||
76 | |||
77 | serial@70006200 { | ||
78 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | ||
79 | reg = <0x70006200 0x100>; | ||
80 | reg-shift = <2>; | ||
81 | interrupts = < 0 46 0x04 >; | ||
82 | }; | ||
83 | |||
84 | serial@70006300 { | ||
85 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | ||
86 | reg = <0x70006300 0x100>; | ||
87 | reg-shift = <2>; | ||
88 | interrupts = < 0 90 0x04 >; | ||
89 | }; | ||
90 | |||
91 | serial@70006400 { | ||
92 | compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; | ||
93 | reg = <0x70006400 0x100>; | ||
94 | reg-shift = <2>; | ||
95 | interrupts = < 0 91 0x04 >; | ||
96 | }; | ||
97 | |||
98 | sdhci@78000000 { | ||
99 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | ||
100 | reg = <0x78000000 0x200>; | ||
101 | interrupts = < 0 14 0x04 >; | ||
102 | }; | ||
103 | |||
104 | sdhci@78000200 { | ||
105 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | ||
106 | reg = <0x78000200 0x200>; | ||
107 | interrupts = < 0 15 0x04 >; | ||
108 | }; | ||
109 | |||
110 | sdhci@78000400 { | ||
111 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | ||
112 | reg = <0x78000400 0x200>; | ||
113 | interrupts = < 0 19 0x04 >; | ||
114 | }; | ||
115 | |||
116 | sdhci@78000600 { | ||
117 | compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci"; | ||
118 | reg = <0x78000600 0x200>; | ||
119 | interrupts = < 0 31 0x04 >; | ||
120 | }; | ||
121 | |||
122 | pinmux: pinmux@70000000 { | ||
123 | compatible = "nvidia,tegra30-pinmux"; | ||
124 | reg = < 0x70000868 0xd0 /* Pad control registers */ | ||
125 | 0x70003000 0x3e0 >; /* Mux registers */ | ||
126 | }; | ||
127 | }; | ||
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig index 74df9ca2be31..81a933eb0903 100644 --- a/arch/arm/common/Kconfig +++ b/arch/arm/common/Kconfig | |||
@@ -1,8 +1,14 @@ | |||
1 | config ARM_GIC | 1 | config ARM_GIC |
2 | select IRQ_DOMAIN | 2 | select IRQ_DOMAIN |
3 | select MULTI_IRQ_HANDLER | ||
4 | bool | ||
5 | |||
6 | config GIC_NON_BANKED | ||
3 | bool | 7 | bool |
4 | 8 | ||
5 | config ARM_VIC | 9 | config ARM_VIC |
10 | select IRQ_DOMAIN | ||
11 | select MULTI_IRQ_HANDLER | ||
6 | bool | 12 | bool |
7 | 13 | ||
8 | config ARM_VIC_NR | 14 | config ARM_VIC_NR |
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 410a546060a2..b2dc2dd7f1df 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
@@ -40,13 +40,36 @@ | |||
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | 41 | ||
42 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
43 | #include <asm/exception.h> | ||
43 | #include <asm/mach/irq.h> | 44 | #include <asm/mach/irq.h> |
44 | #include <asm/hardware/gic.h> | 45 | #include <asm/hardware/gic.h> |
45 | 46 | ||
46 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); | 47 | union gic_base { |
48 | void __iomem *common_base; | ||
49 | void __percpu __iomem **percpu_base; | ||
50 | }; | ||
47 | 51 | ||
48 | /* Address of GIC 0 CPU interface */ | 52 | struct gic_chip_data { |
49 | void __iomem *gic_cpu_base_addr __read_mostly; | 53 | unsigned int irq_offset; |
54 | union gic_base dist_base; | ||
55 | union gic_base cpu_base; | ||
56 | #ifdef CONFIG_CPU_PM | ||
57 | u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)]; | ||
58 | u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)]; | ||
59 | u32 saved_spi_target[DIV_ROUND_UP(1020, 4)]; | ||
60 | u32 __percpu *saved_ppi_enable; | ||
61 | u32 __percpu *saved_ppi_conf; | ||
62 | #endif | ||
63 | #ifdef CONFIG_IRQ_DOMAIN | ||
64 | struct irq_domain domain; | ||
65 | #endif | ||
66 | unsigned int gic_irqs; | ||
67 | #ifdef CONFIG_GIC_NON_BANKED | ||
68 | void __iomem *(*get_base)(union gic_base *); | ||
69 | #endif | ||
70 | }; | ||
71 | |||
72 | static DEFINE_RAW_SPINLOCK(irq_controller_lock); | ||
50 | 73 | ||
51 | /* | 74 | /* |
52 | * Supported arch specific GIC irq extension. | 75 | * Supported arch specific GIC irq extension. |
@@ -67,16 +90,48 @@ struct irq_chip gic_arch_extn = { | |||
67 | 90 | ||
68 | static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; | 91 | static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; |
69 | 92 | ||
93 | #ifdef CONFIG_GIC_NON_BANKED | ||
94 | static void __iomem *gic_get_percpu_base(union gic_base *base) | ||
95 | { | ||
96 | return *__this_cpu_ptr(base->percpu_base); | ||
97 | } | ||
98 | |||
99 | static void __iomem *gic_get_common_base(union gic_base *base) | ||
100 | { | ||
101 | return base->common_base; | ||
102 | } | ||
103 | |||
104 | static inline void __iomem *gic_data_dist_base(struct gic_chip_data *data) | ||
105 | { | ||
106 | return data->get_base(&data->dist_base); | ||
107 | } | ||
108 | |||
109 | static inline void __iomem *gic_data_cpu_base(struct gic_chip_data *data) | ||
110 | { | ||
111 | return data->get_base(&data->cpu_base); | ||
112 | } | ||
113 | |||
114 | static inline void gic_set_base_accessor(struct gic_chip_data *data, | ||
115 | void __iomem *(*f)(union gic_base *)) | ||
116 | { | ||
117 | data->get_base = f; | ||
118 | } | ||
119 | #else | ||
120 | #define gic_data_dist_base(d) ((d)->dist_base.common_base) | ||
121 | #define gic_data_cpu_base(d) ((d)->cpu_base.common_base) | ||
122 | #define gic_set_base_accessor(d,f) | ||
123 | #endif | ||
124 | |||
70 | static inline void __iomem *gic_dist_base(struct irq_data *d) | 125 | static inline void __iomem *gic_dist_base(struct irq_data *d) |
71 | { | 126 | { |
72 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | 127 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); |
73 | return gic_data->dist_base; | 128 | return gic_data_dist_base(gic_data); |
74 | } | 129 | } |
75 | 130 | ||
76 | static inline void __iomem *gic_cpu_base(struct irq_data *d) | 131 | static inline void __iomem *gic_cpu_base(struct irq_data *d) |
77 | { | 132 | { |
78 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | 133 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); |
79 | return gic_data->cpu_base; | 134 | return gic_data_cpu_base(gic_data); |
80 | } | 135 | } |
81 | 136 | ||
82 | static inline unsigned int gic_irq(struct irq_data *d) | 137 | static inline unsigned int gic_irq(struct irq_data *d) |
@@ -215,6 +270,32 @@ static int gic_set_wake(struct irq_data *d, unsigned int on) | |||
215 | #define gic_set_wake NULL | 270 | #define gic_set_wake NULL |
216 | #endif | 271 | #endif |
217 | 272 | ||
273 | asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) | ||
274 | { | ||
275 | u32 irqstat, irqnr; | ||
276 | struct gic_chip_data *gic = &gic_data[0]; | ||
277 | void __iomem *cpu_base = gic_data_cpu_base(gic); | ||
278 | |||
279 | do { | ||
280 | irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); | ||
281 | irqnr = irqstat & ~0x1c00; | ||
282 | |||
283 | if (likely(irqnr > 15 && irqnr < 1021)) { | ||
284 | irqnr = irq_domain_to_irq(&gic->domain, irqnr); | ||
285 | handle_IRQ(irqnr, regs); | ||
286 | continue; | ||
287 | } | ||
288 | if (irqnr < 16) { | ||
289 | writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); | ||
290 | #ifdef CONFIG_SMP | ||
291 | handle_IPI(irqnr, regs); | ||
292 | #endif | ||
293 | continue; | ||
294 | } | ||
295 | break; | ||
296 | } while (1); | ||
297 | } | ||
298 | |||
218 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | 299 | static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) |
219 | { | 300 | { |
220 | struct gic_chip_data *chip_data = irq_get_handler_data(irq); | 301 | struct gic_chip_data *chip_data = irq_get_handler_data(irq); |
@@ -225,7 +306,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) | |||
225 | chained_irq_enter(chip, desc); | 306 | chained_irq_enter(chip, desc); |
226 | 307 | ||
227 | raw_spin_lock(&irq_controller_lock); | 308 | raw_spin_lock(&irq_controller_lock); |
228 | status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK); | 309 | status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK); |
229 | raw_spin_unlock(&irq_controller_lock); | 310 | raw_spin_unlock(&irq_controller_lock); |
230 | 311 | ||
231 | gic_irq = (status & 0x3ff); | 312 | gic_irq = (status & 0x3ff); |
@@ -270,7 +351,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
270 | u32 cpumask; | 351 | u32 cpumask; |
271 | unsigned int gic_irqs = gic->gic_irqs; | 352 | unsigned int gic_irqs = gic->gic_irqs; |
272 | struct irq_domain *domain = &gic->domain; | 353 | struct irq_domain *domain = &gic->domain; |
273 | void __iomem *base = gic->dist_base; | 354 | void __iomem *base = gic_data_dist_base(gic); |
274 | u32 cpu = 0; | 355 | u32 cpu = 0; |
275 | 356 | ||
276 | #ifdef CONFIG_SMP | 357 | #ifdef CONFIG_SMP |
@@ -330,8 +411,8 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
330 | 411 | ||
331 | static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) | 412 | static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) |
332 | { | 413 | { |
333 | void __iomem *dist_base = gic->dist_base; | 414 | void __iomem *dist_base = gic_data_dist_base(gic); |
334 | void __iomem *base = gic->cpu_base; | 415 | void __iomem *base = gic_data_cpu_base(gic); |
335 | int i; | 416 | int i; |
336 | 417 | ||
337 | /* | 418 | /* |
@@ -368,7 +449,7 @@ static void gic_dist_save(unsigned int gic_nr) | |||
368 | BUG(); | 449 | BUG(); |
369 | 450 | ||
370 | gic_irqs = gic_data[gic_nr].gic_irqs; | 451 | gic_irqs = gic_data[gic_nr].gic_irqs; |
371 | dist_base = gic_data[gic_nr].dist_base; | 452 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
372 | 453 | ||
373 | if (!dist_base) | 454 | if (!dist_base) |
374 | return; | 455 | return; |
@@ -403,7 +484,7 @@ static void gic_dist_restore(unsigned int gic_nr) | |||
403 | BUG(); | 484 | BUG(); |
404 | 485 | ||
405 | gic_irqs = gic_data[gic_nr].gic_irqs; | 486 | gic_irqs = gic_data[gic_nr].gic_irqs; |
406 | dist_base = gic_data[gic_nr].dist_base; | 487 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
407 | 488 | ||
408 | if (!dist_base) | 489 | if (!dist_base) |
409 | return; | 490 | return; |
@@ -439,8 +520,8 @@ static void gic_cpu_save(unsigned int gic_nr) | |||
439 | if (gic_nr >= MAX_GIC_NR) | 520 | if (gic_nr >= MAX_GIC_NR) |
440 | BUG(); | 521 | BUG(); |
441 | 522 | ||
442 | dist_base = gic_data[gic_nr].dist_base; | 523 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
443 | cpu_base = gic_data[gic_nr].cpu_base; | 524 | cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); |
444 | 525 | ||
445 | if (!dist_base || !cpu_base) | 526 | if (!dist_base || !cpu_base) |
446 | return; | 527 | return; |
@@ -465,8 +546,8 @@ static void gic_cpu_restore(unsigned int gic_nr) | |||
465 | if (gic_nr >= MAX_GIC_NR) | 546 | if (gic_nr >= MAX_GIC_NR) |
466 | BUG(); | 547 | BUG(); |
467 | 548 | ||
468 | dist_base = gic_data[gic_nr].dist_base; | 549 | dist_base = gic_data_dist_base(&gic_data[gic_nr]); |
469 | cpu_base = gic_data[gic_nr].cpu_base; | 550 | cpu_base = gic_data_cpu_base(&gic_data[gic_nr]); |
470 | 551 | ||
471 | if (!dist_base || !cpu_base) | 552 | if (!dist_base || !cpu_base) |
472 | return; | 553 | return; |
@@ -491,6 +572,11 @@ static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v) | |||
491 | int i; | 572 | int i; |
492 | 573 | ||
493 | for (i = 0; i < MAX_GIC_NR; i++) { | 574 | for (i = 0; i < MAX_GIC_NR; i++) { |
575 | #ifdef CONFIG_GIC_NON_BANKED | ||
576 | /* Skip over unused GICs */ | ||
577 | if (!gic_data[i].get_base) | ||
578 | continue; | ||
579 | #endif | ||
494 | switch (cmd) { | 580 | switch (cmd) { |
495 | case CPU_PM_ENTER: | 581 | case CPU_PM_ENTER: |
496 | gic_cpu_save(i); | 582 | gic_cpu_save(i); |
@@ -564,8 +650,9 @@ const struct irq_domain_ops gic_irq_domain_ops = { | |||
564 | #endif | 650 | #endif |
565 | }; | 651 | }; |
566 | 652 | ||
567 | void __init gic_init(unsigned int gic_nr, int irq_start, | 653 | void __init gic_init_bases(unsigned int gic_nr, int irq_start, |
568 | void __iomem *dist_base, void __iomem *cpu_base) | 654 | void __iomem *dist_base, void __iomem *cpu_base, |
655 | u32 percpu_offset) | ||
569 | { | 656 | { |
570 | struct gic_chip_data *gic; | 657 | struct gic_chip_data *gic; |
571 | struct irq_domain *domain; | 658 | struct irq_domain *domain; |
@@ -575,8 +662,36 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
575 | 662 | ||
576 | gic = &gic_data[gic_nr]; | 663 | gic = &gic_data[gic_nr]; |
577 | domain = &gic->domain; | 664 | domain = &gic->domain; |
578 | gic->dist_base = dist_base; | 665 | #ifdef CONFIG_GIC_NON_BANKED |
579 | gic->cpu_base = cpu_base; | 666 | if (percpu_offset) { /* Frankein-GIC without banked registers... */ |
667 | unsigned int cpu; | ||
668 | |||
669 | gic->dist_base.percpu_base = alloc_percpu(void __iomem *); | ||
670 | gic->cpu_base.percpu_base = alloc_percpu(void __iomem *); | ||
671 | if (WARN_ON(!gic->dist_base.percpu_base || | ||
672 | !gic->cpu_base.percpu_base)) { | ||
673 | free_percpu(gic->dist_base.percpu_base); | ||
674 | free_percpu(gic->cpu_base.percpu_base); | ||
675 | return; | ||
676 | } | ||
677 | |||
678 | for_each_possible_cpu(cpu) { | ||
679 | unsigned long offset = percpu_offset * cpu_logical_map(cpu); | ||
680 | *per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset; | ||
681 | *per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset; | ||
682 | } | ||
683 | |||
684 | gic_set_base_accessor(gic, gic_get_percpu_base); | ||
685 | } else | ||
686 | #endif | ||
687 | { /* Normal, sane GIC... */ | ||
688 | WARN(percpu_offset, | ||
689 | "GIC_NON_BANKED not enabled, ignoring %08x offset!", | ||
690 | percpu_offset); | ||
691 | gic->dist_base.common_base = dist_base; | ||
692 | gic->cpu_base.common_base = cpu_base; | ||
693 | gic_set_base_accessor(gic, gic_get_common_base); | ||
694 | } | ||
580 | 695 | ||
581 | /* | 696 | /* |
582 | * For primary GICs, skip over SGIs. | 697 | * For primary GICs, skip over SGIs. |
@@ -584,8 +699,6 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
584 | */ | 699 | */ |
585 | domain->hwirq_base = 32; | 700 | domain->hwirq_base = 32; |
586 | if (gic_nr == 0) { | 701 | if (gic_nr == 0) { |
587 | gic_cpu_base_addr = cpu_base; | ||
588 | |||
589 | if ((irq_start & 31) > 0) { | 702 | if ((irq_start & 31) > 0) { |
590 | domain->hwirq_base = 16; | 703 | domain->hwirq_base = 16; |
591 | if (irq_start != -1) | 704 | if (irq_start != -1) |
@@ -597,7 +710,7 @@ void __init gic_init(unsigned int gic_nr, int irq_start, | |||
597 | * Find out how many interrupts are supported. | 710 | * Find out how many interrupts are supported. |
598 | * The GIC only supports up to 1020 interrupt sources. | 711 | * The GIC only supports up to 1020 interrupt sources. |
599 | */ | 712 | */ |
600 | gic_irqs = readl_relaxed(dist_base + GIC_DIST_CTR) & 0x1f; | 713 | gic_irqs = readl_relaxed(gic_data_dist_base(gic) + GIC_DIST_CTR) & 0x1f; |
601 | gic_irqs = (gic_irqs + 1) * 32; | 714 | gic_irqs = (gic_irqs + 1) * 32; |
602 | if (gic_irqs > 1020) | 715 | if (gic_irqs > 1020) |
603 | gic_irqs = 1020; | 716 | gic_irqs = 1020; |
@@ -645,7 +758,7 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) | |||
645 | dsb(); | 758 | dsb(); |
646 | 759 | ||
647 | /* this always happens on GIC0 */ | 760 | /* this always happens on GIC0 */ |
648 | writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT); | 761 | writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT); |
649 | } | 762 | } |
650 | #endif | 763 | #endif |
651 | 764 | ||
@@ -656,6 +769,7 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent) | |||
656 | { | 769 | { |
657 | void __iomem *cpu_base; | 770 | void __iomem *cpu_base; |
658 | void __iomem *dist_base; | 771 | void __iomem *dist_base; |
772 | u32 percpu_offset; | ||
659 | int irq; | 773 | int irq; |
660 | struct irq_domain *domain = &gic_data[gic_cnt].domain; | 774 | struct irq_domain *domain = &gic_data[gic_cnt].domain; |
661 | 775 | ||
@@ -668,9 +782,12 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent) | |||
668 | cpu_base = of_iomap(node, 1); | 782 | cpu_base = of_iomap(node, 1); |
669 | WARN(!cpu_base, "unable to map gic cpu registers\n"); | 783 | WARN(!cpu_base, "unable to map gic cpu registers\n"); |
670 | 784 | ||
785 | if (of_property_read_u32(node, "cpu-offset", &percpu_offset)) | ||
786 | percpu_offset = 0; | ||
787 | |||
671 | domain->of_node = of_node_get(node); | 788 | domain->of_node = of_node_get(node); |
672 | 789 | ||
673 | gic_init(gic_cnt, -1, dist_base, cpu_base); | 790 | gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset); |
674 | 791 | ||
675 | if (parent) { | 792 | if (parent) { |
676 | irq = irq_of_parse_and_map(node, 0); | 793 | irq = irq_of_parse_and_map(node, 0); |
diff --git a/arch/arm/common/vic.c b/arch/arm/common/vic.c index 01f18a421b17..77287504c8b4 100644 --- a/arch/arm/common/vic.c +++ b/arch/arm/common/vic.c | |||
@@ -19,17 +19,22 @@ | |||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/export.h> | ||
22 | #include <linux/init.h> | 23 | #include <linux/init.h> |
23 | #include <linux/list.h> | 24 | #include <linux/list.h> |
24 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | #include <linux/irqdomain.h> | ||
27 | #include <linux/of.h> | ||
28 | #include <linux/of_address.h> | ||
29 | #include <linux/of_irq.h> | ||
25 | #include <linux/syscore_ops.h> | 30 | #include <linux/syscore_ops.h> |
26 | #include <linux/device.h> | 31 | #include <linux/device.h> |
27 | #include <linux/amba/bus.h> | 32 | #include <linux/amba/bus.h> |
28 | 33 | ||
34 | #include <asm/exception.h> | ||
29 | #include <asm/mach/irq.h> | 35 | #include <asm/mach/irq.h> |
30 | #include <asm/hardware/vic.h> | 36 | #include <asm/hardware/vic.h> |
31 | 37 | ||
32 | #ifdef CONFIG_PM | ||
33 | /** | 38 | /** |
34 | * struct vic_device - VIC PM device | 39 | * struct vic_device - VIC PM device |
35 | * @irq: The IRQ number for the base of the VIC. | 40 | * @irq: The IRQ number for the base of the VIC. |
@@ -40,6 +45,7 @@ | |||
40 | * @int_enable: Save for VIC_INT_ENABLE. | 45 | * @int_enable: Save for VIC_INT_ENABLE. |
41 | * @soft_int: Save for VIC_INT_SOFT. | 46 | * @soft_int: Save for VIC_INT_SOFT. |
42 | * @protect: Save for VIC_PROTECT. | 47 | * @protect: Save for VIC_PROTECT. |
48 | * @domain: The IRQ domain for the VIC. | ||
43 | */ | 49 | */ |
44 | struct vic_device { | 50 | struct vic_device { |
45 | void __iomem *base; | 51 | void __iomem *base; |
@@ -50,13 +56,13 @@ struct vic_device { | |||
50 | u32 int_enable; | 56 | u32 int_enable; |
51 | u32 soft_int; | 57 | u32 soft_int; |
52 | u32 protect; | 58 | u32 protect; |
59 | struct irq_domain domain; | ||
53 | }; | 60 | }; |
54 | 61 | ||
55 | /* we cannot allocate memory when VICs are initially registered */ | 62 | /* we cannot allocate memory when VICs are initially registered */ |
56 | static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; | 63 | static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; |
57 | 64 | ||
58 | static int vic_id; | 65 | static int vic_id; |
59 | #endif /* CONFIG_PM */ | ||
60 | 66 | ||
61 | /** | 67 | /** |
62 | * vic_init2 - common initialisation code | 68 | * vic_init2 - common initialisation code |
@@ -156,39 +162,50 @@ static int __init vic_pm_init(void) | |||
156 | return 0; | 162 | return 0; |
157 | } | 163 | } |
158 | late_initcall(vic_pm_init); | 164 | late_initcall(vic_pm_init); |
165 | #endif /* CONFIG_PM */ | ||
159 | 166 | ||
160 | /** | 167 | /** |
161 | * vic_pm_register - Register a VIC for later power management control | 168 | * vic_register() - Register a VIC. |
162 | * @base: The base address of the VIC. | 169 | * @base: The base address of the VIC. |
163 | * @irq: The base IRQ for the VIC. | 170 | * @irq: The base IRQ for the VIC. |
164 | * @resume_sources: bitmask of interrupts allowed for resume sources. | 171 | * @resume_sources: bitmask of interrupts allowed for resume sources. |
172 | * @node: The device tree node associated with the VIC. | ||
165 | * | 173 | * |
166 | * Register the VIC with the system device tree so that it can be notified | 174 | * Register the VIC with the system device tree so that it can be notified |
167 | * of suspend and resume requests and ensure that the correct actions are | 175 | * of suspend and resume requests and ensure that the correct actions are |
168 | * taken to re-instate the settings on resume. | 176 | * taken to re-instate the settings on resume. |
177 | * | ||
178 | * This also configures the IRQ domain for the VIC. | ||
169 | */ | 179 | */ |
170 | static void __init vic_pm_register(void __iomem *base, unsigned int irq, u32 resume_sources) | 180 | static void __init vic_register(void __iomem *base, unsigned int irq, |
181 | u32 resume_sources, struct device_node *node) | ||
171 | { | 182 | { |
172 | struct vic_device *v; | 183 | struct vic_device *v; |
173 | 184 | ||
174 | if (vic_id >= ARRAY_SIZE(vic_devices)) | 185 | if (vic_id >= ARRAY_SIZE(vic_devices)) { |
175 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); | 186 | printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__); |
176 | else { | 187 | return; |
177 | v = &vic_devices[vic_id]; | ||
178 | v->base = base; | ||
179 | v->resume_sources = resume_sources; | ||
180 | v->irq = irq; | ||
181 | vic_id++; | ||
182 | } | 188 | } |
189 | |||
190 | v = &vic_devices[vic_id]; | ||
191 | v->base = base; | ||
192 | v->resume_sources = resume_sources; | ||
193 | v->irq = irq; | ||
194 | vic_id++; | ||
195 | |||
196 | v->domain.irq_base = irq; | ||
197 | v->domain.nr_irq = 32; | ||
198 | #ifdef CONFIG_OF_IRQ | ||
199 | v->domain.of_node = of_node_get(node); | ||
200 | v->domain.ops = &irq_domain_simple_ops; | ||
201 | #endif /* CONFIG_OF */ | ||
202 | irq_domain_add(&v->domain); | ||
183 | } | 203 | } |
184 | #else | ||
185 | static inline void vic_pm_register(void __iomem *base, unsigned int irq, u32 arg1) { } | ||
186 | #endif /* CONFIG_PM */ | ||
187 | 204 | ||
188 | static void vic_ack_irq(struct irq_data *d) | 205 | static void vic_ack_irq(struct irq_data *d) |
189 | { | 206 | { |
190 | void __iomem *base = irq_data_get_irq_chip_data(d); | 207 | void __iomem *base = irq_data_get_irq_chip_data(d); |
191 | unsigned int irq = d->irq & 31; | 208 | unsigned int irq = d->hwirq; |
192 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); | 209 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
193 | /* moreover, clear the soft-triggered, in case it was the reason */ | 210 | /* moreover, clear the soft-triggered, in case it was the reason */ |
194 | writel(1 << irq, base + VIC_INT_SOFT_CLEAR); | 211 | writel(1 << irq, base + VIC_INT_SOFT_CLEAR); |
@@ -197,14 +214,14 @@ static void vic_ack_irq(struct irq_data *d) | |||
197 | static void vic_mask_irq(struct irq_data *d) | 214 | static void vic_mask_irq(struct irq_data *d) |
198 | { | 215 | { |
199 | void __iomem *base = irq_data_get_irq_chip_data(d); | 216 | void __iomem *base = irq_data_get_irq_chip_data(d); |
200 | unsigned int irq = d->irq & 31; | 217 | unsigned int irq = d->hwirq; |
201 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); | 218 | writel(1 << irq, base + VIC_INT_ENABLE_CLEAR); |
202 | } | 219 | } |
203 | 220 | ||
204 | static void vic_unmask_irq(struct irq_data *d) | 221 | static void vic_unmask_irq(struct irq_data *d) |
205 | { | 222 | { |
206 | void __iomem *base = irq_data_get_irq_chip_data(d); | 223 | void __iomem *base = irq_data_get_irq_chip_data(d); |
207 | unsigned int irq = d->irq & 31; | 224 | unsigned int irq = d->hwirq; |
208 | writel(1 << irq, base + VIC_INT_ENABLE); | 225 | writel(1 << irq, base + VIC_INT_ENABLE); |
209 | } | 226 | } |
210 | 227 | ||
@@ -226,7 +243,7 @@ static struct vic_device *vic_from_irq(unsigned int irq) | |||
226 | static int vic_set_wake(struct irq_data *d, unsigned int on) | 243 | static int vic_set_wake(struct irq_data *d, unsigned int on) |
227 | { | 244 | { |
228 | struct vic_device *v = vic_from_irq(d->irq); | 245 | struct vic_device *v = vic_from_irq(d->irq); |
229 | unsigned int off = d->irq & 31; | 246 | unsigned int off = d->hwirq; |
230 | u32 bit = 1 << off; | 247 | u32 bit = 1 << off; |
231 | 248 | ||
232 | if (!v) | 249 | if (!v) |
@@ -301,7 +318,7 @@ static void __init vic_set_irq_sources(void __iomem *base, | |||
301 | * and 020 within the page. We call this "second block". | 318 | * and 020 within the page. We call this "second block". |
302 | */ | 319 | */ |
303 | static void __init vic_init_st(void __iomem *base, unsigned int irq_start, | 320 | static void __init vic_init_st(void __iomem *base, unsigned int irq_start, |
304 | u32 vic_sources) | 321 | u32 vic_sources, struct device_node *node) |
305 | { | 322 | { |
306 | unsigned int i; | 323 | unsigned int i; |
307 | int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0; | 324 | int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0; |
@@ -328,17 +345,12 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start, | |||
328 | } | 345 | } |
329 | 346 | ||
330 | vic_set_irq_sources(base, irq_start, vic_sources); | 347 | vic_set_irq_sources(base, irq_start, vic_sources); |
348 | vic_register(base, irq_start, 0, node); | ||
331 | } | 349 | } |
332 | 350 | ||
333 | /** | 351 | static void __init __vic_init(void __iomem *base, unsigned int irq_start, |
334 | * vic_init - initialise a vectored interrupt controller | 352 | u32 vic_sources, u32 resume_sources, |
335 | * @base: iomem base address | 353 | struct device_node *node) |
336 | * @irq_start: starting interrupt number, must be muliple of 32 | ||
337 | * @vic_sources: bitmask of interrupt sources to allow | ||
338 | * @resume_sources: bitmask of interrupt sources to allow for resume | ||
339 | */ | ||
340 | void __init vic_init(void __iomem *base, unsigned int irq_start, | ||
341 | u32 vic_sources, u32 resume_sources) | ||
342 | { | 354 | { |
343 | unsigned int i; | 355 | unsigned int i; |
344 | u32 cellid = 0; | 356 | u32 cellid = 0; |
@@ -356,7 +368,7 @@ void __init vic_init(void __iomem *base, unsigned int irq_start, | |||
356 | 368 | ||
357 | switch(vendor) { | 369 | switch(vendor) { |
358 | case AMBA_VENDOR_ST: | 370 | case AMBA_VENDOR_ST: |
359 | vic_init_st(base, irq_start, vic_sources); | 371 | vic_init_st(base, irq_start, vic_sources, node); |
360 | return; | 372 | return; |
361 | default: | 373 | default: |
362 | printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n"); | 374 | printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n"); |
@@ -375,5 +387,81 @@ void __init vic_init(void __iomem *base, unsigned int irq_start, | |||
375 | 387 | ||
376 | vic_set_irq_sources(base, irq_start, vic_sources); | 388 | vic_set_irq_sources(base, irq_start, vic_sources); |
377 | 389 | ||
378 | vic_pm_register(base, irq_start, resume_sources); | 390 | vic_register(base, irq_start, resume_sources, node); |
391 | } | ||
392 | |||
393 | /** | ||
394 | * vic_init() - initialise a vectored interrupt controller | ||
395 | * @base: iomem base address | ||
396 | * @irq_start: starting interrupt number, must be muliple of 32 | ||
397 | * @vic_sources: bitmask of interrupt sources to allow | ||
398 | * @resume_sources: bitmask of interrupt sources to allow for resume | ||
399 | */ | ||
400 | void __init vic_init(void __iomem *base, unsigned int irq_start, | ||
401 | u32 vic_sources, u32 resume_sources) | ||
402 | { | ||
403 | __vic_init(base, irq_start, vic_sources, resume_sources, NULL); | ||
404 | } | ||
405 | |||
406 | #ifdef CONFIG_OF | ||
407 | int __init vic_of_init(struct device_node *node, struct device_node *parent) | ||
408 | { | ||
409 | void __iomem *regs; | ||
410 | int irq_base; | ||
411 | |||
412 | if (WARN(parent, "non-root VICs are not supported")) | ||
413 | return -EINVAL; | ||
414 | |||
415 | regs = of_iomap(node, 0); | ||
416 | if (WARN_ON(!regs)) | ||
417 | return -EIO; | ||
418 | |||
419 | irq_base = irq_alloc_descs(-1, 0, 32, numa_node_id()); | ||
420 | if (WARN_ON(irq_base < 0)) | ||
421 | goto out_unmap; | ||
422 | |||
423 | __vic_init(regs, irq_base, ~0, ~0, node); | ||
424 | |||
425 | return 0; | ||
426 | |||
427 | out_unmap: | ||
428 | iounmap(regs); | ||
429 | |||
430 | return -EIO; | ||
431 | } | ||
432 | #endif /* CONFIG OF */ | ||
433 | |||
434 | /* | ||
435 | * Handle each interrupt in a single VIC. Returns non-zero if we've | ||
436 | * handled at least one interrupt. This does a single read of the | ||
437 | * status register and handles all interrupts in order from LSB first. | ||
438 | */ | ||
439 | static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs) | ||
440 | { | ||
441 | u32 stat, irq; | ||
442 | int handled = 0; | ||
443 | |||
444 | stat = readl_relaxed(vic->base + VIC_IRQ_STATUS); | ||
445 | while (stat) { | ||
446 | irq = ffs(stat) - 1; | ||
447 | handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs); | ||
448 | stat &= ~(1 << irq); | ||
449 | handled = 1; | ||
450 | } | ||
451 | |||
452 | return handled; | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * Keep iterating over all registered VIC's until there are no pending | ||
457 | * interrupts. | ||
458 | */ | ||
459 | asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs) | ||
460 | { | ||
461 | int i, handled; | ||
462 | |||
463 | do { | ||
464 | for (i = 0, handled = 0; i < vic_id; ++i) | ||
465 | handled |= handle_one_vic(&vic_devices[i], regs); | ||
466 | } while (handled); | ||
379 | } | 467 | } |
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig index 195729760aeb..fd5d3041d717 100644 --- a/arch/arm/configs/tegra_defconfig +++ b/arch/arm/configs/tegra_defconfig | |||
@@ -9,9 +9,8 @@ CONFIG_RESOURCE_COUNTERS=y | |||
9 | CONFIG_CGROUP_SCHED=y | 9 | CONFIG_CGROUP_SCHED=y |
10 | CONFIG_RT_GROUP_SCHED=y | 10 | CONFIG_RT_GROUP_SCHED=y |
11 | CONFIG_BLK_DEV_INITRD=y | 11 | CONFIG_BLK_DEV_INITRD=y |
12 | CONFIG_EMBEDDED=y | ||
13 | # CONFIG_SYSCTL_SYSCALL is not set | ||
14 | # CONFIG_ELF_CORE is not set | 12 | # CONFIG_ELF_CORE is not set |
13 | CONFIG_EMBEDDED=y | ||
15 | CONFIG_SLAB=y | 14 | CONFIG_SLAB=y |
16 | CONFIG_MODULES=y | 15 | CONFIG_MODULES=y |
17 | CONFIG_MODULE_UNLOAD=y | 16 | CONFIG_MODULE_UNLOAD=y |
@@ -20,6 +19,8 @@ CONFIG_MODULE_FORCE_UNLOAD=y | |||
20 | # CONFIG_IOSCHED_DEADLINE is not set | 19 | # CONFIG_IOSCHED_DEADLINE is not set |
21 | # CONFIG_IOSCHED_CFQ is not set | 20 | # CONFIG_IOSCHED_CFQ is not set |
22 | CONFIG_ARCH_TEGRA=y | 21 | CONFIG_ARCH_TEGRA=y |
22 | CONFIG_ARCH_TEGRA_2x_SOC=y | ||
23 | CONFIG_ARCH_TEGRA_3x_SOC=y | ||
23 | CONFIG_MACH_HARMONY=y | 24 | CONFIG_MACH_HARMONY=y |
24 | CONFIG_MACH_KAEN=y | 25 | CONFIG_MACH_KAEN=y |
25 | CONFIG_MACH_PAZ00=y | 26 | CONFIG_MACH_PAZ00=y |
@@ -78,14 +79,12 @@ CONFIG_BLK_DEV_SD=y | |||
78 | # CONFIG_SCSI_LOWLEVEL is not set | 79 | # CONFIG_SCSI_LOWLEVEL is not set |
79 | CONFIG_NETDEVICES=y | 80 | CONFIG_NETDEVICES=y |
80 | CONFIG_DUMMY=y | 81 | CONFIG_DUMMY=y |
81 | CONFIG_NET_ETHERNET=y | ||
82 | CONFIG_R8169=y | 82 | CONFIG_R8169=y |
83 | # CONFIG_NETDEV_10000 is not set | ||
84 | # CONFIG_WLAN is not set | ||
85 | CONFIG_USB_PEGASUS=y | 83 | CONFIG_USB_PEGASUS=y |
86 | CONFIG_USB_USBNET=y | 84 | CONFIG_USB_USBNET=y |
87 | CONFIG_USB_NET_SMSC75XX=y | 85 | CONFIG_USB_NET_SMSC75XX=y |
88 | CONFIG_USB_NET_SMSC95XX=y | 86 | CONFIG_USB_NET_SMSC95XX=y |
87 | # CONFIG_WLAN is not set | ||
89 | # CONFIG_INPUT is not set | 88 | # CONFIG_INPUT is not set |
90 | # CONFIG_SERIO is not set | 89 | # CONFIG_SERIO is not set |
91 | # CONFIG_VT is not set | 90 | # CONFIG_VT is not set |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 29035e86a59d..b6e65dedfd71 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
@@ -187,6 +187,17 @@ | |||
187 | #endif | 187 | #endif |
188 | 188 | ||
189 | /* | 189 | /* |
190 | * Instruction barrier | ||
191 | */ | ||
192 | .macro instr_sync | ||
193 | #if __LINUX_ARM_ARCH__ >= 7 | ||
194 | isb | ||
195 | #elif __LINUX_ARM_ARCH__ == 6 | ||
196 | mcr p15, 0, r0, c7, c5, 4 | ||
197 | #endif | ||
198 | .endm | ||
199 | |||
200 | /* | ||
190 | * SMP data memory barrier | 201 | * SMP data memory barrier |
191 | */ | 202 | */ |
192 | .macro smp_dmb mode | 203 | .macro smp_dmb mode |
diff --git a/arch/arm/include/asm/cti.h b/arch/arm/include/asm/cti.h new file mode 100644 index 000000000000..a0ada3ea4358 --- /dev/null +++ b/arch/arm/include/asm/cti.h | |||
@@ -0,0 +1,179 @@ | |||
1 | #ifndef __ASMARM_CTI_H | ||
2 | #define __ASMARM_CTI_H | ||
3 | |||
4 | #include <asm/io.h> | ||
5 | |||
6 | /* The registers' definition is from section 3.2 of | ||
7 | * Embedded Cross Trigger Revision: r0p0 | ||
8 | */ | ||
9 | #define CTICONTROL 0x000 | ||
10 | #define CTISTATUS 0x004 | ||
11 | #define CTILOCK 0x008 | ||
12 | #define CTIPROTECTION 0x00C | ||
13 | #define CTIINTACK 0x010 | ||
14 | #define CTIAPPSET 0x014 | ||
15 | #define CTIAPPCLEAR 0x018 | ||
16 | #define CTIAPPPULSE 0x01c | ||
17 | #define CTIINEN 0x020 | ||
18 | #define CTIOUTEN 0x0A0 | ||
19 | #define CTITRIGINSTATUS 0x130 | ||
20 | #define CTITRIGOUTSTATUS 0x134 | ||
21 | #define CTICHINSTATUS 0x138 | ||
22 | #define CTICHOUTSTATUS 0x13c | ||
23 | #define CTIPERIPHID0 0xFE0 | ||
24 | #define CTIPERIPHID1 0xFE4 | ||
25 | #define CTIPERIPHID2 0xFE8 | ||
26 | #define CTIPERIPHID3 0xFEC | ||
27 | #define CTIPCELLID0 0xFF0 | ||
28 | #define CTIPCELLID1 0xFF4 | ||
29 | #define CTIPCELLID2 0xFF8 | ||
30 | #define CTIPCELLID3 0xFFC | ||
31 | |||
32 | /* The below are from section 3.6.4 of | ||
33 | * CoreSight v1.0 Architecture Specification | ||
34 | */ | ||
35 | #define LOCKACCESS 0xFB0 | ||
36 | #define LOCKSTATUS 0xFB4 | ||
37 | |||
38 | /* write this value to LOCKACCESS will unlock the module, and | ||
39 | * other value will lock the module | ||
40 | */ | ||
41 | #define LOCKCODE 0xC5ACCE55 | ||
42 | |||
43 | /** | ||
44 | * struct cti - cross trigger interface struct | ||
45 | * @base: mapped virtual address for the cti base | ||
46 | * @irq: irq number for the cti | ||
47 | * @trig_out_for_irq: triger out number which will cause | ||
48 | * the @irq happen | ||
49 | * | ||
50 | * cti struct used to operate cti registers. | ||
51 | */ | ||
52 | struct cti { | ||
53 | void __iomem *base; | ||
54 | int irq; | ||
55 | int trig_out_for_irq; | ||
56 | }; | ||
57 | |||
58 | /** | ||
59 | * cti_init - initialize the cti instance | ||
60 | * @cti: cti instance | ||
61 | * @base: mapped virtual address for the cti base | ||
62 | * @irq: irq number for the cti | ||
63 | * @trig_out: triger out number which will cause | ||
64 | * the @irq happen | ||
65 | * | ||
66 | * called by machine code to pass the board dependent | ||
67 | * @base, @irq and @trig_out to cti. | ||
68 | */ | ||
69 | static inline void cti_init(struct cti *cti, | ||
70 | void __iomem *base, int irq, int trig_out) | ||
71 | { | ||
72 | cti->base = base; | ||
73 | cti->irq = irq; | ||
74 | cti->trig_out_for_irq = trig_out; | ||
75 | } | ||
76 | |||
77 | /** | ||
78 | * cti_map_trigger - use the @chan to map @trig_in to @trig_out | ||
79 | * @cti: cti instance | ||
80 | * @trig_in: trigger in number | ||
81 | * @trig_out: trigger out number | ||
82 | * @channel: channel number | ||
83 | * | ||
84 | * This function maps one trigger in of @trig_in to one trigger | ||
85 | * out of @trig_out using the channel @chan. | ||
86 | */ | ||
87 | static inline void cti_map_trigger(struct cti *cti, | ||
88 | int trig_in, int trig_out, int chan) | ||
89 | { | ||
90 | void __iomem *base = cti->base; | ||
91 | unsigned long val; | ||
92 | |||
93 | val = __raw_readl(base + CTIINEN + trig_in * 4); | ||
94 | val |= BIT(chan); | ||
95 | __raw_writel(val, base + CTIINEN + trig_in * 4); | ||
96 | |||
97 | val = __raw_readl(base + CTIOUTEN + trig_out * 4); | ||
98 | val |= BIT(chan); | ||
99 | __raw_writel(val, base + CTIOUTEN + trig_out * 4); | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * cti_enable - enable the cti module | ||
104 | * @cti: cti instance | ||
105 | * | ||
106 | * enable the cti module | ||
107 | */ | ||
108 | static inline void cti_enable(struct cti *cti) | ||
109 | { | ||
110 | __raw_writel(0x1, cti->base + CTICONTROL); | ||
111 | } | ||
112 | |||
113 | /** | ||
114 | * cti_disable - disable the cti module | ||
115 | * @cti: cti instance | ||
116 | * | ||
117 | * enable the cti module | ||
118 | */ | ||
119 | static inline void cti_disable(struct cti *cti) | ||
120 | { | ||
121 | __raw_writel(0, cti->base + CTICONTROL); | ||
122 | } | ||
123 | |||
124 | /** | ||
125 | * cti_irq_ack - clear the cti irq | ||
126 | * @cti: cti instance | ||
127 | * | ||
128 | * clear the cti irq | ||
129 | */ | ||
130 | static inline void cti_irq_ack(struct cti *cti) | ||
131 | { | ||
132 | void __iomem *base = cti->base; | ||
133 | unsigned long val; | ||
134 | |||
135 | val = __raw_readl(base + CTIINTACK); | ||
136 | val |= BIT(cti->trig_out_for_irq); | ||
137 | __raw_writel(val, base + CTIINTACK); | ||
138 | } | ||
139 | |||
140 | /** | ||
141 | * cti_unlock - unlock cti module | ||
142 | * @cti: cti instance | ||
143 | * | ||
144 | * unlock the cti module, or else any writes to the cti | ||
145 | * module is not allowed. | ||
146 | */ | ||
147 | static inline void cti_unlock(struct cti *cti) | ||
148 | { | ||
149 | void __iomem *base = cti->base; | ||
150 | unsigned long val; | ||
151 | |||
152 | val = __raw_readl(base + LOCKSTATUS); | ||
153 | |||
154 | if (val & 1) { | ||
155 | val = LOCKCODE; | ||
156 | __raw_writel(val, base + LOCKACCESS); | ||
157 | } | ||
158 | } | ||
159 | |||
160 | /** | ||
161 | * cti_lock - lock cti module | ||
162 | * @cti: cti instance | ||
163 | * | ||
164 | * lock the cti module, so any writes to the cti | ||
165 | * module will be not allowed. | ||
166 | */ | ||
167 | static inline void cti_lock(struct cti *cti) | ||
168 | { | ||
169 | void __iomem *base = cti->base; | ||
170 | unsigned long val; | ||
171 | |||
172 | val = __raw_readl(base + LOCKSTATUS); | ||
173 | |||
174 | if (!(val & 1)) { | ||
175 | val = ~LOCKCODE; | ||
176 | __raw_writel(val, base + LOCKACCESS); | ||
177 | } | ||
178 | } | ||
179 | #endif | ||
diff --git a/arch/arm/include/asm/entry-macro-vic2.S b/arch/arm/include/asm/entry-macro-vic2.S deleted file mode 100644 index 3ceb85e43850..000000000000 --- a/arch/arm/include/asm/entry-macro-vic2.S +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | /* arch/arm/include/asm/entry-macro-vic2.S | ||
2 | * | ||
3 | * Originally arch/arm/mach-s3c6400/include/mach/entry-macro.S | ||
4 | * | ||
5 | * Copyright 2008 Openmoko, Inc. | ||
6 | * Copyright 2008 Simtec Electronics | ||
7 | * http://armlinux.simtec.co.uk/ | ||
8 | * Ben Dooks <ben@simtec.co.uk> | ||
9 | * | ||
10 | * Low-level IRQ helper macros for a device with two VICs | ||
11 | * | ||
12 | * This file is licensed under the terms of the GNU General Public | ||
13 | * License version 2. This program is licensed "as is" without any | ||
14 | * warranty of any kind, whether express or implied. | ||
15 | */ | ||
16 | |||
17 | /* This should be included from <mach/entry-macro.S> with the necessary | ||
18 | * defines for virtual addresses and IRQ bases for the two vics. | ||
19 | * | ||
20 | * The code needs the following defined: | ||
21 | * IRQ_VIC0_BASE IRQ number of VIC0's first IRQ | ||
22 | * IRQ_VIC1_BASE IRQ number of VIC1's first IRQ | ||
23 | * VA_VIC0 Virtual address of VIC0 | ||
24 | * VA_VIC1 Virtual address of VIC1 | ||
25 | * | ||
26 | * Note, code assumes VIC0's virtual address is an ARM immediate constant | ||
27 | * away from VIC1. | ||
28 | */ | ||
29 | |||
30 | #include <asm/hardware/vic.h> | ||
31 | |||
32 | .macro disable_fiq | ||
33 | .endm | ||
34 | |||
35 | .macro get_irqnr_preamble, base, tmp | ||
36 | ldr \base, =VA_VIC0 | ||
37 | .endm | ||
38 | |||
39 | .macro arch_ret_to_user, tmp1, tmp2 | ||
40 | .endm | ||
41 | |||
42 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
43 | |||
44 | @ check the vic0 | ||
45 | mov \irqnr, #IRQ_VIC0_BASE + 31 | ||
46 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
47 | teq \irqstat, #0 | ||
48 | |||
49 | @ otherwise try vic1 | ||
50 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
51 | addeq \irqnr, \irqnr, #(IRQ_VIC1_BASE - IRQ_VIC0_BASE) | ||
52 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
53 | teqeq \irqstat, #0 | ||
54 | |||
55 | clzne \irqstat, \irqstat | ||
56 | subne \irqnr, \irqnr, \irqstat | ||
57 | .endm | ||
diff --git a/arch/arm/include/asm/hardware/entry-macro-gic.S b/arch/arm/include/asm/hardware/entry-macro-gic.S deleted file mode 100644 index 74ebc803904d..000000000000 --- a/arch/arm/include/asm/hardware/entry-macro-gic.S +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/hardware/entry-macro-gic.S | ||
3 | * | ||
4 | * Low-level IRQ helper macros for GIC | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <asm/hardware/gic.h> | ||
12 | |||
13 | #ifndef HAVE_GET_IRQNR_PREAMBLE | ||
14 | .macro get_irqnr_preamble, base, tmp | ||
15 | ldr \base, =gic_cpu_base_addr | ||
16 | ldr \base, [\base] | ||
17 | .endm | ||
18 | #endif | ||
19 | |||
20 | /* | ||
21 | * The interrupt numbering scheme is defined in the | ||
22 | * interrupt controller spec. To wit: | ||
23 | * | ||
24 | * Interrupts 0-15 are IPI | ||
25 | * 16-31 are local. We allow 30 to be used for the watchdog. | ||
26 | * 32-1020 are global | ||
27 | * 1021-1022 are reserved | ||
28 | * 1023 is "spurious" (no interrupt) | ||
29 | * | ||
30 | * A simple read from the controller will tell us the number of the highest | ||
31 | * priority enabled interrupt. We then just need to check whether it is in the | ||
32 | * valid range for an IRQ (30-1020 inclusive). | ||
33 | */ | ||
34 | |||
35 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
36 | |||
37 | ldr \irqstat, [\base, #GIC_CPU_INTACK] | ||
38 | /* bits 12-10 = src CPU, 9-0 = int # */ | ||
39 | |||
40 | ldr \tmp, =1021 | ||
41 | bic \irqnr, \irqstat, #0x1c00 | ||
42 | cmp \irqnr, #15 | ||
43 | cmpcc \irqnr, \irqnr | ||
44 | cmpne \irqnr, \tmp | ||
45 | cmpcs \irqnr, \irqnr | ||
46 | .endm | ||
47 | |||
48 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
49 | * register) is preserved from the macro above. | ||
50 | * If there is an IPI, we immediately signal end of interrupt on the | ||
51 | * controller, since this requires the original irqstat value which | ||
52 | * we won't easily be able to recreate later. | ||
53 | */ | ||
54 | |||
55 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
56 | bic \irqnr, \irqstat, #0x1c00 | ||
57 | cmp \irqnr, #16 | ||
58 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
59 | cmpcs \irqnr, \irqnr | ||
60 | .endm | ||
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h index 3e91f22046f5..4bdfe0018696 100644 --- a/arch/arm/include/asm/hardware/gic.h +++ b/arch/arm/include/asm/hardware/gic.h | |||
@@ -36,30 +36,22 @@ | |||
36 | #include <linux/irqdomain.h> | 36 | #include <linux/irqdomain.h> |
37 | struct device_node; | 37 | struct device_node; |
38 | 38 | ||
39 | extern void __iomem *gic_cpu_base_addr; | ||
40 | extern struct irq_chip gic_arch_extn; | 39 | extern struct irq_chip gic_arch_extn; |
41 | 40 | ||
42 | void gic_init(unsigned int, int, void __iomem *, void __iomem *); | 41 | void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *, |
42 | u32 offset); | ||
43 | int gic_of_init(struct device_node *node, struct device_node *parent); | 43 | int gic_of_init(struct device_node *node, struct device_node *parent); |
44 | void gic_secondary_init(unsigned int); | 44 | void gic_secondary_init(unsigned int); |
45 | void gic_handle_irq(struct pt_regs *regs); | ||
45 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); | 46 | void gic_cascade_irq(unsigned int gic_nr, unsigned int irq); |
46 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); | 47 | void gic_raise_softirq(const struct cpumask *mask, unsigned int irq); |
47 | 48 | ||
48 | struct gic_chip_data { | 49 | static inline void gic_init(unsigned int nr, int start, |
49 | void __iomem *dist_base; | 50 | void __iomem *dist , void __iomem *cpu) |
50 | void __iomem *cpu_base; | 51 | { |
51 | #ifdef CONFIG_CPU_PM | 52 | gic_init_bases(nr, start, dist, cpu, 0); |
52 | u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)]; | 53 | } |
53 | u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)]; | 54 | |
54 | u32 saved_spi_target[DIV_ROUND_UP(1020, 4)]; | ||
55 | u32 __percpu *saved_ppi_enable; | ||
56 | u32 __percpu *saved_ppi_conf; | ||
57 | #endif | ||
58 | #ifdef CONFIG_IRQ_DOMAIN | ||
59 | struct irq_domain domain; | ||
60 | #endif | ||
61 | unsigned int gic_irqs; | ||
62 | }; | ||
63 | #endif | 55 | #endif |
64 | 56 | ||
65 | #endif | 57 | #endif |
diff --git a/arch/arm/include/asm/hardware/vic.h b/arch/arm/include/asm/hardware/vic.h index 5d72550a8097..f42ebd619590 100644 --- a/arch/arm/include/asm/hardware/vic.h +++ b/arch/arm/include/asm/hardware/vic.h | |||
@@ -41,7 +41,15 @@ | |||
41 | #define VIC_PL192_VECT_ADDR 0xF00 | 41 | #define VIC_PL192_VECT_ADDR 0xF00 |
42 | 42 | ||
43 | #ifndef __ASSEMBLY__ | 43 | #ifndef __ASSEMBLY__ |
44 | #include <linux/compiler.h> | ||
45 | #include <linux/types.h> | ||
46 | |||
47 | struct device_node; | ||
48 | struct pt_regs; | ||
49 | |||
44 | void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); | 50 | void vic_init(void __iomem *base, unsigned int irq_start, u32 vic_sources, u32 resume_sources); |
45 | #endif | 51 | int vic_of_init(struct device_node *node, struct device_node *parent); |
52 | void vic_handle_irq(struct pt_regs *regs); | ||
46 | 53 | ||
54 | #endif /* __ASSEMBLY__ */ | ||
47 | #endif | 55 | #endif |
diff --git a/arch/arm/include/asm/idmap.h b/arch/arm/include/asm/idmap.h new file mode 100644 index 000000000000..bf863edb517d --- /dev/null +++ b/arch/arm/include/asm/idmap.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #ifndef __ASM_IDMAP_H | ||
2 | #define __ASM_IDMAP_H | ||
3 | |||
4 | #include <linux/compiler.h> | ||
5 | #include <asm/pgtable.h> | ||
6 | |||
7 | /* Tag a function as requiring to be executed via an identity mapping. */ | ||
8 | #define __idmap __section(.idmap.text) noinline notrace | ||
9 | |||
10 | extern pgd_t *idmap_pgd; | ||
11 | |||
12 | void setup_mm_for_reboot(void); | ||
13 | |||
14 | #endif /* __ASM_IDMAP_H */ | ||
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 2b0efc3104ac..bcb0c883e21e 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
@@ -31,10 +31,10 @@ struct machine_desc { | |||
31 | unsigned int video_start; /* start of video RAM */ | 31 | unsigned int video_start; /* start of video RAM */ |
32 | unsigned int video_end; /* end of video RAM */ | 32 | unsigned int video_end; /* end of video RAM */ |
33 | 33 | ||
34 | unsigned int reserve_lp0 :1; /* never has lp0 */ | 34 | unsigned char reserve_lp0 :1; /* never has lp0 */ |
35 | unsigned int reserve_lp1 :1; /* never has lp1 */ | 35 | unsigned char reserve_lp1 :1; /* never has lp1 */ |
36 | unsigned int reserve_lp2 :1; /* never has lp2 */ | 36 | unsigned char reserve_lp2 :1; /* never has lp2 */ |
37 | unsigned int soft_reboot :1; /* soft reboot */ | 37 | char restart_mode; /* default restart mode */ |
38 | void (*fixup)(struct tag *, char **, | 38 | void (*fixup)(struct tag *, char **, |
39 | struct meminfo *); | 39 | struct meminfo *); |
40 | void (*reserve)(void);/* reserve mem blocks */ | 40 | void (*reserve)(void);/* reserve mem blocks */ |
@@ -46,6 +46,7 @@ struct machine_desc { | |||
46 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 46 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
47 | void (*handle_irq)(struct pt_regs *); | 47 | void (*handle_irq)(struct pt_regs *); |
48 | #endif | 48 | #endif |
49 | void (*restart)(char, const char *); | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | /* | 52 | /* |
diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index ca94653f1ecb..97b440c25c58 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h | |||
@@ -151,7 +151,11 @@ extern void __cpu_copy_user_highpage(struct page *to, struct page *from, | |||
151 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 151 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
152 | extern void copy_page(void *to, const void *from); | 152 | extern void copy_page(void *to, const void *from); |
153 | 153 | ||
154 | #ifdef CONFIG_ARM_LPAE | ||
155 | #include <asm/pgtable-3level-types.h> | ||
156 | #else | ||
154 | #include <asm/pgtable-2level-types.h> | 157 | #include <asm/pgtable-2level-types.h> |
158 | #endif | ||
155 | 159 | ||
156 | #endif /* CONFIG_MMU */ | 160 | #endif /* CONFIG_MMU */ |
157 | 161 | ||
diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h index 0f8e3827a89b..99cfe3607989 100644 --- a/arch/arm/include/asm/perf_event.h +++ b/arch/arm/include/asm/perf_event.h | |||
@@ -32,7 +32,4 @@ enum arm_perf_pmu_ids { | |||
32 | extern enum arm_perf_pmu_ids | 32 | extern enum arm_perf_pmu_ids |
33 | armpmu_get_pmu_id(void); | 33 | armpmu_get_pmu_id(void); |
34 | 34 | ||
35 | extern int | ||
36 | armpmu_get_max_events(void); | ||
37 | |||
38 | #endif /* __ARM_PERF_EVENT_H__ */ | 35 | #endif /* __ARM_PERF_EVENT_H__ */ |
diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 3e08fd3fbb6b..943504f53f57 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h | |||
@@ -25,12 +25,34 @@ | |||
25 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) | 25 | #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER)) |
26 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) | 26 | #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL)) |
27 | 27 | ||
28 | #ifdef CONFIG_ARM_LPAE | ||
29 | |||
30 | static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) | ||
31 | { | ||
32 | return (pmd_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT); | ||
33 | } | ||
34 | |||
35 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) | ||
36 | { | ||
37 | BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); | ||
38 | free_page((unsigned long)pmd); | ||
39 | } | ||
40 | |||
41 | static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | ||
42 | { | ||
43 | set_pud(pud, __pud(__pa(pmd) | PMD_TYPE_TABLE)); | ||
44 | } | ||
45 | |||
46 | #else /* !CONFIG_ARM_LPAE */ | ||
47 | |||
28 | /* | 48 | /* |
29 | * Since we have only two-level page tables, these are trivial | 49 | * Since we have only two-level page tables, these are trivial |
30 | */ | 50 | */ |
31 | #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); }) | 51 | #define pmd_alloc_one(mm,addr) ({ BUG(); ((pmd_t *)2); }) |
32 | #define pmd_free(mm, pmd) do { } while (0) | 52 | #define pmd_free(mm, pmd) do { } while (0) |
33 | #define pgd_populate(mm,pmd,pte) BUG() | 53 | #define pud_populate(mm,pmd,pte) BUG() |
54 | |||
55 | #endif /* CONFIG_ARM_LPAE */ | ||
34 | 56 | ||
35 | extern pgd_t *pgd_alloc(struct mm_struct *mm); | 57 | extern pgd_t *pgd_alloc(struct mm_struct *mm); |
36 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | 58 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); |
@@ -109,7 +131,9 @@ static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t pte, | |||
109 | { | 131 | { |
110 | pmdval_t pmdval = (pte + PTE_HWTABLE_OFF) | prot; | 132 | pmdval_t pmdval = (pte + PTE_HWTABLE_OFF) | prot; |
111 | pmdp[0] = __pmd(pmdval); | 133 | pmdp[0] = __pmd(pmdval); |
134 | #ifndef CONFIG_ARM_LPAE | ||
112 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); | 135 | pmdp[1] = __pmd(pmdval + 256 * sizeof(pte_t)); |
136 | #endif | ||
113 | flush_pmd_entry(pmdp); | 137 | flush_pmd_entry(pmdp); |
114 | } | 138 | } |
115 | 139 | ||
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h index 470457e1cfc5..2317a71c8f8e 100644 --- a/arch/arm/include/asm/pgtable-2level.h +++ b/arch/arm/include/asm/pgtable-2level.h | |||
@@ -140,4 +140,45 @@ | |||
140 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ | 140 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ |
141 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) | 141 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) |
142 | 142 | ||
143 | #ifndef __ASSEMBLY__ | ||
144 | |||
145 | /* | ||
146 | * The "pud_xxx()" functions here are trivial when the pmd is folded into | ||
147 | * the pud: the pud entry is never bad, always exists, and can't be set or | ||
148 | * cleared. | ||
149 | */ | ||
150 | #define pud_none(pud) (0) | ||
151 | #define pud_bad(pud) (0) | ||
152 | #define pud_present(pud) (1) | ||
153 | #define pud_clear(pudp) do { } while (0) | ||
154 | #define set_pud(pud,pudp) do { } while (0) | ||
155 | |||
156 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | ||
157 | { | ||
158 | return (pmd_t *)pud; | ||
159 | } | ||
160 | |||
161 | #define pmd_bad(pmd) (pmd_val(pmd) & 2) | ||
162 | |||
163 | #define copy_pmd(pmdpd,pmdps) \ | ||
164 | do { \ | ||
165 | pmdpd[0] = pmdps[0]; \ | ||
166 | pmdpd[1] = pmdps[1]; \ | ||
167 | flush_pmd_entry(pmdpd); \ | ||
168 | } while (0) | ||
169 | |||
170 | #define pmd_clear(pmdp) \ | ||
171 | do { \ | ||
172 | pmdp[0] = __pmd(0); \ | ||
173 | pmdp[1] = __pmd(0); \ | ||
174 | clean_pmd_entry(pmdp); \ | ||
175 | } while (0) | ||
176 | |||
177 | /* we don't need complex calculations here as the pmd is folded into the pgd */ | ||
178 | #define pmd_addr_end(addr,end) (end) | ||
179 | |||
180 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | ||
181 | |||
182 | #endif /* __ASSEMBLY__ */ | ||
183 | |||
143 | #endif /* _ASM_PGTABLE_2LEVEL_H */ | 184 | #endif /* _ASM_PGTABLE_2LEVEL_H */ |
diff --git a/arch/arm/include/asm/pgtable-3level-hwdef.h b/arch/arm/include/asm/pgtable-3level-hwdef.h new file mode 100644 index 000000000000..d7952824c5c4 --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level-hwdef.h | |||
@@ -0,0 +1,77 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level-hwdef.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
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 | #ifndef _ASM_PGTABLE_3LEVEL_HWDEF_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_HWDEF_H | ||
22 | |||
23 | /* | ||
24 | * Hardware page table definitions. | ||
25 | * | ||
26 | * + Level 1/2 descriptor | ||
27 | * - common | ||
28 | */ | ||
29 | #define PMD_TYPE_MASK (_AT(pmdval_t, 3) << 0) | ||
30 | #define PMD_TYPE_FAULT (_AT(pmdval_t, 0) << 0) | ||
31 | #define PMD_TYPE_TABLE (_AT(pmdval_t, 3) << 0) | ||
32 | #define PMD_TYPE_SECT (_AT(pmdval_t, 1) << 0) | ||
33 | #define PMD_BIT4 (_AT(pmdval_t, 0)) | ||
34 | #define PMD_DOMAIN(x) (_AT(pmdval_t, 0)) | ||
35 | |||
36 | /* | ||
37 | * - section | ||
38 | */ | ||
39 | #define PMD_SECT_BUFFERABLE (_AT(pmdval_t, 1) << 2) | ||
40 | #define PMD_SECT_CACHEABLE (_AT(pmdval_t, 1) << 3) | ||
41 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) | ||
42 | #define PMD_SECT_AF (_AT(pmdval_t, 1) << 10) | ||
43 | #define PMD_SECT_nG (_AT(pmdval_t, 1) << 11) | ||
44 | #define PMD_SECT_XN (_AT(pmdval_t, 1) << 54) | ||
45 | #define PMD_SECT_AP_WRITE (_AT(pmdval_t, 0)) | ||
46 | #define PMD_SECT_AP_READ (_AT(pmdval_t, 0)) | ||
47 | #define PMD_SECT_TEX(x) (_AT(pmdval_t, 0)) | ||
48 | |||
49 | /* | ||
50 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | ||
51 | */ | ||
52 | #define PMD_SECT_UNCACHED (_AT(pmdval_t, 0) << 2) /* strongly ordered */ | ||
53 | #define PMD_SECT_BUFFERED (_AT(pmdval_t, 1) << 2) /* normal non-cacheable */ | ||
54 | #define PMD_SECT_WT (_AT(pmdval_t, 2) << 2) /* normal inner write-through */ | ||
55 | #define PMD_SECT_WB (_AT(pmdval_t, 3) << 2) /* normal inner write-back */ | ||
56 | #define PMD_SECT_WBWA (_AT(pmdval_t, 7) << 2) /* normal inner write-alloc */ | ||
57 | |||
58 | /* | ||
59 | * + Level 3 descriptor (PTE) | ||
60 | */ | ||
61 | #define PTE_TYPE_MASK (_AT(pteval_t, 3) << 0) | ||
62 | #define PTE_TYPE_FAULT (_AT(pteval_t, 0) << 0) | ||
63 | #define PTE_TYPE_PAGE (_AT(pteval_t, 3) << 0) | ||
64 | #define PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */ | ||
65 | #define PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */ | ||
66 | #define PTE_EXT_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ | ||
67 | #define PTE_EXT_AF (_AT(pteval_t, 1) << 10) /* Access Flag */ | ||
68 | #define PTE_EXT_NG (_AT(pteval_t, 1) << 11) /* nG */ | ||
69 | #define PTE_EXT_XN (_AT(pteval_t, 1) << 54) /* XN */ | ||
70 | |||
71 | /* | ||
72 | * 40-bit physical address supported. | ||
73 | */ | ||
74 | #define PHYS_MASK_SHIFT (40) | ||
75 | #define PHYS_MASK ((1ULL << PHYS_MASK_SHIFT) - 1) | ||
76 | |||
77 | #endif | ||
diff --git a/arch/arm/include/asm/pgtable-3level-types.h b/arch/arm/include/asm/pgtable-3level-types.h new file mode 100644 index 000000000000..921aa30259c4 --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level-types.h | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level-types.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
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 | #ifndef _ASM_PGTABLE_3LEVEL_TYPES_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_TYPES_H | ||
22 | |||
23 | #include <asm/types.h> | ||
24 | |||
25 | typedef u64 pteval_t; | ||
26 | typedef u64 pmdval_t; | ||
27 | typedef u64 pgdval_t; | ||
28 | |||
29 | #undef STRICT_MM_TYPECHECKS | ||
30 | |||
31 | #ifdef STRICT_MM_TYPECHECKS | ||
32 | |||
33 | /* | ||
34 | * These are used to make use of C type-checking.. | ||
35 | */ | ||
36 | typedef struct { pteval_t pte; } pte_t; | ||
37 | typedef struct { pmdval_t pmd; } pmd_t; | ||
38 | typedef struct { pgdval_t pgd; } pgd_t; | ||
39 | typedef struct { pteval_t pgprot; } pgprot_t; | ||
40 | |||
41 | #define pte_val(x) ((x).pte) | ||
42 | #define pmd_val(x) ((x).pmd) | ||
43 | #define pgd_val(x) ((x).pgd) | ||
44 | #define pgprot_val(x) ((x).pgprot) | ||
45 | |||
46 | #define __pte(x) ((pte_t) { (x) } ) | ||
47 | #define __pmd(x) ((pmd_t) { (x) } ) | ||
48 | #define __pgd(x) ((pgd_t) { (x) } ) | ||
49 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
50 | |||
51 | #else /* !STRICT_MM_TYPECHECKS */ | ||
52 | |||
53 | typedef pteval_t pte_t; | ||
54 | typedef pmdval_t pmd_t; | ||
55 | typedef pgdval_t pgd_t; | ||
56 | typedef pteval_t pgprot_t; | ||
57 | |||
58 | #define pte_val(x) (x) | ||
59 | #define pmd_val(x) (x) | ||
60 | #define pgd_val(x) (x) | ||
61 | #define pgprot_val(x) (x) | ||
62 | |||
63 | #define __pte(x) (x) | ||
64 | #define __pmd(x) (x) | ||
65 | #define __pgd(x) (x) | ||
66 | #define __pgprot(x) (x) | ||
67 | |||
68 | #endif /* STRICT_MM_TYPECHECKS */ | ||
69 | |||
70 | #endif /* _ASM_PGTABLE_3LEVEL_TYPES_H */ | ||
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h new file mode 100644 index 000000000000..759af70f9a0a --- /dev/null +++ b/arch/arm/include/asm/pgtable-3level.h | |||
@@ -0,0 +1,155 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/pgtable-3level.h | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
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 | #ifndef _ASM_PGTABLE_3LEVEL_H | ||
21 | #define _ASM_PGTABLE_3LEVEL_H | ||
22 | |||
23 | /* | ||
24 | * With LPAE, there are 3 levels of page tables. Each level has 512 entries of | ||
25 | * 8 bytes each, occupying a 4K page. The first level table covers a range of | ||
26 | * 512GB, each entry representing 1GB. Since we are limited to 4GB input | ||
27 | * address range, only 4 entries in the PGD are used. | ||
28 | * | ||
29 | * There are enough spare bits in a page table entry for the kernel specific | ||
30 | * state. | ||
31 | */ | ||
32 | #define PTRS_PER_PTE 512 | ||
33 | #define PTRS_PER_PMD 512 | ||
34 | #define PTRS_PER_PGD 4 | ||
35 | |||
36 | #define PTE_HWTABLE_PTRS (PTRS_PER_PTE) | ||
37 | #define PTE_HWTABLE_OFF (0) | ||
38 | #define PTE_HWTABLE_SIZE (PTRS_PER_PTE * sizeof(u64)) | ||
39 | |||
40 | /* | ||
41 | * PGDIR_SHIFT determines the size a top-level page table entry can map. | ||
42 | */ | ||
43 | #define PGDIR_SHIFT 30 | ||
44 | |||
45 | /* | ||
46 | * PMD_SHIFT determines the size a middle-level page table entry can map. | ||
47 | */ | ||
48 | #define PMD_SHIFT 21 | ||
49 | |||
50 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
51 | #define PMD_MASK (~(PMD_SIZE-1)) | ||
52 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
53 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | ||
54 | |||
55 | /* | ||
56 | * section address mask and size definitions. | ||
57 | */ | ||
58 | #define SECTION_SHIFT 21 | ||
59 | #define SECTION_SIZE (1UL << SECTION_SHIFT) | ||
60 | #define SECTION_MASK (~(SECTION_SIZE-1)) | ||
61 | |||
62 | #define USER_PTRS_PER_PGD (PAGE_OFFSET / PGDIR_SIZE) | ||
63 | |||
64 | /* | ||
65 | * "Linux" PTE definitions for LPAE. | ||
66 | * | ||
67 | * These bits overlap with the hardware bits but the naming is preserved for | ||
68 | * consistency with the classic page table format. | ||
69 | */ | ||
70 | #define L_PTE_PRESENT (_AT(pteval_t, 3) << 0) /* Valid */ | ||
71 | #define L_PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !PRESENT */ | ||
72 | #define L_PTE_BUFFERABLE (_AT(pteval_t, 1) << 2) /* AttrIndx[0] */ | ||
73 | #define L_PTE_CACHEABLE (_AT(pteval_t, 1) << 3) /* AttrIndx[1] */ | ||
74 | #define L_PTE_USER (_AT(pteval_t, 1) << 6) /* AP[1] */ | ||
75 | #define L_PTE_RDONLY (_AT(pteval_t, 1) << 7) /* AP[2] */ | ||
76 | #define L_PTE_SHARED (_AT(pteval_t, 3) << 8) /* SH[1:0], inner shareable */ | ||
77 | #define L_PTE_YOUNG (_AT(pteval_t, 1) << 10) /* AF */ | ||
78 | #define L_PTE_XN (_AT(pteval_t, 1) << 54) /* XN */ | ||
79 | #define L_PTE_DIRTY (_AT(pteval_t, 1) << 55) /* unused */ | ||
80 | #define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56) /* unused */ | ||
81 | |||
82 | /* | ||
83 | * To be used in assembly code with the upper page attributes. | ||
84 | */ | ||
85 | #define L_PTE_XN_HIGH (1 << (54 - 32)) | ||
86 | #define L_PTE_DIRTY_HIGH (1 << (55 - 32)) | ||
87 | |||
88 | /* | ||
89 | * AttrIndx[2:0] encoding (mapping attributes defined in the MAIR* registers). | ||
90 | */ | ||
91 | #define L_PTE_MT_UNCACHED (_AT(pteval_t, 0) << 2) /* strongly ordered */ | ||
92 | #define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 1) << 2) /* normal non-cacheable */ | ||
93 | #define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 2) << 2) /* normal inner write-through */ | ||
94 | #define L_PTE_MT_WRITEBACK (_AT(pteval_t, 3) << 2) /* normal inner write-back */ | ||
95 | #define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 7) << 2) /* normal inner write-alloc */ | ||
96 | #define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 4) << 2) /* device */ | ||
97 | #define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 4) << 2) /* device */ | ||
98 | #define L_PTE_MT_DEV_WC (_AT(pteval_t, 1) << 2) /* normal non-cacheable */ | ||
99 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 3) << 2) /* normal inner write-back */ | ||
100 | #define L_PTE_MT_MASK (_AT(pteval_t, 7) << 2) | ||
101 | |||
102 | /* | ||
103 | * Software PGD flags. | ||
104 | */ | ||
105 | #define L_PGD_SWAPPER (_AT(pgdval_t, 1) << 55) /* swapper_pg_dir entry */ | ||
106 | |||
107 | #ifndef __ASSEMBLY__ | ||
108 | |||
109 | #define pud_none(pud) (!pud_val(pud)) | ||
110 | #define pud_bad(pud) (!(pud_val(pud) & 2)) | ||
111 | #define pud_present(pud) (pud_val(pud)) | ||
112 | |||
113 | #define pud_clear(pudp) \ | ||
114 | do { \ | ||
115 | *pudp = __pud(0); \ | ||
116 | clean_pmd_entry(pudp); \ | ||
117 | } while (0) | ||
118 | |||
119 | #define set_pud(pudp, pud) \ | ||
120 | do { \ | ||
121 | *pudp = pud; \ | ||
122 | flush_pmd_entry(pudp); \ | ||
123 | } while (0) | ||
124 | |||
125 | static inline pmd_t *pud_page_vaddr(pud_t pud) | ||
126 | { | ||
127 | return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK); | ||
128 | } | ||
129 | |||
130 | /* Find an entry in the second-level page table.. */ | ||
131 | #define pmd_index(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) | ||
132 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) | ||
133 | { | ||
134 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); | ||
135 | } | ||
136 | |||
137 | #define pmd_bad(pmd) (!(pmd_val(pmd) & 2)) | ||
138 | |||
139 | #define copy_pmd(pmdpd,pmdps) \ | ||
140 | do { \ | ||
141 | *pmdpd = *pmdps; \ | ||
142 | flush_pmd_entry(pmdpd); \ | ||
143 | } while (0) | ||
144 | |||
145 | #define pmd_clear(pmdp) \ | ||
146 | do { \ | ||
147 | *pmdp = __pmd(0); \ | ||
148 | clean_pmd_entry(pmdp); \ | ||
149 | } while (0) | ||
150 | |||
151 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,__pte(pte_val(pte)|(ext))) | ||
152 | |||
153 | #endif /* __ASSEMBLY__ */ | ||
154 | |||
155 | #endif /* _ASM_PGTABLE_3LEVEL_H */ | ||
diff --git a/arch/arm/include/asm/pgtable-hwdef.h b/arch/arm/include/asm/pgtable-hwdef.h index 183111164ce9..8426229ba292 100644 --- a/arch/arm/include/asm/pgtable-hwdef.h +++ b/arch/arm/include/asm/pgtable-hwdef.h | |||
@@ -10,6 +10,10 @@ | |||
10 | #ifndef _ASMARM_PGTABLE_HWDEF_H | 10 | #ifndef _ASMARM_PGTABLE_HWDEF_H |
11 | #define _ASMARM_PGTABLE_HWDEF_H | 11 | #define _ASMARM_PGTABLE_HWDEF_H |
12 | 12 | ||
13 | #ifdef CONFIG_ARM_LPAE | ||
14 | #include <asm/pgtable-3level-hwdef.h> | ||
15 | #else | ||
13 | #include <asm/pgtable-2level-hwdef.h> | 16 | #include <asm/pgtable-2level-hwdef.h> |
17 | #endif | ||
14 | 18 | ||
15 | #endif | 19 | #endif |
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 9451dce3a553..3f2f0eb76211 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -11,20 +11,24 @@ | |||
11 | #define _ASMARM_PGTABLE_H | 11 | #define _ASMARM_PGTABLE_H |
12 | 12 | ||
13 | #include <linux/const.h> | 13 | #include <linux/const.h> |
14 | #include <asm-generic/4level-fixup.h> | ||
15 | #include <asm/proc-fns.h> | 14 | #include <asm/proc-fns.h> |
16 | 15 | ||
17 | #ifndef CONFIG_MMU | 16 | #ifndef CONFIG_MMU |
18 | 17 | ||
18 | #include <asm-generic/4level-fixup.h> | ||
19 | #include "pgtable-nommu.h" | 19 | #include "pgtable-nommu.h" |
20 | 20 | ||
21 | #else | 21 | #else |
22 | 22 | ||
23 | #include <asm-generic/pgtable-nopud.h> | ||
23 | #include <asm/memory.h> | 24 | #include <asm/memory.h> |
24 | #include <mach/vmalloc.h> | ||
25 | #include <asm/pgtable-hwdef.h> | 25 | #include <asm/pgtable-hwdef.h> |
26 | 26 | ||
27 | #ifdef CONFIG_ARM_LPAE | ||
28 | #include <asm/pgtable-3level.h> | ||
29 | #else | ||
27 | #include <asm/pgtable-2level.h> | 30 | #include <asm/pgtable-2level.h> |
31 | #endif | ||
28 | 32 | ||
29 | /* | 33 | /* |
30 | * Just any arbitrary offset to the start of the vmalloc VM area: the | 34 | * Just any arbitrary offset to the start of the vmalloc VM area: the |
@@ -33,14 +37,16 @@ | |||
33 | * any out-of-bounds memory accesses will hopefully be caught. | 37 | * any out-of-bounds memory accesses will hopefully be caught. |
34 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | 38 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced |
35 | * area for the same reason. ;) | 39 | * area for the same reason. ;) |
36 | * | ||
37 | * Note that platforms may override VMALLOC_START, but they must provide | ||
38 | * VMALLOC_END. VMALLOC_END defines the (exclusive) limit of this space, | ||
39 | * which may not overlap IO space. | ||
40 | */ | 40 | */ |
41 | #ifndef VMALLOC_START | ||
42 | #define VMALLOC_OFFSET (8*1024*1024) | 41 | #define VMALLOC_OFFSET (8*1024*1024) |
43 | #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) | 42 | #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) |
43 | #define VMALLOC_END 0xff000000UL | ||
44 | |||
45 | /* This is a temporary hack until shmobile's DMA area size is sorted out */ | ||
46 | #ifdef CONFIG_ARCH_SHMOBILE | ||
47 | #warning "SH-Mobile's consistent DMA size conflicts with VMALLOC_END by 144MB" | ||
48 | #undef VMALLOC_END | ||
49 | #define VMALLOC_END 0xF6000000UL | ||
44 | #endif | 50 | #endif |
45 | 51 | ||
46 | #define LIBRARY_TEXT_START 0x0c000000 | 52 | #define LIBRARY_TEXT_START 0x0c000000 |
@@ -163,39 +169,8 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
163 | /* to find an entry in a kernel page-table-directory */ | 169 | /* to find an entry in a kernel page-table-directory */ |
164 | #define pgd_offset_k(addr) pgd_offset(&init_mm, addr) | 170 | #define pgd_offset_k(addr) pgd_offset(&init_mm, addr) |
165 | 171 | ||
166 | /* | ||
167 | * The "pgd_xxx()" functions here are trivial for a folded two-level | ||
168 | * setup: the pgd is never bad, and a pmd always exists (as it's folded | ||
169 | * into the pgd entry) | ||
170 | */ | ||
171 | #define pgd_none(pgd) (0) | ||
172 | #define pgd_bad(pgd) (0) | ||
173 | #define pgd_present(pgd) (1) | ||
174 | #define pgd_clear(pgdp) do { } while (0) | ||
175 | #define set_pgd(pgd,pgdp) do { } while (0) | ||
176 | #define set_pud(pud,pudp) do { } while (0) | ||
177 | |||
178 | |||
179 | /* Find an entry in the second-level page table.. */ | ||
180 | #define pmd_offset(dir, addr) ((pmd_t *)(dir)) | ||
181 | |||
182 | #define pmd_none(pmd) (!pmd_val(pmd)) | 172 | #define pmd_none(pmd) (!pmd_val(pmd)) |
183 | #define pmd_present(pmd) (pmd_val(pmd)) | 173 | #define pmd_present(pmd) (pmd_val(pmd)) |
184 | #define pmd_bad(pmd) (pmd_val(pmd) & 2) | ||
185 | |||
186 | #define copy_pmd(pmdpd,pmdps) \ | ||
187 | do { \ | ||
188 | pmdpd[0] = pmdps[0]; \ | ||
189 | pmdpd[1] = pmdps[1]; \ | ||
190 | flush_pmd_entry(pmdpd); \ | ||
191 | } while (0) | ||
192 | |||
193 | #define pmd_clear(pmdp) \ | ||
194 | do { \ | ||
195 | pmdp[0] = __pmd(0); \ | ||
196 | pmdp[1] = __pmd(0); \ | ||
197 | clean_pmd_entry(pmdp); \ | ||
198 | } while (0) | ||
199 | 174 | ||
200 | static inline pte_t *pmd_page_vaddr(pmd_t pmd) | 175 | static inline pte_t *pmd_page_vaddr(pmd_t pmd) |
201 | { | 176 | { |
@@ -204,10 +179,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |||
204 | 179 | ||
205 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) | 180 | #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) |
206 | 181 | ||
207 | /* we don't need complex calculations here as the pmd is folded into the pgd */ | ||
208 | #define pmd_addr_end(addr,end) (end) | ||
209 | |||
210 | |||
211 | #ifndef CONFIG_HIGHPTE | 182 | #ifndef CONFIG_HIGHPTE |
212 | #define __pte_map(pmd) pmd_page_vaddr(*(pmd)) | 183 | #define __pte_map(pmd) pmd_page_vaddr(*(pmd)) |
213 | #define __pte_unmap(pte) do { } while (0) | 184 | #define __pte_unmap(pte) do { } while (0) |
@@ -229,7 +200,6 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd) | |||
229 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) | 200 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) |
230 | #define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot) | 201 | #define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot) |
231 | 202 | ||
232 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | ||
233 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) | 203 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) |
234 | 204 | ||
235 | #if __LINUX_ARM_ARCH__ < 6 | 205 | #if __LINUX_ARM_ARCH__ < 6 |
@@ -346,9 +316,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
346 | 316 | ||
347 | #define pgtable_cache_init() do { } while (0) | 317 | #define pgtable_cache_init() do { } while (0) |
348 | 318 | ||
349 | void identity_mapping_add(pgd_t *, unsigned long, unsigned long); | ||
350 | void identity_mapping_del(pgd_t *, unsigned long, unsigned long); | ||
351 | |||
352 | #endif /* !__ASSEMBLY__ */ | 319 | #endif /* !__ASSEMBLY__ */ |
353 | 320 | ||
354 | #endif /* CONFIG_MMU */ | 321 | #endif /* CONFIG_MMU */ |
diff --git a/arch/arm/include/asm/pmu.h b/arch/arm/include/asm/pmu.h index 0bda22c094a6..b5a5be2536c1 100644 --- a/arch/arm/include/asm/pmu.h +++ b/arch/arm/include/asm/pmu.h | |||
@@ -27,13 +27,22 @@ enum arm_pmu_type { | |||
27 | /* | 27 | /* |
28 | * struct arm_pmu_platdata - ARM PMU platform data | 28 | * struct arm_pmu_platdata - ARM PMU platform data |
29 | * | 29 | * |
30 | * @handle_irq: an optional handler which will be called from the interrupt and | 30 | * @handle_irq: an optional handler which will be called from the |
31 | * passed the address of the low level handler, and can be used to implement | 31 | * interrupt and passed the address of the low level handler, |
32 | * any platform specific handling before or after calling it. | 32 | * and can be used to implement any platform specific handling |
33 | * before or after calling it. | ||
34 | * @enable_irq: an optional handler which will be called after | ||
35 | * request_irq and be used to handle some platform specific | ||
36 | * irq enablement | ||
37 | * @disable_irq: an optional handler which will be called before | ||
38 | * free_irq and be used to handle some platform specific | ||
39 | * irq disablement | ||
33 | */ | 40 | */ |
34 | struct arm_pmu_platdata { | 41 | struct arm_pmu_platdata { |
35 | irqreturn_t (*handle_irq)(int irq, void *dev, | 42 | irqreturn_t (*handle_irq)(int irq, void *dev, |
36 | irq_handler_t pmu_handler); | 43 | irq_handler_t pmu_handler); |
44 | void (*enable_irq)(int irq); | ||
45 | void (*disable_irq)(int irq); | ||
37 | }; | 46 | }; |
38 | 47 | ||
39 | #ifdef CONFIG_CPU_HAS_PMU | 48 | #ifdef CONFIG_CPU_HAS_PMU |
diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h index 9e92cb205e65..f3628fb3d2b3 100644 --- a/arch/arm/include/asm/proc-fns.h +++ b/arch/arm/include/asm/proc-fns.h | |||
@@ -65,7 +65,11 @@ extern struct processor { | |||
65 | * Set a possibly extended PTE. Non-extended PTEs should | 65 | * Set a possibly extended PTE. Non-extended PTEs should |
66 | * ignore 'ext'. | 66 | * ignore 'ext'. |
67 | */ | 67 | */ |
68 | #ifdef CONFIG_ARM_LPAE | ||
69 | void (*set_pte_ext)(pte_t *ptep, pte_t pte); | ||
70 | #else | ||
68 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); | 71 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); |
72 | #endif | ||
69 | 73 | ||
70 | /* Suspend/resume */ | 74 | /* Suspend/resume */ |
71 | unsigned int suspend_size; | 75 | unsigned int suspend_size; |
@@ -79,7 +83,11 @@ extern void cpu_proc_fin(void); | |||
79 | extern int cpu_do_idle(void); | 83 | extern int cpu_do_idle(void); |
80 | extern void cpu_dcache_clean_area(void *, int); | 84 | extern void cpu_dcache_clean_area(void *, int); |
81 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | 85 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); |
86 | #ifdef CONFIG_ARM_LPAE | ||
87 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte); | ||
88 | #else | ||
82 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | 89 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); |
90 | #endif | ||
83 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | 91 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); |
84 | 92 | ||
85 | /* These three are private to arch/arm/kernel/suspend.c */ | 93 | /* These three are private to arch/arm/kernel/suspend.c */ |
@@ -107,6 +115,18 @@ extern void cpu_resume(void); | |||
107 | 115 | ||
108 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) | 116 | #define cpu_switch_mm(pgd,mm) cpu_do_switch_mm(virt_to_phys(pgd),mm) |
109 | 117 | ||
118 | #ifdef CONFIG_ARM_LPAE | ||
119 | #define cpu_get_pgd() \ | ||
120 | ({ \ | ||
121 | unsigned long pg, pg2; \ | ||
122 | __asm__("mrrc p15, 0, %0, %1, c2" \ | ||
123 | : "=r" (pg), "=r" (pg2) \ | ||
124 | : \ | ||
125 | : "cc"); \ | ||
126 | pg &= ~(PTRS_PER_PGD*sizeof(pgd_t)-1); \ | ||
127 | (pgd_t *)phys_to_virt(pg); \ | ||
128 | }) | ||
129 | #else | ||
110 | #define cpu_get_pgd() \ | 130 | #define cpu_get_pgd() \ |
111 | ({ \ | 131 | ({ \ |
112 | unsigned long pg; \ | 132 | unsigned long pg; \ |
@@ -115,6 +135,7 @@ extern void cpu_resume(void); | |||
115 | pg &= ~0x3fff; \ | 135 | pg &= ~0x3fff; \ |
116 | (pgd_t *)phys_to_virt(pg); \ | 136 | (pgd_t *)phys_to_virt(pg); \ |
117 | }) | 137 | }) |
138 | #endif | ||
118 | 139 | ||
119 | #endif | 140 | #endif |
120 | 141 | ||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index 984014b92647..53785828744c 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
@@ -80,6 +80,14 @@ struct siginfo; | |||
80 | void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, | 80 | void arm_notify_die(const char *str, struct pt_regs *regs, struct siginfo *info, |
81 | unsigned long err, unsigned long trap); | 81 | unsigned long err, unsigned long trap); |
82 | 82 | ||
83 | #ifdef CONFIG_ARM_LPAE | ||
84 | #define FAULT_CODE_ALIGNMENT 33 | ||
85 | #define FAULT_CODE_DEBUG 34 | ||
86 | #else | ||
87 | #define FAULT_CODE_ALIGNMENT 1 | ||
88 | #define FAULT_CODE_DEBUG 2 | ||
89 | #endif | ||
90 | |||
83 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, | 91 | void hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, |
84 | struct pt_regs *), | 92 | struct pt_regs *), |
85 | int sig, int code, const char *name); | 93 | int sig, int code, const char *name); |
@@ -101,6 +109,7 @@ extern int __pure cpu_architecture(void); | |||
101 | extern void cpu_init(void); | 109 | extern void cpu_init(void); |
102 | 110 | ||
103 | void arm_machine_restart(char mode, const char *cmd); | 111 | void arm_machine_restart(char mode, const char *cmd); |
112 | void soft_restart(unsigned long); | ||
104 | extern void (*arm_pm_restart)(char str, const char *cmd); | 113 | extern void (*arm_pm_restart)(char str, const char *cmd); |
105 | 114 | ||
106 | #define UDBG_UNDEFINED (1 << 0) | 115 | #define UDBG_UNDEFINED (1 << 0) |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 265f908c4a6e..5d3ed7e38561 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
@@ -202,8 +202,18 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
202 | tlb_remove_page(tlb, pte); | 202 | tlb_remove_page(tlb, pte); |
203 | } | 203 | } |
204 | 204 | ||
205 | static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | ||
206 | unsigned long addr) | ||
207 | { | ||
208 | #ifdef CONFIG_ARM_LPAE | ||
209 | tlb_add_flush(tlb, addr); | ||
210 | tlb_remove_page(tlb, virt_to_page(pmdp)); | ||
211 | #endif | ||
212 | } | ||
213 | |||
205 | #define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) | 214 | #define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) |
206 | #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) | 215 | #define pmd_free_tlb(tlb, pmdp, addr) __pmd_free_tlb(tlb, pmdp, addr) |
216 | #define pud_free_tlb(tlb, pudp, addr) pud_free((tlb)->mm, pudp) | ||
207 | 217 | ||
208 | #define tlb_migrate_finish(mm) do { } while (0) | 218 | #define tlb_migrate_finish(mm) do { } while (0) |
209 | 219 | ||
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index b145f16c91bc..3a456c6c7005 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -36,12 +36,11 @@ | |||
36 | #ifdef CONFIG_MULTI_IRQ_HANDLER | 36 | #ifdef CONFIG_MULTI_IRQ_HANDLER |
37 | ldr r1, =handle_arch_irq | 37 | ldr r1, =handle_arch_irq |
38 | mov r0, sp | 38 | mov r0, sp |
39 | ldr r1, [r1] | ||
40 | adr lr, BSYM(9997f) | 39 | adr lr, BSYM(9997f) |
41 | teq r1, #0 | 40 | ldr pc, [r1] |
42 | movne pc, r1 | 41 | #else |
43 | #endif | ||
44 | arch_irq_handler_default | 42 | arch_irq_handler_default |
43 | #endif | ||
45 | 9997: | 44 | 9997: |
46 | .endm | 45 | .endm |
47 | 46 | ||
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 08c82fd844a8..14e277d2ff91 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -39,8 +39,14 @@ | |||
39 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 | 39 | #error KERNEL_RAM_VADDR must start at 0xXXXX8000 |
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | #ifdef CONFIG_ARM_LPAE | ||
43 | /* LPAE requires an additional page for the PGD */ | ||
44 | #define PG_DIR_SIZE 0x5000 | ||
45 | #define PMD_ORDER 3 | ||
46 | #else | ||
42 | #define PG_DIR_SIZE 0x4000 | 47 | #define PG_DIR_SIZE 0x4000 |
43 | #define PMD_ORDER 2 | 48 | #define PMD_ORDER 2 |
49 | #endif | ||
44 | 50 | ||
45 | .globl swapper_pg_dir | 51 | .globl swapper_pg_dir |
46 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE | 52 | .equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE |
@@ -164,17 +170,36 @@ __create_page_tables: | |||
164 | teq r0, r6 | 170 | teq r0, r6 |
165 | bne 1b | 171 | bne 1b |
166 | 172 | ||
173 | #ifdef CONFIG_ARM_LPAE | ||
174 | /* | ||
175 | * Build the PGD table (first level) to point to the PMD table. A PGD | ||
176 | * entry is 64-bit wide. | ||
177 | */ | ||
178 | mov r0, r4 | ||
179 | add r3, r4, #0x1000 @ first PMD table address | ||
180 | orr r3, r3, #3 @ PGD block type | ||
181 | mov r6, #4 @ PTRS_PER_PGD | ||
182 | mov r7, #1 << (55 - 32) @ L_PGD_SWAPPER | ||
183 | 1: str r3, [r0], #4 @ set bottom PGD entry bits | ||
184 | str r7, [r0], #4 @ set top PGD entry bits | ||
185 | add r3, r3, #0x1000 @ next PMD table | ||
186 | subs r6, r6, #1 | ||
187 | bne 1b | ||
188 | |||
189 | add r4, r4, #0x1000 @ point to the PMD tables | ||
190 | #endif | ||
191 | |||
167 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags | 192 | ldr r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags |
168 | 193 | ||
169 | /* | 194 | /* |
170 | * Create identity mapping to cater for __enable_mmu. | 195 | * Create identity mapping to cater for __enable_mmu. |
171 | * This identity mapping will be removed by paging_init(). | 196 | * This identity mapping will be removed by paging_init(). |
172 | */ | 197 | */ |
173 | adr r0, __enable_mmu_loc | 198 | adr r0, __turn_mmu_on_loc |
174 | ldmia r0, {r3, r5, r6} | 199 | ldmia r0, {r3, r5, r6} |
175 | sub r0, r0, r3 @ virt->phys offset | 200 | sub r0, r0, r3 @ virt->phys offset |
176 | add r5, r5, r0 @ phys __enable_mmu | 201 | add r5, r5, r0 @ phys __turn_mmu_on |
177 | add r6, r6, r0 @ phys __enable_mmu_end | 202 | add r6, r6, r0 @ phys __turn_mmu_on_end |
178 | mov r5, r5, lsr #SECTION_SHIFT | 203 | mov r5, r5, lsr #SECTION_SHIFT |
179 | mov r6, r6, lsr #SECTION_SHIFT | 204 | mov r6, r6, lsr #SECTION_SHIFT |
180 | 205 | ||
@@ -219,8 +244,8 @@ __create_page_tables: | |||
219 | #endif | 244 | #endif |
220 | 245 | ||
221 | /* | 246 | /* |
222 | * Then map boot params address in r2 or | 247 | * Then map boot params address in r2 or the first 1MB (2MB with LPAE) |
223 | * the first 1MB of ram if boot params address is not specified. | 248 | * of ram if boot params address is not specified. |
224 | */ | 249 | */ |
225 | mov r0, r2, lsr #SECTION_SHIFT | 250 | mov r0, r2, lsr #SECTION_SHIFT |
226 | movs r0, r0, lsl #SECTION_SHIFT | 251 | movs r0, r0, lsl #SECTION_SHIFT |
@@ -251,7 +276,15 @@ __create_page_tables: | |||
251 | mov r3, r7, lsr #SECTION_SHIFT | 276 | mov r3, r7, lsr #SECTION_SHIFT |
252 | ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags | 277 | ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags |
253 | orr r3, r7, r3, lsl #SECTION_SHIFT | 278 | orr r3, r7, r3, lsl #SECTION_SHIFT |
279 | #ifdef CONFIG_ARM_LPAE | ||
280 | mov r7, #1 << (54 - 32) @ XN | ||
281 | #else | ||
282 | orr r3, r3, #PMD_SECT_XN | ||
283 | #endif | ||
254 | 1: str r3, [r0], #4 | 284 | 1: str r3, [r0], #4 |
285 | #ifdef CONFIG_ARM_LPAE | ||
286 | str r7, [r0], #4 | ||
287 | #endif | ||
255 | add r3, r3, #1 << SECTION_SHIFT | 288 | add r3, r3, #1 << SECTION_SHIFT |
256 | cmp r0, r6 | 289 | cmp r0, r6 |
257 | blo 1b | 290 | blo 1b |
@@ -283,14 +316,17 @@ __create_page_tables: | |||
283 | str r3, [r0] | 316 | str r3, [r0] |
284 | #endif | 317 | #endif |
285 | #endif | 318 | #endif |
319 | #ifdef CONFIG_ARM_LPAE | ||
320 | sub r4, r4, #0x1000 @ point to the PGD table | ||
321 | #endif | ||
286 | mov pc, lr | 322 | mov pc, lr |
287 | ENDPROC(__create_page_tables) | 323 | ENDPROC(__create_page_tables) |
288 | .ltorg | 324 | .ltorg |
289 | .align | 325 | .align |
290 | __enable_mmu_loc: | 326 | __turn_mmu_on_loc: |
291 | .long . | 327 | .long . |
292 | .long __enable_mmu | 328 | .long __turn_mmu_on |
293 | .long __enable_mmu_end | 329 | .long __turn_mmu_on_end |
294 | 330 | ||
295 | #if defined(CONFIG_SMP) | 331 | #if defined(CONFIG_SMP) |
296 | __CPUINIT | 332 | __CPUINIT |
@@ -374,12 +410,17 @@ __enable_mmu: | |||
374 | #ifdef CONFIG_CPU_ICACHE_DISABLE | 410 | #ifdef CONFIG_CPU_ICACHE_DISABLE |
375 | bic r0, r0, #CR_I | 411 | bic r0, r0, #CR_I |
376 | #endif | 412 | #endif |
413 | #ifdef CONFIG_ARM_LPAE | ||
414 | mov r5, #0 | ||
415 | mcrr p15, 0, r4, r5, c2 @ load TTBR0 | ||
416 | #else | ||
377 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ | 417 | mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ |
378 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ | 418 | domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ |
379 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ | 419 | domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ |
380 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) | 420 | domain_val(DOMAIN_IO, DOMAIN_CLIENT)) |
381 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register | 421 | mcr p15, 0, r5, c3, c0, 0 @ load domain access register |
382 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer | 422 | mcr p15, 0, r4, c2, c0, 0 @ load page table pointer |
423 | #endif | ||
383 | b __turn_mmu_on | 424 | b __turn_mmu_on |
384 | ENDPROC(__enable_mmu) | 425 | ENDPROC(__enable_mmu) |
385 | 426 | ||
@@ -398,15 +439,19 @@ ENDPROC(__enable_mmu) | |||
398 | * other registers depend on the function called upon completion | 439 | * other registers depend on the function called upon completion |
399 | */ | 440 | */ |
400 | .align 5 | 441 | .align 5 |
401 | __turn_mmu_on: | 442 | .pushsection .idmap.text, "ax" |
443 | ENTRY(__turn_mmu_on) | ||
402 | mov r0, r0 | 444 | mov r0, r0 |
445 | instr_sync | ||
403 | mcr p15, 0, r0, c1, c0, 0 @ write control reg | 446 | mcr p15, 0, r0, c1, c0, 0 @ write control reg |
404 | mrc p15, 0, r3, c0, c0, 0 @ read id reg | 447 | mrc p15, 0, r3, c0, c0, 0 @ read id reg |
448 | instr_sync | ||
405 | mov r3, r3 | 449 | mov r3, r3 |
406 | mov r3, r13 | 450 | mov r3, r13 |
407 | mov pc, r3 | 451 | mov pc, r3 |
408 | __enable_mmu_end: | 452 | __turn_mmu_on_end: |
409 | ENDPROC(__turn_mmu_on) | 453 | ENDPROC(__turn_mmu_on) |
454 | .popsection | ||
410 | 455 | ||
411 | 456 | ||
412 | #ifdef CONFIG_SMP_ON_UP | 457 | #ifdef CONFIG_SMP_ON_UP |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index 814a52a9dc39..d6a95ef9131d 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
@@ -1016,10 +1016,10 @@ static int __init arch_hw_breakpoint_init(void) | |||
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | /* Register debug fault handler. */ | 1018 | /* Register debug fault handler. */ |
1019 | hook_fault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT, | 1019 | hook_fault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, |
1020 | "watchpoint debug exception"); | 1020 | TRAP_HWBKPT, "watchpoint debug exception"); |
1021 | hook_ifault_code(2, hw_breakpoint_pending, SIGTRAP, TRAP_HWBKPT, | 1021 | hook_ifault_code(FAULT_CODE_DEBUG, hw_breakpoint_pending, SIGTRAP, |
1022 | "breakpoint debug exception"); | 1022 | TRAP_HWBKPT, "breakpoint debug exception"); |
1023 | 1023 | ||
1024 | /* Register hotplug notifier. */ | 1024 | /* Register hotplug notifier. */ |
1025 | register_cpu_notifier(&dbg_reset_nb); | 1025 | register_cpu_notifier(&dbg_reset_nb); |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index e59bbd496c39..764bd456d84f 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -12,12 +12,11 @@ | |||
12 | #include <asm/mmu_context.h> | 12 | #include <asm/mmu_context.h> |
13 | #include <asm/cacheflush.h> | 13 | #include <asm/cacheflush.h> |
14 | #include <asm/mach-types.h> | 14 | #include <asm/mach-types.h> |
15 | #include <asm/system.h> | ||
15 | 16 | ||
16 | extern const unsigned char relocate_new_kernel[]; | 17 | extern const unsigned char relocate_new_kernel[]; |
17 | extern const unsigned int relocate_new_kernel_size; | 18 | extern const unsigned int relocate_new_kernel_size; |
18 | 19 | ||
19 | extern void setup_mm_for_reboot(char mode); | ||
20 | |||
21 | extern unsigned long kexec_start_address; | 20 | extern unsigned long kexec_start_address; |
22 | extern unsigned long kexec_indirection_page; | 21 | extern unsigned long kexec_indirection_page; |
23 | extern unsigned long kexec_mach_type; | 22 | extern unsigned long kexec_mach_type; |
@@ -111,14 +110,6 @@ void machine_kexec(struct kimage *image) | |||
111 | 110 | ||
112 | if (kexec_reinit) | 111 | if (kexec_reinit) |
113 | kexec_reinit(); | 112 | kexec_reinit(); |
114 | local_irq_disable(); | 113 | |
115 | local_fiq_disable(); | 114 | soft_restart(reboot_code_buffer_phys); |
116 | setup_mm_for_reboot(0); /* mode is not used, so just pass 0*/ | ||
117 | flush_cache_all(); | ||
118 | outer_flush_all(); | ||
119 | outer_disable(); | ||
120 | cpu_proc_fin(); | ||
121 | outer_inv_all(); | ||
122 | flush_cache_all(); | ||
123 | cpu_reset(reboot_code_buffer_phys); | ||
124 | } | 115 | } |
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index c475379199b1..172101ac97de 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -59,8 +59,7 @@ armpmu_get_pmu_id(void) | |||
59 | } | 59 | } |
60 | EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); | 60 | EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); |
61 | 61 | ||
62 | int | 62 | int perf_num_counters(void) |
63 | armpmu_get_max_events(void) | ||
64 | { | 63 | { |
65 | int max_events = 0; | 64 | int max_events = 0; |
66 | 65 | ||
@@ -69,12 +68,6 @@ armpmu_get_max_events(void) | |||
69 | 68 | ||
70 | return max_events; | 69 | return max_events; |
71 | } | 70 | } |
72 | EXPORT_SYMBOL_GPL(armpmu_get_max_events); | ||
73 | |||
74 | int perf_num_counters(void) | ||
75 | { | ||
76 | return armpmu_get_max_events(); | ||
77 | } | ||
78 | EXPORT_SYMBOL_GPL(perf_num_counters); | 71 | EXPORT_SYMBOL_GPL(perf_num_counters); |
79 | 72 | ||
80 | #define HW_OP_UNSUPPORTED 0xFFFF | 73 | #define HW_OP_UNSUPPORTED 0xFFFF |
@@ -380,6 +373,8 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
380 | { | 373 | { |
381 | int i, irq, irqs; | 374 | int i, irq, irqs; |
382 | struct platform_device *pmu_device = armpmu->plat_device; | 375 | struct platform_device *pmu_device = armpmu->plat_device; |
376 | struct arm_pmu_platdata *plat = | ||
377 | dev_get_platdata(&pmu_device->dev); | ||
383 | 378 | ||
384 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 379 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
385 | 380 | ||
@@ -387,8 +382,11 @@ armpmu_release_hardware(struct arm_pmu *armpmu) | |||
387 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) | 382 | if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs)) |
388 | continue; | 383 | continue; |
389 | irq = platform_get_irq(pmu_device, i); | 384 | irq = platform_get_irq(pmu_device, i); |
390 | if (irq >= 0) | 385 | if (irq >= 0) { |
386 | if (plat && plat->disable_irq) | ||
387 | plat->disable_irq(irq); | ||
391 | free_irq(irq, armpmu); | 388 | free_irq(irq, armpmu); |
389 | } | ||
392 | } | 390 | } |
393 | 391 | ||
394 | release_pmu(armpmu->type); | 392 | release_pmu(armpmu->type); |
@@ -448,7 +446,8 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu) | |||
448 | irq); | 446 | irq); |
449 | armpmu_release_hardware(armpmu); | 447 | armpmu_release_hardware(armpmu); |
450 | return err; | 448 | return err; |
451 | } | 449 | } else if (plat && plat->enable_irq) |
450 | plat->enable_irq(irq); | ||
452 | 451 | ||
453 | cpumask_set_cpu(i, &armpmu->active_irqs); | 452 | cpumask_set_cpu(i, &armpmu->active_irqs); |
454 | } | 453 | } |
diff --git a/arch/arm/kernel/perf_event_v6.c b/arch/arm/kernel/perf_event_v6.c index e63d8115c01b..533be9930ec2 100644 --- a/arch/arm/kernel/perf_event_v6.c +++ b/arch/arm/kernel/perf_event_v6.c | |||
@@ -65,13 +65,15 @@ enum armv6_counters { | |||
65 | * accesses/misses in hardware. | 65 | * accesses/misses in hardware. |
66 | */ | 66 | */ |
67 | static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { | 67 | static const unsigned armv6_perf_map[PERF_COUNT_HW_MAX] = { |
68 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, | 68 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6_PERFCTR_CPU_CYCLES, |
69 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, | 69 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6_PERFCTR_INSTR_EXEC, |
70 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 70 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
71 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 71 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
72 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, | 72 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6_PERFCTR_BR_EXEC, |
73 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, | 73 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6_PERFCTR_BR_MISPREDICT, |
74 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 74 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
75 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6_PERFCTR_IBUF_STALL, | ||
76 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6_PERFCTR_LSU_FULL_STALL, | ||
75 | }; | 77 | }; |
76 | 78 | ||
77 | static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 79 | static const unsigned armv6_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -218,13 +220,15 @@ enum armv6mpcore_perf_types { | |||
218 | * accesses/misses in hardware. | 220 | * accesses/misses in hardware. |
219 | */ | 221 | */ |
220 | static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { | 222 | static const unsigned armv6mpcore_perf_map[PERF_COUNT_HW_MAX] = { |
221 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, | 223 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV6MPCORE_PERFCTR_CPU_CYCLES, |
222 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, | 224 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_INSTR_EXEC, |
223 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 225 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
224 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 226 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
225 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, | 227 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV6MPCORE_PERFCTR_BR_EXEC, |
226 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, | 228 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV6MPCORE_PERFCTR_BR_MISPREDICT, |
227 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 229 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
230 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV6MPCORE_PERFCTR_IBUF_STALL, | ||
231 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV6MPCORE_PERFCTR_LSU_FULL_STALL, | ||
228 | }; | 232 | }; |
229 | 233 | ||
230 | static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 234 | static const unsigned armv6mpcore_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 1ef6d0034b85..460bbbb6b885 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c | |||
@@ -28,165 +28,87 @@ static struct arm_pmu armv7pmu; | |||
28 | * they are not available. | 28 | * they are not available. |
29 | */ | 29 | */ |
30 | enum armv7_perf_types { | 30 | enum armv7_perf_types { |
31 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, | 31 | ARMV7_PERFCTR_PMNC_SW_INCR = 0x00, |
32 | ARMV7_PERFCTR_IFETCH_MISS = 0x01, | 32 | ARMV7_PERFCTR_L1_ICACHE_REFILL = 0x01, |
33 | ARMV7_PERFCTR_ITLB_MISS = 0x02, | 33 | ARMV7_PERFCTR_ITLB_REFILL = 0x02, |
34 | ARMV7_PERFCTR_DCACHE_REFILL = 0x03, /* L1 */ | 34 | ARMV7_PERFCTR_L1_DCACHE_REFILL = 0x03, |
35 | ARMV7_PERFCTR_DCACHE_ACCESS = 0x04, /* L1 */ | 35 | ARMV7_PERFCTR_L1_DCACHE_ACCESS = 0x04, |
36 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, | 36 | ARMV7_PERFCTR_DTLB_REFILL = 0x05, |
37 | ARMV7_PERFCTR_DREAD = 0x06, | 37 | ARMV7_PERFCTR_MEM_READ = 0x06, |
38 | ARMV7_PERFCTR_DWRITE = 0x07, | 38 | ARMV7_PERFCTR_MEM_WRITE = 0x07, |
39 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, | 39 | ARMV7_PERFCTR_INSTR_EXECUTED = 0x08, |
40 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, | 40 | ARMV7_PERFCTR_EXC_TAKEN = 0x09, |
41 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, | 41 | ARMV7_PERFCTR_EXC_EXECUTED = 0x0A, |
42 | ARMV7_PERFCTR_CID_WRITE = 0x0B, | 42 | ARMV7_PERFCTR_CID_WRITE = 0x0B, |
43 | /* ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS. | 43 | |
44 | /* | ||
45 | * ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS. | ||
44 | * It counts: | 46 | * It counts: |
45 | * - all branch instructions, | 47 | * - all (taken) branch instructions, |
46 | * - instructions that explicitly write the PC, | 48 | * - instructions that explicitly write the PC, |
47 | * - exception generating instructions. | 49 | * - exception generating instructions. |
48 | */ | 50 | */ |
49 | ARMV7_PERFCTR_PC_WRITE = 0x0C, | 51 | ARMV7_PERFCTR_PC_WRITE = 0x0C, |
50 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, | 52 | ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D, |
51 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, | 53 | ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E, |
52 | ARMV7_PERFCTR_UNALIGNED_ACCESS = 0x0F, | 54 | ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS = 0x0F, |
55 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, | ||
56 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, | ||
57 | ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12, | ||
53 | 58 | ||
54 | /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */ | 59 | /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */ |
55 | ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10, | 60 | ARMV7_PERFCTR_MEM_ACCESS = 0x13, |
56 | ARMV7_PERFCTR_CLOCK_CYCLES = 0x11, | 61 | ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14, |
57 | ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12, | 62 | ARMV7_PERFCTR_L1_DCACHE_WB = 0x15, |
58 | ARMV7_PERFCTR_MEM_ACCESS = 0x13, | 63 | ARMV7_PERFCTR_L2_CACHE_ACCESS = 0x16, |
59 | ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14, | 64 | ARMV7_PERFCTR_L2_CACHE_REFILL = 0x17, |
60 | ARMV7_PERFCTR_L1_DCACHE_WB = 0x15, | 65 | ARMV7_PERFCTR_L2_CACHE_WB = 0x18, |
61 | ARMV7_PERFCTR_L2_DCACHE_ACCESS = 0x16, | 66 | ARMV7_PERFCTR_BUS_ACCESS = 0x19, |
62 | ARMV7_PERFCTR_L2_DCACHE_REFILL = 0x17, | 67 | ARMV7_PERFCTR_MEM_ERROR = 0x1A, |
63 | ARMV7_PERFCTR_L2_DCACHE_WB = 0x18, | 68 | ARMV7_PERFCTR_INSTR_SPEC = 0x1B, |
64 | ARMV7_PERFCTR_BUS_ACCESS = 0x19, | 69 | ARMV7_PERFCTR_TTBR_WRITE = 0x1C, |
65 | ARMV7_PERFCTR_MEMORY_ERROR = 0x1A, | 70 | ARMV7_PERFCTR_BUS_CYCLES = 0x1D, |
66 | ARMV7_PERFCTR_INSTR_SPEC = 0x1B, | 71 | |
67 | ARMV7_PERFCTR_TTBR_WRITE = 0x1C, | 72 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF |
68 | ARMV7_PERFCTR_BUS_CYCLES = 0x1D, | ||
69 | |||
70 | ARMV7_PERFCTR_CPU_CYCLES = 0xFF | ||
71 | }; | 73 | }; |
72 | 74 | ||
73 | /* ARMv7 Cortex-A8 specific event types */ | 75 | /* ARMv7 Cortex-A8 specific event types */ |
74 | enum armv7_a8_perf_types { | 76 | enum armv7_a8_perf_types { |
75 | ARMV7_PERFCTR_WRITE_BUFFER_FULL = 0x40, | 77 | ARMV7_A8_PERFCTR_L2_CACHE_ACCESS = 0x43, |
76 | ARMV7_PERFCTR_L2_STORE_MERGED = 0x41, | 78 | ARMV7_A8_PERFCTR_L2_CACHE_REFILL = 0x44, |
77 | ARMV7_PERFCTR_L2_STORE_BUFF = 0x42, | 79 | ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS = 0x50, |
78 | ARMV7_PERFCTR_L2_ACCESS = 0x43, | 80 | ARMV7_A8_PERFCTR_STALL_ISIDE = 0x56, |
79 | ARMV7_PERFCTR_L2_CACH_MISS = 0x44, | ||
80 | ARMV7_PERFCTR_AXI_READ_CYCLES = 0x45, | ||
81 | ARMV7_PERFCTR_AXI_WRITE_CYCLES = 0x46, | ||
82 | ARMV7_PERFCTR_MEMORY_REPLAY = 0x47, | ||
83 | ARMV7_PERFCTR_UNALIGNED_ACCESS_REPLAY = 0x48, | ||
84 | ARMV7_PERFCTR_L1_DATA_MISS = 0x49, | ||
85 | ARMV7_PERFCTR_L1_INST_MISS = 0x4A, | ||
86 | ARMV7_PERFCTR_L1_DATA_COLORING = 0x4B, | ||
87 | ARMV7_PERFCTR_L1_NEON_DATA = 0x4C, | ||
88 | ARMV7_PERFCTR_L1_NEON_CACH_DATA = 0x4D, | ||
89 | ARMV7_PERFCTR_L2_NEON = 0x4E, | ||
90 | ARMV7_PERFCTR_L2_NEON_HIT = 0x4F, | ||
91 | ARMV7_PERFCTR_L1_INST = 0x50, | ||
92 | ARMV7_PERFCTR_PC_RETURN_MIS_PRED = 0x51, | ||
93 | ARMV7_PERFCTR_PC_BRANCH_FAILED = 0x52, | ||
94 | ARMV7_PERFCTR_PC_BRANCH_TAKEN = 0x53, | ||
95 | ARMV7_PERFCTR_PC_BRANCH_EXECUTED = 0x54, | ||
96 | ARMV7_PERFCTR_OP_EXECUTED = 0x55, | ||
97 | ARMV7_PERFCTR_CYCLES_INST_STALL = 0x56, | ||
98 | ARMV7_PERFCTR_CYCLES_INST = 0x57, | ||
99 | ARMV7_PERFCTR_CYCLES_NEON_DATA_STALL = 0x58, | ||
100 | ARMV7_PERFCTR_CYCLES_NEON_INST_STALL = 0x59, | ||
101 | ARMV7_PERFCTR_NEON_CYCLES = 0x5A, | ||
102 | |||
103 | ARMV7_PERFCTR_PMU0_EVENTS = 0x70, | ||
104 | ARMV7_PERFCTR_PMU1_EVENTS = 0x71, | ||
105 | ARMV7_PERFCTR_PMU_EVENTS = 0x72, | ||
106 | }; | 81 | }; |
107 | 82 | ||
108 | /* ARMv7 Cortex-A9 specific event types */ | 83 | /* ARMv7 Cortex-A9 specific event types */ |
109 | enum armv7_a9_perf_types { | 84 | enum armv7_a9_perf_types { |
110 | ARMV7_PERFCTR_JAVA_HW_BYTECODE_EXEC = 0x40, | 85 | ARMV7_A9_PERFCTR_INSTR_CORE_RENAME = 0x68, |
111 | ARMV7_PERFCTR_JAVA_SW_BYTECODE_EXEC = 0x41, | 86 | ARMV7_A9_PERFCTR_STALL_ICACHE = 0x60, |
112 | ARMV7_PERFCTR_JAZELLE_BRANCH_EXEC = 0x42, | 87 | ARMV7_A9_PERFCTR_STALL_DISPATCH = 0x66, |
113 | |||
114 | ARMV7_PERFCTR_COHERENT_LINE_MISS = 0x50, | ||
115 | ARMV7_PERFCTR_COHERENT_LINE_HIT = 0x51, | ||
116 | |||
117 | ARMV7_PERFCTR_ICACHE_DEP_STALL_CYCLES = 0x60, | ||
118 | ARMV7_PERFCTR_DCACHE_DEP_STALL_CYCLES = 0x61, | ||
119 | ARMV7_PERFCTR_TLB_MISS_DEP_STALL_CYCLES = 0x62, | ||
120 | ARMV7_PERFCTR_STREX_EXECUTED_PASSED = 0x63, | ||
121 | ARMV7_PERFCTR_STREX_EXECUTED_FAILED = 0x64, | ||
122 | ARMV7_PERFCTR_DATA_EVICTION = 0x65, | ||
123 | ARMV7_PERFCTR_ISSUE_STAGE_NO_INST = 0x66, | ||
124 | ARMV7_PERFCTR_ISSUE_STAGE_EMPTY = 0x67, | ||
125 | ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE = 0x68, | ||
126 | |||
127 | ARMV7_PERFCTR_PREDICTABLE_FUNCT_RETURNS = 0x6E, | ||
128 | |||
129 | ARMV7_PERFCTR_MAIN_UNIT_EXECUTED_INST = 0x70, | ||
130 | ARMV7_PERFCTR_SECOND_UNIT_EXECUTED_INST = 0x71, | ||
131 | ARMV7_PERFCTR_LD_ST_UNIT_EXECUTED_INST = 0x72, | ||
132 | ARMV7_PERFCTR_FP_EXECUTED_INST = 0x73, | ||
133 | ARMV7_PERFCTR_NEON_EXECUTED_INST = 0x74, | ||
134 | |||
135 | ARMV7_PERFCTR_PLD_FULL_DEP_STALL_CYCLES = 0x80, | ||
136 | ARMV7_PERFCTR_DATA_WR_DEP_STALL_CYCLES = 0x81, | ||
137 | ARMV7_PERFCTR_ITLB_MISS_DEP_STALL_CYCLES = 0x82, | ||
138 | ARMV7_PERFCTR_DTLB_MISS_DEP_STALL_CYCLES = 0x83, | ||
139 | ARMV7_PERFCTR_MICRO_ITLB_MISS_DEP_STALL_CYCLES = 0x84, | ||
140 | ARMV7_PERFCTR_MICRO_DTLB_MISS_DEP_STALL_CYCLES = 0x85, | ||
141 | ARMV7_PERFCTR_DMB_DEP_STALL_CYCLES = 0x86, | ||
142 | |||
143 | ARMV7_PERFCTR_INTGR_CLK_ENABLED_CYCLES = 0x8A, | ||
144 | ARMV7_PERFCTR_DATA_ENGINE_CLK_EN_CYCLES = 0x8B, | ||
145 | |||
146 | ARMV7_PERFCTR_ISB_INST = 0x90, | ||
147 | ARMV7_PERFCTR_DSB_INST = 0x91, | ||
148 | ARMV7_PERFCTR_DMB_INST = 0x92, | ||
149 | ARMV7_PERFCTR_EXT_INTERRUPTS = 0x93, | ||
150 | |||
151 | ARMV7_PERFCTR_PLE_CACHE_LINE_RQST_COMPLETED = 0xA0, | ||
152 | ARMV7_PERFCTR_PLE_CACHE_LINE_RQST_SKIPPED = 0xA1, | ||
153 | ARMV7_PERFCTR_PLE_FIFO_FLUSH = 0xA2, | ||
154 | ARMV7_PERFCTR_PLE_RQST_COMPLETED = 0xA3, | ||
155 | ARMV7_PERFCTR_PLE_FIFO_OVERFLOW = 0xA4, | ||
156 | ARMV7_PERFCTR_PLE_RQST_PROG = 0xA5 | ||
157 | }; | 88 | }; |
158 | 89 | ||
159 | /* ARMv7 Cortex-A5 specific event types */ | 90 | /* ARMv7 Cortex-A5 specific event types */ |
160 | enum armv7_a5_perf_types { | 91 | enum armv7_a5_perf_types { |
161 | ARMV7_PERFCTR_IRQ_TAKEN = 0x86, | 92 | ARMV7_A5_PERFCTR_PREFETCH_LINEFILL = 0xc2, |
162 | ARMV7_PERFCTR_FIQ_TAKEN = 0x87, | 93 | ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3, |
163 | |||
164 | ARMV7_PERFCTR_EXT_MEM_RQST = 0xc0, | ||
165 | ARMV7_PERFCTR_NC_EXT_MEM_RQST = 0xc1, | ||
166 | ARMV7_PERFCTR_PREFETCH_LINEFILL = 0xc2, | ||
167 | ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3, | ||
168 | ARMV7_PERFCTR_ENTER_READ_ALLOC = 0xc4, | ||
169 | ARMV7_PERFCTR_READ_ALLOC = 0xc5, | ||
170 | |||
171 | ARMV7_PERFCTR_STALL_SB_FULL = 0xc9, | ||
172 | }; | 94 | }; |
173 | 95 | ||
174 | /* ARMv7 Cortex-A15 specific event types */ | 96 | /* ARMv7 Cortex-A15 specific event types */ |
175 | enum armv7_a15_perf_types { | 97 | enum armv7_a15_perf_types { |
176 | ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS = 0x40, | 98 | ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40, |
177 | ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS = 0x41, | 99 | ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41, |
178 | ARMV7_PERFCTR_L1_DCACHE_READ_REFILL = 0x42, | 100 | ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42, |
179 | ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL = 0x43, | 101 | ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE = 0x43, |
180 | 102 | ||
181 | ARMV7_PERFCTR_L1_DTLB_READ_REFILL = 0x4C, | 103 | ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ = 0x4C, |
182 | ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL = 0x4D, | 104 | ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE = 0x4D, |
183 | 105 | ||
184 | ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS = 0x50, | 106 | ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ = 0x50, |
185 | ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS = 0x51, | 107 | ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51, |
186 | ARMV7_PERFCTR_L2_DCACHE_READ_REFILL = 0x52, | 108 | ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ = 0x52, |
187 | ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL = 0x53, | 109 | ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE = 0x53, |
188 | 110 | ||
189 | ARMV7_PERFCTR_SPEC_PC_WRITE = 0x76, | 111 | ARMV7_A15_PERFCTR_PC_WRITE_SPEC = 0x76, |
190 | }; | 112 | }; |
191 | 113 | ||
192 | /* | 114 | /* |
@@ -197,13 +119,15 @@ enum armv7_a15_perf_types { | |||
197 | * accesses/misses in hardware. | 119 | * accesses/misses in hardware. |
198 | */ | 120 | */ |
199 | static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = { | 121 | static const unsigned armv7_a8_perf_map[PERF_COUNT_HW_MAX] = { |
200 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 122 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
201 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 123 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
202 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 124 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
203 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 125 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
204 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 126 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
205 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 127 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
206 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, | 128 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
129 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A8_PERFCTR_STALL_ISIDE, | ||
130 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
207 | }; | 131 | }; |
208 | 132 | ||
209 | static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 133 | static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -217,12 +141,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
217 | * combined. | 141 | * combined. |
218 | */ | 142 | */ |
219 | [C(OP_READ)] = { | 143 | [C(OP_READ)] = { |
220 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 144 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
221 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 145 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
222 | }, | 146 | }, |
223 | [C(OP_WRITE)] = { | 147 | [C(OP_WRITE)] = { |
224 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 148 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
225 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 149 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
226 | }, | 150 | }, |
227 | [C(OP_PREFETCH)] = { | 151 | [C(OP_PREFETCH)] = { |
228 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 152 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -231,12 +155,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
231 | }, | 155 | }, |
232 | [C(L1I)] = { | 156 | [C(L1I)] = { |
233 | [C(OP_READ)] = { | 157 | [C(OP_READ)] = { |
234 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_INST, | 158 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS, |
235 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_INST_MISS, | 159 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
236 | }, | 160 | }, |
237 | [C(OP_WRITE)] = { | 161 | [C(OP_WRITE)] = { |
238 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_INST, | 162 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS, |
239 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_INST_MISS, | 163 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
240 | }, | 164 | }, |
241 | [C(OP_PREFETCH)] = { | 165 | [C(OP_PREFETCH)] = { |
242 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 166 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -245,12 +169,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
245 | }, | 169 | }, |
246 | [C(LL)] = { | 170 | [C(LL)] = { |
247 | [C(OP_READ)] = { | 171 | [C(OP_READ)] = { |
248 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_ACCESS, | 172 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, |
249 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACH_MISS, | 173 | [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, |
250 | }, | 174 | }, |
251 | [C(OP_WRITE)] = { | 175 | [C(OP_WRITE)] = { |
252 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L2_ACCESS, | 176 | [C(RESULT_ACCESS)] = ARMV7_A8_PERFCTR_L2_CACHE_ACCESS, |
253 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L2_CACH_MISS, | 177 | [C(RESULT_MISS)] = ARMV7_A8_PERFCTR_L2_CACHE_REFILL, |
254 | }, | 178 | }, |
255 | [C(OP_PREFETCH)] = { | 179 | [C(OP_PREFETCH)] = { |
256 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 180 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -274,11 +198,11 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
274 | [C(ITLB)] = { | 198 | [C(ITLB)] = { |
275 | [C(OP_READ)] = { | 199 | [C(OP_READ)] = { |
276 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 200 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
277 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 201 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
278 | }, | 202 | }, |
279 | [C(OP_WRITE)] = { | 203 | [C(OP_WRITE)] = { |
280 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 204 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
281 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 205 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
282 | }, | 206 | }, |
283 | [C(OP_PREFETCH)] = { | 207 | [C(OP_PREFETCH)] = { |
284 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 208 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -287,14 +211,12 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
287 | }, | 211 | }, |
288 | [C(BPU)] = { | 212 | [C(BPU)] = { |
289 | [C(OP_READ)] = { | 213 | [C(OP_READ)] = { |
290 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 214 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
291 | [C(RESULT_MISS)] | 215 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
292 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
293 | }, | 216 | }, |
294 | [C(OP_WRITE)] = { | 217 | [C(OP_WRITE)] = { |
295 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 218 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
296 | [C(RESULT_MISS)] | 219 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
297 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
298 | }, | 220 | }, |
299 | [C(OP_PREFETCH)] = { | 221 | [C(OP_PREFETCH)] = { |
300 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 222 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -321,14 +243,15 @@ static const unsigned armv7_a8_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
321 | * Cortex-A9 HW events mapping | 243 | * Cortex-A9 HW events mapping |
322 | */ | 244 | */ |
323 | static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { | 245 | static const unsigned armv7_a9_perf_map[PERF_COUNT_HW_MAX] = { |
324 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 246 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
325 | [PERF_COUNT_HW_INSTRUCTIONS] = | 247 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_A9_PERFCTR_INSTR_CORE_RENAME, |
326 | ARMV7_PERFCTR_INST_OUT_OF_RENAME_STAGE, | 248 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
327 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_DCACHE_ACCESS, | 249 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
328 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_DCACHE_REFILL, | 250 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
329 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 251 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
330 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 252 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
331 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_CLOCK_CYCLES, | 253 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = ARMV7_A9_PERFCTR_STALL_ICACHE, |
254 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = ARMV7_A9_PERFCTR_STALL_DISPATCH, | ||
332 | }; | 255 | }; |
333 | 256 | ||
334 | static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 257 | static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -342,12 +265,12 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
342 | * combined. | 265 | * combined. |
343 | */ | 266 | */ |
344 | [C(OP_READ)] = { | 267 | [C(OP_READ)] = { |
345 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 268 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
346 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 269 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
347 | }, | 270 | }, |
348 | [C(OP_WRITE)] = { | 271 | [C(OP_WRITE)] = { |
349 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_DCACHE_ACCESS, | 272 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
350 | [C(RESULT_MISS)] = ARMV7_PERFCTR_DCACHE_REFILL, | 273 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
351 | }, | 274 | }, |
352 | [C(OP_PREFETCH)] = { | 275 | [C(OP_PREFETCH)] = { |
353 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 276 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -357,11 +280,11 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
357 | [C(L1I)] = { | 280 | [C(L1I)] = { |
358 | [C(OP_READ)] = { | 281 | [C(OP_READ)] = { |
359 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 282 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
360 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 283 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
361 | }, | 284 | }, |
362 | [C(OP_WRITE)] = { | 285 | [C(OP_WRITE)] = { |
363 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 286 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
364 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 287 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
365 | }, | 288 | }, |
366 | [C(OP_PREFETCH)] = { | 289 | [C(OP_PREFETCH)] = { |
367 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 290 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -399,11 +322,11 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
399 | [C(ITLB)] = { | 322 | [C(ITLB)] = { |
400 | [C(OP_READ)] = { | 323 | [C(OP_READ)] = { |
401 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 324 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
402 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 325 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
403 | }, | 326 | }, |
404 | [C(OP_WRITE)] = { | 327 | [C(OP_WRITE)] = { |
405 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 328 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
406 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 329 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
407 | }, | 330 | }, |
408 | [C(OP_PREFETCH)] = { | 331 | [C(OP_PREFETCH)] = { |
409 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 332 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -412,14 +335,12 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
412 | }, | 335 | }, |
413 | [C(BPU)] = { | 336 | [C(BPU)] = { |
414 | [C(OP_READ)] = { | 337 | [C(OP_READ)] = { |
415 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 338 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
416 | [C(RESULT_MISS)] | 339 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
417 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
418 | }, | 340 | }, |
419 | [C(OP_WRITE)] = { | 341 | [C(OP_WRITE)] = { |
420 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_WRITE, | 342 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
421 | [C(RESULT_MISS)] | 343 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
422 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
423 | }, | 344 | }, |
424 | [C(OP_PREFETCH)] = { | 345 | [C(OP_PREFETCH)] = { |
425 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 346 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -446,13 +367,15 @@ static const unsigned armv7_a9_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
446 | * Cortex-A5 HW events mapping | 367 | * Cortex-A5 HW events mapping |
447 | */ | 368 | */ |
448 | static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { | 369 | static const unsigned armv7_a5_perf_map[PERF_COUNT_HW_MAX] = { |
449 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 370 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
450 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 371 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
451 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 372 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
452 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 373 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
453 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, | 374 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_PC_WRITE, |
454 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 375 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
455 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 376 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
377 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, | ||
378 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
456 | }; | 379 | }; |
457 | 380 | ||
458 | static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 381 | static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -460,42 +383,34 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
460 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | 383 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
461 | [C(L1D)] = { | 384 | [C(L1D)] = { |
462 | [C(OP_READ)] = { | 385 | [C(OP_READ)] = { |
463 | [C(RESULT_ACCESS)] | 386 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
464 | = ARMV7_PERFCTR_DCACHE_ACCESS, | 387 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
465 | [C(RESULT_MISS)] | ||
466 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
467 | }, | 388 | }, |
468 | [C(OP_WRITE)] = { | 389 | [C(OP_WRITE)] = { |
469 | [C(RESULT_ACCESS)] | 390 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
470 | = ARMV7_PERFCTR_DCACHE_ACCESS, | 391 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
471 | [C(RESULT_MISS)] | ||
472 | = ARMV7_PERFCTR_DCACHE_REFILL, | ||
473 | }, | 392 | }, |
474 | [C(OP_PREFETCH)] = { | 393 | [C(OP_PREFETCH)] = { |
475 | [C(RESULT_ACCESS)] | 394 | [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, |
476 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | 395 | [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, |
477 | [C(RESULT_MISS)] | ||
478 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
479 | }, | 396 | }, |
480 | }, | 397 | }, |
481 | [C(L1I)] = { | 398 | [C(L1I)] = { |
482 | [C(OP_READ)] = { | 399 | [C(OP_READ)] = { |
483 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 400 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
484 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 401 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
485 | }, | 402 | }, |
486 | [C(OP_WRITE)] = { | 403 | [C(OP_WRITE)] = { |
487 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 404 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
488 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 405 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
489 | }, | 406 | }, |
490 | /* | 407 | /* |
491 | * The prefetch counters don't differentiate between the I | 408 | * The prefetch counters don't differentiate between the I |
492 | * side and the D side. | 409 | * side and the D side. |
493 | */ | 410 | */ |
494 | [C(OP_PREFETCH)] = { | 411 | [C(OP_PREFETCH)] = { |
495 | [C(RESULT_ACCESS)] | 412 | [C(RESULT_ACCESS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL, |
496 | = ARMV7_PERFCTR_PREFETCH_LINEFILL, | 413 | [C(RESULT_MISS)] = ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP, |
497 | [C(RESULT_MISS)] | ||
498 | = ARMV7_PERFCTR_PREFETCH_LINEFILL_DROP, | ||
499 | }, | 414 | }, |
500 | }, | 415 | }, |
501 | [C(LL)] = { | 416 | [C(LL)] = { |
@@ -529,11 +444,11 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
529 | [C(ITLB)] = { | 444 | [C(ITLB)] = { |
530 | [C(OP_READ)] = { | 445 | [C(OP_READ)] = { |
531 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 446 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
532 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 447 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
533 | }, | 448 | }, |
534 | [C(OP_WRITE)] = { | 449 | [C(OP_WRITE)] = { |
535 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 450 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
536 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 451 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
537 | }, | 452 | }, |
538 | [C(OP_PREFETCH)] = { | 453 | [C(OP_PREFETCH)] = { |
539 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 454 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -543,13 +458,11 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
543 | [C(BPU)] = { | 458 | [C(BPU)] = { |
544 | [C(OP_READ)] = { | 459 | [C(OP_READ)] = { |
545 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 460 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
546 | [C(RESULT_MISS)] | 461 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
547 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
548 | }, | 462 | }, |
549 | [C(OP_WRITE)] = { | 463 | [C(OP_WRITE)] = { |
550 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 464 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
551 | [C(RESULT_MISS)] | 465 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
552 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
553 | }, | 466 | }, |
554 | [C(OP_PREFETCH)] = { | 467 | [C(OP_PREFETCH)] = { |
555 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 468 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -562,13 +475,15 @@ static const unsigned armv7_a5_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
562 | * Cortex-A15 HW events mapping | 475 | * Cortex-A15 HW events mapping |
563 | */ | 476 | */ |
564 | static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { | 477 | static const unsigned armv7_a15_perf_map[PERF_COUNT_HW_MAX] = { |
565 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, | 478 | [PERF_COUNT_HW_CPU_CYCLES] = ARMV7_PERFCTR_CPU_CYCLES, |
566 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, | 479 | [PERF_COUNT_HW_INSTRUCTIONS] = ARMV7_PERFCTR_INSTR_EXECUTED, |
567 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 480 | [PERF_COUNT_HW_CACHE_REFERENCES] = ARMV7_PERFCTR_L1_DCACHE_ACCESS, |
568 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 481 | [PERF_COUNT_HW_CACHE_MISSES] = ARMV7_PERFCTR_L1_DCACHE_REFILL, |
569 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_PERFCTR_SPEC_PC_WRITE, | 482 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = ARMV7_A15_PERFCTR_PC_WRITE_SPEC, |
570 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | 483 | [PERF_COUNT_HW_BRANCH_MISSES] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
571 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, | 484 | [PERF_COUNT_HW_BUS_CYCLES] = ARMV7_PERFCTR_BUS_CYCLES, |
485 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = HW_OP_UNSUPPORTED, | ||
486 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
572 | }; | 487 | }; |
573 | 488 | ||
574 | static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 489 | static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
@@ -576,16 +491,12 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
576 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { | 491 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = { |
577 | [C(L1D)] = { | 492 | [C(L1D)] = { |
578 | [C(OP_READ)] = { | 493 | [C(OP_READ)] = { |
579 | [C(RESULT_ACCESS)] | 494 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ, |
580 | = ARMV7_PERFCTR_L1_DCACHE_READ_ACCESS, | 495 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ, |
581 | [C(RESULT_MISS)] | ||
582 | = ARMV7_PERFCTR_L1_DCACHE_READ_REFILL, | ||
583 | }, | 496 | }, |
584 | [C(OP_WRITE)] = { | 497 | [C(OP_WRITE)] = { |
585 | [C(RESULT_ACCESS)] | 498 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE, |
586 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_ACCESS, | 499 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE, |
587 | [C(RESULT_MISS)] | ||
588 | = ARMV7_PERFCTR_L1_DCACHE_WRITE_REFILL, | ||
589 | }, | 500 | }, |
590 | [C(OP_PREFETCH)] = { | 501 | [C(OP_PREFETCH)] = { |
591 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 502 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -601,11 +512,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
601 | */ | 512 | */ |
602 | [C(OP_READ)] = { | 513 | [C(OP_READ)] = { |
603 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 514 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
604 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 515 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
605 | }, | 516 | }, |
606 | [C(OP_WRITE)] = { | 517 | [C(OP_WRITE)] = { |
607 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, | 518 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_L1_ICACHE_ACCESS, |
608 | [C(RESULT_MISS)] = ARMV7_PERFCTR_IFETCH_MISS, | 519 | [C(RESULT_MISS)] = ARMV7_PERFCTR_L1_ICACHE_REFILL, |
609 | }, | 520 | }, |
610 | [C(OP_PREFETCH)] = { | 521 | [C(OP_PREFETCH)] = { |
611 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 522 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -614,16 +525,12 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
614 | }, | 525 | }, |
615 | [C(LL)] = { | 526 | [C(LL)] = { |
616 | [C(OP_READ)] = { | 527 | [C(OP_READ)] = { |
617 | [C(RESULT_ACCESS)] | 528 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ, |
618 | = ARMV7_PERFCTR_L2_DCACHE_READ_ACCESS, | 529 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ, |
619 | [C(RESULT_MISS)] | ||
620 | = ARMV7_PERFCTR_L2_DCACHE_READ_REFILL, | ||
621 | }, | 530 | }, |
622 | [C(OP_WRITE)] = { | 531 | [C(OP_WRITE)] = { |
623 | [C(RESULT_ACCESS)] | 532 | [C(RESULT_ACCESS)] = ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE, |
624 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_ACCESS, | 533 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE, |
625 | [C(RESULT_MISS)] | ||
626 | = ARMV7_PERFCTR_L2_DCACHE_WRITE_REFILL, | ||
627 | }, | 534 | }, |
628 | [C(OP_PREFETCH)] = { | 535 | [C(OP_PREFETCH)] = { |
629 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 536 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -633,13 +540,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
633 | [C(DTLB)] = { | 540 | [C(DTLB)] = { |
634 | [C(OP_READ)] = { | 541 | [C(OP_READ)] = { |
635 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 542 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
636 | [C(RESULT_MISS)] | 543 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ, |
637 | = ARMV7_PERFCTR_L1_DTLB_READ_REFILL, | ||
638 | }, | 544 | }, |
639 | [C(OP_WRITE)] = { | 545 | [C(OP_WRITE)] = { |
640 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 546 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
641 | [C(RESULT_MISS)] | 547 | [C(RESULT_MISS)] = ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE, |
642 | = ARMV7_PERFCTR_L1_DTLB_WRITE_REFILL, | ||
643 | }, | 548 | }, |
644 | [C(OP_PREFETCH)] = { | 549 | [C(OP_PREFETCH)] = { |
645 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 550 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -649,11 +554,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
649 | [C(ITLB)] = { | 554 | [C(ITLB)] = { |
650 | [C(OP_READ)] = { | 555 | [C(OP_READ)] = { |
651 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 556 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
652 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 557 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
653 | }, | 558 | }, |
654 | [C(OP_WRITE)] = { | 559 | [C(OP_WRITE)] = { |
655 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 560 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
656 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_MISS, | 561 | [C(RESULT_MISS)] = ARMV7_PERFCTR_ITLB_REFILL, |
657 | }, | 562 | }, |
658 | [C(OP_PREFETCH)] = { | 563 | [C(OP_PREFETCH)] = { |
659 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 564 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
@@ -663,13 +568,11 @@ static const unsigned armv7_a15_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | |||
663 | [C(BPU)] = { | 568 | [C(BPU)] = { |
664 | [C(OP_READ)] = { | 569 | [C(OP_READ)] = { |
665 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 570 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
666 | [C(RESULT_MISS)] | 571 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
667 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
668 | }, | 572 | }, |
669 | [C(OP_WRITE)] = { | 573 | [C(OP_WRITE)] = { |
670 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, | 574 | [C(RESULT_ACCESS)] = ARMV7_PERFCTR_PC_BRANCH_PRED, |
671 | [C(RESULT_MISS)] | 575 | [C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, |
672 | = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED, | ||
673 | }, | 576 | }, |
674 | [C(OP_PREFETCH)] = { | 577 | [C(OP_PREFETCH)] = { |
675 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, | 578 | [C(RESULT_ACCESS)] = CACHE_OP_UNSUPPORTED, |
diff --git a/arch/arm/kernel/perf_event_xscale.c b/arch/arm/kernel/perf_event_xscale.c index e0cca10a8411..3b99d8269829 100644 --- a/arch/arm/kernel/perf_event_xscale.c +++ b/arch/arm/kernel/perf_event_xscale.c | |||
@@ -48,13 +48,15 @@ enum xscale_counters { | |||
48 | }; | 48 | }; |
49 | 49 | ||
50 | static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = { | 50 | static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = { |
51 | [PERF_COUNT_HW_CPU_CYCLES] = XSCALE_PERFCTR_CCNT, | 51 | [PERF_COUNT_HW_CPU_CYCLES] = XSCALE_PERFCTR_CCNT, |
52 | [PERF_COUNT_HW_INSTRUCTIONS] = XSCALE_PERFCTR_INSTRUCTION, | 52 | [PERF_COUNT_HW_INSTRUCTIONS] = XSCALE_PERFCTR_INSTRUCTION, |
53 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, | 53 | [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED, |
54 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, | 54 | [PERF_COUNT_HW_CACHE_MISSES] = HW_OP_UNSUPPORTED, |
55 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH, | 55 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH, |
56 | [PERF_COUNT_HW_BRANCH_MISSES] = XSCALE_PERFCTR_BRANCH_MISS, | 56 | [PERF_COUNT_HW_BRANCH_MISSES] = XSCALE_PERFCTR_BRANCH_MISS, |
57 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, | 57 | [PERF_COUNT_HW_BUS_CYCLES] = HW_OP_UNSUPPORTED, |
58 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = XSCALE_PERFCTR_ICACHE_NO_DELIVER, | ||
59 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = HW_OP_UNSUPPORTED, | ||
58 | }; | 60 | }; |
59 | 61 | ||
60 | static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] | 62 | static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 3d0c6fb74ae4..423bb2019451 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -57,7 +57,7 @@ static const char *isa_modes[] = { | |||
57 | "ARM" , "Thumb" , "Jazelle", "ThumbEE" | 57 | "ARM" , "Thumb" , "Jazelle", "ThumbEE" |
58 | }; | 58 | }; |
59 | 59 | ||
60 | extern void setup_mm_for_reboot(char mode); | 60 | extern void setup_mm_for_reboot(void); |
61 | 61 | ||
62 | static volatile int hlt_counter; | 62 | static volatile int hlt_counter; |
63 | 63 | ||
@@ -92,18 +92,24 @@ static int __init hlt_setup(char *__unused) | |||
92 | __setup("nohlt", nohlt_setup); | 92 | __setup("nohlt", nohlt_setup); |
93 | __setup("hlt", hlt_setup); | 93 | __setup("hlt", hlt_setup); |
94 | 94 | ||
95 | void arm_machine_restart(char mode, const char *cmd) | 95 | extern void call_with_stack(void (*fn)(void *), void *arg, void *sp); |
96 | typedef void (*phys_reset_t)(unsigned long); | ||
97 | |||
98 | /* | ||
99 | * A temporary stack to use for CPU reset. This is static so that we | ||
100 | * don't clobber it with the identity mapping. When running with this | ||
101 | * stack, any references to the current task *will not work* so you | ||
102 | * should really do as little as possible before jumping to your reset | ||
103 | * code. | ||
104 | */ | ||
105 | static u64 soft_restart_stack[16]; | ||
106 | |||
107 | static void __soft_restart(void *addr) | ||
96 | { | 108 | { |
97 | /* Disable interrupts first */ | 109 | phys_reset_t phys_reset; |
98 | local_irq_disable(); | ||
99 | local_fiq_disable(); | ||
100 | 110 | ||
101 | /* | 111 | /* Take out a flat memory mapping. */ |
102 | * Tell the mm system that we are going to reboot - | 112 | setup_mm_for_reboot(); |
103 | * we may need it to insert some 1:1 mappings so that | ||
104 | * soft boot works. | ||
105 | */ | ||
106 | setup_mm_for_reboot(mode); | ||
107 | 113 | ||
108 | /* Clean and invalidate caches */ | 114 | /* Clean and invalidate caches */ |
109 | flush_cache_all(); | 115 | flush_cache_all(); |
@@ -114,18 +120,41 @@ void arm_machine_restart(char mode, const char *cmd) | |||
114 | /* Push out any further dirty data, and ensure cache is empty */ | 120 | /* Push out any further dirty data, and ensure cache is empty */ |
115 | flush_cache_all(); | 121 | flush_cache_all(); |
116 | 122 | ||
117 | /* | 123 | /* Switch to the identity mapping. */ |
118 | * Now call the architecture specific reboot code. | 124 | phys_reset = (phys_reset_t)(unsigned long)virt_to_phys(cpu_reset); |
119 | */ | 125 | phys_reset((unsigned long)addr); |
120 | arch_reset(mode, cmd); | ||
121 | 126 | ||
122 | /* | 127 | /* Should never get here. */ |
123 | * Whoops - the architecture was unable to reboot. | 128 | BUG(); |
124 | * Tell the user! | 129 | } |
125 | */ | 130 | |
126 | mdelay(1000); | 131 | void soft_restart(unsigned long addr) |
127 | printk("Reboot failed -- System halted\n"); | 132 | { |
128 | while (1); | 133 | u64 *stack = soft_restart_stack + ARRAY_SIZE(soft_restart_stack); |
134 | |||
135 | /* Disable interrupts first */ | ||
136 | local_irq_disable(); | ||
137 | local_fiq_disable(); | ||
138 | |||
139 | /* Disable the L2 if we're the last man standing. */ | ||
140 | if (num_online_cpus() == 1) | ||
141 | outer_disable(); | ||
142 | |||
143 | /* Change to the new stack and continue with the reset. */ | ||
144 | call_with_stack(__soft_restart, (void *)addr, (void *)stack); | ||
145 | |||
146 | /* Should never get here. */ | ||
147 | BUG(); | ||
148 | } | ||
149 | |||
150 | void arm_machine_restart(char mode, const char *cmd) | ||
151 | { | ||
152 | /* Disable interrupts first */ | ||
153 | local_irq_disable(); | ||
154 | local_fiq_disable(); | ||
155 | |||
156 | /* Call the architecture specific reboot code. */ | ||
157 | arch_reset(mode, cmd); | ||
129 | } | 158 | } |
130 | 159 | ||
131 | /* | 160 | /* |
@@ -253,7 +282,15 @@ void machine_power_off(void) | |||
253 | void machine_restart(char *cmd) | 282 | void machine_restart(char *cmd) |
254 | { | 283 | { |
255 | machine_shutdown(); | 284 | machine_shutdown(); |
285 | |||
256 | arm_pm_restart(reboot_mode, cmd); | 286 | arm_pm_restart(reboot_mode, cmd); |
287 | |||
288 | /* Give a grace period for failure to restart of 1s */ | ||
289 | mdelay(1000); | ||
290 | |||
291 | /* Whoops - the platform was unable to reboot. Tell the user! */ | ||
292 | printk("Reboot failed -- System halted\n"); | ||
293 | while (1); | ||
257 | } | 294 | } |
258 | 295 | ||
259 | void __show_regs(struct pt_regs *regs) | 296 | void __show_regs(struct pt_regs *regs) |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 3448a3f9cc8c..5c7094e8f6e9 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/memblock.h> | 31 | #include <linux/memblock.h> |
32 | #include <linux/bug.h> | 32 | #include <linux/bug.h> |
33 | #include <linux/compiler.h> | 33 | #include <linux/compiler.h> |
34 | #include <linux/sort.h> | ||
34 | 35 | ||
35 | #include <asm/unified.h> | 36 | #include <asm/unified.h> |
36 | #include <asm/cpu.h> | 37 | #include <asm/cpu.h> |
@@ -890,6 +891,12 @@ static struct machine_desc * __init setup_machine_tags(unsigned int nr) | |||
890 | return mdesc; | 891 | return mdesc; |
891 | } | 892 | } |
892 | 893 | ||
894 | static int __init meminfo_cmp(const void *_a, const void *_b) | ||
895 | { | ||
896 | const struct membank *a = _a, *b = _b; | ||
897 | long cmp = bank_pfn_start(a) - bank_pfn_start(b); | ||
898 | return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; | ||
899 | } | ||
893 | 900 | ||
894 | void __init setup_arch(char **cmdline_p) | 901 | void __init setup_arch(char **cmdline_p) |
895 | { | 902 | { |
@@ -904,8 +911,8 @@ void __init setup_arch(char **cmdline_p) | |||
904 | machine_desc = mdesc; | 911 | machine_desc = mdesc; |
905 | machine_name = mdesc->name; | 912 | machine_name = mdesc->name; |
906 | 913 | ||
907 | if (mdesc->soft_reboot) | 914 | if (mdesc->restart_mode) |
908 | reboot_setup("s"); | 915 | reboot_setup(&mdesc->restart_mode); |
909 | 916 | ||
910 | init_mm.start_code = (unsigned long) _text; | 917 | init_mm.start_code = (unsigned long) _text; |
911 | init_mm.end_code = (unsigned long) _etext; | 918 | init_mm.end_code = (unsigned long) _etext; |
@@ -918,12 +925,16 @@ void __init setup_arch(char **cmdline_p) | |||
918 | 925 | ||
919 | parse_early_param(); | 926 | parse_early_param(); |
920 | 927 | ||
928 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | ||
921 | sanity_check_meminfo(); | 929 | sanity_check_meminfo(); |
922 | arm_memblock_init(&meminfo, mdesc); | 930 | arm_memblock_init(&meminfo, mdesc); |
923 | 931 | ||
924 | paging_init(mdesc); | 932 | paging_init(mdesc); |
925 | request_standard_resources(mdesc); | 933 | request_standard_resources(mdesc); |
926 | 934 | ||
935 | if (mdesc->restart) | ||
936 | arm_pm_restart = mdesc->restart; | ||
937 | |||
927 | unflatten_device_tree(); | 938 | unflatten_device_tree(); |
928 | 939 | ||
929 | #ifdef CONFIG_SMP | 940 | #ifdef CONFIG_SMP |
diff --git a/arch/arm/kernel/sleep.S b/arch/arm/kernel/sleep.S index 020e99c845e7..1f268bda4552 100644 --- a/arch/arm/kernel/sleep.S +++ b/arch/arm/kernel/sleep.S | |||
@@ -54,14 +54,18 @@ ENDPROC(cpu_suspend_abort) | |||
54 | * r0 = control register value | 54 | * r0 = control register value |
55 | */ | 55 | */ |
56 | .align 5 | 56 | .align 5 |
57 | .pushsection .idmap.text,"ax" | ||
57 | ENTRY(cpu_resume_mmu) | 58 | ENTRY(cpu_resume_mmu) |
58 | ldr r3, =cpu_resume_after_mmu | 59 | ldr r3, =cpu_resume_after_mmu |
60 | instr_sync | ||
59 | mcr p15, 0, r0, c1, c0, 0 @ turn on MMU, I-cache, etc | 61 | mcr p15, 0, r0, c1, c0, 0 @ turn on MMU, I-cache, etc |
60 | mrc p15, 0, r0, c0, c0, 0 @ read id reg | 62 | mrc p15, 0, r0, c0, c0, 0 @ read id reg |
63 | instr_sync | ||
61 | mov r0, r0 | 64 | mov r0, r0 |
62 | mov r0, r0 | 65 | mov r0, r0 |
63 | mov pc, r3 @ jump to virtual address | 66 | mov pc, r3 @ jump to virtual address |
64 | ENDPROC(cpu_resume_mmu) | 67 | ENDPROC(cpu_resume_mmu) |
68 | .popsection | ||
65 | cpu_resume_after_mmu: | 69 | cpu_resume_after_mmu: |
66 | bl cpu_init @ restore the und/abt/irq banked regs | 70 | bl cpu_init @ restore the und/abt/irq banked regs |
67 | mov r0, #0 @ return zero on success | 71 | mov r0, #0 @ return zero on success |
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index ef5640b9e218..57db122a4f62 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/cpu.h> | 31 | #include <asm/cpu.h> |
32 | #include <asm/cputype.h> | 32 | #include <asm/cputype.h> |
33 | #include <asm/exception.h> | 33 | #include <asm/exception.h> |
34 | #include <asm/idmap.h> | ||
34 | #include <asm/topology.h> | 35 | #include <asm/topology.h> |
35 | #include <asm/mmu_context.h> | 36 | #include <asm/mmu_context.h> |
36 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
@@ -61,7 +62,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
61 | { | 62 | { |
62 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); | 63 | struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu); |
63 | struct task_struct *idle = ci->idle; | 64 | struct task_struct *idle = ci->idle; |
64 | pgd_t *pgd; | ||
65 | int ret; | 65 | int ret; |
66 | 66 | ||
67 | /* | 67 | /* |
@@ -84,29 +84,11 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
84 | } | 84 | } |
85 | 85 | ||
86 | /* | 86 | /* |
87 | * Allocate initial page tables to allow the new CPU to | ||
88 | * enable the MMU safely. This essentially means a set | ||
89 | * of our "standard" page tables, with the addition of | ||
90 | * a 1:1 mapping for the physical address of the kernel. | ||
91 | */ | ||
92 | pgd = pgd_alloc(&init_mm); | ||
93 | if (!pgd) | ||
94 | return -ENOMEM; | ||
95 | |||
96 | if (PHYS_OFFSET != PAGE_OFFSET) { | ||
97 | #ifndef CONFIG_HOTPLUG_CPU | ||
98 | identity_mapping_add(pgd, __pa(__init_begin), __pa(__init_end)); | ||
99 | #endif | ||
100 | identity_mapping_add(pgd, __pa(_stext), __pa(_etext)); | ||
101 | identity_mapping_add(pgd, __pa(_sdata), __pa(_edata)); | ||
102 | } | ||
103 | |||
104 | /* | ||
105 | * We need to tell the secondary core where to find | 87 | * We need to tell the secondary core where to find |
106 | * its stack and the page tables. | 88 | * its stack and the page tables. |
107 | */ | 89 | */ |
108 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; | 90 | secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; |
109 | secondary_data.pgdir = virt_to_phys(pgd); | 91 | secondary_data.pgdir = virt_to_phys(idmap_pgd); |
110 | secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir); | 92 | secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir); |
111 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); | 93 | __cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data)); |
112 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); | 94 | outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); |
@@ -142,16 +124,6 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
142 | secondary_data.stack = NULL; | 124 | secondary_data.stack = NULL; |
143 | secondary_data.pgdir = 0; | 125 | secondary_data.pgdir = 0; |
144 | 126 | ||
145 | if (PHYS_OFFSET != PAGE_OFFSET) { | ||
146 | #ifndef CONFIG_HOTPLUG_CPU | ||
147 | identity_mapping_del(pgd, __pa(__init_begin), __pa(__init_end)); | ||
148 | #endif | ||
149 | identity_mapping_del(pgd, __pa(_stext), __pa(_etext)); | ||
150 | identity_mapping_del(pgd, __pa(_sdata), __pa(_edata)); | ||
151 | } | ||
152 | |||
153 | pgd_free(&init_mm, pgd); | ||
154 | |||
155 | return ret; | 127 | return ret; |
156 | } | 128 | } |
157 | 129 | ||
@@ -550,6 +522,10 @@ static void ipi_cpu_stop(unsigned int cpu) | |||
550 | local_fiq_disable(); | 522 | local_fiq_disable(); |
551 | local_irq_disable(); | 523 | local_irq_disable(); |
552 | 524 | ||
525 | #ifdef CONFIG_HOTPLUG_CPU | ||
526 | platform_cpu_kill(cpu); | ||
527 | #endif | ||
528 | |||
553 | while (1) | 529 | while (1) |
554 | cpu_relax(); | 530 | cpu_relax(); |
555 | } | 531 | } |
diff --git a/arch/arm/kernel/suspend.c b/arch/arm/kernel/suspend.c index 93a22d282c16..1794cc3b0f18 100644 --- a/arch/arm/kernel/suspend.c +++ b/arch/arm/kernel/suspend.c | |||
@@ -1,13 +1,12 @@ | |||
1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
2 | 2 | ||
3 | #include <asm/idmap.h> | ||
3 | #include <asm/pgalloc.h> | 4 | #include <asm/pgalloc.h> |
4 | #include <asm/pgtable.h> | 5 | #include <asm/pgtable.h> |
5 | #include <asm/memory.h> | 6 | #include <asm/memory.h> |
6 | #include <asm/suspend.h> | 7 | #include <asm/suspend.h> |
7 | #include <asm/tlbflush.h> | 8 | #include <asm/tlbflush.h> |
8 | 9 | ||
9 | static pgd_t *suspend_pgd; | ||
10 | |||
11 | extern int __cpu_suspend(unsigned long, int (*)(unsigned long)); | 10 | extern int __cpu_suspend(unsigned long, int (*)(unsigned long)); |
12 | extern void cpu_resume_mmu(void); | 11 | extern void cpu_resume_mmu(void); |
13 | 12 | ||
@@ -21,7 +20,7 @@ void __cpu_suspend_save(u32 *ptr, u32 ptrsz, u32 sp, u32 *save_ptr) | |||
21 | *save_ptr = virt_to_phys(ptr); | 20 | *save_ptr = virt_to_phys(ptr); |
22 | 21 | ||
23 | /* This must correspond to the LDM in cpu_resume() assembly */ | 22 | /* This must correspond to the LDM in cpu_resume() assembly */ |
24 | *ptr++ = virt_to_phys(suspend_pgd); | 23 | *ptr++ = virt_to_phys(idmap_pgd); |
25 | *ptr++ = sp; | 24 | *ptr++ = sp; |
26 | *ptr++ = virt_to_phys(cpu_do_resume); | 25 | *ptr++ = virt_to_phys(cpu_do_resume); |
27 | 26 | ||
@@ -42,7 +41,7 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
42 | struct mm_struct *mm = current->active_mm; | 41 | struct mm_struct *mm = current->active_mm; |
43 | int ret; | 42 | int ret; |
44 | 43 | ||
45 | if (!suspend_pgd) | 44 | if (!idmap_pgd) |
46 | return -EINVAL; | 45 | return -EINVAL; |
47 | 46 | ||
48 | /* | 47 | /* |
@@ -59,14 +58,3 @@ int cpu_suspend(unsigned long arg, int (*fn)(unsigned long)) | |||
59 | 58 | ||
60 | return ret; | 59 | return ret; |
61 | } | 60 | } |
62 | |||
63 | static int __init cpu_suspend_init(void) | ||
64 | { | ||
65 | suspend_pgd = pgd_alloc(&init_mm); | ||
66 | if (suspend_pgd) { | ||
67 | unsigned long addr = virt_to_phys(cpu_resume_mmu); | ||
68 | identity_mapping_add(suspend_pgd, addr, addr + SECTION_SIZE); | ||
69 | } | ||
70 | return suspend_pgd ? 0 : -ENOMEM; | ||
71 | } | ||
72 | core_initcall(cpu_suspend_init); | ||
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 20b3041e0860..f76e75548670 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -13,6 +13,12 @@ | |||
13 | *(.proc.info.init) \ | 13 | *(.proc.info.init) \ |
14 | VMLINUX_SYMBOL(__proc_info_end) = .; | 14 | VMLINUX_SYMBOL(__proc_info_end) = .; |
15 | 15 | ||
16 | #define IDMAP_TEXT \ | ||
17 | ALIGN_FUNCTION(); \ | ||
18 | VMLINUX_SYMBOL(__idmap_text_start) = .; \ | ||
19 | *(.idmap.text) \ | ||
20 | VMLINUX_SYMBOL(__idmap_text_end) = .; | ||
21 | |||
16 | #ifdef CONFIG_HOTPLUG_CPU | 22 | #ifdef CONFIG_HOTPLUG_CPU |
17 | #define ARM_CPU_DISCARD(x) | 23 | #define ARM_CPU_DISCARD(x) |
18 | #define ARM_CPU_KEEP(x) x | 24 | #define ARM_CPU_KEEP(x) x |
@@ -92,6 +98,7 @@ SECTIONS | |||
92 | SCHED_TEXT | 98 | SCHED_TEXT |
93 | LOCK_TEXT | 99 | LOCK_TEXT |
94 | KPROBES_TEXT | 100 | KPROBES_TEXT |
101 | IDMAP_TEXT | ||
95 | #ifdef CONFIG_MMU | 102 | #ifdef CONFIG_MMU |
96 | *(.fixup) | 103 | *(.fixup) |
97 | #endif | 104 | #endif |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index cf73a7f742dd..0ade0acc1ed9 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -13,7 +13,8 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | |||
13 | testchangebit.o testclearbit.o testsetbit.o \ | 13 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
15 | ucmpdi2.o lib1funcs.o div64.o \ | 15 | ucmpdi2.o lib1funcs.o div64.o \ |
16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o | 16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o \ |
17 | call_with_stack.o | ||
17 | 18 | ||
18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o | 19 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o |
19 | 20 | ||
diff --git a/arch/arm/lib/call_with_stack.S b/arch/arm/lib/call_with_stack.S new file mode 100644 index 000000000000..916c80f13ae7 --- /dev/null +++ b/arch/arm/lib/call_with_stack.S | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * arch/arm/lib/call_with_stack.S | ||
3 | * | ||
4 | * Copyright (C) 2011 ARM Ltd. | ||
5 | * Written by Will Deacon <will.deacon@arm.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
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 | |||
21 | #include <linux/linkage.h> | ||
22 | #include <asm/assembler.h> | ||
23 | |||
24 | /* | ||
25 | * void call_with_stack(void (*fn)(void *), void *arg, void *sp) | ||
26 | * | ||
27 | * Change the stack to that pointed at by sp, then invoke fn(arg) with | ||
28 | * the new stack. | ||
29 | */ | ||
30 | ENTRY(call_with_stack) | ||
31 | str sp, [r2, #-4]! | ||
32 | str lr, [r2, #-4]! | ||
33 | |||
34 | mov sp, r2 | ||
35 | mov r2, r0 | ||
36 | mov r0, r1 | ||
37 | |||
38 | adr lr, BSYM(1f) | ||
39 | mov pc, r2 | ||
40 | |||
41 | 1: ldr lr, [sp] | ||
42 | ldr sp, [sp, #4] | ||
43 | mov pc, lr | ||
44 | ENDPROC(call_with_stack) | ||
diff --git a/arch/arm/mach-at91/include/mach/io.h b/arch/arm/mach-at91/include/mach/io.h index 4298e7806c76..4ca09ef7ca29 100644 --- a/arch/arm/mach-at91/include/mach/io.h +++ b/arch/arm/mach-at91/include/mach/io.h | |||
@@ -30,14 +30,6 @@ | |||
30 | 30 | ||
31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
32 | 32 | ||
33 | #ifndef CONFIG_ARCH_AT91X40 | ||
34 | #define __arch_ioremap at91_ioremap | ||
35 | #define __arch_iounmap at91_iounmap | ||
36 | #endif | ||
37 | |||
38 | void __iomem *at91_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
39 | void at91_iounmap(volatile void __iomem *addr); | ||
40 | |||
41 | static inline unsigned int at91_sys_read(unsigned int reg_offset) | 33 | static inline unsigned int at91_sys_read(unsigned int reg_offset) |
42 | { | 34 | { |
43 | void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; | 35 | void __iomem *addr = (void __iomem *)AT91_VA_BASE_SYS; |
diff --git a/arch/arm/mach-at91/include/mach/vmalloc.h b/arch/arm/mach-at91/include/mach/vmalloc.h deleted file mode 100644 index 8e4a1bd0ab1d..000000000000 --- a/arch/arm/mach-at91/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-at91/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 SAN People | ||
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 | |||
21 | #ifndef __ASM_ARCH_VMALLOC_H | ||
22 | #define __ASM_ARCH_VMALLOC_H | ||
23 | |||
24 | #include <mach/hardware.h> | ||
25 | |||
26 | #define VMALLOC_END (AT91_VIRT_BASE & PGDIR_MASK) | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c index aa64294c7db3..cf98a8f94dc5 100644 --- a/arch/arm/mach-at91/setup.c +++ b/arch/arm/mach-at91/setup.c | |||
@@ -73,24 +73,6 @@ static struct map_desc at91_io_desc __initdata = { | |||
73 | .type = MT_DEVICE, | 73 | .type = MT_DEVICE, |
74 | }; | 74 | }; |
75 | 75 | ||
76 | void __iomem *at91_ioremap(unsigned long p, size_t size, unsigned int type) | ||
77 | { | ||
78 | if (p >= AT91_BASE_SYS && p <= (AT91_BASE_SYS + SZ_16K - 1)) | ||
79 | return (void __iomem *)AT91_IO_P2V(p); | ||
80 | |||
81 | return __arm_ioremap_caller(p, size, type, __builtin_return_address(0)); | ||
82 | } | ||
83 | EXPORT_SYMBOL(at91_ioremap); | ||
84 | |||
85 | void at91_iounmap(volatile void __iomem *addr) | ||
86 | { | ||
87 | unsigned long virt = (unsigned long)addr; | ||
88 | |||
89 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
90 | __iounmap(addr); | ||
91 | } | ||
92 | EXPORT_SYMBOL(at91_iounmap); | ||
93 | |||
94 | #define AT91_DBGU0 0xfffff200 | 76 | #define AT91_DBGU0 0xfffff200 |
95 | #define AT91_DBGU1 0xffffee00 | 77 | #define AT91_DBGU1 0xffffee00 |
96 | 78 | ||
diff --git a/arch/arm/mach-bcmring/dma.c b/arch/arm/mach-bcmring/dma.c index f4d4d6d174d0..1a1a27dd5654 100644 --- a/arch/arm/mach-bcmring/dma.c +++ b/arch/arm/mach-bcmring/dma.c | |||
@@ -1615,7 +1615,7 @@ DMA_MemType_t dma_mem_type(void *addr) | |||
1615 | { | 1615 | { |
1616 | unsigned long addrVal = (unsigned long)addr; | 1616 | unsigned long addrVal = (unsigned long)addr; |
1617 | 1617 | ||
1618 | if (addrVal >= VMALLOC_END) { | 1618 | if (addrVal >= CONSISTENT_BASE) { |
1619 | /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */ | 1619 | /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */ |
1620 | 1620 | ||
1621 | /* dma_alloc_xxx pages are physically and virtually contiguous */ | 1621 | /* dma_alloc_xxx pages are physically and virtually contiguous */ |
diff --git a/arch/arm/mach-bcmring/include/mach/vmalloc.h b/arch/arm/mach-bcmring/include/mach/vmalloc.h deleted file mode 100644 index 7397bd7817d9..000000000000 --- a/arch/arm/mach-bcmring/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Copyright (C) 2000 Russell King. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | |||
20 | /* | ||
21 | * Move VMALLOC_END to 0xf0000000 so that the vm space can range from | ||
22 | * 0xe0000000 to 0xefffffff. This gives us 256 MB of vm space and handles | ||
23 | * larger physical memory designs better. | ||
24 | */ | ||
25 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-clps711x/Makefile b/arch/arm/mach-clps711x/Makefile index 4a197315f0cf..f2f0256232e3 100644 --- a/arch/arm/mach-clps711x/Makefile +++ b/arch/arm/mach-clps711x/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # Object file lists. | 5 | # Object file lists. |
6 | 6 | ||
7 | obj-y := irq.o mm.o time.o | 7 | obj-y := common.o |
8 | obj-m := | 8 | obj-m := |
9 | obj-n := | 9 | obj-n := |
10 | obj- := | 10 | obj- := |
diff --git a/arch/arm/mach-clps711x/irq.c b/arch/arm/mach-clps711x/common.c index c2eceee645e3..ced2a4e406f4 100644 --- a/arch/arm/mach-clps711x/irq.c +++ b/arch/arm/mach-clps711x/common.c | |||
@@ -1,7 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-clps711x/irq.c | 2 | * linux/arch/arm/mach-clps711x/core.c |
3 | * | 3 | * |
4 | * Copyright (C) 2000 Deep Blue Solutions Ltd. | 4 | * Core support for the CLPS711x-based machines. |
5 | * | ||
6 | * Copyright (C) 2001,2011 Deep Blue Solutions Ltd | ||
5 | * | 7 | * |
6 | * This program is free software; you can redistribute it and/or modify | 8 | * 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 | 9 | * it under the terms of the GNU General Public License as published by |
@@ -17,16 +19,42 @@ | |||
17 | * along with this program; if not, write to the Free Software | 19 | * along with this program; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ | 21 | */ |
22 | #include <linux/kernel.h> | ||
23 | #include <linux/mm.h> | ||
20 | #include <linux/init.h> | 24 | #include <linux/init.h> |
21 | #include <linux/list.h> | 25 | #include <linux/interrupt.h> |
22 | #include <linux/io.h> | 26 | #include <linux/io.h> |
27 | #include <linux/irq.h> | ||
28 | #include <linux/sched.h> | ||
29 | #include <linux/timex.h> | ||
23 | 30 | ||
24 | #include <asm/mach/irq.h> | 31 | #include <asm/sizes.h> |
25 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
26 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
27 | 34 | #include <asm/leds.h> | |
35 | #include <asm/pgtable.h> | ||
36 | #include <asm/page.h> | ||
37 | #include <asm/mach/map.h> | ||
38 | #include <asm/mach/time.h> | ||
28 | #include <asm/hardware/clps7111.h> | 39 | #include <asm/hardware/clps7111.h> |
29 | 40 | ||
41 | /* | ||
42 | * This maps the generic CLPS711x registers | ||
43 | */ | ||
44 | static struct map_desc clps711x_io_desc[] __initdata = { | ||
45 | { | ||
46 | .virtual = CLPS7111_VIRT_BASE, | ||
47 | .pfn = __phys_to_pfn(CLPS7111_PHYS_BASE), | ||
48 | .length = SZ_1M, | ||
49 | .type = MT_DEVICE | ||
50 | } | ||
51 | }; | ||
52 | |||
53 | void __init clps711x_map_io(void) | ||
54 | { | ||
55 | iotable_init(clps711x_io_desc, ARRAY_SIZE(clps711x_io_desc)); | ||
56 | } | ||
57 | |||
30 | static void int1_mask(struct irq_data *d) | 58 | static void int1_mask(struct irq_data *d) |
31 | { | 59 | { |
32 | u32 intmr1; | 60 | u32 intmr1; |
@@ -112,15 +140,15 @@ void __init clps711x_init_irq(void) | |||
112 | 140 | ||
113 | for (i = 0; i < NR_IRQS; i++) { | 141 | for (i = 0; i < NR_IRQS; i++) { |
114 | if (INT1_IRQS & (1 << i)) { | 142 | if (INT1_IRQS & (1 << i)) { |
115 | irq_set_chip_and_handler(i, &int1_chip, | 143 | irq_set_chip_and_handler(i, &int1_chip, |
116 | handle_level_irq); | 144 | handle_level_irq); |
117 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | 145 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); |
118 | } | 146 | } |
119 | if (INT2_IRQS & (1 << i)) { | 147 | if (INT2_IRQS & (1 << i)) { |
120 | irq_set_chip_and_handler(i, &int2_chip, | 148 | irq_set_chip_and_handler(i, &int2_chip, |
121 | handle_level_irq); | 149 | handle_level_irq); |
122 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | 150 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); |
123 | } | 151 | } |
124 | } | 152 | } |
125 | 153 | ||
126 | /* | 154 | /* |
@@ -141,3 +169,54 @@ void __init clps711x_init_irq(void) | |||
141 | clps_writel(0, SYNCIO); | 169 | clps_writel(0, SYNCIO); |
142 | clps_writel(0, KBDEOI); | 170 | clps_writel(0, KBDEOI); |
143 | } | 171 | } |
172 | |||
173 | /* | ||
174 | * gettimeoffset() returns time since last timer tick, in usecs. | ||
175 | * | ||
176 | * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy. | ||
177 | * 'tick' is usecs per jiffy. | ||
178 | */ | ||
179 | static unsigned long clps711x_gettimeoffset(void) | ||
180 | { | ||
181 | unsigned long hwticks; | ||
182 | hwticks = LATCH - (clps_readl(TC2D) & 0xffff); /* since last underflow */ | ||
183 | return (hwticks * (tick_nsec / 1000)) / LATCH; | ||
184 | } | ||
185 | |||
186 | /* | ||
187 | * IRQ handler for the timer | ||
188 | */ | ||
189 | static irqreturn_t p720t_timer_interrupt(int irq, void *dev_id) | ||
190 | { | ||
191 | timer_tick(); | ||
192 | return IRQ_HANDLED; | ||
193 | } | ||
194 | |||
195 | static struct irqaction clps711x_timer_irq = { | ||
196 | .name = "CLPS711x Timer Tick", | ||
197 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
198 | .handler = p720t_timer_interrupt, | ||
199 | }; | ||
200 | |||
201 | static void __init clps711x_timer_init(void) | ||
202 | { | ||
203 | struct timespec tv; | ||
204 | unsigned int syscon; | ||
205 | |||
206 | syscon = clps_readl(SYSCON1); | ||
207 | syscon |= SYSCON1_TC2S | SYSCON1_TC2M; | ||
208 | clps_writel(syscon, SYSCON1); | ||
209 | |||
210 | clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */ | ||
211 | |||
212 | setup_irq(IRQ_TC2OI, &clps711x_timer_irq); | ||
213 | |||
214 | tv.tv_nsec = 0; | ||
215 | tv.tv_sec = clps_readl(RTCDR); | ||
216 | do_settimeofday(&tv); | ||
217 | } | ||
218 | |||
219 | struct sys_timer clps711x_timer = { | ||
220 | .init = clps711x_timer_init, | ||
221 | .offset = clps711x_gettimeoffset, | ||
222 | }; | ||
diff --git a/arch/arm/mach-clps711x/include/mach/system.h b/arch/arm/mach-clps711x/include/mach/system.h index f916cd7a477d..6c119937d398 100644 --- a/arch/arm/mach-clps711x/include/mach/system.h +++ b/arch/arm/mach-clps711x/include/mach/system.h | |||
@@ -34,7 +34,7 @@ static inline void arch_idle(void) | |||
34 | 34 | ||
35 | static inline void arch_reset(char mode, const char *cmd) | 35 | static inline void arch_reset(char mode, const char *cmd) |
36 | { | 36 | { |
37 | cpu_reset(0); | 37 | soft_restart(0); |
38 | } | 38 | } |
39 | 39 | ||
40 | #endif | 40 | #endif |
diff --git a/arch/arm/mach-clps711x/include/mach/vmalloc.h b/arch/arm/mach-clps711x/include/mach/vmalloc.h deleted file mode 100644 index 467b96137e47..000000000000 --- a/arch/arm/mach-clps711x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-clps711x/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 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 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 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-clps711x/mm.c b/arch/arm/mach-clps711x/mm.c deleted file mode 100644 index 986592176767..000000000000 --- a/arch/arm/mach-clps711x/mm.c +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-clps711x/mm.c | ||
3 | * | ||
4 | * Generic MM setup for the CLPS711x-based machines. | ||
5 | * | ||
6 | * Copyright (C) 2001 Deep Blue Solutions Ltd | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/mm.h> | ||
24 | #include <linux/init.h> | ||
25 | |||
26 | #include <asm/sizes.h> | ||
27 | #include <mach/hardware.h> | ||
28 | #include <asm/pgtable.h> | ||
29 | #include <asm/page.h> | ||
30 | #include <asm/mach/map.h> | ||
31 | #include <asm/hardware/clps7111.h> | ||
32 | |||
33 | /* | ||
34 | * This maps the generic CLPS711x registers | ||
35 | */ | ||
36 | static struct map_desc clps711x_io_desc[] __initdata = { | ||
37 | { | ||
38 | .virtual = CLPS7111_VIRT_BASE, | ||
39 | .pfn = __phys_to_pfn(CLPS7111_PHYS_BASE), | ||
40 | .length = SZ_1M, | ||
41 | .type = MT_DEVICE | ||
42 | } | ||
43 | }; | ||
44 | |||
45 | void __init clps711x_map_io(void) | ||
46 | { | ||
47 | iotable_init(clps711x_io_desc, ARRAY_SIZE(clps711x_io_desc)); | ||
48 | } | ||
diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c deleted file mode 100644 index d581ef0bcd24..000000000000 --- a/arch/arm/mach-clps711x/time.c +++ /dev/null | |||
@@ -1,84 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-clps711x/time.c | ||
3 | * | ||
4 | * Copyright (C) 2001 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 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | #include <linux/timex.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/irq.h> | ||
23 | #include <linux/sched.h> | ||
24 | #include <linux/io.h> | ||
25 | |||
26 | #include <mach/hardware.h> | ||
27 | #include <asm/irq.h> | ||
28 | #include <asm/leds.h> | ||
29 | #include <asm/hardware/clps7111.h> | ||
30 | |||
31 | #include <asm/mach/time.h> | ||
32 | |||
33 | |||
34 | /* | ||
35 | * gettimeoffset() returns time since last timer tick, in usecs. | ||
36 | * | ||
37 | * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy. | ||
38 | * 'tick' is usecs per jiffy. | ||
39 | */ | ||
40 | static unsigned long clps711x_gettimeoffset(void) | ||
41 | { | ||
42 | unsigned long hwticks; | ||
43 | hwticks = LATCH - (clps_readl(TC2D) & 0xffff); /* since last underflow */ | ||
44 | return (hwticks * (tick_nsec / 1000)) / LATCH; | ||
45 | } | ||
46 | |||
47 | /* | ||
48 | * IRQ handler for the timer | ||
49 | */ | ||
50 | static irqreturn_t | ||
51 | p720t_timer_interrupt(int irq, void *dev_id) | ||
52 | { | ||
53 | timer_tick(); | ||
54 | return IRQ_HANDLED; | ||
55 | } | ||
56 | |||
57 | static struct irqaction clps711x_timer_irq = { | ||
58 | .name = "CLPS711x Timer Tick", | ||
59 | .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, | ||
60 | .handler = p720t_timer_interrupt, | ||
61 | }; | ||
62 | |||
63 | static void __init clps711x_timer_init(void) | ||
64 | { | ||
65 | struct timespec tv; | ||
66 | unsigned int syscon; | ||
67 | |||
68 | syscon = clps_readl(SYSCON1); | ||
69 | syscon |= SYSCON1_TC2S | SYSCON1_TC2M; | ||
70 | clps_writel(syscon, SYSCON1); | ||
71 | |||
72 | clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */ | ||
73 | |||
74 | setup_irq(IRQ_TC2OI, &clps711x_timer_irq); | ||
75 | |||
76 | tv.tv_nsec = 0; | ||
77 | tv.tv_sec = clps_readl(RTCDR); | ||
78 | do_settimeofday(&tv); | ||
79 | } | ||
80 | |||
81 | struct sys_timer clps711x_timer = { | ||
82 | .init = clps711x_timer_init, | ||
83 | .offset = clps711x_gettimeoffset, | ||
84 | }; | ||
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c index 55f7b4b08ab9..594852fe24cc 100644 --- a/arch/arm/mach-cns3xxx/cns3420vb.c +++ b/arch/arm/mach-cns3xxx/cns3420vb.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/mtd/partitions.h> | 26 | #include <linux/mtd/partitions.h> |
27 | #include <asm/setup.h> | 27 | #include <asm/setup.h> |
28 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
29 | #include <asm/hardware/gic.h> | ||
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
31 | #include <asm/mach/time.h> | 32 | #include <asm/mach/time.h> |
@@ -201,5 +202,6 @@ MACHINE_START(CNS3420VB, "Cavium Networks CNS3420 Validation Board") | |||
201 | .map_io = cns3420_map_io, | 202 | .map_io = cns3420_map_io, |
202 | .init_irq = cns3xxx_init_irq, | 203 | .init_irq = cns3xxx_init_irq, |
203 | .timer = &cns3xxx_timer, | 204 | .timer = &cns3xxx_timer, |
205 | .handle_irq = gic_handle_irq, | ||
204 | .init_machine = cns3420_init, | 206 | .init_machine = cns3420_init, |
205 | MACHINE_END | 207 | MACHINE_END |
diff --git a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S index d87bfc397d39..01c57df5f716 100644 --- a/arch/arm/mach-cns3xxx/include/mach/entry-macro.S +++ b/arch/arm/mach-cns3xxx/include/mach/entry-macro.S | |||
@@ -8,8 +8,6 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | |||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
15 | 13 | ||
diff --git a/arch/arm/mach-cns3xxx/include/mach/vmalloc.h b/arch/arm/mach-cns3xxx/include/mach/vmalloc.h deleted file mode 100644 index 1dd231d2f772..000000000000 --- a/arch/arm/mach-cns3xxx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2000 Russell King. | ||
3 | * Copyright 2003 ARM Limited | ||
4 | * Copyright 2008 Cavium Networks | ||
5 | * | ||
6 | * This file 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 | |||
11 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 495e31306fc0..2db78bd5c835 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | # Common objects | 6 | # Common objects |
7 | obj-y := time.o clock.o serial.o io.o psc.o \ | 7 | obj-y := time.o clock.o serial.o psc.o \ |
8 | dma.o usb.o common.o sram.o aemif.o | 8 | dma.o usb.o common.o sram.o aemif.o |
9 | 9 | ||
10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o | 10 | obj-$(CONFIG_DAVINCI_MUX) += mux.o |
diff --git a/arch/arm/mach-davinci/include/mach/io.h b/arch/arm/mach-davinci/include/mach/io.h index d1b954955c12..b2267d1e1a71 100644 --- a/arch/arm/mach-davinci/include/mach/io.h +++ b/arch/arm/mach-davinci/include/mach/io.h | |||
@@ -21,12 +21,4 @@ | |||
21 | #define __mem_pci(a) (a) | 21 | #define __mem_pci(a) (a) |
22 | #define __mem_isa(a) (a) | 22 | #define __mem_isa(a) (a) |
23 | 23 | ||
24 | #ifndef __ASSEMBLER__ | ||
25 | #define __arch_ioremap davinci_ioremap | ||
26 | #define __arch_iounmap davinci_iounmap | ||
27 | |||
28 | void __iomem *davinci_ioremap(unsigned long phys, size_t size, | ||
29 | unsigned int type); | ||
30 | void davinci_iounmap(volatile void __iomem *addr); | ||
31 | #endif | ||
32 | #endif /* __ASM_ARCH_IO_H */ | 24 | #endif /* __ASM_ARCH_IO_H */ |
diff --git a/arch/arm/mach-davinci/include/mach/vmalloc.h b/arch/arm/mach-davinci/include/mach/vmalloc.h deleted file mode 100644 index d49646a8e206..000000000000 --- a/arch/arm/mach-davinci/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * DaVinci vmalloc definitions | ||
3 | * | ||
4 | * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com> | ||
5 | * | ||
6 | * 2007 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | #include <mach/hardware.h> | ||
12 | |||
13 | /* Allow vmalloc range until the IO virtual range minus a 2M "hole" */ | ||
14 | #define VMALLOC_END (IO_VIRT - (2<<20)) | ||
diff --git a/arch/arm/mach-davinci/io.c b/arch/arm/mach-davinci/io.c deleted file mode 100644 index 8ea60a8b2495..000000000000 --- a/arch/arm/mach-davinci/io.c +++ /dev/null | |||
@@ -1,48 +0,0 @@ | |||
1 | /* | ||
2 | * DaVinci I/O mapping code | ||
3 | * | ||
4 | * Copyright (C) 2005-2006 Texas Instruments | ||
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 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/io.h> | ||
13 | |||
14 | #include <asm/tlb.h> | ||
15 | #include <asm/mach/map.h> | ||
16 | |||
17 | #include <mach/common.h> | ||
18 | |||
19 | /* | ||
20 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
21 | */ | ||
22 | void __iomem *davinci_ioremap(unsigned long p, size_t size, unsigned int type) | ||
23 | { | ||
24 | struct map_desc *desc = davinci_soc_info.io_desc; | ||
25 | int desc_num = davinci_soc_info.io_desc_num; | ||
26 | int i; | ||
27 | |||
28 | for (i = 0; i < desc_num; i++, desc++) { | ||
29 | unsigned long iophys = __pfn_to_phys(desc->pfn); | ||
30 | unsigned long iosize = desc->length; | ||
31 | |||
32 | if (p >= iophys && (p + size) <= (iophys + iosize)) | ||
33 | return __io(desc->virtual + p - iophys); | ||
34 | } | ||
35 | |||
36 | return __arm_ioremap_caller(p, size, type, | ||
37 | __builtin_return_address(0)); | ||
38 | } | ||
39 | EXPORT_SYMBOL(davinci_ioremap); | ||
40 | |||
41 | void davinci_iounmap(volatile void __iomem *addr) | ||
42 | { | ||
43 | unsigned long virt = (unsigned long)addr; | ||
44 | |||
45 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
46 | __iounmap(addr); | ||
47 | } | ||
48 | EXPORT_SYMBOL(davinci_iounmap); | ||
diff --git a/arch/arm/mach-dove/include/mach/dove.h b/arch/arm/mach-dove/include/mach/dove.h index b20ec9af7882..ad1165d488c1 100644 --- a/arch/arm/mach-dove/include/mach/dove.h +++ b/arch/arm/mach-dove/include/mach/dove.h | |||
@@ -11,8 +11,6 @@ | |||
11 | #ifndef __ASM_ARCH_DOVE_H | 11 | #ifndef __ASM_ARCH_DOVE_H |
12 | #define __ASM_ARCH_DOVE_H | 12 | #define __ASM_ARCH_DOVE_H |
13 | 13 | ||
14 | #include <mach/vmalloc.h> | ||
15 | |||
16 | /* | 14 | /* |
17 | * Marvell Dove address maps. | 15 | * Marvell Dove address maps. |
18 | * | 16 | * |
diff --git a/arch/arm/mach-dove/include/mach/vmalloc.h b/arch/arm/mach-dove/include/mach/vmalloc.h deleted file mode 100644 index a28792cf761e..000000000000 --- a/arch/arm/mach-dove/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-dove/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfd800000UL | ||
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index d0ce8abdd4b6..ce3ed244c4b0 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c | |||
@@ -283,7 +283,7 @@ MACHINE_START(EBSA110, "EBSA110") | |||
283 | .atag_offset = 0x400, | 283 | .atag_offset = 0x400, |
284 | .reserve_lp0 = 1, | 284 | .reserve_lp0 = 1, |
285 | .reserve_lp2 = 1, | 285 | .reserve_lp2 = 1, |
286 | .soft_reboot = 1, | 286 | .restart_mode = 's', |
287 | .map_io = ebsa110_map_io, | 287 | .map_io = ebsa110_map_io, |
288 | .init_irq = ebsa110_init_irq, | 288 | .init_irq = ebsa110_init_irq, |
289 | .timer = &ebsa110_timer, | 289 | .timer = &ebsa110_timer, |
diff --git a/arch/arm/mach-ebsa110/include/mach/system.h b/arch/arm/mach-ebsa110/include/mach/system.h index 9a26245bf1fc..0d5df72a03f6 100644 --- a/arch/arm/mach-ebsa110/include/mach/system.h +++ b/arch/arm/mach-ebsa110/include/mach/system.h | |||
@@ -34,6 +34,6 @@ static inline void arch_idle(void) | |||
34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); | 34 | asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc"); |
35 | } | 35 | } |
36 | 36 | ||
37 | #define arch_reset(mode, cmd) cpu_reset(0x80000000) | 37 | #define arch_reset(mode, cmd) soft_restart(0x80000000) |
38 | 38 | ||
39 | #endif | 39 | #endif |
diff --git a/arch/arm/mach-ebsa110/include/mach/vmalloc.h b/arch/arm/mach-ebsa110/include/mach/vmalloc.h deleted file mode 100644 index ea141b7a3e03..000000000000 --- a/arch/arm/mach-ebsa110/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ebsa110/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 1998 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 | #define VMALLOC_END 0xdf000000UL | ||
diff --git a/arch/arm/mach-ep93xx/adssphere.c b/arch/arm/mach-ep93xx/adssphere.c index 0713448206a5..d9b0ea2ba4d8 100644 --- a/arch/arm/mach-ep93xx/adssphere.c +++ b/arch/arm/mach-ep93xx/adssphere.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #include <asm/hardware/vic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | 22 | ||
@@ -36,6 +37,7 @@ MACHINE_START(ADSSPHERE, "ADS Sphere board") | |||
36 | .atag_offset = 0x100, | 37 | .atag_offset = 0x100, |
37 | .map_io = ep93xx_map_io, | 38 | .map_io = ep93xx_map_io, |
38 | .init_irq = ep93xx_init_irq, | 39 | .init_irq = ep93xx_init_irq, |
40 | .handle_irq = vic_handle_irq, | ||
39 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
40 | .init_machine = adssphere_init_machine, | 42 | .init_machine = adssphere_init_machine, |
41 | MACHINE_END | 43 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index 70ef8c527d27..9bbae0835f27 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <mach/ep93xx_spi.h> | 39 | #include <mach/ep93xx_spi.h> |
40 | #include <mach/gpio-ep93xx.h> | 40 | #include <mach/gpio-ep93xx.h> |
41 | 41 | ||
42 | #include <asm/hardware/vic.h> | ||
42 | #include <asm/mach-types.h> | 43 | #include <asm/mach-types.h> |
43 | #include <asm/mach/arch.h> | 44 | #include <asm/mach/arch.h> |
44 | 45 | ||
@@ -250,6 +251,7 @@ MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board") | |||
250 | .atag_offset = 0x100, | 251 | .atag_offset = 0x100, |
251 | .map_io = ep93xx_map_io, | 252 | .map_io = ep93xx_map_io, |
252 | .init_irq = ep93xx_init_irq, | 253 | .init_irq = ep93xx_init_irq, |
254 | .handle_irq = vic_handle_irq, | ||
253 | .timer = &ep93xx_timer, | 255 | .timer = &ep93xx_timer, |
254 | .init_machine = edb93xx_init_machine, | 256 | .init_machine = edb93xx_init_machine, |
255 | MACHINE_END | 257 | MACHINE_END |
@@ -261,6 +263,7 @@ MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board") | |||
261 | .atag_offset = 0x100, | 263 | .atag_offset = 0x100, |
262 | .map_io = ep93xx_map_io, | 264 | .map_io = ep93xx_map_io, |
263 | .init_irq = ep93xx_init_irq, | 265 | .init_irq = ep93xx_init_irq, |
266 | .handle_irq = vic_handle_irq, | ||
264 | .timer = &ep93xx_timer, | 267 | .timer = &ep93xx_timer, |
265 | .init_machine = edb93xx_init_machine, | 268 | .init_machine = edb93xx_init_machine, |
266 | MACHINE_END | 269 | MACHINE_END |
@@ -272,6 +275,7 @@ MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board") | |||
272 | .atag_offset = 0x100, | 275 | .atag_offset = 0x100, |
273 | .map_io = ep93xx_map_io, | 276 | .map_io = ep93xx_map_io, |
274 | .init_irq = ep93xx_init_irq, | 277 | .init_irq = ep93xx_init_irq, |
278 | .handle_irq = vic_handle_irq, | ||
275 | .timer = &ep93xx_timer, | 279 | .timer = &ep93xx_timer, |
276 | .init_machine = edb93xx_init_machine, | 280 | .init_machine = edb93xx_init_machine, |
277 | MACHINE_END | 281 | MACHINE_END |
@@ -283,6 +287,7 @@ MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board") | |||
283 | .atag_offset = 0x100, | 287 | .atag_offset = 0x100, |
284 | .map_io = ep93xx_map_io, | 288 | .map_io = ep93xx_map_io, |
285 | .init_irq = ep93xx_init_irq, | 289 | .init_irq = ep93xx_init_irq, |
290 | .handle_irq = vic_handle_irq, | ||
286 | .timer = &ep93xx_timer, | 291 | .timer = &ep93xx_timer, |
287 | .init_machine = edb93xx_init_machine, | 292 | .init_machine = edb93xx_init_machine, |
288 | MACHINE_END | 293 | MACHINE_END |
@@ -294,6 +299,7 @@ MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board") | |||
294 | .atag_offset = 0x100, | 299 | .atag_offset = 0x100, |
295 | .map_io = ep93xx_map_io, | 300 | .map_io = ep93xx_map_io, |
296 | .init_irq = ep93xx_init_irq, | 301 | .init_irq = ep93xx_init_irq, |
302 | .handle_irq = vic_handle_irq, | ||
297 | .timer = &ep93xx_timer, | 303 | .timer = &ep93xx_timer, |
298 | .init_machine = edb93xx_init_machine, | 304 | .init_machine = edb93xx_init_machine, |
299 | MACHINE_END | 305 | MACHINE_END |
@@ -305,6 +311,7 @@ MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board") | |||
305 | .atag_offset = 0x100, | 311 | .atag_offset = 0x100, |
306 | .map_io = ep93xx_map_io, | 312 | .map_io = ep93xx_map_io, |
307 | .init_irq = ep93xx_init_irq, | 313 | .init_irq = ep93xx_init_irq, |
314 | .handle_irq = vic_handle_irq, | ||
308 | .timer = &ep93xx_timer, | 315 | .timer = &ep93xx_timer, |
309 | .init_machine = edb93xx_init_machine, | 316 | .init_machine = edb93xx_init_machine, |
310 | MACHINE_END | 317 | MACHINE_END |
@@ -316,6 +323,7 @@ MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board") | |||
316 | .atag_offset = 0x100, | 323 | .atag_offset = 0x100, |
317 | .map_io = ep93xx_map_io, | 324 | .map_io = ep93xx_map_io, |
318 | .init_irq = ep93xx_init_irq, | 325 | .init_irq = ep93xx_init_irq, |
326 | .handle_irq = vic_handle_irq, | ||
319 | .timer = &ep93xx_timer, | 327 | .timer = &ep93xx_timer, |
320 | .init_machine = edb93xx_init_machine, | 328 | .init_machine = edb93xx_init_machine, |
321 | MACHINE_END | 329 | MACHINE_END |
@@ -327,6 +335,7 @@ MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board") | |||
327 | .atag_offset = 0x100, | 335 | .atag_offset = 0x100, |
328 | .map_io = ep93xx_map_io, | 336 | .map_io = ep93xx_map_io, |
329 | .init_irq = ep93xx_init_irq, | 337 | .init_irq = ep93xx_init_irq, |
338 | .handle_irq = vic_handle_irq, | ||
330 | .timer = &ep93xx_timer, | 339 | .timer = &ep93xx_timer, |
331 | .init_machine = edb93xx_init_machine, | 340 | .init_machine = edb93xx_init_machine, |
332 | MACHINE_END | 341 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/gesbc9312.c b/arch/arm/mach-ep93xx/gesbc9312.c index 45ee205856f8..1dd32a7c5f15 100644 --- a/arch/arm/mach-ep93xx/gesbc9312.c +++ b/arch/arm/mach-ep93xx/gesbc9312.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | 18 | ||
19 | #include <asm/hardware/vic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | #include <asm/mach/arch.h> | 21 | #include <asm/mach/arch.h> |
21 | 22 | ||
@@ -36,6 +37,7 @@ MACHINE_START(GESBC9312, "Glomation GESBC-9312-sx") | |||
36 | .atag_offset = 0x100, | 37 | .atag_offset = 0x100, |
37 | .map_io = ep93xx_map_io, | 38 | .map_io = ep93xx_map_io, |
38 | .init_irq = ep93xx_init_irq, | 39 | .init_irq = ep93xx_init_irq, |
40 | .handle_irq = vic_handle_irq, | ||
39 | .timer = &ep93xx_timer, | 41 | .timer = &ep93xx_timer, |
40 | .init_machine = gesbc9312_init_machine, | 42 | .init_machine = gesbc9312_init_machine, |
41 | MACHINE_END | 43 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/include/mach/entry-macro.S b/arch/arm/mach-ep93xx/include/mach/entry-macro.S index 96b85e2c2c0b..9be6edcf9045 100644 --- a/arch/arm/mach-ep93xx/include/mach/entry-macro.S +++ b/arch/arm/mach-ep93xx/include/mach/entry-macro.S | |||
@@ -9,51 +9,9 @@ | |||
9 | * the Free Software Foundation; either version 2 of the License, or (at | 9 | * the Free Software Foundation; either version 2 of the License, or (at |
10 | * your option) any later version. | 10 | * your option) any later version. |
11 | */ | 11 | */ |
12 | #include <mach/ep93xx-regs.h> | ||
13 | 12 | ||
14 | .macro disable_fiq | 13 | .macro disable_fiq |
15 | .endm | 14 | .endm |
16 | 15 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 17 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | ldr \base, =(EP93XX_AHB_VIRT_BASE) | ||
25 | orr \base, \base, #0x000b0000 | ||
26 | mov \irqnr, #0 | ||
27 | ldr \irqstat, [\base] @ lower 32 interrupts | ||
28 | cmp \irqstat, #0 | ||
29 | bne 1001f | ||
30 | |||
31 | eor \base, \base, #0x00070000 | ||
32 | ldr \irqstat, [\base] @ upper 32 interrupts | ||
33 | cmp \irqstat, #0 | ||
34 | beq 1002f | ||
35 | mov \irqnr, #0x20 | ||
36 | |||
37 | 1001: | ||
38 | movs \tmp, \irqstat, lsl #16 | ||
39 | movne \irqstat, \tmp | ||
40 | addeq \irqnr, \irqnr, #16 | ||
41 | |||
42 | movs \tmp, \irqstat, lsl #8 | ||
43 | movne \irqstat, \tmp | ||
44 | addeq \irqnr, \irqnr, #8 | ||
45 | |||
46 | movs \tmp, \irqstat, lsl #4 | ||
47 | movne \irqstat, \tmp | ||
48 | addeq \irqnr, \irqnr, #4 | ||
49 | |||
50 | movs \tmp, \irqstat, lsl #2 | ||
51 | movne \irqstat, \tmp | ||
52 | addeq \irqnr, \irqnr, #2 | ||
53 | |||
54 | movs \tmp, \irqstat, lsl #1 | ||
55 | addeq \irqnr, \irqnr, #1 | ||
56 | orrs \base, \base, #1 | ||
57 | |||
58 | 1002: | ||
59 | .endm | ||
diff --git a/arch/arm/mach-ep93xx/include/mach/system.h b/arch/arm/mach-ep93xx/include/mach/system.h index 6d661fe9d66c..bdf6c4f1feef 100644 --- a/arch/arm/mach-ep93xx/include/mach/system.h +++ b/arch/arm/mach-ep93xx/include/mach/system.h | |||
@@ -11,8 +11,6 @@ static inline void arch_idle(void) | |||
11 | 11 | ||
12 | static inline void arch_reset(char mode, const char *cmd) | 12 | static inline void arch_reset(char mode, const char *cmd) |
13 | { | 13 | { |
14 | local_irq_disable(); | ||
15 | |||
16 | /* | 14 | /* |
17 | * Set then clear the SWRST bit to initiate a software reset | 15 | * Set then clear the SWRST bit to initiate a software reset |
18 | */ | 16 | */ |
diff --git a/arch/arm/mach-ep93xx/include/mach/vmalloc.h b/arch/arm/mach-ep93xx/include/mach/vmalloc.h deleted file mode 100644 index 1b3f25d03d39..000000000000 --- a/arch/arm/mach-ep93xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ep93xx/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-ep93xx/micro9.c b/arch/arm/mach-ep93xx/micro9.c index e72f7368876e..a6dae6c2e3c1 100644 --- a/arch/arm/mach-ep93xx/micro9.c +++ b/arch/arm/mach-ep93xx/micro9.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
20 | 20 | ||
21 | #include <asm/hardware/vic.h> | ||
21 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
22 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
23 | 24 | ||
@@ -80,6 +81,7 @@ MACHINE_START(MICRO9, "Contec Micro9-High") | |||
80 | .atag_offset = 0x100, | 81 | .atag_offset = 0x100, |
81 | .map_io = ep93xx_map_io, | 82 | .map_io = ep93xx_map_io, |
82 | .init_irq = ep93xx_init_irq, | 83 | .init_irq = ep93xx_init_irq, |
84 | .handle_irq = vic_handle_irq, | ||
83 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
84 | .init_machine = micro9_init_machine, | 86 | .init_machine = micro9_init_machine, |
85 | MACHINE_END | 87 | MACHINE_END |
@@ -91,6 +93,7 @@ MACHINE_START(MICRO9M, "Contec Micro9-Mid") | |||
91 | .atag_offset = 0x100, | 93 | .atag_offset = 0x100, |
92 | .map_io = ep93xx_map_io, | 94 | .map_io = ep93xx_map_io, |
93 | .init_irq = ep93xx_init_irq, | 95 | .init_irq = ep93xx_init_irq, |
96 | .handle_irq = vic_handle_irq, | ||
94 | .timer = &ep93xx_timer, | 97 | .timer = &ep93xx_timer, |
95 | .init_machine = micro9_init_machine, | 98 | .init_machine = micro9_init_machine, |
96 | MACHINE_END | 99 | MACHINE_END |
@@ -102,6 +105,7 @@ MACHINE_START(MICRO9L, "Contec Micro9-Lite") | |||
102 | .atag_offset = 0x100, | 105 | .atag_offset = 0x100, |
103 | .map_io = ep93xx_map_io, | 106 | .map_io = ep93xx_map_io, |
104 | .init_irq = ep93xx_init_irq, | 107 | .init_irq = ep93xx_init_irq, |
108 | .handle_irq = vic_handle_irq, | ||
105 | .timer = &ep93xx_timer, | 109 | .timer = &ep93xx_timer, |
106 | .init_machine = micro9_init_machine, | 110 | .init_machine = micro9_init_machine, |
107 | MACHINE_END | 111 | MACHINE_END |
@@ -113,6 +117,7 @@ MACHINE_START(MICRO9S, "Contec Micro9-Slim") | |||
113 | .atag_offset = 0x100, | 117 | .atag_offset = 0x100, |
114 | .map_io = ep93xx_map_io, | 118 | .map_io = ep93xx_map_io, |
115 | .init_irq = ep93xx_init_irq, | 119 | .init_irq = ep93xx_init_irq, |
120 | .handle_irq = vic_handle_irq, | ||
116 | .timer = &ep93xx_timer, | 121 | .timer = &ep93xx_timer, |
117 | .init_machine = micro9_init_machine, | 122 | .init_machine = micro9_init_machine, |
118 | MACHINE_END | 123 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 52e090dc9d27..40121ba8e711 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <mach/fb.h> | 25 | #include <mach/fb.h> |
26 | #include <mach/gpio-ep93xx.h> | 26 | #include <mach/gpio-ep93xx.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | 31 | ||
@@ -80,6 +81,7 @@ MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board") | |||
80 | .atag_offset = 0x100, | 81 | .atag_offset = 0x100, |
81 | .map_io = ep93xx_map_io, | 82 | .map_io = ep93xx_map_io, |
82 | .init_irq = ep93xx_init_irq, | 83 | .init_irq = ep93xx_init_irq, |
84 | .handle_irq = vic_handle_irq, | ||
83 | .timer = &ep93xx_timer, | 85 | .timer = &ep93xx_timer, |
84 | .init_machine = simone_init_machine, | 86 | .init_machine = simone_init_machine, |
85 | MACHINE_END | 87 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index 8121e3aedc0a..ec7c63ff01e2 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <mach/fb.h> | 31 | #include <mach/fb.h> |
32 | #include <mach/gpio-ep93xx.h> | 32 | #include <mach/gpio-ep93xx.h> |
33 | 33 | ||
34 | #include <asm/hardware/vic.h> | ||
34 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
36 | 37 | ||
@@ -177,6 +178,7 @@ MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15") | |||
177 | .atag_offset = 0x100, | 178 | .atag_offset = 0x100, |
178 | .map_io = ep93xx_map_io, | 179 | .map_io = ep93xx_map_io, |
179 | .init_irq = ep93xx_init_irq, | 180 | .init_irq = ep93xx_init_irq, |
181 | .handle_irq = vic_handle_irq, | ||
180 | .timer = &ep93xx_timer, | 182 | .timer = &ep93xx_timer, |
181 | .init_machine = snappercl15_init_machine, | 183 | .init_machine = snappercl15_init_machine, |
182 | MACHINE_END | 184 | MACHINE_END |
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c index 8b2f1435bcac..760384e6407d 100644 --- a/arch/arm/mach-ep93xx/ts72xx.c +++ b/arch/arm/mach-ep93xx/ts72xx.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
24 | #include <mach/ts72xx.h> | 24 | #include <mach/ts72xx.h> |
25 | 25 | ||
26 | #include <asm/hardware/vic.h> | ||
26 | #include <asm/mach-types.h> | 27 | #include <asm/mach-types.h> |
27 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
@@ -247,6 +248,7 @@ MACHINE_START(TS72XX, "Technologic Systems TS-72xx SBC") | |||
247 | .atag_offset = 0x100, | 248 | .atag_offset = 0x100, |
248 | .map_io = ts72xx_map_io, | 249 | .map_io = ts72xx_map_io, |
249 | .init_irq = ep93xx_init_irq, | 250 | .init_irq = ep93xx_init_irq, |
251 | .handle_irq = vic_handle_irq, | ||
250 | .timer = &ep93xx_timer, | 252 | .timer = &ep93xx_timer, |
251 | .init_machine = ts72xx_init_machine, | 253 | .init_machine = ts72xx_init_machine, |
252 | MACHINE_END | 254 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/cpu.c b/arch/arm/mach-exynos/cpu.c index 90ec247f3b37..22316cb31a8c 100644 --- a/arch/arm/mach-exynos/cpu.c +++ b/arch/arm/mach-exynos/cpu.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <asm/mach/irq.h> | 15 | #include <asm/mach/irq.h> |
16 | 16 | ||
17 | #include <asm/proc-fns.h> | 17 | #include <asm/proc-fns.h> |
18 | #include <asm/exception.h> | ||
18 | #include <asm/hardware/cache-l2x0.h> | 19 | #include <asm/hardware/cache-l2x0.h> |
19 | #include <asm/hardware/gic.h> | 20 | #include <asm/hardware/gic.h> |
20 | 21 | ||
@@ -33,8 +34,6 @@ | |||
33 | #include <mach/regs-irq.h> | 34 | #include <mach/regs-irq.h> |
34 | #include <mach/regs-pmu.h> | 35 | #include <mach/regs-pmu.h> |
35 | 36 | ||
36 | unsigned int gic_bank_offset __read_mostly; | ||
37 | |||
38 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, | 37 | extern int combiner_init(unsigned int combiner_nr, void __iomem *base, |
39 | unsigned int irq_start); | 38 | unsigned int irq_start); |
40 | extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); | 39 | extern void combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq); |
@@ -207,27 +206,14 @@ void __init exynos4_init_clocks(int xtal) | |||
207 | exynos4_setup_clocks(); | 206 | exynos4_setup_clocks(); |
208 | } | 207 | } |
209 | 208 | ||
210 | static void exynos4_gic_irq_fix_base(struct irq_data *d) | ||
211 | { | ||
212 | struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); | ||
213 | |||
214 | gic_data->cpu_base = S5P_VA_GIC_CPU + | ||
215 | (gic_bank_offset * smp_processor_id()); | ||
216 | |||
217 | gic_data->dist_base = S5P_VA_GIC_DIST + | ||
218 | (gic_bank_offset * smp_processor_id()); | ||
219 | } | ||
220 | |||
221 | void __init exynos4_init_irq(void) | 209 | void __init exynos4_init_irq(void) |
222 | { | 210 | { |
223 | int irq; | 211 | int irq; |
212 | unsigned int gic_bank_offset; | ||
224 | 213 | ||
225 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; | 214 | gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; |
226 | 215 | ||
227 | gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU); | 216 | gic_init_bases(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU, gic_bank_offset); |
228 | gic_arch_extn.irq_eoi = exynos4_gic_irq_fix_base; | ||
229 | gic_arch_extn.irq_unmask = exynos4_gic_irq_fix_base; | ||
230 | gic_arch_extn.irq_mask = exynos4_gic_irq_fix_base; | ||
231 | 217 | ||
232 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { | 218 | for (irq = 0; irq < MAX_COMBINER_NR; irq++) { |
233 | 219 | ||
diff --git a/arch/arm/mach-exynos/include/mach/entry-macro.S b/arch/arm/mach-exynos/include/mach/entry-macro.S index f5e9fd8e37b4..3ba4f547534b 100644 --- a/arch/arm/mach-exynos/include/mach/entry-macro.S +++ b/arch/arm/mach-exynos/include/mach/entry-macro.S | |||
@@ -9,83 +9,8 @@ | |||
9 | * warranty of any kind, whether express or implied. | 9 | * warranty of any kind, whether express or implied. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <mach/hardware.h> | ||
13 | #include <mach/map.h> | ||
14 | #include <asm/hardware/gic.h> | ||
15 | |||
16 | .macro disable_fiq | 12 | .macro disable_fiq |
17 | .endm | 13 | .endm |
18 | 14 | ||
19 | .macro get_irqnr_preamble, base, tmp | ||
20 | mov \tmp, #0 | ||
21 | |||
22 | mrc p15, 0, \base, c0, c0, 5 | ||
23 | and \base, \base, #3 | ||
24 | cmp \base, #0 | ||
25 | beq 1f | ||
26 | |||
27 | ldr \tmp, =gic_bank_offset | ||
28 | ldr \tmp, [\tmp] | ||
29 | cmp \base, #1 | ||
30 | beq 1f | ||
31 | |||
32 | cmp \base, #2 | ||
33 | addeq \tmp, \tmp, \tmp | ||
34 | addne \tmp, \tmp, \tmp, LSL #1 | ||
35 | |||
36 | 1: ldr \base, =gic_cpu_base_addr | ||
37 | ldr \base, [\base] | ||
38 | add \base, \base, \tmp | ||
39 | .endm | ||
40 | |||
41 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
42 | .endm | 16 | .endm |
43 | |||
44 | /* | ||
45 | * The interrupt numbering scheme is defined in the | ||
46 | * interrupt controller spec. To wit: | ||
47 | * | ||
48 | * Interrupts 0-15 are IPI | ||
49 | * 16-28 are reserved | ||
50 | * 29-31 are local. We allow 30 to be used for the watchdog. | ||
51 | * 32-1020 are global | ||
52 | * 1021-1022 are reserved | ||
53 | * 1023 is "spurious" (no interrupt) | ||
54 | * | ||
55 | * For now, we ignore all local interrupts so only return an interrupt if it's | ||
56 | * between 30 and 1020. The test_for_ipi routine below will pick up on IPIs. | ||
57 | * | ||
58 | * A simple read from the controller will tell us the number of the highest | ||
59 | * priority enabled interrupt. We then just need to check whether it is in the | ||
60 | * valid range for an IRQ (30-1020 inclusive). | ||
61 | */ | ||
62 | |||
63 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
64 | |||
65 | ldr \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 = src CPU, 9-0 = int # */ | ||
66 | |||
67 | ldr \tmp, =1021 | ||
68 | |||
69 | bic \irqnr, \irqstat, #0x1c00 | ||
70 | |||
71 | cmp \irqnr, #15 | ||
72 | cmpcc \irqnr, \irqnr | ||
73 | cmpne \irqnr, \tmp | ||
74 | cmpcs \irqnr, \irqnr | ||
75 | addne \irqnr, \irqnr, #32 | ||
76 | |||
77 | .endm | ||
78 | |||
79 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
80 | * register) is preserved from the macro above. | ||
81 | * If there is an IPI, we immediately signal end of interrupt on the | ||
82 | * controller, since this requires the original irqstat value which | ||
83 | * we won't easily be able to recreate later. | ||
84 | */ | ||
85 | |||
86 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
87 | bic \irqnr, \irqstat, #0x1c00 | ||
88 | cmp \irqnr, #16 | ||
89 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
90 | cmpcs \irqnr, \irqnr | ||
91 | .endm | ||
diff --git a/arch/arm/mach-exynos/include/mach/vmalloc.h b/arch/arm/mach-exynos/include/mach/vmalloc.h deleted file mode 100644 index 284330e571d2..000000000000 --- a/arch/arm/mach-exynos/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-exynos4/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
7 | * | ||
8 | * Based on arch/arm/mach-s5p6440/include/mach/vmalloc.h | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * EXYNOS4 vmalloc definition | ||
15 | */ | ||
16 | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | ||
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | ||
19 | |||
20 | #define VMALLOC_END 0xF6000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-exynos/mach-armlex4210.c b/arch/arm/mach-exynos/mach-armlex4210.c index f0ca6c157d29..49da3089249a 100644 --- a/arch/arm/mach-exynos/mach-armlex4210.c +++ b/arch/arm/mach-exynos/mach-armlex4210.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/smsc911x.h> | 16 | #include <linux/smsc911x.h> |
17 | 17 | ||
18 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
19 | #include <asm/hardware/gic.h> | ||
19 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
20 | 21 | ||
21 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
@@ -210,6 +211,7 @@ MACHINE_START(ARMLEX4210, "ARMLEX4210") | |||
210 | .atag_offset = 0x100, | 211 | .atag_offset = 0x100, |
211 | .init_irq = exynos4_init_irq, | 212 | .init_irq = exynos4_init_irq, |
212 | .map_io = armlex4210_map_io, | 213 | .map_io = armlex4210_map_io, |
214 | .handle_irq = gic_handle_irq, | ||
213 | .init_machine = armlex4210_machine_init, | 215 | .init_machine = armlex4210_machine_init, |
214 | .timer = &exynos4_timer, | 216 | .timer = &exynos4_timer, |
215 | MACHINE_END | 217 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-nuri.c b/arch/arm/mach-exynos/mach-nuri.c index 236bbe187163..5acec11821a4 100644 --- a/arch/arm/mach-exynos/mach-nuri.c +++ b/arch/arm/mach-exynos/mach-nuri.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <media/v4l2-mediabus.h> | 32 | #include <media/v4l2-mediabus.h> |
33 | 33 | ||
34 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
35 | #include <asm/hardware/gic.h> | ||
35 | #include <asm/mach-types.h> | 36 | #include <asm/mach-types.h> |
36 | 37 | ||
37 | #include <plat/adc.h> | 38 | #include <plat/adc.h> |
@@ -1333,6 +1334,7 @@ MACHINE_START(NURI, "NURI") | |||
1333 | .atag_offset = 0x100, | 1334 | .atag_offset = 0x100, |
1334 | .init_irq = exynos4_init_irq, | 1335 | .init_irq = exynos4_init_irq, |
1335 | .map_io = nuri_map_io, | 1336 | .map_io = nuri_map_io, |
1337 | .handle_irq = gic_handle_irq, | ||
1336 | .init_machine = nuri_machine_init, | 1338 | .init_machine = nuri_machine_init, |
1337 | .timer = &exynos4_timer, | 1339 | .timer = &exynos4_timer, |
1338 | .reserve = &nuri_reserve, | 1340 | .reserve = &nuri_reserve, |
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index f80b563f2be7..5561b06c38ec 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/lcd.h> | 22 | #include <linux/lcd.h> |
23 | 23 | ||
24 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
25 | #include <asm/hardware/gic.h> | ||
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | 27 | ||
27 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
@@ -694,6 +695,7 @@ MACHINE_START(ORIGEN, "ORIGEN") | |||
694 | .atag_offset = 0x100, | 695 | .atag_offset = 0x100, |
695 | .init_irq = exynos4_init_irq, | 696 | .init_irq = exynos4_init_irq, |
696 | .map_io = origen_map_io, | 697 | .map_io = origen_map_io, |
698 | .handle_irq = gic_handle_irq, | ||
697 | .init_machine = origen_machine_init, | 699 | .init_machine = origen_machine_init, |
698 | .timer = &exynos4_timer, | 700 | .timer = &exynos4_timer, |
699 | .reserve = &origen_reserve, | 701 | .reserve = &origen_reserve, |
diff --git a/arch/arm/mach-exynos/mach-smdk4x12.c b/arch/arm/mach-exynos/mach-smdk4x12.c index fcf2e0e23d53..722d82d7f217 100644 --- a/arch/arm/mach-exynos/mach-smdk4x12.c +++ b/arch/arm/mach-exynos/mach-smdk4x12.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/serial_core.h> | 21 | #include <linux/serial_core.h> |
22 | 22 | ||
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/hardware/gic.h> | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | 26 | ||
26 | #include <plat/backlight.h> | 27 | #include <plat/backlight.h> |
@@ -287,6 +288,7 @@ MACHINE_START(SMDK4212, "SMDK4212") | |||
287 | .atag_offset = 0x100, | 288 | .atag_offset = 0x100, |
288 | .init_irq = exynos4_init_irq, | 289 | .init_irq = exynos4_init_irq, |
289 | .map_io = smdk4x12_map_io, | 290 | .map_io = smdk4x12_map_io, |
291 | .handle_irq = gic_handle_irq, | ||
290 | .init_machine = smdk4x12_machine_init, | 292 | .init_machine = smdk4x12_machine_init, |
291 | .timer = &exynos4_timer, | 293 | .timer = &exynos4_timer, |
292 | MACHINE_END | 294 | MACHINE_END |
@@ -297,6 +299,7 @@ MACHINE_START(SMDK4412, "SMDK4412") | |||
297 | .atag_offset = 0x100, | 299 | .atag_offset = 0x100, |
298 | .init_irq = exynos4_init_irq, | 300 | .init_irq = exynos4_init_irq, |
299 | .map_io = smdk4x12_map_io, | 301 | .map_io = smdk4x12_map_io, |
302 | .handle_irq = gic_handle_irq, | ||
300 | .init_machine = smdk4x12_machine_init, | 303 | .init_machine = smdk4x12_machine_init, |
301 | .timer = &exynos4_timer, | 304 | .timer = &exynos4_timer, |
302 | MACHINE_END | 305 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index cec2afabe7b4..edc60b6108ed 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/pwm_backlight.h> | 21 | #include <linux/pwm_backlight.h> |
22 | 22 | ||
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/hardware/gic.h> | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | 26 | ||
26 | #include <video/platform_lcd.h> | 27 | #include <video/platform_lcd.h> |
@@ -375,6 +376,7 @@ MACHINE_START(SMDKV310, "SMDKV310") | |||
375 | .atag_offset = 0x100, | 376 | .atag_offset = 0x100, |
376 | .init_irq = exynos4_init_irq, | 377 | .init_irq = exynos4_init_irq, |
377 | .map_io = smdkv310_map_io, | 378 | .map_io = smdkv310_map_io, |
379 | .handle_irq = gic_handle_irq, | ||
378 | .init_machine = smdkv310_machine_init, | 380 | .init_machine = smdkv310_machine_init, |
379 | .timer = &exynos4_timer, | 381 | .timer = &exynos4_timer, |
380 | .reserve = &smdkv310_reserve, | 382 | .reserve = &smdkv310_reserve, |
@@ -385,6 +387,7 @@ MACHINE_START(SMDKC210, "SMDKC210") | |||
385 | .atag_offset = 0x100, | 387 | .atag_offset = 0x100, |
386 | .init_irq = exynos4_init_irq, | 388 | .init_irq = exynos4_init_irq, |
387 | .map_io = smdkv310_map_io, | 389 | .map_io = smdkv310_map_io, |
390 | .handle_irq = gic_handle_irq, | ||
388 | .init_machine = smdkv310_machine_init, | 391 | .init_machine = smdkv310_machine_init, |
389 | .timer = &exynos4_timer, | 392 | .timer = &exynos4_timer, |
390 | MACHINE_END | 393 | MACHINE_END |
diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index a2a177ff4b44..cfc7d5076f5a 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/i2c/atmel_mxt_ts.h> | 24 | #include <linux/i2c/atmel_mxt_ts.h> |
25 | 25 | ||
26 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
27 | #include <asm/hardware/gic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | 29 | ||
29 | #include <plat/regs-serial.h> | 30 | #include <plat/regs-serial.h> |
@@ -1058,6 +1059,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210") | |||
1058 | .atag_offset = 0x100, | 1059 | .atag_offset = 0x100, |
1059 | .init_irq = exynos4_init_irq, | 1060 | .init_irq = exynos4_init_irq, |
1060 | .map_io = universal_map_io, | 1061 | .map_io = universal_map_io, |
1062 | .handle_irq = gic_handle_irq, | ||
1061 | .init_machine = universal_machine_init, | 1063 | .init_machine = universal_machine_init, |
1062 | .timer = &exynos4_timer, | 1064 | .timer = &exynos4_timer, |
1063 | .reserve = &universal_reserve, | 1065 | .reserve = &universal_reserve, |
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c index 69ffb2fb3875..60bc45e3e709 100644 --- a/arch/arm/mach-exynos/platsmp.c +++ b/arch/arm/mach-exynos/platsmp.c | |||
@@ -32,7 +32,6 @@ | |||
32 | 32 | ||
33 | #include <plat/cpu.h> | 33 | #include <plat/cpu.h> |
34 | 34 | ||
35 | extern unsigned int gic_bank_offset; | ||
36 | extern void exynos4_secondary_startup(void); | 35 | extern void exynos4_secondary_startup(void); |
37 | 36 | ||
38 | #define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ | 37 | #define CPU1_BOOT_REG (samsung_rev() == EXYNOS4210_REV_1_1 ? \ |
@@ -65,31 +64,6 @@ static void __iomem *scu_base_addr(void) | |||
65 | 64 | ||
66 | static DEFINE_SPINLOCK(boot_lock); | 65 | static DEFINE_SPINLOCK(boot_lock); |
67 | 66 | ||
68 | static void __cpuinit exynos4_gic_secondary_init(void) | ||
69 | { | ||
70 | void __iomem *dist_base = S5P_VA_GIC_DIST + | ||
71 | (gic_bank_offset * smp_processor_id()); | ||
72 | void __iomem *cpu_base = S5P_VA_GIC_CPU + | ||
73 | (gic_bank_offset * smp_processor_id()); | ||
74 | int i; | ||
75 | |||
76 | /* | ||
77 | * Deal with the banked PPI and SGI interrupts - disable all | ||
78 | * PPI interrupts, ensure all SGI interrupts are enabled. | ||
79 | */ | ||
80 | __raw_writel(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR); | ||
81 | __raw_writel(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET); | ||
82 | |||
83 | /* | ||
84 | * Set priority on PPI and SGI interrupts | ||
85 | */ | ||
86 | for (i = 0; i < 32; i += 4) | ||
87 | __raw_writel(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4); | ||
88 | |||
89 | __raw_writel(0xf0, cpu_base + GIC_CPU_PRIMASK); | ||
90 | __raw_writel(1, cpu_base + GIC_CPU_CTRL); | ||
91 | } | ||
92 | |||
93 | void __cpuinit platform_secondary_init(unsigned int cpu) | 67 | void __cpuinit platform_secondary_init(unsigned int cpu) |
94 | { | 68 | { |
95 | /* | 69 | /* |
@@ -97,7 +71,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu) | |||
97 | * core (e.g. timer irq), then they will not have been enabled | 71 | * core (e.g. timer irq), then they will not have been enabled |
98 | * for us: do so | 72 | * for us: do so |
99 | */ | 73 | */ |
100 | exynos4_gic_secondary_init(); | 74 | gic_secondary_init(0); |
101 | 75 | ||
102 | /* | 76 | /* |
103 | * let the primary processor know we're out of the | 77 | * let the primary processor know we're out of the |
diff --git a/arch/arm/mach-footbridge/cats-hw.c b/arch/arm/mach-footbridge/cats-hw.c index d5f178540928..60b6774e1eaa 100644 --- a/arch/arm/mach-footbridge/cats-hw.c +++ b/arch/arm/mach-footbridge/cats-hw.c | |||
@@ -86,7 +86,7 @@ fixup_cats(struct tag *tags, char **cmdline, struct meminfo *mi) | |||
86 | MACHINE_START(CATS, "Chalice-CATS") | 86 | MACHINE_START(CATS, "Chalice-CATS") |
87 | /* Maintainer: Philip Blundell */ | 87 | /* Maintainer: Philip Blundell */ |
88 | .atag_offset = 0x100, | 88 | .atag_offset = 0x100, |
89 | .soft_reboot = 1, | 89 | .restart_mode = 's', |
90 | .fixup = fixup_cats, | 90 | .fixup = fixup_cats, |
91 | .map_io = footbridge_map_io, | 91 | .map_io = footbridge_map_io, |
92 | .init_irq = footbridge_init_irq, | 92 | .init_irq = footbridge_init_irq, |
diff --git a/arch/arm/mach-footbridge/include/mach/system.h b/arch/arm/mach-footbridge/include/mach/system.h index 0b2931566209..249f895910fb 100644 --- a/arch/arm/mach-footbridge/include/mach/system.h +++ b/arch/arm/mach-footbridge/include/mach/system.h | |||
@@ -24,7 +24,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
24 | /* | 24 | /* |
25 | * Jump into the ROM | 25 | * Jump into the ROM |
26 | */ | 26 | */ |
27 | cpu_reset(0x41000000); | 27 | soft_restart(0x41000000); |
28 | } else { | 28 | } else { |
29 | if (machine_is_netwinder()) { | 29 | if (machine_is_netwinder()) { |
30 | /* open up the SuperIO chip | 30 | /* open up the SuperIO chip |
diff --git a/arch/arm/mach-footbridge/include/mach/vmalloc.h b/arch/arm/mach-footbridge/include/mach/vmalloc.h deleted file mode 100644 index 40ba78e5782b..000000000000 --- a/arch/arm/mach-footbridge/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-footbridge/include/mach/vmalloc.h | ||
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 | |||
10 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-gemini/include/mach/vmalloc.h b/arch/arm/mach-gemini/include/mach/vmalloc.h deleted file mode 100644 index 45371eb86fcb..000000000000 --- a/arch/arm/mach-gemini/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | */ | ||
9 | |||
10 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-h720x/include/mach/vmalloc.h b/arch/arm/mach-h720x/include/mach/vmalloc.h deleted file mode 100644 index 8520b4a4d4e6..000000000000 --- a/arch/arm/mach-h720x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-h720x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #ifndef __ARCH_ARM_VMALLOC_H | ||
6 | #define __ARCH_ARM_VMALLOC_H | ||
7 | |||
8 | #define VMALLOC_END 0xd0000000UL | ||
9 | |||
10 | #endif | ||
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c index 88660d500f5b..7266dd510f1a 100644 --- a/arch/arm/mach-highbank/highbank.c +++ b/arch/arm/mach-highbank/highbank.c | |||
@@ -144,6 +144,7 @@ DT_MACHINE_START(HIGHBANK, "Highbank") | |||
144 | .map_io = highbank_map_io, | 144 | .map_io = highbank_map_io, |
145 | .init_irq = highbank_init_irq, | 145 | .init_irq = highbank_init_irq, |
146 | .timer = &highbank_timer, | 146 | .timer = &highbank_timer, |
147 | .handle_irq = gic_handle_irq, | ||
147 | .init_machine = highbank_init, | 148 | .init_machine = highbank_init, |
148 | .dt_compat = highbank_match, | 149 | .dt_compat = highbank_match, |
149 | MACHINE_END | 150 | MACHINE_END |
diff --git a/arch/arm/mach-highbank/include/mach/entry-macro.S b/arch/arm/mach-highbank/include/mach/entry-macro.S index 73c11297509e..a14f9e62ca92 100644 --- a/arch/arm/mach-highbank/include/mach/entry-macro.S +++ b/arch/arm/mach-highbank/include/mach/entry-macro.S | |||
@@ -1,5 +1,3 @@ | |||
1 | #include <asm/hardware/entry-macro-gic.S> | ||
2 | |||
3 | .macro disable_fiq | 1 | .macro disable_fiq |
4 | .endm | 2 | .endm |
5 | 3 | ||
diff --git a/arch/arm/mach-highbank/include/mach/vmalloc.h b/arch/arm/mach-highbank/include/mach/vmalloc.h deleted file mode 100644 index 1969e954277a..000000000000 --- a/arch/arm/mach-highbank/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #define VMALLOC_END 0xFEE00000UL | ||
diff --git a/arch/arm/mach-integrator/include/mach/vmalloc.h b/arch/arm/mach-integrator/include/mach/vmalloc.h deleted file mode 100644 index 2f5a2bafb11f..000000000000 --- a/arch/arm/mach-integrator/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-integrator/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 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 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 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-iop13xx/include/mach/vmalloc.h b/arch/arm/mach-iop13xx/include/mach/vmalloc.h deleted file mode 100644 index c53456740345..000000000000 --- a/arch/arm/mach-iop13xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | #ifndef _VMALLOC_H_ | ||
2 | #define _VMALLOC_H_ | ||
3 | #define VMALLOC_END 0xfa000000UL | ||
4 | #endif | ||
diff --git a/arch/arm/mach-iop32x/include/mach/io.h b/arch/arm/mach-iop32x/include/mach/io.h index 059c783ce0b2..2d88264b9863 100644 --- a/arch/arm/mach-iop32x/include/mach/io.h +++ b/arch/arm/mach-iop32x/include/mach/io.h | |||
@@ -13,15 +13,8 @@ | |||
13 | 13 | ||
14 | #include <asm/hardware/iop3xx.h> | 14 | #include <asm/hardware/iop3xx.h> |
15 | 15 | ||
16 | extern void __iomem *__iop3xx_ioremap(unsigned long cookie, size_t size, | ||
17 | unsigned int mtype); | ||
18 | extern void __iop3xx_iounmap(void __iomem *addr); | ||
19 | |||
20 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
21 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) | 17 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) |
22 | #define __mem_pci(a) (a) | 18 | #define __mem_pci(a) (a) |
23 | 19 | ||
24 | #define __arch_ioremap __iop3xx_ioremap | ||
25 | #define __arch_iounmap __iop3xx_iounmap | ||
26 | |||
27 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-iop32x/include/mach/system.h b/arch/arm/mach-iop32x/include/mach/system.h index a4b808fe0d81..b4f83e5973b2 100644 --- a/arch/arm/mach-iop32x/include/mach/system.h +++ b/arch/arm/mach-iop32x/include/mach/system.h | |||
@@ -18,8 +18,6 @@ static inline void arch_idle(void) | |||
18 | 18 | ||
19 | static inline void arch_reset(char mode, const char *cmd) | 19 | static inline void arch_reset(char mode, const char *cmd) |
20 | { | 20 | { |
21 | local_irq_disable(); | ||
22 | |||
23 | if (machine_is_n2100()) { | 21 | if (machine_is_n2100()) { |
24 | gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); | 22 | gpio_line_set(N2100_HARDWARE_RESET, GPIO_LOW); |
25 | gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); | 23 | gpio_line_config(N2100_HARDWARE_RESET, GPIO_OUT); |
@@ -30,5 +28,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
30 | *IOP3XX_PCSR = 0x30; | 28 | *IOP3XX_PCSR = 0x30; |
31 | 29 | ||
32 | /* Jump into ROM at address 0 */ | 30 | /* Jump into ROM at address 0 */ |
33 | cpu_reset(0); | 31 | soft_restart(0); |
34 | } | 32 | } |
diff --git a/arch/arm/mach-iop32x/include/mach/vmalloc.h b/arch/arm/mach-iop32x/include/mach/vmalloc.h deleted file mode 100644 index c4862d48e583..000000000000 --- a/arch/arm/mach-iop32x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-iop32x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-iop33x/include/mach/io.h b/arch/arm/mach-iop33x/include/mach/io.h index 39e893e97c21..a8a66fc8fbdb 100644 --- a/arch/arm/mach-iop33x/include/mach/io.h +++ b/arch/arm/mach-iop33x/include/mach/io.h | |||
@@ -13,15 +13,8 @@ | |||
13 | 13 | ||
14 | #include <asm/hardware/iop3xx.h> | 14 | #include <asm/hardware/iop3xx.h> |
15 | 15 | ||
16 | extern void __iomem *__iop3xx_ioremap(unsigned long cookie, size_t size, | ||
17 | unsigned int mtype); | ||
18 | extern void __iop3xx_iounmap(void __iomem *addr); | ||
19 | |||
20 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
21 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) | 17 | #define __io(p) ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p)) |
22 | #define __mem_pci(a) (a) | 18 | #define __mem_pci(a) (a) |
23 | 19 | ||
24 | #define __arch_ioremap __iop3xx_ioremap | ||
25 | #define __arch_iounmap __iop3xx_iounmap | ||
26 | |||
27 | #endif | 20 | #endif |
diff --git a/arch/arm/mach-iop33x/include/mach/system.h b/arch/arm/mach-iop33x/include/mach/system.h index f192a34be073..86d1b20dd692 100644 --- a/arch/arm/mach-iop33x/include/mach/system.h +++ b/arch/arm/mach-iop33x/include/mach/system.h | |||
@@ -19,5 +19,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
19 | *IOP3XX_PCSR = 0x30; | 19 | *IOP3XX_PCSR = 0x30; |
20 | 20 | ||
21 | /* Jump into ROM at address 0 */ | 21 | /* Jump into ROM at address 0 */ |
22 | cpu_reset(0); | 22 | soft_restart(0); |
23 | } | 23 | } |
diff --git a/arch/arm/mach-iop33x/include/mach/vmalloc.h b/arch/arm/mach-iop33x/include/mach/vmalloc.h deleted file mode 100644 index 48331dc23704..000000000000 --- a/arch/arm/mach-iop33x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-iop33x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-ixp2000/include/mach/system.h b/arch/arm/mach-ixp2000/include/mach/system.h index de370992c848..810df7b93982 100644 --- a/arch/arm/mach-ixp2000/include/mach/system.h +++ b/arch/arm/mach-ixp2000/include/mach/system.h | |||
@@ -19,8 +19,6 @@ static inline void arch_idle(void) | |||
19 | 19 | ||
20 | static inline void arch_reset(char mode, const char *cmd) | 20 | static inline void arch_reset(char mode, const char *cmd) |
21 | { | 21 | { |
22 | local_irq_disable(); | ||
23 | |||
24 | /* | 22 | /* |
25 | * Reset flash banking register so that we are pointing at | 23 | * Reset flash banking register so that we are pointing at |
26 | * RedBoot bank. | 24 | * RedBoot bank. |
diff --git a/arch/arm/mach-ixp2000/include/mach/vmalloc.h b/arch/arm/mach-ixp2000/include/mach/vmalloc.h deleted file mode 100644 index 61c8dae24f95..000000000000 --- a/arch/arm/mach-ixp2000/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp2000/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Naeem Afzal <naeem.m.afzal@intel.com> | ||
5 | * | ||
6 | * Copyright 2002 Intel Corp. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * Just any arbitrary offset to the start of the vmalloc VM area: the | ||
14 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
15 | * physical memory until the kernel virtual memory starts. That means that | ||
16 | * any out-of-bounds memory accesses will hopefully be caught. | ||
17 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
18 | * area for the same reason. ;) | ||
19 | */ | ||
20 | #define VMALLOC_END 0xfb000000UL | ||
diff --git a/arch/arm/mach-ixp23xx/include/mach/io.h b/arch/arm/mach-ixp23xx/include/mach/io.h index a1749d0fd896..4ce4353b9f72 100644 --- a/arch/arm/mach-ixp23xx/include/mach/io.h +++ b/arch/arm/mach-ixp23xx/include/mach/io.h | |||
@@ -20,33 +20,4 @@ | |||
20 | #define __io(p) ((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT)) | 20 | #define __io(p) ((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT)) |
21 | #define __mem_pci(a) (a) | 21 | #define __mem_pci(a) (a) |
22 | 22 | ||
23 | static inline void __iomem * | ||
24 | ixp23xx_ioremap(unsigned long addr, unsigned long size, unsigned int mtype) | ||
25 | { | ||
26 | if (addr >= IXP23XX_PCI_MEM_START && | ||
27 | addr <= IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) { | ||
28 | if (addr + size > IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE) | ||
29 | return NULL; | ||
30 | |||
31 | return (void __iomem *) | ||
32 | ((addr - IXP23XX_PCI_MEM_START) + IXP23XX_PCI_MEM_VIRT); | ||
33 | } | ||
34 | |||
35 | return __arm_ioremap(addr, size, mtype); | ||
36 | } | ||
37 | |||
38 | static inline void | ||
39 | ixp23xx_iounmap(void __iomem *addr) | ||
40 | { | ||
41 | if ((((u32)addr) >= IXP23XX_PCI_MEM_VIRT) && | ||
42 | (((u32)addr) < IXP23XX_PCI_MEM_VIRT + IXP23XX_PCI_MEM_SIZE)) | ||
43 | return; | ||
44 | |||
45 | __iounmap(addr); | ||
46 | } | ||
47 | |||
48 | #define __arch_ioremap ixp23xx_ioremap | ||
49 | #define __arch_iounmap ixp23xx_iounmap | ||
50 | |||
51 | |||
52 | #endif | 23 | #endif |
diff --git a/arch/arm/mach-ixp23xx/include/mach/vmalloc.h b/arch/arm/mach-ixp23xx/include/mach/vmalloc.h deleted file mode 100644 index 896c56a1c00e..000000000000 --- a/arch/arm/mach-ixp23xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp23xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2005 MontaVista Software, Inc. | ||
5 | * | ||
6 | * NPU mappings end at 0xf0000000 and we allocate 64MB for board | ||
7 | * specific static I/O. | ||
8 | */ | ||
9 | |||
10 | #define VMALLOC_END (0xec000000UL) | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/system.h b/arch/arm/mach-ixp4xx/include/mach/system.h index 54c0af7fa2d4..24337d9d275b 100644 --- a/arch/arm/mach-ixp4xx/include/mach/system.h +++ b/arch/arm/mach-ixp4xx/include/mach/system.h | |||
@@ -26,7 +26,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
26 | { | 26 | { |
27 | if ( 1 && mode == 's') { | 27 | if ( 1 && mode == 's') { |
28 | /* Jump into ROM at address 0 */ | 28 | /* Jump into ROM at address 0 */ |
29 | cpu_reset(0); | 29 | soft_restart(0); |
30 | } else { | 30 | } else { |
31 | /* Use on-chip reset capability */ | 31 | /* Use on-chip reset capability */ |
32 | 32 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/vmalloc.h b/arch/arm/mach-ixp4xx/include/mach/vmalloc.h deleted file mode 100644 index 9bcd64d59854..000000000000 --- a/arch/arm/mach-ixp4xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ixp4xx/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END (0xff000000UL) | ||
5 | |||
diff --git a/arch/arm/mach-kirkwood/include/mach/io.h b/arch/arm/mach-kirkwood/include/mach/io.h index 1aaddc364f2e..49dd0cb5e166 100644 --- a/arch/arm/mach-kirkwood/include/mach/io.h +++ b/arch/arm/mach-kirkwood/include/mach/io.h | |||
@@ -19,31 +19,6 @@ static inline void __iomem *__io(unsigned long addr) | |||
19 | + KIRKWOOD_PCIE_IO_VIRT_BASE); | 19 | + KIRKWOOD_PCIE_IO_VIRT_BASE); |
20 | } | 20 | } |
21 | 21 | ||
22 | static inline void __iomem * | ||
23 | __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype) | ||
24 | { | ||
25 | void __iomem *retval; | ||
26 | unsigned long offs = paddr - KIRKWOOD_REGS_PHYS_BASE; | ||
27 | if (mtype == MT_DEVICE && size && offs < KIRKWOOD_REGS_SIZE && | ||
28 | size <= KIRKWOOD_REGS_SIZE && offs + size <= KIRKWOOD_REGS_SIZE) { | ||
29 | retval = (void __iomem *)KIRKWOOD_REGS_VIRT_BASE + offs; | ||
30 | } else { | ||
31 | retval = __arm_ioremap(paddr, size, mtype); | ||
32 | } | ||
33 | |||
34 | return retval; | ||
35 | } | ||
36 | |||
37 | static inline void | ||
38 | __arch_iounmap(void __iomem *addr) | ||
39 | { | ||
40 | if (addr < (void __iomem *)KIRKWOOD_REGS_VIRT_BASE || | ||
41 | addr >= (void __iomem *)(KIRKWOOD_REGS_VIRT_BASE + KIRKWOOD_REGS_SIZE)) | ||
42 | __iounmap(addr); | ||
43 | } | ||
44 | |||
45 | #define __arch_ioremap __arch_ioremap | ||
46 | #define __arch_iounmap __arch_iounmap | ||
47 | #define __io(a) __io(a) | 22 | #define __io(a) __io(a) |
48 | #define __mem_pci(a) (a) | 23 | #define __mem_pci(a) (a) |
49 | 24 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/vmalloc.h b/arch/arm/mach-kirkwood/include/mach/vmalloc.h deleted file mode 100644 index bf162ca3d2c1..000000000000 --- a/arch/arm/mach-kirkwood/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-kirkwood/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-ks8695/include/mach/system.h b/arch/arm/mach-ks8695/include/mach/system.h index fb1dda9be2d0..ceb19c90aa52 100644 --- a/arch/arm/mach-ks8695/include/mach/system.h +++ b/arch/arm/mach-ks8695/include/mach/system.h | |||
@@ -32,7 +32,7 @@ static void arch_reset(char mode, const char *cmd) | |||
32 | unsigned int reg; | 32 | unsigned int reg; |
33 | 33 | ||
34 | if (mode == 's') | 34 | if (mode == 's') |
35 | cpu_reset(0); | 35 | soft_restart(0); |
36 | 36 | ||
37 | /* disable timer0 */ | 37 | /* disable timer0 */ |
38 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | 38 | reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); |
diff --git a/arch/arm/mach-ks8695/include/mach/vmalloc.h b/arch/arm/mach-ks8695/include/mach/vmalloc.h deleted file mode 100644 index 744ac66be3a2..000000000000 --- a/arch/arm/mach-ks8695/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-ks8695/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2006 Ben Dooks | ||
5 | * Copyright (C) 2006 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * | ||
7 | * KS8695 vmalloc definition | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_ARCH_VMALLOC_H | ||
15 | #define __ASM_ARCH_VMALLOC_H | ||
16 | |||
17 | #define VMALLOC_END (KS8695_IO_VA & PGDIR_MASK) | ||
18 | |||
19 | #endif | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/system.h b/arch/arm/mach-lpc32xx/include/mach/system.h index df3b0dea4d7b..d47f3b1c24b8 100644 --- a/arch/arm/mach-lpc32xx/include/mach/system.h +++ b/arch/arm/mach-lpc32xx/include/mach/system.h | |||
@@ -33,9 +33,6 @@ static inline void arch_reset(char mode, const char *cmd) | |||
33 | case 'h': | 33 | case 'h': |
34 | printk(KERN_CRIT "RESET: Rebooting system\n"); | 34 | printk(KERN_CRIT "RESET: Rebooting system\n"); |
35 | 35 | ||
36 | /* Disable interrupts */ | ||
37 | local_irq_disable(); | ||
38 | |||
39 | lpc32xx_watchdog_reset(); | 36 | lpc32xx_watchdog_reset(); |
40 | break; | 37 | break; |
41 | 38 | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/vmalloc.h b/arch/arm/mach-lpc32xx/include/mach/vmalloc.h deleted file mode 100644 index 720fa43a60bf..000000000000 --- a/arch/arm/mach-lpc32xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-lpc32xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Kevin Wells <kevin.wells@nxp.com> | ||
5 | * | ||
6 | * Copyright (C) 2010 NXP Semiconductors | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #ifndef __ASM_ARCH_VMALLOC_H | ||
20 | #define __ASM_ARCH_VMALLOC_H | ||
21 | |||
22 | #define VMALLOC_END 0xF0000000UL | ||
23 | |||
24 | #endif | ||
diff --git a/arch/arm/mach-mmp/include/mach/system.h b/arch/arm/mach-mmp/include/mach/system.h index 1a8a25edb1b4..cb0637933a85 100644 --- a/arch/arm/mach-mmp/include/mach/system.h +++ b/arch/arm/mach-mmp/include/mach/system.h | |||
@@ -19,8 +19,8 @@ static inline void arch_idle(void) | |||
19 | static inline void arch_reset(char mode, const char *cmd) | 19 | static inline void arch_reset(char mode, const char *cmd) |
20 | { | 20 | { |
21 | if (cpu_is_pxa168()) | 21 | if (cpu_is_pxa168()) |
22 | cpu_reset(0xffff0000); | 22 | soft_restart(0xffff0000); |
23 | else | 23 | else |
24 | cpu_reset(0); | 24 | soft_restart(0); |
25 | } | 25 | } |
26 | #endif /* __ASM_MACH_SYSTEM_H */ | 26 | #endif /* __ASM_MACH_SYSTEM_H */ |
diff --git a/arch/arm/mach-mmp/include/mach/vmalloc.h b/arch/arm/mach-mmp/include/mach/vmalloc.h deleted file mode 100644 index 1d0bac003ad0..000000000000 --- a/arch/arm/mach-mmp/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-mmp/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c index 6dc1cbd2a595..ed3598128530 100644 --- a/arch/arm/mach-msm/board-msm8960.c +++ b/arch/arm/mach-msm/board-msm8960.c | |||
@@ -99,6 +99,7 @@ MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR") | |||
99 | .map_io = msm8960_map_io, | 99 | .map_io = msm8960_map_io, |
100 | .init_irq = msm8960_init_irq, | 100 | .init_irq = msm8960_init_irq, |
101 | .timer = &msm_timer, | 101 | .timer = &msm_timer, |
102 | .handle_irq = gic_handle_irq, | ||
102 | .init_machine = msm8960_sim_init, | 103 | .init_machine = msm8960_sim_init, |
103 | MACHINE_END | 104 | MACHINE_END |
104 | 105 | ||
@@ -108,6 +109,7 @@ MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3") | |||
108 | .map_io = msm8960_map_io, | 109 | .map_io = msm8960_map_io, |
109 | .init_irq = msm8960_init_irq, | 110 | .init_irq = msm8960_init_irq, |
110 | .timer = &msm_timer, | 111 | .timer = &msm_timer, |
112 | .handle_irq = gic_handle_irq, | ||
111 | .init_machine = msm8960_rumi3_init, | 113 | .init_machine = msm8960_rumi3_init, |
112 | MACHINE_END | 114 | MACHINE_END |
113 | 115 | ||
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c index 44bf71688373..0a113424632c 100644 --- a/arch/arm/mach-msm/board-msm8x60.c +++ b/arch/arm/mach-msm/board-msm8x60.c | |||
@@ -108,6 +108,7 @@ MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3") | |||
108 | .reserve = msm8x60_reserve, | 108 | .reserve = msm8x60_reserve, |
109 | .map_io = msm8x60_map_io, | 109 | .map_io = msm8x60_map_io, |
110 | .init_irq = msm8x60_init_irq, | 110 | .init_irq = msm8x60_init_irq, |
111 | .handle_irq = gic_handle_irq, | ||
111 | .init_machine = msm8x60_init, | 112 | .init_machine = msm8x60_init, |
112 | .timer = &msm_timer, | 113 | .timer = &msm_timer, |
113 | MACHINE_END | 114 | MACHINE_END |
@@ -117,6 +118,7 @@ MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF") | |||
117 | .reserve = msm8x60_reserve, | 118 | .reserve = msm8x60_reserve, |
118 | .map_io = msm8x60_map_io, | 119 | .map_io = msm8x60_map_io, |
119 | .init_irq = msm8x60_init_irq, | 120 | .init_irq = msm8x60_init_irq, |
121 | .handle_irq = gic_handle_irq, | ||
120 | .init_machine = msm8x60_init, | 122 | .init_machine = msm8x60_init, |
121 | .timer = &msm_timer, | 123 | .timer = &msm_timer, |
122 | MACHINE_END | 124 | MACHINE_END |
@@ -126,6 +128,7 @@ MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR") | |||
126 | .reserve = msm8x60_reserve, | 128 | .reserve = msm8x60_reserve, |
127 | .map_io = msm8x60_map_io, | 129 | .map_io = msm8x60_map_io, |
128 | .init_irq = msm8x60_init_irq, | 130 | .init_irq = msm8x60_init_irq, |
131 | .handle_irq = gic_handle_irq, | ||
129 | .init_machine = msm8x60_init, | 132 | .init_machine = msm8x60_init, |
130 | .timer = &msm_timer, | 133 | .timer = &msm_timer, |
131 | MACHINE_END | 134 | MACHINE_END |
@@ -135,6 +138,7 @@ MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA") | |||
135 | .reserve = msm8x60_reserve, | 138 | .reserve = msm8x60_reserve, |
136 | .map_io = msm8x60_map_io, | 139 | .map_io = msm8x60_map_io, |
137 | .init_irq = msm8x60_init_irq, | 140 | .init_irq = msm8x60_init_irq, |
141 | .handle_irq = gic_handle_irq, | ||
138 | .init_machine = msm8x60_init, | 142 | .init_machine = msm8x60_init, |
139 | .timer = &msm_timer, | 143 | .timer = &msm_timer, |
140 | MACHINE_END | 144 | MACHINE_END |
diff --git a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S b/arch/arm/mach-msm/include/mach/entry-macro-qgic.S deleted file mode 100644 index 717076f3ca73..000000000000 --- a/arch/arm/mach-msm/include/mach/entry-macro-qgic.S +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* | ||
2 | * Low-level IRQ helper macros | ||
3 | * | ||
4 | * Copyright (c) 2010, Code Aurora Forum. All rights reserved. | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | |||
13 | .macro disable_fiq | ||
14 | .endm | ||
15 | |||
16 | .macro arch_ret_to_user, tmp1, tmp2 | ||
17 | .endm | ||
diff --git a/arch/arm/mach-msm/include/mach/entry-macro-vic.S b/arch/arm/mach-msm/include/mach/entry-macro-vic.S deleted file mode 100644 index 70563ed11b36..000000000000 --- a/arch/arm/mach-msm/include/mach/entry-macro-vic.S +++ /dev/null | |||
@@ -1,37 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 Google, Inc. | ||
3 | * Author: Brian Swetland <swetland@google.com> | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <mach/msm_iomap.h> | ||
17 | |||
18 | .macro disable_fiq | ||
19 | .endm | ||
20 | |||
21 | .macro get_irqnr_preamble, base, tmp | ||
22 | @ enable imprecise aborts | ||
23 | cpsie a | ||
24 | mov \base, #MSM_VIC_BASE | ||
25 | .endm | ||
26 | |||
27 | .macro arch_ret_to_user, tmp1, tmp2 | ||
28 | .endm | ||
29 | |||
30 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
31 | @ 0xD0 has irq# or old irq# if the irq has been handled | ||
32 | @ 0xD4 has irq# or -1 if none pending *but* if you just | ||
33 | @ read 0xD4 you never get the first irq for some reason | ||
34 | ldr \irqnr, [\base, #0xD0] | ||
35 | ldr \irqnr, [\base, #0xD4] | ||
36 | cmp \irqnr, #0xffffffff | ||
37 | .endm | ||
diff --git a/arch/arm/mach-msm/include/mach/entry-macro.S b/arch/arm/mach-msm/include/mach/entry-macro.S index b16f082eeb6f..41f7003ef34f 100644 --- a/arch/arm/mach-msm/include/mach/entry-macro.S +++ b/arch/arm/mach-msm/include/mach/entry-macro.S | |||
@@ -16,8 +16,27 @@ | |||
16 | * | 16 | * |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #if defined(CONFIG_ARM_GIC) | 19 | .macro disable_fiq |
20 | #include <mach/entry-macro-qgic.S> | 20 | .endm |
21 | #else | 21 | |
22 | #include <mach/entry-macro-vic.S> | 22 | .macro arch_ret_to_user, tmp1, tmp2 |
23 | .endm | ||
24 | |||
25 | #if !defined(CONFIG_ARM_GIC) | ||
26 | #include <mach/msm_iomap.h> | ||
27 | |||
28 | .macro get_irqnr_preamble, base, tmp | ||
29 | @ enable imprecise aborts | ||
30 | cpsie a | ||
31 | mov \base, #MSM_VIC_BASE | ||
32 | .endm | ||
33 | |||
34 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
35 | @ 0xD0 has irq# or old irq# if the irq has been handled | ||
36 | @ 0xD4 has irq# or -1 if none pending *but* if you just | ||
37 | @ read 0xD4 you never get the first irq for some reason | ||
38 | ldr \irqnr, [\base, #0xD0] | ||
39 | ldr \irqnr, [\base, #0xD4] | ||
40 | cmp \irqnr, #0xffffffff | ||
41 | .endm | ||
23 | #endif | 42 | #endif |
diff --git a/arch/arm/mach-msm/include/mach/vmalloc.h b/arch/arm/mach-msm/include/mach/vmalloc.h deleted file mode 100644 index d138448eff16..000000000000 --- a/arch/arm/mach-msm/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* arch/arm/mach-msm/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (C) 2007 Google, Inc. | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MSM_VMALLOC_H | ||
17 | #define __ASM_ARCH_MSM_VMALLOC_H | ||
18 | |||
19 | #define VMALLOC_END 0xd0000000UL | ||
20 | |||
21 | #endif | ||
22 | |||
diff --git a/arch/arm/mach-mv78xx0/include/mach/vmalloc.h b/arch/arm/mach-mv78xx0/include/mach/vmalloc.h deleted file mode 100644 index ba26fe98e640..000000000000 --- a/arch/arm/mach-mv78xx0/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-mv78xx0/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-mxs/include/mach/vmalloc.h b/arch/arm/mach-mxs/include/mach/vmalloc.h deleted file mode 100644 index 103b0165ed0b..000000000000 --- a/arch/arm/mach-mxs/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 Russell King. | ||
3 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef __MACH_MXS_VMALLOC_H__ | ||
17 | #define __MACH_MXS_VMALLOC_H__ | ||
18 | |||
19 | /* vmalloc ending address */ | ||
20 | #define VMALLOC_END 0xf4000000UL | ||
21 | |||
22 | #endif /* __MACH_MXS_VMALLOC_H__ */ | ||
diff --git a/arch/arm/mach-mxs/system.c b/arch/arm/mach-mxs/system.c index 20ec3bddf7cd..cab88364e7c1 100644 --- a/arch/arm/mach-mxs/system.c +++ b/arch/arm/mach-mxs/system.c | |||
@@ -53,7 +53,7 @@ void arch_reset(char mode, const char *cmd) | |||
53 | mdelay(50); | 53 | mdelay(50); |
54 | 54 | ||
55 | /* We'll take a jump through zero as a poor second */ | 55 | /* We'll take a jump through zero as a poor second */ |
56 | cpu_reset(0); | 56 | soft_restart(0); |
57 | } | 57 | } |
58 | 58 | ||
59 | static int __init mxs_arch_reset_init(void) | 59 | static int __init mxs_arch_reset_init(void) |
diff --git a/arch/arm/mach-netx/include/mach/entry-macro.S b/arch/arm/mach-netx/include/mach/entry-macro.S index 844f1f9acbdf..6e9f1cbe1634 100644 --- a/arch/arm/mach-netx/include/mach/entry-macro.S +++ b/arch/arm/mach-netx/include/mach/entry-macro.S | |||
@@ -18,22 +18,9 @@ | |||
18 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | #include <mach/hardware.h> | ||
22 | 21 | ||
23 | .macro disable_fiq | 22 | .macro disable_fiq |
24 | .endm | 23 | .endm |
25 | 24 | ||
26 | .macro get_irqnr_preamble, base, tmp | ||
27 | ldr \base, =io_p2v(0x001ff000) | ||
28 | .endm | ||
29 | |||
30 | .macro arch_ret_to_user, tmp1, tmp2 | 25 | .macro arch_ret_to_user, tmp1, tmp2 |
31 | .endm | 26 | .endm |
32 | |||
33 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
34 | ldr \irqstat, [\base, #0] | ||
35 | clz \irqnr, \irqstat | ||
36 | rsb \irqnr, \irqnr, #31 | ||
37 | cmp \irqstat, #0 | ||
38 | .endm | ||
39 | |||
diff --git a/arch/arm/mach-netx/include/mach/vmalloc.h b/arch/arm/mach-netx/include/mach/vmalloc.h deleted file mode 100644 index 871f1ef7bff5..000000000000 --- a/arch/arm/mach-netx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-netx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2005 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix | ||
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 | ||
8 | * as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
18 | */ | ||
19 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-netx/nxdb500.c b/arch/arm/mach-netx/nxdb500.c index 90903dd44cbc..ef8cf3574a02 100644 --- a/arch/arm/mach-netx/nxdb500.c +++ b/arch/arm/mach-netx/nxdb500.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -203,6 +204,7 @@ MACHINE_START(NXDB500, "Hilscher nxdb500") | |||
203 | .atag_offset = 0x100, | 204 | .atag_offset = 0x100, |
204 | .map_io = netx_map_io, | 205 | .map_io = netx_map_io, |
205 | .init_irq = netx_init_irq, | 206 | .init_irq = netx_init_irq, |
207 | .handle_irq = vic_handle_irq, | ||
206 | .timer = &netx_timer, | 208 | .timer = &netx_timer, |
207 | .init_machine = nxdb500_init, | 209 | .init_machine = nxdb500_init, |
208 | MACHINE_END | 210 | MACHINE_END |
diff --git a/arch/arm/mach-netx/nxdkn.c b/arch/arm/mach-netx/nxdkn.c index c63384aba500..588558bdd800 100644 --- a/arch/arm/mach-netx/nxdkn.c +++ b/arch/arm/mach-netx/nxdkn.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -96,6 +97,7 @@ MACHINE_START(NXDKN, "Hilscher nxdkn") | |||
96 | .atag_offset = 0x100, | 97 | .atag_offset = 0x100, |
97 | .map_io = netx_map_io, | 98 | .map_io = netx_map_io, |
98 | .init_irq = netx_init_irq, | 99 | .init_irq = netx_init_irq, |
100 | .handle_irq = vic_handle_irq, | ||
99 | .timer = &netx_timer, | 101 | .timer = &netx_timer, |
100 | .init_machine = nxdkn_init, | 102 | .init_machine = nxdkn_init, |
101 | MACHINE_END | 103 | MACHINE_END |
diff --git a/arch/arm/mach-netx/nxeb500hmi.c b/arch/arm/mach-netx/nxeb500hmi.c index 8f548ec83ad2..cfcbb5038648 100644 --- a/arch/arm/mach-netx/nxeb500hmi.c +++ b/arch/arm/mach-netx/nxeb500hmi.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <mach/netx-regs.h> | 32 | #include <mach/netx-regs.h> |
32 | #include <mach/eth.h> | 33 | #include <mach/eth.h> |
33 | 34 | ||
@@ -180,6 +181,7 @@ MACHINE_START(NXEB500HMI, "Hilscher nxeb500hmi") | |||
180 | .atag_offset = 0x100, | 181 | .atag_offset = 0x100, |
181 | .map_io = netx_map_io, | 182 | .map_io = netx_map_io, |
182 | .init_irq = netx_init_irq, | 183 | .init_irq = netx_init_irq, |
184 | .handle_irq = vic_handle_irq, | ||
183 | .timer = &netx_timer, | 185 | .timer = &netx_timer, |
184 | .init_machine = nxeb500hmi_init, | 186 | .init_machine = nxeb500hmi_init, |
185 | MACHINE_END | 187 | MACHINE_END |
diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 0cbb74c96ef7..f98259c050ee 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/mtd/onenand.h> | 21 | #include <linux/mtd/onenand.h> |
22 | #include <linux/mtd/partitions.h> | 22 | #include <linux/mtd/partitions.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <asm/hardware/vic.h> | ||
24 | #include <asm/sizes.h> | 25 | #include <asm/sizes.h> |
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
26 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
@@ -280,6 +281,7 @@ MACHINE_START(NOMADIK, "NHK8815") | |||
280 | .atag_offset = 0x100, | 281 | .atag_offset = 0x100, |
281 | .map_io = cpu8815_map_io, | 282 | .map_io = cpu8815_map_io, |
282 | .init_irq = cpu8815_init_irq, | 283 | .init_irq = cpu8815_init_irq, |
284 | .handle_irq = vic_handle_irq, | ||
283 | .timer = &nomadik_timer, | 285 | .timer = &nomadik_timer, |
284 | .init_machine = nhk8815_platform_init, | 286 | .init_machine = nhk8815_platform_init, |
285 | MACHINE_END | 287 | MACHINE_END |
diff --git a/arch/arm/mach-nomadik/include/mach/entry-macro.S b/arch/arm/mach-nomadik/include/mach/entry-macro.S index 49f1aa3bb420..98ea1c1fbbab 100644 --- a/arch/arm/mach-nomadik/include/mach/entry-macro.S +++ b/arch/arm/mach-nomadik/include/mach/entry-macro.S | |||
@@ -6,38 +6,8 @@ | |||
6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <mach/hardware.h> | ||
10 | #include <mach/irqs.h> | ||
11 | |||
12 | .macro disable_fiq | 9 | .macro disable_fiq |
13 | .endm | 10 | .endm |
14 | 11 | ||
15 | .macro get_irqnr_preamble, base, tmp | ||
16 | ldr \base, =IO_ADDRESS(NOMADIK_IC_BASE) | ||
17 | .endm | ||
18 | |||
19 | .macro arch_ret_to_user, tmp1, tmp2 | 12 | .macro arch_ret_to_user, tmp1, tmp2 |
20 | .endm | 13 | .endm |
21 | |||
22 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
23 | |||
24 | /* This stanza gets the irq mask from one of two status registers */ | ||
25 | mov \irqnr, #0 | ||
26 | ldr \irqstat, [\base, #VIC_REG_IRQSR0] @ get masked status | ||
27 | cmp \irqstat, #0 | ||
28 | bne 1001f | ||
29 | add \irqnr, \irqnr, #32 | ||
30 | ldr \irqstat, [\base, #VIC_REG_IRQSR1] @ get masked status | ||
31 | |||
32 | 1001: tst \irqstat, #15 | ||
33 | bne 1002f | ||
34 | add \irqnr, \irqnr, #4 | ||
35 | movs \irqstat, \irqstat, lsr #4 | ||
36 | bne 1001b | ||
37 | 1002: tst \irqstat, #1 | ||
38 | bne 1003f | ||
39 | add \irqnr, \irqnr, #1 | ||
40 | movs \irqstat, \irqstat, lsr #1 | ||
41 | bne 1002b | ||
42 | 1003: /* EQ will be set if no irqs pending */ | ||
43 | .endm | ||
diff --git a/arch/arm/mach-nomadik/include/mach/vmalloc.h b/arch/arm/mach-nomadik/include/mach/vmalloc.h deleted file mode 100644 index f83d574d9445..000000000000 --- a/arch/arm/mach-nomadik/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | |||
2 | #define VMALLOC_END 0xe8000000UL | ||
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index b0f15d234a12..af7911963c0d 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <plat/mux.h> | 35 | #include <plat/mux.h> |
36 | #include <plat/usb.h> | 36 | #include <plat/usb.h> |
37 | #include <plat/board.h> | 37 | #include <plat/board.h> |
38 | #include <plat/common.h> | 38 | #include "common.h" |
39 | #include <mach/camera.h> | 39 | #include <mach/camera.h> |
40 | 40 | ||
41 | #include <mach/ams-delta-fiq.h> | 41 | #include <mach/ams-delta-fiq.h> |
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 23178275f96b..b9c4c0f933ee 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <plat/flash.h> | 32 | #include <plat/flash.h> |
33 | #include <plat/fpga.h> | 33 | #include <plat/fpga.h> |
34 | #include <plat/keypad.h> | 34 | #include <plat/keypad.h> |
35 | #include <plat/common.h> | 35 | #include "common.h" |
36 | #include <plat/board.h> | 36 | #include <plat/board.h> |
37 | 37 | ||
38 | /* fsample is pretty close to p2-sample */ | 38 | /* fsample is pretty close to p2-sample */ |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index dc5b75de531c..7f41d7a504a5 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <plat/mux.h> | 25 | #include <plat/mux.h> |
26 | #include <plat/usb.h> | 26 | #include <plat/usb.h> |
27 | #include <plat/board.h> | 27 | #include <plat/board.h> |
28 | #include <plat/common.h> | 28 | #include "common.h" |
29 | 29 | ||
30 | /* assume no Mini-AB port */ | 30 | /* assume no Mini-AB port */ |
31 | 31 | ||
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index b334b1481678..7933b97698f8 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <plat/irda.h> | 43 | #include <plat/irda.h> |
44 | #include <plat/usb.h> | 44 | #include <plat/usb.h> |
45 | #include <plat/keypad.h> | 45 | #include <plat/keypad.h> |
46 | #include <plat/common.h> | 46 | #include "common.h" |
47 | #include <plat/flash.h> | 47 | #include <plat/flash.h> |
48 | 48 | ||
49 | #include "board-h2.h" | 49 | #include "board-h2.h" |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 74ebe72c9848..04be2f83ca09 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -45,7 +45,7 @@ | |||
45 | #include <plat/usb.h> | 45 | #include <plat/usb.h> |
46 | #include <plat/keypad.h> | 46 | #include <plat/keypad.h> |
47 | #include <plat/dma.h> | 47 | #include <plat/dma.h> |
48 | #include <plat/common.h> | 48 | #include "common.h" |
49 | #include <plat/flash.h> | 49 | #include <plat/flash.h> |
50 | 50 | ||
51 | #include "board-h3.h" | 51 | #include "board-h3.h" |
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 3e91baab1a89..46fcfeb1f11e 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
42 | 42 | ||
43 | #include <plat/omap7xx.h> | 43 | #include <plat/omap7xx.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | #include <plat/board.h> | 45 | #include <plat/board.h> |
46 | #include <plat/keypad.h> | 46 | #include <plat/keypad.h> |
47 | #include <plat/usb.h> | 47 | #include <plat/usb.h> |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 273153dba15b..f99d11de1531 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
@@ -37,7 +37,7 @@ | |||
37 | #include <plat/tc.h> | 37 | #include <plat/tc.h> |
38 | #include <plat/usb.h> | 38 | #include <plat/usb.h> |
39 | #include <plat/keypad.h> | 39 | #include <plat/keypad.h> |
40 | #include <plat/common.h> | 40 | #include "common.h" |
41 | #include <plat/mmc.h> | 41 | #include <plat/mmc.h> |
42 | 42 | ||
43 | /* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */ | 43 | /* At OMAP1610 Innovator the Ethernet is directly connected to CS1 */ |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 6798b8488315..c64342388ec3 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <plat/usb.h> | 30 | #include <plat/usb.h> |
31 | #include <plat/board.h> | 31 | #include <plat/board.h> |
32 | #include <plat/keypad.h> | 32 | #include <plat/keypad.h> |
33 | #include <plat/common.h> | 33 | #include "common.h" |
34 | #include <plat/hwa742.h> | 34 | #include <plat/hwa742.h> |
35 | #include <plat/lcd_mipid.h> | 35 | #include <plat/lcd_mipid.h> |
36 | #include <plat/mmc.h> | 36 | #include <plat/mmc.h> |
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index c3859278d257..a409dfcc5b18 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -51,7 +51,7 @@ | |||
51 | #include <plat/usb.h> | 51 | #include <plat/usb.h> |
52 | #include <plat/mux.h> | 52 | #include <plat/mux.h> |
53 | #include <plat/tc.h> | 53 | #include <plat/tc.h> |
54 | #include <plat/common.h> | 54 | #include "common.h" |
55 | 55 | ||
56 | /* At OMAP5912 OSK the Ethernet is directly connected to CS1 */ | 56 | /* At OMAP5912 OSK the Ethernet is directly connected to CS1 */ |
57 | #define OMAP_OSK_ETHR_START 0x04800300 | 57 | #define OMAP_OSK_ETHR_START 0x04800300 |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index f9c44cb15b47..105292d39484 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <plat/board.h> | 41 | #include <plat/board.h> |
42 | #include <plat/irda.h> | 42 | #include <plat/irda.h> |
43 | #include <plat/keypad.h> | 43 | #include <plat/keypad.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | 45 | ||
46 | #define PALMTE_USBDETECT_GPIO 0 | 46 | #define PALMTE_USBDETECT_GPIO 0 |
47 | #define PALMTE_USB_OR_DC_GPIO 1 | 47 | #define PALMTE_USB_OR_DC_GPIO 1 |
diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index 11a98539f7bb..387a9006358d 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <plat/board.h> | 39 | #include <plat/board.h> |
40 | #include <plat/irda.h> | 40 | #include <plat/irda.h> |
41 | #include <plat/keypad.h> | 41 | #include <plat/keypad.h> |
42 | #include <plat/common.h> | 42 | #include "common.h" |
43 | 43 | ||
44 | #include <linux/spi/spi.h> | 44 | #include <linux/spi/spi.h> |
45 | #include <linux/spi/ads7846.h> | 45 | #include <linux/spi/ads7846.h> |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 42061573e380..df6d15e68aad 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <plat/board.h> | 41 | #include <plat/board.h> |
42 | #include <plat/irda.h> | 42 | #include <plat/irda.h> |
43 | #include <plat/keypad.h> | 43 | #include <plat/keypad.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | 45 | ||
46 | #include <linux/spi/spi.h> | 46 | #include <linux/spi/spi.h> |
47 | #include <linux/spi/ads7846.h> | 47 | #include <linux/spi/ads7846.h> |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 203ae07550db..57ecd7e09831 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <plat/fpga.h> | 32 | #include <plat/fpga.h> |
33 | #include <plat/flash.h> | 33 | #include <plat/flash.h> |
34 | #include <plat/keypad.h> | 34 | #include <plat/keypad.h> |
35 | #include <plat/common.h> | 35 | #include "common.h" |
36 | #include <plat/board.h> | 36 | #include <plat/board.h> |
37 | 37 | ||
38 | static const unsigned int p2_keymap[] = { | 38 | static const unsigned int p2_keymap[] = { |
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 092a4c046407..774ae39fd636 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <plat/usb.h> | 40 | #include <plat/usb.h> |
41 | #include <plat/tc.h> | 41 | #include <plat/tc.h> |
42 | #include <plat/board.h> | 42 | #include <plat/board.h> |
43 | #include <plat/common.h> | 43 | #include "common.h" |
44 | #include <plat/keypad.h> | 44 | #include <plat/keypad.h> |
45 | #include <plat/board-sx1.h> | 45 | #include <plat/board-sx1.h> |
46 | 46 | ||
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 61ed6cdab2bd..7721c146d8d6 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <asm/mach/map.h> | 34 | #include <asm/mach/map.h> |
35 | 35 | ||
36 | #include <plat/board-voiceblue.h> | 36 | #include <plat/board-voiceblue.h> |
37 | #include <plat/common.h> | 37 | #include "common.h" |
38 | #include <plat/flash.h> | 38 | #include <plat/flash.h> |
39 | #include <plat/mux.h> | 39 | #include <plat/mux.h> |
40 | #include <plat/tc.h> | 40 | #include <plat/tc.h> |
diff --git a/arch/arm/mach-omap1/common.h b/arch/arm/mach-omap1/common.h new file mode 100644 index 000000000000..52c4eda97fa8 --- /dev/null +++ b/arch/arm/mach-omap1/common.h | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * | ||
3 | * Header for code common to all OMAP1 machines. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #ifndef __ARCH_ARM_MACH_OMAP1_COMMON_H | ||
27 | #define __ARCH_ARM_MACH_OMAP1_COMMON_H | ||
28 | |||
29 | #include <plat/common.h> | ||
30 | |||
31 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
32 | void omap7xx_map_io(void); | ||
33 | #else | ||
34 | static inline void omap7xx_map_io(void) | ||
35 | { | ||
36 | } | ||
37 | #endif | ||
38 | |||
39 | #ifdef CONFIG_ARCH_OMAP15XX | ||
40 | void omap15xx_map_io(void); | ||
41 | #else | ||
42 | static inline void omap15xx_map_io(void) | ||
43 | { | ||
44 | } | ||
45 | #endif | ||
46 | |||
47 | #ifdef CONFIG_ARCH_OMAP16XX | ||
48 | void omap16xx_map_io(void); | ||
49 | #else | ||
50 | static inline void omap16xx_map_io(void) | ||
51 | { | ||
52 | } | ||
53 | #endif | ||
54 | |||
55 | void omap1_init_early(void); | ||
56 | void omap1_init_irq(void); | ||
57 | |||
58 | extern struct sys_timer omap1_timer; | ||
59 | extern bool omap_32k_timer_init(void); | ||
60 | |||
61 | #endif /* __ARCH_ARM_MACH_OMAP1_COMMON_H */ | ||
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 475cb2f50d87..1d76a63c0983 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <mach/hardware.h> | 22 | #include <mach/hardware.h> |
23 | #include <asm/mach/map.h> | 23 | #include <asm/mach/map.h> |
24 | 24 | ||
25 | #include <plat/common.h> | 25 | #include "common.h" |
26 | #include <plat/tc.h> | 26 | #include <plat/tc.h> |
27 | #include <plat/board.h> | 27 | #include <plat/board.h> |
28 | #include <plat/mux.h> | 28 | #include <plat/mux.h> |
diff --git a/arch/arm/mach-omap1/include/mach/vmalloc.h b/arch/arm/mach-omap1/include/mach/vmalloc.h deleted file mode 100644 index 22ec4a479577..000000000000 --- a/arch/arm/mach-omap1/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-omap1/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 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 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 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index 7969cfda4454..8e55b6fb3478 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c | |||
@@ -121,7 +121,6 @@ void __init omap16xx_map_io(void) | |||
121 | void omap1_init_early(void) | 121 | void omap1_init_early(void) |
122 | { | 122 | { |
123 | omap_check_revision(); | 123 | omap_check_revision(); |
124 | omap_ioremap_init(); | ||
125 | 124 | ||
126 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort | 125 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort |
127 | * on a Posted Write in the TIPB Bridge". | 126 | * on a Posted Write in the TIPB Bridge". |
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index a1837771e031..485a21d31004 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c | |||
@@ -54,7 +54,7 @@ | |||
54 | #include <asm/mach/irq.h> | 54 | #include <asm/mach/irq.h> |
55 | #include <asm/mach/time.h> | 55 | #include <asm/mach/time.h> |
56 | 56 | ||
57 | #include <plat/common.h> | 57 | #include "common.h" |
58 | 58 | ||
59 | #ifdef CONFIG_OMAP_MPU_TIMER | 59 | #ifdef CONFIG_OMAP_MPU_TIMER |
60 | 60 | ||
diff --git a/arch/arm/mach-omap1/timer32k.c b/arch/arm/mach-omap1/timer32k.c index 96604a50c4fe..9a54ef4dcf5e 100644 --- a/arch/arm/mach-omap1/timer32k.c +++ b/arch/arm/mach-omap1/timer32k.c | |||
@@ -52,7 +52,7 @@ | |||
52 | #include <asm/irq.h> | 52 | #include <asm/irq.h> |
53 | #include <asm/mach/irq.h> | 53 | #include <asm/mach/irq.h> |
54 | #include <asm/mach/time.h> | 54 | #include <asm/mach/time.h> |
55 | #include <plat/common.h> | 55 | #include "common.h" |
56 | #include <plat/dmtimer.h> | 56 | #include <plat/dmtimer.h> |
57 | 57 | ||
58 | /* | 58 | /* |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index e1293aa513d3..b6625130831d 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -25,6 +25,7 @@ config ARCH_OMAP2 | |||
25 | depends on ARCH_OMAP2PLUS | 25 | depends on ARCH_OMAP2PLUS |
26 | default y | 26 | default y |
27 | select CPU_V6 | 27 | select CPU_V6 |
28 | select MULTI_IRQ_HANDLER | ||
28 | 29 | ||
29 | config ARCH_OMAP3 | 30 | config ARCH_OMAP3 |
30 | bool "TI OMAP3" | 31 | bool "TI OMAP3" |
@@ -36,6 +37,7 @@ config ARCH_OMAP3 | |||
36 | select ARCH_HAS_OPP | 37 | select ARCH_HAS_OPP |
37 | select PM_OPP if PM | 38 | select PM_OPP if PM |
38 | select ARM_CPU_SUSPEND if PM | 39 | select ARM_CPU_SUSPEND if PM |
40 | select MULTI_IRQ_HANDLER | ||
39 | 41 | ||
40 | config ARCH_OMAP4 | 42 | config ARCH_OMAP4 |
41 | bool "TI OMAP4" | 43 | bool "TI OMAP4" |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index d704f0ac328d..d88143faca59 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <asm/mach/map.h> | 34 | #include <asm/mach/map.h> |
35 | 35 | ||
36 | #include <plat/board.h> | 36 | #include <plat/board.h> |
37 | #include <plat/common.h> | 37 | #include "common.h" |
38 | #include <plat/gpmc.h> | 38 | #include <plat/gpmc.h> |
39 | #include <plat/usb.h> | 39 | #include <plat/usb.h> |
40 | #include <plat/gpmc-smc91x.h> | 40 | #include <plat/gpmc-smc91x.h> |
@@ -301,6 +301,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
301 | .map_io = omap243x_map_io, | 301 | .map_io = omap243x_map_io, |
302 | .init_early = omap2430_init_early, | 302 | .init_early = omap2430_init_early, |
303 | .init_irq = omap2_init_irq, | 303 | .init_irq = omap2_init_irq, |
304 | .handle_irq = omap2_intc_handle_irq, | ||
304 | .init_machine = omap_2430sdp_init, | 305 | .init_machine = omap_2430sdp_init, |
305 | .timer = &omap2_timer, | 306 | .timer = &omap2_timer, |
306 | MACHINE_END | 307 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index 77142c13fa13..83126368ed99 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <plat/mcspi.h> | 33 | #include <plat/mcspi.h> |
34 | #include <plat/board.h> | 34 | #include <plat/board.h> |
35 | #include <plat/usb.h> | 35 | #include <plat/usb.h> |
36 | #include <plat/common.h> | 36 | #include "common.h" |
37 | #include <plat/dma.h> | 37 | #include <plat/dma.h> |
38 | #include <plat/gpmc.h> | 38 | #include <plat/gpmc.h> |
39 | #include <video/omapdss.h> | 39 | #include <video/omapdss.h> |
@@ -728,6 +728,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
728 | .map_io = omap3_map_io, | 728 | .map_io = omap3_map_io, |
729 | .init_early = omap3430_init_early, | 729 | .init_early = omap3430_init_early, |
730 | .init_irq = omap3_init_irq, | 730 | .init_irq = omap3_init_irq, |
731 | .handle_irq = omap3_intc_handle_irq, | ||
731 | .init_machine = omap_3430sdp_init, | 732 | .init_machine = omap_3430sdp_init, |
732 | .timer = &omap3_timer, | 733 | .timer = &omap3_timer, |
733 | MACHINE_END | 734 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index f552305162fc..7969dd904bd3 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
17 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
18 | 18 | ||
19 | #include <plat/common.h> | 19 | #include "common.h" |
20 | #include <plat/board.h> | 20 | #include <plat/board.h> |
21 | #include <plat/gpmc-smc91x.h> | 21 | #include <plat/gpmc-smc91x.h> |
22 | #include <plat/usb.h> | 22 | #include <plat/usb.h> |
@@ -215,6 +215,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
215 | .map_io = omap3_map_io, | 215 | .map_io = omap3_map_io, |
216 | .init_early = omap3630_init_early, | 216 | .init_early = omap3630_init_early, |
217 | .init_irq = omap3_init_irq, | 217 | .init_irq = omap3_init_irq, |
218 | .handle_irq = omap3_intc_handle_irq, | ||
218 | .init_machine = omap_sdp_init, | 219 | .init_machine = omap_sdp_init, |
219 | .timer = &omap3_timer, | 220 | .timer = &omap3_timer, |
220 | MACHINE_END | 221 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 515646886b59..ef2bbc09428a 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -27,13 +27,13 @@ | |||
27 | #include <linux/leds_pwm.h> | 27 | #include <linux/leds_pwm.h> |
28 | 28 | ||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/omap4-common.h> | 30 | #include <asm/hardware/gic.h> |
31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
34 | 34 | ||
35 | #include <plat/board.h> | 35 | #include <plat/board.h> |
36 | #include <plat/common.h> | 36 | #include "common.h" |
37 | #include <plat/usb.h> | 37 | #include <plat/usb.h> |
38 | #include <plat/mmc.h> | 38 | #include <plat/mmc.h> |
39 | #include <plat/omap4-keypad.h> | 39 | #include <plat/omap4-keypad.h> |
@@ -984,6 +984,7 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
984 | .map_io = omap4_map_io, | 984 | .map_io = omap4_map_io, |
985 | .init_early = omap4430_init_early, | 985 | .init_early = omap4430_init_early, |
986 | .init_irq = gic_init_irq, | 986 | .init_irq = gic_init_irq, |
987 | .handle_irq = gic_handle_irq, | ||
987 | .init_machine = omap_4430sdp_init, | 988 | .init_machine = omap_4430sdp_init, |
988 | .timer = &omap4_timer, | 989 | .timer = &omap4_timer, |
989 | MACHINE_END | 990 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 7834536ab416..7e90f93263db 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
28 | 28 | ||
29 | #include <plat/board.h> | 29 | #include <plat/board.h> |
30 | #include <plat/common.h> | 30 | #include "common.h" |
31 | #include <plat/usb.h> | 31 | #include <plat/usb.h> |
32 | 32 | ||
33 | #include "mux.h" | 33 | #include "mux.h" |
@@ -98,6 +98,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
98 | .map_io = omap3_map_io, | 98 | .map_io = omap3_map_io, |
99 | .init_early = am35xx_init_early, | 99 | .init_early = am35xx_init_early, |
100 | .init_irq = omap3_init_irq, | 100 | .init_irq = omap3_init_irq, |
101 | .handle_irq = omap3_intc_handle_irq, | ||
101 | .init_machine = am3517_crane_init, | 102 | .init_machine = am3517_crane_init, |
102 | .timer = &omap3_timer, | 103 | .timer = &omap3_timer, |
103 | MACHINE_END | 104 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index d314f033c9df..551cae8d9b8a 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
33 | 33 | ||
34 | #include <plat/board.h> | 34 | #include <plat/board.h> |
35 | #include <plat/common.h> | 35 | #include "common.h" |
36 | #include <plat/usb.h> | 36 | #include <plat/usb.h> |
37 | #include <video/omapdss.h> | 37 | #include <video/omapdss.h> |
38 | #include <video/omap-panel-generic-dpi.h> | 38 | #include <video/omap-panel-generic-dpi.h> |
@@ -491,6 +491,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
491 | .map_io = omap3_map_io, | 491 | .map_io = omap3_map_io, |
492 | .init_early = am35xx_init_early, | 492 | .init_early = am35xx_init_early, |
493 | .init_irq = omap3_init_irq, | 493 | .init_irq = omap3_init_irq, |
494 | .handle_irq = omap3_intc_handle_irq, | ||
494 | .init_machine = am3517_evm_init, | 495 | .init_machine = am3517_evm_init, |
495 | .timer = &omap3_timer, | 496 | .timer = &omap3_timer, |
496 | MACHINE_END | 497 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index de8134b7f580..5a66480feed0 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c | |||
@@ -37,7 +37,7 @@ | |||
37 | #include <plat/led.h> | 37 | #include <plat/led.h> |
38 | #include <plat/usb.h> | 38 | #include <plat/usb.h> |
39 | #include <plat/board.h> | 39 | #include <plat/board.h> |
40 | #include <plat/common.h> | 40 | #include "common.h" |
41 | #include <plat/gpmc.h> | 41 | #include <plat/gpmc.h> |
42 | 42 | ||
43 | #include <video/omapdss.h> | 43 | #include <video/omapdss.h> |
@@ -354,6 +354,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | |||
354 | .map_io = omap242x_map_io, | 354 | .map_io = omap242x_map_io, |
355 | .init_early = omap2420_init_early, | 355 | .init_early = omap2420_init_early, |
356 | .init_irq = omap2_init_irq, | 356 | .init_irq = omap2_init_irq, |
357 | .handle_irq = omap2_intc_handle_irq, | ||
357 | .init_machine = omap_apollon_init, | 358 | .init_machine = omap_apollon_init, |
358 | .timer = &omap2_timer, | 359 | .timer = &omap2_timer, |
359 | MACHINE_END | 360 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index bd1bcacb40f9..510b6a2ff0fa 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -37,7 +37,7 @@ | |||
37 | #include <asm/mach/map.h> | 37 | #include <asm/mach/map.h> |
38 | 38 | ||
39 | #include <plat/board.h> | 39 | #include <plat/board.h> |
40 | #include <plat/common.h> | 40 | #include "common.h" |
41 | #include <plat/nand.h> | 41 | #include <plat/nand.h> |
42 | #include <plat/gpmc.h> | 42 | #include <plat/gpmc.h> |
43 | #include <plat/usb.h> | 43 | #include <plat/usb.h> |
@@ -634,6 +634,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35") | |||
634 | .map_io = omap3_map_io, | 634 | .map_io = omap3_map_io, |
635 | .init_early = omap35xx_init_early, | 635 | .init_early = omap35xx_init_early, |
636 | .init_irq = omap3_init_irq, | 636 | .init_irq = omap3_init_irq, |
637 | .handle_irq = omap3_intc_handle_irq, | ||
637 | .init_machine = cm_t35_init, | 638 | .init_machine = cm_t35_init, |
638 | .timer = &omap3_timer, | 639 | .timer = &omap3_timer, |
639 | MACHINE_END | 640 | MACHINE_END |
@@ -644,6 +645,7 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730") | |||
644 | .map_io = omap3_map_io, | 645 | .map_io = omap3_map_io, |
645 | .init_early = omap3630_init_early, | 646 | .init_early = omap3630_init_early, |
646 | .init_irq = omap3_init_irq, | 647 | .init_irq = omap3_init_irq, |
648 | .handle_irq = omap3_intc_handle_irq, | ||
647 | .init_machine = cm_t3730_init, | 649 | .init_machine = cm_t3730_init, |
648 | .timer = &omap3_timer, | 650 | .timer = &omap3_timer, |
649 | MACHINE_END | 651 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index 3f4dc6626845..efc5cedb1fbb 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <asm/mach/map.h> | 39 | #include <asm/mach/map.h> |
40 | 40 | ||
41 | #include <plat/board.h> | 41 | #include <plat/board.h> |
42 | #include <plat/common.h> | 42 | #include "common.h" |
43 | #include <plat/usb.h> | 43 | #include <plat/usb.h> |
44 | #include <plat/nand.h> | 44 | #include <plat/nand.h> |
45 | #include <plat/gpmc.h> | 45 | #include <plat/gpmc.h> |
@@ -299,6 +299,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
299 | .map_io = omap3_map_io, | 299 | .map_io = omap3_map_io, |
300 | .init_early = am35xx_init_early, | 300 | .init_early = am35xx_init_early, |
301 | .init_irq = omap3_init_irq, | 301 | .init_irq = omap3_init_irq, |
302 | .handle_irq = omap3_intc_handle_irq, | ||
302 | .init_machine = cm_t3517_init, | 303 | .init_machine = cm_t3517_init, |
303 | .timer = &omap3_timer, | 304 | .timer = &omap3_timer, |
304 | MACHINE_END | 305 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 90154e411da0..d81ea7fa75ef 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <asm/mach/flash.h> | 41 | #include <asm/mach/flash.h> |
42 | 42 | ||
43 | #include <plat/board.h> | 43 | #include <plat/board.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | #include <plat/gpmc.h> | 45 | #include <plat/gpmc.h> |
46 | #include <plat/nand.h> | 46 | #include <plat/nand.h> |
47 | #include <plat/usb.h> | 47 | #include <plat/usb.h> |
@@ -660,6 +660,7 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
660 | .map_io = omap3_map_io, | 660 | .map_io = omap3_map_io, |
661 | .init_early = omap35xx_init_early, | 661 | .init_early = omap35xx_init_early, |
662 | .init_irq = omap3_init_irq, | 662 | .init_irq = omap3_init_irq, |
663 | .handle_irq = omap3_intc_handle_irq, | ||
663 | .init_machine = devkit8000_init, | 664 | .init_machine = devkit8000_init, |
664 | .timer = &omap3_secure_timer, | 665 | .timer = &omap3_secure_timer, |
665 | MACHINE_END | 666 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index fb55fa3dad5a..63b54163b993 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -20,8 +20,7 @@ | |||
20 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
21 | 21 | ||
22 | #include <plat/board.h> | 22 | #include <plat/board.h> |
23 | #include <plat/common.h> | 23 | #include "common.h" |
24 | #include <mach/omap4-common.h> | ||
25 | #include "common-board-devices.h" | 24 | #include "common-board-devices.h" |
26 | 25 | ||
27 | /* | 26 | /* |
@@ -122,6 +121,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") | |||
122 | .map_io = omap243x_map_io, | 121 | .map_io = omap243x_map_io, |
123 | .init_early = omap2430_init_early, | 122 | .init_early = omap2430_init_early, |
124 | .init_irq = omap2_init_irq, | 123 | .init_irq = omap2_init_irq, |
124 | .handle_irq = omap2_intc_handle_irq, | ||
125 | .init_machine = omap_generic_init, | 125 | .init_machine = omap_generic_init, |
126 | .timer = &omap2_timer, | 126 | .timer = &omap2_timer, |
127 | .dt_compat = omap243x_boards_compat, | 127 | .dt_compat = omap243x_boards_compat, |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 8b351d92a1cc..ec4018362e8e 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -34,7 +34,7 @@ | |||
34 | 34 | ||
35 | #include <plat/usb.h> | 35 | #include <plat/usb.h> |
36 | #include <plat/board.h> | 36 | #include <plat/board.h> |
37 | #include <plat/common.h> | 37 | #include "common.h" |
38 | #include <plat/menelaus.h> | 38 | #include <plat/menelaus.h> |
39 | #include <plat/dma.h> | 39 | #include <plat/dma.h> |
40 | #include <plat/gpmc.h> | 40 | #include <plat/gpmc.h> |
@@ -396,6 +396,7 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
396 | .map_io = omap242x_map_io, | 396 | .map_io = omap242x_map_io, |
397 | .init_early = omap2420_init_early, | 397 | .init_early = omap2420_init_early, |
398 | .init_irq = omap2_init_irq, | 398 | .init_irq = omap2_init_irq, |
399 | .handle_irq = omap2_intc_handle_irq, | ||
399 | .init_machine = omap_h4_init, | 400 | .init_machine = omap_h4_init, |
400 | .timer = &omap2_timer, | 401 | .timer = &omap2_timer, |
401 | MACHINE_END | 402 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index d0a3f78a9b69..5949f6ae3edf 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <asm/mach/arch.h> | 28 | #include <asm/mach/arch.h> |
29 | 29 | ||
30 | #include <plat/board.h> | 30 | #include <plat/board.h> |
31 | #include <plat/common.h> | 31 | #include "common.h" |
32 | #include <plat/gpmc.h> | 32 | #include <plat/gpmc.h> |
33 | #include <plat/usb.h> | 33 | #include <plat/usb.h> |
34 | #include <video/omapdss.h> | 34 | #include <video/omapdss.h> |
@@ -672,6 +672,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
672 | .map_io = omap3_map_io, | 672 | .map_io = omap3_map_io, |
673 | .init_early = omap35xx_init_early, | 673 | .init_early = omap35xx_init_early, |
674 | .init_irq = omap3_init_irq, | 674 | .init_irq = omap3_init_irq, |
675 | .handle_irq = omap3_intc_handle_irq, | ||
675 | .init_machine = igep_init, | 676 | .init_machine = igep_init, |
676 | .timer = &omap3_timer, | 677 | .timer = &omap3_timer, |
677 | MACHINE_END | 678 | MACHINE_END |
@@ -682,6 +683,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
682 | .map_io = omap3_map_io, | 683 | .map_io = omap3_map_io, |
683 | .init_early = omap35xx_init_early, | 684 | .init_early = omap35xx_init_early, |
684 | .init_irq = omap3_init_irq, | 685 | .init_irq = omap3_init_irq, |
686 | .handle_irq = omap3_intc_handle_irq, | ||
685 | .init_machine = igep_init, | 687 | .init_machine = igep_init, |
686 | .timer = &omap3_timer, | 688 | .timer = &omap3_timer, |
687 | MACHINE_END | 689 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index e179da0c4da5..13bde0e66934 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | #include <plat/mcspi.h> | 37 | #include <plat/mcspi.h> |
38 | #include <plat/board.h> | 38 | #include <plat/board.h> |
39 | #include <plat/common.h> | 39 | #include "common.h" |
40 | #include <plat/gpmc.h> | 40 | #include <plat/gpmc.h> |
41 | #include <mach/board-zoom.h> | 41 | #include <mach/board-zoom.h> |
42 | 42 | ||
@@ -434,6 +434,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
434 | .map_io = omap3_map_io, | 434 | .map_io = omap3_map_io, |
435 | .init_early = omap3430_init_early, | 435 | .init_early = omap3430_init_early, |
436 | .init_irq = omap3_init_irq, | 436 | .init_irq = omap3_init_irq, |
437 | .handle_irq = omap3_intc_handle_irq, | ||
437 | .init_machine = omap_ldp_init, | 438 | .init_machine = omap_ldp_init, |
438 | .timer = &omap3_timer, | 439 | .timer = &omap3_timer, |
439 | MACHINE_END | 440 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index e9d5f4a3d064..bebd3d84365e 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
27 | 27 | ||
28 | #include <plat/board.h> | 28 | #include <plat/board.h> |
29 | #include <plat/common.h> | 29 | #include "common.h" |
30 | #include <plat/menelaus.h> | 30 | #include <plat/menelaus.h> |
31 | #include <mach/irqs.h> | 31 | #include <mach/irqs.h> |
32 | #include <plat/mcspi.h> | 32 | #include <plat/mcspi.h> |
@@ -689,6 +689,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
689 | .map_io = omap242x_map_io, | 689 | .map_io = omap242x_map_io, |
690 | .init_early = omap2420_init_early, | 690 | .init_early = omap2420_init_early, |
691 | .init_irq = omap2_init_irq, | 691 | .init_irq = omap2_init_irq, |
692 | .handle_irq = omap2_intc_handle_irq, | ||
692 | .init_machine = n8x0_init_machine, | 693 | .init_machine = n8x0_init_machine, |
693 | .timer = &omap2_timer, | 694 | .timer = &omap2_timer, |
694 | MACHINE_END | 695 | MACHINE_END |
@@ -699,6 +700,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
699 | .map_io = omap242x_map_io, | 700 | .map_io = omap242x_map_io, |
700 | .init_early = omap2420_init_early, | 701 | .init_early = omap2420_init_early, |
701 | .init_irq = omap2_init_irq, | 702 | .init_irq = omap2_init_irq, |
703 | .handle_irq = omap2_intc_handle_irq, | ||
702 | .init_machine = n8x0_init_machine, | 704 | .init_machine = n8x0_init_machine, |
703 | .timer = &omap2_timer, | 705 | .timer = &omap2_timer, |
704 | MACHINE_END | 706 | MACHINE_END |
@@ -709,6 +711,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
709 | .map_io = omap242x_map_io, | 711 | .map_io = omap242x_map_io, |
710 | .init_early = omap2420_init_early, | 712 | .init_early = omap2420_init_early, |
711 | .init_irq = omap2_init_irq, | 713 | .init_irq = omap2_init_irq, |
714 | .handle_irq = omap2_intc_handle_irq, | ||
712 | .init_machine = n8x0_init_machine, | 715 | .init_machine = n8x0_init_machine, |
713 | .timer = &omap2_timer, | 716 | .timer = &omap2_timer, |
714 | MACHINE_END | 717 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 4a71cb7e42d4..c34f56588284 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/mach/flash.h> | 40 | #include <asm/mach/flash.h> |
41 | 41 | ||
42 | #include <plat/board.h> | 42 | #include <plat/board.h> |
43 | #include <plat/common.h> | 43 | #include "common.h" |
44 | #include <video/omapdss.h> | 44 | #include <video/omapdss.h> |
45 | #include <video/omap-panel-dvi.h> | 45 | #include <video/omap-panel-dvi.h> |
46 | #include <plat/gpmc.h> | 46 | #include <plat/gpmc.h> |
@@ -559,6 +559,7 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
559 | .map_io = omap3_map_io, | 559 | .map_io = omap3_map_io, |
560 | .init_early = omap3_init_early, | 560 | .init_early = omap3_init_early, |
561 | .init_irq = omap3_init_irq, | 561 | .init_irq = omap3_init_irq, |
562 | .handle_irq = omap3_intc_handle_irq, | ||
562 | .init_machine = omap3_beagle_init, | 563 | .init_machine = omap3_beagle_init, |
563 | .timer = &omap3_secure_timer, | 564 | .timer = &omap3_secure_timer, |
564 | MACHINE_END | 565 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index ec00b2ec7022..f11bc444e7be 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -43,7 +43,7 @@ | |||
43 | 43 | ||
44 | #include <plat/board.h> | 44 | #include <plat/board.h> |
45 | #include <plat/usb.h> | 45 | #include <plat/usb.h> |
46 | #include <plat/common.h> | 46 | #include "common.h" |
47 | #include <plat/mcspi.h> | 47 | #include <plat/mcspi.h> |
48 | #include <video/omapdss.h> | 48 | #include <video/omapdss.h> |
49 | #include <video/omap-panel-dvi.h> | 49 | #include <video/omap-panel-dvi.h> |
@@ -681,6 +681,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
681 | .map_io = omap3_map_io, | 681 | .map_io = omap3_map_io, |
682 | .init_early = omap35xx_init_early, | 682 | .init_early = omap35xx_init_early, |
683 | .init_irq = omap3_init_irq, | 683 | .init_irq = omap3_init_irq, |
684 | .handle_irq = omap3_intc_handle_irq, | ||
684 | .init_machine = omap3_evm_init, | 685 | .init_machine = omap3_evm_init, |
685 | .timer = &omap3_timer, | 686 | .timer = &omap3_timer, |
686 | MACHINE_END | 687 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 7c0f193f246d..5fa6bad9574e 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | #include <plat/mux.h> | 41 | #include <plat/mux.h> |
42 | #include <plat/board.h> | 42 | #include <plat/board.h> |
43 | #include <plat/common.h> | 43 | #include "common.h" |
44 | #include <plat/gpmc-smsc911x.h> | 44 | #include <plat/gpmc-smsc911x.h> |
45 | #include <plat/gpmc.h> | 45 | #include <plat/gpmc.h> |
46 | #include <plat/sdrc.h> | 46 | #include <plat/sdrc.h> |
@@ -208,6 +208,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
208 | .map_io = omap3_map_io, | 208 | .map_io = omap3_map_io, |
209 | .init_early = omap35xx_init_early, | 209 | .init_early = omap35xx_init_early, |
210 | .init_irq = omap3_init_irq, | 210 | .init_irq = omap3_init_irq, |
211 | .handle_irq = omap3_intc_handle_irq, | ||
211 | .init_machine = omap3logic_init, | 212 | .init_machine = omap3logic_init, |
212 | .timer = &omap3_timer, | 213 | .timer = &omap3_timer, |
213 | MACHINE_END | 214 | MACHINE_END |
@@ -217,6 +218,7 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | |||
217 | .map_io = omap3_map_io, | 218 | .map_io = omap3_map_io, |
218 | .init_early = omap35xx_init_early, | 219 | .init_early = omap35xx_init_early, |
219 | .init_irq = omap3_init_irq, | 220 | .init_irq = omap3_init_irq, |
221 | .handle_irq = omap3_intc_handle_irq, | ||
220 | .init_machine = omap3logic_init, | 222 | .init_machine = omap3logic_init, |
221 | .timer = &omap3_timer, | 223 | .timer = &omap3_timer, |
222 | MACHINE_END | 224 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index f7811f4cfc3d..ef315c585b75 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <asm/mach/map.h> | 41 | #include <asm/mach/map.h> |
42 | 42 | ||
43 | #include <plat/board.h> | 43 | #include <plat/board.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | #include <mach/hardware.h> | 45 | #include <mach/hardware.h> |
46 | #include <plat/mcspi.h> | 46 | #include <plat/mcspi.h> |
47 | #include <plat/usb.h> | 47 | #include <plat/usb.h> |
@@ -606,6 +606,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
606 | .map_io = omap3_map_io, | 606 | .map_io = omap3_map_io, |
607 | .init_early = omap35xx_init_early, | 607 | .init_early = omap35xx_init_early, |
608 | .init_irq = omap3_init_irq, | 608 | .init_irq = omap3_init_irq, |
609 | .handle_irq = omap3_intc_handle_irq, | ||
609 | .init_machine = omap3pandora_init, | 610 | .init_machine = omap3pandora_init, |
610 | .timer = &omap3_timer, | 611 | .timer = &omap3_timer, |
611 | MACHINE_END | 612 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index ddb7d6663c6d..b21d70a2e4a7 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <asm/mach/flash.h> | 35 | #include <asm/mach/flash.h> |
36 | 36 | ||
37 | #include <plat/board.h> | 37 | #include <plat/board.h> |
38 | #include <plat/common.h> | 38 | #include "common.h" |
39 | #include <plat/gpmc.h> | 39 | #include <plat/gpmc.h> |
40 | #include <plat/nand.h> | 40 | #include <plat/nand.h> |
41 | #include <plat/usb.h> | 41 | #include <plat/usb.h> |
@@ -454,6 +454,7 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
454 | .map_io = omap3_map_io, | 454 | .map_io = omap3_map_io, |
455 | .init_early = omap35xx_init_early, | 455 | .init_early = omap35xx_init_early, |
456 | .init_irq = omap3_init_irq, | 456 | .init_irq = omap3_init_irq, |
457 | .handle_irq = omap3_intc_handle_irq, | ||
457 | .init_machine = omap3_stalker_init, | 458 | .init_machine = omap3_stalker_init, |
458 | .timer = &omap3_secure_timer, | 459 | .timer = &omap3_secure_timer, |
459 | MACHINE_END | 460 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index a2d0d1971e27..18cd340f9b7b 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include <asm/mach/flash.h> | 44 | #include <asm/mach/flash.h> |
45 | 45 | ||
46 | #include <plat/board.h> | 46 | #include <plat/board.h> |
47 | #include <plat/common.h> | 47 | #include "common.h" |
48 | #include <plat/gpmc.h> | 48 | #include <plat/gpmc.h> |
49 | #include <plat/nand.h> | 49 | #include <plat/nand.h> |
50 | #include <plat/usb.h> | 50 | #include <plat/usb.h> |
@@ -381,6 +381,7 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
381 | .map_io = omap3_map_io, | 381 | .map_io = omap3_map_io, |
382 | .init_early = omap3430_init_early, | 382 | .init_early = omap3430_init_early, |
383 | .init_irq = omap3_init_irq, | 383 | .init_irq = omap3_init_irq, |
384 | .handle_irq = omap3_intc_handle_irq, | ||
384 | .init_machine = omap3_touchbook_init, | 385 | .init_machine = omap3_touchbook_init, |
385 | .timer = &omap3_secure_timer, | 386 | .timer = &omap3_secure_timer, |
386 | MACHINE_END | 387 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index a8c2c4263e38..b6f114436dbc 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -30,14 +30,14 @@ | |||
30 | #include <linux/wl12xx.h> | 30 | #include <linux/wl12xx.h> |
31 | 31 | ||
32 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
33 | #include <mach/omap4-common.h> | 33 | #include <asm/hardware/gic.h> |
34 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
36 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
37 | #include <video/omapdss.h> | 37 | #include <video/omapdss.h> |
38 | 38 | ||
39 | #include <plat/board.h> | 39 | #include <plat/board.h> |
40 | #include <plat/common.h> | 40 | #include "common.h" |
41 | #include <plat/usb.h> | 41 | #include <plat/usb.h> |
42 | #include <plat/mmc.h> | 42 | #include <plat/mmc.h> |
43 | #include <video/omap-panel-dvi.h> | 43 | #include <video/omap-panel-dvi.h> |
@@ -577,6 +577,7 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
577 | .map_io = omap4_map_io, | 577 | .map_io = omap4_map_io, |
578 | .init_early = omap4430_init_early, | 578 | .init_early = omap4430_init_early, |
579 | .init_irq = gic_init_irq, | 579 | .init_irq = gic_init_irq, |
580 | .handle_irq = gic_handle_irq, | ||
580 | .init_machine = omap4_panda_init, | 581 | .init_machine = omap4_panda_init, |
581 | .timer = &omap4_timer, | 582 | .timer = &omap4_timer, |
582 | MACHINE_END | 583 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 4cf7aeabab86..60a61ea759bf 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <asm/mach/map.h> | 43 | #include <asm/mach/map.h> |
44 | 44 | ||
45 | #include <plat/board.h> | 45 | #include <plat/board.h> |
46 | #include <plat/common.h> | 46 | #include "common.h" |
47 | #include <video/omapdss.h> | 47 | #include <video/omapdss.h> |
48 | #include <video/omap-panel-generic-dpi.h> | 48 | #include <video/omap-panel-generic-dpi.h> |
49 | #include <video/omap-panel-dvi.h> | 49 | #include <video/omap-panel-dvi.h> |
@@ -562,6 +562,7 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
562 | .map_io = omap3_map_io, | 562 | .map_io = omap3_map_io, |
563 | .init_early = omap35xx_init_early, | 563 | .init_early = omap35xx_init_early, |
564 | .init_irq = omap3_init_irq, | 564 | .init_irq = omap3_init_irq, |
565 | .handle_irq = omap3_intc_handle_irq, | ||
565 | .init_machine = overo_init, | 566 | .init_machine = overo_init, |
566 | .timer = &omap3_timer, | 567 | .timer = &omap3_timer, |
567 | MACHINE_END | 568 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 616fb39763b0..a79d49e3fe09 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <plat/mmc.h> | 25 | #include <plat/mmc.h> |
26 | #include <plat/usb.h> | 26 | #include <plat/usb.h> |
27 | #include <plat/gpmc.h> | 27 | #include <plat/gpmc.h> |
28 | #include <plat/common.h> | 28 | #include "common.h" |
29 | #include <plat/onenand.h> | 29 | #include <plat/onenand.h> |
30 | 30 | ||
31 | #include "mux.h" | 31 | #include "mux.h" |
@@ -149,6 +149,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
149 | .map_io = omap3_map_io, | 149 | .map_io = omap3_map_io, |
150 | .init_early = omap3630_init_early, | 150 | .init_early = omap3630_init_early, |
151 | .init_irq = omap3_init_irq, | 151 | .init_irq = omap3_init_irq, |
152 | .handle_irq = omap3_intc_handle_irq, | ||
152 | .init_machine = rm680_init, | 153 | .init_machine = rm680_init, |
153 | .timer = &omap3_timer, | 154 | .timer = &omap3_timer, |
154 | MACHINE_END | 155 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index ba1aa07bdb29..bd18d691c6ad 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | #include <plat/mcspi.h> | 28 | #include <plat/mcspi.h> |
29 | #include <plat/board.h> | 29 | #include <plat/board.h> |
30 | #include <plat/common.h> | 30 | #include "common.h" |
31 | #include <plat/dma.h> | 31 | #include <plat/dma.h> |
32 | #include <plat/gpmc.h> | 32 | #include <plat/gpmc.h> |
33 | #include <plat/onenand.h> | 33 | #include <plat/onenand.h> |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index 4af7c4b2881a..4e3c0965edf3 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -25,7 +25,7 @@ | |||
25 | 25 | ||
26 | #include <plat/mcspi.h> | 26 | #include <plat/mcspi.h> |
27 | #include <plat/board.h> | 27 | #include <plat/board.h> |
28 | #include <plat/common.h> | 28 | #include "common.h" |
29 | #include <plat/dma.h> | 29 | #include <plat/dma.h> |
30 | #include <plat/gpmc.h> | 30 | #include <plat/gpmc.h> |
31 | #include <plat/usb.h> | 31 | #include <plat/usb.h> |
@@ -127,6 +127,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
127 | .map_io = omap3_map_io, | 127 | .map_io = omap3_map_io, |
128 | .init_early = omap3430_init_early, | 128 | .init_early = omap3430_init_early, |
129 | .init_irq = omap3_init_irq, | 129 | .init_irq = omap3_init_irq, |
130 | .handle_irq = omap3_intc_handle_irq, | ||
130 | .init_machine = rx51_init, | 131 | .init_machine = rx51_init, |
131 | .timer = &omap3_timer, | 132 | .timer = &omap3_timer, |
132 | MACHINE_END | 133 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index e6ee8842285c..8402b39b2840 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | #include <plat/irqs.h> | 23 | #include <plat/irqs.h> |
24 | #include <plat/board.h> | 24 | #include <plat/board.h> |
25 | #include <plat/common.h> | 25 | #include "common.h" |
26 | 26 | ||
27 | static struct omap_board_config_kernel ti8168_evm_config[] __initdata = { | 27 | static struct omap_board_config_kernel ti8168_evm_config[] __initdata = { |
28 | }; | 28 | }; |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 6d0aa4fcb7c3..8d7ce11cfeaf 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
25 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
26 | 26 | ||
27 | #include <plat/common.h> | 27 | #include "common.h" |
28 | #include <plat/usb.h> | 28 | #include <plat/usb.h> |
29 | 29 | ||
30 | #include <mach/board-zoom.h> | 30 | #include <mach/board-zoom.h> |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index be6684dc4f55..70e5b54a2115 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
22 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
23 | 23 | ||
24 | #include <plat/common.h> | 24 | #include "common.h" |
25 | #include <plat/board.h> | 25 | #include <plat/board.h> |
26 | #include <plat/usb.h> | 26 | #include <plat/usb.h> |
27 | 27 | ||
@@ -135,6 +135,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
135 | .map_io = omap3_map_io, | 135 | .map_io = omap3_map_io, |
136 | .init_early = omap3430_init_early, | 136 | .init_early = omap3430_init_early, |
137 | .init_irq = omap3_init_irq, | 137 | .init_irq = omap3_init_irq, |
138 | .handle_irq = omap3_intc_handle_irq, | ||
138 | .init_machine = omap_zoom_init, | 139 | .init_machine = omap_zoom_init, |
139 | .timer = &omap3_timer, | 140 | .timer = &omap3_timer, |
140 | MACHINE_END | 141 | MACHINE_END |
@@ -145,6 +146,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
145 | .map_io = omap3_map_io, | 146 | .map_io = omap3_map_io, |
146 | .init_early = omap3630_init_early, | 147 | .init_early = omap3630_init_early, |
147 | .init_irq = omap3_init_irq, | 148 | .init_irq = omap3_init_irq, |
149 | .handle_irq = omap3_intc_handle_irq, | ||
148 | .init_machine = omap_zoom_init, | 150 | .init_machine = omap_zoom_init, |
149 | .timer = &omap3_timer, | 151 | .timer = &omap3_timer, |
150 | MACHINE_END | 152 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/cm2xxx_3xxx.c b/arch/arm/mach-omap2/cm2xxx_3xxx.c index 38830d8d4783..04d39cdd2112 100644 --- a/arch/arm/mach-omap2/cm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/cm2xxx_3xxx.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | 20 | ||
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | 22 | ||
23 | #include "cm.h" | 23 | #include "cm.h" |
24 | #include "cm2xxx_3xxx.h" | 24 | #include "cm2xxx_3xxx.h" |
diff --git a/arch/arm/mach-omap2/cm44xx.c b/arch/arm/mach-omap2/cm44xx.c index e96f53ea01a1..6a836303252c 100644 --- a/arch/arm/mach-omap2/cm44xx.c +++ b/arch/arm/mach-omap2/cm44xx.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | 20 | ||
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | 22 | ||
23 | #include "cm.h" | 23 | #include "cm.h" |
24 | #include "cm1_44xx.h" | 24 | #include "cm1_44xx.h" |
diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index eb2a472bbf46..6204deaf85b1 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <linux/err.h> | 20 | #include <linux/err.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | 22 | ||
23 | #include <plat/common.h> | 23 | #include "common.h" |
24 | 24 | ||
25 | #include "cm.h" | 25 | #include "cm.h" |
26 | #include "cm1_44xx.h" | 26 | #include "cm1_44xx.h" |
diff --git a/arch/arm/mach-omap2/common.c b/arch/arm/mach-omap2/common.c index 110e5b9db145..684b8a7cd401 100644 --- a/arch/arm/mach-omap2/common.c +++ b/arch/arm/mach-omap2/common.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/clk.h> | 17 | #include <linux/clk.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | 19 | ||
20 | #include <plat/common.h> | 20 | #include "common.h" |
21 | #include <plat/board.h> | 21 | #include <plat/board.h> |
22 | #include <plat/mux.h> | 22 | #include <plat/mux.h> |
23 | 23 | ||
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h new file mode 100644 index 000000000000..012bac7d56a5 --- /dev/null +++ b/arch/arm/mach-omap2/common.h | |||
@@ -0,0 +1,185 @@ | |||
1 | /* | ||
2 | * Header for code common to all OMAP2+ machines. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
10 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
12 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
13 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
14 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
15 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
16 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
17 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
18 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
19 | * | ||
20 | * You should have received a copy of the GNU General Public License along | ||
21 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
22 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
23 | */ | ||
24 | |||
25 | #ifndef __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H | ||
26 | #define __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H | ||
27 | |||
28 | #include <linux/delay.h> | ||
29 | #include <plat/common.h> | ||
30 | |||
31 | #ifdef CONFIG_SOC_OMAP2420 | ||
32 | extern void omap242x_map_common_io(void); | ||
33 | #else | ||
34 | static inline void omap242x_map_common_io(void) | ||
35 | { | ||
36 | } | ||
37 | #endif | ||
38 | |||
39 | #ifdef CONFIG_SOC_OMAP2430 | ||
40 | extern void omap243x_map_common_io(void); | ||
41 | #else | ||
42 | static inline void omap243x_map_common_io(void) | ||
43 | { | ||
44 | } | ||
45 | #endif | ||
46 | |||
47 | #ifdef CONFIG_ARCH_OMAP3 | ||
48 | extern void omap34xx_map_common_io(void); | ||
49 | #else | ||
50 | static inline void omap34xx_map_common_io(void) | ||
51 | { | ||
52 | } | ||
53 | #endif | ||
54 | |||
55 | #ifdef CONFIG_SOC_OMAPTI816X | ||
56 | extern void omapti816x_map_common_io(void); | ||
57 | #else | ||
58 | static inline void omapti816x_map_common_io(void) | ||
59 | { | ||
60 | } | ||
61 | #endif | ||
62 | |||
63 | #ifdef CONFIG_ARCH_OMAP4 | ||
64 | extern void omap44xx_map_common_io(void); | ||
65 | #else | ||
66 | static inline void omap44xx_map_common_io(void) | ||
67 | { | ||
68 | } | ||
69 | #endif | ||
70 | |||
71 | extern void omap2_init_common_infrastructure(void); | ||
72 | |||
73 | extern struct sys_timer omap2_timer; | ||
74 | extern struct sys_timer omap3_timer; | ||
75 | extern struct sys_timer omap3_secure_timer; | ||
76 | extern struct sys_timer omap4_timer; | ||
77 | |||
78 | void omap2420_init_early(void); | ||
79 | void omap2430_init_early(void); | ||
80 | void omap3430_init_early(void); | ||
81 | void omap35xx_init_early(void); | ||
82 | void omap3630_init_early(void); | ||
83 | void omap3_init_early(void); /* Do not use this one */ | ||
84 | void am35xx_init_early(void); | ||
85 | void ti816x_init_early(void); | ||
86 | void omap4430_init_early(void); | ||
87 | |||
88 | /* | ||
89 | * IO bases for various OMAP processors | ||
90 | * Except the tap base, rest all the io bases | ||
91 | * listed are physical addresses. | ||
92 | */ | ||
93 | struct omap_globals { | ||
94 | u32 class; /* OMAP class to detect */ | ||
95 | void __iomem *tap; /* Control module ID code */ | ||
96 | void __iomem *sdrc; /* SDRAM Controller */ | ||
97 | void __iomem *sms; /* SDRAM Memory Scheduler */ | ||
98 | void __iomem *ctrl; /* System Control Module */ | ||
99 | void __iomem *ctrl_pad; /* PAD Control Module */ | ||
100 | void __iomem *prm; /* Power and Reset Management */ | ||
101 | void __iomem *cm; /* Clock Management */ | ||
102 | void __iomem *cm2; | ||
103 | }; | ||
104 | |||
105 | void omap2_set_globals_242x(void); | ||
106 | void omap2_set_globals_243x(void); | ||
107 | void omap2_set_globals_3xxx(void); | ||
108 | void omap2_set_globals_443x(void); | ||
109 | void omap2_set_globals_ti816x(void); | ||
110 | |||
111 | /* These get called from omap2_set_globals_xxxx(), do not call these */ | ||
112 | void omap2_set_globals_tap(struct omap_globals *); | ||
113 | void omap2_set_globals_sdrc(struct omap_globals *); | ||
114 | void omap2_set_globals_control(struct omap_globals *); | ||
115 | void omap2_set_globals_prcm(struct omap_globals *); | ||
116 | |||
117 | void omap242x_map_io(void); | ||
118 | void omap243x_map_io(void); | ||
119 | void omap3_map_io(void); | ||
120 | void omap4_map_io(void); | ||
121 | |||
122 | /** | ||
123 | * omap_test_timeout - busy-loop, testing a condition | ||
124 | * @cond: condition to test until it evaluates to true | ||
125 | * @timeout: maximum number of microseconds in the timeout | ||
126 | * @index: loop index (integer) | ||
127 | * | ||
128 | * Loop waiting for @cond to become true or until at least @timeout | ||
129 | * microseconds have passed. To use, define some integer @index in the | ||
130 | * calling code. After running, if @index == @timeout, then the loop has | ||
131 | * timed out. | ||
132 | */ | ||
133 | #define omap_test_timeout(cond, timeout, index) \ | ||
134 | ({ \ | ||
135 | for (index = 0; index < timeout; index++) { \ | ||
136 | if (cond) \ | ||
137 | break; \ | ||
138 | udelay(1); \ | ||
139 | } \ | ||
140 | }) | ||
141 | |||
142 | extern struct device *omap2_get_mpuss_device(void); | ||
143 | extern struct device *omap2_get_iva_device(void); | ||
144 | extern struct device *omap2_get_l3_device(void); | ||
145 | extern struct device *omap4_get_dsp_device(void); | ||
146 | |||
147 | void omap2_init_irq(void); | ||
148 | void omap3_init_irq(void); | ||
149 | void ti816x_init_irq(void); | ||
150 | extern int omap_irq_pending(void); | ||
151 | void omap_intc_save_context(void); | ||
152 | void omap_intc_restore_context(void); | ||
153 | void omap3_intc_suspend(void); | ||
154 | void omap3_intc_prepare_idle(void); | ||
155 | void omap3_intc_resume_idle(void); | ||
156 | void omap2_intc_handle_irq(struct pt_regs *regs); | ||
157 | void omap3_intc_handle_irq(struct pt_regs *regs); | ||
158 | |||
159 | /* | ||
160 | * wfi used in low power code. Directly opcode is used instead | ||
161 | * of instruction to avoid mulit-omap build break | ||
162 | */ | ||
163 | #ifdef CONFIG_THUMB2_KERNEL | ||
164 | #define do_wfi() __asm__ __volatile__ ("wfi" : : : "memory") | ||
165 | #else | ||
166 | #define do_wfi() \ | ||
167 | __asm__ __volatile__ (".word 0xe320f003" : : : "memory") | ||
168 | #endif | ||
169 | |||
170 | #ifdef CONFIG_CACHE_L2X0 | ||
171 | extern void __iomem *l2cache_base; | ||
172 | #endif | ||
173 | |||
174 | extern void __init gic_init_irq(void); | ||
175 | extern void omap_smc1(u32 fn, u32 arg); | ||
176 | |||
177 | #ifdef CONFIG_SMP | ||
178 | /* Needed for secondary core boot */ | ||
179 | extern void omap_secondary_startup(void); | ||
180 | extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask); | ||
181 | extern void omap_auxcoreboot_addr(u32 cpu_addr); | ||
182 | extern u32 omap_read_auxcoreboot0(void); | ||
183 | #endif | ||
184 | |||
185 | #endif /* __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H */ | ||
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c index e34d27f8c49c..114c037e433c 100644 --- a/arch/arm/mach-omap2/control.c +++ b/arch/arm/mach-omap2/control.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | 17 | ||
18 | #include <plat/common.h> | 18 | #include "common.h" |
19 | #include <plat/sdrc.h> | 19 | #include <plat/sdrc.h> |
20 | 20 | ||
21 | #include "cm-regbits-34xx.h" | 21 | #include "cm-regbits-34xx.h" |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 942bb4f19f9f..e20332f4abdc 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include "pm.h" | 35 | #include "pm.h" |
36 | #include "control.h" | 36 | #include "control.h" |
37 | #include "common.h" | ||
37 | 38 | ||
38 | #ifdef CONFIG_CPU_IDLE | 39 | #ifdef CONFIG_CPU_IDLE |
39 | 40 | ||
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index dce9905d64bb..bc6cf863a563 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -22,12 +22,13 @@ | |||
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
24 | #include <linux/err.h> | 24 | #include <linux/err.h> |
25 | #include <linux/delay.h> | ||
25 | 26 | ||
26 | #include <video/omapdss.h> | 27 | #include <video/omapdss.h> |
27 | #include <plat/omap_hwmod.h> | 28 | #include <plat/omap_hwmod.h> |
28 | #include <plat/omap_device.h> | 29 | #include <plat/omap_device.h> |
29 | #include <plat/omap-pm.h> | 30 | #include <plat/omap-pm.h> |
30 | #include <plat/common.h> | 31 | #include "common.h" |
31 | 32 | ||
32 | #include "control.h" | 33 | #include "control.h" |
33 | #include "display.h" | 34 | #include "display.h" |
diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c index ace99944e96f..a12e224eb97d 100644 --- a/arch/arm/mach-omap2/i2c.c +++ b/arch/arm/mach-omap2/i2c.c | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
23 | #include <plat/i2c.h> | 23 | #include <plat/i2c.h> |
24 | #include <plat/common.h> | 24 | #include "common.h" |
25 | #include <plat/omap_hwmod.h> | 25 | #include <plat/omap_hwmod.h> |
26 | 26 | ||
27 | #include "mux.h" | 27 | #include "mux.h" |
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 7f47092a193f..27ad722df637 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -21,7 +21,7 @@ | |||
21 | 21 | ||
22 | #include <asm/cputype.h> | 22 | #include <asm/cputype.h> |
23 | 23 | ||
24 | #include <plat/common.h> | 24 | #include "common.h" |
25 | #include <plat/cpu.h> | 25 | #include <plat/cpu.h> |
26 | 26 | ||
27 | #include <mach/id.h> | 27 | #include <mach/id.h> |
diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S index feb90a10945a..56964a0c4c7e 100644 --- a/arch/arm/mach-omap2/include/mach/entry-macro.S +++ b/arch/arm/mach-omap2/include/mach/entry-macro.S | |||
@@ -10,146 +10,9 @@ | |||
10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | #include <mach/hardware.h> | ||
14 | #include <mach/io.h> | ||
15 | #include <mach/irqs.h> | ||
16 | #include <asm/hardware/gic.h> | ||
17 | |||
18 | #include <plat/omap24xx.h> | ||
19 | #include <plat/omap34xx.h> | ||
20 | #include <plat/omap44xx.h> | ||
21 | |||
22 | #include <plat/multi.h> | ||
23 | |||
24 | #define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE) | ||
25 | #define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE) | ||
26 | #define OMAP4_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE) | ||
27 | #define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */ | ||
28 | #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ | ||
29 | 13 | ||
30 | .macro disable_fiq | 14 | .macro disable_fiq |
31 | .endm | 15 | .endm |
32 | 16 | ||
33 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
34 | .endm | 18 | .endm |
35 | |||
36 | /* | ||
37 | * Unoptimized irq functions for multi-omap2, 3 and 4 | ||
38 | */ | ||
39 | |||
40 | #ifdef MULTI_OMAP2 | ||
41 | /* | ||
42 | * Configure the interrupt base on the first interrupt. | ||
43 | * See also omap_irq_base_init for setting omap_irq_base. | ||
44 | */ | ||
45 | .macro get_irqnr_preamble, base, tmp | ||
46 | ldr \base, =omap_irq_base @ irq base address | ||
47 | ldr \base, [\base, #0] @ irq base value | ||
48 | .endm | ||
49 | |||
50 | /* Check the pending interrupts. Note that base already set */ | ||
51 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
52 | tst \base, #0x100 @ gic address? | ||
53 | bne 4401f @ found gic | ||
54 | |||
55 | /* Handle omap2 and omap3 */ | ||
56 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ | ||
57 | cmp \irqnr, #0x0 | ||
58 | bne 9998f | ||
59 | ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */ | ||
60 | cmp \irqnr, #0x0 | ||
61 | bne 9998f | ||
62 | ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */ | ||
63 | cmp \irqnr, #0x0 | ||
64 | bne 9998f | ||
65 | |||
66 | /* | ||
67 | * ti816x has additional IRQ pending register. Checking this | ||
68 | * register on omap2 & omap3 has no effect (read as 0). | ||
69 | */ | ||
70 | ldr \irqnr, [\base, #0xf8] /* IRQ pending reg 4 */ | ||
71 | cmp \irqnr, #0x0 | ||
72 | 9998: | ||
73 | ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET] | ||
74 | and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */ | ||
75 | b 9999f | ||
76 | |||
77 | /* Handle omap4 */ | ||
78 | 4401: ldr \irqstat, [\base, #GIC_CPU_INTACK] | ||
79 | ldr \tmp, =1021 | ||
80 | bic \irqnr, \irqstat, #0x1c00 | ||
81 | cmp \irqnr, #15 | ||
82 | cmpcc \irqnr, \irqnr | ||
83 | cmpne \irqnr, \tmp | ||
84 | cmpcs \irqnr, \irqnr | ||
85 | 9999: | ||
86 | .endm | ||
87 | |||
88 | #ifdef CONFIG_SMP | ||
89 | /* We assume that irqstat (the raw value of the IRQ acknowledge | ||
90 | * register) is preserved from the macro above. | ||
91 | * If there is an IPI, we immediately signal end of interrupt | ||
92 | * on the controller, since this requires the original irqstat | ||
93 | * value which we won't easily be able to recreate later. | ||
94 | */ | ||
95 | |||
96 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
97 | bic \irqnr, \irqstat, #0x1c00 | ||
98 | cmp \irqnr, #16 | ||
99 | it cc | ||
100 | strcc \irqstat, [\base, #GIC_CPU_EOI] | ||
101 | it cs | ||
102 | cmpcs \irqnr, \irqnr | ||
103 | .endm | ||
104 | #endif /* CONFIG_SMP */ | ||
105 | |||
106 | #else /* MULTI_OMAP2 */ | ||
107 | |||
108 | |||
109 | /* | ||
110 | * Optimized irq functions for omap2, 3 and 4 | ||
111 | */ | ||
112 | |||
113 | #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) | ||
114 | .macro get_irqnr_preamble, base, tmp | ||
115 | #ifdef CONFIG_ARCH_OMAP2 | ||
116 | ldr \base, =OMAP2_IRQ_BASE | ||
117 | #else | ||
118 | ldr \base, =OMAP3_IRQ_BASE | ||
119 | #endif | ||
120 | .endm | ||
121 | |||
122 | /* Check the pending interrupts. Note that base already set */ | ||
123 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
124 | ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */ | ||
125 | cmp \irqnr, #0x0 | ||
126 | bne 9999f | ||
127 | ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */ | ||
128 | cmp \irqnr, #0x0 | ||
129 | bne 9999f | ||
130 | ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */ | ||
131 | cmp \irqnr, #0x0 | ||
132 | #ifdef CONFIG_SOC_OMAPTI816X | ||
133 | bne 9999f | ||
134 | ldr \irqnr, [\base, #0xf8] /* IRQ pending reg 4 */ | ||
135 | cmp \irqnr, #0x0 | ||
136 | #endif | ||
137 | 9999: | ||
138 | ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET] | ||
139 | and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */ | ||
140 | |||
141 | .endm | ||
142 | #endif | ||
143 | |||
144 | |||
145 | #ifdef CONFIG_ARCH_OMAP4 | ||
146 | #define HAVE_GET_IRQNR_PREAMBLE | ||
147 | #include <asm/hardware/entry-macro-gic.S> | ||
148 | |||
149 | .macro get_irqnr_preamble, base, tmp | ||
150 | ldr \base, =OMAP4_IRQ_BASE | ||
151 | .endm | ||
152 | |||
153 | #endif | ||
154 | |||
155 | #endif /* MULTI_OMAP2 */ | ||
diff --git a/arch/arm/mach-omap2/include/mach/omap4-common.h b/arch/arm/mach-omap2/include/mach/omap4-common.h deleted file mode 100644 index e4bd87619734..000000000000 --- a/arch/arm/mach-omap2/include/mach/omap4-common.h +++ /dev/null | |||
@@ -1,43 +0,0 @@ | |||
1 | /* | ||
2 | * omap4-common.h: OMAP4 specific common header file | ||
3 | * | ||
4 | * Copyright (C) 2010 Texas Instruments, Inc. | ||
5 | * | ||
6 | * Author: | ||
7 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | #ifndef OMAP_ARCH_OMAP4_COMMON_H | ||
14 | #define OMAP_ARCH_OMAP4_COMMON_H | ||
15 | |||
16 | /* | ||
17 | * wfi used in low power code. Directly opcode is used instead | ||
18 | * of instruction to avoid mulit-omap build break | ||
19 | */ | ||
20 | #ifdef CONFIG_THUMB2_KERNEL | ||
21 | #define do_wfi() __asm__ __volatile__ ("wfi" : : : "memory") | ||
22 | #else | ||
23 | #define do_wfi() \ | ||
24 | __asm__ __volatile__ (".word 0xe320f003" : : : "memory") | ||
25 | #endif | ||
26 | |||
27 | #ifdef CONFIG_CACHE_L2X0 | ||
28 | extern void __iomem *l2cache_base; | ||
29 | #endif | ||
30 | |||
31 | extern void __iomem *gic_dist_base_addr; | ||
32 | |||
33 | extern void __init gic_init_irq(void); | ||
34 | extern void omap_smc1(u32 fn, u32 arg); | ||
35 | |||
36 | #ifdef CONFIG_SMP | ||
37 | /* Needed for secondary core boot */ | ||
38 | extern void omap_secondary_startup(void); | ||
39 | extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask); | ||
40 | extern void omap_auxcoreboot_addr(u32 cpu_addr); | ||
41 | extern u32 omap_read_auxcoreboot0(void); | ||
42 | #endif | ||
43 | #endif | ||
diff --git a/arch/arm/mach-omap2/include/mach/vmalloc.h b/arch/arm/mach-omap2/include/mach/vmalloc.h deleted file mode 100644 index 866319947760..000000000000 --- a/arch/arm/mach-omap2/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-omap/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 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 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 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 25d20ced03e1..3f565dd2ea8d 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include "clock3xxx.h" | 35 | #include "clock3xxx.h" |
36 | #include "clock44xx.h" | 36 | #include "clock44xx.h" |
37 | 37 | ||
38 | #include <plat/common.h> | 38 | #include "common.h" |
39 | #include <plat/omap-pm.h> | 39 | #include <plat/omap-pm.h> |
40 | #include "voltage.h" | 40 | #include "voltage.h" |
41 | #include "powerdomain.h" | 41 | #include "powerdomain.h" |
@@ -43,7 +43,7 @@ | |||
43 | #include "clockdomain.h" | 43 | #include "clockdomain.h" |
44 | #include <plat/omap_hwmod.h> | 44 | #include <plat/omap_hwmod.h> |
45 | #include <plat/multi.h> | 45 | #include <plat/multi.h> |
46 | #include <plat/common.h> | 46 | #include "common.h" |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * The machine specific code may provide the extra mapping besides the | 49 | * The machine specific code may provide the extra mapping besides the |
@@ -316,13 +316,9 @@ static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data) | |||
316 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); | 316 | return omap_hwmod_set_postsetup_state(oh, *(u8 *)data); |
317 | } | 317 | } |
318 | 318 | ||
319 | /* See irq.c, omap4-common.c and entry-macro.S */ | ||
320 | void __iomem *omap_irq_base; | ||
321 | |||
322 | static void __init omap_common_init_early(void) | 319 | static void __init omap_common_init_early(void) |
323 | { | 320 | { |
324 | omap2_check_revision(); | 321 | omap2_check_revision(); |
325 | omap_ioremap_init(); | ||
326 | omap_init_consistent_dma_size(); | 322 | omap_init_consistent_dma_size(); |
327 | } | 323 | } |
328 | 324 | ||
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c index 65f1be6a182c..42b1d6591912 100644 --- a/arch/arm/mach-omap2/irq.c +++ b/arch/arm/mach-omap2/irq.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
18 | #include <asm/exception.h> | ||
18 | #include <asm/mach/irq.h> | 19 | #include <asm/mach/irq.h> |
19 | 20 | ||
20 | 21 | ||
@@ -35,6 +36,11 @@ | |||
35 | /* Number of IRQ state bits in each MIR register */ | 36 | /* Number of IRQ state bits in each MIR register */ |
36 | #define IRQ_BITS_PER_REG 32 | 37 | #define IRQ_BITS_PER_REG 32 |
37 | 38 | ||
39 | #define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE) | ||
40 | #define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE) | ||
41 | #define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */ | ||
42 | #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ | ||
43 | |||
38 | /* | 44 | /* |
39 | * OMAP2 has a number of different interrupt controllers, each interrupt | 45 | * OMAP2 has a number of different interrupt controllers, each interrupt |
40 | * controller is identified as its own "bank". Register definitions are | 46 | * controller is identified as its own "bank". Register definitions are |
@@ -143,6 +149,7 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num) | |||
143 | 149 | ||
144 | static void __init omap_init_irq(u32 base, int nr_irqs) | 150 | static void __init omap_init_irq(u32 base, int nr_irqs) |
145 | { | 151 | { |
152 | void __iomem *omap_irq_base; | ||
146 | unsigned long nr_of_irqs = 0; | 153 | unsigned long nr_of_irqs = 0; |
147 | unsigned int nr_banks = 0; | 154 | unsigned int nr_banks = 0; |
148 | int i, j; | 155 | int i, j; |
@@ -191,6 +198,44 @@ void __init ti816x_init_irq(void) | |||
191 | omap_init_irq(OMAP34XX_IC_BASE, 128); | 198 | omap_init_irq(OMAP34XX_IC_BASE, 128); |
192 | } | 199 | } |
193 | 200 | ||
201 | static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) | ||
202 | { | ||
203 | u32 irqnr; | ||
204 | |||
205 | do { | ||
206 | irqnr = readl_relaxed(base_addr + 0x98); | ||
207 | if (irqnr) | ||
208 | goto out; | ||
209 | |||
210 | irqnr = readl_relaxed(base_addr + 0xb8); | ||
211 | if (irqnr) | ||
212 | goto out; | ||
213 | |||
214 | irqnr = readl_relaxed(base_addr + 0xd8); | ||
215 | #ifdef CONFIG_SOC_OMAPTI816X | ||
216 | if (irqnr) | ||
217 | goto out; | ||
218 | irqnr = readl_relaxed(base_addr + 0xf8); | ||
219 | #endif | ||
220 | |||
221 | out: | ||
222 | if (!irqnr) | ||
223 | break; | ||
224 | |||
225 | irqnr = readl_relaxed(base_addr + INTCPS_SIR_IRQ_OFFSET); | ||
226 | irqnr &= ACTIVEIRQ_MASK; | ||
227 | |||
228 | if (irqnr) | ||
229 | handle_IRQ(irqnr, regs); | ||
230 | } while (irqnr); | ||
231 | } | ||
232 | |||
233 | asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs) | ||
234 | { | ||
235 | void __iomem *base_addr = OMAP2_IRQ_BASE; | ||
236 | omap_intc_handle_irq(base_addr, regs); | ||
237 | } | ||
238 | |||
194 | #ifdef CONFIG_ARCH_OMAP3 | 239 | #ifdef CONFIG_ARCH_OMAP3 |
195 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; | 240 | static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)]; |
196 | 241 | ||
@@ -263,4 +308,10 @@ void omap3_intc_resume_idle(void) | |||
263 | /* Re-enable autoidle */ | 308 | /* Re-enable autoidle */ |
264 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); | 309 | intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG); |
265 | } | 310 | } |
311 | |||
312 | asmlinkage void __exception_irq_entry omap3_intc_handle_irq(struct pt_regs *regs) | ||
313 | { | ||
314 | void __iomem *base_addr = OMAP3_IRQ_BASE; | ||
315 | omap_intc_handle_irq(base_addr, regs); | ||
316 | } | ||
266 | #endif /* CONFIG_ARCH_OMAP3 */ | 317 | #endif /* CONFIG_ARCH_OMAP3 */ |
diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 4976b9393e49..e5a1c3f40a86 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c | |||
@@ -19,7 +19,8 @@ | |||
19 | #include <linux/smp.h> | 19 | #include <linux/smp.h> |
20 | 20 | ||
21 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
22 | #include <mach/omap4-common.h> | 22 | |
23 | #include "common.h" | ||
23 | 24 | ||
24 | int platform_cpu_kill(unsigned int cpu) | 25 | int platform_cpu_kill(unsigned int cpu) |
25 | { | 26 | { |
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 4412ddb7b3f6..e99bc6cd4714 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
@@ -24,7 +24,8 @@ | |||
24 | #include <asm/hardware/gic.h> | 24 | #include <asm/hardware/gic.h> |
25 | #include <asm/smp_scu.h> | 25 | #include <asm/smp_scu.h> |
26 | #include <mach/hardware.h> | 26 | #include <mach/hardware.h> |
27 | #include <mach/omap4-common.h> | 27 | |
28 | #include "common.h" | ||
28 | 29 | ||
29 | /* SCU base address */ | 30 | /* SCU base address */ |
30 | static void __iomem *scu_base; | 31 | static void __iomem *scu_base; |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 35ac3e5f6e94..beecfdd56ea3 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -22,17 +22,18 @@ | |||
22 | #include <plat/irqs.h> | 22 | #include <plat/irqs.h> |
23 | 23 | ||
24 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
25 | #include <mach/omap4-common.h> | 25 | |
26 | #include "common.h" | ||
26 | 27 | ||
27 | #ifdef CONFIG_CACHE_L2X0 | 28 | #ifdef CONFIG_CACHE_L2X0 |
28 | void __iomem *l2cache_base; | 29 | void __iomem *l2cache_base; |
29 | #endif | 30 | #endif |
30 | 31 | ||
31 | void __iomem *gic_dist_base_addr; | ||
32 | |||
33 | |||
34 | void __init gic_init_irq(void) | 32 | void __init gic_init_irq(void) |
35 | { | 33 | { |
34 | void __iomem *omap_irq_base; | ||
35 | void __iomem *gic_dist_base_addr; | ||
36 | |||
36 | /* Static mapping, never released */ | 37 | /* Static mapping, never released */ |
37 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); | 38 | gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K); |
38 | BUG_ON(!gic_dist_base_addr); | 39 | BUG_ON(!gic_dist_base_addr); |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 207a2ff9a8c4..529142aff766 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -137,7 +137,7 @@ | |||
137 | #include <linux/mutex.h> | 137 | #include <linux/mutex.h> |
138 | #include <linux/spinlock.h> | 138 | #include <linux/spinlock.h> |
139 | 139 | ||
140 | #include <plat/common.h> | 140 | #include "common.h" |
141 | #include <plat/cpu.h> | 141 | #include <plat/cpu.h> |
142 | #include "clockdomain.h" | 142 | #include "clockdomain.h" |
143 | #include "powerdomain.h" | 143 | #include "powerdomain.h" |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index 00bff46ca48b..1881fe915149 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
@@ -18,7 +18,7 @@ | |||
18 | 18 | ||
19 | #include <plat/omap-pm.h> | 19 | #include <plat/omap-pm.h> |
20 | #include <plat/omap_device.h> | 20 | #include <plat/omap_device.h> |
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | 22 | ||
23 | #include "voltage.h" | 23 | #include "voltage.h" |
24 | #include "powerdomain.h" | 24 | #include "powerdomain.h" |
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index cf0c216132ab..ef8595c80296 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <plat/dma.h> | 42 | #include <plat/dma.h> |
43 | #include <plat/board.h> | 43 | #include <plat/board.h> |
44 | 44 | ||
45 | #include "common.h" | ||
45 | #include "prm2xxx_3xxx.h" | 46 | #include "prm2xxx_3xxx.h" |
46 | #include "prm-regbits-24xx.h" | 47 | #include "prm-regbits-24xx.h" |
47 | #include "cm2xxx_3xxx.h" | 48 | #include "cm2xxx_3xxx.h" |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index efa66494c1e3..fa637dfdda53 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <plat/gpmc.h> | 42 | #include <plat/gpmc.h> |
43 | #include <plat/dma.h> | 43 | #include <plat/dma.h> |
44 | 44 | ||
45 | #include "common.h" | ||
45 | #include "cm2xxx_3xxx.h" | 46 | #include "cm2xxx_3xxx.h" |
46 | #include "cm-regbits-34xx.h" | 47 | #include "cm-regbits-34xx.h" |
47 | #include "prm-regbits-34xx.h" | 48 | #include "prm-regbits-34xx.h" |
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index 59a870be8390..8edb015f5618 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -16,8 +16,8 @@ | |||
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | 18 | ||
19 | #include "common.h" | ||
19 | #include "powerdomain.h" | 20 | #include "powerdomain.h" |
20 | #include <mach/omap4-common.h> | ||
21 | 21 | ||
22 | struct power_state { | 22 | struct power_state { |
23 | struct powerdomain *pwrdm; | 23 | struct powerdomain *pwrdm; |
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c index 597e2da831b3..c35e5cea9f8f 100644 --- a/arch/arm/mach-omap2/prcm.c +++ b/arch/arm/mach-omap2/prcm.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/export.h> | 26 | #include <linux/export.h> |
27 | 27 | ||
28 | #include <mach/system.h> | 28 | #include <mach/system.h> |
29 | #include <plat/common.h> | 29 | #include "common.h" |
30 | #include <plat/prcm.h> | 30 | #include <plat/prcm.h> |
31 | #include <plat/irqs.h> | 31 | #include <plat/irqs.h> |
32 | 32 | ||
diff --git a/arch/arm/mach-omap2/prcm_mpu44xx.c b/arch/arm/mach-omap2/prcm_mpu44xx.c index 171fe171a749..ca669b50f390 100644 --- a/arch/arm/mach-omap2/prcm_mpu44xx.c +++ b/arch/arm/mach-omap2/prcm_mpu44xx.c | |||
@@ -15,7 +15,7 @@ | |||
15 | #include <linux/err.h> | 15 | #include <linux/err.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | 17 | ||
18 | #include <plat/common.h> | 18 | #include "common.h" |
19 | 19 | ||
20 | #include "prcm_mpu44xx.h" | 20 | #include "prcm_mpu44xx.h" |
21 | #include "cm-regbits-44xx.h" | 21 | #include "cm-regbits-44xx.h" |
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index f02d87f68e54..9a08ba397327 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | 18 | ||
19 | #include <plat/common.h> | 19 | #include "common.h" |
20 | #include <plat/cpu.h> | 20 | #include <plat/cpu.h> |
21 | #include <plat/prcm.h> | 21 | #include <plat/prcm.h> |
22 | 22 | ||
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index 495a31a7e8a7..dd885eecf22a 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | 19 | ||
20 | #include <plat/common.h> | 20 | #include "common.h" |
21 | #include <plat/cpu.h> | 21 | #include <plat/cpu.h> |
22 | #include <plat/prcm.h> | 22 | #include <plat/prcm.h> |
23 | 23 | ||
diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c index 3a7bab16edd5..f6de5bc6b12a 100644 --- a/arch/arm/mach-omap2/prminst44xx.c +++ b/arch/arm/mach-omap2/prminst44xx.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | 18 | ||
19 | #include <plat/common.h> | 19 | #include "common.h" |
20 | 20 | ||
21 | #include "prm44xx.h" | 21 | #include "prm44xx.h" |
22 | #include "prminst44xx.h" | 22 | #include "prminst44xx.h" |
diff --git a/arch/arm/mach-omap2/sdram-nokia.c b/arch/arm/mach-omap2/sdram-nokia.c index 14caa228bc0d..ee3a8ad304cb 100644 --- a/arch/arm/mach-omap2/sdram-nokia.c +++ b/arch/arm/mach-omap2/sdram-nokia.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | 19 | ||
20 | #include <plat/io.h> | 20 | #include <plat/io.h> |
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | #include <plat/clock.h> | 22 | #include <plat/clock.h> |
23 | #include <plat/sdrc.h> | 23 | #include <plat/sdrc.h> |
24 | 24 | ||
diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c index 8f2782874771..e3d345f46409 100644 --- a/arch/arm/mach-omap2/sdrc.c +++ b/arch/arm/mach-omap2/sdrc.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | 25 | ||
26 | #include <plat/common.h> | 26 | #include "common.h" |
27 | #include <plat/clock.h> | 27 | #include <plat/clock.h> |
28 | #include <plat/sram.h> | 28 | #include <plat/sram.h> |
29 | 29 | ||
diff --git a/arch/arm/mach-omap2/sdrc2xxx.c b/arch/arm/mach-omap2/sdrc2xxx.c index ccdb010f169d..791a63cdceb2 100644 --- a/arch/arm/mach-omap2/sdrc2xxx.c +++ b/arch/arm/mach-omap2/sdrc2xxx.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | 26 | ||
27 | #include <plat/common.h> | 27 | #include "common.h" |
28 | #include <plat/clock.h> | 28 | #include <plat/clock.h> |
29 | #include <plat/sram.h> | 29 | #include <plat/sram.h> |
30 | 30 | ||
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 9992dbfdfdb3..42c326732a29 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <plat/omap-serial.h> | 33 | #include <plat/omap-serial.h> |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #include <plat/common.h> | 36 | #include "common.h" |
37 | #include <plat/board.h> | 37 | #include <plat/board.h> |
38 | #include <plat/clock.h> | 38 | #include <plat/clock.h> |
39 | #include <plat/dma.h> | 39 | #include <plat/dma.h> |
diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c index cf246b39bac7..9dd93453e563 100644 --- a/arch/arm/mach-omap2/smartreflex.c +++ b/arch/arm/mach-omap2/smartreflex.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/pm_runtime.h> | 27 | #include <linux/pm_runtime.h> |
28 | 28 | ||
29 | #include <plat/common.h> | 29 | #include "common.h" |
30 | 30 | ||
31 | #include "pm.h" | 31 | #include "pm.h" |
32 | #include "smartreflex.h" | 32 | #include "smartreflex.h" |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 037b0d7d4e05..9edcd520510f 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <plat/dmtimer.h> | 41 | #include <plat/dmtimer.h> |
42 | #include <asm/localtimer.h> | 42 | #include <asm/localtimer.h> |
43 | #include <asm/sched_clock.h> | 43 | #include <asm/sched_clock.h> |
44 | #include <plat/common.h> | 44 | #include "common.h" |
45 | #include <plat/omap_hwmod.h> | 45 | #include <plat/omap_hwmod.h> |
46 | #include <plat/omap_device.h> | 46 | #include <plat/omap_device.h> |
47 | #include <plat/omap-pm.h> | 47 | #include <plat/omap-pm.h> |
diff --git a/arch/arm/mach-omap2/vc3xxx_data.c b/arch/arm/mach-omap2/vc3xxx_data.c index cfe348e1af0e..a5ec7f8f2ea8 100644 --- a/arch/arm/mach-omap2/vc3xxx_data.c +++ b/arch/arm/mach-omap2/vc3xxx_data.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | 20 | ||
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | 22 | ||
23 | #include "prm-regbits-34xx.h" | 23 | #include "prm-regbits-34xx.h" |
24 | #include "voltage.h" | 24 | #include "voltage.h" |
diff --git a/arch/arm/mach-omap2/vc44xx_data.c b/arch/arm/mach-omap2/vc44xx_data.c index 2740a968145e..d70b930f2739 100644 --- a/arch/arm/mach-omap2/vc44xx_data.c +++ b/arch/arm/mach-omap2/vc44xx_data.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | 20 | ||
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | 22 | ||
23 | #include "prm44xx.h" | 23 | #include "prm44xx.h" |
24 | #include "prm-regbits-44xx.h" | 24 | #include "prm-regbits-44xx.h" |
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c index 1f8fdf736e63..8a36342e60d2 100644 --- a/arch/arm/mach-omap2/voltage.c +++ b/arch/arm/mach-omap2/voltage.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
28 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
29 | 29 | ||
30 | #include <plat/common.h> | 30 | #include "common.h" |
31 | 31 | ||
32 | #include "prm-regbits-34xx.h" | 32 | #include "prm-regbits-34xx.h" |
33 | #include "prm-regbits-44xx.h" | 33 | #include "prm-regbits-44xx.h" |
diff --git a/arch/arm/mach-omap2/voltagedomains3xxx_data.c b/arch/arm/mach-omap2/voltagedomains3xxx_data.c index 071101debbbc..474559d5b072 100644 --- a/arch/arm/mach-omap2/voltagedomains3xxx_data.c +++ b/arch/arm/mach-omap2/voltagedomains3xxx_data.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <linux/err.h> | 18 | #include <linux/err.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | 20 | ||
21 | #include <plat/common.h> | 21 | #include "common.h" |
22 | #include <plat/cpu.h> | 22 | #include <plat/cpu.h> |
23 | 23 | ||
24 | #include "prm-regbits-34xx.h" | 24 | #include "prm-regbits-34xx.h" |
diff --git a/arch/arm/mach-omap2/voltagedomains44xx_data.c b/arch/arm/mach-omap2/voltagedomains44xx_data.c index c4584e9ac717..4e11d022595d 100644 --- a/arch/arm/mach-omap2/voltagedomains44xx_data.c +++ b/arch/arm/mach-omap2/voltagedomains44xx_data.c | |||
@@ -21,7 +21,7 @@ | |||
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | 23 | ||
24 | #include <plat/common.h> | 24 | #include "common.h" |
25 | 25 | ||
26 | #include "prm-regbits-44xx.h" | 26 | #include "prm-regbits-44xx.h" |
27 | #include "prm44xx.h" | 27 | #include "prm44xx.h" |
diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c index 66bd700a2b98..807391d84a9d 100644 --- a/arch/arm/mach-omap2/vp.c +++ b/arch/arm/mach-omap2/vp.c | |||
@@ -1,7 +1,7 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/init.h> | 2 | #include <linux/init.h> |
3 | 3 | ||
4 | #include <plat/common.h> | 4 | #include "common.h" |
5 | 5 | ||
6 | #include "voltage.h" | 6 | #include "voltage.h" |
7 | #include "vp.h" | 7 | #include "vp.h" |
diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c index 260c554b1547..bd89f80089f5 100644 --- a/arch/arm/mach-omap2/vp3xxx_data.c +++ b/arch/arm/mach-omap2/vp3xxx_data.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/err.h> | 19 | #include <linux/err.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | 21 | ||
22 | #include <plat/common.h> | 22 | #include "common.h" |
23 | 23 | ||
24 | #include "prm-regbits-34xx.h" | 24 | #include "prm-regbits-34xx.h" |
25 | #include "voltage.h" | 25 | #include "voltage.h" |
diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c index b4e77044891e..8c031d16879e 100644 --- a/arch/arm/mach-omap2/vp44xx_data.c +++ b/arch/arm/mach-omap2/vp44xx_data.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/err.h> | 19 | #include <linux/err.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | 21 | ||
22 | #include <plat/common.h> | 22 | #include "common.h" |
23 | 23 | ||
24 | #include "prm44xx.h" | 24 | #include "prm44xx.h" |
25 | #include "prm-regbits-44xx.h" | 25 | #include "prm-regbits-44xx.h" |
diff --git a/arch/arm/mach-orion5x/include/mach/io.h b/arch/arm/mach-orion5x/include/mach/io.h index c5196101a237..e9d9afdc2659 100644 --- a/arch/arm/mach-orion5x/include/mach/io.h +++ b/arch/arm/mach-orion5x/include/mach/io.h | |||
@@ -15,31 +15,6 @@ | |||
15 | 15 | ||
16 | #define IO_SPACE_LIMIT 0xffffffff | 16 | #define IO_SPACE_LIMIT 0xffffffff |
17 | 17 | ||
18 | static inline void __iomem * | ||
19 | __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype) | ||
20 | { | ||
21 | void __iomem *retval; | ||
22 | unsigned long offs = paddr - ORION5X_REGS_PHYS_BASE; | ||
23 | if (mtype == MT_DEVICE && size && offs < ORION5X_REGS_SIZE && | ||
24 | size <= ORION5X_REGS_SIZE && offs + size <= ORION5X_REGS_SIZE) { | ||
25 | retval = (void __iomem *)ORION5X_REGS_VIRT_BASE + offs; | ||
26 | } else { | ||
27 | retval = __arm_ioremap(paddr, size, mtype); | ||
28 | } | ||
29 | |||
30 | return retval; | ||
31 | } | ||
32 | |||
33 | static inline void | ||
34 | __arch_iounmap(void __iomem *addr) | ||
35 | { | ||
36 | if (addr < (void __iomem *)ORION5X_REGS_VIRT_BASE || | ||
37 | addr >= (void __iomem *)(ORION5X_REGS_VIRT_BASE + ORION5X_REGS_SIZE)) | ||
38 | __iounmap(addr); | ||
39 | } | ||
40 | |||
41 | #define __arch_ioremap __arch_ioremap | ||
42 | #define __arch_iounmap __arch_iounmap | ||
43 | #define __io(a) __typesafe_io(a) | 18 | #define __io(a) __typesafe_io(a) |
44 | #define __mem_pci(a) (a) | 19 | #define __mem_pci(a) (a) |
45 | 20 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/vmalloc.h b/arch/arm/mach-orion5x/include/mach/vmalloc.h deleted file mode 100644 index 06b50aeff7b9..000000000000 --- a/arch/arm/mach-orion5x/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/include/mach/vmalloc.h | ||
3 | */ | ||
4 | |||
5 | #define VMALLOC_END 0xfd800000UL | ||
diff --git a/arch/arm/mach-picoxcell/common.c b/arch/arm/mach-picoxcell/common.c index 34d08347be5f..ad871bd7b1ab 100644 --- a/arch/arm/mach-picoxcell/common.c +++ b/arch/arm/mach-picoxcell/common.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/irqdomain.h> | 11 | #include <linux/irqdomain.h> |
12 | #include <linux/of.h> | 12 | #include <linux/of.h> |
13 | #include <linux/of_address.h> | 13 | #include <linux/of_address.h> |
14 | #include <linux/of_irq.h> | ||
14 | #include <linux/of_platform.h> | 15 | #include <linux/of_platform.h> |
15 | 16 | ||
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
@@ -33,22 +34,20 @@ static const char *picoxcell_dt_match[] = { | |||
33 | }; | 34 | }; |
34 | 35 | ||
35 | static const struct of_device_id vic_of_match[] __initconst = { | 36 | static const struct of_device_id vic_of_match[] __initconst = { |
36 | { .compatible = "arm,pl192-vic" }, | 37 | { .compatible = "arm,pl192-vic", .data = vic_of_init, }, |
37 | { /* Sentinel */ } | 38 | { /* Sentinel */ } |
38 | }; | 39 | }; |
39 | 40 | ||
40 | static void __init picoxcell_init_irq(void) | 41 | static void __init picoxcell_init_irq(void) |
41 | { | 42 | { |
42 | vic_init(IO_ADDRESS(PICOXCELL_VIC0_BASE), 0, ~0, 0); | 43 | of_irq_init(vic_of_match); |
43 | vic_init(IO_ADDRESS(PICOXCELL_VIC1_BASE), 32, ~0, 0); | ||
44 | irq_domain_generate_simple(vic_of_match, PICOXCELL_VIC0_BASE, 0); | ||
45 | irq_domain_generate_simple(vic_of_match, PICOXCELL_VIC1_BASE, 32); | ||
46 | } | 44 | } |
47 | 45 | ||
48 | DT_MACHINE_START(PICOXCELL, "Picochip picoXcell") | 46 | DT_MACHINE_START(PICOXCELL, "Picochip picoXcell") |
49 | .map_io = picoxcell_map_io, | 47 | .map_io = picoxcell_map_io, |
50 | .nr_irqs = ARCH_NR_IRQS, | 48 | .nr_irqs = ARCH_NR_IRQS, |
51 | .init_irq = picoxcell_init_irq, | 49 | .init_irq = picoxcell_init_irq, |
50 | .handle_irq = vic_handle_irq, | ||
52 | .timer = &picoxcell_timer, | 51 | .timer = &picoxcell_timer, |
53 | .init_machine = picoxcell_init_machine, | 52 | .init_machine = picoxcell_init_machine, |
54 | .dt_compat = picoxcell_dt_match, | 53 | .dt_compat = picoxcell_dt_match, |
diff --git a/arch/arm/mach-picoxcell/include/mach/entry-macro.S b/arch/arm/mach-picoxcell/include/mach/entry-macro.S index a6b09f75d9df..9b505ac00be9 100644 --- a/arch/arm/mach-picoxcell/include/mach/entry-macro.S +++ b/arch/arm/mach-picoxcell/include/mach/entry-macro.S | |||
@@ -9,11 +9,8 @@ | |||
9 | * License version 2. This program is licensed "as is" without any | 9 | * License version 2. This program is licensed "as is" without any |
10 | * warranty of any kind, whether express or implied. | 10 | * warranty of any kind, whether express or implied. |
11 | */ | 11 | */ |
12 | #include <mach/hardware.h> | 12 | .macro disable_fiq |
13 | #include <mach/irqs.h> | 13 | .endm |
14 | #include <mach/map.h> | ||
15 | 14 | ||
16 | #define VA_VIC0 IO_ADDRESS(PICOXCELL_VIC0_BASE) | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
17 | #define VA_VIC1 IO_ADDRESS(PICOXCELL_VIC1_BASE) | 16 | .endm |
18 | |||
19 | #include <asm/entry-macro-vic2.S> | ||
diff --git a/arch/arm/mach-picoxcell/include/mach/vmalloc.h b/arch/arm/mach-picoxcell/include/mach/vmalloc.h deleted file mode 100644 index 0216cc4b1f0b..000000000000 --- a/arch/arm/mach-picoxcell/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2011 Picochip Ltd., Jamie Iles | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | #define VMALLOC_END 0xfe000000UL | ||
diff --git a/arch/arm/mach-pnx4008/include/mach/system.h b/arch/arm/mach-pnx4008/include/mach/system.h index 5dda2bb55f8d..5d6384a6128c 100644 --- a/arch/arm/mach-pnx4008/include/mach/system.h +++ b/arch/arm/mach-pnx4008/include/mach/system.h | |||
@@ -32,7 +32,7 @@ static void arch_idle(void) | |||
32 | 32 | ||
33 | static inline void arch_reset(char mode, const char *cmd) | 33 | static inline void arch_reset(char mode, const char *cmd) |
34 | { | 34 | { |
35 | cpu_reset(0); | 35 | soft_restart(0); |
36 | } | 36 | } |
37 | 37 | ||
38 | #endif | 38 | #endif |
diff --git a/arch/arm/mach-pnx4008/include/mach/vmalloc.h b/arch/arm/mach-pnx4008/include/mach/vmalloc.h deleted file mode 100644 index 184913c71141..000000000000 --- a/arch/arm/mach-pnx4008/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-pnx4008/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Vitaly Wool <source@mvista.com> | ||
5 | * | ||
6 | * 2006 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | |||
12 | /* | ||
13 | * Just any arbitrary offset to the start of the vmalloc VM area: the | ||
14 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
15 | * physical memory until the kernel virtual memory starts. That means that | ||
16 | * any out-of-bounds memory accesses will hopefully be caught. | ||
17 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
18 | * area for the same reason. ;) | ||
19 | */ | ||
20 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-prima2/include/mach/map.h b/arch/arm/mach-prima2/include/mach/map.h index 66b1ae2e553f..6f243532570c 100644 --- a/arch/arm/mach-prima2/include/mach/map.h +++ b/arch/arm/mach-prima2/include/mach/map.h | |||
@@ -9,8 +9,10 @@ | |||
9 | #ifndef __MACH_PRIMA2_MAP_H__ | 9 | #ifndef __MACH_PRIMA2_MAP_H__ |
10 | #define __MACH_PRIMA2_MAP_H__ | 10 | #define __MACH_PRIMA2_MAP_H__ |
11 | 11 | ||
12 | #include <mach/vmalloc.h> | 12 | #include <linux/const.h> |
13 | 13 | ||
14 | #define SIRFSOC_VA(x) (VMALLOC_END + ((x) & 0x00FFF000)) | 14 | #define SIRFSOC_VA_BASE _AC(0xFEC00000, UL) |
15 | |||
16 | #define SIRFSOC_VA(x) (SIRFSOC_VA_BASE + ((x) & 0x00FFF000)) | ||
15 | 17 | ||
16 | #endif | 18 | #endif |
diff --git a/arch/arm/mach-prima2/include/mach/vmalloc.h b/arch/arm/mach-prima2/include/mach/vmalloc.h deleted file mode 100644 index c9f90fec78e3..000000000000 --- a/arch/arm/mach-prima2/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/ach-prima2/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2010 – 2011 Cambridge Silicon Radio Limited, a CSR plc group company. | ||
5 | * | ||
6 | * Licensed under GPLv2 or later. | ||
7 | */ | ||
8 | |||
9 | #ifndef __MACH_VMALLOC_H | ||
10 | #define __MACH_VMALLOC_H | ||
11 | |||
12 | #include <linux/const.h> | ||
13 | |||
14 | #define VMALLOC_END _AC(0xFEC00000, UL) | ||
15 | |||
16 | #endif | ||
diff --git a/arch/arm/mach-pxa/include/mach/entry-macro.S b/arch/arm/mach-pxa/include/mach/entry-macro.S index a73bc86a3c26..260c0c17692a 100644 --- a/arch/arm/mach-pxa/include/mach/entry-macro.S +++ b/arch/arm/mach-pxa/include/mach/entry-macro.S | |||
@@ -7,45 +7,9 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <mach/irqs.h> | ||
12 | 10 | ||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
15 | 13 | ||
16 | .macro get_irqnr_preamble, base, tmp | ||
17 | .endm | ||
18 | |||
19 | .macro arch_ret_to_user, tmp1, tmp2 | 14 | .macro arch_ret_to_user, tmp1, tmp2 |
20 | .endm | 15 | .endm |
21 | |||
22 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
23 | mrc p15, 0, \tmp, c0, c0, 0 @ CPUID | ||
24 | mov \tmp, \tmp, lsr #13 | ||
25 | and \tmp, \tmp, #0x7 @ Core G | ||
26 | cmp \tmp, #1 | ||
27 | bhi 1002f | ||
28 | |||
29 | @ Core Generation 1 (PXA25x) | ||
30 | mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000 | ||
31 | add \base, \base, #0x00d00000 | ||
32 | ldr \irqstat, [\base, #0] @ ICIP | ||
33 | ldr \irqnr, [\base, #4] @ ICMR | ||
34 | |||
35 | ands \irqnr, \irqstat, \irqnr | ||
36 | beq 1001f | ||
37 | rsb \irqstat, \irqnr, #0 | ||
38 | and \irqstat, \irqstat, \irqnr | ||
39 | clz \irqnr, \irqstat | ||
40 | rsb \irqnr, \irqnr, #(31 + PXA_IRQ(0)) | ||
41 | b 1001f | ||
42 | 1002: | ||
43 | @ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx) | ||
44 | mrc p6, 0, \irqstat, c5, c0, 0 @ ICHP | ||
45 | tst \irqstat, #0x80000000 | ||
46 | beq 1001f | ||
47 | bic \irqstat, \irqstat, #0x80000000 | ||
48 | mov \irqnr, \irqstat, lsr #16 | ||
49 | add \irqnr, \irqnr, #(PXA_IRQ(0)) | ||
50 | 1001: | ||
51 | .endm | ||
diff --git a/arch/arm/mach-pxa/include/mach/vmalloc.h b/arch/arm/mach-pxa/include/mach/vmalloc.h deleted file mode 100644 index bfecfbf5f460..000000000000 --- a/arch/arm/mach-pxa/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-pxa/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Author: Nicolas Pitre | ||
5 | * Copyright: (C) 2001 MontaVista Software Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | #define VMALLOC_END (0xe8000000UL) | ||
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index b938fc2c316a..4f47a760398f 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
@@ -752,6 +752,7 @@ static void mioa701_machine_exit(void) | |||
752 | 752 | ||
753 | MACHINE_START(MIOA701, "MIO A701") | 753 | MACHINE_START(MIOA701, "MIO A701") |
754 | .atag_offset = 0x100, | 754 | .atag_offset = 0x100, |
755 | .restart_mode = 's', | ||
755 | .map_io = &pxa27x_map_io, | 756 | .map_io = &pxa27x_map_io, |
756 | .init_irq = &pxa27x_init_irq, | 757 | .init_irq = &pxa27x_init_irq, |
757 | .handle_irq = &pxa27x_handle_irq, | 758 | .handle_irq = &pxa27x_handle_irq, |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 50c833177866..afcb48a5792c 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -420,17 +420,11 @@ static void poodle_poweroff(void) | |||
420 | arm_machine_restart('h', NULL); | 420 | arm_machine_restart('h', NULL); |
421 | } | 421 | } |
422 | 422 | ||
423 | static void poodle_restart(char mode, const char *cmd) | ||
424 | { | ||
425 | arm_machine_restart('h', cmd); | ||
426 | } | ||
427 | |||
428 | static void __init poodle_init(void) | 423 | static void __init poodle_init(void) |
429 | { | 424 | { |
430 | int ret = 0; | 425 | int ret = 0; |
431 | 426 | ||
432 | pm_power_off = poodle_poweroff; | 427 | pm_power_off = poodle_poweroff; |
433 | arm_pm_restart = poodle_restart; | ||
434 | 428 | ||
435 | PCFR |= PCFR_OPDE; | 429 | PCFR |= PCFR_OPDE; |
436 | 430 | ||
diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c index 01e9d643394a..b8bcda15da81 100644 --- a/arch/arm/mach-pxa/reset.c +++ b/arch/arm/mach-pxa/reset.c | |||
@@ -88,7 +88,7 @@ void arch_reset(char mode, const char *cmd) | |||
88 | switch (mode) { | 88 | switch (mode) { |
89 | case 's': | 89 | case 's': |
90 | /* Jump into ROM at address 0 */ | 90 | /* Jump into ROM at address 0 */ |
91 | cpu_reset(0); | 91 | soft_restart(0); |
92 | break; | 92 | break; |
93 | case 'g': | 93 | case 'g': |
94 | do_gpio_reset(); | 94 | do_gpio_reset(); |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 953a9195f9e5..2f57d94de727 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -982,6 +982,7 @@ static void __init spitz_fixup(struct tag *tags, char **cmdline, | |||
982 | 982 | ||
983 | #ifdef CONFIG_MACH_SPITZ | 983 | #ifdef CONFIG_MACH_SPITZ |
984 | MACHINE_START(SPITZ, "SHARP Spitz") | 984 | MACHINE_START(SPITZ, "SHARP Spitz") |
985 | .restart_mode = 'g', | ||
985 | .fixup = spitz_fixup, | 986 | .fixup = spitz_fixup, |
986 | .map_io = pxa27x_map_io, | 987 | .map_io = pxa27x_map_io, |
987 | .init_irq = pxa27x_init_irq, | 988 | .init_irq = pxa27x_init_irq, |
@@ -993,6 +994,7 @@ MACHINE_END | |||
993 | 994 | ||
994 | #ifdef CONFIG_MACH_BORZOI | 995 | #ifdef CONFIG_MACH_BORZOI |
995 | MACHINE_START(BORZOI, "SHARP Borzoi") | 996 | MACHINE_START(BORZOI, "SHARP Borzoi") |
997 | .restart_mode = 'g', | ||
996 | .fixup = spitz_fixup, | 998 | .fixup = spitz_fixup, |
997 | .map_io = pxa27x_map_io, | 999 | .map_io = pxa27x_map_io, |
998 | .init_irq = pxa27x_init_irq, | 1000 | .init_irq = pxa27x_init_irq, |
@@ -1004,6 +1006,7 @@ MACHINE_END | |||
1004 | 1006 | ||
1005 | #ifdef CONFIG_MACH_AKITA | 1007 | #ifdef CONFIG_MACH_AKITA |
1006 | MACHINE_START(AKITA, "SHARP Akita") | 1008 | MACHINE_START(AKITA, "SHARP Akita") |
1009 | .restart_mode = 'g', | ||
1007 | .fixup = spitz_fixup, | 1010 | .fixup = spitz_fixup, |
1008 | .map_io = pxa27x_map_io, | 1011 | .map_io = pxa27x_map_io, |
1009 | .init_irq = pxa27x_init_irq, | 1012 | .init_irq = pxa27x_init_irq, |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 402b0c96613b..ef6453041cf1 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -970,6 +970,7 @@ static void __init fixup_tosa(struct tag *tags, char **cmdline, | |||
970 | } | 970 | } |
971 | 971 | ||
972 | MACHINE_START(TOSA, "SHARP Tosa") | 972 | MACHINE_START(TOSA, "SHARP Tosa") |
973 | .restart_mode = 'g', | ||
973 | .fixup = fixup_tosa, | 974 | .fixup = fixup_tosa, |
974 | .map_io = pxa25x_map_io, | 975 | .map_io = pxa25x_map_io, |
975 | .nr_irqs = TOSA_NR_IRQS, | 976 | .nr_irqs = TOSA_NR_IRQS, |
diff --git a/arch/arm/mach-realview/include/mach/entry-macro.S b/arch/arm/mach-realview/include/mach/entry-macro.S index 4071164aebaa..e8a5179c2653 100644 --- a/arch/arm/mach-realview/include/mach/entry-macro.S +++ b/arch/arm/mach-realview/include/mach/entry-macro.S | |||
@@ -7,8 +7,6 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <asm/hardware/entry-macro-gic.S> | ||
12 | 10 | ||
13 | .macro disable_fiq | 11 | .macro disable_fiq |
14 | .endm | 12 | .endm |
diff --git a/arch/arm/mach-realview/include/mach/vmalloc.h b/arch/arm/mach-realview/include/mach/vmalloc.h deleted file mode 100644 index a2a4c6861407..000000000000 --- a/arch/arm/mach-realview/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-realview/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-realview/realview_eb.c b/arch/arm/mach-realview/realview_eb.c index 026c66ad7ec2..1ca944aea7f8 100644 --- a/arch/arm/mach-realview/realview_eb.c +++ b/arch/arm/mach-realview/realview_eb.c | |||
@@ -91,8 +91,8 @@ static struct map_desc realview_eb_io_desc[] __initdata = { | |||
91 | 91 | ||
92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { | 92 | static struct map_desc realview_eb11mp_io_desc[] __initdata = { |
93 | { | 93 | { |
94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_GIC_CPU_BASE), | 94 | .virtual = IO_ADDRESS(REALVIEW_EB11MP_SCU_BASE), |
95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_GIC_CPU_BASE), | 95 | .pfn = __phys_to_pfn(REALVIEW_EB11MP_SCU_BASE), |
96 | .length = SZ_4K, | 96 | .length = SZ_4K, |
97 | .type = MT_DEVICE, | 97 | .type = MT_DEVICE, |
98 | }, { | 98 | }, { |
@@ -469,6 +469,7 @@ MACHINE_START(REALVIEW_EB, "ARM-RealView EB") | |||
469 | .init_early = realview_init_early, | 469 | .init_early = realview_init_early, |
470 | .init_irq = gic_init_irq, | 470 | .init_irq = gic_init_irq, |
471 | .timer = &realview_eb_timer, | 471 | .timer = &realview_eb_timer, |
472 | .handle_irq = gic_handle_irq, | ||
472 | .init_machine = realview_eb_init, | 473 | .init_machine = realview_eb_init, |
473 | #ifdef CONFIG_ZONE_DMA | 474 | #ifdef CONFIG_ZONE_DMA |
474 | .dma_zone_size = SZ_256M, | 475 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pb1176.c b/arch/arm/mach-realview/realview_pb1176.c index c057540ec776..bd8fec8b20d9 100644 --- a/arch/arm/mach-realview/realview_pb1176.c +++ b/arch/arm/mach-realview/realview_pb1176.c | |||
@@ -392,6 +392,7 @@ MACHINE_START(REALVIEW_PB1176, "ARM-RealView PB1176") | |||
392 | .init_early = realview_init_early, | 392 | .init_early = realview_init_early, |
393 | .init_irq = gic_init_irq, | 393 | .init_irq = gic_init_irq, |
394 | .timer = &realview_pb1176_timer, | 394 | .timer = &realview_pb1176_timer, |
395 | .handle_irq = gic_handle_irq, | ||
395 | .init_machine = realview_pb1176_init, | 396 | .init_machine = realview_pb1176_init, |
396 | #ifdef CONFIG_ZONE_DMA | 397 | #ifdef CONFIG_ZONE_DMA |
397 | .dma_zone_size = SZ_256M, | 398 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pb11mp.c b/arch/arm/mach-realview/realview_pb11mp.c index 671ad6d6ff00..fa73ba81a449 100644 --- a/arch/arm/mach-realview/realview_pb11mp.c +++ b/arch/arm/mach-realview/realview_pb11mp.c | |||
@@ -366,6 +366,7 @@ MACHINE_START(REALVIEW_PB11MP, "ARM-RealView PB11MPCore") | |||
366 | .init_early = realview_init_early, | 366 | .init_early = realview_init_early, |
367 | .init_irq = gic_init_irq, | 367 | .init_irq = gic_init_irq, |
368 | .timer = &realview_pb11mp_timer, | 368 | .timer = &realview_pb11mp_timer, |
369 | .handle_irq = gic_handle_irq, | ||
369 | .init_machine = realview_pb11mp_init, | 370 | .init_machine = realview_pb11mp_init, |
370 | #ifdef CONFIG_ZONE_DMA | 371 | #ifdef CONFIG_ZONE_DMA |
371 | .dma_zone_size = SZ_256M, | 372 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pba8.c b/arch/arm/mach-realview/realview_pba8.c index cbf22df4ad5b..6e5f2b9ddb7e 100644 --- a/arch/arm/mach-realview/realview_pba8.c +++ b/arch/arm/mach-realview/realview_pba8.c | |||
@@ -316,6 +316,7 @@ MACHINE_START(REALVIEW_PBA8, "ARM-RealView PB-A8") | |||
316 | .init_early = realview_init_early, | 316 | .init_early = realview_init_early, |
317 | .init_irq = gic_init_irq, | 317 | .init_irq = gic_init_irq, |
318 | .timer = &realview_pba8_timer, | 318 | .timer = &realview_pba8_timer, |
319 | .handle_irq = gic_handle_irq, | ||
319 | .init_machine = realview_pba8_init, | 320 | .init_machine = realview_pba8_init, |
320 | #ifdef CONFIG_ZONE_DMA | 321 | #ifdef CONFIG_ZONE_DMA |
321 | .dma_zone_size = SZ_256M, | 322 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-realview/realview_pbx.c b/arch/arm/mach-realview/realview_pbx.c index 63c4114afae9..7aabc21af01c 100644 --- a/arch/arm/mach-realview/realview_pbx.c +++ b/arch/arm/mach-realview/realview_pbx.c | |||
@@ -98,8 +98,8 @@ static struct map_desc realview_pbx_io_desc[] __initdata = { | |||
98 | 98 | ||
99 | static struct map_desc realview_local_io_desc[] __initdata = { | 99 | static struct map_desc realview_local_io_desc[] __initdata = { |
100 | { | 100 | { |
101 | .virtual = IO_ADDRESS(REALVIEW_PBX_TILE_GIC_CPU_BASE), | 101 | .virtual = IO_ADDRESS(REALVIEW_PBX_TILE_SCU_BASE), |
102 | .pfn = __phys_to_pfn(REALVIEW_PBX_TILE_GIC_CPU_BASE), | 102 | .pfn = __phys_to_pfn(REALVIEW_PBX_TILE_SCU_BASE), |
103 | .length = SZ_4K, | 103 | .length = SZ_4K, |
104 | .type = MT_DEVICE, | 104 | .type = MT_DEVICE, |
105 | }, { | 105 | }, { |
@@ -399,6 +399,7 @@ MACHINE_START(REALVIEW_PBX, "ARM-RealView PBX") | |||
399 | .init_early = realview_init_early, | 399 | .init_early = realview_init_early, |
400 | .init_irq = gic_init_irq, | 400 | .init_irq = gic_init_irq, |
401 | .timer = &realview_pbx_timer, | 401 | .timer = &realview_pbx_timer, |
402 | .handle_irq = gic_handle_irq, | ||
402 | .init_machine = realview_pbx_init, | 403 | .init_machine = realview_pbx_init, |
403 | #ifdef CONFIG_ZONE_DMA | 404 | #ifdef CONFIG_ZONE_DMA |
404 | .dma_zone_size = SZ_256M, | 405 | .dma_zone_size = SZ_256M, |
diff --git a/arch/arm/mach-rpc/include/mach/system.h b/arch/arm/mach-rpc/include/mach/system.h index 45c7b935dc45..a354f4d092c8 100644 --- a/arch/arm/mach-rpc/include/mach/system.h +++ b/arch/arm/mach-rpc/include/mach/system.h | |||
@@ -23,5 +23,5 @@ static inline void arch_reset(char mode, const char *cmd) | |||
23 | /* | 23 | /* |
24 | * Jump into the ROM | 24 | * Jump into the ROM |
25 | */ | 25 | */ |
26 | cpu_reset(0); | 26 | soft_restart(0); |
27 | } | 27 | } |
diff --git a/arch/arm/mach-rpc/include/mach/vmalloc.h b/arch/arm/mach-rpc/include/mach/vmalloc.h deleted file mode 100644 index fb700228637a..000000000000 --- a/arch/arm/mach-rpc/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-rpc/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 1997 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 | #define VMALLOC_END 0xdc000000UL | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/system-reset.h b/arch/arm/mach-s3c2410/include/mach/system-reset.h index 6faadcee7729..913893d44650 100644 --- a/arch/arm/mach-s3c2410/include/mach/system-reset.h +++ b/arch/arm/mach-s3c2410/include/mach/system-reset.h | |||
@@ -19,7 +19,7 @@ static void | |||
19 | arch_reset(char mode, const char *cmd) | 19 | arch_reset(char mode, const char *cmd) |
20 | { | 20 | { |
21 | if (mode == 's') { | 21 | if (mode == 's') { |
22 | cpu_reset(0); | 22 | soft_restart(0); |
23 | } | 23 | } |
24 | 24 | ||
25 | if (s3c24xx_reset_hook) | 25 | if (s3c24xx_reset_hook) |
@@ -28,5 +28,5 @@ arch_reset(char mode, const char *cmd) | |||
28 | arch_wdt_reset(); | 28 | arch_wdt_reset(); |
29 | 29 | ||
30 | /* we'll take a jump through zero as a poor second */ | 30 | /* we'll take a jump through zero as a poor second */ |
31 | cpu_reset(0); | 31 | soft_restart(0); |
32 | } | 32 | } |
diff --git a/arch/arm/mach-s3c2410/include/mach/vmalloc.h b/arch/arm/mach-s3c2410/include/mach/vmalloc.h deleted file mode 100644 index 7a311e8dddba..000000000000 --- a/arch/arm/mach-s3c2410/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c2410/include/mach/vmalloc.h | ||
2 | * | ||
3 | * from arch/arm/mach-iop3xx/include/mach/vmalloc.h | ||
4 | * | ||
5 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C2410 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/entry-macro.S b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S index dd362604dcce..dc2bc15142ce 100644 --- a/arch/arm/mach-s3c64xx/include/mach/entry-macro.S +++ b/arch/arm/mach-s3c64xx/include/mach/entry-macro.S | |||
@@ -12,7 +12,8 @@ | |||
12 | * warranty of any kind, whether express or implied. | 12 | * warranty of any kind, whether express or implied. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <mach/map.h> | 15 | .macro disable_fiq |
16 | #include <mach/irqs.h> | 16 | .endm |
17 | 17 | ||
18 | #include <asm/entry-macro-vic2.S> | 18 | .macro arch_ret_to_user, tmp1, tmp2 |
19 | .endm | ||
diff --git a/arch/arm/mach-s3c64xx/include/mach/system.h b/arch/arm/mach-s3c64xx/include/mach/system.h index 2e58cb7a7147..d8ca5786ba25 100644 --- a/arch/arm/mach-s3c64xx/include/mach/system.h +++ b/arch/arm/mach-s3c64xx/include/mach/system.h | |||
@@ -24,7 +24,7 @@ static void arch_reset(char mode, const char *cmd) | |||
24 | arch_wdt_reset(); | 24 | arch_wdt_reset(); |
25 | 25 | ||
26 | /* if all else fails, or mode was for soft, jump to 0 */ | 26 | /* if all else fails, or mode was for soft, jump to 0 */ |
27 | cpu_reset(0); | 27 | soft_restart(0); |
28 | } | 28 | } |
29 | 29 | ||
30 | #endif /* __ASM_ARCH_IRQ_H */ | 30 | #endif /* __ASM_ARCH_IRQ_H */ |
diff --git a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h b/arch/arm/mach-s3c64xx/include/mach/vmalloc.h deleted file mode 100644 index 23f75e556a30..000000000000 --- a/arch/arm/mach-s3c64xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-s3c64xx/include/mach/vmalloc.h | ||
2 | * | ||
3 | * from arch/arm/mach-iop3xx/include/mach/vmalloc.h | ||
4 | * | ||
5 | * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk> | ||
6 | * http://www.simtec.co.uk/products/SWLINUX/ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C6400 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s3c64xx/mach-anw6410.c b/arch/arm/mach-s3c64xx/mach-anw6410.c index 8eba88e7209e..2bbc14d93428 100644 --- a/arch/arm/mach-s3c64xx/mach-anw6410.c +++ b/arch/arm/mach-s3c64xx/mach-anw6410.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <video/platform_lcd.h> | 31 | #include <video/platform_lcd.h> |
32 | 32 | ||
33 | #include <asm/hardware/vic.h> | ||
33 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
34 | #include <asm/mach/map.h> | 35 | #include <asm/mach/map.h> |
35 | #include <asm/mach/irq.h> | 36 | #include <asm/mach/irq.h> |
@@ -236,6 +237,7 @@ MACHINE_START(ANW6410, "A&W6410") | |||
236 | .atag_offset = 0x100, | 237 | .atag_offset = 0x100, |
237 | 238 | ||
238 | .init_irq = s3c6410_init_irq, | 239 | .init_irq = s3c6410_init_irq, |
240 | .handle_irq = vic_handle_irq, | ||
239 | .map_io = anw6410_map_io, | 241 | .map_io = anw6410_map_io, |
240 | .init_machine = anw6410_machine_init, | 242 | .init_machine = anw6410_machine_init, |
241 | .timer = &s3c24xx_timer, | 243 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index d04b65448510..988ac2e48f08 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/mfd/wm831x/irq.h> | 37 | #include <linux/mfd/wm831x/irq.h> |
38 | #include <linux/mfd/wm831x/gpio.h> | 38 | #include <linux/mfd/wm831x/gpio.h> |
39 | 39 | ||
40 | #include <asm/hardware/vic.h> | ||
40 | #include <asm/mach/arch.h> | 41 | #include <asm/mach/arch.h> |
41 | #include <asm/mach-types.h> | 42 | #include <asm/mach-types.h> |
42 | 43 | ||
@@ -711,6 +712,7 @@ MACHINE_START(WLF_CRAGG_6410, "Wolfson Cragganmore 6410") | |||
711 | /* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */ | 712 | /* Maintainer: Mark Brown <broonie@opensource.wolfsonmicro.com> */ |
712 | .atag_offset = 0x100, | 713 | .atag_offset = 0x100, |
713 | .init_irq = s3c6410_init_irq, | 714 | .init_irq = s3c6410_init_irq, |
715 | .handle_irq = vic_handle_irq, | ||
714 | .map_io = crag6410_map_io, | 716 | .map_io = crag6410_map_io, |
715 | .init_machine = crag6410_machine_init, | 717 | .init_machine = crag6410_machine_init, |
716 | .timer = &s3c24xx_timer, | 718 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c index 952f75ff5deb..c5955f301709 100644 --- a/arch/arm/mach-s3c64xx/mach-hmt.c +++ b/arch/arm/mach-s3c64xx/mach-hmt.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/map.h> | 30 | #include <mach/map.h> |
31 | 31 | ||
32 | #include <asm/hardware/vic.h> | ||
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
34 | 35 | ||
@@ -267,6 +268,7 @@ MACHINE_START(HMT, "Airgoo-HMT") | |||
267 | /* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */ | 268 | /* Maintainer: Peter Korsgaard <jacmet@sunsite.dk> */ |
268 | .atag_offset = 0x100, | 269 | .atag_offset = 0x100, |
269 | .init_irq = s3c6410_init_irq, | 270 | .init_irq = s3c6410_init_irq, |
271 | .handle_irq = vic_handle_irq, | ||
270 | .map_io = hmt_map_io, | 272 | .map_io = hmt_map_io, |
271 | .init_machine = hmt_machine_init, | 273 | .init_machine = hmt_machine_init, |
272 | .timer = &s3c24xx_timer, | 274 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-mini6410.c b/arch/arm/mach-s3c64xx/mach-mini6410.c index 1bc85c359498..4415c85e3f6f 100644 --- a/arch/arm/mach-s3c64xx/mach-mini6410.c +++ b/arch/arm/mach-s3c64xx/mach-mini6410.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/serial_core.h> | 24 | #include <linux/serial_core.h> |
25 | #include <linux/types.h> | 25 | #include <linux/types.h> |
26 | 26 | ||
27 | #include <asm/hardware/vic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
@@ -345,6 +346,7 @@ MACHINE_START(MINI6410, "MINI6410") | |||
345 | /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */ | 346 | /* Maintainer: Darius Augulis <augulis.darius@gmail.com> */ |
346 | .atag_offset = 0x100, | 347 | .atag_offset = 0x100, |
347 | .init_irq = s3c6410_init_irq, | 348 | .init_irq = s3c6410_init_irq, |
349 | .handle_irq = vic_handle_irq, | ||
348 | .map_io = mini6410_map_io, | 350 | .map_io = mini6410_map_io, |
349 | .init_machine = mini6410_machine_init, | 351 | .init_machine = mini6410_machine_init, |
350 | .timer = &s3c24xx_timer, | 352 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-ncp.c b/arch/arm/mach-s3c64xx/mach-ncp.c index cb13cba98b3d..9b2c610eac2a 100644 --- a/arch/arm/mach-s3c64xx/mach-ncp.c +++ b/arch/arm/mach-s3c64xx/mach-ncp.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <video/platform_lcd.h> | 26 | #include <video/platform_lcd.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
30 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
@@ -99,6 +100,7 @@ MACHINE_START(NCP, "NCP") | |||
99 | /* Maintainer: Samsung Electronics */ | 100 | /* Maintainer: Samsung Electronics */ |
100 | .atag_offset = 0x100, | 101 | .atag_offset = 0x100, |
101 | .init_irq = s3c6410_init_irq, | 102 | .init_irq = s3c6410_init_irq, |
103 | .handle_irq = vic_handle_irq, | ||
102 | .map_io = ncp_map_io, | 104 | .map_io = ncp_map_io, |
103 | .init_machine = ncp_machine_init, | 105 | .init_machine = ncp_machine_init, |
104 | .timer = &s3c24xx_timer, | 106 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-real6410.c b/arch/arm/mach-s3c64xx/mach-real6410.c index 87281e4b8471..dbab49f2713e 100644 --- a/arch/arm/mach-s3c64xx/mach-real6410.c +++ b/arch/arm/mach-s3c64xx/mach-real6410.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/serial_core.h> | 25 | #include <linux/serial_core.h> |
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
30 | #include <asm/mach/map.h> | 31 | #include <asm/mach/map.h> |
@@ -326,6 +327,7 @@ MACHINE_START(REAL6410, "REAL6410") | |||
326 | .atag_offset = 0x100, | 327 | .atag_offset = 0x100, |
327 | 328 | ||
328 | .init_irq = s3c6410_init_irq, | 329 | .init_irq = s3c6410_init_irq, |
330 | .handle_irq = vic_handle_irq, | ||
329 | .map_io = real6410_map_io, | 331 | .map_io = real6410_map_io, |
330 | .init_machine = real6410_machine_init, | 332 | .init_machine = real6410_machine_init, |
331 | .timer = &s3c24xx_timer, | 333 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq5.c b/arch/arm/mach-s3c64xx/mach-smartq5.c index 94c831d88365..053945282652 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq5.c +++ b/arch/arm/mach-s3c64xx/mach-smartq5.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <asm/hardware/vic.h> | ||
20 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
22 | 23 | ||
@@ -148,6 +149,7 @@ MACHINE_START(SMARTQ5, "SmartQ 5") | |||
148 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ | 149 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ |
149 | .atag_offset = 0x100, | 150 | .atag_offset = 0x100, |
150 | .init_irq = s3c6410_init_irq, | 151 | .init_irq = s3c6410_init_irq, |
152 | .handle_irq = vic_handle_irq, | ||
151 | .map_io = smartq_map_io, | 153 | .map_io = smartq_map_io, |
152 | .init_machine = smartq5_machine_init, | 154 | .init_machine = smartq5_machine_init, |
153 | .timer = &s3c24xx_timer, | 155 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq7.c b/arch/arm/mach-s3c64xx/mach-smartq7.c index f112547ce80a..a58d1ba5cba2 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq7.c +++ b/arch/arm/mach-s3c64xx/mach-smartq7.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/leds.h> | 17 | #include <linux/leds.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | 19 | ||
20 | #include <asm/hardware/vic.h> | ||
20 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
21 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
22 | 23 | ||
@@ -164,6 +165,7 @@ MACHINE_START(SMARTQ7, "SmartQ 7") | |||
164 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ | 165 | /* Maintainer: Maurus Cuelenaere <mcuelenaere AT gmail DOT com> */ |
165 | .atag_offset = 0x100, | 166 | .atag_offset = 0x100, |
166 | .init_irq = s3c6410_init_irq, | 167 | .init_irq = s3c6410_init_irq, |
168 | .handle_irq = vic_handle_irq, | ||
167 | .map_io = smartq_map_io, | 169 | .map_io = smartq_map_io, |
168 | .init_machine = smartq7_machine_init, | 170 | .init_machine = smartq7_machine_init, |
169 | .timer = &s3c24xx_timer, | 171 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6400.c b/arch/arm/mach-s3c64xx/mach-smdk6400.c index 73450c2b530a..be28a59e3f57 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6400.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6400.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
24 | 24 | ||
25 | #include <asm/hardware/vic.h> | ||
25 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
27 | #include <asm/mach/irq.h> | 28 | #include <asm/mach/irq.h> |
@@ -88,6 +89,7 @@ MACHINE_START(SMDK6400, "SMDK6400") | |||
88 | .atag_offset = 0x100, | 89 | .atag_offset = 0x100, |
89 | 90 | ||
90 | .init_irq = s3c6400_init_irq, | 91 | .init_irq = s3c6400_init_irq, |
92 | .handle_irq = vic_handle_irq, | ||
91 | .map_io = smdk6400_map_io, | 93 | .map_io = smdk6400_map_io, |
92 | .init_machine = smdk6400_machine_init, | 94 | .init_machine = smdk6400_machine_init, |
93 | .timer = &s3c24xx_timer, | 95 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index 8bc8edd85e5a..08309155d087 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -43,6 +43,7 @@ | |||
43 | 43 | ||
44 | #include <video/platform_lcd.h> | 44 | #include <video/platform_lcd.h> |
45 | 45 | ||
46 | #include <asm/hardware/vic.h> | ||
46 | #include <asm/mach/arch.h> | 47 | #include <asm/mach/arch.h> |
47 | #include <asm/mach/map.h> | 48 | #include <asm/mach/map.h> |
48 | #include <asm/mach/irq.h> | 49 | #include <asm/mach/irq.h> |
@@ -700,6 +701,7 @@ MACHINE_START(SMDK6410, "SMDK6410") | |||
700 | .atag_offset = 0x100, | 701 | .atag_offset = 0x100, |
701 | 702 | ||
702 | .init_irq = s3c6410_init_irq, | 703 | .init_irq = s3c6410_init_irq, |
704 | .handle_irq = vic_handle_irq, | ||
703 | .map_io = smdk6410_map_io, | 705 | .map_io = smdk6410_map_io, |
704 | .init_machine = smdk6410_machine_init, | 706 | .init_machine = smdk6410_machine_init, |
705 | .timer = &s3c24xx_timer, | 707 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s5p64x0/include/mach/entry-macro.S b/arch/arm/mach-s5p64x0/include/mach/entry-macro.S index 10b62b4f8211..fbb246d0a3df 100644 --- a/arch/arm/mach-s5p64x0/include/mach/entry-macro.S +++ b/arch/arm/mach-s5p64x0/include/mach/entry-macro.S | |||
@@ -10,7 +10,8 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <mach/map.h> | 13 | .macro disable_fiq |
14 | #include <plat/irqs.h> | 14 | .endm |
15 | 15 | ||
16 | #include <asm/entry-macro-vic2.S> | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
17 | .endm | ||
diff --git a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h b/arch/arm/mach-s5p64x0/include/mach/vmalloc.h deleted file mode 100644 index 38dcc71a03cc..000000000000 --- a/arch/arm/mach-s5p64x0/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p64x0/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
4 | * http://www.samsung.com | ||
5 | * | ||
6 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * S3C6400 vmalloc definition | ||
13 | */ | ||
14 | |||
15 | #ifndef __ASM_ARCH_VMALLOC_H | ||
16 | #define __ASM_ARCH_VMALLOC_H | ||
17 | |||
18 | #define VMALLOC_END 0xF6000000UL | ||
19 | |||
20 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c index 4a1250cd1356..c272c3f7d6de 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6440.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
@@ -242,6 +243,7 @@ MACHINE_START(SMDK6440, "SMDK6440") | |||
242 | .atag_offset = 0x100, | 243 | .atag_offset = 0x100, |
243 | 244 | ||
244 | .init_irq = s5p6440_init_irq, | 245 | .init_irq = s5p6440_init_irq, |
246 | .handle_irq = vic_handle_irq, | ||
245 | .map_io = smdk6440_map_io, | 247 | .map_io = smdk6440_map_io, |
246 | .init_machine = smdk6440_machine_init, | 248 | .init_machine = smdk6440_machine_init, |
247 | .timer = &s5p_timer, | 249 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c index 0ab129ecf009..7a4700959616 100644 --- a/arch/arm/mach-s5p64x0/mach-smdk6450.c +++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <video/platform_lcd.h> | 28 | #include <video/platform_lcd.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/irq.h> | 33 | #include <asm/irq.h> |
@@ -262,6 +263,7 @@ MACHINE_START(SMDK6450, "SMDK6450") | |||
262 | .atag_offset = 0x100, | 263 | .atag_offset = 0x100, |
263 | 264 | ||
264 | .init_irq = s5p6450_init_irq, | 265 | .init_irq = s5p6450_init_irq, |
266 | .handle_irq = vic_handle_irq, | ||
265 | .map_io = smdk6450_map_io, | 267 | .map_io = smdk6450_map_io, |
266 | .init_machine = smdk6450_machine_init, | 268 | .init_machine = smdk6450_machine_init, |
267 | .timer = &s5p_timer, | 269 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pc100/include/mach/entry-macro.S b/arch/arm/mach-s5pc100/include/mach/entry-macro.S index ba76af052c81..b8c242edfa22 100644 --- a/arch/arm/mach-s5pc100/include/mach/entry-macro.S +++ b/arch/arm/mach-s5pc100/include/mach/entry-macro.S | |||
@@ -12,39 +12,14 @@ | |||
12 | * warranty of any kind, whether express or implied. | 12 | * warranty of any kind, whether express or implied. |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <asm/hardware/vic.h> | ||
16 | #include <mach/map.h> | ||
17 | #include <plat/irqs.h> | ||
18 | |||
19 | .macro disable_fiq | 15 | .macro disable_fiq |
20 | .endm | 16 | .endm |
21 | 17 | ||
22 | .macro get_irqnr_preamble, base, tmp | 18 | .macro get_irqnr_preamble, base, tmp |
23 | ldr \base, =VA_VIC0 | ||
24 | .endm | 19 | .endm |
25 | 20 | ||
26 | .macro arch_ret_to_user, tmp1, tmp2 | 21 | .macro arch_ret_to_user, tmp1, tmp2 |
27 | .endm | 22 | .endm |
28 | 23 | ||
29 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
30 | |||
31 | @ check the vic0 | ||
32 | mov \irqnr, # S5P_IRQ_OFFSET + 31 | ||
33 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
34 | teq \irqstat, #0 | ||
35 | |||
36 | @ otherwise try vic1 | ||
37 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
38 | addeq \irqnr, \irqnr, #32 | ||
39 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
40 | teqeq \irqstat, #0 | ||
41 | |||
42 | @ otherwise try vic2 | ||
43 | addeq \tmp, \base, #(VA_VIC2 - VA_VIC0) | ||
44 | addeq \irqnr, \irqnr, #32 | ||
45 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
46 | teqeq \irqstat, #0 | ||
47 | |||
48 | clzne \irqstat, \irqstat | ||
49 | subne \irqnr, \irqnr, \irqstat | ||
50 | .endm | 25 | .endm |
diff --git a/arch/arm/mach-s5pc100/include/mach/vmalloc.h b/arch/arm/mach-s5pc100/include/mach/vmalloc.h deleted file mode 100644 index 44c8e5726d9d..000000000000 --- a/arch/arm/mach-s5pc100/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | /* arch/arm/mach-s5pc100/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * S3C6400 vmalloc definition | ||
10 | */ | ||
11 | |||
12 | #ifndef __ASM_ARCH_VMALLOC_H | ||
13 | #define __ASM_ARCH_VMALLOC_H | ||
14 | |||
15 | #define VMALLOC_END 0xF6000000UL | ||
16 | |||
17 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c index 26f5c91c9427..93ebe3a92d10 100644 --- a/arch/arm/mach-s5pc100/mach-smdkc100.c +++ b/arch/arm/mach-s5pc100/mach-smdkc100.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/input.h> | 25 | #include <linux/input.h> |
26 | #include <linux/pwm_backlight.h> | 26 | #include <linux/pwm_backlight.h> |
27 | 27 | ||
28 | #include <asm/hardware/vic.h> | ||
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
30 | 31 | ||
@@ -250,6 +251,7 @@ MACHINE_START(SMDKC100, "SMDKC100") | |||
250 | /* Maintainer: Byungho Min <bhmin@samsung.com> */ | 251 | /* Maintainer: Byungho Min <bhmin@samsung.com> */ |
251 | .atag_offset = 0x100, | 252 | .atag_offset = 0x100, |
252 | .init_irq = s5pc100_init_irq, | 253 | .init_irq = s5pc100_init_irq, |
254 | .handle_irq = vic_handle_irq, | ||
253 | .map_io = smdkc100_map_io, | 255 | .map_io = smdkc100_map_io, |
254 | .init_machine = smdkc100_machine_init, | 256 | .init_machine = smdkc100_machine_init, |
255 | .timer = &s3c24xx_timer, | 257 | .timer = &s3c24xx_timer, |
diff --git a/arch/arm/mach-s5pv210/include/mach/entry-macro.S b/arch/arm/mach-s5pv210/include/mach/entry-macro.S index 3aa41ac59f07..bebca1b5d0b1 100644 --- a/arch/arm/mach-s5pv210/include/mach/entry-macro.S +++ b/arch/arm/mach-s5pv210/include/mach/entry-macro.S | |||
@@ -10,45 +10,8 @@ | |||
10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <asm/hardware/vic.h> | ||
14 | #include <mach/map.h> | ||
15 | #include <plat/irqs.h> | ||
16 | |||
17 | .macro disable_fiq | 13 | .macro disable_fiq |
18 | .endm | 14 | .endm |
19 | 15 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | ldr \base, =VA_VIC0 | ||
22 | .endm | ||
23 | |||
24 | .macro arch_ret_to_user, tmp1, tmp2 | 16 | .macro arch_ret_to_user, tmp1, tmp2 |
25 | .endm | 17 | .endm |
26 | |||
27 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
28 | |||
29 | @ check the vic0 | ||
30 | mov \irqnr, # S5P_IRQ_OFFSET + 31 | ||
31 | ldr \irqstat, [ \base, # VIC_IRQ_STATUS ] | ||
32 | teq \irqstat, #0 | ||
33 | |||
34 | @ otherwise try vic1 | ||
35 | addeq \tmp, \base, #(VA_VIC1 - VA_VIC0) | ||
36 | addeq \irqnr, \irqnr, #32 | ||
37 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
38 | teqeq \irqstat, #0 | ||
39 | |||
40 | @ otherwise try vic2 | ||
41 | addeq \tmp, \base, #(VA_VIC2 - VA_VIC0) | ||
42 | addeq \irqnr, \irqnr, #32 | ||
43 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
44 | teqeq \irqstat, #0 | ||
45 | |||
46 | @ otherwise try vic3 | ||
47 | addeq \tmp, \base, #(VA_VIC3 - VA_VIC0) | ||
48 | addeq \irqnr, \irqnr, #32 | ||
49 | ldreq \irqstat, [ \tmp, # VIC_IRQ_STATUS ] | ||
50 | teqeq \irqstat, #0 | ||
51 | |||
52 | clzne \irqstat, \irqstat | ||
53 | subne \irqnr, \irqnr, \irqstat | ||
54 | .endm | ||
diff --git a/arch/arm/mach-s5pv210/include/mach/vmalloc.h b/arch/arm/mach-s5pv210/include/mach/vmalloc.h deleted file mode 100644 index a6c659d68a5d..000000000000 --- a/arch/arm/mach-s5pv210/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s5p6442/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright 2010 Ben Dooks <ben-linux@fluff.org> | ||
4 | * | ||
5 | * Copyright (c) 2010 Samsung Electronics Co., Ltd. | ||
6 | * http://www.samsung.com/ | ||
7 | * | ||
8 | * Based on arch/arm/mach-s5p6442/include/mach/vmalloc.h | ||
9 | * | ||
10 | * S5PV210 vmalloc definition | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #ifndef __ASM_ARCH_VMALLOC_H | ||
18 | #define __ASM_ARCH_VMALLOC_H __FILE__ | ||
19 | |||
20 | #define VMALLOC_END 0xF6000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-s5pv210/mach-aquila.c b/arch/arm/mach-s5pv210/mach-aquila.c index 5811a96125f0..71ca95604d63 100644 --- a/arch/arm/mach-s5pv210/mach-aquila.c +++ b/arch/arm/mach-s5pv210/mach-aquila.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/input.h> | 22 | #include <linux/input.h> |
23 | #include <linux/gpio.h> | 23 | #include <linux/gpio.h> |
24 | 24 | ||
25 | #include <asm/hardware/vic.h> | ||
25 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
27 | #include <asm/setup.h> | 28 | #include <asm/setup.h> |
@@ -680,6 +681,7 @@ MACHINE_START(AQUILA, "Aquila") | |||
680 | Kyungmin Park <kyungmin.park@samsung.com> */ | 681 | Kyungmin Park <kyungmin.park@samsung.com> */ |
681 | .atag_offset = 0x100, | 682 | .atag_offset = 0x100, |
682 | .init_irq = s5pv210_init_irq, | 683 | .init_irq = s5pv210_init_irq, |
684 | .handle_irq = vic_handle_irq, | ||
683 | .map_io = aquila_map_io, | 685 | .map_io = aquila_map_io, |
684 | .init_machine = aquila_machine_init, | 686 | .init_machine = aquila_machine_init, |
685 | .timer = &s5p_timer, | 687 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-goni.c b/arch/arm/mach-s5pv210/mach-goni.c index 15edcae448b9..448fd9ea96f2 100644 --- a/arch/arm/mach-s5pv210/mach-goni.c +++ b/arch/arm/mach-s5pv210/mach-goni.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
29 | 29 | ||
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/mach/map.h> | 32 | #include <asm/mach/map.h> |
32 | #include <asm/setup.h> | 33 | #include <asm/setup.h> |
@@ -956,6 +957,7 @@ MACHINE_START(GONI, "GONI") | |||
956 | /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */ | 957 | /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */ |
957 | .atag_offset = 0x100, | 958 | .atag_offset = 0x100, |
958 | .init_irq = s5pv210_init_irq, | 959 | .init_irq = s5pv210_init_irq, |
960 | .handle_irq = vic_handle_irq, | ||
959 | .map_io = goni_map_io, | 961 | .map_io = goni_map_io, |
960 | .init_machine = goni_machine_init, | 962 | .init_machine = goni_machine_init, |
961 | .timer = &s5p_timer, | 963 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-smdkc110.c b/arch/arm/mach-s5pv210/mach-smdkc110.c index f7266bb0cac8..c2531ffc720b 100644 --- a/arch/arm/mach-s5pv210/mach-smdkc110.c +++ b/arch/arm/mach-s5pv210/mach-smdkc110.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/i2c.h> | 15 | #include <linux/i2c.h> |
16 | #include <linux/sysdev.h> | 16 | #include <linux/sysdev.h> |
17 | 17 | ||
18 | #include <asm/hardware/vic.h> | ||
18 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/map.h> | 20 | #include <asm/mach/map.h> |
20 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
@@ -138,6 +139,7 @@ MACHINE_START(SMDKC110, "SMDKC110") | |||
138 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | 139 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ |
139 | .atag_offset = 0x100, | 140 | .atag_offset = 0x100, |
140 | .init_irq = s5pv210_init_irq, | 141 | .init_irq = s5pv210_init_irq, |
142 | .handle_irq = vic_handle_irq, | ||
141 | .map_io = smdkc110_map_io, | 143 | .map_io = smdkc110_map_io, |
142 | .init_machine = smdkc110_machine_init, | 144 | .init_machine = smdkc110_machine_init, |
143 | .timer = &s5p_timer, | 145 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c index a9106c392398..4ca77c41d499 100644 --- a/arch/arm/mach-s5pv210/mach-smdkv210.c +++ b/arch/arm/mach-s5pv210/mach-smdkv210.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
21 | #include <linux/pwm_backlight.h> | 21 | #include <linux/pwm_backlight.h> |
22 | 22 | ||
23 | #include <asm/hardware/vic.h> | ||
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
25 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
@@ -315,6 +316,7 @@ MACHINE_START(SMDKV210, "SMDKV210") | |||
315 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ | 316 | /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */ |
316 | .atag_offset = 0x100, | 317 | .atag_offset = 0x100, |
317 | .init_irq = s5pv210_init_irq, | 318 | .init_irq = s5pv210_init_irq, |
319 | .handle_irq = vic_handle_irq, | ||
318 | .map_io = smdkv210_map_io, | 320 | .map_io = smdkv210_map_io, |
319 | .init_machine = smdkv210_machine_init, | 321 | .init_machine = smdkv210_machine_init, |
320 | .timer = &s5p_timer, | 322 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-s5pv210/mach-torbreck.c b/arch/arm/mach-s5pv210/mach-torbreck.c index 97cc066c5369..df70fcb34516 100644 --- a/arch/arm/mach-s5pv210/mach-torbreck.c +++ b/arch/arm/mach-s5pv210/mach-torbreck.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/serial_core.h> | 15 | #include <linux/serial_core.h> |
16 | 16 | ||
17 | #include <asm/hardware/vic.h> | ||
17 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
18 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
19 | #include <asm/setup.h> | 20 | #include <asm/setup.h> |
@@ -127,6 +128,7 @@ MACHINE_START(TORBRECK, "TORBRECK") | |||
127 | /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */ | 128 | /* Maintainer: Hyunchul Ko <ghcstop@gmail.com> */ |
128 | .atag_offset = 0x100, | 129 | .atag_offset = 0x100, |
129 | .init_irq = s5pv210_init_irq, | 130 | .init_irq = s5pv210_init_irq, |
131 | .handle_irq = vic_handle_irq, | ||
130 | .map_io = torbreck_map_io, | 132 | .map_io = torbreck_map_io, |
131 | .init_machine = torbreck_machine_init, | 133 | .init_machine = torbreck_machine_init, |
132 | .timer = &s5p_timer, | 134 | .timer = &s5p_timer, |
diff --git a/arch/arm/mach-sa1100/include/mach/system.h b/arch/arm/mach-sa1100/include/mach/system.h index ba9da9f7f183..345d35b7450c 100644 --- a/arch/arm/mach-sa1100/include/mach/system.h +++ b/arch/arm/mach-sa1100/include/mach/system.h | |||
@@ -14,7 +14,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
14 | { | 14 | { |
15 | if (mode == 's') { | 15 | if (mode == 's') { |
16 | /* Jump into ROM at address 0 */ | 16 | /* Jump into ROM at address 0 */ |
17 | cpu_reset(0); | 17 | soft_restart(0); |
18 | } else { | 18 | } else { |
19 | /* Use on-chip reset capability */ | 19 | /* Use on-chip reset capability */ |
20 | RSRR = RSRR_SWR; | 20 | RSRR = RSRR_SWR; |
diff --git a/arch/arm/mach-sa1100/include/mach/vmalloc.h b/arch/arm/mach-sa1100/include/mach/vmalloc.h deleted file mode 100644 index b3d002398480..000000000000 --- a/arch/arm/mach-sa1100/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-sa1100/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END (0xe8000000UL) | ||
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index feda3ca7fc95..f4b25d875f3d 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c | |||
@@ -29,7 +29,6 @@ | |||
29 | void arch_reset(char mode, const char *cmd) | 29 | void arch_reset(char mode, const char *cmd) |
30 | { | 30 | { |
31 | short temp; | 31 | short temp; |
32 | local_irq_disable(); | ||
33 | /* Reset the Machine via pc[3] of the sequoia chipset */ | 32 | /* Reset the Machine via pc[3] of the sequoia chipset */ |
34 | outw(0x09,0x24); | 33 | outw(0x09,0x24); |
35 | temp=inw(0x26); | 34 | temp=inw(0x26); |
diff --git a/arch/arm/mach-shark/include/mach/vmalloc.h b/arch/arm/mach-shark/include/mach/vmalloc.h deleted file mode 100644 index b10df988526d..000000000000 --- a/arch/arm/mach-shark/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-shark/include/mach/vmalloc.h | ||
3 | */ | ||
4 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile index 737bdc631b0d..5ca1f9d66995 100644 --- a/arch/arm/mach-shmobile/Makefile +++ b/arch/arm/mach-shmobile/Makefile | |||
@@ -28,7 +28,6 @@ pfc-$(CONFIG_ARCH_SH73A0) += pfc-sh73a0.o | |||
28 | obj-$(CONFIG_ARCH_SH7367) += entry-intc.o | 28 | obj-$(CONFIG_ARCH_SH7367) += entry-intc.o |
29 | obj-$(CONFIG_ARCH_SH7377) += entry-intc.o | 29 | obj-$(CONFIG_ARCH_SH7377) += entry-intc.o |
30 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o | 30 | obj-$(CONFIG_ARCH_SH7372) += entry-intc.o |
31 | obj-$(CONFIG_ARCH_SH73A0) += entry-gic.o | ||
32 | 31 | ||
33 | # PM objects | 32 | # PM objects |
34 | obj-$(CONFIG_SUSPEND) += suspend.o | 33 | obj-$(CONFIG_SUSPEND) += suspend.o |
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index b862e9f81e3e..202c3c6ec9d8 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -608,7 +608,7 @@ struct sys_timer ag5evm_timer = { | |||
608 | MACHINE_START(AG5EVM, "ag5evm") | 608 | MACHINE_START(AG5EVM, "ag5evm") |
609 | .map_io = ag5evm_map_io, | 609 | .map_io = ag5evm_map_io, |
610 | .init_irq = sh73a0_init_irq, | 610 | .init_irq = sh73a0_init_irq, |
611 | .handle_irq = shmobile_handle_irq_gic, | 611 | .handle_irq = gic_handle_irq, |
612 | .init_machine = ag5evm_init, | 612 | .init_machine = ag5evm_init, |
613 | .timer = &ag5evm_timer, | 613 | .timer = &ag5evm_timer, |
614 | MACHINE_END | 614 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c index bd9a78424d6b..1b4439d3f9d5 100644 --- a/arch/arm/mach-shmobile/board-kota2.c +++ b/arch/arm/mach-shmobile/board-kota2.c | |||
@@ -448,7 +448,7 @@ struct sys_timer kota2_timer = { | |||
448 | MACHINE_START(KOTA2, "kota2") | 448 | MACHINE_START(KOTA2, "kota2") |
449 | .map_io = kota2_map_io, | 449 | .map_io = kota2_map_io, |
450 | .init_irq = kota2_init_irq, | 450 | .init_irq = kota2_init_irq, |
451 | .handle_irq = shmobile_handle_irq_gic, | 451 | .handle_irq = gic_handle_irq, |
452 | .init_machine = kota2_init, | 452 | .init_machine = kota2_init, |
453 | .timer = &kota2_timer, | 453 | .timer = &kota2_timer, |
454 | MACHINE_END | 454 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/entry-gic.S b/arch/arm/mach-shmobile/entry-gic.S deleted file mode 100644 index e20239b08c83..000000000000 --- a/arch/arm/mach-shmobile/entry-gic.S +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * ARM Interrupt demux handler using GIC | ||
3 | * | ||
4 | * Copyright (C) 2010 Magnus Damm | ||
5 | * Copyright (C) 2011 Paul Mundt | ||
6 | * Copyright (C) 2010 - 2011 Renesas Solutions Corp. | ||
7 | * | ||
8 | * This file is licensed under the terms of the GNU General Public | ||
9 | * License version 2. This program is licensed "as is" without any | ||
10 | * warranty of any kind, whether express or implied. | ||
11 | */ | ||
12 | |||
13 | #include <asm/assembler.h> | ||
14 | #include <asm/entry-macro-multi.S> | ||
15 | #include <asm/hardware/gic.h> | ||
16 | #include <asm/hardware/entry-macro-gic.S> | ||
17 | |||
18 | arch_irq_handler shmobile_handle_irq_gic | ||
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index 834bd6cd508f..4bf82c156771 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h | |||
@@ -7,7 +7,6 @@ extern void shmobile_secondary_vector(void); | |||
7 | struct clk; | 7 | struct clk; |
8 | extern int clk_init(void); | 8 | extern int clk_init(void); |
9 | extern void shmobile_handle_irq_intc(struct pt_regs *); | 9 | extern void shmobile_handle_irq_intc(struct pt_regs *); |
10 | extern void shmobile_handle_irq_gic(struct pt_regs *); | ||
11 | extern struct platform_suspend_ops shmobile_suspend_ops; | 10 | extern struct platform_suspend_ops shmobile_suspend_ops; |
12 | struct cpuidle_driver; | 11 | struct cpuidle_driver; |
13 | extern void (*shmobile_cpuidle_modes[])(void); | 12 | extern void (*shmobile_cpuidle_modes[])(void); |
diff --git a/arch/arm/mach-shmobile/include/mach/entry-macro.S b/arch/arm/mach-shmobile/include/mach/entry-macro.S index 8d4a416d4285..2a57b2964ee9 100644 --- a/arch/arm/mach-shmobile/include/mach/entry-macro.S +++ b/arch/arm/mach-shmobile/include/mach/entry-macro.S | |||
@@ -18,14 +18,5 @@ | |||
18 | .macro disable_fiq | 18 | .macro disable_fiq |
19 | .endm | 19 | .endm |
20 | 20 | ||
21 | .macro get_irqnr_preamble, base, tmp | ||
22 | .endm | ||
23 | |||
24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
25 | .endm | ||
26 | |||
27 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
28 | .endm | ||
29 | |||
30 | .macro arch_ret_to_user, tmp1, tmp2 | 21 | .macro arch_ret_to_user, tmp1, tmp2 |
31 | .endm | 22 | .endm |
diff --git a/arch/arm/mach-shmobile/include/mach/system.h b/arch/arm/mach-shmobile/include/mach/system.h index 76a687eeaa22..956ac18ddbf9 100644 --- a/arch/arm/mach-shmobile/include/mach/system.h +++ b/arch/arm/mach-shmobile/include/mach/system.h | |||
@@ -8,7 +8,7 @@ static inline void arch_idle(void) | |||
8 | 8 | ||
9 | static inline void arch_reset(char mode, const char *cmd) | 9 | static inline void arch_reset(char mode, const char *cmd) |
10 | { | 10 | { |
11 | cpu_reset(0); | 11 | soft_restart(0); |
12 | } | 12 | } |
13 | 13 | ||
14 | #endif | 14 | #endif |
diff --git a/arch/arm/mach-shmobile/include/mach/vmalloc.h b/arch/arm/mach-shmobile/include/mach/vmalloc.h deleted file mode 100644 index 2b8fd8b942fe..000000000000 --- a/arch/arm/mach-shmobile/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | #ifndef __ASM_MACH_VMALLOC_H | ||
2 | #define __ASM_MACH_VMALLOC_H | ||
3 | |||
4 | /* Vmalloc at ... - 0xe5ffffff */ | ||
5 | #define VMALLOC_END 0xe6000000UL | ||
6 | |||
7 | #endif /* __ASM_MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/entry-macro.S b/arch/arm/mach-spear3xx/include/mach/entry-macro.S index 53da4224ba3d..de3bb41c8e9e 100644 --- a/arch/arm/mach-spear3xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear3xx/include/mach/entry-macro.S | |||
@@ -11,35 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
15 | #include <mach/hardware.h> | ||
16 | |||
17 | .macro disable_fiq | 14 | .macro disable_fiq |
18 | .endm | 15 | .endm |
19 | 16 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | .endm | ||
22 | |||
23 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
24 | .endm | 18 | .endm |
25 | |||
26 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
27 | ldr \base, =VA_SPEAR3XX_ML1_VIC_BASE | ||
28 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
29 | teq \irqstat, #0 | ||
30 | beq 1001f @ this will set/reset | ||
31 | @ zero register | ||
32 | /* | ||
33 | * Following code will find bit position of least significang | ||
34 | * bit set in irqstat, using following equation | ||
35 | * least significant bit set in n = (n & ~(n-1)) | ||
36 | */ | ||
37 | sub \tmp, \irqstat, #1 @ tmp = irqstat - 1 | ||
38 | mvn \tmp, \tmp @ tmp = ~tmp | ||
39 | and \irqstat, \irqstat, \tmp @ irqstat &= tmp | ||
40 | /* Now, irqstat is = bit no. of 1st bit set in vic irq status */ | ||
41 | clz \tmp, \irqstat @ tmp = leading zeros | ||
42 | rsb \irqnr, \tmp, #0x1F @ irqnr = 32 - tmp - 1 | ||
43 | |||
44 | 1001: /* EQ will be set if no irqs pending */ | ||
45 | .endm | ||
diff --git a/arch/arm/mach-spear3xx/include/mach/vmalloc.h b/arch/arm/mach-spear3xx/include/mach/vmalloc.h deleted file mode 100644 index df977b3c9a63..000000000000 --- a/arch/arm/mach-spear3xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear3xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr3xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_VMALLOC_H | ||
15 | #define __MACH_VMALLOC_H | ||
16 | |||
17 | #include <plat/vmalloc.h> | ||
18 | |||
19 | #endif /* __MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c index a5ff98eed1db..61068ba67923 100644 --- a/arch/arm/mach-spear3xx/spear300_evb.c +++ b/arch/arm/mach-spear3xx/spear300_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -67,6 +68,7 @@ MACHINE_START(SPEAR300, "ST-SPEAR300-EVB") | |||
67 | .atag_offset = 0x100, | 68 | .atag_offset = 0x100, |
68 | .map_io = spear3xx_map_io, | 69 | .map_io = spear3xx_map_io, |
69 | .init_irq = spear3xx_init_irq, | 70 | .init_irq = spear3xx_init_irq, |
71 | .handle_irq = vic_handle_irq, | ||
70 | .timer = &spear3xx_timer, | 72 | .timer = &spear3xx_timer, |
71 | .init_machine = spear300_evb_init, | 73 | .init_machine = spear300_evb_init, |
72 | MACHINE_END | 74 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c index 45d180d59362..7903abe92bf6 100644 --- a/arch/arm/mach-spear3xx/spear310_evb.c +++ b/arch/arm/mach-spear3xx/spear310_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -73,6 +74,7 @@ MACHINE_START(SPEAR310, "ST-SPEAR310-EVB") | |||
73 | .atag_offset = 0x100, | 74 | .atag_offset = 0x100, |
74 | .map_io = spear3xx_map_io, | 75 | .map_io = spear3xx_map_io, |
75 | .init_irq = spear3xx_init_irq, | 76 | .init_irq = spear3xx_init_irq, |
77 | .handle_irq = vic_handle_irq, | ||
76 | .timer = &spear3xx_timer, | 78 | .timer = &spear3xx_timer, |
77 | .init_machine = spear310_evb_init, | 79 | .init_machine = spear310_evb_init, |
78 | MACHINE_END | 80 | MACHINE_END |
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c index 22879848d73a..e9751f970933 100644 --- a/arch/arm/mach-spear3xx/spear320_evb.c +++ b/arch/arm/mach-spear3xx/spear320_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -71,6 +72,7 @@ MACHINE_START(SPEAR320, "ST-SPEAR320-EVB") | |||
71 | .atag_offset = 0x100, | 72 | .atag_offset = 0x100, |
72 | .map_io = spear3xx_map_io, | 73 | .map_io = spear3xx_map_io, |
73 | .init_irq = spear3xx_init_irq, | 74 | .init_irq = spear3xx_init_irq, |
75 | .handle_irq = vic_handle_irq, | ||
74 | .timer = &spear3xx_timer, | 76 | .timer = &spear3xx_timer, |
75 | .init_machine = spear320_evb_init, | 77 | .init_machine = spear320_evb_init, |
76 | MACHINE_END | 78 | MACHINE_END |
diff --git a/arch/arm/mach-spear6xx/include/mach/entry-macro.S b/arch/arm/mach-spear6xx/include/mach/entry-macro.S index 8a0b0ed7b203..d490a910d925 100644 --- a/arch/arm/mach-spear6xx/include/mach/entry-macro.S +++ b/arch/arm/mach-spear6xx/include/mach/entry-macro.S | |||
@@ -11,44 +11,8 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
15 | #include <mach/hardware.h> | ||
16 | |||
17 | .macro disable_fiq | 14 | .macro disable_fiq |
18 | .endm | 15 | .endm |
19 | 16 | ||
20 | .macro get_irqnr_preamble, base, tmp | ||
21 | .endm | ||
22 | |||
23 | .macro arch_ret_to_user, tmp1, tmp2 | 17 | .macro arch_ret_to_user, tmp1, tmp2 |
24 | .endm | 18 | .endm |
25 | |||
26 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
27 | ldr \base, =VA_SPEAR6XX_CPU_VIC_PRI_BASE | ||
28 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
29 | mov \irqnr, #0 | ||
30 | teq \irqstat, #0 | ||
31 | bne 1001f | ||
32 | ldr \base, =VA_SPEAR6XX_CPU_VIC_SEC_BASE | ||
33 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get status | ||
34 | teq \irqstat, #0 | ||
35 | beq 1002f @ this will set/reset | ||
36 | @ zero register | ||
37 | mov \irqnr, #32 | ||
38 | 1001: | ||
39 | /* | ||
40 | * Following code will find bit position of least significang | ||
41 | * bit set in irqstat, using following equation | ||
42 | * least significant bit set in n = (n & ~(n-1)) | ||
43 | */ | ||
44 | sub \tmp, \irqstat, #1 @ tmp = irqstat - 1 | ||
45 | mvn \tmp, \tmp @ tmp = ~tmp | ||
46 | and \irqstat, \irqstat, \tmp @ irqstat &= tmp | ||
47 | /* Now, irqstat is = bit no. of 1st bit set in vic irq status */ | ||
48 | clz \tmp, \irqstat @ tmp = leading zeros | ||
49 | |||
50 | rsb \tmp, \tmp, #0x1F @ tmp = 32 - tmp - 1 | ||
51 | add \irqnr, \irqnr, \tmp | ||
52 | |||
53 | 1002: /* EQ will be set if no irqs pending */ | ||
54 | .endm | ||
diff --git a/arch/arm/mach-spear6xx/include/mach/vmalloc.h b/arch/arm/mach-spear6xx/include/mach/vmalloc.h deleted file mode 100644 index 4a0b56cb2a91..000000000000 --- a/arch/arm/mach-spear6xx/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-spear6xx/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr6xx machine family | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Rajeev Kumar<rajeev-dlh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __MACH_VMALLOC_H | ||
15 | #define __MACH_VMALLOC_H | ||
16 | |||
17 | #include <plat/vmalloc.h> | ||
18 | |||
19 | #endif /* __MACH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c index 8238fe38e713..ff139ed0a61e 100644 --- a/arch/arm/mach-spear6xx/spear600_evb.c +++ b/arch/arm/mach-spear6xx/spear600_evb.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <asm/hardware/vic.h> | ||
14 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
15 | #include <asm/mach-types.h> | 16 | #include <asm/mach-types.h> |
16 | #include <mach/generic.h> | 17 | #include <mach/generic.h> |
@@ -46,6 +47,7 @@ MACHINE_START(SPEAR600, "ST-SPEAR600-EVB") | |||
46 | .atag_offset = 0x100, | 47 | .atag_offset = 0x100, |
47 | .map_io = spear6xx_map_io, | 48 | .map_io = spear6xx_map_io, |
48 | .init_irq = spear6xx_init_irq, | 49 | .init_irq = spear6xx_init_irq, |
50 | .handle_irq = vic_handle_irq, | ||
49 | .timer = &spear6xx_timer, | 51 | .timer = &spear6xx_timer, |
50 | .init_machine = spear600_evb_init, | 52 | .init_machine = spear600_evb_init, |
51 | MACHINE_END | 53 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index 91aff7cb8284..373652d76b90 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig | |||
@@ -2,11 +2,8 @@ if ARCH_TEGRA | |||
2 | 2 | ||
3 | comment "NVIDIA Tegra options" | 3 | comment "NVIDIA Tegra options" |
4 | 4 | ||
5 | choice | ||
6 | prompt "Select Tegra processor family for target system" | ||
7 | |||
8 | config ARCH_TEGRA_2x_SOC | 5 | config ARCH_TEGRA_2x_SOC |
9 | bool "Tegra 2 family" | 6 | bool "Enable support for Tegra20 family" |
10 | select CPU_V7 | 7 | select CPU_V7 |
11 | select ARM_GIC | 8 | select ARM_GIC |
12 | select ARCH_REQUIRE_GPIOLIB | 9 | select ARCH_REQUIRE_GPIOLIB |
@@ -17,22 +14,36 @@ config ARCH_TEGRA_2x_SOC | |||
17 | Support for NVIDIA Tegra AP20 and T20 processors, based on the | 14 | Support for NVIDIA Tegra AP20 and T20 processors, based on the |
18 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller | 15 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller |
19 | 16 | ||
20 | endchoice | 17 | config ARCH_TEGRA_3x_SOC |
18 | bool "Enable support for Tegra30 family" | ||
19 | select CPU_V7 | ||
20 | select ARM_GIC | ||
21 | select ARCH_REQUIRE_GPIOLIB | ||
22 | select USB_ARCH_HAS_EHCI if USB_SUPPORT | ||
23 | select USB_ULPI if USB_SUPPORT | ||
24 | select USB_ULPI_VIEWPORT if USB_SUPPORT | ||
25 | select USE_OF | ||
26 | help | ||
27 | Support for NVIDIA Tegra T30 processor family, based on the | ||
28 | ARM CortexA9MP CPU and the ARM PL310 L2 cache controller | ||
21 | 29 | ||
22 | config TEGRA_PCI | 30 | config TEGRA_PCI |
23 | bool "PCI Express support" | 31 | bool "PCI Express support" |
32 | depends on ARCH_TEGRA_2x_SOC | ||
24 | select PCI | 33 | select PCI |
25 | 34 | ||
26 | comment "Tegra board type" | 35 | comment "Tegra board type" |
27 | 36 | ||
28 | config MACH_HARMONY | 37 | config MACH_HARMONY |
29 | bool "Harmony board" | 38 | bool "Harmony board" |
39 | depends on ARCH_TEGRA_2x_SOC | ||
30 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC | 40 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC |
31 | help | 41 | help |
32 | Support for nVidia Harmony development platform | 42 | Support for nVidia Harmony development platform |
33 | 43 | ||
34 | config MACH_KAEN | 44 | config MACH_KAEN |
35 | bool "Kaen board" | 45 | bool "Kaen board" |
46 | depends on ARCH_TEGRA_2x_SOC | ||
36 | select MACH_SEABOARD | 47 | select MACH_SEABOARD |
37 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC | 48 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC |
38 | help | 49 | help |
@@ -40,11 +51,13 @@ config MACH_KAEN | |||
40 | 51 | ||
41 | config MACH_PAZ00 | 52 | config MACH_PAZ00 |
42 | bool "Paz00 board" | 53 | bool "Paz00 board" |
54 | depends on ARCH_TEGRA_2x_SOC | ||
43 | help | 55 | help |
44 | Support for the Toshiba AC100/Dynabook AZ netbook | 56 | Support for the Toshiba AC100/Dynabook AZ netbook |
45 | 57 | ||
46 | config MACH_SEABOARD | 58 | config MACH_SEABOARD |
47 | bool "Seaboard board" | 59 | bool "Seaboard board" |
60 | depends on ARCH_TEGRA_2x_SOC | ||
48 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC | 61 | select MACH_HAS_SND_SOC_TEGRA_WM8903 if SND_SOC |
49 | help | 62 | help |
50 | Support for nVidia Seaboard development platform. It will | 63 | Support for nVidia Seaboard development platform. It will |
@@ -52,25 +65,29 @@ config MACH_SEABOARD | |||
52 | have large similarities with the seaboard design. | 65 | have large similarities with the seaboard design. |
53 | 66 | ||
54 | config MACH_TEGRA_DT | 67 | config MACH_TEGRA_DT |
55 | bool "Generic Tegra board (FDT support)" | 68 | bool "Generic Tegra20 board (FDT support)" |
69 | depends on ARCH_TEGRA_2x_SOC | ||
56 | select USE_OF | 70 | select USE_OF |
57 | help | 71 | help |
58 | Support for generic nVidia Tegra boards using Flattened Device Tree | 72 | Support for generic NVIDIA Tegra20 boards using Flattened Device Tree |
59 | 73 | ||
60 | config MACH_TRIMSLICE | 74 | config MACH_TRIMSLICE |
61 | bool "TrimSlice board" | 75 | bool "TrimSlice board" |
76 | depends on ARCH_TEGRA_2x_SOC | ||
62 | select TEGRA_PCI | 77 | select TEGRA_PCI |
63 | help | 78 | help |
64 | Support for CompuLab TrimSlice platform | 79 | Support for CompuLab TrimSlice platform |
65 | 80 | ||
66 | config MACH_WARIO | 81 | config MACH_WARIO |
67 | bool "Wario board" | 82 | bool "Wario board" |
83 | depends on ARCH_TEGRA_2x_SOC | ||
68 | select MACH_SEABOARD | 84 | select MACH_SEABOARD |
69 | help | 85 | help |
70 | Support for the Wario version of Seaboard | 86 | Support for the Wario version of Seaboard |
71 | 87 | ||
72 | config MACH_VENTANA | 88 | config MACH_VENTANA |
73 | bool "Ventana board" | 89 | bool "Ventana board" |
90 | depends on ARCH_TEGRA_2x_SOC | ||
74 | select MACH_TEGRA_DT | 91 | select MACH_TEGRA_DT |
75 | help | 92 | help |
76 | Support for the nVidia Ventana development platform | 93 | Support for the nVidia Ventana development platform |
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 91a07e187208..d9bf7c19660e 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile | |||
@@ -5,12 +5,13 @@ obj-y += irq.o | |||
5 | obj-y += clock.o | 5 | obj-y += clock.o |
6 | obj-y += timer.o | 6 | obj-y += timer.o |
7 | obj-y += pinmux.o | 7 | obj-y += pinmux.o |
8 | obj-y += powergate.o | ||
9 | obj-y += fuse.o | 8 | obj-y += fuse.o |
10 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += clock.o | 9 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += powergate.o |
11 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_clocks.o | 10 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_clocks.o |
12 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o | 11 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o |
13 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += pinmux-t2-tables.o | 12 | obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += pinmux-tegra20-tables.o |
13 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += pinmux-tegra30-tables.o | ||
14 | obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += board-dt-tegra30.o | ||
14 | obj-$(CONFIG_SMP) += platsmp.o localtimer.o headsmp.o | 15 | obj-$(CONFIG_SMP) += platsmp.o localtimer.o headsmp.o |
15 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 16 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
16 | obj-$(CONFIG_TEGRA_SYSTEM_DMA) += dma.o | 17 | obj-$(CONFIG_TEGRA_SYSTEM_DMA) += dma.o |
@@ -18,20 +19,22 @@ obj-$(CONFIG_CPU_FREQ) += cpu-tegra.o | |||
18 | obj-$(CONFIG_TEGRA_PCI) += pcie.o | 19 | obj-$(CONFIG_TEGRA_PCI) += pcie.o |
19 | obj-$(CONFIG_USB_SUPPORT) += usb_phy.o | 20 | obj-$(CONFIG_USB_SUPPORT) += usb_phy.o |
20 | 21 | ||
21 | obj-${CONFIG_MACH_HARMONY} += board-harmony.o | 22 | obj-$(CONFIG_MACH_HARMONY) += board-harmony.o |
22 | obj-${CONFIG_MACH_HARMONY} += board-harmony-pinmux.o | 23 | obj-$(CONFIG_MACH_HARMONY) += board-harmony-pinmux.o |
23 | obj-${CONFIG_MACH_HARMONY} += board-harmony-pcie.o | 24 | obj-$(CONFIG_MACH_HARMONY) += board-harmony-pcie.o |
24 | obj-${CONFIG_MACH_HARMONY} += board-harmony-power.o | 25 | obj-$(CONFIG_MACH_HARMONY) += board-harmony-power.o |
25 | 26 | ||
26 | obj-${CONFIG_MACH_PAZ00} += board-paz00.o | 27 | obj-$(CONFIG_MACH_PAZ00) += board-paz00.o |
27 | obj-${CONFIG_MACH_PAZ00} += board-paz00-pinmux.o | 28 | obj-$(CONFIG_MACH_PAZ00) += board-paz00-pinmux.o |
28 | 29 | ||
29 | obj-${CONFIG_MACH_SEABOARD} += board-seaboard.o | 30 | obj-$(CONFIG_MACH_SEABOARD) += board-seaboard.o |
30 | obj-${CONFIG_MACH_SEABOARD} += board-seaboard-pinmux.o | 31 | obj-$(CONFIG_MACH_SEABOARD) += board-seaboard-pinmux.o |
31 | 32 | ||
32 | obj-${CONFIG_MACH_TEGRA_DT} += board-dt.o | 33 | obj-$(CONFIG_MACH_TEGRA_DT) += board-dt-tegra20.o |
33 | obj-${CONFIG_MACH_TEGRA_DT} += board-harmony-pinmux.o | 34 | obj-$(CONFIG_MACH_TEGRA_DT) += board-harmony-pinmux.o |
34 | obj-${CONFIG_MACH_TEGRA_DT} += board-seaboard-pinmux.o | 35 | obj-$(CONFIG_MACH_TEGRA_DT) += board-seaboard-pinmux.o |
36 | obj-$(CONFIG_MACH_TEGRA_DT) += board-paz00-pinmux.o | ||
37 | obj-$(CONFIG_MACH_TEGRA_DT) += board-trimslice-pinmux.o | ||
35 | 38 | ||
36 | obj-${CONFIG_MACH_TRIMSLICE} += board-trimslice.o | 39 | obj-$(CONFIG_MACH_TRIMSLICE) += board-trimslice.o |
37 | obj-${CONFIG_MACH_TRIMSLICE} += board-trimslice-pinmux.o | 40 | obj-$(CONFIG_MACH_TRIMSLICE) += board-trimslice-pinmux.o |
diff --git a/arch/arm/mach-tegra/Makefile.boot b/arch/arm/mach-tegra/Makefile.boot index bd12c9fb81e8..9a82094092d7 100644 --- a/arch/arm/mach-tegra/Makefile.boot +++ b/arch/arm/mach-tegra/Makefile.boot | |||
@@ -3,5 +3,8 @@ params_phys-$(CONFIG_ARCH_TEGRA_2x_SOC) := 0x00000100 | |||
3 | initrd_phys-$(CONFIG_ARCH_TEGRA_2x_SOC) := 0x00800000 | 3 | initrd_phys-$(CONFIG_ARCH_TEGRA_2x_SOC) := 0x00800000 |
4 | 4 | ||
5 | dtb-$(CONFIG_MACH_HARMONY) += tegra-harmony.dtb | 5 | dtb-$(CONFIG_MACH_HARMONY) += tegra-harmony.dtb |
6 | dtb-$(CONFIG_MACH_PAZ00) += tegra-paz00.dtb | ||
6 | dtb-$(CONFIG_MACH_SEABOARD) += tegra-seaboard.dtb | 7 | dtb-$(CONFIG_MACH_SEABOARD) += tegra-seaboard.dtb |
8 | dtb-$(CONFIG_MACH_TRIMSLICE) += tegra-trimslice.dtb | ||
7 | dtb-$(CONFIG_MACH_VENTANA) += tegra-ventana.dtb | 9 | dtb-$(CONFIG_MACH_VENTANA) += tegra-ventana.dtb |
10 | dtb-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra-cardhu.dtb | ||
diff --git a/arch/arm/mach-tegra/board-dt.c b/arch/arm/mach-tegra/board-dt-tegra20.c index 74743ad3d2d3..ddaa037be028 100644 --- a/arch/arm/mach-tegra/board-dt.c +++ b/arch/arm/mach-tegra/board-dt-tegra20.c | |||
@@ -32,10 +32,12 @@ | |||
32 | #include <linux/i2c.h> | 32 | #include <linux/i2c.h> |
33 | #include <linux/i2c-tegra.h> | 33 | #include <linux/i2c-tegra.h> |
34 | 34 | ||
35 | #include <asm/hardware/gic.h> | ||
35 | #include <asm/mach-types.h> | 36 | #include <asm/mach-types.h> |
36 | #include <asm/mach/arch.h> | 37 | #include <asm/mach/arch.h> |
37 | #include <asm/mach/time.h> | 38 | #include <asm/mach/time.h> |
38 | #include <asm/setup.h> | 39 | #include <asm/setup.h> |
40 | #include <asm/hardware/gic.h> | ||
39 | 41 | ||
40 | #include <mach/iomap.h> | 42 | #include <mach/iomap.h> |
41 | #include <mach/irqs.h> | 43 | #include <mach/irqs.h> |
@@ -46,7 +48,9 @@ | |||
46 | #include "devices.h" | 48 | #include "devices.h" |
47 | 49 | ||
48 | void harmony_pinmux_init(void); | 50 | void harmony_pinmux_init(void); |
51 | void paz00_pinmux_init(void); | ||
49 | void seaboard_pinmux_init(void); | 52 | void seaboard_pinmux_init(void); |
53 | void trimslice_pinmux_init(void); | ||
50 | void ventana_pinmux_init(void); | 54 | void ventana_pinmux_init(void); |
51 | 55 | ||
52 | struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { | 56 | struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { |
@@ -59,14 +63,28 @@ struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { | |||
59 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C3_BASE, "tegra-i2c.2", NULL), | 63 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C3_BASE, "tegra-i2c.2", NULL), |
60 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_DVC_BASE, "tegra-i2c.3", NULL), | 64 | OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_DVC_BASE, "tegra-i2c.3", NULL), |
61 | OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.0", NULL), | 65 | OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.0", NULL), |
62 | OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.1", NULL), | 66 | OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S2_BASE, "tegra-i2s.1", NULL), |
63 | OF_DEV_AUXDATA("nvidia,tegra20-das", TEGRA_APB_MISC_DAS_BASE, "tegra-das", NULL), | 67 | OF_DEV_AUXDATA("nvidia,tegra20-das", TEGRA_APB_MISC_DAS_BASE, "tegra-das", NULL), |
68 | OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB_BASE, "tegra-ehci.0", | ||
69 | &tegra_ehci1_device.dev.platform_data), | ||
70 | OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB2_BASE, "tegra-ehci.1", | ||
71 | &tegra_ehci2_device.dev.platform_data), | ||
72 | OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2", | ||
73 | &tegra_ehci3_device.dev.platform_data), | ||
64 | {} | 74 | {} |
65 | }; | 75 | }; |
66 | 76 | ||
67 | static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = { | 77 | static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = { |
68 | /* name parent rate enabled */ | 78 | /* name parent rate enabled */ |
69 | { "uartd", "pll_p", 216000000, true }, | 79 | { "uartd", "pll_p", 216000000, true }, |
80 | { "usbd", "clk_m", 12000000, false }, | ||
81 | { "usb2", "clk_m", 12000000, false }, | ||
82 | { "usb3", "clk_m", 12000000, false }, | ||
83 | { "pll_a", "pll_p_out1", 56448000, true }, | ||
84 | { "pll_a_out0", "pll_a", 11289600, true }, | ||
85 | { "cdev1", NULL, 0, true }, | ||
86 | { "i2s1", "pll_a_out0", 11289600, false}, | ||
87 | { "i2s2", "pll_a_out0", 11289600, false}, | ||
70 | { NULL, NULL, 0, 0}, | 88 | { NULL, NULL, 0, 0}, |
71 | }; | 89 | }; |
72 | 90 | ||
@@ -75,30 +93,21 @@ static struct of_device_id tegra_dt_match_table[] __initdata = { | |||
75 | {} | 93 | {} |
76 | }; | 94 | }; |
77 | 95 | ||
78 | static struct of_device_id tegra_dt_gic_match[] __initdata = { | ||
79 | { .compatible = "nvidia,tegra20-gic", }, | ||
80 | {} | ||
81 | }; | ||
82 | |||
83 | static struct { | 96 | static struct { |
84 | char *machine; | 97 | char *machine; |
85 | void (*init)(void); | 98 | void (*init)(void); |
86 | } pinmux_configs[] = { | 99 | } pinmux_configs[] = { |
100 | { "compulab,trimslice", trimslice_pinmux_init }, | ||
87 | { "nvidia,harmony", harmony_pinmux_init }, | 101 | { "nvidia,harmony", harmony_pinmux_init }, |
102 | { "compal,paz00", paz00_pinmux_init }, | ||
88 | { "nvidia,seaboard", seaboard_pinmux_init }, | 103 | { "nvidia,seaboard", seaboard_pinmux_init }, |
89 | { "nvidia,ventana", ventana_pinmux_init }, | 104 | { "nvidia,ventana", ventana_pinmux_init }, |
90 | }; | 105 | }; |
91 | 106 | ||
92 | static void __init tegra_dt_init(void) | 107 | static void __init tegra_dt_init(void) |
93 | { | 108 | { |
94 | struct device_node *node; | ||
95 | int i; | 109 | int i; |
96 | 110 | ||
97 | node = of_find_matching_node_by_address(NULL, tegra_dt_gic_match, | ||
98 | TEGRA_ARM_INT_DIST_BASE); | ||
99 | if (node) | ||
100 | irq_domain_add_simple(node, INT_GIC_BASE); | ||
101 | |||
102 | tegra_clk_init_from_table(tegra_dt_clk_init_table); | 111 | tegra_clk_init_from_table(tegra_dt_clk_init_table); |
103 | 112 | ||
104 | /* | 113 | /* |
@@ -119,18 +128,21 @@ static void __init tegra_dt_init(void) | |||
119 | "Unknown platform! Pinmuxing not initialized\n"); | 128 | "Unknown platform! Pinmuxing not initialized\n"); |
120 | } | 129 | } |
121 | 130 | ||
122 | static const char * tegra_dt_board_compat[] = { | 131 | static const char *tegra20_dt_board_compat[] = { |
132 | "compulab,trimslice", | ||
123 | "nvidia,harmony", | 133 | "nvidia,harmony", |
134 | "compal,paz00", | ||
124 | "nvidia,seaboard", | 135 | "nvidia,seaboard", |
125 | "nvidia,ventana", | 136 | "nvidia,ventana", |
126 | NULL | 137 | NULL |
127 | }; | 138 | }; |
128 | 139 | ||
129 | DT_MACHINE_START(TEGRA_DT, "nVidia Tegra (Flattened Device Tree)") | 140 | DT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)") |
130 | .map_io = tegra_map_common_io, | 141 | .map_io = tegra_map_common_io, |
131 | .init_early = tegra_init_early, | 142 | .init_early = tegra20_init_early, |
132 | .init_irq = tegra_init_irq, | 143 | .init_irq = tegra_dt_init_irq, |
144 | .handle_irq = gic_handle_irq, | ||
133 | .timer = &tegra_timer, | 145 | .timer = &tegra_timer, |
134 | .init_machine = tegra_dt_init, | 146 | .init_machine = tegra_dt_init, |
135 | .dt_compat = tegra_dt_board_compat, | 147 | .dt_compat = tegra20_dt_board_compat, |
136 | MACHINE_END | 148 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-dt-tegra30.c b/arch/arm/mach-tegra/board-dt-tegra30.c new file mode 100644 index 000000000000..3c197e2440b7 --- /dev/null +++ b/arch/arm/mach-tegra/board-dt-tegra30.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/board-dt-tegra30.c | ||
3 | * | ||
4 | * NVIDIA Tegra30 device tree board support | ||
5 | * | ||
6 | * Copyright (C) 2011 NVIDIA Corporation | ||
7 | * | ||
8 | * Derived from: | ||
9 | * | ||
10 | * arch/arm/mach-tegra/board-dt-tegra20.c | ||
11 | * | ||
12 | * Copyright (C) 2010 Secret Lab Technologies, Ltd. | ||
13 | * Copyright (C) 2010 Google, Inc. | ||
14 | * | ||
15 | * This software is licensed under the terms of the GNU General Public | ||
16 | * License version 2, as published by the Free Software Foundation, and | ||
17 | * may be copied, distributed, and modified under those terms. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | */ | ||
25 | |||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/of.h> | ||
28 | #include <linux/of_address.h> | ||
29 | #include <linux/of_fdt.h> | ||
30 | #include <linux/of_irq.h> | ||
31 | #include <linux/of_platform.h> | ||
32 | |||
33 | #include <asm/mach/arch.h> | ||
34 | #include <asm/hardware/gic.h> | ||
35 | |||
36 | #include "board.h" | ||
37 | |||
38 | static struct of_device_id tegra_dt_match_table[] __initdata = { | ||
39 | { .compatible = "simple-bus", }, | ||
40 | {} | ||
41 | }; | ||
42 | |||
43 | static void __init tegra30_dt_init(void) | ||
44 | { | ||
45 | of_platform_populate(NULL, tegra_dt_match_table, | ||
46 | NULL, NULL); | ||
47 | } | ||
48 | |||
49 | static const char *tegra30_dt_board_compat[] = { | ||
50 | "nvidia,cardhu", | ||
51 | NULL | ||
52 | }; | ||
53 | |||
54 | DT_MACHINE_START(TEGRA30_DT, "NVIDIA Tegra30 (Flattened Device Tree)") | ||
55 | .map_io = tegra_map_common_io, | ||
56 | .init_early = tegra30_init_early, | ||
57 | .init_irq = tegra_dt_init_irq, | ||
58 | .handle_irq = gic_handle_irq, | ||
59 | .timer = &tegra_timer, | ||
60 | .init_machine = tegra30_dt_init, | ||
61 | .restart = tegra_assert_system_reset, | ||
62 | .dt_compat = tegra30_dt_board_compat, | ||
63 | MACHINE_END | ||
diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c index 6db7d699ef1c..bd402d0d5d06 100644 --- a/arch/arm/mach-tegra/board-harmony-pcie.c +++ b/arch/arm/mach-tegra/board-harmony-pcie.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
24 | 24 | ||
25 | #include <mach/pinmux.h> | 25 | #include <mach/pinmux.h> |
26 | #include <mach/pinmux-tegra20.h> | ||
26 | #include "board.h" | 27 | #include "board.h" |
27 | #include "board-harmony.h" | 28 | #include "board-harmony.h" |
28 | 29 | ||
diff --git a/arch/arm/mach-tegra/board-harmony-pinmux.c b/arch/arm/mach-tegra/board-harmony-pinmux.c index 7a4a26d5174c..b8a2485e3cb9 100644 --- a/arch/arm/mach-tegra/board-harmony-pinmux.c +++ b/arch/arm/mach-tegra/board-harmony-pinmux.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | 20 | ||
21 | #include <mach/pinmux.h> | 21 | #include <mach/pinmux.h> |
22 | #include <mach/pinmux-tegra20.h> | ||
22 | 23 | ||
23 | #include "gpio-names.h" | 24 | #include "gpio-names.h" |
24 | #include "board-harmony.h" | 25 | #include "board-harmony.h" |
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index f0bdc5e3fe52..d60a0d45f2f7 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/time.h> | 33 | #include <asm/mach/time.h> |
34 | #include <asm/hardware/gic.h> | ||
34 | #include <asm/setup.h> | 35 | #include <asm/setup.h> |
35 | 36 | ||
36 | #include <mach/tegra_wm8903_pdata.h> | 37 | #include <mach/tegra_wm8903_pdata.h> |
@@ -185,8 +186,9 @@ MACHINE_START(HARMONY, "harmony") | |||
185 | .atag_offset = 0x100, | 186 | .atag_offset = 0x100, |
186 | .fixup = tegra_harmony_fixup, | 187 | .fixup = tegra_harmony_fixup, |
187 | .map_io = tegra_map_common_io, | 188 | .map_io = tegra_map_common_io, |
188 | .init_early = tegra_init_early, | 189 | .init_early = tegra20_init_early, |
189 | .init_irq = tegra_init_irq, | 190 | .init_irq = tegra_init_irq, |
191 | .handle_irq = gic_handle_irq, | ||
190 | .timer = &tegra_timer, | 192 | .timer = &tegra_timer, |
191 | .init_machine = tegra_harmony_init, | 193 | .init_machine = tegra_harmony_init, |
192 | MACHINE_END | 194 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-paz00-pinmux.c b/arch/arm/mach-tegra/board-paz00-pinmux.c index be30e215f4b7..bc1fe58c26fb 100644 --- a/arch/arm/mach-tegra/board-paz00-pinmux.c +++ b/arch/arm/mach-tegra/board-paz00-pinmux.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | 20 | ||
21 | #include <mach/pinmux.h> | 21 | #include <mach/pinmux.h> |
22 | #include <mach/pinmux-tegra20.h> | ||
22 | 23 | ||
23 | #include "gpio-names.h" | 24 | #include "gpio-names.h" |
24 | #include "board-paz00.h" | 25 | #include "board-paz00.h" |
diff --git a/arch/arm/mach-tegra/board-paz00.c b/arch/arm/mach-tegra/board-paz00.c index 55c55ba89f1e..e68b40727e6d 100644 --- a/arch/arm/mach-tegra/board-paz00.c +++ b/arch/arm/mach-tegra/board-paz00.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/gpio.h> | 29 | #include <linux/gpio.h> |
30 | #include <linux/rfkill-gpio.h> | 30 | #include <linux/rfkill-gpio.h> |
31 | 31 | ||
32 | #include <asm/hardware/gic.h> | ||
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | #include <asm/mach/arch.h> | 34 | #include <asm/mach/arch.h> |
34 | #include <asm/mach/time.h> | 35 | #include <asm/mach/time.h> |
@@ -188,8 +189,9 @@ MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ") | |||
188 | .atag_offset = 0x100, | 189 | .atag_offset = 0x100, |
189 | .fixup = tegra_paz00_fixup, | 190 | .fixup = tegra_paz00_fixup, |
190 | .map_io = tegra_map_common_io, | 191 | .map_io = tegra_map_common_io, |
191 | .init_early = tegra_init_early, | 192 | .init_early = tegra20_init_early, |
192 | .init_irq = tegra_init_irq, | 193 | .init_irq = tegra_init_irq, |
194 | .handle_irq = gic_handle_irq, | ||
193 | .timer = &tegra_timer, | 195 | .timer = &tegra_timer, |
194 | .init_machine = tegra_paz00_init, | 196 | .init_machine = tegra_paz00_init, |
195 | MACHINE_END | 197 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-seaboard-pinmux.c b/arch/arm/mach-tegra/board-seaboard-pinmux.c index b1c2972f62fe..f6b9c01ef0db 100644 --- a/arch/arm/mach-tegra/board-seaboard-pinmux.c +++ b/arch/arm/mach-tegra/board-seaboard-pinmux.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | 20 | ||
21 | #include <mach/pinmux.h> | 21 | #include <mach/pinmux.h> |
22 | #include <mach/pinmux-t2.h> | 22 | #include <mach/pinmux-tegra20.h> |
23 | 23 | ||
24 | #include "gpio-names.h" | 24 | #include "gpio-names.h" |
25 | #include "board-seaboard.h" | 25 | #include "board-seaboard.h" |
diff --git a/arch/arm/mach-tegra/board-seaboard.c b/arch/arm/mach-tegra/board-seaboard.c index bf13ea355efc..b79f9ce9941c 100644 --- a/arch/arm/mach-tegra/board-seaboard.c +++ b/arch/arm/mach-tegra/board-seaboard.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <asm/mach-types.h> | 35 | #include <asm/mach-types.h> |
36 | #include <asm/mach/arch.h> | 36 | #include <asm/mach/arch.h> |
37 | #include <asm/hardware/gic.h> | ||
37 | 38 | ||
38 | #include "board.h" | 39 | #include "board.h" |
39 | #include "board-seaboard.h" | 40 | #include "board-seaboard.h" |
@@ -282,8 +283,9 @@ static void __init tegra_wario_init(void) | |||
282 | MACHINE_START(SEABOARD, "seaboard") | 283 | MACHINE_START(SEABOARD, "seaboard") |
283 | .atag_offset = 0x100, | 284 | .atag_offset = 0x100, |
284 | .map_io = tegra_map_common_io, | 285 | .map_io = tegra_map_common_io, |
285 | .init_early = tegra_init_early, | 286 | .init_early = tegra20_init_early, |
286 | .init_irq = tegra_init_irq, | 287 | .init_irq = tegra_init_irq, |
288 | .handle_irq = gic_handle_irq, | ||
287 | .timer = &tegra_timer, | 289 | .timer = &tegra_timer, |
288 | .init_machine = tegra_seaboard_init, | 290 | .init_machine = tegra_seaboard_init, |
289 | MACHINE_END | 291 | MACHINE_END |
@@ -291,8 +293,9 @@ MACHINE_END | |||
291 | MACHINE_START(KAEN, "kaen") | 293 | MACHINE_START(KAEN, "kaen") |
292 | .atag_offset = 0x100, | 294 | .atag_offset = 0x100, |
293 | .map_io = tegra_map_common_io, | 295 | .map_io = tegra_map_common_io, |
294 | .init_early = tegra_init_early, | 296 | .init_early = tegra20_init_early, |
295 | .init_irq = tegra_init_irq, | 297 | .init_irq = tegra_init_irq, |
298 | .handle_irq = gic_handle_irq, | ||
296 | .timer = &tegra_timer, | 299 | .timer = &tegra_timer, |
297 | .init_machine = tegra_kaen_init, | 300 | .init_machine = tegra_kaen_init, |
298 | MACHINE_END | 301 | MACHINE_END |
@@ -300,8 +303,9 @@ MACHINE_END | |||
300 | MACHINE_START(WARIO, "wario") | 303 | MACHINE_START(WARIO, "wario") |
301 | .atag_offset = 0x100, | 304 | .atag_offset = 0x100, |
302 | .map_io = tegra_map_common_io, | 305 | .map_io = tegra_map_common_io, |
303 | .init_early = tegra_init_early, | 306 | .init_early = tegra20_init_early, |
304 | .init_irq = tegra_init_irq, | 307 | .init_irq = tegra_init_irq, |
308 | .handle_irq = gic_handle_irq, | ||
305 | .timer = &tegra_timer, | 309 | .timer = &tegra_timer, |
306 | .init_machine = tegra_wario_init, | 310 | .init_machine = tegra_wario_init, |
307 | MACHINE_END | 311 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board-trimslice-pinmux.c b/arch/arm/mach-tegra/board-trimslice-pinmux.c index 7ab719d46da0..7331e15b73cc 100644 --- a/arch/arm/mach-tegra/board-trimslice-pinmux.c +++ b/arch/arm/mach-tegra/board-trimslice-pinmux.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/of.h> | 19 | #include <linux/of.h> |
20 | 20 | ||
21 | #include <mach/pinmux.h> | 21 | #include <mach/pinmux.h> |
22 | #include <mach/pinmux-tegra20.h> | ||
22 | 23 | ||
23 | #include "gpio-names.h" | 24 | #include "gpio-names.h" |
24 | #include "board-trimslice.h" | 25 | #include "board-trimslice.h" |
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c index 1a6617b7806f..4a197a20be93 100644 --- a/arch/arm/mach-tegra/board-trimslice.c +++ b/arch/arm/mach-tegra/board-trimslice.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/gpio.h> | 27 | #include <linux/gpio.h> |
28 | 28 | ||
29 | #include <asm/hardware/gic.h> | ||
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 31 | #include <asm/mach/arch.h> |
31 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
@@ -174,8 +175,9 @@ MACHINE_START(TRIMSLICE, "trimslice") | |||
174 | .atag_offset = 0x100, | 175 | .atag_offset = 0x100, |
175 | .fixup = tegra_trimslice_fixup, | 176 | .fixup = tegra_trimslice_fixup, |
176 | .map_io = tegra_map_common_io, | 177 | .map_io = tegra_map_common_io, |
177 | .init_early = tegra_init_early, | 178 | .init_early = tegra20_init_early, |
178 | .init_irq = tegra_init_irq, | 179 | .init_irq = tegra_init_irq, |
180 | .handle_irq = gic_handle_irq, | ||
179 | .timer = &tegra_timer, | 181 | .timer = &tegra_timer, |
180 | .init_machine = tegra_trimslice_init, | 182 | .init_machine = tegra_trimslice_init, |
181 | MACHINE_END | 183 | MACHINE_END |
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h index 1d14df7eb7de..75d1543d77c0 100644 --- a/arch/arm/mach-tegra/board.h +++ b/arch/arm/mach-tegra/board.h | |||
@@ -25,10 +25,11 @@ | |||
25 | 25 | ||
26 | void tegra_assert_system_reset(char mode, const char *cmd); | 26 | void tegra_assert_system_reset(char mode, const char *cmd); |
27 | 27 | ||
28 | void __init tegra_init_early(void); | 28 | void __init tegra20_init_early(void); |
29 | void __init tegra30_init_early(void); | ||
29 | void __init tegra_map_common_io(void); | 30 | void __init tegra_map_common_io(void); |
30 | void __init tegra_init_irq(void); | 31 | void __init tegra_init_irq(void); |
31 | void __init tegra_init_clock(void); | 32 | void __init tegra_dt_init_irq(void); |
32 | int __init tegra_pcie_init(bool init_port0, bool init_port1); | 33 | int __init tegra_pcie_init(bool init_port0, bool init_port1); |
33 | 34 | ||
34 | extern struct sys_timer tegra_timer; | 35 | extern struct sys_timer tegra_timer; |
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c index f8d41ffc0ca9..8337068a4abe 100644 --- a/arch/arm/mach-tegra/clock.c +++ b/arch/arm/mach-tegra/clock.c | |||
@@ -387,35 +387,18 @@ EXPORT_SYMBOL(tegra_clk_init_from_table); | |||
387 | 387 | ||
388 | void tegra_periph_reset_deassert(struct clk *c) | 388 | void tegra_periph_reset_deassert(struct clk *c) |
389 | { | 389 | { |
390 | tegra2_periph_reset_deassert(c); | 390 | BUG_ON(!c->ops->reset); |
391 | c->ops->reset(c, false); | ||
391 | } | 392 | } |
392 | EXPORT_SYMBOL(tegra_periph_reset_deassert); | 393 | EXPORT_SYMBOL(tegra_periph_reset_deassert); |
393 | 394 | ||
394 | void tegra_periph_reset_assert(struct clk *c) | 395 | void tegra_periph_reset_assert(struct clk *c) |
395 | { | 396 | { |
396 | tegra2_periph_reset_assert(c); | 397 | BUG_ON(!c->ops->reset); |
398 | c->ops->reset(c, true); | ||
397 | } | 399 | } |
398 | EXPORT_SYMBOL(tegra_periph_reset_assert); | 400 | EXPORT_SYMBOL(tegra_periph_reset_assert); |
399 | 401 | ||
400 | void __init tegra_init_clock(void) | ||
401 | { | ||
402 | tegra2_init_clocks(); | ||
403 | } | ||
404 | |||
405 | /* | ||
406 | * The SDMMC controllers have extra bits in the clock source register that | ||
407 | * adjust the delay between the clock and data to compenstate for delays | ||
408 | * on the PCB. | ||
409 | */ | ||
410 | void tegra_sdmmc_tap_delay(struct clk *c, int delay) | ||
411 | { | ||
412 | unsigned long flags; | ||
413 | |||
414 | spin_lock_irqsave(&c->spinlock, flags); | ||
415 | tegra2_sdmmc_tap_delay(c, delay); | ||
416 | spin_unlock_irqrestore(&c->spinlock, flags); | ||
417 | } | ||
418 | |||
419 | #ifdef CONFIG_DEBUG_FS | 402 | #ifdef CONFIG_DEBUG_FS |
420 | 403 | ||
421 | static int __clk_lock_all_spinlocks(void) | 404 | static int __clk_lock_all_spinlocks(void) |
diff --git a/arch/arm/mach-tegra/clock.h b/arch/arm/mach-tegra/clock.h index 688316abc64e..5c44106616c5 100644 --- a/arch/arm/mach-tegra/clock.h +++ b/arch/arm/mach-tegra/clock.h | |||
@@ -146,15 +146,11 @@ struct tegra_clk_init_table { | |||
146 | }; | 146 | }; |
147 | 147 | ||
148 | void tegra2_init_clocks(void); | 148 | void tegra2_init_clocks(void); |
149 | void tegra2_periph_reset_deassert(struct clk *c); | ||
150 | void tegra2_periph_reset_assert(struct clk *c); | ||
151 | void clk_init(struct clk *clk); | 149 | void clk_init(struct clk *clk); |
152 | struct clk *tegra_get_clock_by_name(const char *name); | 150 | struct clk *tegra_get_clock_by_name(const char *name); |
153 | unsigned long clk_measure_input_freq(void); | ||
154 | int clk_reparent(struct clk *c, struct clk *parent); | 151 | int clk_reparent(struct clk *c, struct clk *parent); |
155 | void tegra_clk_init_from_table(struct tegra_clk_init_table *table); | 152 | void tegra_clk_init_from_table(struct tegra_clk_init_table *table); |
156 | unsigned long clk_get_rate_locked(struct clk *c); | 153 | unsigned long clk_get_rate_locked(struct clk *c); |
157 | int clk_set_rate_locked(struct clk *c, unsigned long rate); | 154 | int clk_set_rate_locked(struct clk *c, unsigned long rate); |
158 | void tegra2_sdmmc_tap_delay(struct clk *c, int delay); | ||
159 | 155 | ||
160 | #endif | 156 | #endif |
diff --git a/arch/arm/mach-tegra/common.c b/arch/arm/mach-tegra/common.c index 690b888be506..72b666bd3043 100644 --- a/arch/arm/mach-tegra/common.c +++ b/arch/arm/mach-tegra/common.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/mach-tegra/board-harmony.c | 2 | * arch/arm/mach-tegra/common.c |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
5 | * | 5 | * |
@@ -21,8 +21,10 @@ | |||
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
24 | #include <linux/of_irq.h> | ||
24 | 25 | ||
25 | #include <asm/hardware/cache-l2x0.h> | 26 | #include <asm/hardware/cache-l2x0.h> |
27 | #include <asm/hardware/gic.h> | ||
26 | 28 | ||
27 | #include <mach/iomap.h> | 29 | #include <mach/iomap.h> |
28 | #include <mach/system.h> | 30 | #include <mach/system.h> |
@@ -33,18 +35,31 @@ | |||
33 | 35 | ||
34 | void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset; | 36 | void (*arch_reset)(char mode, const char *cmd) = tegra_assert_system_reset; |
35 | 37 | ||
38 | #ifdef CONFIG_OF | ||
39 | static const struct of_device_id tegra_dt_irq_match[] __initconst = { | ||
40 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init }, | ||
41 | { } | ||
42 | }; | ||
43 | |||
44 | void __init tegra_dt_init_irq(void) | ||
45 | { | ||
46 | tegra_init_irq(); | ||
47 | of_irq_init(tegra_dt_irq_match); | ||
48 | } | ||
49 | #endif | ||
50 | |||
36 | void tegra_assert_system_reset(char mode, const char *cmd) | 51 | void tegra_assert_system_reset(char mode, const char *cmd) |
37 | { | 52 | { |
38 | void __iomem *reset = IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x04); | 53 | void __iomem *reset = IO_ADDRESS(TEGRA_PMC_BASE + 0); |
39 | u32 reg; | 54 | u32 reg; |
40 | 55 | ||
41 | /* use *_related to avoid spinlock since caches are off */ | ||
42 | reg = readl_relaxed(reset); | 56 | reg = readl_relaxed(reset); |
43 | reg |= 0x04; | 57 | reg |= 0x10; |
44 | writel_relaxed(reg, reset); | 58 | writel_relaxed(reg, reset); |
45 | } | 59 | } |
46 | 60 | ||
47 | static __initdata struct tegra_clk_init_table common_clk_init_table[] = { | 61 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC |
62 | static __initdata struct tegra_clk_init_table tegra20_clk_init_table[] = { | ||
48 | /* name parent rate enabled */ | 63 | /* name parent rate enabled */ |
49 | { "clk_m", NULL, 0, true }, | 64 | { "clk_m", NULL, 0, true }, |
50 | { "pll_p", "clk_m", 216000000, true }, | 65 | { "pll_p", "clk_m", 216000000, true }, |
@@ -60,24 +75,38 @@ static __initdata struct tegra_clk_init_table common_clk_init_table[] = { | |||
60 | { "cpu", NULL, 0, true }, | 75 | { "cpu", NULL, 0, true }, |
61 | { NULL, NULL, 0, 0}, | 76 | { NULL, NULL, 0, 0}, |
62 | }; | 77 | }; |
78 | #endif | ||
63 | 79 | ||
64 | static void __init tegra_init_cache(void) | 80 | static void __init tegra_init_cache(u32 tag_latency, u32 data_latency) |
65 | { | 81 | { |
66 | #ifdef CONFIG_CACHE_L2X0 | 82 | #ifdef CONFIG_CACHE_L2X0 |
67 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | 83 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; |
84 | u32 aux_ctrl, cache_type; | ||
85 | |||
86 | writel_relaxed(tag_latency, p + L2X0_TAG_LATENCY_CTRL); | ||
87 | writel_relaxed(data_latency, p + L2X0_DATA_LATENCY_CTRL); | ||
68 | 88 | ||
69 | writel_relaxed(0x331, p + L2X0_TAG_LATENCY_CTRL); | 89 | cache_type = readl(p + L2X0_CACHE_TYPE); |
70 | writel_relaxed(0x441, p + L2X0_DATA_LATENCY_CTRL); | 90 | aux_ctrl = (cache_type & 0x700) << (17-8); |
91 | aux_ctrl |= 0x6C000001; | ||
71 | 92 | ||
72 | l2x0_init(p, 0x6C080001, 0x8200c3fe); | 93 | l2x0_init(p, aux_ctrl, 0x8200c3fe); |
73 | #endif | 94 | #endif |
74 | 95 | ||
75 | } | 96 | } |
76 | 97 | ||
77 | void __init tegra_init_early(void) | 98 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC |
99 | void __init tegra20_init_early(void) | ||
78 | { | 100 | { |
79 | tegra_init_fuse(); | 101 | tegra_init_fuse(); |
80 | tegra_init_clock(); | 102 | tegra2_init_clocks(); |
81 | tegra_clk_init_from_table(common_clk_init_table); | 103 | tegra_clk_init_from_table(tegra20_clk_init_table); |
82 | tegra_init_cache(); | 104 | tegra_init_cache(0x331, 0x441); |
105 | } | ||
106 | #endif | ||
107 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | ||
108 | void __init tegra30_init_early(void) | ||
109 | { | ||
110 | tegra_init_cache(0x441, 0x551); | ||
83 | } | 111 | } |
112 | #endif | ||
diff --git a/arch/arm/mach-tegra/include/mach/clk.h b/arch/arm/mach-tegra/include/mach/clk.h index c8baf8f80d23..fc3ecb66de08 100644 --- a/arch/arm/mach-tegra/include/mach/clk.h +++ b/arch/arm/mach-tegra/include/mach/clk.h | |||
@@ -26,6 +26,6 @@ void tegra_periph_reset_deassert(struct clk *c); | |||
26 | void tegra_periph_reset_assert(struct clk *c); | 26 | void tegra_periph_reset_assert(struct clk *c); |
27 | 27 | ||
28 | unsigned long clk_get_rate_all_locked(struct clk *c); | 28 | unsigned long clk_get_rate_all_locked(struct clk *c); |
29 | void tegra_sdmmc_tap_delay(struct clk *c, int delay); | 29 | void tegra2_sdmmc_tap_delay(struct clk *c, int delay); |
30 | 30 | ||
31 | #endif | 31 | #endif |
diff --git a/arch/arm/mach-tegra/include/mach/entry-macro.S b/arch/arm/mach-tegra/include/mach/entry-macro.S index dd165c53889d..ac11262149c7 100644 --- a/arch/arm/mach-tegra/include/mach/entry-macro.S +++ b/arch/arm/mach-tegra/include/mach/entry-macro.S | |||
@@ -12,30 +12,15 @@ | |||
12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | #include <mach/iomap.h> | ||
16 | #include <mach/io.h> | ||
17 | |||
18 | #if defined(CONFIG_ARM_GIC) | ||
19 | #define HAVE_GET_IRQNR_PREAMBLE | ||
20 | #include <asm/hardware/entry-macro-gic.S> | ||
21 | |||
22 | /* Uses the GIC interrupt controller built into the cpu */ | ||
23 | #define ICTRL_BASE (IO_CPU_VIRT + 0x100) | ||
24 | 15 | ||
25 | .macro disable_fiq | 16 | .macro disable_fiq |
26 | .endm | 17 | .endm |
27 | 18 | ||
28 | .macro get_irqnr_preamble, base, tmp | 19 | .macro arch_ret_to_user, tmp1, tmp2 |
29 | movw \base, #(ICTRL_BASE & 0x0000ffff) | ||
30 | movt \base, #((ICTRL_BASE & 0xffff0000) >> 16) | ||
31 | .endm | 20 | .endm |
32 | 21 | ||
33 | .macro arch_ret_to_user, tmp1, tmp2 | 22 | #if !defined(CONFIG_ARM_GIC) |
34 | .endm | ||
35 | #else | ||
36 | /* legacy interrupt controller for AP16 */ | 23 | /* legacy interrupt controller for AP16 */ |
37 | .macro disable_fiq | ||
38 | .endm | ||
39 | 24 | ||
40 | .macro get_irqnr_preamble, base, tmp | 25 | .macro get_irqnr_preamble, base, tmp |
41 | @ enable imprecise aborts | 26 | @ enable imprecise aborts |
@@ -46,9 +31,6 @@ | |||
46 | orr \base, #0x0000f000 | 31 | orr \base, #0x0000f000 |
47 | .endm | 32 | .endm |
48 | 33 | ||
49 | .macro arch_ret_to_user, tmp1, tmp2 | ||
50 | .endm | ||
51 | |||
52 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | 34 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp |
53 | ldr \irqnr, [\base, #0x20] @ EVT_IRQ_STS | 35 | ldr \irqnr, [\base, #0x20] @ EVT_IRQ_STS |
54 | cmp \irqnr, #0x80 | 36 | cmp \irqnr, #0x80 |
diff --git a/arch/arm/mach-tegra/include/mach/io.h b/arch/arm/mach-tegra/include/mach/io.h index 35a011fbc42d..f15defffb5d2 100644 --- a/arch/arm/mach-tegra/include/mach/io.h +++ b/arch/arm/mach-tegra/include/mach/io.h | |||
@@ -71,12 +71,6 @@ | |||
71 | 71 | ||
72 | #ifndef __ASSEMBLER__ | 72 | #ifndef __ASSEMBLER__ |
73 | 73 | ||
74 | #define __arch_ioremap tegra_ioremap | ||
75 | #define __arch_iounmap tegra_iounmap | ||
76 | |||
77 | void __iomem *tegra_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
78 | void tegra_iounmap(volatile void __iomem *addr); | ||
79 | |||
80 | #define IO_ADDRESS(n) (IO_TO_VIRT(n)) | 74 | #define IO_ADDRESS(n) (IO_TO_VIRT(n)) |
81 | 75 | ||
82 | #ifdef CONFIG_TEGRA_PCI | 76 | #ifdef CONFIG_TEGRA_PCI |
diff --git a/arch/arm/mach-tegra/include/mach/irqs.h b/arch/arm/mach-tegra/include/mach/irqs.h index 73265af4dda3..a2146cd6867d 100644 --- a/arch/arm/mach-tegra/include/mach/irqs.h +++ b/arch/arm/mach-tegra/include/mach/irqs.h | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #define IRQ_LOCALTIMER 29 | 26 | #define IRQ_LOCALTIMER 29 |
27 | 27 | ||
28 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC | ||
29 | /* Primary Interrupt Controller */ | 28 | /* Primary Interrupt Controller */ |
30 | #define INT_PRI_BASE (INT_GIC_BASE + 32) | 29 | #define INT_PRI_BASE (INT_GIC_BASE + 32) |
31 | #define INT_TMR1 (INT_PRI_BASE + 0) | 30 | #define INT_TMR1 (INT_PRI_BASE + 0) |
@@ -178,6 +177,5 @@ | |||
178 | #define NR_BOARD_IRQS 32 | 177 | #define NR_BOARD_IRQS 32 |
179 | 178 | ||
180 | #define NR_IRQS (INT_BOARD_BASE + NR_BOARD_IRQS) | 179 | #define NR_IRQS (INT_BOARD_BASE + NR_BOARD_IRQS) |
181 | #endif | ||
182 | 180 | ||
183 | #endif | 181 | #endif |
diff --git a/arch/arm/mach-tegra/include/mach/pinmux-t2.h b/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h index 4c2626347263..6a40c1dbab17 100644 --- a/arch/arm/mach-tegra/include/mach/pinmux-t2.h +++ b/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-tegra/include/mach/pinmux-t2.h | 2 | * linux/arch/arm/mach-tegra/include/mach/pinmux-tegra20.h |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
5 | * | 5 | * |
@@ -14,8 +14,8 @@ | |||
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #ifndef __MACH_TEGRA_PINMUX_T2_H | 17 | #ifndef __MACH_TEGRA_PINMUX_TEGRA20_H |
18 | #define __MACH_TEGRA_PINMUX_T2_H | 18 | #define __MACH_TEGRA_PINMUX_TEGRA20_H |
19 | 19 | ||
20 | enum tegra_pingroup { | 20 | enum tegra_pingroup { |
21 | TEGRA_PINGROUP_ATA = 0, | 21 | TEGRA_PINGROUP_ATA = 0, |
diff --git a/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h b/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h new file mode 100644 index 000000000000..c1aee3eb2df1 --- /dev/null +++ b/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h | |||
@@ -0,0 +1,320 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-tegra/include/mach/pinmux-tegra30.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Google, Inc. | ||
5 | * Copyright (C) 2010,2011 Nvidia, Inc. | ||
6 | * | ||
7 | * This software is licensed under the terms of the GNU General Public | ||
8 | * License version 2, as published by the Free Software Foundation, and | ||
9 | * may be copied, distributed, and modified under those terms. | ||
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 | */ | ||
17 | |||
18 | #ifndef __MACH_TEGRA_PINMUX_TEGRA30_H | ||
19 | #define __MACH_TEGRA_PINMUX_TEGRA30_H | ||
20 | |||
21 | enum tegra_pingroup { | ||
22 | TEGRA_PINGROUP_ULPI_DATA0 = 0, | ||
23 | TEGRA_PINGROUP_ULPI_DATA1, | ||
24 | TEGRA_PINGROUP_ULPI_DATA2, | ||
25 | TEGRA_PINGROUP_ULPI_DATA3, | ||
26 | TEGRA_PINGROUP_ULPI_DATA4, | ||
27 | TEGRA_PINGROUP_ULPI_DATA5, | ||
28 | TEGRA_PINGROUP_ULPI_DATA6, | ||
29 | TEGRA_PINGROUP_ULPI_DATA7, | ||
30 | TEGRA_PINGROUP_ULPI_CLK, | ||
31 | TEGRA_PINGROUP_ULPI_DIR, | ||
32 | TEGRA_PINGROUP_ULPI_NXT, | ||
33 | TEGRA_PINGROUP_ULPI_STP, | ||
34 | TEGRA_PINGROUP_DAP3_FS, | ||
35 | TEGRA_PINGROUP_DAP3_DIN, | ||
36 | TEGRA_PINGROUP_DAP3_DOUT, | ||
37 | TEGRA_PINGROUP_DAP3_SCLK, | ||
38 | TEGRA_PINGROUP_GPIO_PV0, | ||
39 | TEGRA_PINGROUP_GPIO_PV1, | ||
40 | TEGRA_PINGROUP_SDMMC1_CLK, | ||
41 | TEGRA_PINGROUP_SDMMC1_CMD, | ||
42 | TEGRA_PINGROUP_SDMMC1_DAT3, | ||
43 | TEGRA_PINGROUP_SDMMC1_DAT2, | ||
44 | TEGRA_PINGROUP_SDMMC1_DAT1, | ||
45 | TEGRA_PINGROUP_SDMMC1_DAT0, | ||
46 | TEGRA_PINGROUP_GPIO_PV2, | ||
47 | TEGRA_PINGROUP_GPIO_PV3, | ||
48 | TEGRA_PINGROUP_CLK2_OUT, | ||
49 | TEGRA_PINGROUP_CLK2_REQ, | ||
50 | TEGRA_PINGROUP_LCD_PWR1, | ||
51 | TEGRA_PINGROUP_LCD_PWR2, | ||
52 | TEGRA_PINGROUP_LCD_SDIN, | ||
53 | TEGRA_PINGROUP_LCD_SDOUT, | ||
54 | TEGRA_PINGROUP_LCD_WR_N, | ||
55 | TEGRA_PINGROUP_LCD_CS0_N, | ||
56 | TEGRA_PINGROUP_LCD_DC0, | ||
57 | TEGRA_PINGROUP_LCD_SCK, | ||
58 | TEGRA_PINGROUP_LCD_PWR0, | ||
59 | TEGRA_PINGROUP_LCD_PCLK, | ||
60 | TEGRA_PINGROUP_LCD_DE, | ||
61 | TEGRA_PINGROUP_LCD_HSYNC, | ||
62 | TEGRA_PINGROUP_LCD_VSYNC, | ||
63 | TEGRA_PINGROUP_LCD_D0, | ||
64 | TEGRA_PINGROUP_LCD_D1, | ||
65 | TEGRA_PINGROUP_LCD_D2, | ||
66 | TEGRA_PINGROUP_LCD_D3, | ||
67 | TEGRA_PINGROUP_LCD_D4, | ||
68 | TEGRA_PINGROUP_LCD_D5, | ||
69 | TEGRA_PINGROUP_LCD_D6, | ||
70 | TEGRA_PINGROUP_LCD_D7, | ||
71 | TEGRA_PINGROUP_LCD_D8, | ||
72 | TEGRA_PINGROUP_LCD_D9, | ||
73 | TEGRA_PINGROUP_LCD_D10, | ||
74 | TEGRA_PINGROUP_LCD_D11, | ||
75 | TEGRA_PINGROUP_LCD_D12, | ||
76 | TEGRA_PINGROUP_LCD_D13, | ||
77 | TEGRA_PINGROUP_LCD_D14, | ||
78 | TEGRA_PINGROUP_LCD_D15, | ||
79 | TEGRA_PINGROUP_LCD_D16, | ||
80 | TEGRA_PINGROUP_LCD_D17, | ||
81 | TEGRA_PINGROUP_LCD_D18, | ||
82 | TEGRA_PINGROUP_LCD_D19, | ||
83 | TEGRA_PINGROUP_LCD_D20, | ||
84 | TEGRA_PINGROUP_LCD_D21, | ||
85 | TEGRA_PINGROUP_LCD_D22, | ||
86 | TEGRA_PINGROUP_LCD_D23, | ||
87 | TEGRA_PINGROUP_LCD_CS1_N, | ||
88 | TEGRA_PINGROUP_LCD_M1, | ||
89 | TEGRA_PINGROUP_LCD_DC1, | ||
90 | TEGRA_PINGROUP_HDMI_INT, | ||
91 | TEGRA_PINGROUP_DDC_SCL, | ||
92 | TEGRA_PINGROUP_DDC_SDA, | ||
93 | TEGRA_PINGROUP_CRT_HSYNC, | ||
94 | TEGRA_PINGROUP_CRT_VSYNC, | ||
95 | TEGRA_PINGROUP_VI_D0, | ||
96 | TEGRA_PINGROUP_VI_D1, | ||
97 | TEGRA_PINGROUP_VI_D2, | ||
98 | TEGRA_PINGROUP_VI_D3, | ||
99 | TEGRA_PINGROUP_VI_D4, | ||
100 | TEGRA_PINGROUP_VI_D5, | ||
101 | TEGRA_PINGROUP_VI_D6, | ||
102 | TEGRA_PINGROUP_VI_D7, | ||
103 | TEGRA_PINGROUP_VI_D8, | ||
104 | TEGRA_PINGROUP_VI_D9, | ||
105 | TEGRA_PINGROUP_VI_D10, | ||
106 | TEGRA_PINGROUP_VI_D11, | ||
107 | TEGRA_PINGROUP_VI_PCLK, | ||
108 | TEGRA_PINGROUP_VI_MCLK, | ||
109 | TEGRA_PINGROUP_VI_VSYNC, | ||
110 | TEGRA_PINGROUP_VI_HSYNC, | ||
111 | TEGRA_PINGROUP_UART2_RXD, | ||
112 | TEGRA_PINGROUP_UART2_TXD, | ||
113 | TEGRA_PINGROUP_UART2_RTS_N, | ||
114 | TEGRA_PINGROUP_UART2_CTS_N, | ||
115 | TEGRA_PINGROUP_UART3_TXD, | ||
116 | TEGRA_PINGROUP_UART3_RXD, | ||
117 | TEGRA_PINGROUP_UART3_CTS_N, | ||
118 | TEGRA_PINGROUP_UART3_RTS_N, | ||
119 | TEGRA_PINGROUP_GPIO_PU0, | ||
120 | TEGRA_PINGROUP_GPIO_PU1, | ||
121 | TEGRA_PINGROUP_GPIO_PU2, | ||
122 | TEGRA_PINGROUP_GPIO_PU3, | ||
123 | TEGRA_PINGROUP_GPIO_PU4, | ||
124 | TEGRA_PINGROUP_GPIO_PU5, | ||
125 | TEGRA_PINGROUP_GPIO_PU6, | ||
126 | TEGRA_PINGROUP_GEN1_I2C_SDA, | ||
127 | TEGRA_PINGROUP_GEN1_I2C_SCL, | ||
128 | TEGRA_PINGROUP_DAP4_FS, | ||
129 | TEGRA_PINGROUP_DAP4_DIN, | ||
130 | TEGRA_PINGROUP_DAP4_DOUT, | ||
131 | TEGRA_PINGROUP_DAP4_SCLK, | ||
132 | TEGRA_PINGROUP_CLK3_OUT, | ||
133 | TEGRA_PINGROUP_CLK3_REQ, | ||
134 | TEGRA_PINGROUP_GMI_WP_N, | ||
135 | TEGRA_PINGROUP_GMI_IORDY, | ||
136 | TEGRA_PINGROUP_GMI_WAIT, | ||
137 | TEGRA_PINGROUP_GMI_ADV_N, | ||
138 | TEGRA_PINGROUP_GMI_CLK, | ||
139 | TEGRA_PINGROUP_GMI_CS0_N, | ||
140 | TEGRA_PINGROUP_GMI_CS1_N, | ||
141 | TEGRA_PINGROUP_GMI_CS2_N, | ||
142 | TEGRA_PINGROUP_GMI_CS3_N, | ||
143 | TEGRA_PINGROUP_GMI_CS4_N, | ||
144 | TEGRA_PINGROUP_GMI_CS6_N, | ||
145 | TEGRA_PINGROUP_GMI_CS7_N, | ||
146 | TEGRA_PINGROUP_GMI_AD0, | ||
147 | TEGRA_PINGROUP_GMI_AD1, | ||
148 | TEGRA_PINGROUP_GMI_AD2, | ||
149 | TEGRA_PINGROUP_GMI_AD3, | ||
150 | TEGRA_PINGROUP_GMI_AD4, | ||
151 | TEGRA_PINGROUP_GMI_AD5, | ||
152 | TEGRA_PINGROUP_GMI_AD6, | ||
153 | TEGRA_PINGROUP_GMI_AD7, | ||
154 | TEGRA_PINGROUP_GMI_AD8, | ||
155 | TEGRA_PINGROUP_GMI_AD9, | ||
156 | TEGRA_PINGROUP_GMI_AD10, | ||
157 | TEGRA_PINGROUP_GMI_AD11, | ||
158 | TEGRA_PINGROUP_GMI_AD12, | ||
159 | TEGRA_PINGROUP_GMI_AD13, | ||
160 | TEGRA_PINGROUP_GMI_AD14, | ||
161 | TEGRA_PINGROUP_GMI_AD15, | ||
162 | TEGRA_PINGROUP_GMI_A16, | ||
163 | TEGRA_PINGROUP_GMI_A17, | ||
164 | TEGRA_PINGROUP_GMI_A18, | ||
165 | TEGRA_PINGROUP_GMI_A19, | ||
166 | TEGRA_PINGROUP_GMI_WR_N, | ||
167 | TEGRA_PINGROUP_GMI_OE_N, | ||
168 | TEGRA_PINGROUP_GMI_DQS, | ||
169 | TEGRA_PINGROUP_GMI_RST_N, | ||
170 | TEGRA_PINGROUP_GEN2_I2C_SCL, | ||
171 | TEGRA_PINGROUP_GEN2_I2C_SDA, | ||
172 | TEGRA_PINGROUP_SDMMC4_CLK, | ||
173 | TEGRA_PINGROUP_SDMMC4_CMD, | ||
174 | TEGRA_PINGROUP_SDMMC4_DAT0, | ||
175 | TEGRA_PINGROUP_SDMMC4_DAT1, | ||
176 | TEGRA_PINGROUP_SDMMC4_DAT2, | ||
177 | TEGRA_PINGROUP_SDMMC4_DAT3, | ||
178 | TEGRA_PINGROUP_SDMMC4_DAT4, | ||
179 | TEGRA_PINGROUP_SDMMC4_DAT5, | ||
180 | TEGRA_PINGROUP_SDMMC4_DAT6, | ||
181 | TEGRA_PINGROUP_SDMMC4_DAT7, | ||
182 | TEGRA_PINGROUP_SDMMC4_RST_N, | ||
183 | TEGRA_PINGROUP_CAM_MCLK, | ||
184 | TEGRA_PINGROUP_GPIO_PCC1, | ||
185 | TEGRA_PINGROUP_GPIO_PBB0, | ||
186 | TEGRA_PINGROUP_CAM_I2C_SCL, | ||
187 | TEGRA_PINGROUP_CAM_I2C_SDA, | ||
188 | TEGRA_PINGROUP_GPIO_PBB3, | ||
189 | TEGRA_PINGROUP_GPIO_PBB4, | ||
190 | TEGRA_PINGROUP_GPIO_PBB5, | ||
191 | TEGRA_PINGROUP_GPIO_PBB6, | ||
192 | TEGRA_PINGROUP_GPIO_PBB7, | ||
193 | TEGRA_PINGROUP_GPIO_PCC2, | ||
194 | TEGRA_PINGROUP_JTAG_RTCK, | ||
195 | TEGRA_PINGROUP_PWR_I2C_SCL, | ||
196 | TEGRA_PINGROUP_PWR_I2C_SDA, | ||
197 | TEGRA_PINGROUP_KB_ROW0, | ||
198 | TEGRA_PINGROUP_KB_ROW1, | ||
199 | TEGRA_PINGROUP_KB_ROW2, | ||
200 | TEGRA_PINGROUP_KB_ROW3, | ||
201 | TEGRA_PINGROUP_KB_ROW4, | ||
202 | TEGRA_PINGROUP_KB_ROW5, | ||
203 | TEGRA_PINGROUP_KB_ROW6, | ||
204 | TEGRA_PINGROUP_KB_ROW7, | ||
205 | TEGRA_PINGROUP_KB_ROW8, | ||
206 | TEGRA_PINGROUP_KB_ROW9, | ||
207 | TEGRA_PINGROUP_KB_ROW10, | ||
208 | TEGRA_PINGROUP_KB_ROW11, | ||
209 | TEGRA_PINGROUP_KB_ROW12, | ||
210 | TEGRA_PINGROUP_KB_ROW13, | ||
211 | TEGRA_PINGROUP_KB_ROW14, | ||
212 | TEGRA_PINGROUP_KB_ROW15, | ||
213 | TEGRA_PINGROUP_KB_COL0, | ||
214 | TEGRA_PINGROUP_KB_COL1, | ||
215 | TEGRA_PINGROUP_KB_COL2, | ||
216 | TEGRA_PINGROUP_KB_COL3, | ||
217 | TEGRA_PINGROUP_KB_COL4, | ||
218 | TEGRA_PINGROUP_KB_COL5, | ||
219 | TEGRA_PINGROUP_KB_COL6, | ||
220 | TEGRA_PINGROUP_KB_COL7, | ||
221 | TEGRA_PINGROUP_CLK_32K_OUT, | ||
222 | TEGRA_PINGROUP_SYS_CLK_REQ, | ||
223 | TEGRA_PINGROUP_CORE_PWR_REQ, | ||
224 | TEGRA_PINGROUP_CPU_PWR_REQ, | ||
225 | TEGRA_PINGROUP_PWR_INT_N, | ||
226 | TEGRA_PINGROUP_CLK_32K_IN, | ||
227 | TEGRA_PINGROUP_OWR, | ||
228 | TEGRA_PINGROUP_DAP1_FS, | ||
229 | TEGRA_PINGROUP_DAP1_DIN, | ||
230 | TEGRA_PINGROUP_DAP1_DOUT, | ||
231 | TEGRA_PINGROUP_DAP1_SCLK, | ||
232 | TEGRA_PINGROUP_CLK1_REQ, | ||
233 | TEGRA_PINGROUP_CLK1_OUT, | ||
234 | TEGRA_PINGROUP_SPDIF_IN, | ||
235 | TEGRA_PINGROUP_SPDIF_OUT, | ||
236 | TEGRA_PINGROUP_DAP2_FS, | ||
237 | TEGRA_PINGROUP_DAP2_DIN, | ||
238 | TEGRA_PINGROUP_DAP2_DOUT, | ||
239 | TEGRA_PINGROUP_DAP2_SCLK, | ||
240 | TEGRA_PINGROUP_SPI2_MOSI, | ||
241 | TEGRA_PINGROUP_SPI2_MISO, | ||
242 | TEGRA_PINGROUP_SPI2_CS0_N, | ||
243 | TEGRA_PINGROUP_SPI2_SCK, | ||
244 | TEGRA_PINGROUP_SPI1_MOSI, | ||
245 | TEGRA_PINGROUP_SPI1_SCK, | ||
246 | TEGRA_PINGROUP_SPI1_CS0_N, | ||
247 | TEGRA_PINGROUP_SPI1_MISO, | ||
248 | TEGRA_PINGROUP_SPI2_CS1_N, | ||
249 | TEGRA_PINGROUP_SPI2_CS2_N, | ||
250 | TEGRA_PINGROUP_SDMMC3_CLK, | ||
251 | TEGRA_PINGROUP_SDMMC3_CMD, | ||
252 | TEGRA_PINGROUP_SDMMC3_DAT0, | ||
253 | TEGRA_PINGROUP_SDMMC3_DAT1, | ||
254 | TEGRA_PINGROUP_SDMMC3_DAT2, | ||
255 | TEGRA_PINGROUP_SDMMC3_DAT3, | ||
256 | TEGRA_PINGROUP_SDMMC3_DAT4, | ||
257 | TEGRA_PINGROUP_SDMMC3_DAT5, | ||
258 | TEGRA_PINGROUP_SDMMC3_DAT6, | ||
259 | TEGRA_PINGROUP_SDMMC3_DAT7, | ||
260 | TEGRA_PINGROUP_PEX_L0_PRSNT_N, | ||
261 | TEGRA_PINGROUP_PEX_L0_RST_N, | ||
262 | TEGRA_PINGROUP_PEX_L0_CLKREQ_N, | ||
263 | TEGRA_PINGROUP_PEX_WAKE_N, | ||
264 | TEGRA_PINGROUP_PEX_L1_PRSNT_N, | ||
265 | TEGRA_PINGROUP_PEX_L1_RST_N, | ||
266 | TEGRA_PINGROUP_PEX_L1_CLKREQ_N, | ||
267 | TEGRA_PINGROUP_PEX_L2_PRSNT_N, | ||
268 | TEGRA_PINGROUP_PEX_L2_RST_N, | ||
269 | TEGRA_PINGROUP_PEX_L2_CLKREQ_N, | ||
270 | TEGRA_PINGROUP_HDMI_CEC, | ||
271 | TEGRA_MAX_PINGROUP, | ||
272 | }; | ||
273 | |||
274 | enum tegra_drive_pingroup { | ||
275 | TEGRA_DRIVE_PINGROUP_AO1 = 0, | ||
276 | TEGRA_DRIVE_PINGROUP_AO2, | ||
277 | TEGRA_DRIVE_PINGROUP_AT1, | ||
278 | TEGRA_DRIVE_PINGROUP_AT2, | ||
279 | TEGRA_DRIVE_PINGROUP_AT3, | ||
280 | TEGRA_DRIVE_PINGROUP_AT4, | ||
281 | TEGRA_DRIVE_PINGROUP_AT5, | ||
282 | TEGRA_DRIVE_PINGROUP_CDEV1, | ||
283 | TEGRA_DRIVE_PINGROUP_CDEV2, | ||
284 | TEGRA_DRIVE_PINGROUP_CSUS, | ||
285 | TEGRA_DRIVE_PINGROUP_DAP1, | ||
286 | TEGRA_DRIVE_PINGROUP_DAP2, | ||
287 | TEGRA_DRIVE_PINGROUP_DAP3, | ||
288 | TEGRA_DRIVE_PINGROUP_DAP4, | ||
289 | TEGRA_DRIVE_PINGROUP_DBG, | ||
290 | TEGRA_DRIVE_PINGROUP_LCD1, | ||
291 | TEGRA_DRIVE_PINGROUP_LCD2, | ||
292 | TEGRA_DRIVE_PINGROUP_SDIO2, | ||
293 | TEGRA_DRIVE_PINGROUP_SDIO3, | ||
294 | TEGRA_DRIVE_PINGROUP_SPI, | ||
295 | TEGRA_DRIVE_PINGROUP_UAA, | ||
296 | TEGRA_DRIVE_PINGROUP_UAB, | ||
297 | TEGRA_DRIVE_PINGROUP_UART2, | ||
298 | TEGRA_DRIVE_PINGROUP_UART3, | ||
299 | TEGRA_DRIVE_PINGROUP_VI1, | ||
300 | TEGRA_DRIVE_PINGROUP_SDIO1, | ||
301 | TEGRA_DRIVE_PINGROUP_CRT, | ||
302 | TEGRA_DRIVE_PINGROUP_DDC, | ||
303 | TEGRA_DRIVE_PINGROUP_GMA, | ||
304 | TEGRA_DRIVE_PINGROUP_GMB, | ||
305 | TEGRA_DRIVE_PINGROUP_GMC, | ||
306 | TEGRA_DRIVE_PINGROUP_GMD, | ||
307 | TEGRA_DRIVE_PINGROUP_GME, | ||
308 | TEGRA_DRIVE_PINGROUP_GMF, | ||
309 | TEGRA_DRIVE_PINGROUP_GMG, | ||
310 | TEGRA_DRIVE_PINGROUP_GMH, | ||
311 | TEGRA_DRIVE_PINGROUP_OWR, | ||
312 | TEGRA_DRIVE_PINGROUP_UAD, | ||
313 | TEGRA_DRIVE_PINGROUP_GPV, | ||
314 | TEGRA_DRIVE_PINGROUP_DEV3, | ||
315 | TEGRA_DRIVE_PINGROUP_CEC, | ||
316 | TEGRA_MAX_DRIVE_PINGROUP, | ||
317 | }; | ||
318 | |||
319 | #endif | ||
320 | |||
diff --git a/arch/arm/mach-tegra/include/mach/pinmux.h b/arch/arm/mach-tegra/include/mach/pinmux.h index bb7dfdb61205..055f1792c8ff 100644 --- a/arch/arm/mach-tegra/include/mach/pinmux.h +++ b/arch/arm/mach-tegra/include/mach/pinmux.h | |||
@@ -2,6 +2,7 @@ | |||
2 | * linux/arch/arm/mach-tegra/include/mach/pinmux.h | 2 | * linux/arch/arm/mach-tegra/include/mach/pinmux.h |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
5 | * Copyright (C) 2010,2011 Nvidia, Inc. | ||
5 | * | 6 | * |
6 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
7 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
@@ -17,18 +18,13 @@ | |||
17 | #ifndef __MACH_TEGRA_PINMUX_H | 18 | #ifndef __MACH_TEGRA_PINMUX_H |
18 | #define __MACH_TEGRA_PINMUX_H | 19 | #define __MACH_TEGRA_PINMUX_H |
19 | 20 | ||
20 | #if defined(CONFIG_ARCH_TEGRA_2x_SOC) | ||
21 | #include "pinmux-t2.h" | ||
22 | #else | ||
23 | #error "Undefined Tegra architecture" | ||
24 | #endif | ||
25 | |||
26 | enum tegra_mux_func { | 21 | enum tegra_mux_func { |
27 | TEGRA_MUX_RSVD = 0x8000, | 22 | TEGRA_MUX_RSVD = 0x8000, |
28 | TEGRA_MUX_RSVD1 = 0x8000, | 23 | TEGRA_MUX_RSVD1 = 0x8000, |
29 | TEGRA_MUX_RSVD2 = 0x8001, | 24 | TEGRA_MUX_RSVD2 = 0x8001, |
30 | TEGRA_MUX_RSVD3 = 0x8002, | 25 | TEGRA_MUX_RSVD3 = 0x8002, |
31 | TEGRA_MUX_RSVD4 = 0x8003, | 26 | TEGRA_MUX_RSVD4 = 0x8003, |
27 | TEGRA_MUX_INVALID = 0x4000, | ||
32 | TEGRA_MUX_NONE = -1, | 28 | TEGRA_MUX_NONE = -1, |
33 | TEGRA_MUX_AHB_CLK, | 29 | TEGRA_MUX_AHB_CLK, |
34 | TEGRA_MUX_APB_CLK, | 30 | TEGRA_MUX_APB_CLK, |
@@ -90,6 +86,49 @@ enum tegra_mux_func { | |||
90 | TEGRA_MUX_VI, | 86 | TEGRA_MUX_VI, |
91 | TEGRA_MUX_VI_SENSOR_CLK, | 87 | TEGRA_MUX_VI_SENSOR_CLK, |
92 | TEGRA_MUX_XIO, | 88 | TEGRA_MUX_XIO, |
89 | TEGRA_MUX_BLINK, | ||
90 | TEGRA_MUX_CEC, | ||
91 | TEGRA_MUX_CLK12, | ||
92 | TEGRA_MUX_DAP, | ||
93 | TEGRA_MUX_DAPSDMMC2, | ||
94 | TEGRA_MUX_DDR, | ||
95 | TEGRA_MUX_DEV3, | ||
96 | TEGRA_MUX_DTV, | ||
97 | TEGRA_MUX_VI_ALT1, | ||
98 | TEGRA_MUX_VI_ALT2, | ||
99 | TEGRA_MUX_VI_ALT3, | ||
100 | TEGRA_MUX_EMC_DLL, | ||
101 | TEGRA_MUX_EXTPERIPH1, | ||
102 | TEGRA_MUX_EXTPERIPH2, | ||
103 | TEGRA_MUX_EXTPERIPH3, | ||
104 | TEGRA_MUX_GMI_ALT, | ||
105 | TEGRA_MUX_HDA, | ||
106 | TEGRA_MUX_HSI, | ||
107 | TEGRA_MUX_I2C4, | ||
108 | TEGRA_MUX_I2C5, | ||
109 | TEGRA_MUX_I2CPWR, | ||
110 | TEGRA_MUX_I2S0, | ||
111 | TEGRA_MUX_I2S1, | ||
112 | TEGRA_MUX_I2S2, | ||
113 | TEGRA_MUX_I2S3, | ||
114 | TEGRA_MUX_I2S4, | ||
115 | TEGRA_MUX_NAND_ALT, | ||
116 | TEGRA_MUX_POPSDIO4, | ||
117 | TEGRA_MUX_POPSDMMC4, | ||
118 | TEGRA_MUX_PWM0, | ||
119 | TEGRA_MUX_PWM1, | ||
120 | TEGRA_MUX_PWM2, | ||
121 | TEGRA_MUX_PWM3, | ||
122 | TEGRA_MUX_SATA, | ||
123 | TEGRA_MUX_SPI5, | ||
124 | TEGRA_MUX_SPI6, | ||
125 | TEGRA_MUX_SYSCLK, | ||
126 | TEGRA_MUX_VGP1, | ||
127 | TEGRA_MUX_VGP2, | ||
128 | TEGRA_MUX_VGP3, | ||
129 | TEGRA_MUX_VGP4, | ||
130 | TEGRA_MUX_VGP5, | ||
131 | TEGRA_MUX_VGP6, | ||
93 | TEGRA_MUX_SAFE, | 132 | TEGRA_MUX_SAFE, |
94 | TEGRA_MAX_MUX, | 133 | TEGRA_MAX_MUX, |
95 | }; | 134 | }; |
@@ -105,6 +144,11 @@ enum tegra_tristate { | |||
105 | TEGRA_TRI_TRISTATE = 1, | 144 | TEGRA_TRI_TRISTATE = 1, |
106 | }; | 145 | }; |
107 | 146 | ||
147 | enum tegra_pin_io { | ||
148 | TEGRA_PIN_OUTPUT = 0, | ||
149 | TEGRA_PIN_INPUT = 1, | ||
150 | }; | ||
151 | |||
108 | enum tegra_vddio { | 152 | enum tegra_vddio { |
109 | TEGRA_VDDIO_BB = 0, | 153 | TEGRA_VDDIO_BB = 0, |
110 | TEGRA_VDDIO_LCD, | 154 | TEGRA_VDDIO_LCD, |
@@ -115,10 +159,16 @@ enum tegra_vddio { | |||
115 | TEGRA_VDDIO_SYS, | 159 | TEGRA_VDDIO_SYS, |
116 | TEGRA_VDDIO_AUDIO, | 160 | TEGRA_VDDIO_AUDIO, |
117 | TEGRA_VDDIO_SD, | 161 | TEGRA_VDDIO_SD, |
162 | TEGRA_VDDIO_CAM, | ||
163 | TEGRA_VDDIO_GMI, | ||
164 | TEGRA_VDDIO_PEXCTL, | ||
165 | TEGRA_VDDIO_SDMMC1, | ||
166 | TEGRA_VDDIO_SDMMC3, | ||
167 | TEGRA_VDDIO_SDMMC4, | ||
118 | }; | 168 | }; |
119 | 169 | ||
120 | struct tegra_pingroup_config { | 170 | struct tegra_pingroup_config { |
121 | enum tegra_pingroup pingroup; | 171 | int pingroup; |
122 | enum tegra_mux_func func; | 172 | enum tegra_mux_func func; |
123 | enum tegra_pullupdown pupd; | 173 | enum tegra_pullupdown pupd; |
124 | enum tegra_tristate tristate; | 174 | enum tegra_tristate tristate; |
@@ -187,7 +237,7 @@ enum tegra_schmitt { | |||
187 | }; | 237 | }; |
188 | 238 | ||
189 | struct tegra_drive_pingroup_config { | 239 | struct tegra_drive_pingroup_config { |
190 | enum tegra_drive_pingroup pingroup; | 240 | int pingroup; |
191 | enum tegra_hsm hsm; | 241 | enum tegra_hsm hsm; |
192 | enum tegra_schmitt schmitt; | 242 | enum tegra_schmitt schmitt; |
193 | enum tegra_drive drive; | 243 | enum tegra_drive drive; |
@@ -208,6 +258,7 @@ struct tegra_pingroup_desc { | |||
208 | int funcs[4]; | 258 | int funcs[4]; |
209 | int func_safe; | 259 | int func_safe; |
210 | int vddio; | 260 | int vddio; |
261 | enum tegra_pin_io io_default; | ||
211 | s16 tri_bank; /* Register bank the tri_reg exists within */ | 262 | s16 tri_bank; /* Register bank the tri_reg exists within */ |
212 | s16 mux_bank; /* Register bank the mux_reg exists within */ | 263 | s16 mux_bank; /* Register bank the mux_reg exists within */ |
213 | s16 pupd_bank; /* Register bank the pupd_reg exists within */ | 264 | s16 pupd_bank; /* Register bank the pupd_reg exists within */ |
@@ -217,15 +268,23 @@ struct tegra_pingroup_desc { | |||
217 | s8 tri_bit; /* offset into the TRISTATE_REG_* register bit */ | 268 | s8 tri_bit; /* offset into the TRISTATE_REG_* register bit */ |
218 | s8 mux_bit; /* offset into the PIN_MUX_CTL_* register bit */ | 269 | s8 mux_bit; /* offset into the PIN_MUX_CTL_* register bit */ |
219 | s8 pupd_bit; /* offset into the PULL_UPDOWN_REG_* register bit */ | 270 | s8 pupd_bit; /* offset into the PULL_UPDOWN_REG_* register bit */ |
271 | s8 lock_bit; /* offset of the LOCK bit into mux register bit */ | ||
272 | s8 od_bit; /* offset of the OD bit into mux register bit */ | ||
273 | s8 ioreset_bit; /* offset of the IO_RESET bit into mux register bit */ | ||
220 | }; | 274 | }; |
221 | 275 | ||
222 | extern const struct tegra_pingroup_desc tegra_soc_pingroups[]; | 276 | typedef void (*pinmux_init) (const struct tegra_pingroup_desc **pg, |
223 | extern const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[]; | 277 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, |
278 | int *pgdrive_max); | ||
224 | 279 | ||
225 | int tegra_pinmux_set_tristate(enum tegra_pingroup pg, | 280 | void tegra20_pinmux_init(const struct tegra_pingroup_desc **pg, int *pg_max, |
226 | enum tegra_tristate tristate); | 281 | const struct tegra_drive_pingroup_desc **pgdrive, int *pgdrive_max); |
227 | int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg, | 282 | |
228 | enum tegra_pullupdown pupd); | 283 | void tegra30_pinmux_init(const struct tegra_pingroup_desc **pg, int *pg_max, |
284 | const struct tegra_drive_pingroup_desc **pgdrive, int *pgdrive_max); | ||
285 | |||
286 | int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate); | ||
287 | int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd); | ||
229 | 288 | ||
230 | void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, | 289 | void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, |
231 | int len); | 290 | int len); |
@@ -241,4 +300,3 @@ void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *conf | |||
241 | void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config, | 300 | void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *config, |
242 | int len, enum tegra_pullupdown pupd); | 301 | int len, enum tegra_pullupdown pupd); |
243 | #endif | 302 | #endif |
244 | |||
diff --git a/arch/arm/mach-tegra/include/mach/vmalloc.h b/arch/arm/mach-tegra/include/mach/vmalloc.h deleted file mode 100644 index fd6aa65b2dc6..000000000000 --- a/arch/arm/mach-tegra/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2010 Google, Inc. | ||
5 | * | ||
6 | * Author: | ||
7 | * Colin Cross <ccross@google.com> | ||
8 | * Erik Gilling <konkers@google.com> | ||
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 | #ifndef __MACH_TEGRA_VMALLOC_H | ||
22 | #define __MACH_TEGRA_VMALLOC_H | ||
23 | |||
24 | #include <asm/sizes.h> | ||
25 | |||
26 | #define VMALLOC_END 0xFE000000UL | ||
27 | |||
28 | #endif | ||
diff --git a/arch/arm/mach-tegra/io.c b/arch/arm/mach-tegra/io.c index 5489f8b5d6ad..d23ee2db2827 100644 --- a/arch/arm/mach-tegra/io.c +++ b/arch/arm/mach-tegra/io.c | |||
@@ -60,24 +60,3 @@ void __init tegra_map_common_io(void) | |||
60 | { | 60 | { |
61 | iotable_init(tegra_io_desc, ARRAY_SIZE(tegra_io_desc)); | 61 | iotable_init(tegra_io_desc, ARRAY_SIZE(tegra_io_desc)); |
62 | } | 62 | } |
63 | |||
64 | /* | ||
65 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
66 | */ | ||
67 | void __iomem *tegra_ioremap(unsigned long p, size_t size, unsigned int type) | ||
68 | { | ||
69 | void __iomem *v = IO_ADDRESS(p); | ||
70 | if (v == NULL) | ||
71 | v = __arm_ioremap(p, size, type); | ||
72 | return v; | ||
73 | } | ||
74 | EXPORT_SYMBOL(tegra_ioremap); | ||
75 | |||
76 | void tegra_iounmap(volatile void __iomem *addr) | ||
77 | { | ||
78 | unsigned long virt = (unsigned long)addr; | ||
79 | |||
80 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
81 | __iounmap(addr); | ||
82 | } | ||
83 | EXPORT_SYMBOL(tegra_iounmap); | ||
diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c index 4956c3cea731..004b0fdf0d76 100644 --- a/arch/arm/mach-tegra/irq.c +++ b/arch/arm/mach-tegra/irq.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | #include <linux/of.h> | ||
24 | 25 | ||
25 | #include <asm/hardware/gic.h> | 26 | #include <asm/hardware/gic.h> |
26 | 27 | ||
@@ -129,6 +130,11 @@ void __init tegra_init_irq(void) | |||
129 | gic_arch_extn.irq_unmask = tegra_unmask; | 130 | gic_arch_extn.irq_unmask = tegra_unmask; |
130 | gic_arch_extn.irq_retrigger = tegra_retrigger; | 131 | gic_arch_extn.irq_retrigger = tegra_retrigger; |
131 | 132 | ||
132 | gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), | 133 | /* |
133 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); | 134 | * Check if there is a devicetree present, since the GIC will be |
135 | * initialized elsewhere under DT. | ||
136 | */ | ||
137 | if (!of_have_populated_dt()) | ||
138 | gic_init(0, 29, IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE), | ||
139 | IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); | ||
134 | } | 140 | } |
diff --git a/arch/arm/mach-tegra/pinmux-t2-tables.c b/arch/arm/mach-tegra/pinmux-tegra20-tables.c index a0dc2bc28ed3..734add1280b7 100644 --- a/arch/arm/mach-tegra/pinmux-t2-tables.c +++ b/arch/arm/mach-tegra/pinmux-tegra20-tables.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * linux/arch/arm/mach-tegra/pinmux-t2-tables.c | 2 | * linux/arch/arm/mach-tegra/pinmux-tegra20-tables.c |
3 | * | 3 | * |
4 | * Common pinmux configurations for Tegra 2 SoCs | 4 | * Common pinmux configurations for Tegra20 SoCs |
5 | * | 5 | * |
6 | * Copyright (C) 2010 NVIDIA Corporation | 6 | * Copyright (C) 2010 NVIDIA Corporation |
7 | * | 7 | * |
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <mach/iomap.h> | 30 | #include <mach/iomap.h> |
31 | #include <mach/pinmux.h> | 31 | #include <mach/pinmux.h> |
32 | #include <mach/pinmux-tegra20.h> | ||
32 | #include <mach/suspend.h> | 33 | #include <mach/suspend.h> |
33 | 34 | ||
34 | #define TRISTATE_REG_A 0x14 | 35 | #define TRISTATE_REG_A 0x14 |
@@ -43,7 +44,7 @@ | |||
43 | .reg = ((r) - PINGROUP_REG_A) \ | 44 | .reg = ((r) - PINGROUP_REG_A) \ |
44 | } | 45 | } |
45 | 46 | ||
46 | const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { | 47 | static const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { |
47 | DRIVE_PINGROUP(AO1, 0x868), | 48 | DRIVE_PINGROUP(AO1, 0x868), |
48 | DRIVE_PINGROUP(AO2, 0x86c), | 49 | DRIVE_PINGROUP(AO2, 0x86c), |
49 | DRIVE_PINGROUP(AT1, 0x870), | 50 | DRIVE_PINGROUP(AT1, 0x870), |
@@ -105,9 +106,13 @@ const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE | |||
105 | .pupd_bank = 2, \ | 106 | .pupd_bank = 2, \ |
106 | .pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A), \ | 107 | .pupd_reg = ((pupd_r) - PULLUPDOWN_REG_A), \ |
107 | .pupd_bit = pupd_b, \ | 108 | .pupd_bit = pupd_b, \ |
109 | .lock_bit = -1, \ | ||
110 | .od_bit = -1, \ | ||
111 | .ioreset_bit = -1, \ | ||
112 | .io_default = -1, \ | ||
108 | } | 113 | } |
109 | 114 | ||
110 | const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { | 115 | static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { |
111 | PINGROUP(ATA, NAND, IDE, NAND, GMI, RSVD, IDE, 0x14, 0, 0x80, 24, 0xA0, 0), | 116 | PINGROUP(ATA, NAND, IDE, NAND, GMI, RSVD, IDE, 0x14, 0, 0x80, 24, 0xA0, 0), |
112 | PINGROUP(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 1, 0x80, 16, 0xA0, 2), | 117 | PINGROUP(ATB, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 1, 0x80, 16, 0xA0, 2), |
113 | PINGROUP(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 2, 0x80, 22, 0xA0, 4), | 118 | PINGROUP(ATC, NAND, IDE, NAND, GMI, SDIO4, IDE, 0x14, 2, 0x80, 22, 0xA0, 4), |
@@ -226,3 +231,14 @@ const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { | |||
226 | PINGROUP(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 30), | 231 | PINGROUP(XM2C, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 30), |
227 | PINGROUP(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 28), | 232 | PINGROUP(XM2D, DDR, RSVD, RSVD, RSVD, RSVD, RSVD, -1, -1, -1, -1, 0xA8, 28), |
228 | }; | 233 | }; |
234 | |||
235 | void __devinit tegra20_pinmux_init(const struct tegra_pingroup_desc **pg, | ||
236 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, | ||
237 | int *pgdrive_max) | ||
238 | { | ||
239 | *pg = tegra_soc_pingroups; | ||
240 | *pg_max = TEGRA_MAX_PINGROUP; | ||
241 | *pgdrive = tegra_soc_drive_pingroups; | ||
242 | *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP; | ||
243 | } | ||
244 | |||
diff --git a/arch/arm/mach-tegra/pinmux-tegra30-tables.c b/arch/arm/mach-tegra/pinmux-tegra30-tables.c new file mode 100644 index 000000000000..14fc0e4c1c44 --- /dev/null +++ b/arch/arm/mach-tegra/pinmux-tegra30-tables.c | |||
@@ -0,0 +1,376 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-tegra/pinmux-tegra30-tables.c | ||
3 | * | ||
4 | * Common pinmux configurations for Tegra30 SoCs | ||
5 | * | ||
6 | * Copyright (C) 2010,2011 NVIDIA Corporation | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
15 | * more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along | ||
18 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
19 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
20 | */ | ||
21 | |||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/errno.h> | ||
24 | #include <linux/spinlock.h> | ||
25 | #include <linux/io.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/string.h> | ||
28 | |||
29 | #include <mach/iomap.h> | ||
30 | #include <mach/pinmux.h> | ||
31 | #include <mach/pinmux-tegra30.h> | ||
32 | #include <mach/suspend.h> | ||
33 | |||
34 | #define PINGROUP_REG_A 0x868 | ||
35 | #define MUXCTL_REG_A 0x3000 | ||
36 | |||
37 | #define DRIVE_PINGROUP(pg_name, r) \ | ||
38 | [TEGRA_DRIVE_PINGROUP_ ## pg_name] = { \ | ||
39 | .name = #pg_name, \ | ||
40 | .reg_bank = 0, \ | ||
41 | .reg = ((r) - PINGROUP_REG_A) \ | ||
42 | } | ||
43 | |||
44 | static const struct tegra_drive_pingroup_desc tegra_soc_drive_pingroups[TEGRA_MAX_DRIVE_PINGROUP] = { | ||
45 | DRIVE_PINGROUP(AO1, 0x868), | ||
46 | DRIVE_PINGROUP(AO2, 0x86c), | ||
47 | DRIVE_PINGROUP(AT1, 0x870), | ||
48 | DRIVE_PINGROUP(AT2, 0x874), | ||
49 | DRIVE_PINGROUP(AT3, 0x878), | ||
50 | DRIVE_PINGROUP(AT4, 0x87c), | ||
51 | DRIVE_PINGROUP(AT5, 0x880), | ||
52 | DRIVE_PINGROUP(CDEV1, 0x884), | ||
53 | DRIVE_PINGROUP(CDEV2, 0x888), | ||
54 | DRIVE_PINGROUP(CSUS, 0x88c), | ||
55 | DRIVE_PINGROUP(DAP1, 0x890), | ||
56 | DRIVE_PINGROUP(DAP2, 0x894), | ||
57 | DRIVE_PINGROUP(DAP3, 0x898), | ||
58 | DRIVE_PINGROUP(DAP4, 0x89c), | ||
59 | DRIVE_PINGROUP(DBG, 0x8a0), | ||
60 | DRIVE_PINGROUP(LCD1, 0x8a4), | ||
61 | DRIVE_PINGROUP(LCD2, 0x8a8), | ||
62 | DRIVE_PINGROUP(SDIO2, 0x8ac), | ||
63 | DRIVE_PINGROUP(SDIO3, 0x8b0), | ||
64 | DRIVE_PINGROUP(SPI, 0x8b4), | ||
65 | DRIVE_PINGROUP(UAA, 0x8b8), | ||
66 | DRIVE_PINGROUP(UAB, 0x8bc), | ||
67 | DRIVE_PINGROUP(UART2, 0x8c0), | ||
68 | DRIVE_PINGROUP(UART3, 0x8c4), | ||
69 | DRIVE_PINGROUP(VI1, 0x8c8), | ||
70 | DRIVE_PINGROUP(SDIO1, 0x8ec), | ||
71 | DRIVE_PINGROUP(CRT, 0x8f8), | ||
72 | DRIVE_PINGROUP(DDC, 0x8fc), | ||
73 | DRIVE_PINGROUP(GMA, 0x900), | ||
74 | DRIVE_PINGROUP(GMB, 0x904), | ||
75 | DRIVE_PINGROUP(GMC, 0x908), | ||
76 | DRIVE_PINGROUP(GMD, 0x90c), | ||
77 | DRIVE_PINGROUP(GME, 0x910), | ||
78 | DRIVE_PINGROUP(GMF, 0x914), | ||
79 | DRIVE_PINGROUP(GMG, 0x918), | ||
80 | DRIVE_PINGROUP(GMH, 0x91c), | ||
81 | DRIVE_PINGROUP(OWR, 0x920), | ||
82 | DRIVE_PINGROUP(UAD, 0x924), | ||
83 | DRIVE_PINGROUP(GPV, 0x928), | ||
84 | DRIVE_PINGROUP(DEV3, 0x92c), | ||
85 | DRIVE_PINGROUP(CEC, 0x938), | ||
86 | }; | ||
87 | |||
88 | #define PINGROUP(pg_name, vdd, f0, f1, f2, f3, fs, iod, reg) \ | ||
89 | [TEGRA_PINGROUP_ ## pg_name] = { \ | ||
90 | .name = #pg_name, \ | ||
91 | .vddio = TEGRA_VDDIO_ ## vdd, \ | ||
92 | .funcs = { \ | ||
93 | TEGRA_MUX_ ## f0, \ | ||
94 | TEGRA_MUX_ ## f1, \ | ||
95 | TEGRA_MUX_ ## f2, \ | ||
96 | TEGRA_MUX_ ## f3, \ | ||
97 | }, \ | ||
98 | .func_safe = TEGRA_MUX_ ## fs, \ | ||
99 | .tri_bank = 1, \ | ||
100 | .tri_reg = ((reg) - MUXCTL_REG_A), \ | ||
101 | .tri_bit = 4, \ | ||
102 | .mux_bank = 1, \ | ||
103 | .mux_reg = ((reg) - MUXCTL_REG_A), \ | ||
104 | .mux_bit = 0, \ | ||
105 | .pupd_bank = 1, \ | ||
106 | .pupd_reg = ((reg) - MUXCTL_REG_A), \ | ||
107 | .pupd_bit = 2, \ | ||
108 | .io_default = TEGRA_PIN_ ## iod, \ | ||
109 | .od_bit = 6, \ | ||
110 | .lock_bit = 7, \ | ||
111 | .ioreset_bit = 8, \ | ||
112 | } | ||
113 | |||
114 | static const struct tegra_pingroup_desc tegra_soc_pingroups[TEGRA_MAX_PINGROUP] = { | ||
115 | /* NAME VDD f0 f1 f2 f3 fSafe io reg */ | ||
116 | PINGROUP(ULPI_DATA0, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3000), | ||
117 | PINGROUP(ULPI_DATA1, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3004), | ||
118 | PINGROUP(ULPI_DATA2, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x3008), | ||
119 | PINGROUP(ULPI_DATA3, BB, SPI3, HSI, UARTA, ULPI, RSVD, INPUT, 0x300c), | ||
120 | PINGROUP(ULPI_DATA4, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3010), | ||
121 | PINGROUP(ULPI_DATA5, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3014), | ||
122 | PINGROUP(ULPI_DATA6, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x3018), | ||
123 | PINGROUP(ULPI_DATA7, BB, SPI2, HSI, UARTA, ULPI, RSVD, INPUT, 0x301c), | ||
124 | PINGROUP(ULPI_CLK, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3020), | ||
125 | PINGROUP(ULPI_DIR, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3024), | ||
126 | PINGROUP(ULPI_NXT, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x3028), | ||
127 | PINGROUP(ULPI_STP, BB, SPI1, RSVD, UARTD, ULPI, RSVD, INPUT, 0x302c), | ||
128 | PINGROUP(DAP3_FS, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3030), | ||
129 | PINGROUP(DAP3_DIN, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3034), | ||
130 | PINGROUP(DAP3_DOUT, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x3038), | ||
131 | PINGROUP(DAP3_SCLK, BB, I2S2, RSVD1, DISPLAYA, DISPLAYB, RSVD, INPUT, 0x303c), | ||
132 | PINGROUP(GPIO_PV0, BB, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3040), | ||
133 | PINGROUP(GPIO_PV1, BB, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3044), | ||
134 | PINGROUP(SDMMC1_CLK, SDMMC1, SDIO1, RSVD1, RSVD2, INVALID, RSVD, INPUT, 0x3048), | ||
135 | PINGROUP(SDMMC1_CMD, SDMMC1, SDIO1, RSVD1, RSVD2, INVALID, RSVD, INPUT, 0x304c), | ||
136 | PINGROUP(SDMMC1_DAT3, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3050), | ||
137 | PINGROUP(SDMMC1_DAT2, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3054), | ||
138 | PINGROUP(SDMMC1_DAT1, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x3058), | ||
139 | PINGROUP(SDMMC1_DAT0, SDMMC1, SDIO1, RSVD1, UARTE, INVALID, RSVD, INPUT, 0x305c), | ||
140 | PINGROUP(GPIO_PV2, SDMMC1, OWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3060), | ||
141 | PINGROUP(GPIO_PV3, SDMMC1, INVALID, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3064), | ||
142 | PINGROUP(CLK2_OUT, SDMMC1, EXTPERIPH2, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3068), | ||
143 | PINGROUP(CLK2_REQ, SDMMC1, DAP, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x306c), | ||
144 | PINGROUP(LCD_PWR1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3070), | ||
145 | PINGROUP(LCD_PWR2, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3074), | ||
146 | PINGROUP(LCD_SDIN, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD, RSVD, OUTPUT, 0x3078), | ||
147 | PINGROUP(LCD_SDOUT, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x307c), | ||
148 | PINGROUP(LCD_WR_N, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3080), | ||
149 | PINGROUP(LCD_CS0_N, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD, RSVD, OUTPUT, 0x3084), | ||
150 | PINGROUP(LCD_DC0, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3088), | ||
151 | PINGROUP(LCD_SCK, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x308c), | ||
152 | PINGROUP(LCD_PWR0, LCD, DISPLAYA, DISPLAYB, SPI5, INVALID, RSVD, OUTPUT, 0x3090), | ||
153 | PINGROUP(LCD_PCLK, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3094), | ||
154 | PINGROUP(LCD_DE, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3098), | ||
155 | PINGROUP(LCD_HSYNC, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x309c), | ||
156 | PINGROUP(LCD_VSYNC, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a0), | ||
157 | PINGROUP(LCD_D0, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a4), | ||
158 | PINGROUP(LCD_D1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30a8), | ||
159 | PINGROUP(LCD_D2, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30ac), | ||
160 | PINGROUP(LCD_D3, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b0), | ||
161 | PINGROUP(LCD_D4, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b4), | ||
162 | PINGROUP(LCD_D5, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30b8), | ||
163 | PINGROUP(LCD_D6, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30bc), | ||
164 | PINGROUP(LCD_D7, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c0), | ||
165 | PINGROUP(LCD_D8, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c4), | ||
166 | PINGROUP(LCD_D9, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30c8), | ||
167 | PINGROUP(LCD_D10, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30cc), | ||
168 | PINGROUP(LCD_D11, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d0), | ||
169 | PINGROUP(LCD_D12, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d4), | ||
170 | PINGROUP(LCD_D13, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30d8), | ||
171 | PINGROUP(LCD_D14, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30dc), | ||
172 | PINGROUP(LCD_D15, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e0), | ||
173 | PINGROUP(LCD_D16, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e4), | ||
174 | PINGROUP(LCD_D17, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30e8), | ||
175 | PINGROUP(LCD_D18, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30ec), | ||
176 | PINGROUP(LCD_D19, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f0), | ||
177 | PINGROUP(LCD_D20, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f4), | ||
178 | PINGROUP(LCD_D21, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30f8), | ||
179 | PINGROUP(LCD_D22, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x30fc), | ||
180 | PINGROUP(LCD_D23, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3100), | ||
181 | PINGROUP(LCD_CS1_N, LCD, DISPLAYA, DISPLAYB, SPI5, RSVD2, RSVD, OUTPUT, 0x3104), | ||
182 | PINGROUP(LCD_M1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x3108), | ||
183 | PINGROUP(LCD_DC1, LCD, DISPLAYA, DISPLAYB, RSVD1, RSVD2, RSVD, OUTPUT, 0x310c), | ||
184 | PINGROUP(HDMI_INT, LCD, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3110), | ||
185 | PINGROUP(DDC_SCL, LCD, I2C4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3114), | ||
186 | PINGROUP(DDC_SDA, LCD, I2C4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3118), | ||
187 | PINGROUP(CRT_HSYNC, LCD, CRT, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x311c), | ||
188 | PINGROUP(CRT_VSYNC, LCD, CRT, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3120), | ||
189 | PINGROUP(VI_D0, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3124), | ||
190 | PINGROUP(VI_D1, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3128), | ||
191 | PINGROUP(VI_D2, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x312c), | ||
192 | PINGROUP(VI_D3, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3130), | ||
193 | PINGROUP(VI_D4, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3134), | ||
194 | PINGROUP(VI_D5, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3138), | ||
195 | PINGROUP(VI_D6, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x313c), | ||
196 | PINGROUP(VI_D7, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3140), | ||
197 | PINGROUP(VI_D8, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3144), | ||
198 | PINGROUP(VI_D9, VI, INVALID, SDIO2, VI, RSVD1, RSVD, INPUT, 0x3148), | ||
199 | PINGROUP(VI_D10, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x314c), | ||
200 | PINGROUP(VI_D11, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3150), | ||
201 | PINGROUP(VI_PCLK, VI, RSVD1, SDIO2, VI, RSVD2, RSVD, INPUT, 0x3154), | ||
202 | PINGROUP(VI_MCLK, VI, VI, INVALID, INVALID, INVALID, RSVD, INPUT, 0x3158), | ||
203 | PINGROUP(VI_VSYNC, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x315c), | ||
204 | PINGROUP(VI_HSYNC, VI, INVALID, RSVD1, VI, RSVD2, RSVD, INPUT, 0x3160), | ||
205 | PINGROUP(UART2_RXD, UART, IRDA, SPDIF, UARTA, SPI4, RSVD, INPUT, 0x3164), | ||
206 | PINGROUP(UART2_TXD, UART, IRDA, SPDIF, UARTA, SPI4, RSVD, INPUT, 0x3168), | ||
207 | PINGROUP(UART2_RTS_N, UART, UARTA, UARTB, GMI, SPI4, RSVD, INPUT, 0x316c), | ||
208 | PINGROUP(UART2_CTS_N, UART, UARTA, UARTB, GMI, SPI4, RSVD, INPUT, 0x3170), | ||
209 | PINGROUP(UART3_TXD, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x3174), | ||
210 | PINGROUP(UART3_RXD, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x3178), | ||
211 | PINGROUP(UART3_CTS_N, UART, UARTC, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x317c), | ||
212 | PINGROUP(UART3_RTS_N, UART, UARTC, PWM0, GMI, RSVD2, RSVD, INPUT, 0x3180), | ||
213 | PINGROUP(GPIO_PU0, UART, OWR, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3184), | ||
214 | PINGROUP(GPIO_PU1, UART, RSVD1, UARTA, GMI, RSVD2, RSVD, INPUT, 0x3188), | ||
215 | PINGROUP(GPIO_PU2, UART, RSVD1, UARTA, GMI, RSVD2, RSVD, INPUT, 0x318c), | ||
216 | PINGROUP(GPIO_PU3, UART, PWM0, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3190), | ||
217 | PINGROUP(GPIO_PU4, UART, PWM1, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3194), | ||
218 | PINGROUP(GPIO_PU5, UART, PWM2, UARTA, GMI, RSVD1, RSVD, INPUT, 0x3198), | ||
219 | PINGROUP(GPIO_PU6, UART, PWM3, UARTA, GMI, RSVD1, RSVD, INPUT, 0x319c), | ||
220 | PINGROUP(GEN1_I2C_SDA, UART, I2C, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31a0), | ||
221 | PINGROUP(GEN1_I2C_SCL, UART, I2C, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31a4), | ||
222 | PINGROUP(DAP4_FS, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31a8), | ||
223 | PINGROUP(DAP4_DIN, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31ac), | ||
224 | PINGROUP(DAP4_DOUT, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31b0), | ||
225 | PINGROUP(DAP4_SCLK, UART, I2S3, RSVD1, GMI, RSVD2, RSVD, INPUT, 0x31b4), | ||
226 | PINGROUP(CLK3_OUT, UART, EXTPERIPH3, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31b8), | ||
227 | PINGROUP(CLK3_REQ, UART, DEV3, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x31bc), | ||
228 | PINGROUP(GMI_WP_N, GMI, RSVD1, NAND, GMI, GMI_ALT, RSVD, INPUT, 0x31c0), | ||
229 | PINGROUP(GMI_IORDY, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31c4), | ||
230 | PINGROUP(GMI_WAIT, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31c8), | ||
231 | PINGROUP(GMI_ADV_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31cc), | ||
232 | PINGROUP(GMI_CLK, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31d0), | ||
233 | PINGROUP(GMI_CS0_N, GMI, RSVD1, NAND, GMI, INVALID, RSVD, INPUT, 0x31d4), | ||
234 | PINGROUP(GMI_CS1_N, GMI, RSVD1, NAND, GMI, DTV, RSVD, INPUT, 0x31d8), | ||
235 | PINGROUP(GMI_CS2_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31dc), | ||
236 | PINGROUP(GMI_CS3_N, GMI, RSVD1, NAND, GMI, GMI_ALT, RSVD, INPUT, 0x31e0), | ||
237 | PINGROUP(GMI_CS4_N, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31e4), | ||
238 | PINGROUP(GMI_CS6_N, GMI, NAND, NAND_ALT, GMI, SATA, RSVD, INPUT, 0x31e8), | ||
239 | PINGROUP(GMI_CS7_N, GMI, NAND, NAND_ALT, GMI, GMI_ALT, RSVD, INPUT, 0x31ec), | ||
240 | PINGROUP(GMI_AD0, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f0), | ||
241 | PINGROUP(GMI_AD1, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f4), | ||
242 | PINGROUP(GMI_AD2, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31f8), | ||
243 | PINGROUP(GMI_AD3, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x31fc), | ||
244 | PINGROUP(GMI_AD4, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3200), | ||
245 | PINGROUP(GMI_AD5, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3204), | ||
246 | PINGROUP(GMI_AD6, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3208), | ||
247 | PINGROUP(GMI_AD7, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x320c), | ||
248 | PINGROUP(GMI_AD8, GMI, PWM0, NAND, GMI, RSVD2, RSVD, INPUT, 0x3210), | ||
249 | PINGROUP(GMI_AD9, GMI, PWM1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3214), | ||
250 | PINGROUP(GMI_AD10, GMI, PWM2, NAND, GMI, RSVD2, RSVD, INPUT, 0x3218), | ||
251 | PINGROUP(GMI_AD11, GMI, PWM3, NAND, GMI, RSVD2, RSVD, INPUT, 0x321c), | ||
252 | PINGROUP(GMI_AD12, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3220), | ||
253 | PINGROUP(GMI_AD13, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3224), | ||
254 | PINGROUP(GMI_AD14, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x3228), | ||
255 | PINGROUP(GMI_AD15, GMI, RSVD1, NAND, GMI, RSVD2, RSVD, INPUT, 0x322c), | ||
256 | PINGROUP(GMI_A16, GMI, UARTD, SPI4, GMI, GMI_ALT, RSVD, INPUT, 0x3230), | ||
257 | PINGROUP(GMI_A17, GMI, UARTD, SPI4, GMI, INVALID, RSVD, INPUT, 0x3234), | ||
258 | PINGROUP(GMI_A18, GMI, UARTD, SPI4, GMI, INVALID, RSVD, INPUT, 0x3238), | ||
259 | PINGROUP(GMI_A19, GMI, UARTD, SPI4, GMI, RSVD3, RSVD, INPUT, 0x323c), | ||
260 | PINGROUP(GMI_WR_N, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3240), | ||
261 | PINGROUP(GMI_OE_N, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3244), | ||
262 | PINGROUP(GMI_DQS, GMI, RSVD1, NAND, GMI, RSVD3, RSVD, INPUT, 0x3248), | ||
263 | PINGROUP(GMI_RST_N, GMI, NAND, NAND_ALT, GMI, RSVD3, RSVD, INPUT, 0x324c), | ||
264 | PINGROUP(GEN2_I2C_SCL, GMI, I2C2, INVALID, GMI, RSVD3, RSVD, INPUT, 0x3250), | ||
265 | PINGROUP(GEN2_I2C_SDA, GMI, I2C2, INVALID, GMI, RSVD3, RSVD, INPUT, 0x3254), | ||
266 | PINGROUP(SDMMC4_CLK, SDMMC4, INVALID, NAND, GMI, SDIO4, RSVD, INPUT, 0x3258), | ||
267 | PINGROUP(SDMMC4_CMD, SDMMC4, I2C3, NAND, GMI, SDIO4, RSVD, INPUT, 0x325c), | ||
268 | PINGROUP(SDMMC4_DAT0, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3260), | ||
269 | PINGROUP(SDMMC4_DAT1, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3264), | ||
270 | PINGROUP(SDMMC4_DAT2, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x3268), | ||
271 | PINGROUP(SDMMC4_DAT3, SDMMC4, UARTE, SPI3, GMI, SDIO4, RSVD, INPUT, 0x326c), | ||
272 | PINGROUP(SDMMC4_DAT4, SDMMC4, I2C3, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3270), | ||
273 | PINGROUP(SDMMC4_DAT5, SDMMC4, VGP3, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3274), | ||
274 | PINGROUP(SDMMC4_DAT6, SDMMC4, VGP4, I2S4, GMI, SDIO4, RSVD, INPUT, 0x3278), | ||
275 | PINGROUP(SDMMC4_DAT7, SDMMC4, VGP5, I2S4, GMI, SDIO4, RSVD, INPUT, 0x327c), | ||
276 | PINGROUP(SDMMC4_RST_N, SDMMC4, VGP6, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3280), | ||
277 | PINGROUP(CAM_MCLK, CAM, VI, INVALID, VI_ALT2, POPSDMMC4, RSVD, INPUT, 0x3284), | ||
278 | PINGROUP(GPIO_PCC1, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3288), | ||
279 | PINGROUP(GPIO_PBB0, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x328c), | ||
280 | PINGROUP(CAM_I2C_SCL, CAM, INVALID, I2C3, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3290), | ||
281 | PINGROUP(CAM_I2C_SDA, CAM, INVALID, I2C3, RSVD2, POPSDMMC4, RSVD, INPUT, 0x3294), | ||
282 | PINGROUP(GPIO_PBB3, CAM, VGP3, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x3298), | ||
283 | PINGROUP(GPIO_PBB4, CAM, VGP4, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x329c), | ||
284 | PINGROUP(GPIO_PBB5, CAM, VGP5, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x32a0), | ||
285 | PINGROUP(GPIO_PBB6, CAM, VGP6, DISPLAYA, DISPLAYB, POPSDMMC4, RSVD, INPUT, 0x32a4), | ||
286 | PINGROUP(GPIO_PBB7, CAM, I2S4, RSVD1, RSVD2, POPSDMMC4, RSVD, INPUT, 0x32a8), | ||
287 | PINGROUP(GPIO_PCC2, CAM, I2S4, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32ac), | ||
288 | PINGROUP(JTAG_RTCK, SYS, RTCK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b0), | ||
289 | PINGROUP(PWR_I2C_SCL, SYS, I2CPWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b4), | ||
290 | PINGROUP(PWR_I2C_SDA, SYS, I2CPWR, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x32b8), | ||
291 | PINGROUP(KB_ROW0, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32bc), | ||
292 | PINGROUP(KB_ROW1, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32c0), | ||
293 | PINGROUP(KB_ROW2, SYS, KBC, INVALID, RSVD2, RSVD3, RSVD, INPUT, 0x32c4), | ||
294 | PINGROUP(KB_ROW3, SYS, KBC, INVALID, RSVD2, INVALID, RSVD, INPUT, 0x32c8), | ||
295 | PINGROUP(KB_ROW4, SYS, KBC, INVALID, TRACE, RSVD3, RSVD, INPUT, 0x32cc), | ||
296 | PINGROUP(KB_ROW5, SYS, KBC, INVALID, TRACE, OWR, RSVD, INPUT, 0x32d0), | ||
297 | PINGROUP(KB_ROW6, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32d4), | ||
298 | PINGROUP(KB_ROW7, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32d8), | ||
299 | PINGROUP(KB_ROW8, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32dc), | ||
300 | PINGROUP(KB_ROW9, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e0), | ||
301 | PINGROUP(KB_ROW10, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e4), | ||
302 | PINGROUP(KB_ROW11, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32e8), | ||
303 | PINGROUP(KB_ROW12, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32ec), | ||
304 | PINGROUP(KB_ROW13, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f0), | ||
305 | PINGROUP(KB_ROW14, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f4), | ||
306 | PINGROUP(KB_ROW15, SYS, KBC, INVALID, SDIO2, INVALID, RSVD, INPUT, 0x32f8), | ||
307 | PINGROUP(KB_COL0, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x32fc), | ||
308 | PINGROUP(KB_COL1, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3300), | ||
309 | PINGROUP(KB_COL2, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3304), | ||
310 | PINGROUP(KB_COL3, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3308), | ||
311 | PINGROUP(KB_COL4, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x330c), | ||
312 | PINGROUP(KB_COL5, SYS, KBC, INVALID, TRACE, RSVD, RSVD, INPUT, 0x3310), | ||
313 | PINGROUP(KB_COL6, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3314), | ||
314 | PINGROUP(KB_COL7, SYS, KBC, INVALID, TRACE, INVALID, RSVD, INPUT, 0x3318), | ||
315 | PINGROUP(CLK_32K_OUT, SYS, BLINK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x331c), | ||
316 | PINGROUP(SYS_CLK_REQ, SYS, SYSCLK, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x3320), | ||
317 | PINGROUP(CORE_PWR_REQ, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3324), | ||
318 | PINGROUP(CPU_PWR_REQ, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3328), | ||
319 | PINGROUP(PWR_INT_N, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x332c), | ||
320 | PINGROUP(CLK_32K_IN, SYS, RSVD, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3330), | ||
321 | PINGROUP(OWR, SYS, OWR, RSVD, RSVD, RSVD, RSVD, INPUT, 0x3334), | ||
322 | PINGROUP(DAP1_FS, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3338), | ||
323 | PINGROUP(DAP1_DIN, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x333c), | ||
324 | PINGROUP(DAP1_DOUT, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3340), | ||
325 | PINGROUP(DAP1_SCLK, AUDIO, I2S0, HDA, GMI, SDIO2, RSVD, INPUT, 0x3344), | ||
326 | PINGROUP(CLK1_REQ, AUDIO, DAP, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x3348), | ||
327 | PINGROUP(CLK1_OUT, AUDIO, EXTPERIPH1, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x334c), | ||
328 | PINGROUP(SPDIF_IN, AUDIO, SPDIF, HDA, INVALID, DAPSDMMC2, RSVD, INPUT, 0x3350), | ||
329 | PINGROUP(SPDIF_OUT, AUDIO, SPDIF, RSVD1, INVALID, DAPSDMMC2, RSVD, INPUT, 0x3354), | ||
330 | PINGROUP(DAP2_FS, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3358), | ||
331 | PINGROUP(DAP2_DIN, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x335c), | ||
332 | PINGROUP(DAP2_DOUT, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3360), | ||
333 | PINGROUP(DAP2_SCLK, AUDIO, I2S1, HDA, RSVD2, GMI, RSVD, INPUT, 0x3364), | ||
334 | PINGROUP(SPI2_MOSI, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3368), | ||
335 | PINGROUP(SPI2_MISO, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x336c), | ||
336 | PINGROUP(SPI2_CS0_N, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3370), | ||
337 | PINGROUP(SPI2_SCK, AUDIO, SPI6, SPI2, INVALID, GMI, RSVD, INPUT, 0x3374), | ||
338 | PINGROUP(SPI1_MOSI, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x3378), | ||
339 | PINGROUP(SPI1_SCK, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x337c), | ||
340 | PINGROUP(SPI1_CS0_N, AUDIO, SPI2, SPI1, INVALID, GMI, RSVD, INPUT, 0x3380), | ||
341 | PINGROUP(SPI1_MISO, AUDIO, INVALID, SPI1, INVALID, RSVD3, RSVD, INPUT, 0x3384), | ||
342 | PINGROUP(SPI2_CS1_N, AUDIO, INVALID, SPI2, INVALID, INVALID, RSVD, INPUT, 0x3388), | ||
343 | PINGROUP(SPI2_CS2_N, AUDIO, INVALID, SPI2, INVALID, INVALID, RSVD, INPUT, 0x338c), | ||
344 | PINGROUP(SDMMC3_CLK, SDMMC3, UARTA, PWM2, SDIO3, INVALID, RSVD, INPUT, 0x3390), | ||
345 | PINGROUP(SDMMC3_CMD, SDMMC3, UARTA, PWM3, SDIO3, INVALID, RSVD, INPUT, 0x3394), | ||
346 | PINGROUP(SDMMC3_DAT0, SDMMC3, RSVD, RSVD1, SDIO3, INVALID, RSVD, INPUT, 0x3398), | ||
347 | PINGROUP(SDMMC3_DAT1, SDMMC3, RSVD, RSVD1, SDIO3, INVALID, RSVD, INPUT, 0x339c), | ||
348 | PINGROUP(SDMMC3_DAT2, SDMMC3, RSVD, PWM1, SDIO3, INVALID, RSVD, INPUT, 0x33a0), | ||
349 | PINGROUP(SDMMC3_DAT3, SDMMC3, RSVD, PWM0, SDIO3, INVALID, RSVD, INPUT, 0x33a4), | ||
350 | PINGROUP(SDMMC3_DAT4, SDMMC3, PWM1, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33a8), | ||
351 | PINGROUP(SDMMC3_DAT5, SDMMC3, PWM0, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33ac), | ||
352 | PINGROUP(SDMMC3_DAT6, SDMMC3, SPDIF, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33b0), | ||
353 | PINGROUP(SDMMC3_DAT7, SDMMC3, SPDIF, INVALID, SDIO3, INVALID, RSVD, INPUT, 0x33b4), | ||
354 | PINGROUP(PEX_L0_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33b8), | ||
355 | PINGROUP(PEX_L0_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33bc), | ||
356 | PINGROUP(PEX_L0_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c0), | ||
357 | PINGROUP(PEX_WAKE_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c4), | ||
358 | PINGROUP(PEX_L1_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33c8), | ||
359 | PINGROUP(PEX_L1_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33cc), | ||
360 | PINGROUP(PEX_L1_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d0), | ||
361 | PINGROUP(PEX_L2_PRSNT_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d4), | ||
362 | PINGROUP(PEX_L2_RST_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33d8), | ||
363 | PINGROUP(PEX_L2_CLKREQ_N, PEXCTL, PCIE, HDA, RSVD2, RSVD3, RSVD, INPUT, 0x33dc), | ||
364 | PINGROUP(HDMI_CEC, SYS, CEC, RSVD1, RSVD2, RSVD3, RSVD, INPUT, 0x33e0), | ||
365 | }; | ||
366 | |||
367 | void __devinit tegra30_pinmux_init(const struct tegra_pingroup_desc **pg, | ||
368 | int *pg_max, const struct tegra_drive_pingroup_desc **pgdrive, | ||
369 | int *pgdrive_max) | ||
370 | { | ||
371 | *pg = tegra_soc_pingroups; | ||
372 | *pg_max = TEGRA_MAX_PINGROUP; | ||
373 | *pgdrive = tegra_soc_drive_pingroups; | ||
374 | *pgdrive_max = TEGRA_MAX_DRIVE_PINGROUP; | ||
375 | } | ||
376 | |||
diff --git a/arch/arm/mach-tegra/pinmux.c b/arch/arm/mach-tegra/pinmux.c index 1d201650d7a4..ac35d2b76850 100644 --- a/arch/arm/mach-tegra/pinmux.c +++ b/arch/arm/mach-tegra/pinmux.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/spinlock.h> | 21 | #include <linux/spinlock.h> |
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
24 | #include <linux/of_device.h> | ||
24 | 25 | ||
25 | #include <mach/iomap.h> | 26 | #include <mach/iomap.h> |
26 | #include <mach/pinmux.h> | 27 | #include <mach/pinmux.h> |
@@ -33,8 +34,10 @@ | |||
33 | #define SLWR(reg) (((reg) >> 28) & 0x3) | 34 | #define SLWR(reg) (((reg) >> 28) & 0x3) |
34 | #define SLWF(reg) (((reg) >> 30) & 0x3) | 35 | #define SLWF(reg) (((reg) >> 30) & 0x3) |
35 | 36 | ||
36 | static const struct tegra_pingroup_desc *const pingroups = tegra_soc_pingroups; | 37 | static const struct tegra_pingroup_desc *pingroups; |
37 | static const struct tegra_drive_pingroup_desc *const drive_pingroups = tegra_soc_drive_pingroups; | 38 | static const struct tegra_drive_pingroup_desc *drive_pingroups; |
39 | static int pingroup_max; | ||
40 | static int drive_max; | ||
38 | 41 | ||
39 | static char *tegra_mux_names[TEGRA_MAX_MUX] = { | 42 | static char *tegra_mux_names[TEGRA_MAX_MUX] = { |
40 | [TEGRA_MUX_AHB_CLK] = "AHB_CLK", | 43 | [TEGRA_MUX_AHB_CLK] = "AHB_CLK", |
@@ -97,6 +100,49 @@ static char *tegra_mux_names[TEGRA_MAX_MUX] = { | |||
97 | [TEGRA_MUX_VI] = "VI", | 100 | [TEGRA_MUX_VI] = "VI", |
98 | [TEGRA_MUX_VI_SENSOR_CLK] = "VI_SENSOR_CLK", | 101 | [TEGRA_MUX_VI_SENSOR_CLK] = "VI_SENSOR_CLK", |
99 | [TEGRA_MUX_XIO] = "XIO", | 102 | [TEGRA_MUX_XIO] = "XIO", |
103 | [TEGRA_MUX_BLINK] = "BLINK", | ||
104 | [TEGRA_MUX_CEC] = "CEC", | ||
105 | [TEGRA_MUX_CLK12] = "CLK12", | ||
106 | [TEGRA_MUX_DAP] = "DAP", | ||
107 | [TEGRA_MUX_DAPSDMMC2] = "DAPSDMMC2", | ||
108 | [TEGRA_MUX_DDR] = "DDR", | ||
109 | [TEGRA_MUX_DEV3] = "DEV3", | ||
110 | [TEGRA_MUX_DTV] = "DTV", | ||
111 | [TEGRA_MUX_VI_ALT1] = "VI_ALT1", | ||
112 | [TEGRA_MUX_VI_ALT2] = "VI_ALT2", | ||
113 | [TEGRA_MUX_VI_ALT3] = "VI_ALT3", | ||
114 | [TEGRA_MUX_EMC_DLL] = "EMC_DLL", | ||
115 | [TEGRA_MUX_EXTPERIPH1] = "EXTPERIPH1", | ||
116 | [TEGRA_MUX_EXTPERIPH2] = "EXTPERIPH2", | ||
117 | [TEGRA_MUX_EXTPERIPH3] = "EXTPERIPH3", | ||
118 | [TEGRA_MUX_GMI_ALT] = "GMI_ALT", | ||
119 | [TEGRA_MUX_HDA] = "HDA", | ||
120 | [TEGRA_MUX_HSI] = "HSI", | ||
121 | [TEGRA_MUX_I2C4] = "I2C4", | ||
122 | [TEGRA_MUX_I2C5] = "I2C5", | ||
123 | [TEGRA_MUX_I2CPWR] = "I2CPWR", | ||
124 | [TEGRA_MUX_I2S0] = "I2S0", | ||
125 | [TEGRA_MUX_I2S1] = "I2S1", | ||
126 | [TEGRA_MUX_I2S2] = "I2S2", | ||
127 | [TEGRA_MUX_I2S3] = "I2S3", | ||
128 | [TEGRA_MUX_I2S4] = "I2S4", | ||
129 | [TEGRA_MUX_NAND_ALT] = "NAND_ALT", | ||
130 | [TEGRA_MUX_POPSDIO4] = "POPSDIO4", | ||
131 | [TEGRA_MUX_POPSDMMC4] = "POPSDMMC4", | ||
132 | [TEGRA_MUX_PWM0] = "PWM0", | ||
133 | [TEGRA_MUX_PWM1] = "PWM2", | ||
134 | [TEGRA_MUX_PWM2] = "PWM2", | ||
135 | [TEGRA_MUX_PWM3] = "PWM3", | ||
136 | [TEGRA_MUX_SATA] = "SATA", | ||
137 | [TEGRA_MUX_SPI5] = "SPI5", | ||
138 | [TEGRA_MUX_SPI6] = "SPI6", | ||
139 | [TEGRA_MUX_SYSCLK] = "SYSCLK", | ||
140 | [TEGRA_MUX_VGP1] = "VGP1", | ||
141 | [TEGRA_MUX_VGP2] = "VGP2", | ||
142 | [TEGRA_MUX_VGP3] = "VGP3", | ||
143 | [TEGRA_MUX_VGP4] = "VGP4", | ||
144 | [TEGRA_MUX_VGP5] = "VGP5", | ||
145 | [TEGRA_MUX_VGP6] = "VGP6", | ||
100 | [TEGRA_MUX_SAFE] = "<safe>", | 146 | [TEGRA_MUX_SAFE] = "<safe>", |
101 | }; | 147 | }; |
102 | 148 | ||
@@ -116,9 +162,9 @@ static const char *tegra_slew_names[TEGRA_MAX_SLEW] = { | |||
116 | 162 | ||
117 | static DEFINE_SPINLOCK(mux_lock); | 163 | static DEFINE_SPINLOCK(mux_lock); |
118 | 164 | ||
119 | static const char *pingroup_name(enum tegra_pingroup pg) | 165 | static const char *pingroup_name(int pg) |
120 | { | 166 | { |
121 | if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) | 167 | if (pg < 0 || pg >= pingroup_max) |
122 | return "<UNKNOWN>"; | 168 | return "<UNKNOWN>"; |
123 | 169 | ||
124 | return pingroups[pg].name; | 170 | return pingroups[pg].name; |
@@ -189,10 +235,10 @@ static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config) | |||
189 | int i; | 235 | int i; |
190 | unsigned long reg; | 236 | unsigned long reg; |
191 | unsigned long flags; | 237 | unsigned long flags; |
192 | enum tegra_pingroup pg = config->pingroup; | 238 | int pg = config->pingroup; |
193 | enum tegra_mux_func func = config->func; | 239 | enum tegra_mux_func func = config->func; |
194 | 240 | ||
195 | if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) | 241 | if (pg < 0 || pg >= pingroup_max) |
196 | return -ERANGE; | 242 | return -ERANGE; |
197 | 243 | ||
198 | if (pingroups[pg].mux_reg < 0) | 244 | if (pingroups[pg].mux_reg < 0) |
@@ -230,13 +276,12 @@ static int tegra_pinmux_set_func(const struct tegra_pingroup_config *config) | |||
230 | return 0; | 276 | return 0; |
231 | } | 277 | } |
232 | 278 | ||
233 | int tegra_pinmux_set_tristate(enum tegra_pingroup pg, | 279 | int tegra_pinmux_set_tristate(int pg, enum tegra_tristate tristate) |
234 | enum tegra_tristate tristate) | ||
235 | { | 280 | { |
236 | unsigned long reg; | 281 | unsigned long reg; |
237 | unsigned long flags; | 282 | unsigned long flags; |
238 | 283 | ||
239 | if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) | 284 | if (pg < 0 || pg >= pingroup_max) |
240 | return -ERANGE; | 285 | return -ERANGE; |
241 | 286 | ||
242 | if (pingroups[pg].tri_reg < 0) | 287 | if (pingroups[pg].tri_reg < 0) |
@@ -255,13 +300,12 @@ int tegra_pinmux_set_tristate(enum tegra_pingroup pg, | |||
255 | return 0; | 300 | return 0; |
256 | } | 301 | } |
257 | 302 | ||
258 | int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg, | 303 | int tegra_pinmux_set_pullupdown(int pg, enum tegra_pullupdown pupd) |
259 | enum tegra_pullupdown pupd) | ||
260 | { | 304 | { |
261 | unsigned long reg; | 305 | unsigned long reg; |
262 | unsigned long flags; | 306 | unsigned long flags; |
263 | 307 | ||
264 | if (pg < 0 || pg >= TEGRA_MAX_PINGROUP) | 308 | if (pg < 0 || pg >= pingroup_max) |
265 | return -ERANGE; | 309 | return -ERANGE; |
266 | 310 | ||
267 | if (pingroups[pg].pupd_reg < 0) | 311 | if (pingroups[pg].pupd_reg < 0) |
@@ -287,7 +331,7 @@ int tegra_pinmux_set_pullupdown(enum tegra_pingroup pg, | |||
287 | 331 | ||
288 | static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config) | 332 | static void tegra_pinmux_config_pingroup(const struct tegra_pingroup_config *config) |
289 | { | 333 | { |
290 | enum tegra_pingroup pingroup = config->pingroup; | 334 | int pingroup = config->pingroup; |
291 | enum tegra_mux_func func = config->func; | 335 | enum tegra_mux_func func = config->func; |
292 | enum tegra_pullupdown pupd = config->pupd; | 336 | enum tegra_pullupdown pupd = config->pupd; |
293 | enum tegra_tristate tristate = config->tristate; | 337 | enum tegra_tristate tristate = config->tristate; |
@@ -323,9 +367,9 @@ void tegra_pinmux_config_table(const struct tegra_pingroup_config *config, int l | |||
323 | tegra_pinmux_config_pingroup(&config[i]); | 367 | tegra_pinmux_config_pingroup(&config[i]); |
324 | } | 368 | } |
325 | 369 | ||
326 | static const char *drive_pinmux_name(enum tegra_drive_pingroup pg) | 370 | static const char *drive_pinmux_name(int pg) |
327 | { | 371 | { |
328 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 372 | if (pg < 0 || pg >= drive_max) |
329 | return "<UNKNOWN>"; | 373 | return "<UNKNOWN>"; |
330 | 374 | ||
331 | return drive_pingroups[pg].name; | 375 | return drive_pingroups[pg].name; |
@@ -352,12 +396,11 @@ static const char *slew_name(unsigned long val) | |||
352 | return tegra_slew_names[val]; | 396 | return tegra_slew_names[val]; |
353 | } | 397 | } |
354 | 398 | ||
355 | static int tegra_drive_pinmux_set_hsm(enum tegra_drive_pingroup pg, | 399 | static int tegra_drive_pinmux_set_hsm(int pg, enum tegra_hsm hsm) |
356 | enum tegra_hsm hsm) | ||
357 | { | 400 | { |
358 | unsigned long flags; | 401 | unsigned long flags; |
359 | u32 reg; | 402 | u32 reg; |
360 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 403 | if (pg < 0 || pg >= drive_max) |
361 | return -ERANGE; | 404 | return -ERANGE; |
362 | 405 | ||
363 | if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE) | 406 | if (hsm != TEGRA_HSM_ENABLE && hsm != TEGRA_HSM_DISABLE) |
@@ -377,12 +420,11 @@ static int tegra_drive_pinmux_set_hsm(enum tegra_drive_pingroup pg, | |||
377 | return 0; | 420 | return 0; |
378 | } | 421 | } |
379 | 422 | ||
380 | static int tegra_drive_pinmux_set_schmitt(enum tegra_drive_pingroup pg, | 423 | static int tegra_drive_pinmux_set_schmitt(int pg, enum tegra_schmitt schmitt) |
381 | enum tegra_schmitt schmitt) | ||
382 | { | 424 | { |
383 | unsigned long flags; | 425 | unsigned long flags; |
384 | u32 reg; | 426 | u32 reg; |
385 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 427 | if (pg < 0 || pg >= drive_max) |
386 | return -ERANGE; | 428 | return -ERANGE; |
387 | 429 | ||
388 | if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE) | 430 | if (schmitt != TEGRA_SCHMITT_ENABLE && schmitt != TEGRA_SCHMITT_DISABLE) |
@@ -402,12 +444,11 @@ static int tegra_drive_pinmux_set_schmitt(enum tegra_drive_pingroup pg, | |||
402 | return 0; | 444 | return 0; |
403 | } | 445 | } |
404 | 446 | ||
405 | static int tegra_drive_pinmux_set_drive(enum tegra_drive_pingroup pg, | 447 | static int tegra_drive_pinmux_set_drive(int pg, enum tegra_drive drive) |
406 | enum tegra_drive drive) | ||
407 | { | 448 | { |
408 | unsigned long flags; | 449 | unsigned long flags; |
409 | u32 reg; | 450 | u32 reg; |
410 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 451 | if (pg < 0 || pg >= drive_max) |
411 | return -ERANGE; | 452 | return -ERANGE; |
412 | 453 | ||
413 | if (drive < 0 || drive >= TEGRA_MAX_DRIVE) | 454 | if (drive < 0 || drive >= TEGRA_MAX_DRIVE) |
@@ -425,12 +466,12 @@ static int tegra_drive_pinmux_set_drive(enum tegra_drive_pingroup pg, | |||
425 | return 0; | 466 | return 0; |
426 | } | 467 | } |
427 | 468 | ||
428 | static int tegra_drive_pinmux_set_pull_down(enum tegra_drive_pingroup pg, | 469 | static int tegra_drive_pinmux_set_pull_down(int pg, |
429 | enum tegra_pull_strength pull_down) | 470 | enum tegra_pull_strength pull_down) |
430 | { | 471 | { |
431 | unsigned long flags; | 472 | unsigned long flags; |
432 | u32 reg; | 473 | u32 reg; |
433 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 474 | if (pg < 0 || pg >= drive_max) |
434 | return -ERANGE; | 475 | return -ERANGE; |
435 | 476 | ||
436 | if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL) | 477 | if (pull_down < 0 || pull_down >= TEGRA_MAX_PULL) |
@@ -448,12 +489,12 @@ static int tegra_drive_pinmux_set_pull_down(enum tegra_drive_pingroup pg, | |||
448 | return 0; | 489 | return 0; |
449 | } | 490 | } |
450 | 491 | ||
451 | static int tegra_drive_pinmux_set_pull_up(enum tegra_drive_pingroup pg, | 492 | static int tegra_drive_pinmux_set_pull_up(int pg, |
452 | enum tegra_pull_strength pull_up) | 493 | enum tegra_pull_strength pull_up) |
453 | { | 494 | { |
454 | unsigned long flags; | 495 | unsigned long flags; |
455 | u32 reg; | 496 | u32 reg; |
456 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 497 | if (pg < 0 || pg >= drive_max) |
457 | return -ERANGE; | 498 | return -ERANGE; |
458 | 499 | ||
459 | if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL) | 500 | if (pull_up < 0 || pull_up >= TEGRA_MAX_PULL) |
@@ -471,12 +512,12 @@ static int tegra_drive_pinmux_set_pull_up(enum tegra_drive_pingroup pg, | |||
471 | return 0; | 512 | return 0; |
472 | } | 513 | } |
473 | 514 | ||
474 | static int tegra_drive_pinmux_set_slew_rising(enum tegra_drive_pingroup pg, | 515 | static int tegra_drive_pinmux_set_slew_rising(int pg, |
475 | enum tegra_slew slew_rising) | 516 | enum tegra_slew slew_rising) |
476 | { | 517 | { |
477 | unsigned long flags; | 518 | unsigned long flags; |
478 | u32 reg; | 519 | u32 reg; |
479 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 520 | if (pg < 0 || pg >= drive_max) |
480 | return -ERANGE; | 521 | return -ERANGE; |
481 | 522 | ||
482 | if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW) | 523 | if (slew_rising < 0 || slew_rising >= TEGRA_MAX_SLEW) |
@@ -494,12 +535,12 @@ static int tegra_drive_pinmux_set_slew_rising(enum tegra_drive_pingroup pg, | |||
494 | return 0; | 535 | return 0; |
495 | } | 536 | } |
496 | 537 | ||
497 | static int tegra_drive_pinmux_set_slew_falling(enum tegra_drive_pingroup pg, | 538 | static int tegra_drive_pinmux_set_slew_falling(int pg, |
498 | enum tegra_slew slew_falling) | 539 | enum tegra_slew slew_falling) |
499 | { | 540 | { |
500 | unsigned long flags; | 541 | unsigned long flags; |
501 | u32 reg; | 542 | u32 reg; |
502 | if (pg < 0 || pg >= TEGRA_MAX_DRIVE_PINGROUP) | 543 | if (pg < 0 || pg >= drive_max) |
503 | return -ERANGE; | 544 | return -ERANGE; |
504 | 545 | ||
505 | if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW) | 546 | if (slew_falling < 0 || slew_falling >= TEGRA_MAX_SLEW) |
@@ -517,7 +558,7 @@ static int tegra_drive_pinmux_set_slew_falling(enum tegra_drive_pingroup pg, | |||
517 | return 0; | 558 | return 0; |
518 | } | 559 | } |
519 | 560 | ||
520 | static void tegra_drive_pinmux_config_pingroup(enum tegra_drive_pingroup pingroup, | 561 | static void tegra_drive_pinmux_config_pingroup(int pingroup, |
521 | enum tegra_hsm hsm, | 562 | enum tegra_hsm hsm, |
522 | enum tegra_schmitt schmitt, | 563 | enum tegra_schmitt schmitt, |
523 | enum tegra_drive drive, | 564 | enum tegra_drive drive, |
@@ -596,7 +637,7 @@ void tegra_pinmux_set_safe_pinmux_table(const struct tegra_pingroup_config *conf | |||
596 | for (i = 0; i < len; i++) { | 637 | for (i = 0; i < len; i++) { |
597 | int err; | 638 | int err; |
598 | c = config[i]; | 639 | c = config[i]; |
599 | if (c.pingroup < 0 || c.pingroup >= TEGRA_MAX_PINGROUP) { | 640 | if (c.pingroup < 0 || c.pingroup >= pingroup_max) { |
600 | WARN_ON(1); | 641 | WARN_ON(1); |
601 | continue; | 642 | continue; |
602 | } | 643 | } |
@@ -617,7 +658,7 @@ void tegra_pinmux_config_pinmux_table(const struct tegra_pingroup_config *config | |||
617 | for (i = 0; i < len; i++) { | 658 | for (i = 0; i < len; i++) { |
618 | int err; | 659 | int err; |
619 | if (config[i].pingroup < 0 || | 660 | if (config[i].pingroup < 0 || |
620 | config[i].pingroup >= TEGRA_MAX_PINGROUP) { | 661 | config[i].pingroup >= pingroup_max) { |
621 | WARN_ON(1); | 662 | WARN_ON(1); |
622 | continue; | 663 | continue; |
623 | } | 664 | } |
@@ -635,7 +676,7 @@ void tegra_pinmux_config_tristate_table(const struct tegra_pingroup_config *conf | |||
635 | { | 676 | { |
636 | int i; | 677 | int i; |
637 | int err; | 678 | int err; |
638 | enum tegra_pingroup pingroup; | 679 | int pingroup; |
639 | 680 | ||
640 | for (i = 0; i < len; i++) { | 681 | for (i = 0; i < len; i++) { |
641 | pingroup = config[i].pingroup; | 682 | pingroup = config[i].pingroup; |
@@ -654,7 +695,7 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *co | |||
654 | { | 695 | { |
655 | int i; | 696 | int i; |
656 | int err; | 697 | int err; |
657 | enum tegra_pingroup pingroup; | 698 | int pingroup; |
658 | 699 | ||
659 | for (i = 0; i < len; i++) { | 700 | for (i = 0; i < len; i++) { |
660 | pingroup = config[i].pingroup; | 701 | pingroup = config[i].pingroup; |
@@ -668,11 +709,36 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *co | |||
668 | } | 709 | } |
669 | } | 710 | } |
670 | 711 | ||
712 | static struct of_device_id tegra_pinmux_of_match[] __devinitdata = { | ||
713 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC | ||
714 | { .compatible = "nvidia,tegra20-pinmux", tegra20_pinmux_init }, | ||
715 | #endif | ||
716 | #ifdef CONFIG_ARCH_TEGRA_3x_SOC | ||
717 | { .compatible = "nvidia,tegra30-pinmux", tegra30_pinmux_init }, | ||
718 | #endif | ||
719 | { }, | ||
720 | }; | ||
721 | |||
671 | static int __devinit tegra_pinmux_probe(struct platform_device *pdev) | 722 | static int __devinit tegra_pinmux_probe(struct platform_device *pdev) |
672 | { | 723 | { |
673 | struct resource *res; | 724 | struct resource *res; |
674 | int i; | 725 | int i; |
675 | int config_bad = 0; | 726 | int config_bad = 0; |
727 | const struct of_device_id *match; | ||
728 | |||
729 | match = of_match_device(tegra_pinmux_of_match, &pdev->dev); | ||
730 | |||
731 | if (match) | ||
732 | ((pinmux_init)(match->data))(&pingroups, &pingroup_max, | ||
733 | &drive_pingroups, &drive_max); | ||
734 | #ifdef CONFIG_ARCH_TEGRA_2x_SOC | ||
735 | else | ||
736 | /* no device tree available, so we must be on tegra20 */ | ||
737 | tegra20_pinmux_init(&pingroups, &pingroup_max, | ||
738 | &drive_pingroups, &drive_max); | ||
739 | #else | ||
740 | pr_warn("non Tegra20 platform requires pinmux devicetree node\n"); | ||
741 | #endif | ||
676 | 742 | ||
677 | for (i = 0; ; i++) { | 743 | for (i = 0; ; i++) { |
678 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); | 744 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); |
@@ -681,7 +747,7 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev) | |||
681 | } | 747 | } |
682 | nbanks = i; | 748 | nbanks = i; |
683 | 749 | ||
684 | for (i = 0; i < TEGRA_MAX_PINGROUP; i++) { | 750 | for (i = 0; i < pingroup_max; i++) { |
685 | if (pingroups[i].tri_bank >= nbanks) { | 751 | if (pingroups[i].tri_bank >= nbanks) { |
686 | dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i); | 752 | dev_err(&pdev->dev, "pingroup %d: bad tri_bank\n", i); |
687 | config_bad = 1; | 753 | config_bad = 1; |
@@ -698,7 +764,7 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev) | |||
698 | } | 764 | } |
699 | } | 765 | } |
700 | 766 | ||
701 | for (i = 0; i < TEGRA_MAX_DRIVE_PINGROUP; i++) { | 767 | for (i = 0; i < drive_max; i++) { |
702 | if (drive_pingroups[i].reg_bank >= nbanks) { | 768 | if (drive_pingroups[i].reg_bank >= nbanks) { |
703 | dev_err(&pdev->dev, | 769 | dev_err(&pdev->dev, |
704 | "drive pingroup %d: bad reg_bank\n", i); | 770 | "drive pingroup %d: bad reg_bank\n", i); |
@@ -741,11 +807,6 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev) | |||
741 | return 0; | 807 | return 0; |
742 | } | 808 | } |
743 | 809 | ||
744 | static struct of_device_id tegra_pinmux_of_match[] __devinitdata = { | ||
745 | { .compatible = "nvidia,tegra20-pinmux", }, | ||
746 | { }, | ||
747 | }; | ||
748 | |||
749 | static struct platform_driver tegra_pinmux_driver = { | 810 | static struct platform_driver tegra_pinmux_driver = { |
750 | .driver = { | 811 | .driver = { |
751 | .name = "tegra-pinmux", | 812 | .name = "tegra-pinmux", |
@@ -779,7 +840,7 @@ static int dbg_pinmux_show(struct seq_file *s, void *unused) | |||
779 | int i; | 840 | int i; |
780 | int len; | 841 | int len; |
781 | 842 | ||
782 | for (i = 0; i < TEGRA_MAX_PINGROUP; i++) { | 843 | for (i = 0; i < pingroup_max; i++) { |
783 | unsigned long reg; | 844 | unsigned long reg; |
784 | unsigned long tri; | 845 | unsigned long tri; |
785 | unsigned long mux; | 846 | unsigned long mux; |
@@ -850,7 +911,7 @@ static int dbg_drive_pinmux_show(struct seq_file *s, void *unused) | |||
850 | int i; | 911 | int i; |
851 | int len; | 912 | int len; |
852 | 913 | ||
853 | for (i = 0; i < TEGRA_MAX_DRIVE_PINGROUP; i++) { | 914 | for (i = 0; i < drive_max; i++) { |
854 | u32 reg; | 915 | u32 reg; |
855 | 916 | ||
856 | seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s", | 917 | seq_printf(s, "\t{TEGRA_DRIVE_PINGROUP_%s", |
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c index 371869d8ea01..ff9e6b6c0460 100644 --- a/arch/arm/mach-tegra/tegra2_clocks.c +++ b/arch/arm/mach-tegra/tegra2_clocks.c | |||
@@ -174,7 +174,7 @@ static int tegra_periph_clk_enable_refcount[3 * 32]; | |||
174 | #define pmc_readl(reg) \ | 174 | #define pmc_readl(reg) \ |
175 | __raw_readl(reg_pmc_base + (reg)) | 175 | __raw_readl(reg_pmc_base + (reg)) |
176 | 176 | ||
177 | unsigned long clk_measure_input_freq(void) | 177 | static unsigned long clk_measure_input_freq(void) |
178 | { | 178 | { |
179 | u32 clock_autodetect; | 179 | u32 clock_autodetect; |
180 | clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET); | 180 | clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET); |
@@ -278,18 +278,6 @@ static struct clk_ops tegra_clk_m_ops = { | |||
278 | .disable = tegra2_clk_m_disable, | 278 | .disable = tegra2_clk_m_disable, |
279 | }; | 279 | }; |
280 | 280 | ||
281 | void tegra2_periph_reset_assert(struct clk *c) | ||
282 | { | ||
283 | BUG_ON(!c->ops->reset); | ||
284 | c->ops->reset(c, true); | ||
285 | } | ||
286 | |||
287 | void tegra2_periph_reset_deassert(struct clk *c) | ||
288 | { | ||
289 | BUG_ON(!c->ops->reset); | ||
290 | c->ops->reset(c, false); | ||
291 | } | ||
292 | |||
293 | /* super clock functions */ | 281 | /* super clock functions */ |
294 | /* "super clocks" on tegra have two-stage muxes and a clock skipping | 282 | /* "super clocks" on tegra have two-stage muxes and a clock skipping |
295 | * super divider. We will ignore the clock skipping divider, since we | 283 | * super divider. We will ignore the clock skipping divider, since we |
@@ -1132,6 +1120,9 @@ static struct clk_ops tegra_periph_clk_ops = { | |||
1132 | void tegra2_sdmmc_tap_delay(struct clk *c, int delay) | 1120 | void tegra2_sdmmc_tap_delay(struct clk *c, int delay) |
1133 | { | 1121 | { |
1134 | u32 reg; | 1122 | u32 reg; |
1123 | unsigned long flags; | ||
1124 | |||
1125 | spin_lock_irqsave(&c->spinlock, flags); | ||
1135 | 1126 | ||
1136 | delay = clamp(delay, 0, 15); | 1127 | delay = clamp(delay, 0, 15); |
1137 | reg = clk_readl(c->reg); | 1128 | reg = clk_readl(c->reg); |
@@ -1139,6 +1130,8 @@ void tegra2_sdmmc_tap_delay(struct clk *c, int delay) | |||
1139 | reg |= SDMMC_CLK_INT_FB_SEL; | 1130 | reg |= SDMMC_CLK_INT_FB_SEL; |
1140 | reg |= delay << SDMMC_CLK_INT_FB_DLY_SHIFT; | 1131 | reg |= delay << SDMMC_CLK_INT_FB_DLY_SHIFT; |
1141 | clk_writel(reg, c->reg); | 1132 | clk_writel(reg, c->reg); |
1133 | |||
1134 | spin_unlock_irqrestore(&c->spinlock, flags); | ||
1142 | } | 1135 | } |
1143 | 1136 | ||
1144 | /* External memory controller clock ops */ | 1137 | /* External memory controller clock ops */ |
diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c index e2272d263a83..6366654b54c5 100644 --- a/arch/arm/mach-tegra/timer.c +++ b/arch/arm/mach-tegra/timer.c | |||
@@ -182,20 +182,28 @@ static struct irqaction tegra_timer_irq = { | |||
182 | static void __init tegra_init_timer(void) | 182 | static void __init tegra_init_timer(void) |
183 | { | 183 | { |
184 | struct clk *clk; | 184 | struct clk *clk; |
185 | unsigned long rate = clk_measure_input_freq(); | 185 | unsigned long rate; |
186 | int ret; | 186 | int ret; |
187 | 187 | ||
188 | clk = clk_get_sys("timer", NULL); | 188 | clk = clk_get_sys("timer", NULL); |
189 | BUG_ON(IS_ERR(clk)); | 189 | if (IS_ERR(clk)) { |
190 | clk_enable(clk); | 190 | pr_warn("Unable to get timer clock." |
191 | " Assuming 12Mhz input clock.\n"); | ||
192 | rate = 12000000; | ||
193 | } else { | ||
194 | clk_enable(clk); | ||
195 | rate = clk_get_rate(clk); | ||
196 | } | ||
191 | 197 | ||
192 | /* | 198 | /* |
193 | * rtc registers are used by read_persistent_clock, keep the rtc clock | 199 | * rtc registers are used by read_persistent_clock, keep the rtc clock |
194 | * enabled | 200 | * enabled |
195 | */ | 201 | */ |
196 | clk = clk_get_sys("rtc-tegra", NULL); | 202 | clk = clk_get_sys("rtc-tegra", NULL); |
197 | BUG_ON(IS_ERR(clk)); | 203 | if (IS_ERR(clk)) |
198 | clk_enable(clk); | 204 | pr_warn("Unable to get rtc-tegra clock\n"); |
205 | else | ||
206 | clk_enable(clk); | ||
199 | 207 | ||
200 | #ifdef CONFIG_HAVE_ARM_TWD | 208 | #ifdef CONFIG_HAVE_ARM_TWD |
201 | twd_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x600); | 209 | twd_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x600); |
diff --git a/arch/arm/mach-u300/include/mach/entry-macro.S b/arch/arm/mach-u300/include/mach/entry-macro.S index 20731ae39d38..7181d6ac6651 100644 --- a/arch/arm/mach-u300/include/mach/entry-macro.S +++ b/arch/arm/mach-u300/include/mach/entry-macro.S | |||
@@ -8,33 +8,9 @@ | |||
8 | * Low-level IRQ helper macros for ST-Ericsson U300 | 8 | * Low-level IRQ helper macros for ST-Ericsson U300 |
9 | * Author: Linus Walleij <linus.walleij@stericsson.com> | 9 | * Author: Linus Walleij <linus.walleij@stericsson.com> |
10 | */ | 10 | */ |
11 | #include <mach/hardware.h> | ||
12 | #include <asm/hardware/vic.h> | ||
13 | 11 | ||
14 | .macro disable_fiq | 12 | .macro disable_fiq |
15 | .endm | 13 | .endm |
16 | 14 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 16 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON0_BASE | ||
25 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
26 | mov \irqnr, #0 | ||
27 | teq \irqstat, #0 | ||
28 | bne 1002f | ||
29 | 1001: ldr \base, = U300_AHB_PER_VIRT_BASE-U300_AHB_PER_PHYS_BASE+U300_INTCON1_BASE | ||
30 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
31 | mov \irqnr, #32 | ||
32 | teq \irqstat, #0 | ||
33 | beq 1003f | ||
34 | 1002: tst \irqstat, #1 | ||
35 | bne 1003f | ||
36 | add \irqnr, \irqnr, #1 | ||
37 | movs \irqstat, \irqstat, lsr #1 | ||
38 | bne 1002b | ||
39 | 1003: /* EQ will be set if no irqs pending */ | ||
40 | .endm | ||
diff --git a/arch/arm/mach-u300/include/mach/system.h b/arch/arm/mach-u300/include/mach/system.h index 8daf13634ce0..6b6fef7a438c 100644 --- a/arch/arm/mach-u300/include/mach/system.h +++ b/arch/arm/mach-u300/include/mach/system.h | |||
@@ -27,8 +27,6 @@ static void arch_reset(char mode, const char *cmd) | |||
27 | case 's': | 27 | case 's': |
28 | case 'h': | 28 | case 'h': |
29 | printk(KERN_CRIT "RESET: shutting down/rebooting system\n"); | 29 | printk(KERN_CRIT "RESET: shutting down/rebooting system\n"); |
30 | /* Disable interrupts */ | ||
31 | local_irq_disable(); | ||
32 | #ifdef CONFIG_COH901327_WATCHDOG | 30 | #ifdef CONFIG_COH901327_WATCHDOG |
33 | coh901327_watchdog_reset(); | 31 | coh901327_watchdog_reset(); |
34 | #endif | 32 | #endif |
diff --git a/arch/arm/mach-u300/include/mach/vmalloc.h b/arch/arm/mach-u300/include/mach/vmalloc.h deleted file mode 100644 index ec423b92b81d..000000000000 --- a/arch/arm/mach-u300/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | /* | ||
2 | * | ||
3 | * arch/arm/mach-u300/include/mach/vmalloc.h | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2006-2009 ST-Ericsson AB | ||
7 | * License terms: GNU General Public License (GPL) version 2 | ||
8 | * Virtual memory allocations | ||
9 | * End must be above the I/O registers and on an even 2MiB boundary. | ||
10 | * Author: Linus Walleij <linus.walleij@stericsson.com> | ||
11 | */ | ||
12 | #define VMALLOC_END 0xfe800000UL | ||
diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c index 89422ee7f3a8..4a4fd334eb6e 100644 --- a/arch/arm/mach-u300/u300.c +++ b/arch/arm/mach-u300/u300.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
21 | #include <mach/platform.h> | 21 | #include <mach/platform.h> |
22 | #include <asm/hardware/vic.h> | ||
22 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
24 | #include <asm/memory.h> | 25 | #include <asm/memory.h> |
@@ -49,6 +50,7 @@ MACHINE_START(U300, MACH_U300_STRING) | |||
49 | .atag_offset = BOOT_PARAMS_OFFSET, | 50 | .atag_offset = BOOT_PARAMS_OFFSET, |
50 | .map_io = u300_map_io, | 51 | .map_io = u300_map_io, |
51 | .init_irq = u300_init_irq, | 52 | .init_irq = u300_init_irq, |
53 | .handle_irq = vic_handle_irq, | ||
52 | .timer = &u300_timer, | 54 | .timer = &u300_timer, |
53 | .init_machine = u300_init_machine, | 55 | .init_machine = u300_init_machine, |
54 | MACHINE_END | 56 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index bdd7b80dd7ad..de1f5f8f7330 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/leds.h> | 33 | #include <linux/leds.h> |
34 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
36 | #include <asm/hardware/gic.h> | ||
36 | 37 | ||
37 | #include <plat/i2c.h> | 38 | #include <plat/i2c.h> |
38 | #include <plat/ste_dma40.h> | 39 | #include <plat/ste_dma40.h> |
@@ -695,6 +696,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform") | |||
695 | .init_irq = ux500_init_irq, | 696 | .init_irq = ux500_init_irq, |
696 | /* we re-use nomadik timer here */ | 697 | /* we re-use nomadik timer here */ |
697 | .timer = &ux500_timer, | 698 | .timer = &ux500_timer, |
699 | .handle_irq = gic_handle_irq, | ||
698 | .init_machine = mop500_init_machine, | 700 | .init_machine = mop500_init_machine, |
699 | MACHINE_END | 701 | MACHINE_END |
700 | 702 | ||
@@ -703,6 +705,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") | |||
703 | .map_io = u8500_map_io, | 705 | .map_io = u8500_map_io, |
704 | .init_irq = ux500_init_irq, | 706 | .init_irq = ux500_init_irq, |
705 | .timer = &ux500_timer, | 707 | .timer = &ux500_timer, |
708 | .handle_irq = gic_handle_irq, | ||
706 | .init_machine = hrefv60_init_machine, | 709 | .init_machine = hrefv60_init_machine, |
707 | MACHINE_END | 710 | MACHINE_END |
708 | 711 | ||
@@ -712,5 +715,6 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") | |||
712 | .init_irq = ux500_init_irq, | 715 | .init_irq = ux500_init_irq, |
713 | /* we re-use nomadik timer here */ | 716 | /* we re-use nomadik timer here */ |
714 | .timer = &ux500_timer, | 717 | .timer = &ux500_timer, |
718 | .handle_irq = gic_handle_irq, | ||
715 | .init_machine = snowball_init_machine, | 719 | .init_machine = snowball_init_machine, |
716 | MACHINE_END | 720 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 82025ba70c03..fe1569b67c91 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/i2c.h> | 12 | #include <linux/i2c.h> |
13 | #include <linux/mfd/ab5500/ab5500.h> | 13 | #include <linux/mfd/ab5500/ab5500.h> |
14 | 14 | ||
15 | #include <asm/hardware/gic.h> | ||
15 | #include <asm/mach/arch.h> | 16 | #include <asm/mach/arch.h> |
16 | #include <asm/mach-types.h> | 17 | #include <asm/mach-types.h> |
17 | 18 | ||
@@ -149,5 +150,6 @@ MACHINE_START(U5500, "ST-Ericsson U5500 Platform") | |||
149 | .map_io = u5500_map_io, | 150 | .map_io = u5500_map_io, |
150 | .init_irq = ux500_init_irq, | 151 | .init_irq = ux500_init_irq, |
151 | .timer = &ux500_timer, | 152 | .timer = &ux500_timer, |
153 | .handle_irq = gic_handle_irq, | ||
152 | .init_machine = u5500_init_machine, | 154 | .init_machine = u5500_init_machine, |
153 | MACHINE_END | 155 | MACHINE_END |
diff --git a/arch/arm/mach-ux500/include/mach/entry-macro.S b/arch/arm/mach-ux500/include/mach/entry-macro.S index 071bba94f727..e16299e1020a 100644 --- a/arch/arm/mach-ux500/include/mach/entry-macro.S +++ b/arch/arm/mach-ux500/include/mach/entry-macro.S | |||
@@ -10,8 +10,6 @@ | |||
10 | * License version 2. This program is licensed "as is" without any | 10 | * License version 2. This program is licensed "as is" without any |
11 | * warranty of any kind, whether express or implied. | 11 | * warranty of any kind, whether express or implied. |
12 | */ | 12 | */ |
13 | #include <mach/hardware.h> | ||
14 | #include <asm/hardware/entry-macro-gic.S> | ||
15 | 13 | ||
16 | .macro disable_fiq | 14 | .macro disable_fiq |
17 | .endm | 15 | .endm |
diff --git a/arch/arm/mach-ux500/include/mach/vmalloc.h b/arch/arm/mach-ux500/include/mach/vmalloc.h deleted file mode 100644 index a4945cb41172..000000000000 --- a/arch/arm/mach-ux500/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 ST-Ericsson | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
17 | */ | ||
18 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index e340a54251df..4d8dfc15f3e6 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
@@ -141,11 +141,6 @@ static struct map_desc versatile_io_desc[] __initdata = { | |||
141 | }, | 141 | }, |
142 | #ifdef CONFIG_MACH_VERSATILE_AB | 142 | #ifdef CONFIG_MACH_VERSATILE_AB |
143 | { | 143 | { |
144 | .virtual = IO_ADDRESS(VERSATILE_GPIO0_BASE), | ||
145 | .pfn = __phys_to_pfn(VERSATILE_GPIO0_BASE), | ||
146 | .length = SZ_4K, | ||
147 | .type = MT_DEVICE | ||
148 | }, { | ||
149 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), | 144 | .virtual = IO_ADDRESS(VERSATILE_IB2_BASE), |
150 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), | 145 | .pfn = __phys_to_pfn(VERSATILE_IB2_BASE), |
151 | .length = SZ_64M, | 146 | .length = SZ_64M, |
diff --git a/arch/arm/mach-versatile/include/mach/entry-macro.S b/arch/arm/mach-versatile/include/mach/entry-macro.S index e6f7c1663160..b6f0dbf122ee 100644 --- a/arch/arm/mach-versatile/include/mach/entry-macro.S +++ b/arch/arm/mach-versatile/include/mach/entry-macro.S | |||
@@ -7,39 +7,9 @@ | |||
7 | * License version 2. This program is licensed "as is" without any | 7 | * License version 2. This program is licensed "as is" without any |
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | #include <mach/hardware.h> | ||
11 | #include <mach/platform.h> | ||
12 | #include <asm/hardware/vic.h> | ||
13 | 10 | ||
14 | .macro disable_fiq | 11 | .macro disable_fiq |
15 | .endm | 12 | .endm |
16 | 13 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | ldr \base, =IO_ADDRESS(VERSATILE_VIC_BASE) | ||
19 | .endm | ||
20 | |||
21 | .macro arch_ret_to_user, tmp1, tmp2 | 14 | .macro arch_ret_to_user, tmp1, tmp2 |
22 | .endm | 15 | .endm |
23 | |||
24 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
25 | ldr \irqstat, [\base, #VIC_IRQ_STATUS] @ get masked status | ||
26 | mov \irqnr, #0 | ||
27 | teq \irqstat, #0 | ||
28 | beq 1003f | ||
29 | |||
30 | 1001: tst \irqstat, #15 | ||
31 | bne 1002f | ||
32 | add \irqnr, \irqnr, #4 | ||
33 | movs \irqstat, \irqstat, lsr #4 | ||
34 | bne 1001b | ||
35 | 1002: tst \irqstat, #1 | ||
36 | bne 1003f | ||
37 | add \irqnr, \irqnr, #1 | ||
38 | movs \irqstat, \irqstat, lsr #1 | ||
39 | bne 1002b | ||
40 | 1003: /* EQ will be set if no irqs pending */ | ||
41 | |||
42 | @ clz \irqnr, \irqstat | ||
43 | @1003: /* EQ will be set if we reach MAXIRQNUM */ | ||
44 | .endm | ||
45 | |||
diff --git a/arch/arm/mach-versatile/include/mach/vmalloc.h b/arch/arm/mach-versatile/include/mach/vmalloc.h deleted file mode 100644 index 7d8e069ad51b..000000000000 --- a/arch/arm/mach-versatile/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-versatile/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xd8000000UL | ||
diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index fda4866703cd..c83a1f379f7a 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
30 | #include <asm/hardware/vic.h> | ||
30 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
31 | 32 | ||
32 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
@@ -39,6 +40,7 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB") | |||
39 | .map_io = versatile_map_io, | 40 | .map_io = versatile_map_io, |
40 | .init_early = versatile_init_early, | 41 | .init_early = versatile_init_early, |
41 | .init_irq = versatile_init_irq, | 42 | .init_irq = versatile_init_irq, |
43 | .handle_irq = vic_handle_irq, | ||
42 | .timer = &versatile_timer, | 44 | .timer = &versatile_timer, |
43 | .init_machine = versatile_init, | 45 | .init_machine = versatile_init, |
44 | MACHINE_END | 46 | MACHINE_END |
diff --git a/arch/arm/mach-versatile/versatile_dt.c b/arch/arm/mach-versatile/versatile_dt.c index 54e037c090f5..f4d1e0f072c8 100644 --- a/arch/arm/mach-versatile/versatile_dt.c +++ b/arch/arm/mach-versatile/versatile_dt.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/init.h> | 24 | #include <linux/init.h> |
25 | #include <linux/of_irq.h> | 25 | #include <linux/of_irq.h> |
26 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
27 | #include <asm/hardware/vic.h> | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | 30 | ||
@@ -45,6 +46,7 @@ DT_MACHINE_START(VERSATILE_PB, "ARM-Versatile (Device Tree Support)") | |||
45 | .map_io = versatile_map_io, | 46 | .map_io = versatile_map_io, |
46 | .init_early = versatile_init_early, | 47 | .init_early = versatile_init_early, |
47 | .init_irq = versatile_init_irq, | 48 | .init_irq = versatile_init_irq, |
49 | .handle_irq = vic_handle_irq, | ||
48 | .timer = &versatile_timer, | 50 | .timer = &versatile_timer, |
49 | .init_machine = versatile_dt_init, | 51 | .init_machine = versatile_dt_init, |
50 | .dt_compat = versatile_dt_match, | 52 | .dt_compat = versatile_dt_match, |
diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index feaf9cbe60f6..4d31eeb6c101 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | 29 | ||
30 | #include <mach/hardware.h> | 30 | #include <mach/hardware.h> |
31 | #include <asm/hardware/vic.h> | ||
31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
33 | 34 | ||
@@ -107,6 +108,7 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB") | |||
107 | .map_io = versatile_map_io, | 108 | .map_io = versatile_map_io, |
108 | .init_early = versatile_init_early, | 109 | .init_early = versatile_init_early, |
109 | .init_irq = versatile_init_irq, | 110 | .init_irq = versatile_init_irq, |
111 | .handle_irq = vic_handle_irq, | ||
110 | .timer = &versatile_timer, | 112 | .timer = &versatile_timer, |
111 | .init_machine = versatile_pb_init, | 113 | .init_machine = versatile_pb_init, |
112 | MACHINE_END | 114 | MACHINE_END |
diff --git a/arch/arm/mach-vexpress/include/mach/entry-macro.S b/arch/arm/mach-vexpress/include/mach/entry-macro.S index 73c11297509e..a14f9e62ca92 100644 --- a/arch/arm/mach-vexpress/include/mach/entry-macro.S +++ b/arch/arm/mach-vexpress/include/mach/entry-macro.S | |||
@@ -1,5 +1,3 @@ | |||
1 | #include <asm/hardware/entry-macro-gic.S> | ||
2 | |||
3 | .macro disable_fiq | 1 | .macro disable_fiq |
4 | .endm | 2 | .endm |
5 | 3 | ||
diff --git a/arch/arm/mach-vexpress/include/mach/vmalloc.h b/arch/arm/mach-vexpress/include/mach/vmalloc.h deleted file mode 100644 index f43a36ef678b..000000000000 --- a/arch/arm/mach-vexpress/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,21 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vexpress/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2003 ARM Limited | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | #define VMALLOC_END 0xf8000000UL | ||
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c index 1fafc3244607..7aa07a8ce232 100644 --- a/arch/arm/mach-vexpress/v2m.c +++ b/arch/arm/mach-vexpress/v2m.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/hardware/arm_timer.h> | 23 | #include <asm/hardware/arm_timer.h> |
24 | #include <asm/hardware/timer-sp.h> | 24 | #include <asm/hardware/timer-sp.h> |
25 | #include <asm/hardware/sp810.h> | 25 | #include <asm/hardware/sp810.h> |
26 | #include <asm/hardware/gic.h> | ||
26 | 27 | ||
27 | #include <mach/ct-ca9x4.h> | 28 | #include <mach/ct-ca9x4.h> |
28 | #include <mach/motherboard.h> | 29 | #include <mach/motherboard.h> |
@@ -448,5 +449,6 @@ MACHINE_START(VEXPRESS, "ARM-Versatile Express") | |||
448 | .init_early = v2m_init_early, | 449 | .init_early = v2m_init_early, |
449 | .init_irq = v2m_init_irq, | 450 | .init_irq = v2m_init_irq, |
450 | .timer = &v2m_timer, | 451 | .timer = &v2m_timer, |
452 | .handle_irq = gic_handle_irq, | ||
451 | .init_machine = v2m_init, | 453 | .init_machine = v2m_init, |
452 | MACHINE_END | 454 | MACHINE_END |
diff --git a/arch/arm/mach-vt8500/include/mach/vmalloc.h b/arch/arm/mach-vt8500/include/mach/vmalloc.h deleted file mode 100644 index 4642290ce416..000000000000 --- a/arch/arm/mach-vt8500/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-vt8500/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (C) 2000 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 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 | #define VMALLOC_END 0xd0000000UL | ||
diff --git a/arch/arm/mach-w90x900/include/mach/system.h b/arch/arm/mach-w90x900/include/mach/system.h index ce228bdc66dd..68875a1c16be 100644 --- a/arch/arm/mach-w90x900/include/mach/system.h +++ b/arch/arm/mach-w90x900/include/mach/system.h | |||
@@ -33,7 +33,7 @@ static void arch_reset(char mode, const char *cmd) | |||
33 | { | 33 | { |
34 | if (mode == 's') { | 34 | if (mode == 's') { |
35 | /* Jump into ROM at address 0 */ | 35 | /* Jump into ROM at address 0 */ |
36 | cpu_reset(0); | 36 | soft_restart(0); |
37 | } else { | 37 | } else { |
38 | __raw_writel(WTE | WTRE | WTCLK, WTCR); | 38 | __raw_writel(WTE | WTRE | WTCLK, WTCR); |
39 | } | 39 | } |
diff --git a/arch/arm/mach-w90x900/include/mach/vmalloc.h b/arch/arm/mach-w90x900/include/mach/vmalloc.h deleted file mode 100644 index b067e44500a4..000000000000 --- a/arch/arm/mach-w90x900/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,23 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-w90x900/include/mach/vmalloc.h | ||
3 | * | ||
4 | * Copyright (c) 2008 Nuvoton technology corporation | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * Wan ZongShun <mcuos.com@gmail.com> | ||
8 | * | ||
9 | * Based on arch/arm/mach-s3c2410/include/mach/vmalloc.h | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | * | ||
16 | */ | ||
17 | |||
18 | #ifndef __ASM_ARCH_VMALLOC_H | ||
19 | #define __ASM_ARCH_VMALLOC_H | ||
20 | |||
21 | #define VMALLOC_END (0xe0000000UL) | ||
22 | |||
23 | #endif /* __ASM_ARCH_VMALLOC_H */ | ||
diff --git a/arch/arm/mach-w90x900/irq.c b/arch/arm/mach-w90x900/irq.c index 7bf143c443f1..b466e2450ba3 100644 --- a/arch/arm/mach-w90x900/irq.c +++ b/arch/arm/mach-w90x900/irq.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <mach/regs-irq.h> | 29 | #include <mach/regs-irq.h> |
30 | 30 | ||
31 | #include "nuc9xx.h" | ||
32 | |||
31 | struct group_irq { | 33 | struct group_irq { |
32 | unsigned long gpen; | 34 | unsigned long gpen; |
33 | unsigned int enabled; | 35 | unsigned int enabled; |
diff --git a/arch/arm/mach-w90x900/nuc910.h b/arch/arm/mach-w90x900/nuc910.h index 83e9ba5fc26c..b14c71a9e683 100644 --- a/arch/arm/mach-w90x900/nuc910.h +++ b/arch/arm/mach-w90x900/nuc910.h | |||
@@ -12,14 +12,7 @@ | |||
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | #include "nuc9xx.h" | |
16 | struct map_desc; | ||
17 | struct sys_timer; | ||
18 | |||
19 | /* core initialisation functions */ | ||
20 | |||
21 | extern void nuc900_init_irq(void); | ||
22 | extern struct sys_timer nuc900_timer; | ||
23 | 16 | ||
24 | /* extern file from nuc910.c */ | 17 | /* extern file from nuc910.c */ |
25 | 18 | ||
diff --git a/arch/arm/mach-w90x900/nuc950.h b/arch/arm/mach-w90x900/nuc950.h index 98a1148bc5ae..6e9de3051cd4 100644 --- a/arch/arm/mach-w90x900/nuc950.h +++ b/arch/arm/mach-w90x900/nuc950.h | |||
@@ -12,14 +12,7 @@ | |||
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | #include "nuc9xx.h" | |
16 | struct map_desc; | ||
17 | struct sys_timer; | ||
18 | |||
19 | /* core initialisation functions */ | ||
20 | |||
21 | extern void nuc900_init_irq(void); | ||
22 | extern struct sys_timer nuc900_timer; | ||
23 | 16 | ||
24 | /* extern file from nuc950.c */ | 17 | /* extern file from nuc950.c */ |
25 | 18 | ||
diff --git a/arch/arm/mach-w90x900/nuc960.h b/arch/arm/mach-w90x900/nuc960.h index f0c07cbe3a82..9f6df9a00286 100644 --- a/arch/arm/mach-w90x900/nuc960.h +++ b/arch/arm/mach-w90x900/nuc960.h | |||
@@ -12,14 +12,7 @@ | |||
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | #include "nuc9xx.h" | |
16 | struct map_desc; | ||
17 | struct sys_timer; | ||
18 | |||
19 | /* core initialisation functions */ | ||
20 | |||
21 | extern void nuc900_init_irq(void); | ||
22 | extern struct sys_timer nuc900_timer; | ||
23 | 16 | ||
24 | /* extern file from nuc960.c */ | 17 | /* extern file from nuc960.c */ |
25 | 18 | ||
diff --git a/arch/arm/mach-w90x900/nuc9xx.h b/arch/arm/mach-w90x900/nuc9xx.h new file mode 100644 index 000000000000..847c4f3e0440 --- /dev/null +++ b/arch/arm/mach-w90x900/nuc9xx.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-w90x900/nuc9xx.h | ||
3 | * | ||
4 | * Copied from nuc910.h, which had: | ||
5 | * | ||
6 | * Copyright (c) 2008 Nuvoton corporation | ||
7 | * | ||
8 | * Header file for NUC900 CPU support | ||
9 | * | ||
10 | * Wan ZongShun <mcuos.com@gmail.com> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify | ||
13 | * it under the terms of the GNU General Public License version 2 as | ||
14 | * published by the Free Software Foundation. | ||
15 | * | ||
16 | */ | ||
17 | struct map_desc; | ||
18 | struct sys_timer; | ||
19 | |||
20 | /* core initialisation functions */ | ||
21 | |||
22 | extern void nuc900_init_irq(void); | ||
23 | extern struct sys_timer nuc900_timer; | ||
diff --git a/arch/arm/mach-w90x900/time.c b/arch/arm/mach-w90x900/time.c index a2c4e2d0a0d4..fa27c498ac09 100644 --- a/arch/arm/mach-w90x900/time.c +++ b/arch/arm/mach-w90x900/time.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <mach/map.h> | 33 | #include <mach/map.h> |
34 | #include <mach/regs-timer.h> | 34 | #include <mach/regs-timer.h> |
35 | 35 | ||
36 | #include "nuc9xx.h" | ||
37 | |||
36 | #define RESETINT 0x1f | 38 | #define RESETINT 0x1f |
37 | #define PERIOD (0x01 << 27) | 39 | #define PERIOD (0x01 << 27) |
38 | #define ONESHOT (0x00 << 27) | 40 | #define ONESHOT (0x00 << 27) |
diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 73e93687b81a..ab5cfddc0d7b 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c | |||
@@ -112,6 +112,7 @@ static const char *xilinx_dt_match[] = { | |||
112 | MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") | 112 | MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") |
113 | .map_io = xilinx_map_io, | 113 | .map_io = xilinx_map_io, |
114 | .init_irq = xilinx_irq_init, | 114 | .init_irq = xilinx_irq_init, |
115 | .handle_irq = gic_handle_irq, | ||
115 | .init_machine = xilinx_init_machine, | 116 | .init_machine = xilinx_init_machine, |
116 | .timer = &xttcpss_sys_timer, | 117 | .timer = &xttcpss_sys_timer, |
117 | .dt_compat = xilinx_dt_match, | 118 | .dt_compat = xilinx_dt_match, |
diff --git a/arch/arm/mach-zynq/include/mach/entry-macro.S b/arch/arm/mach-zynq/include/mach/entry-macro.S index 3cfc01b37461..d621fb732569 100644 --- a/arch/arm/mach-zynq/include/mach/entry-macro.S +++ b/arch/arm/mach-zynq/include/mach/entry-macro.S | |||
@@ -20,9 +20,6 @@ | |||
20 | * GNU General Public License for more details. | 20 | * GNU General Public License for more details. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <mach/hardware.h> | ||
24 | #include <asm/hardware/entry-macro-gic.S> | ||
25 | |||
26 | .macro disable_fiq | 23 | .macro disable_fiq |
27 | .endm | 24 | .endm |
28 | 25 | ||
diff --git a/arch/arm/mach-zynq/include/mach/vmalloc.h b/arch/arm/mach-zynq/include/mach/vmalloc.h deleted file mode 100644 index 2398eff1e8b8..000000000000 --- a/arch/arm/mach-zynq/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* arch/arm/mach-zynq/include/mach/vmalloc.h | ||
2 | * | ||
3 | * Copyright (C) 2011 Xilinx | ||
4 | * | ||
5 | * This software is licensed under the terms of the GNU General Public | ||
6 | * License version 2, as published by the Free Software Foundation, and | ||
7 | * may be copied, distributed, and modified under those terms. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | */ | ||
14 | |||
15 | #ifndef __MACH_VMALLOC_H__ | ||
16 | #define __MACH_VMALLOC_H__ | ||
17 | |||
18 | #define VMALLOC_END 0xE0000000UL | ||
19 | |||
20 | #endif | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 67f75a0b66d6..5cf7922ff5e7 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -629,6 +629,23 @@ config IO_36 | |||
629 | 629 | ||
630 | comment "Processor Features" | 630 | comment "Processor Features" |
631 | 631 | ||
632 | config ARM_LPAE | ||
633 | bool "Support for the Large Physical Address Extension" | ||
634 | depends on MMU && CPU_V7 | ||
635 | help | ||
636 | Say Y if you have an ARMv7 processor supporting the LPAE page | ||
637 | table format and you would like to access memory beyond the | ||
638 | 4GB limit. The resulting kernel image will not run on | ||
639 | processors without the LPA extension. | ||
640 | |||
641 | If unsure, say N. | ||
642 | |||
643 | config ARCH_PHYS_ADDR_T_64BIT | ||
644 | def_bool ARM_LPAE | ||
645 | |||
646 | config ARCH_DMA_ADDR_T_64BIT | ||
647 | bool | ||
648 | |||
632 | config ARM_THUMB | 649 | config ARM_THUMB |
633 | bool "Support Thumb user binaries" | 650 | bool "Support Thumb user binaries" |
634 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON | 651 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index c335c76e0d88..caf14dc059e5 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
@@ -968,7 +968,7 @@ static int __init alignment_init(void) | |||
968 | ai_usermode = safe_usermode(ai_usermode, false); | 968 | ai_usermode = safe_usermode(ai_usermode, false); |
969 | } | 969 | } |
970 | 970 | ||
971 | hook_fault_code(1, do_alignment, SIGBUS, BUS_ADRALN, | 971 | hook_fault_code(FAULT_CODE_ALIGNMENT, do_alignment, SIGBUS, BUS_ADRALN, |
972 | "alignment exception"); | 972 | "alignment exception"); |
973 | 973 | ||
974 | /* | 974 | /* |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 93aac068da94..ee9bb363d606 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -22,6 +22,21 @@ unsigned int cpu_last_asid = ASID_FIRST_VERSION; | |||
22 | DEFINE_PER_CPU(struct mm_struct *, current_mm); | 22 | DEFINE_PER_CPU(struct mm_struct *, current_mm); |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | #ifdef CONFIG_ARM_LPAE | ||
26 | #define cpu_set_asid(asid) { \ | ||
27 | unsigned long ttbl, ttbh; \ | ||
28 | asm volatile( \ | ||
29 | " mrrc p15, 0, %0, %1, c2 @ read TTBR0\n" \ | ||
30 | " mov %1, %2, lsl #(48 - 32) @ set ASID\n" \ | ||
31 | " mcrr p15, 0, %0, %1, c2 @ set TTBR0\n" \ | ||
32 | : "=&r" (ttbl), "=&r" (ttbh) \ | ||
33 | : "r" (asid & ~ASID_MASK)); \ | ||
34 | } | ||
35 | #else | ||
36 | #define cpu_set_asid(asid) \ | ||
37 | asm(" mcr p15, 0, %0, c13, c0, 1\n" : : "r" (asid)) | ||
38 | #endif | ||
39 | |||
25 | /* | 40 | /* |
26 | * We fork()ed a process, and we need a new context for the child | 41 | * We fork()ed a process, and we need a new context for the child |
27 | * to run in. We reserve version 0 for initial tasks so we will | 42 | * to run in. We reserve version 0 for initial tasks so we will |
@@ -37,7 +52,7 @@ void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |||
37 | static void flush_context(void) | 52 | static void flush_context(void) |
38 | { | 53 | { |
39 | /* set the reserved ASID before flushing the TLB */ | 54 | /* set the reserved ASID before flushing the TLB */ |
40 | asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (0)); | 55 | cpu_set_asid(0); |
41 | isb(); | 56 | isb(); |
42 | local_flush_tlb_all(); | 57 | local_flush_tlb_all(); |
43 | if (icache_is_vivt_asid_tagged()) { | 58 | if (icache_is_vivt_asid_tagged()) { |
@@ -99,7 +114,7 @@ static void reset_context(void *info) | |||
99 | set_mm_context(mm, asid); | 114 | set_mm_context(mm, asid); |
100 | 115 | ||
101 | /* set the new ASID */ | 116 | /* set the new ASID */ |
102 | asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (mm->context.id)); | 117 | cpu_set_asid(mm->context.id); |
103 | isb(); | 118 | isb(); |
104 | } | 119 | } |
105 | 120 | ||
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index aa33949fef60..eb5520fc755f 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c | |||
@@ -27,19 +27,6 @@ | |||
27 | 27 | ||
28 | #include "fault.h" | 28 | #include "fault.h" |
29 | 29 | ||
30 | /* | ||
31 | * Fault status register encodings. We steal bit 31 for our own purposes. | ||
32 | */ | ||
33 | #define FSR_LNX_PF (1 << 31) | ||
34 | #define FSR_WRITE (1 << 11) | ||
35 | #define FSR_FS4 (1 << 10) | ||
36 | #define FSR_FS3_0 (15) | ||
37 | |||
38 | static inline int fsr_fs(unsigned int fsr) | ||
39 | { | ||
40 | return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; | ||
41 | } | ||
42 | |||
43 | #ifdef CONFIG_MMU | 30 | #ifdef CONFIG_MMU |
44 | 31 | ||
45 | #ifdef CONFIG_KPROBES | 32 | #ifdef CONFIG_KPROBES |
@@ -123,8 +110,10 @@ void show_pte(struct mm_struct *mm, unsigned long addr) | |||
123 | 110 | ||
124 | pte = pte_offset_map(pmd, addr); | 111 | pte = pte_offset_map(pmd, addr); |
125 | printk(", *pte=%08llx", (long long)pte_val(*pte)); | 112 | printk(", *pte=%08llx", (long long)pte_val(*pte)); |
113 | #ifndef CONFIG_ARM_LPAE | ||
126 | printk(", *ppte=%08llx", | 114 | printk(", *ppte=%08llx", |
127 | (long long)pte_val(pte[PTE_HWTABLE_PTRS])); | 115 | (long long)pte_val(pte[PTE_HWTABLE_PTRS])); |
116 | #endif | ||
128 | pte_unmap(pte); | 117 | pte_unmap(pte); |
129 | } while(0); | 118 | } while(0); |
130 | 119 | ||
@@ -441,6 +430,12 @@ do_translation_fault(unsigned long addr, unsigned int fsr, | |||
441 | pmd = pmd_offset(pud, addr); | 430 | pmd = pmd_offset(pud, addr); |
442 | pmd_k = pmd_offset(pud_k, addr); | 431 | pmd_k = pmd_offset(pud_k, addr); |
443 | 432 | ||
433 | #ifdef CONFIG_ARM_LPAE | ||
434 | /* | ||
435 | * Only one hardware entry per PMD with LPAE. | ||
436 | */ | ||
437 | index = 0; | ||
438 | #else | ||
444 | /* | 439 | /* |
445 | * On ARM one Linux PGD entry contains two hardware entries (see page | 440 | * On ARM one Linux PGD entry contains two hardware entries (see page |
446 | * tables layout in pgtable.h). We normally guarantee that we always | 441 | * tables layout in pgtable.h). We normally guarantee that we always |
@@ -450,6 +445,7 @@ do_translation_fault(unsigned long addr, unsigned int fsr, | |||
450 | * for the first of pair. | 445 | * for the first of pair. |
451 | */ | 446 | */ |
452 | index = (addr >> SECTION_SHIFT) & 1; | 447 | index = (addr >> SECTION_SHIFT) & 1; |
448 | #endif | ||
453 | if (pmd_none(pmd_k[index])) | 449 | if (pmd_none(pmd_k[index])) |
454 | goto bad_area; | 450 | goto bad_area; |
455 | 451 | ||
@@ -489,55 +485,20 @@ do_bad(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
489 | return 1; | 485 | return 1; |
490 | } | 486 | } |
491 | 487 | ||
492 | static struct fsr_info { | 488 | struct fsr_info { |
493 | int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | 489 | int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs); |
494 | int sig; | 490 | int sig; |
495 | int code; | 491 | int code; |
496 | const char *name; | 492 | const char *name; |
497 | } fsr_info[] = { | ||
498 | /* | ||
499 | * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 | ||
500 | * defines these to be "precise" aborts. | ||
501 | */ | ||
502 | { do_bad, SIGSEGV, 0, "vector exception" }, | ||
503 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
504 | { do_bad, SIGKILL, 0, "terminal exception" }, | ||
505 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
506 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
507 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
508 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
509 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
510 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
511 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
512 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
513 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
514 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
515 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
516 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
517 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
518 | /* | ||
519 | * The following are "imprecise" aborts, which are signalled by bit | ||
520 | * 10 of the FSR, and may not be recoverable. These are only | ||
521 | * supported if the CPU abort handler supports bit 10. | ||
522 | */ | ||
523 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
524 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
525 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
526 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
527 | { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ | ||
528 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
529 | { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ | ||
530 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
531 | { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ | ||
532 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
533 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
534 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
535 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
536 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
537 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
538 | { do_bad, SIGBUS, 0, "unknown 31" } | ||
539 | }; | 493 | }; |
540 | 494 | ||
495 | /* FSR definition */ | ||
496 | #ifdef CONFIG_ARM_LPAE | ||
497 | #include "fsr-3level.c" | ||
498 | #else | ||
499 | #include "fsr-2level.c" | ||
500 | #endif | ||
501 | |||
541 | void __init | 502 | void __init |
542 | hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), | 503 | hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), |
543 | int sig, int code, const char *name) | 504 | int sig, int code, const char *name) |
@@ -573,42 +534,6 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
573 | arm_notify_die("", regs, &info, fsr, 0); | 534 | arm_notify_die("", regs, &info, fsr, 0); |
574 | } | 535 | } |
575 | 536 | ||
576 | |||
577 | static struct fsr_info ifsr_info[] = { | ||
578 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
579 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
580 | { do_bad, SIGBUS, 0, "debug event" }, | ||
581 | { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, | ||
582 | { do_bad, SIGBUS, 0, "unknown 4" }, | ||
583 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
584 | { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, | ||
585 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
586 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
587 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
588 | { do_bad, SIGBUS, 0, "unknown 10" }, | ||
589 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
590 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
591 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
592 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
593 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
594 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
595 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
596 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
597 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
598 | { do_bad, SIGBUS, 0, "unknown 20" }, | ||
599 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
600 | { do_bad, SIGBUS, 0, "unknown 22" }, | ||
601 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
602 | { do_bad, SIGBUS, 0, "unknown 24" }, | ||
603 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
604 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
605 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
606 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
607 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
608 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
609 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
610 | }; | ||
611 | |||
612 | void __init | 537 | void __init |
613 | hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), | 538 | hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *), |
614 | int sig, int code, const char *name) | 539 | int sig, int code, const char *name) |
@@ -641,6 +566,7 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) | |||
641 | arm_notify_die("", regs, &info, ifsr, 0); | 566 | arm_notify_die("", regs, &info, ifsr, 0); |
642 | } | 567 | } |
643 | 568 | ||
569 | #ifndef CONFIG_ARM_LPAE | ||
644 | static int __init exceptions_init(void) | 570 | static int __init exceptions_init(void) |
645 | { | 571 | { |
646 | if (cpu_architecture() >= CPU_ARCH_ARMv6) { | 572 | if (cpu_architecture() >= CPU_ARCH_ARMv6) { |
@@ -663,3 +589,4 @@ static int __init exceptions_init(void) | |||
663 | } | 589 | } |
664 | 590 | ||
665 | arch_initcall(exceptions_init); | 591 | arch_initcall(exceptions_init); |
592 | #endif | ||
diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h index 49e9e3804de4..cf08bdfbe0d6 100644 --- a/arch/arm/mm/fault.h +++ b/arch/arm/mm/fault.h | |||
@@ -1,3 +1,28 @@ | |||
1 | void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | 1 | #ifndef __ARCH_ARM_FAULT_H |
2 | #define __ARCH_ARM_FAULT_H | ||
3 | |||
4 | /* | ||
5 | * Fault status register encodings. We steal bit 31 for our own purposes. | ||
6 | */ | ||
7 | #define FSR_LNX_PF (1 << 31) | ||
8 | #define FSR_WRITE (1 << 11) | ||
9 | #define FSR_FS4 (1 << 10) | ||
10 | #define FSR_FS3_0 (15) | ||
11 | #define FSR_FS5_0 (0x3f) | ||
12 | |||
13 | #ifdef CONFIG_ARM_LPAE | ||
14 | static inline int fsr_fs(unsigned int fsr) | ||
15 | { | ||
16 | return fsr & FSR_FS5_0; | ||
17 | } | ||
18 | #else | ||
19 | static inline int fsr_fs(unsigned int fsr) | ||
20 | { | ||
21 | return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6; | ||
22 | } | ||
23 | #endif | ||
2 | 24 | ||
25 | void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs); | ||
3 | unsigned long search_exception_table(unsigned long addr); | 26 | unsigned long search_exception_table(unsigned long addr); |
27 | |||
28 | #endif /* __ARCH_ARM_FAULT_H */ | ||
diff --git a/arch/arm/mm/fsr-2level.c b/arch/arm/mm/fsr-2level.c new file mode 100644 index 000000000000..18ca74c0f341 --- /dev/null +++ b/arch/arm/mm/fsr-2level.c | |||
@@ -0,0 +1,78 @@ | |||
1 | static struct fsr_info fsr_info[] = { | ||
2 | /* | ||
3 | * The following are the standard ARMv3 and ARMv4 aborts. ARMv5 | ||
4 | * defines these to be "precise" aborts. | ||
5 | */ | ||
6 | { do_bad, SIGSEGV, 0, "vector exception" }, | ||
7 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
8 | { do_bad, SIGKILL, 0, "terminal exception" }, | ||
9 | { do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, | ||
10 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
11 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
12 | { do_bad, SIGBUS, 0, "external abort on linefetch" }, | ||
13 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
14 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
15 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
16 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
17 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
18 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
19 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
20 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
21 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
22 | /* | ||
23 | * The following are "imprecise" aborts, which are signalled by bit | ||
24 | * 10 of the FSR, and may not be recoverable. These are only | ||
25 | * supported if the CPU abort handler supports bit 10. | ||
26 | */ | ||
27 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
28 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
29 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
30 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
31 | { do_bad, SIGBUS, 0, "lock abort" }, /* xscale */ | ||
32 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
33 | { do_bad, SIGBUS, BUS_OBJERR, "imprecise external abort" }, /* xscale */ | ||
34 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
35 | { do_bad, SIGBUS, 0, "dcache parity error" }, /* xscale */ | ||
36 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
37 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
38 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
39 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
40 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
41 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
42 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
43 | }; | ||
44 | |||
45 | static struct fsr_info ifsr_info[] = { | ||
46 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
47 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
48 | { do_bad, SIGBUS, 0, "debug event" }, | ||
49 | { do_bad, SIGSEGV, SEGV_ACCERR, "section access flag fault" }, | ||
50 | { do_bad, SIGBUS, 0, "unknown 4" }, | ||
51 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, | ||
52 | { do_bad, SIGSEGV, SEGV_ACCERR, "page access flag fault" }, | ||
53 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, | ||
54 | { do_bad, SIGBUS, 0, "external abort on non-linefetch" }, | ||
55 | { do_bad, SIGSEGV, SEGV_ACCERR, "section domain fault" }, | ||
56 | { do_bad, SIGBUS, 0, "unknown 10" }, | ||
57 | { do_bad, SIGSEGV, SEGV_ACCERR, "page domain fault" }, | ||
58 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
59 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "section permission fault" }, | ||
60 | { do_bad, SIGBUS, 0, "external abort on translation" }, | ||
61 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "page permission fault" }, | ||
62 | { do_bad, SIGBUS, 0, "unknown 16" }, | ||
63 | { do_bad, SIGBUS, 0, "unknown 17" }, | ||
64 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
65 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
66 | { do_bad, SIGBUS, 0, "unknown 20" }, | ||
67 | { do_bad, SIGBUS, 0, "unknown 21" }, | ||
68 | { do_bad, SIGBUS, 0, "unknown 22" }, | ||
69 | { do_bad, SIGBUS, 0, "unknown 23" }, | ||
70 | { do_bad, SIGBUS, 0, "unknown 24" }, | ||
71 | { do_bad, SIGBUS, 0, "unknown 25" }, | ||
72 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
73 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
74 | { do_bad, SIGBUS, 0, "unknown 28" }, | ||
75 | { do_bad, SIGBUS, 0, "unknown 29" }, | ||
76 | { do_bad, SIGBUS, 0, "unknown 30" }, | ||
77 | { do_bad, SIGBUS, 0, "unknown 31" }, | ||
78 | }; | ||
diff --git a/arch/arm/mm/fsr-3level.c b/arch/arm/mm/fsr-3level.c new file mode 100644 index 000000000000..05a4e9431836 --- /dev/null +++ b/arch/arm/mm/fsr-3level.c | |||
@@ -0,0 +1,68 @@ | |||
1 | static struct fsr_info fsr_info[] = { | ||
2 | { do_bad, SIGBUS, 0, "unknown 0" }, | ||
3 | { do_bad, SIGBUS, 0, "unknown 1" }, | ||
4 | { do_bad, SIGBUS, 0, "unknown 2" }, | ||
5 | { do_bad, SIGBUS, 0, "unknown 3" }, | ||
6 | { do_bad, SIGBUS, 0, "reserved translation fault" }, | ||
7 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 1 translation fault" }, | ||
8 | { do_translation_fault, SIGSEGV, SEGV_MAPERR, "level 2 translation fault" }, | ||
9 | { do_page_fault, SIGSEGV, SEGV_MAPERR, "level 3 translation fault" }, | ||
10 | { do_bad, SIGBUS, 0, "reserved access flag fault" }, | ||
11 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 1 access flag fault" }, | ||
12 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 2 access flag fault" }, | ||
13 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "level 3 access flag fault" }, | ||
14 | { do_bad, SIGBUS, 0, "reserved permission fault" }, | ||
15 | { do_bad, SIGSEGV, SEGV_ACCERR, "level 1 permission fault" }, | ||
16 | { do_sect_fault, SIGSEGV, SEGV_ACCERR, "level 2 permission fault" }, | ||
17 | { do_page_fault, SIGSEGV, SEGV_ACCERR, "level 3 permission fault" }, | ||
18 | { do_bad, SIGBUS, 0, "synchronous external abort" }, | ||
19 | { do_bad, SIGBUS, 0, "asynchronous external abort" }, | ||
20 | { do_bad, SIGBUS, 0, "unknown 18" }, | ||
21 | { do_bad, SIGBUS, 0, "unknown 19" }, | ||
22 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
23 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
24 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
25 | { do_bad, SIGBUS, 0, "synchronous abort (translation table walk)" }, | ||
26 | { do_bad, SIGBUS, 0, "synchronous parity error" }, | ||
27 | { do_bad, SIGBUS, 0, "asynchronous parity error" }, | ||
28 | { do_bad, SIGBUS, 0, "unknown 26" }, | ||
29 | { do_bad, SIGBUS, 0, "unknown 27" }, | ||
30 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
31 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
32 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
33 | { do_bad, SIGBUS, 0, "synchronous parity error (translation table walk" }, | ||
34 | { do_bad, SIGBUS, 0, "unknown 32" }, | ||
35 | { do_bad, SIGBUS, BUS_ADRALN, "alignment fault" }, | ||
36 | { do_bad, SIGBUS, 0, "debug event" }, | ||
37 | { do_bad, SIGBUS, 0, "unknown 35" }, | ||
38 | { do_bad, SIGBUS, 0, "unknown 36" }, | ||
39 | { do_bad, SIGBUS, 0, "unknown 37" }, | ||
40 | { do_bad, SIGBUS, 0, "unknown 38" }, | ||
41 | { do_bad, SIGBUS, 0, "unknown 39" }, | ||
42 | { do_bad, SIGBUS, 0, "unknown 40" }, | ||
43 | { do_bad, SIGBUS, 0, "unknown 41" }, | ||
44 | { do_bad, SIGBUS, 0, "unknown 42" }, | ||
45 | { do_bad, SIGBUS, 0, "unknown 43" }, | ||
46 | { do_bad, SIGBUS, 0, "unknown 44" }, | ||
47 | { do_bad, SIGBUS, 0, "unknown 45" }, | ||
48 | { do_bad, SIGBUS, 0, "unknown 46" }, | ||
49 | { do_bad, SIGBUS, 0, "unknown 47" }, | ||
50 | { do_bad, SIGBUS, 0, "unknown 48" }, | ||
51 | { do_bad, SIGBUS, 0, "unknown 49" }, | ||
52 | { do_bad, SIGBUS, 0, "unknown 50" }, | ||
53 | { do_bad, SIGBUS, 0, "unknown 51" }, | ||
54 | { do_bad, SIGBUS, 0, "implementation fault (lockdown abort)" }, | ||
55 | { do_bad, SIGBUS, 0, "unknown 53" }, | ||
56 | { do_bad, SIGBUS, 0, "unknown 54" }, | ||
57 | { do_bad, SIGBUS, 0, "unknown 55" }, | ||
58 | { do_bad, SIGBUS, 0, "unknown 56" }, | ||
59 | { do_bad, SIGBUS, 0, "unknown 57" }, | ||
60 | { do_bad, SIGBUS, 0, "implementation fault (coprocessor abort)" }, | ||
61 | { do_bad, SIGBUS, 0, "unknown 59" }, | ||
62 | { do_bad, SIGBUS, 0, "unknown 60" }, | ||
63 | { do_bad, SIGBUS, 0, "unknown 61" }, | ||
64 | { do_bad, SIGBUS, 0, "unknown 62" }, | ||
65 | { do_bad, SIGBUS, 0, "unknown 63" }, | ||
66 | }; | ||
67 | |||
68 | #define ifsr_info fsr_info | ||
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index 2be9139a4ef3..feacf4c76712 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c | |||
@@ -1,9 +1,38 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | 2 | ||
3 | #include <asm/cputype.h> | 3 | #include <asm/cputype.h> |
4 | #include <asm/idmap.h> | ||
4 | #include <asm/pgalloc.h> | 5 | #include <asm/pgalloc.h> |
5 | #include <asm/pgtable.h> | 6 | #include <asm/pgtable.h> |
7 | #include <asm/sections.h> | ||
6 | 8 | ||
9 | pgd_t *idmap_pgd; | ||
10 | |||
11 | #ifdef CONFIG_ARM_LPAE | ||
12 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | ||
13 | unsigned long prot) | ||
14 | { | ||
15 | pmd_t *pmd; | ||
16 | unsigned long next; | ||
17 | |||
18 | if (pud_none_or_clear_bad(pud) || (pud_val(*pud) & L_PGD_SWAPPER)) { | ||
19 | pmd = pmd_alloc_one(&init_mm, addr); | ||
20 | if (!pmd) { | ||
21 | pr_warning("Failed to allocate identity pmd.\n"); | ||
22 | return; | ||
23 | } | ||
24 | pud_populate(&init_mm, pud, pmd); | ||
25 | pmd += pmd_index(addr); | ||
26 | } else | ||
27 | pmd = pmd_offset(pud, addr); | ||
28 | |||
29 | do { | ||
30 | next = pmd_addr_end(addr, end); | ||
31 | *pmd = __pmd((addr & PMD_MASK) | prot); | ||
32 | flush_pmd_entry(pmd); | ||
33 | } while (pmd++, addr = next, addr != end); | ||
34 | } | ||
35 | #else /* !CONFIG_ARM_LPAE */ | ||
7 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | 36 | static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, |
8 | unsigned long prot) | 37 | unsigned long prot) |
9 | { | 38 | { |
@@ -15,6 +44,7 @@ static void idmap_add_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
15 | pmd[1] = __pmd(addr); | 44 | pmd[1] = __pmd(addr); |
16 | flush_pmd_entry(pmd); | 45 | flush_pmd_entry(pmd); |
17 | } | 46 | } |
47 | #endif /* CONFIG_ARM_LPAE */ | ||
18 | 48 | ||
19 | static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | 49 | static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, |
20 | unsigned long prot) | 50 | unsigned long prot) |
@@ -28,11 +58,11 @@ static void idmap_add_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | |||
28 | } while (pud++, addr = next, addr != end); | 58 | } while (pud++, addr = next, addr != end); |
29 | } | 59 | } |
30 | 60 | ||
31 | void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) | 61 | static void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) |
32 | { | 62 | { |
33 | unsigned long prot, next; | 63 | unsigned long prot, next; |
34 | 64 | ||
35 | prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE; | 65 | prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF; |
36 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) | 66 | if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) |
37 | prot |= PMD_BIT4; | 67 | prot |= PMD_BIT4; |
38 | 68 | ||
@@ -43,48 +73,41 @@ void identity_mapping_add(pgd_t *pgd, unsigned long addr, unsigned long end) | |||
43 | } while (pgd++, addr = next, addr != end); | 73 | } while (pgd++, addr = next, addr != end); |
44 | } | 74 | } |
45 | 75 | ||
46 | #ifdef CONFIG_SMP | 76 | extern char __idmap_text_start[], __idmap_text_end[]; |
47 | static void idmap_del_pmd(pud_t *pud, unsigned long addr, unsigned long end) | ||
48 | { | ||
49 | pmd_t *pmd = pmd_offset(pud, addr); | ||
50 | pmd_clear(pmd); | ||
51 | } | ||
52 | 77 | ||
53 | static void idmap_del_pud(pgd_t *pgd, unsigned long addr, unsigned long end) | 78 | static int __init init_static_idmap(void) |
54 | { | 79 | { |
55 | pud_t *pud = pud_offset(pgd, addr); | 80 | phys_addr_t idmap_start, idmap_end; |
56 | unsigned long next; | ||
57 | 81 | ||
58 | do { | 82 | idmap_pgd = pgd_alloc(&init_mm); |
59 | next = pud_addr_end(addr, end); | 83 | if (!idmap_pgd) |
60 | idmap_del_pmd(pud, addr, next); | 84 | return -ENOMEM; |
61 | } while (pud++, addr = next, addr != end); | ||
62 | } | ||
63 | 85 | ||
64 | void identity_mapping_del(pgd_t *pgd, unsigned long addr, unsigned long end) | 86 | /* Add an identity mapping for the physical address of the section. */ |
65 | { | 87 | idmap_start = virt_to_phys((void *)__idmap_text_start); |
66 | unsigned long next; | 88 | idmap_end = virt_to_phys((void *)__idmap_text_end); |
67 | 89 | ||
68 | pgd += pgd_index(addr); | 90 | pr_info("Setting up static identity map for 0x%llx - 0x%llx\n", |
69 | do { | 91 | (long long)idmap_start, (long long)idmap_end); |
70 | next = pgd_addr_end(addr, end); | 92 | identity_mapping_add(idmap_pgd, idmap_start, idmap_end); |
71 | idmap_del_pud(pgd, addr, next); | 93 | |
72 | } while (pgd++, addr = next, addr != end); | 94 | return 0; |
73 | } | 95 | } |
74 | #endif | 96 | early_initcall(init_static_idmap); |
75 | 97 | ||
76 | /* | 98 | /* |
77 | * In order to soft-boot, we need to insert a 1:1 mapping in place of | 99 | * In order to soft-boot, we need to switch to a 1:1 mapping for the |
78 | * the user-mode pages. This will then ensure that we have predictable | 100 | * cpu_reset functions. This will then ensure that we have predictable |
79 | * results when turning the mmu off | 101 | * results when turning off the mmu. |
80 | */ | 102 | */ |
81 | void setup_mm_for_reboot(char mode) | 103 | void setup_mm_for_reboot(void) |
82 | { | 104 | { |
83 | /* | 105 | /* Clean and invalidate L1. */ |
84 | * We need to access to user-mode page tables here. For kernel threads | 106 | flush_cache_all(); |
85 | * we don't have any user-mode mappings so we use the context that we | 107 | |
86 | * "borrowed". | 108 | /* Switch to the identity mapping. */ |
87 | */ | 109 | cpu_switch_mm(idmap_pgd, &init_mm); |
88 | identity_mapping_add(current->active_mm->pgd, 0, TASK_SIZE); | 110 | |
111 | /* Flush the TLB. */ | ||
89 | local_flush_tlb_all(); | 112 | local_flush_tlb_all(); |
90 | } | 113 | } |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index fbdd12ea3a58..786adddf1a86 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/highmem.h> | 20 | #include <linux/highmem.h> |
21 | #include <linux/gfp.h> | 21 | #include <linux/gfp.h> |
22 | #include <linux/memblock.h> | 22 | #include <linux/memblock.h> |
23 | #include <linux/sort.h> | ||
24 | 23 | ||
25 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
26 | #include <asm/prom.h> | 25 | #include <asm/prom.h> |
@@ -134,30 +133,18 @@ void show_mem(unsigned int filter) | |||
134 | } | 133 | } |
135 | 134 | ||
136 | static void __init find_limits(unsigned long *min, unsigned long *max_low, | 135 | static void __init find_limits(unsigned long *min, unsigned long *max_low, |
137 | unsigned long *max_high) | 136 | unsigned long *max_high) |
138 | { | 137 | { |
139 | struct meminfo *mi = &meminfo; | 138 | struct meminfo *mi = &meminfo; |
140 | int i; | 139 | int i; |
141 | 140 | ||
142 | *min = -1UL; | 141 | /* This assumes the meminfo array is properly sorted */ |
143 | *max_low = *max_high = 0; | 142 | *min = bank_pfn_start(&mi->bank[0]); |
144 | 143 | for_each_bank (i, mi) | |
145 | for_each_bank (i, mi) { | 144 | if (mi->bank[i].highmem) |
146 | struct membank *bank = &mi->bank[i]; | 145 | break; |
147 | unsigned long start, end; | 146 | *max_low = bank_pfn_end(&mi->bank[i - 1]); |
148 | 147 | *max_high = bank_pfn_end(&mi->bank[mi->nr_banks - 1]); | |
149 | start = bank_pfn_start(bank); | ||
150 | end = bank_pfn_end(bank); | ||
151 | |||
152 | if (*min > start) | ||
153 | *min = start; | ||
154 | if (*max_high < end) | ||
155 | *max_high = end; | ||
156 | if (bank->highmem) | ||
157 | continue; | ||
158 | if (*max_low < end) | ||
159 | *max_low = end; | ||
160 | } | ||
161 | } | 148 | } |
162 | 149 | ||
163 | static void __init arm_bootmem_init(unsigned long start_pfn, | 150 | static void __init arm_bootmem_init(unsigned long start_pfn, |
@@ -319,19 +306,10 @@ static void arm_memory_present(void) | |||
319 | } | 306 | } |
320 | #endif | 307 | #endif |
321 | 308 | ||
322 | static int __init meminfo_cmp(const void *_a, const void *_b) | ||
323 | { | ||
324 | const struct membank *a = _a, *b = _b; | ||
325 | long cmp = bank_pfn_start(a) - bank_pfn_start(b); | ||
326 | return cmp < 0 ? -1 : cmp > 0 ? 1 : 0; | ||
327 | } | ||
328 | |||
329 | void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | 309 | void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) |
330 | { | 310 | { |
331 | int i; | 311 | int i; |
332 | 312 | ||
333 | sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL); | ||
334 | |||
335 | memblock_init(); | 313 | memblock_init(); |
336 | for (i = 0; i < mi->nr_banks; i++) | 314 | for (i = 0; i < mi->nr_banks; i++) |
337 | memblock_add(mi->bank[i].start, mi->bank[i].size); | 315 | memblock_add(mi->bank[i].start, mi->bank[i].size); |
@@ -403,8 +381,6 @@ void __init bootmem_init(void) | |||
403 | */ | 381 | */ |
404 | arm_bootmem_free(min, max_low, max_high); | 382 | arm_bootmem_free(min, max_low, max_high); |
405 | 383 | ||
406 | high_memory = __va(((phys_addr_t)max_low << PAGE_SHIFT) - 1) + 1; | ||
407 | |||
408 | /* | 384 | /* |
409 | * This doesn't seem to be used by the Linux memory manager any | 385 | * This doesn't seem to be used by the Linux memory manager any |
410 | * more, but is used by ll_rw_block. If we can get rid of it, we | 386 | * more, but is used by ll_rw_block. If we can get rid of it, we |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index bdb248c4f55c..80632e8d7538 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -36,12 +36,6 @@ | |||
36 | #include <asm/mach/map.h> | 36 | #include <asm/mach/map.h> |
37 | #include "mm.h" | 37 | #include "mm.h" |
38 | 38 | ||
39 | /* | ||
40 | * Used by ioremap() and iounmap() code to mark (super)section-mapped | ||
41 | * I/O regions in vm_struct->flags field. | ||
42 | */ | ||
43 | #define VM_ARM_SECTION_MAPPING 0x80000000 | ||
44 | |||
45 | int ioremap_page(unsigned long virt, unsigned long phys, | 39 | int ioremap_page(unsigned long virt, unsigned long phys, |
46 | const struct mem_type *mtype) | 40 | const struct mem_type *mtype) |
47 | { | 41 | { |
@@ -64,7 +58,7 @@ void __check_kvm_seq(struct mm_struct *mm) | |||
64 | } while (seq != init_mm.context.kvm_seq); | 58 | } while (seq != init_mm.context.kvm_seq); |
65 | } | 59 | } |
66 | 60 | ||
67 | #ifndef CONFIG_SMP | 61 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
68 | /* | 62 | /* |
69 | * Section support is unsafe on SMP - If you iounmap and ioremap a region, | 63 | * Section support is unsafe on SMP - If you iounmap and ioremap a region, |
70 | * the other CPUs will not see this change until their next context switch. | 64 | * the other CPUs will not see this change until their next context switch. |
@@ -79,13 +73,16 @@ static void unmap_area_sections(unsigned long virt, unsigned long size) | |||
79 | { | 73 | { |
80 | unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); | 74 | unsigned long addr = virt, end = virt + (size & ~(SZ_1M - 1)); |
81 | pgd_t *pgd; | 75 | pgd_t *pgd; |
76 | pud_t *pud; | ||
77 | pmd_t *pmdp; | ||
82 | 78 | ||
83 | flush_cache_vunmap(addr, end); | 79 | flush_cache_vunmap(addr, end); |
84 | pgd = pgd_offset_k(addr); | 80 | pgd = pgd_offset_k(addr); |
81 | pud = pud_offset(pgd, addr); | ||
82 | pmdp = pmd_offset(pud, addr); | ||
85 | do { | 83 | do { |
86 | pmd_t pmd, *pmdp = pmd_offset(pgd, addr); | 84 | pmd_t pmd = *pmdp; |
87 | 85 | ||
88 | pmd = *pmdp; | ||
89 | if (!pmd_none(pmd)) { | 86 | if (!pmd_none(pmd)) { |
90 | /* | 87 | /* |
91 | * Clear the PMD from the page table, and | 88 | * Clear the PMD from the page table, and |
@@ -104,8 +101,8 @@ static void unmap_area_sections(unsigned long virt, unsigned long size) | |||
104 | pte_free_kernel(&init_mm, pmd_page_vaddr(pmd)); | 101 | pte_free_kernel(&init_mm, pmd_page_vaddr(pmd)); |
105 | } | 102 | } |
106 | 103 | ||
107 | addr += PGDIR_SIZE; | 104 | addr += PMD_SIZE; |
108 | pgd++; | 105 | pmdp += 2; |
109 | } while (addr < end); | 106 | } while (addr < end); |
110 | 107 | ||
111 | /* | 108 | /* |
@@ -124,6 +121,8 @@ remap_area_sections(unsigned long virt, unsigned long pfn, | |||
124 | { | 121 | { |
125 | unsigned long addr = virt, end = virt + size; | 122 | unsigned long addr = virt, end = virt + size; |
126 | pgd_t *pgd; | 123 | pgd_t *pgd; |
124 | pud_t *pud; | ||
125 | pmd_t *pmd; | ||
127 | 126 | ||
128 | /* | 127 | /* |
129 | * Remove and free any PTE-based mapping, and | 128 | * Remove and free any PTE-based mapping, and |
@@ -132,17 +131,17 @@ remap_area_sections(unsigned long virt, unsigned long pfn, | |||
132 | unmap_area_sections(virt, size); | 131 | unmap_area_sections(virt, size); |
133 | 132 | ||
134 | pgd = pgd_offset_k(addr); | 133 | pgd = pgd_offset_k(addr); |
134 | pud = pud_offset(pgd, addr); | ||
135 | pmd = pmd_offset(pud, addr); | ||
135 | do { | 136 | do { |
136 | pmd_t *pmd = pmd_offset(pgd, addr); | ||
137 | |||
138 | pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); | 137 | pmd[0] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); |
139 | pfn += SZ_1M >> PAGE_SHIFT; | 138 | pfn += SZ_1M >> PAGE_SHIFT; |
140 | pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); | 139 | pmd[1] = __pmd(__pfn_to_phys(pfn) | type->prot_sect); |
141 | pfn += SZ_1M >> PAGE_SHIFT; | 140 | pfn += SZ_1M >> PAGE_SHIFT; |
142 | flush_pmd_entry(pmd); | 141 | flush_pmd_entry(pmd); |
143 | 142 | ||
144 | addr += PGDIR_SIZE; | 143 | addr += PMD_SIZE; |
145 | pgd++; | 144 | pmd += 2; |
146 | } while (addr < end); | 145 | } while (addr < end); |
147 | 146 | ||
148 | return 0; | 147 | return 0; |
@@ -154,6 +153,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
154 | { | 153 | { |
155 | unsigned long addr = virt, end = virt + size; | 154 | unsigned long addr = virt, end = virt + size; |
156 | pgd_t *pgd; | 155 | pgd_t *pgd; |
156 | pud_t *pud; | ||
157 | pmd_t *pmd; | ||
157 | 158 | ||
158 | /* | 159 | /* |
159 | * Remove and free any PTE-based mapping, and | 160 | * Remove and free any PTE-based mapping, and |
@@ -162,6 +163,8 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
162 | unmap_area_sections(virt, size); | 163 | unmap_area_sections(virt, size); |
163 | 164 | ||
164 | pgd = pgd_offset_k(virt); | 165 | pgd = pgd_offset_k(virt); |
166 | pud = pud_offset(pgd, addr); | ||
167 | pmd = pmd_offset(pud, addr); | ||
165 | do { | 168 | do { |
166 | unsigned long super_pmd_val, i; | 169 | unsigned long super_pmd_val, i; |
167 | 170 | ||
@@ -170,14 +173,12 @@ remap_area_supersections(unsigned long virt, unsigned long pfn, | |||
170 | super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; | 173 | super_pmd_val |= ((pfn >> (32 - PAGE_SHIFT)) & 0xf) << 20; |
171 | 174 | ||
172 | for (i = 0; i < 8; i++) { | 175 | for (i = 0; i < 8; i++) { |
173 | pmd_t *pmd = pmd_offset(pgd, addr); | ||
174 | |||
175 | pmd[0] = __pmd(super_pmd_val); | 176 | pmd[0] = __pmd(super_pmd_val); |
176 | pmd[1] = __pmd(super_pmd_val); | 177 | pmd[1] = __pmd(super_pmd_val); |
177 | flush_pmd_entry(pmd); | 178 | flush_pmd_entry(pmd); |
178 | 179 | ||
179 | addr += PGDIR_SIZE; | 180 | addr += PMD_SIZE; |
180 | pgd++; | 181 | pmd += 2; |
181 | } | 182 | } |
182 | 183 | ||
183 | pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; | 184 | pfn += SUPERSECTION_SIZE >> PAGE_SHIFT; |
@@ -195,17 +196,13 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
195 | unsigned long addr; | 196 | unsigned long addr; |
196 | struct vm_struct * area; | 197 | struct vm_struct * area; |
197 | 198 | ||
199 | #ifndef CONFIG_ARM_LPAE | ||
198 | /* | 200 | /* |
199 | * High mappings must be supersection aligned | 201 | * High mappings must be supersection aligned |
200 | */ | 202 | */ |
201 | if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) | 203 | if (pfn >= 0x100000 && (__pfn_to_phys(pfn) & ~SUPERSECTION_MASK)) |
202 | return NULL; | 204 | return NULL; |
203 | 205 | #endif | |
204 | /* | ||
205 | * Don't allow RAM to be mapped - this causes problems with ARMv6+ | ||
206 | */ | ||
207 | if (WARN_ON(pfn_valid(pfn))) | ||
208 | return NULL; | ||
209 | 206 | ||
210 | type = get_mem_type(mtype); | 207 | type = get_mem_type(mtype); |
211 | if (!type) | 208 | if (!type) |
@@ -216,12 +213,40 @@ void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn, | |||
216 | */ | 213 | */ |
217 | size = PAGE_ALIGN(offset + size); | 214 | size = PAGE_ALIGN(offset + size); |
218 | 215 | ||
216 | /* | ||
217 | * Try to reuse one of the static mapping whenever possible. | ||
218 | */ | ||
219 | read_lock(&vmlist_lock); | ||
220 | for (area = vmlist; area; area = area->next) { | ||
221 | if (!size || (sizeof(phys_addr_t) == 4 && pfn >= 0x100000)) | ||
222 | break; | ||
223 | if (!(area->flags & VM_ARM_STATIC_MAPPING)) | ||
224 | continue; | ||
225 | if ((area->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype)) | ||
226 | continue; | ||
227 | if (__phys_to_pfn(area->phys_addr) > pfn || | ||
228 | __pfn_to_phys(pfn) + size-1 > area->phys_addr + area->size-1) | ||
229 | continue; | ||
230 | /* we can drop the lock here as we know *area is static */ | ||
231 | read_unlock(&vmlist_lock); | ||
232 | addr = (unsigned long)area->addr; | ||
233 | addr += __pfn_to_phys(pfn) - area->phys_addr; | ||
234 | return (void __iomem *) (offset + addr); | ||
235 | } | ||
236 | read_unlock(&vmlist_lock); | ||
237 | |||
238 | /* | ||
239 | * Don't allow RAM to be mapped - this causes problems with ARMv6+ | ||
240 | */ | ||
241 | if (WARN_ON(pfn_valid(pfn))) | ||
242 | return NULL; | ||
243 | |||
219 | area = get_vm_area_caller(size, VM_IOREMAP, caller); | 244 | area = get_vm_area_caller(size, VM_IOREMAP, caller); |
220 | if (!area) | 245 | if (!area) |
221 | return NULL; | 246 | return NULL; |
222 | addr = (unsigned long)area->addr; | 247 | addr = (unsigned long)area->addr; |
223 | 248 | ||
224 | #ifndef CONFIG_SMP | 249 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
225 | if (DOMAIN_IO == 0 && | 250 | if (DOMAIN_IO == 0 && |
226 | (((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) || | 251 | (((cpu_architecture() >= CPU_ARCH_ARMv6) && (get_cr() & CR_XP)) || |
227 | cpu_is_xsc3()) && pfn >= 0x100000 && | 252 | cpu_is_xsc3()) && pfn >= 0x100000 && |
@@ -313,28 +338,34 @@ __arm_ioremap_exec(unsigned long phys_addr, size_t size, bool cached) | |||
313 | void __iounmap(volatile void __iomem *io_addr) | 338 | void __iounmap(volatile void __iomem *io_addr) |
314 | { | 339 | { |
315 | void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); | 340 | void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr); |
316 | #ifndef CONFIG_SMP | 341 | struct vm_struct *vm; |
317 | struct vm_struct **p, *tmp; | ||
318 | 342 | ||
319 | /* | 343 | read_lock(&vmlist_lock); |
320 | * If this is a section based mapping we need to handle it | 344 | for (vm = vmlist; vm; vm = vm->next) { |
321 | * specially as the VM subsystem does not know how to handle | 345 | if (vm->addr > addr) |
322 | * such a beast. We need the lock here b/c we need to clear | 346 | break; |
323 | * all the mappings before the area can be reclaimed | 347 | if (!(vm->flags & VM_IOREMAP)) |
324 | * by someone else. | 348 | continue; |
325 | */ | 349 | /* If this is a static mapping we must leave it alone */ |
326 | write_lock(&vmlist_lock); | 350 | if ((vm->flags & VM_ARM_STATIC_MAPPING) && |
327 | for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) { | 351 | (vm->addr <= addr) && (vm->addr + vm->size > addr)) { |
328 | if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) { | 352 | read_unlock(&vmlist_lock); |
329 | if (tmp->flags & VM_ARM_SECTION_MAPPING) { | 353 | return; |
330 | unmap_area_sections((unsigned long)tmp->addr, | 354 | } |
331 | tmp->size); | 355 | #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE) |
332 | } | 356 | /* |
357 | * If this is a section based mapping we need to handle it | ||
358 | * specially as the VM subsystem does not know how to handle | ||
359 | * such a beast. | ||
360 | */ | ||
361 | if ((vm->addr == addr) && | ||
362 | (vm->flags & VM_ARM_SECTION_MAPPING)) { | ||
363 | unmap_area_sections((unsigned long)vm->addr, vm->size); | ||
333 | break; | 364 | break; |
334 | } | 365 | } |
335 | } | ||
336 | write_unlock(&vmlist_lock); | ||
337 | #endif | 366 | #endif |
367 | } | ||
368 | read_unlock(&vmlist_lock); | ||
338 | 369 | ||
339 | vunmap(addr); | 370 | vunmap(addr); |
340 | } | 371 | } |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index ad7cce3bc431..70f6d3ea4834 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
@@ -21,6 +21,20 @@ const struct mem_type *get_mem_type(unsigned int type); | |||
21 | 21 | ||
22 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); | 22 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); |
23 | 23 | ||
24 | /* | ||
25 | * ARM specific vm_struct->flags bits. | ||
26 | */ | ||
27 | |||
28 | /* (super)section-mapped I/O regions used by ioremap()/iounmap() */ | ||
29 | #define VM_ARM_SECTION_MAPPING 0x80000000 | ||
30 | |||
31 | /* permanent static mappings from iotable_init() */ | ||
32 | #define VM_ARM_STATIC_MAPPING 0x40000000 | ||
33 | |||
34 | /* mapping type (attributes) for permanent static mappings */ | ||
35 | #define VM_ARM_MTYPE(mt) ((mt) << 20) | ||
36 | #define VM_ARM_MTYPE_MASK (0x1f << 20) | ||
37 | |||
24 | #endif | 38 | #endif |
25 | 39 | ||
26 | #ifdef CONFIG_ZONE_DMA | 40 | #ifdef CONFIG_ZONE_DMA |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index dc8c550e6cbd..94c5a0c94f5e 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/nodemask.h> | 15 | #include <linux/nodemask.h> |
16 | #include <linux/memblock.h> | 16 | #include <linux/memblock.h> |
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/vmalloc.h> | ||
18 | 19 | ||
19 | #include <asm/cputype.h> | 20 | #include <asm/cputype.h> |
20 | #include <asm/sections.h> | 21 | #include <asm/sections.h> |
@@ -150,6 +151,7 @@ static int __init early_nowrite(char *__unused) | |||
150 | } | 151 | } |
151 | early_param("nowb", early_nowrite); | 152 | early_param("nowb", early_nowrite); |
152 | 153 | ||
154 | #ifndef CONFIG_ARM_LPAE | ||
153 | static int __init early_ecc(char *p) | 155 | static int __init early_ecc(char *p) |
154 | { | 156 | { |
155 | if (memcmp(p, "on", 2) == 0) | 157 | if (memcmp(p, "on", 2) == 0) |
@@ -159,6 +161,7 @@ static int __init early_ecc(char *p) | |||
159 | return 0; | 161 | return 0; |
160 | } | 162 | } |
161 | early_param("ecc", early_ecc); | 163 | early_param("ecc", early_ecc); |
164 | #endif | ||
162 | 165 | ||
163 | static int __init noalign_setup(char *__unused) | 166 | static int __init noalign_setup(char *__unused) |
164 | { | 167 | { |
@@ -228,10 +231,12 @@ static struct mem_type mem_types[] = { | |||
228 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | 231 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, |
229 | .domain = DOMAIN_KERNEL, | 232 | .domain = DOMAIN_KERNEL, |
230 | }, | 233 | }, |
234 | #ifndef CONFIG_ARM_LPAE | ||
231 | [MT_MINICLEAN] = { | 235 | [MT_MINICLEAN] = { |
232 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE, | 236 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_MINICACHE, |
233 | .domain = DOMAIN_KERNEL, | 237 | .domain = DOMAIN_KERNEL, |
234 | }, | 238 | }, |
239 | #endif | ||
235 | [MT_LOW_VECTORS] = { | 240 | [MT_LOW_VECTORS] = { |
236 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | | 241 | .prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY | |
237 | L_PTE_RDONLY, | 242 | L_PTE_RDONLY, |
@@ -429,6 +434,7 @@ static void __init build_mem_type_table(void) | |||
429 | * ARMv6 and above have extended page tables. | 434 | * ARMv6 and above have extended page tables. |
430 | */ | 435 | */ |
431 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { | 436 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { |
437 | #ifndef CONFIG_ARM_LPAE | ||
432 | /* | 438 | /* |
433 | * Mark cache clean areas and XIP ROM read only | 439 | * Mark cache clean areas and XIP ROM read only |
434 | * from SVC mode and no access from userspace. | 440 | * from SVC mode and no access from userspace. |
@@ -436,6 +442,7 @@ static void __init build_mem_type_table(void) | |||
436 | mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 442 | mem_types[MT_ROM].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
437 | mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 443 | mem_types[MT_MINICLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
438 | mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; | 444 | mem_types[MT_CACHECLEAN].prot_sect |= PMD_SECT_APX|PMD_SECT_AP_WRITE; |
445 | #endif | ||
439 | 446 | ||
440 | if (is_smp()) { | 447 | if (is_smp()) { |
441 | /* | 448 | /* |
@@ -474,6 +481,18 @@ static void __init build_mem_type_table(void) | |||
474 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; | 481 | mem_types[MT_MEMORY_NONCACHED].prot_sect |= PMD_SECT_BUFFERABLE; |
475 | } | 482 | } |
476 | 483 | ||
484 | #ifdef CONFIG_ARM_LPAE | ||
485 | /* | ||
486 | * Do not generate access flag faults for the kernel mappings. | ||
487 | */ | ||
488 | for (i = 0; i < ARRAY_SIZE(mem_types); i++) { | ||
489 | mem_types[i].prot_pte |= PTE_EXT_AF; | ||
490 | mem_types[i].prot_sect |= PMD_SECT_AF; | ||
491 | } | ||
492 | kern_pgprot |= PTE_EXT_AF; | ||
493 | vecs_pgprot |= PTE_EXT_AF; | ||
494 | #endif | ||
495 | |||
477 | for (i = 0; i < 16; i++) { | 496 | for (i = 0; i < 16; i++) { |
478 | unsigned long v = pgprot_val(protection_map[i]); | 497 | unsigned long v = pgprot_val(protection_map[i]); |
479 | protection_map[i] = __pgprot(v | user_pgprot); | 498 | protection_map[i] = __pgprot(v | user_pgprot); |
@@ -529,13 +548,18 @@ EXPORT_SYMBOL(phys_mem_access_prot); | |||
529 | 548 | ||
530 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) | 549 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) |
531 | 550 | ||
532 | static void __init *early_alloc(unsigned long sz) | 551 | static void __init *early_alloc_aligned(unsigned long sz, unsigned long align) |
533 | { | 552 | { |
534 | void *ptr = __va(memblock_alloc(sz, sz)); | 553 | void *ptr = __va(memblock_alloc(sz, align)); |
535 | memset(ptr, 0, sz); | 554 | memset(ptr, 0, sz); |
536 | return ptr; | 555 | return ptr; |
537 | } | 556 | } |
538 | 557 | ||
558 | static void __init *early_alloc(unsigned long sz) | ||
559 | { | ||
560 | return early_alloc_aligned(sz, sz); | ||
561 | } | ||
562 | |||
539 | static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) | 563 | static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr, unsigned long prot) |
540 | { | 564 | { |
541 | if (pmd_none(*pmd)) { | 565 | if (pmd_none(*pmd)) { |
@@ -572,8 +596,10 @@ static void __init alloc_init_section(pud_t *pud, unsigned long addr, | |||
572 | if (((addr | end | phys) & ~SECTION_MASK) == 0) { | 596 | if (((addr | end | phys) & ~SECTION_MASK) == 0) { |
573 | pmd_t *p = pmd; | 597 | pmd_t *p = pmd; |
574 | 598 | ||
599 | #ifndef CONFIG_ARM_LPAE | ||
575 | if (addr & SECTION_SIZE) | 600 | if (addr & SECTION_SIZE) |
576 | pmd++; | 601 | pmd++; |
602 | #endif | ||
577 | 603 | ||
578 | do { | 604 | do { |
579 | *pmd = __pmd(phys | type->prot_sect); | 605 | *pmd = __pmd(phys | type->prot_sect); |
@@ -603,6 +629,7 @@ static void alloc_init_pud(pgd_t *pgd, unsigned long addr, unsigned long end, | |||
603 | } while (pud++, addr = next, addr != end); | 629 | } while (pud++, addr = next, addr != end); |
604 | } | 630 | } |
605 | 631 | ||
632 | #ifndef CONFIG_ARM_LPAE | ||
606 | static void __init create_36bit_mapping(struct map_desc *md, | 633 | static void __init create_36bit_mapping(struct map_desc *md, |
607 | const struct mem_type *type) | 634 | const struct mem_type *type) |
608 | { | 635 | { |
@@ -662,6 +689,7 @@ static void __init create_36bit_mapping(struct map_desc *md, | |||
662 | pgd += SUPERSECTION_SIZE >> PGDIR_SHIFT; | 689 | pgd += SUPERSECTION_SIZE >> PGDIR_SHIFT; |
663 | } while (addr != end); | 690 | } while (addr != end); |
664 | } | 691 | } |
692 | #endif /* !CONFIG_ARM_LPAE */ | ||
665 | 693 | ||
666 | /* | 694 | /* |
667 | * Create the page directory entries and any necessary | 695 | * Create the page directory entries and any necessary |
@@ -685,14 +713,16 @@ static void __init create_mapping(struct map_desc *md) | |||
685 | } | 713 | } |
686 | 714 | ||
687 | if ((md->type == MT_DEVICE || md->type == MT_ROM) && | 715 | if ((md->type == MT_DEVICE || md->type == MT_ROM) && |
688 | md->virtual >= PAGE_OFFSET && md->virtual < VMALLOC_END) { | 716 | md->virtual >= PAGE_OFFSET && |
717 | (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) { | ||
689 | printk(KERN_WARNING "BUG: mapping for 0x%08llx" | 718 | printk(KERN_WARNING "BUG: mapping for 0x%08llx" |
690 | " at 0x%08lx overlaps vmalloc space\n", | 719 | " at 0x%08lx out of vmalloc space\n", |
691 | (long long)__pfn_to_phys((u64)md->pfn), md->virtual); | 720 | (long long)__pfn_to_phys((u64)md->pfn), md->virtual); |
692 | } | 721 | } |
693 | 722 | ||
694 | type = &mem_types[md->type]; | 723 | type = &mem_types[md->type]; |
695 | 724 | ||
725 | #ifndef CONFIG_ARM_LPAE | ||
696 | /* | 726 | /* |
697 | * Catch 36-bit addresses | 727 | * Catch 36-bit addresses |
698 | */ | 728 | */ |
@@ -700,6 +730,7 @@ static void __init create_mapping(struct map_desc *md) | |||
700 | create_36bit_mapping(md, type); | 730 | create_36bit_mapping(md, type); |
701 | return; | 731 | return; |
702 | } | 732 | } |
733 | #endif | ||
703 | 734 | ||
704 | addr = md->virtual & PAGE_MASK; | 735 | addr = md->virtual & PAGE_MASK; |
705 | phys = __pfn_to_phys(md->pfn); | 736 | phys = __pfn_to_phys(md->pfn); |
@@ -729,18 +760,33 @@ static void __init create_mapping(struct map_desc *md) | |||
729 | */ | 760 | */ |
730 | void __init iotable_init(struct map_desc *io_desc, int nr) | 761 | void __init iotable_init(struct map_desc *io_desc, int nr) |
731 | { | 762 | { |
732 | int i; | 763 | struct map_desc *md; |
764 | struct vm_struct *vm; | ||
765 | |||
766 | if (!nr) | ||
767 | return; | ||
733 | 768 | ||
734 | for (i = 0; i < nr; i++) | 769 | vm = early_alloc_aligned(sizeof(*vm) * nr, __alignof__(*vm)); |
735 | create_mapping(io_desc + i); | 770 | |
771 | for (md = io_desc; nr; md++, nr--) { | ||
772 | create_mapping(md); | ||
773 | vm->addr = (void *)(md->virtual & PAGE_MASK); | ||
774 | vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK)); | ||
775 | vm->phys_addr = __pfn_to_phys(md->pfn); | ||
776 | vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; | ||
777 | vm->flags |= VM_ARM_MTYPE(md->type); | ||
778 | vm->caller = iotable_init; | ||
779 | vm_area_add_early(vm++); | ||
780 | } | ||
736 | } | 781 | } |
737 | 782 | ||
738 | static void * __initdata vmalloc_min = (void *)(VMALLOC_END - SZ_128M); | 783 | static void * __initdata vmalloc_min = |
784 | (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET); | ||
739 | 785 | ||
740 | /* | 786 | /* |
741 | * vmalloc=size forces the vmalloc area to be exactly 'size' | 787 | * vmalloc=size forces the vmalloc area to be exactly 'size' |
742 | * bytes. This can be used to increase (or decrease) the vmalloc | 788 | * bytes. This can be used to increase (or decrease) the vmalloc |
743 | * area - the default is 128m. | 789 | * area - the default is 240m. |
744 | */ | 790 | */ |
745 | static int __init early_vmalloc(char *arg) | 791 | static int __init early_vmalloc(char *arg) |
746 | { | 792 | { |
@@ -775,6 +821,9 @@ void __init sanity_check_meminfo(void) | |||
775 | struct membank *bank = &meminfo.bank[j]; | 821 | struct membank *bank = &meminfo.bank[j]; |
776 | *bank = meminfo.bank[i]; | 822 | *bank = meminfo.bank[i]; |
777 | 823 | ||
824 | if (bank->start > ULONG_MAX) | ||
825 | highmem = 1; | ||
826 | |||
778 | #ifdef CONFIG_HIGHMEM | 827 | #ifdef CONFIG_HIGHMEM |
779 | if (__va(bank->start) >= vmalloc_min || | 828 | if (__va(bank->start) >= vmalloc_min || |
780 | __va(bank->start) < (void *)PAGE_OFFSET) | 829 | __va(bank->start) < (void *)PAGE_OFFSET) |
@@ -786,7 +835,7 @@ void __init sanity_check_meminfo(void) | |||
786 | * Split those memory banks which are partially overlapping | 835 | * Split those memory banks which are partially overlapping |
787 | * the vmalloc area greatly simplifying things later. | 836 | * the vmalloc area greatly simplifying things later. |
788 | */ | 837 | */ |
789 | if (__va(bank->start) < vmalloc_min && | 838 | if (!highmem && __va(bank->start) < vmalloc_min && |
790 | bank->size > vmalloc_min - __va(bank->start)) { | 839 | bank->size > vmalloc_min - __va(bank->start)) { |
791 | if (meminfo.nr_banks >= NR_BANKS) { | 840 | if (meminfo.nr_banks >= NR_BANKS) { |
792 | printk(KERN_CRIT "NR_BANKS too low, " | 841 | printk(KERN_CRIT "NR_BANKS too low, " |
@@ -807,6 +856,17 @@ void __init sanity_check_meminfo(void) | |||
807 | bank->highmem = highmem; | 856 | bank->highmem = highmem; |
808 | 857 | ||
809 | /* | 858 | /* |
859 | * Highmem banks not allowed with !CONFIG_HIGHMEM. | ||
860 | */ | ||
861 | if (highmem) { | ||
862 | printk(KERN_NOTICE "Ignoring RAM at %.8llx-%.8llx " | ||
863 | "(!CONFIG_HIGHMEM).\n", | ||
864 | (unsigned long long)bank->start, | ||
865 | (unsigned long long)bank->start + bank->size - 1); | ||
866 | continue; | ||
867 | } | ||
868 | |||
869 | /* | ||
810 | * Check whether this memory bank would entirely overlap | 870 | * Check whether this memory bank would entirely overlap |
811 | * the vmalloc area. | 871 | * the vmalloc area. |
812 | */ | 872 | */ |
@@ -860,6 +920,7 @@ void __init sanity_check_meminfo(void) | |||
860 | } | 920 | } |
861 | #endif | 921 | #endif |
862 | meminfo.nr_banks = j; | 922 | meminfo.nr_banks = j; |
923 | high_memory = __va(lowmem_limit - 1) + 1; | ||
863 | memblock_set_current_limit(lowmem_limit); | 924 | memblock_set_current_limit(lowmem_limit); |
864 | } | 925 | } |
865 | 926 | ||
@@ -890,14 +951,20 @@ static inline void prepare_page_table(void) | |||
890 | 951 | ||
891 | /* | 952 | /* |
892 | * Clear out all the kernel space mappings, except for the first | 953 | * Clear out all the kernel space mappings, except for the first |
893 | * memory bank, up to the end of the vmalloc region. | 954 | * memory bank, up to the vmalloc region. |
894 | */ | 955 | */ |
895 | for (addr = __phys_to_virt(end); | 956 | for (addr = __phys_to_virt(end); |
896 | addr < VMALLOC_END; addr += PMD_SIZE) | 957 | addr < VMALLOC_START; addr += PMD_SIZE) |
897 | pmd_clear(pmd_off_k(addr)); | 958 | pmd_clear(pmd_off_k(addr)); |
898 | } | 959 | } |
899 | 960 | ||
961 | #ifdef CONFIG_ARM_LPAE | ||
962 | /* the first page is reserved for pgd */ | ||
963 | #define SWAPPER_PG_DIR_SIZE (PAGE_SIZE + \ | ||
964 | PTRS_PER_PGD * PTRS_PER_PMD * sizeof(pmd_t)) | ||
965 | #else | ||
900 | #define SWAPPER_PG_DIR_SIZE (PTRS_PER_PGD * sizeof(pgd_t)) | 966 | #define SWAPPER_PG_DIR_SIZE (PTRS_PER_PGD * sizeof(pgd_t)) |
967 | #endif | ||
901 | 968 | ||
902 | /* | 969 | /* |
903 | * Reserve the special regions of memory | 970 | * Reserve the special regions of memory |
@@ -920,8 +987,8 @@ void __init arm_mm_memblock_reserve(void) | |||
920 | } | 987 | } |
921 | 988 | ||
922 | /* | 989 | /* |
923 | * Set up device the mappings. Since we clear out the page tables for all | 990 | * Set up the device mappings. Since we clear out the page tables for all |
924 | * mappings above VMALLOC_END, we will remove any debug device mappings. | 991 | * mappings above VMALLOC_START, we will remove any debug device mappings. |
925 | * This means you have to be careful how you debug this function, or any | 992 | * This means you have to be careful how you debug this function, or any |
926 | * called function. This means you can't use any function or debugging | 993 | * called function. This means you can't use any function or debugging |
927 | * method which may touch any device, otherwise the kernel _will_ crash. | 994 | * method which may touch any device, otherwise the kernel _will_ crash. |
@@ -936,7 +1003,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
936 | */ | 1003 | */ |
937 | vectors_page = early_alloc(PAGE_SIZE); | 1004 | vectors_page = early_alloc(PAGE_SIZE); |
938 | 1005 | ||
939 | for (addr = VMALLOC_END; addr; addr += PMD_SIZE) | 1006 | for (addr = VMALLOC_START; addr; addr += PMD_SIZE) |
940 | pmd_clear(pmd_off_k(addr)); | 1007 | pmd_clear(pmd_off_k(addr)); |
941 | 1008 | ||
942 | /* | 1009 | /* |
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c index 941a98c9e8aa..4fc6794cca4b 100644 --- a/arch/arm/mm/nommu.c +++ b/arch/arm/mm/nommu.c | |||
@@ -29,6 +29,8 @@ void __init arm_mm_memblock_reserve(void) | |||
29 | 29 | ||
30 | void __init sanity_check_meminfo(void) | 30 | void __init sanity_check_meminfo(void) |
31 | { | 31 | { |
32 | phys_addr_t end = bank_phys_end(&meminfo.bank[meminfo.nr_banks - 1]); | ||
33 | high_memory = __va(end - 1) + 1; | ||
32 | } | 34 | } |
33 | 35 | ||
34 | /* | 36 | /* |
@@ -43,7 +45,7 @@ void __init paging_init(struct machine_desc *mdesc) | |||
43 | /* | 45 | /* |
44 | * We don't need to do anything here for nommu machines. | 46 | * We don't need to do anything here for nommu machines. |
45 | */ | 47 | */ |
46 | void setup_mm_for_reboot(char mode) | 48 | void setup_mm_for_reboot(void) |
47 | { | 49 | { |
48 | } | 50 | } |
49 | 51 | ||
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c index b2027c154b2a..a3e78ccabd65 100644 --- a/arch/arm/mm/pgd.c +++ b/arch/arm/mm/pgd.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/gfp.h> | 11 | #include <linux/gfp.h> |
12 | #include <linux/highmem.h> | 12 | #include <linux/highmem.h> |
13 | #include <linux/slab.h> | ||
13 | 14 | ||
14 | #include <asm/pgalloc.h> | 15 | #include <asm/pgalloc.h> |
15 | #include <asm/page.h> | 16 | #include <asm/page.h> |
@@ -17,6 +18,14 @@ | |||
17 | 18 | ||
18 | #include "mm.h" | 19 | #include "mm.h" |
19 | 20 | ||
21 | #ifdef CONFIG_ARM_LPAE | ||
22 | #define __pgd_alloc() kmalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL) | ||
23 | #define __pgd_free(pgd) kfree(pgd) | ||
24 | #else | ||
25 | #define __pgd_alloc() (pgd_t *)__get_free_pages(GFP_KERNEL, 2) | ||
26 | #define __pgd_free(pgd) free_pages((unsigned long)pgd, 2) | ||
27 | #endif | ||
28 | |||
20 | /* | 29 | /* |
21 | * need to get a 16k page for level 1 | 30 | * need to get a 16k page for level 1 |
22 | */ | 31 | */ |
@@ -27,7 +36,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
27 | pmd_t *new_pmd, *init_pmd; | 36 | pmd_t *new_pmd, *init_pmd; |
28 | pte_t *new_pte, *init_pte; | 37 | pte_t *new_pte, *init_pte; |
29 | 38 | ||
30 | new_pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, 2); | 39 | new_pgd = __pgd_alloc(); |
31 | if (!new_pgd) | 40 | if (!new_pgd) |
32 | goto no_pgd; | 41 | goto no_pgd; |
33 | 42 | ||
@@ -42,10 +51,25 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
42 | 51 | ||
43 | clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t)); | 52 | clean_dcache_area(new_pgd, PTRS_PER_PGD * sizeof(pgd_t)); |
44 | 53 | ||
54 | #ifdef CONFIG_ARM_LPAE | ||
55 | /* | ||
56 | * Allocate PMD table for modules and pkmap mappings. | ||
57 | */ | ||
58 | new_pud = pud_alloc(mm, new_pgd + pgd_index(MODULES_VADDR), | ||
59 | MODULES_VADDR); | ||
60 | if (!new_pud) | ||
61 | goto no_pud; | ||
62 | |||
63 | new_pmd = pmd_alloc(mm, new_pud, 0); | ||
64 | if (!new_pmd) | ||
65 | goto no_pmd; | ||
66 | #endif | ||
67 | |||
45 | if (!vectors_high()) { | 68 | if (!vectors_high()) { |
46 | /* | 69 | /* |
47 | * On ARM, first page must always be allocated since it | 70 | * On ARM, first page must always be allocated since it |
48 | * contains the machine vectors. | 71 | * contains the machine vectors. The vectors are always high |
72 | * with LPAE. | ||
49 | */ | 73 | */ |
50 | new_pud = pud_alloc(mm, new_pgd, 0); | 74 | new_pud = pud_alloc(mm, new_pgd, 0); |
51 | if (!new_pud) | 75 | if (!new_pud) |
@@ -74,7 +98,7 @@ no_pte: | |||
74 | no_pmd: | 98 | no_pmd: |
75 | pud_free(mm, new_pud); | 99 | pud_free(mm, new_pud); |
76 | no_pud: | 100 | no_pud: |
77 | free_pages((unsigned long)new_pgd, 2); | 101 | __pgd_free(new_pgd); |
78 | no_pgd: | 102 | no_pgd: |
79 | return NULL; | 103 | return NULL; |
80 | } | 104 | } |
@@ -111,5 +135,24 @@ no_pud: | |||
111 | pgd_clear(pgd); | 135 | pgd_clear(pgd); |
112 | pud_free(mm, pud); | 136 | pud_free(mm, pud); |
113 | no_pgd: | 137 | no_pgd: |
114 | free_pages((unsigned long) pgd_base, 2); | 138 | #ifdef CONFIG_ARM_LPAE |
139 | /* | ||
140 | * Free modules/pkmap or identity pmd tables. | ||
141 | */ | ||
142 | for (pgd = pgd_base; pgd < pgd_base + PTRS_PER_PGD; pgd++) { | ||
143 | if (pgd_none_or_clear_bad(pgd)) | ||
144 | continue; | ||
145 | if (pgd_val(*pgd) & L_PGD_SWAPPER) | ||
146 | continue; | ||
147 | pud = pud_offset(pgd, 0); | ||
148 | if (pud_none_or_clear_bad(pud)) | ||
149 | continue; | ||
150 | pmd = pmd_offset(pud, 0); | ||
151 | pud_clear(pud); | ||
152 | pmd_free(mm, pmd); | ||
153 | pgd_clear(pgd); | ||
154 | pud_free(mm, pud); | ||
155 | } | ||
156 | #endif | ||
157 | __pgd_free(pgd_base); | ||
115 | } | 158 | } |
diff --git a/arch/arm/mm/proc-arm1020.S b/arch/arm/mm/proc-arm1020.S index 67469665d47a..234951345eb3 100644 --- a/arch/arm/mm/proc-arm1020.S +++ b/arch/arm/mm/proc-arm1020.S | |||
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020_proc_fin) | |||
95 | * loc: location to jump to for soft reset | 95 | * loc: location to jump to for soft reset |
96 | */ | 96 | */ |
97 | .align 5 | 97 | .align 5 |
98 | .pushsection .idmap.text, "ax" | ||
98 | ENTRY(cpu_arm1020_reset) | 99 | ENTRY(cpu_arm1020_reset) |
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020_reset) | |||
107 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
108 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 109 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
109 | mov pc, r0 | 110 | mov pc, r0 |
111 | ENDPROC(cpu_arm1020_reset) | ||
112 | .popsection | ||
110 | 113 | ||
111 | /* | 114 | /* |
112 | * cpu_arm1020_do_idle() | 115 | * cpu_arm1020_do_idle() |
diff --git a/arch/arm/mm/proc-arm1020e.S b/arch/arm/mm/proc-arm1020e.S index 4251421c0ed5..c244b06caac9 100644 --- a/arch/arm/mm/proc-arm1020e.S +++ b/arch/arm/mm/proc-arm1020e.S | |||
@@ -95,6 +95,7 @@ ENTRY(cpu_arm1020e_proc_fin) | |||
95 | * loc: location to jump to for soft reset | 95 | * loc: location to jump to for soft reset |
96 | */ | 96 | */ |
97 | .align 5 | 97 | .align 5 |
98 | .pushsection .idmap.text, "ax" | ||
98 | ENTRY(cpu_arm1020e_reset) | 99 | ENTRY(cpu_arm1020e_reset) |
99 | mov ip, #0 | 100 | mov ip, #0 |
100 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 101 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -107,6 +108,8 @@ ENTRY(cpu_arm1020e_reset) | |||
107 | bic ip, ip, #0x1100 @ ...i...s........ | 108 | bic ip, ip, #0x1100 @ ...i...s........ |
108 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 109 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
109 | mov pc, r0 | 110 | mov pc, r0 |
111 | ENDPROC(cpu_arm1020e_reset) | ||
112 | .popsection | ||
110 | 113 | ||
111 | /* | 114 | /* |
112 | * cpu_arm1020e_do_idle() | 115 | * cpu_arm1020e_do_idle() |
diff --git a/arch/arm/mm/proc-arm1022.S b/arch/arm/mm/proc-arm1022.S index d283cf3d06e3..38fe22efd18f 100644 --- a/arch/arm/mm/proc-arm1022.S +++ b/arch/arm/mm/proc-arm1022.S | |||
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1022_proc_fin) | |||
84 | * loc: location to jump to for soft reset | 84 | * loc: location to jump to for soft reset |
85 | */ | 85 | */ |
86 | .align 5 | 86 | .align 5 |
87 | .pushsection .idmap.text, "ax" | ||
87 | ENTRY(cpu_arm1022_reset) | 88 | ENTRY(cpu_arm1022_reset) |
88 | mov ip, #0 | 89 | mov ip, #0 |
89 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1022_reset) | |||
96 | bic ip, ip, #0x1100 @ ...i...s........ | 97 | bic ip, ip, #0x1100 @ ...i...s........ |
97 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
98 | mov pc, r0 | 99 | mov pc, r0 |
100 | ENDPROC(cpu_arm1022_reset) | ||
101 | .popsection | ||
99 | 102 | ||
100 | /* | 103 | /* |
101 | * cpu_arm1022_do_idle() | 104 | * cpu_arm1022_do_idle() |
diff --git a/arch/arm/mm/proc-arm1026.S b/arch/arm/mm/proc-arm1026.S index 678a1ceafed2..3eb9c3c26c75 100644 --- a/arch/arm/mm/proc-arm1026.S +++ b/arch/arm/mm/proc-arm1026.S | |||
@@ -84,6 +84,7 @@ ENTRY(cpu_arm1026_proc_fin) | |||
84 | * loc: location to jump to for soft reset | 84 | * loc: location to jump to for soft reset |
85 | */ | 85 | */ |
86 | .align 5 | 86 | .align 5 |
87 | .pushsection .idmap.text, "ax" | ||
87 | ENTRY(cpu_arm1026_reset) | 88 | ENTRY(cpu_arm1026_reset) |
88 | mov ip, #0 | 89 | mov ip, #0 |
89 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -96,6 +97,8 @@ ENTRY(cpu_arm1026_reset) | |||
96 | bic ip, ip, #0x1100 @ ...i...s........ | 97 | bic ip, ip, #0x1100 @ ...i...s........ |
97 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
98 | mov pc, r0 | 99 | mov pc, r0 |
100 | ENDPROC(cpu_arm1026_reset) | ||
101 | .popsection | ||
99 | 102 | ||
100 | /* | 103 | /* |
101 | * cpu_arm1026_do_idle() | 104 | * cpu_arm1026_do_idle() |
diff --git a/arch/arm/mm/proc-arm6_7.S b/arch/arm/mm/proc-arm6_7.S index e5b974cddac3..4fbeb5b8e6c2 100644 --- a/arch/arm/mm/proc-arm6_7.S +++ b/arch/arm/mm/proc-arm6_7.S | |||
@@ -225,6 +225,7 @@ ENTRY(cpu_arm7_set_pte_ext) | |||
225 | * Params : r0 = address to jump to | 225 | * Params : r0 = address to jump to |
226 | * Notes : This sets up everything for a reset | 226 | * Notes : This sets up everything for a reset |
227 | */ | 227 | */ |
228 | .pushsection .idmap.text, "ax" | ||
228 | ENTRY(cpu_arm6_reset) | 229 | ENTRY(cpu_arm6_reset) |
229 | ENTRY(cpu_arm7_reset) | 230 | ENTRY(cpu_arm7_reset) |
230 | mov r1, #0 | 231 | mov r1, #0 |
@@ -235,6 +236,9 @@ ENTRY(cpu_arm7_reset) | |||
235 | mov r1, #0x30 | 236 | mov r1, #0x30 |
236 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc | 237 | mcr p15, 0, r1, c1, c0, 0 @ turn off MMU etc |
237 | mov pc, r0 | 238 | mov pc, r0 |
239 | ENDPROC(cpu_arm6_reset) | ||
240 | ENDPROC(cpu_arm7_reset) | ||
241 | .popsection | ||
238 | 242 | ||
239 | __CPUINIT | 243 | __CPUINIT |
240 | 244 | ||
diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index 55f4e290665a..0ac908c7ade1 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S | |||
@@ -101,6 +101,7 @@ ENTRY(cpu_arm720_set_pte_ext) | |||
101 | * Params : r0 = address to jump to | 101 | * Params : r0 = address to jump to |
102 | * Notes : This sets up everything for a reset | 102 | * Notes : This sets up everything for a reset |
103 | */ | 103 | */ |
104 | .pushsection .idmap.text, "ax" | ||
104 | ENTRY(cpu_arm720_reset) | 105 | ENTRY(cpu_arm720_reset) |
105 | mov ip, #0 | 106 | mov ip, #0 |
106 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache | 107 | mcr p15, 0, ip, c7, c7, 0 @ invalidate cache |
@@ -112,6 +113,8 @@ ENTRY(cpu_arm720_reset) | |||
112 | bic ip, ip, #0x2100 @ ..v....s........ | 113 | bic ip, ip, #0x2100 @ ..v....s........ |
113 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 114 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
114 | mov pc, r0 | 115 | mov pc, r0 |
116 | ENDPROC(cpu_arm720_reset) | ||
117 | .popsection | ||
115 | 118 | ||
116 | __CPUINIT | 119 | __CPUINIT |
117 | 120 | ||
diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index 4506be3adda6..dc5de5d53f20 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S | |||
@@ -49,6 +49,7 @@ ENTRY(cpu_arm740_proc_fin) | |||
49 | * Params : r0 = address to jump to | 49 | * Params : r0 = address to jump to |
50 | * Notes : This sets up everything for a reset | 50 | * Notes : This sets up everything for a reset |
51 | */ | 51 | */ |
52 | .pushsection .idmap.text, "ax" | ||
52 | ENTRY(cpu_arm740_reset) | 53 | ENTRY(cpu_arm740_reset) |
53 | mov ip, #0 | 54 | mov ip, #0 |
54 | mcr p15, 0, ip, c7, c0, 0 @ invalidate cache | 55 | mcr p15, 0, ip, c7, c0, 0 @ invalidate cache |
@@ -56,6 +57,8 @@ ENTRY(cpu_arm740_reset) | |||
56 | bic ip, ip, #0x0000000c @ ............wc.. | 57 | bic ip, ip, #0x0000000c @ ............wc.. |
57 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 58 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
58 | mov pc, r0 | 59 | mov pc, r0 |
60 | ENDPROC(cpu_arm740_reset) | ||
61 | .popsection | ||
59 | 62 | ||
60 | __CPUINIT | 63 | __CPUINIT |
61 | 64 | ||
diff --git a/arch/arm/mm/proc-arm7tdmi.S b/arch/arm/mm/proc-arm7tdmi.S index 7e0e1fe4ed4d..6ddea3e464bd 100644 --- a/arch/arm/mm/proc-arm7tdmi.S +++ b/arch/arm/mm/proc-arm7tdmi.S | |||
@@ -45,8 +45,11 @@ ENTRY(cpu_arm7tdmi_proc_fin) | |||
45 | * Params : loc(r0) address to jump to | 45 | * Params : loc(r0) address to jump to |
46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. | 46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. |
47 | */ | 47 | */ |
48 | .pushsection .idmap.text, "ax" | ||
48 | ENTRY(cpu_arm7tdmi_reset) | 49 | ENTRY(cpu_arm7tdmi_reset) |
49 | mov pc, r0 | 50 | mov pc, r0 |
51 | ENDPROC(cpu_arm7tdmi_reset) | ||
52 | .popsection | ||
50 | 53 | ||
51 | __CPUINIT | 54 | __CPUINIT |
52 | 55 | ||
diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 88fb3d9e0640..cb941ae95f66 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S | |||
@@ -85,6 +85,7 @@ ENTRY(cpu_arm920_proc_fin) | |||
85 | * loc: location to jump to for soft reset | 85 | * loc: location to jump to for soft reset |
86 | */ | 86 | */ |
87 | .align 5 | 87 | .align 5 |
88 | .pushsection .idmap.text, "ax" | ||
88 | ENTRY(cpu_arm920_reset) | 89 | ENTRY(cpu_arm920_reset) |
89 | mov ip, #0 | 90 | mov ip, #0 |
90 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 91 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -97,6 +98,8 @@ ENTRY(cpu_arm920_reset) | |||
97 | bic ip, ip, #0x1100 @ ...i...s........ | 98 | bic ip, ip, #0x1100 @ ...i...s........ |
98 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 99 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
99 | mov pc, r0 | 100 | mov pc, r0 |
101 | ENDPROC(cpu_arm920_reset) | ||
102 | .popsection | ||
100 | 103 | ||
101 | /* | 104 | /* |
102 | * cpu_arm920_do_idle() | 105 | * cpu_arm920_do_idle() |
diff --git a/arch/arm/mm/proc-arm922.S b/arch/arm/mm/proc-arm922.S index 490e18833857..4ec0e074dd55 100644 --- a/arch/arm/mm/proc-arm922.S +++ b/arch/arm/mm/proc-arm922.S | |||
@@ -87,6 +87,7 @@ ENTRY(cpu_arm922_proc_fin) | |||
87 | * loc: location to jump to for soft reset | 87 | * loc: location to jump to for soft reset |
88 | */ | 88 | */ |
89 | .align 5 | 89 | .align 5 |
90 | .pushsection .idmap.text, "ax" | ||
90 | ENTRY(cpu_arm922_reset) | 91 | ENTRY(cpu_arm922_reset) |
91 | mov ip, #0 | 92 | mov ip, #0 |
92 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 93 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -99,6 +100,8 @@ ENTRY(cpu_arm922_reset) | |||
99 | bic ip, ip, #0x1100 @ ...i...s........ | 100 | bic ip, ip, #0x1100 @ ...i...s........ |
100 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 101 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
101 | mov pc, r0 | 102 | mov pc, r0 |
103 | ENDPROC(cpu_arm922_reset) | ||
104 | .popsection | ||
102 | 105 | ||
103 | /* | 106 | /* |
104 | * cpu_arm922_do_idle() | 107 | * cpu_arm922_do_idle() |
diff --git a/arch/arm/mm/proc-arm925.S b/arch/arm/mm/proc-arm925.S index 51d494be057e..9dccd9a365b3 100644 --- a/arch/arm/mm/proc-arm925.S +++ b/arch/arm/mm/proc-arm925.S | |||
@@ -108,6 +108,7 @@ ENTRY(cpu_arm925_proc_fin) | |||
108 | * loc: location to jump to for soft reset | 108 | * loc: location to jump to for soft reset |
109 | */ | 109 | */ |
110 | .align 5 | 110 | .align 5 |
111 | .pushsection .idmap.text, "ax" | ||
111 | ENTRY(cpu_arm925_reset) | 112 | ENTRY(cpu_arm925_reset) |
112 | /* Send software reset to MPU and DSP */ | 113 | /* Send software reset to MPU and DSP */ |
113 | mov ip, #0xff000000 | 114 | mov ip, #0xff000000 |
@@ -115,6 +116,8 @@ ENTRY(cpu_arm925_reset) | |||
115 | orr ip, ip, #0x0000ce00 | 116 | orr ip, ip, #0x0000ce00 |
116 | mov r4, #1 | 117 | mov r4, #1 |
117 | strh r4, [ip, #0x10] | 118 | strh r4, [ip, #0x10] |
119 | ENDPROC(cpu_arm925_reset) | ||
120 | .popsection | ||
118 | 121 | ||
119 | mov ip, #0 | 122 | mov ip, #0 |
120 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 123 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index 9f8fd91f918a..820259b81a1f 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S | |||
@@ -77,6 +77,7 @@ ENTRY(cpu_arm926_proc_fin) | |||
77 | * loc: location to jump to for soft reset | 77 | * loc: location to jump to for soft reset |
78 | */ | 78 | */ |
79 | .align 5 | 79 | .align 5 |
80 | .pushsection .idmap.text, "ax" | ||
80 | ENTRY(cpu_arm926_reset) | 81 | ENTRY(cpu_arm926_reset) |
81 | mov ip, #0 | 82 | mov ip, #0 |
82 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 83 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -89,6 +90,8 @@ ENTRY(cpu_arm926_reset) | |||
89 | bic ip, ip, #0x1100 @ ...i...s........ | 90 | bic ip, ip, #0x1100 @ ...i...s........ |
90 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 91 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
91 | mov pc, r0 | 92 | mov pc, r0 |
93 | ENDPROC(cpu_arm926_reset) | ||
94 | .popsection | ||
92 | 95 | ||
93 | /* | 96 | /* |
94 | * cpu_arm926_do_idle() | 97 | * cpu_arm926_do_idle() |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index ac750d506153..9fdc0a170974 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
@@ -48,6 +48,7 @@ ENTRY(cpu_arm940_proc_fin) | |||
48 | * Params : r0 = address to jump to | 48 | * Params : r0 = address to jump to |
49 | * Notes : This sets up everything for a reset | 49 | * Notes : This sets up everything for a reset |
50 | */ | 50 | */ |
51 | .pushsection .idmap.text, "ax" | ||
51 | ENTRY(cpu_arm940_reset) | 52 | ENTRY(cpu_arm940_reset) |
52 | mov ip, #0 | 53 | mov ip, #0 |
53 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache | 54 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache |
@@ -58,6 +59,8 @@ ENTRY(cpu_arm940_reset) | |||
58 | bic ip, ip, #0x00001000 @ i-cache | 59 | bic ip, ip, #0x00001000 @ i-cache |
59 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 60 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
60 | mov pc, r0 | 61 | mov pc, r0 |
62 | ENDPROC(cpu_arm940_reset) | ||
63 | .popsection | ||
61 | 64 | ||
62 | /* | 65 | /* |
63 | * cpu_arm940_do_idle() | 66 | * cpu_arm940_do_idle() |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 683af3a182b7..f684cfedcca9 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
@@ -55,6 +55,7 @@ ENTRY(cpu_arm946_proc_fin) | |||
55 | * Params : r0 = address to jump to | 55 | * Params : r0 = address to jump to |
56 | * Notes : This sets up everything for a reset | 56 | * Notes : This sets up everything for a reset |
57 | */ | 57 | */ |
58 | .pushsection .idmap.text, "ax" | ||
58 | ENTRY(cpu_arm946_reset) | 59 | ENTRY(cpu_arm946_reset) |
59 | mov ip, #0 | 60 | mov ip, #0 |
60 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache | 61 | mcr p15, 0, ip, c7, c5, 0 @ flush I cache |
@@ -65,6 +66,8 @@ ENTRY(cpu_arm946_reset) | |||
65 | bic ip, ip, #0x00001000 @ i-cache | 66 | bic ip, ip, #0x00001000 @ i-cache |
66 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 67 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
67 | mov pc, r0 | 68 | mov pc, r0 |
69 | ENDPROC(cpu_arm946_reset) | ||
70 | .popsection | ||
68 | 71 | ||
69 | /* | 72 | /* |
70 | * cpu_arm946_do_idle() | 73 | * cpu_arm946_do_idle() |
diff --git a/arch/arm/mm/proc-arm9tdmi.S b/arch/arm/mm/proc-arm9tdmi.S index 2120f9e2af7f..8881391dfb9e 100644 --- a/arch/arm/mm/proc-arm9tdmi.S +++ b/arch/arm/mm/proc-arm9tdmi.S | |||
@@ -45,8 +45,11 @@ ENTRY(cpu_arm9tdmi_proc_fin) | |||
45 | * Params : loc(r0) address to jump to | 45 | * Params : loc(r0) address to jump to |
46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. | 46 | * Purpose : Sets up everything for a reset and jump to the location for soft reset. |
47 | */ | 47 | */ |
48 | .pushsection .idmap.text, "ax" | ||
48 | ENTRY(cpu_arm9tdmi_reset) | 49 | ENTRY(cpu_arm9tdmi_reset) |
49 | mov pc, r0 | 50 | mov pc, r0 |
51 | ENDPROC(cpu_arm9tdmi_reset) | ||
52 | .popsection | ||
50 | 53 | ||
51 | __CPUINIT | 54 | __CPUINIT |
52 | 55 | ||
diff --git a/arch/arm/mm/proc-fa526.S b/arch/arm/mm/proc-fa526.S index 4c7a5710472b..272558a133a3 100644 --- a/arch/arm/mm/proc-fa526.S +++ b/arch/arm/mm/proc-fa526.S | |||
@@ -57,6 +57,7 @@ ENTRY(cpu_fa526_proc_fin) | |||
57 | * loc: location to jump to for soft reset | 57 | * loc: location to jump to for soft reset |
58 | */ | 58 | */ |
59 | .align 4 | 59 | .align 4 |
60 | .pushsection .idmap.text, "ax" | ||
60 | ENTRY(cpu_fa526_reset) | 61 | ENTRY(cpu_fa526_reset) |
61 | /* TODO: Use CP8 if possible... */ | 62 | /* TODO: Use CP8 if possible... */ |
62 | mov ip, #0 | 63 | mov ip, #0 |
@@ -73,6 +74,8 @@ ENTRY(cpu_fa526_reset) | |||
73 | nop | 74 | nop |
74 | nop | 75 | nop |
75 | mov pc, r0 | 76 | mov pc, r0 |
77 | ENDPROC(cpu_fa526_reset) | ||
78 | .popsection | ||
76 | 79 | ||
77 | /* | 80 | /* |
78 | * cpu_fa526_do_idle() | 81 | * cpu_fa526_do_idle() |
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S index 8a6c2f78c1c3..ba3c500584ac 100644 --- a/arch/arm/mm/proc-feroceon.S +++ b/arch/arm/mm/proc-feroceon.S | |||
@@ -98,6 +98,7 @@ ENTRY(cpu_feroceon_proc_fin) | |||
98 | * loc: location to jump to for soft reset | 98 | * loc: location to jump to for soft reset |
99 | */ | 99 | */ |
100 | .align 5 | 100 | .align 5 |
101 | .pushsection .idmap.text, "ax" | ||
101 | ENTRY(cpu_feroceon_reset) | 102 | ENTRY(cpu_feroceon_reset) |
102 | mov ip, #0 | 103 | mov ip, #0 |
103 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 104 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -110,6 +111,8 @@ ENTRY(cpu_feroceon_reset) | |||
110 | bic ip, ip, #0x1100 @ ...i...s........ | 111 | bic ip, ip, #0x1100 @ ...i...s........ |
111 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 112 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
112 | mov pc, r0 | 113 | mov pc, r0 |
114 | ENDPROC(cpu_feroceon_reset) | ||
115 | .popsection | ||
113 | 116 | ||
114 | /* | 117 | /* |
115 | * cpu_feroceon_do_idle() | 118 | * cpu_feroceon_do_idle() |
diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S index 307a4def8d3a..2d8ff3ad86d3 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S | |||
@@ -91,8 +91,9 @@ | |||
91 | #if L_PTE_SHARED != PTE_EXT_SHARED | 91 | #if L_PTE_SHARED != PTE_EXT_SHARED |
92 | #error PTE shared bit mismatch | 92 | #error PTE shared bit mismatch |
93 | #endif | 93 | #endif |
94 | #if (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\ | 94 | #if !defined (CONFIG_ARM_LPAE) && \ |
95 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED | 95 | (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\ |
96 | L_PTE_FILE+L_PTE_PRESENT) > L_PTE_SHARED | ||
96 | #error Invalid Linux PTE bit settings | 97 | #error Invalid Linux PTE bit settings |
97 | #endif | 98 | #endif |
98 | #endif /* CONFIG_MMU */ | 99 | #endif /* CONFIG_MMU */ |
diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index db52b0fb14a0..cdfedc5b8ad8 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S | |||
@@ -69,6 +69,7 @@ ENTRY(cpu_mohawk_proc_fin) | |||
69 | * (same as arm926) | 69 | * (same as arm926) |
70 | */ | 70 | */ |
71 | .align 5 | 71 | .align 5 |
72 | .pushsection .idmap.text, "ax" | ||
72 | ENTRY(cpu_mohawk_reset) | 73 | ENTRY(cpu_mohawk_reset) |
73 | mov ip, #0 | 74 | mov ip, #0 |
74 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 75 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -79,6 +80,8 @@ ENTRY(cpu_mohawk_reset) | |||
79 | bic ip, ip, #0x1100 @ ...i...s........ | 80 | bic ip, ip, #0x1100 @ ...i...s........ |
80 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 81 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
81 | mov pc, r0 | 82 | mov pc, r0 |
83 | ENDPROC(cpu_mohawk_reset) | ||
84 | .popsection | ||
82 | 85 | ||
83 | /* | 86 | /* |
84 | * cpu_mohawk_do_idle() | 87 | * cpu_mohawk_do_idle() |
diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index d50ada26edd6..775d70fba937 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S | |||
@@ -62,6 +62,7 @@ ENTRY(cpu_sa110_proc_fin) | |||
62 | * loc: location to jump to for soft reset | 62 | * loc: location to jump to for soft reset |
63 | */ | 63 | */ |
64 | .align 5 | 64 | .align 5 |
65 | .pushsection .idmap.text, "ax" | ||
65 | ENTRY(cpu_sa110_reset) | 66 | ENTRY(cpu_sa110_reset) |
66 | mov ip, #0 | 67 | mov ip, #0 |
67 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 68 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -74,6 +75,8 @@ ENTRY(cpu_sa110_reset) | |||
74 | bic ip, ip, #0x1100 @ ...i...s........ | 75 | bic ip, ip, #0x1100 @ ...i...s........ |
75 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 76 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
76 | mov pc, r0 | 77 | mov pc, r0 |
78 | ENDPROC(cpu_sa110_reset) | ||
79 | .popsection | ||
77 | 80 | ||
78 | /* | 81 | /* |
79 | * cpu_sa110_do_idle(type) | 82 | * cpu_sa110_do_idle(type) |
diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 7d91545d089b..3aa0da11fd84 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S | |||
@@ -70,6 +70,7 @@ ENTRY(cpu_sa1100_proc_fin) | |||
70 | * loc: location to jump to for soft reset | 70 | * loc: location to jump to for soft reset |
71 | */ | 71 | */ |
72 | .align 5 | 72 | .align 5 |
73 | .pushsection .idmap.text, "ax" | ||
73 | ENTRY(cpu_sa1100_reset) | 74 | ENTRY(cpu_sa1100_reset) |
74 | mov ip, #0 | 75 | mov ip, #0 |
75 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches | 76 | mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches |
@@ -82,6 +83,8 @@ ENTRY(cpu_sa1100_reset) | |||
82 | bic ip, ip, #0x1100 @ ...i...s........ | 83 | bic ip, ip, #0x1100 @ ...i...s........ |
83 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register | 84 | mcr p15, 0, ip, c1, c0, 0 @ ctrl register |
84 | mov pc, r0 | 85 | mov pc, r0 |
86 | ENDPROC(cpu_sa1100_reset) | ||
87 | .popsection | ||
85 | 88 | ||
86 | /* | 89 | /* |
87 | * cpu_sa1100_do_idle(type) | 90 | * cpu_sa1100_do_idle(type) |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index d061d2fa5506..5900cd520e84 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
@@ -55,6 +55,7 @@ ENTRY(cpu_v6_proc_fin) | |||
55 | * - loc - location to jump to for soft reset | 55 | * - loc - location to jump to for soft reset |
56 | */ | 56 | */ |
57 | .align 5 | 57 | .align 5 |
58 | .pushsection .idmap.text, "ax" | ||
58 | ENTRY(cpu_v6_reset) | 59 | ENTRY(cpu_v6_reset) |
59 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | 60 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register |
60 | bic r1, r1, #0x1 @ ...............m | 61 | bic r1, r1, #0x1 @ ...............m |
@@ -62,6 +63,8 @@ ENTRY(cpu_v6_reset) | |||
62 | mov r1, #0 | 63 | mov r1, #0 |
63 | mcr p15, 0, r1, c7, c5, 4 @ ISB | 64 | mcr p15, 0, r1, c7, c5, 4 @ ISB |
64 | mov pc, r0 | 65 | mov pc, r0 |
66 | ENDPROC(cpu_v6_reset) | ||
67 | .popsection | ||
65 | 68 | ||
66 | /* | 69 | /* |
67 | * cpu_v6_do_idle() | 70 | * cpu_v6_do_idle() |
diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S new file mode 100644 index 000000000000..3a4b3e7b888c --- /dev/null +++ b/arch/arm/mm/proc-v7-2level.S | |||
@@ -0,0 +1,171 @@ | |||
1 | /* | ||
2 | * arch/arm/mm/proc-v7-2level.S | ||
3 | * | ||
4 | * Copyright (C) 2001 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 | |||
11 | #define TTB_S (1 << 1) | ||
12 | #define TTB_RGN_NC (0 << 3) | ||
13 | #define TTB_RGN_OC_WBWA (1 << 3) | ||
14 | #define TTB_RGN_OC_WT (2 << 3) | ||
15 | #define TTB_RGN_OC_WB (3 << 3) | ||
16 | #define TTB_NOS (1 << 5) | ||
17 | #define TTB_IRGN_NC ((0 << 0) | (0 << 6)) | ||
18 | #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6)) | ||
19 | #define TTB_IRGN_WT ((1 << 0) | (0 << 6)) | ||
20 | #define TTB_IRGN_WB ((1 << 0) | (1 << 6)) | ||
21 | |||
22 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
23 | #define TTB_FLAGS_UP TTB_IRGN_WB|TTB_RGN_OC_WB | ||
24 | #define PMD_FLAGS_UP PMD_SECT_WB | ||
25 | |||
26 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
27 | #define TTB_FLAGS_SMP TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA | ||
28 | #define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S | ||
29 | |||
30 | /* | ||
31 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
32 | * | ||
33 | * Set the translation table base pointer to be pgd_phys | ||
34 | * | ||
35 | * - pgd_phys - physical address of new TTB | ||
36 | * | ||
37 | * It is assumed that: | ||
38 | * - we are not using split page tables | ||
39 | */ | ||
40 | ENTRY(cpu_v7_switch_mm) | ||
41 | #ifdef CONFIG_MMU | ||
42 | mov r2, #0 | ||
43 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
44 | ALT_SMP(orr r0, r0, #TTB_FLAGS_SMP) | ||
45 | ALT_UP(orr r0, r0, #TTB_FLAGS_UP) | ||
46 | #ifdef CONFIG_ARM_ERRATA_430973 | ||
47 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
48 | #endif | ||
49 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
50 | dsb | ||
51 | #endif | ||
52 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | ||
53 | isb | ||
54 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
55 | isb | ||
56 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
57 | dsb | ||
58 | #endif | ||
59 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | ||
60 | isb | ||
61 | #endif | ||
62 | mov pc, lr | ||
63 | ENDPROC(cpu_v7_switch_mm) | ||
64 | |||
65 | /* | ||
66 | * cpu_v7_set_pte_ext(ptep, pte) | ||
67 | * | ||
68 | * Set a level 2 translation table entry. | ||
69 | * | ||
70 | * - ptep - pointer to level 2 translation table entry | ||
71 | * (hardware version is stored at +2048 bytes) | ||
72 | * - pte - PTE value to store | ||
73 | * - ext - value for extended PTE bits | ||
74 | */ | ||
75 | ENTRY(cpu_v7_set_pte_ext) | ||
76 | #ifdef CONFIG_MMU | ||
77 | str r1, [r0] @ linux version | ||
78 | |||
79 | bic r3, r1, #0x000003f0 | ||
80 | bic r3, r3, #PTE_TYPE_MASK | ||
81 | orr r3, r3, r2 | ||
82 | orr r3, r3, #PTE_EXT_AP0 | 2 | ||
83 | |||
84 | tst r1, #1 << 4 | ||
85 | orrne r3, r3, #PTE_EXT_TEX(1) | ||
86 | |||
87 | eor r1, r1, #L_PTE_DIRTY | ||
88 | tst r1, #L_PTE_RDONLY | L_PTE_DIRTY | ||
89 | orrne r3, r3, #PTE_EXT_APX | ||
90 | |||
91 | tst r1, #L_PTE_USER | ||
92 | orrne r3, r3, #PTE_EXT_AP1 | ||
93 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
94 | @ allow kernel read/write access to read-only user pages | ||
95 | tstne r3, #PTE_EXT_APX | ||
96 | bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 | ||
97 | #endif | ||
98 | |||
99 | tst r1, #L_PTE_XN | ||
100 | orrne r3, r3, #PTE_EXT_XN | ||
101 | |||
102 | tst r1, #L_PTE_YOUNG | ||
103 | tstne r1, #L_PTE_PRESENT | ||
104 | moveq r3, #0 | ||
105 | |||
106 | ARM( str r3, [r0, #2048]! ) | ||
107 | THUMB( add r0, r0, #2048 ) | ||
108 | THUMB( str r3, [r0] ) | ||
109 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
110 | #endif | ||
111 | mov pc, lr | ||
112 | ENDPROC(cpu_v7_set_pte_ext) | ||
113 | |||
114 | /* | ||
115 | * Memory region attributes with SCTLR.TRE=1 | ||
116 | * | ||
117 | * n = TEX[0],C,B | ||
118 | * TR = PRRR[2n+1:2n] - memory type | ||
119 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
120 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
121 | * | ||
122 | * n TR IR OR | ||
123 | * UNCACHED 000 00 | ||
124 | * BUFFERABLE 001 10 00 00 | ||
125 | * WRITETHROUGH 010 10 10 10 | ||
126 | * WRITEBACK 011 10 11 11 | ||
127 | * reserved 110 | ||
128 | * WRITEALLOC 111 10 01 01 | ||
129 | * DEV_SHARED 100 01 | ||
130 | * DEV_NONSHARED 100 01 | ||
131 | * DEV_WC 001 10 | ||
132 | * DEV_CACHED 011 10 | ||
133 | * | ||
134 | * Other attributes: | ||
135 | * | ||
136 | * DS0 = PRRR[16] = 0 - device shareable property | ||
137 | * DS1 = PRRR[17] = 1 - device shareable property | ||
138 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
139 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
140 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
141 | */ | ||
142 | .equ PRRR, 0xff0a81a8 | ||
143 | .equ NMRR, 0x40e040e0 | ||
144 | |||
145 | /* | ||
146 | * Macro for setting up the TTBRx and TTBCR registers. | ||
147 | * - \ttb0 and \ttb1 updated with the corresponding flags. | ||
148 | */ | ||
149 | .macro v7_ttb_setup, zero, ttbr0, ttbr1, tmp | ||
150 | mcr p15, 0, \zero, c2, c0, 2 @ TTB control register | ||
151 | ALT_SMP(orr \ttbr0, \ttbr0, #TTB_FLAGS_SMP) | ||
152 | ALT_UP(orr \ttbr0, \ttbr0, #TTB_FLAGS_UP) | ||
153 | ALT_SMP(orr \ttbr1, \ttbr1, #TTB_FLAGS_SMP) | ||
154 | ALT_UP(orr \ttbr1, \ttbr1, #TTB_FLAGS_UP) | ||
155 | mcr p15, 0, \ttbr1, c2, c0, 1 @ load TTB1 | ||
156 | .endm | ||
157 | |||
158 | __CPUINIT | ||
159 | |||
160 | /* AT | ||
161 | * TFR EV X F I D LR S | ||
162 | * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM | ||
163 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
164 | * 1 0 110 0011 1100 .111 1101 < we want | ||
165 | */ | ||
166 | .align 2 | ||
167 | .type v7_crval, #object | ||
168 | v7_crval: | ||
169 | crval clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c | ||
170 | |||
171 | .previous | ||
diff --git a/arch/arm/mm/proc-v7-3level.S b/arch/arm/mm/proc-v7-3level.S new file mode 100644 index 000000000000..8de0f1dd1549 --- /dev/null +++ b/arch/arm/mm/proc-v7-3level.S | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * arch/arm/mm/proc-v7-3level.S | ||
3 | * | ||
4 | * Copyright (C) 2001 Deep Blue Solutions Ltd. | ||
5 | * Copyright (C) 2011 ARM Ltd. | ||
6 | * Author: Catalin Marinas <catalin.marinas@arm.com> | ||
7 | * based on arch/arm/mm/proc-v7-2level.S | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
21 | */ | ||
22 | |||
23 | #define TTB_IRGN_NC (0 << 8) | ||
24 | #define TTB_IRGN_WBWA (1 << 8) | ||
25 | #define TTB_IRGN_WT (2 << 8) | ||
26 | #define TTB_IRGN_WB (3 << 8) | ||
27 | #define TTB_RGN_NC (0 << 10) | ||
28 | #define TTB_RGN_OC_WBWA (1 << 10) | ||
29 | #define TTB_RGN_OC_WT (2 << 10) | ||
30 | #define TTB_RGN_OC_WB (3 << 10) | ||
31 | #define TTB_S (3 << 12) | ||
32 | #define TTB_EAE (1 << 31) | ||
33 | |||
34 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
35 | #define TTB_FLAGS_UP (TTB_IRGN_WB|TTB_RGN_OC_WB) | ||
36 | #define PMD_FLAGS_UP (PMD_SECT_WB) | ||
37 | |||
38 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
39 | #define TTB_FLAGS_SMP (TTB_IRGN_WBWA|TTB_S|TTB_RGN_OC_WBWA) | ||
40 | #define PMD_FLAGS_SMP (PMD_SECT_WBWA|PMD_SECT_S) | ||
41 | |||
42 | /* | ||
43 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
44 | * | ||
45 | * Set the translation table base pointer to be pgd_phys (physical address of | ||
46 | * the new TTB). | ||
47 | */ | ||
48 | ENTRY(cpu_v7_switch_mm) | ||
49 | #ifdef CONFIG_MMU | ||
50 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
51 | and r3, r1, #0xff | ||
52 | mov r3, r3, lsl #(48 - 32) @ ASID | ||
53 | mcrr p15, 0, r0, r3, c2 @ set TTB 0 | ||
54 | isb | ||
55 | #endif | ||
56 | mov pc, lr | ||
57 | ENDPROC(cpu_v7_switch_mm) | ||
58 | |||
59 | /* | ||
60 | * cpu_v7_set_pte_ext(ptep, pte) | ||
61 | * | ||
62 | * Set a level 2 translation table entry. | ||
63 | * - ptep - pointer to level 3 translation table entry | ||
64 | * - pte - PTE value to store (64-bit in r2 and r3) | ||
65 | */ | ||
66 | ENTRY(cpu_v7_set_pte_ext) | ||
67 | #ifdef CONFIG_MMU | ||
68 | tst r2, #L_PTE_PRESENT | ||
69 | beq 1f | ||
70 | tst r3, #1 << (55 - 32) @ L_PTE_DIRTY | ||
71 | orreq r2, #L_PTE_RDONLY | ||
72 | 1: strd r2, r3, [r0] | ||
73 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
74 | #endif | ||
75 | mov pc, lr | ||
76 | ENDPROC(cpu_v7_set_pte_ext) | ||
77 | |||
78 | /* | ||
79 | * Memory region attributes for LPAE (defined in pgtable-3level.h): | ||
80 | * | ||
81 | * n = AttrIndx[2:0] | ||
82 | * | ||
83 | * n MAIR | ||
84 | * UNCACHED 000 00000000 | ||
85 | * BUFFERABLE 001 01000100 | ||
86 | * DEV_WC 001 01000100 | ||
87 | * WRITETHROUGH 010 10101010 | ||
88 | * WRITEBACK 011 11101110 | ||
89 | * DEV_CACHED 011 11101110 | ||
90 | * DEV_SHARED 100 00000100 | ||
91 | * DEV_NONSHARED 100 00000100 | ||
92 | * unused 101 | ||
93 | * unused 110 | ||
94 | * WRITEALLOC 111 11111111 | ||
95 | */ | ||
96 | .equ PRRR, 0xeeaa4400 @ MAIR0 | ||
97 | .equ NMRR, 0xff000004 @ MAIR1 | ||
98 | |||
99 | /* | ||
100 | * Macro for setting up the TTBRx and TTBCR registers. | ||
101 | * - \ttbr1 updated. | ||
102 | */ | ||
103 | .macro v7_ttb_setup, zero, ttbr0, ttbr1, tmp | ||
104 | ldr \tmp, =swapper_pg_dir @ swapper_pg_dir virtual address | ||
105 | cmp \ttbr1, \tmp @ PHYS_OFFSET > PAGE_OFFSET? (branch below) | ||
106 | mrc p15, 0, \tmp, c2, c0, 2 @ TTB control register | ||
107 | orr \tmp, \tmp, #TTB_EAE | ||
108 | ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP) | ||
109 | ALT_UP(orr \tmp, \tmp, #TTB_FLAGS_UP) | ||
110 | ALT_SMP(orr \tmp, \tmp, #TTB_FLAGS_SMP << 16) | ||
111 | ALT_UP(orr \tmp, \tmp, #TTB_FLAGS_UP << 16) | ||
112 | /* | ||
113 | * TTBR0/TTBR1 split (PAGE_OFFSET): | ||
114 | * 0x40000000: T0SZ = 2, T1SZ = 0 (not used) | ||
115 | * 0x80000000: T0SZ = 0, T1SZ = 1 | ||
116 | * 0xc0000000: T0SZ = 0, T1SZ = 2 | ||
117 | * | ||
118 | * Only use this feature if PHYS_OFFSET <= PAGE_OFFSET, otherwise | ||
119 | * booting secondary CPUs would end up using TTBR1 for the identity | ||
120 | * mapping set up in TTBR0. | ||
121 | */ | ||
122 | bhi 9001f @ PHYS_OFFSET > PAGE_OFFSET? | ||
123 | orr \tmp, \tmp, #(((PAGE_OFFSET >> 30) - 1) << 16) @ TTBCR.T1SZ | ||
124 | #if defined CONFIG_VMSPLIT_2G | ||
125 | /* PAGE_OFFSET == 0x80000000, T1SZ == 1 */ | ||
126 | add \ttbr1, \ttbr1, #1 << 4 @ skip two L1 entries | ||
127 | #elif defined CONFIG_VMSPLIT_3G | ||
128 | /* PAGE_OFFSET == 0xc0000000, T1SZ == 2 */ | ||
129 | add \ttbr1, \ttbr1, #4096 * (1 + 3) @ only L2 used, skip pgd+3*pmd | ||
130 | #endif | ||
131 | /* CONFIG_VMSPLIT_1G does not need TTBR1 adjustment */ | ||
132 | 9001: mcr p15, 0, \tmp, c2, c0, 2 @ TTB control register | ||
133 | mcrr p15, 1, \ttbr1, \zero, c2 @ load TTBR1 | ||
134 | .endm | ||
135 | |||
136 | __CPUINIT | ||
137 | |||
138 | /* | ||
139 | * AT | ||
140 | * TFR EV X F IHD LR S | ||
141 | * .EEE ..EE PUI. .TAT 4RVI ZWRS BLDP WCAM | ||
142 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
143 | * 11 0 110 1 0011 1100 .111 1101 < we want | ||
144 | */ | ||
145 | .align 2 | ||
146 | .type v7_crval, #object | ||
147 | v7_crval: | ||
148 | crval clear=0x0120c302, mmuset=0x30c23c7d, ucset=0x00c01c7c | ||
149 | |||
150 | .previous | ||
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index 2c559ac38142..7efa2a721d5d 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -19,24 +19,11 @@ | |||
19 | 19 | ||
20 | #include "proc-macros.S" | 20 | #include "proc-macros.S" |
21 | 21 | ||
22 | #define TTB_S (1 << 1) | 22 | #ifdef CONFIG_ARM_LPAE |
23 | #define TTB_RGN_NC (0 << 3) | 23 | #include "proc-v7-3level.S" |
24 | #define TTB_RGN_OC_WBWA (1 << 3) | 24 | #else |
25 | #define TTB_RGN_OC_WT (2 << 3) | 25 | #include "proc-v7-2level.S" |
26 | #define TTB_RGN_OC_WB (3 << 3) | 26 | #endif |
27 | #define TTB_NOS (1 << 5) | ||
28 | #define TTB_IRGN_NC ((0 << 0) | (0 << 6)) | ||
29 | #define TTB_IRGN_WBWA ((0 << 0) | (1 << 6)) | ||
30 | #define TTB_IRGN_WT ((1 << 0) | (0 << 6)) | ||
31 | #define TTB_IRGN_WB ((1 << 0) | (1 << 6)) | ||
32 | |||
33 | /* PTWs cacheable, inner WB not shareable, outer WB not shareable */ | ||
34 | #define TTB_FLAGS_UP TTB_IRGN_WB|TTB_RGN_OC_WB | ||
35 | #define PMD_FLAGS_UP PMD_SECT_WB | ||
36 | |||
37 | /* PTWs cacheable, inner WBWA shareable, outer WBWA not shareable */ | ||
38 | #define TTB_FLAGS_SMP TTB_IRGN_WBWA|TTB_S|TTB_NOS|TTB_RGN_OC_WBWA | ||
39 | #define PMD_FLAGS_SMP PMD_SECT_WBWA|PMD_SECT_S | ||
40 | 27 | ||
41 | ENTRY(cpu_v7_proc_init) | 28 | ENTRY(cpu_v7_proc_init) |
42 | mov pc, lr | 29 | mov pc, lr |
@@ -63,6 +50,7 @@ ENDPROC(cpu_v7_proc_fin) | |||
63 | * caches disabled. | 50 | * caches disabled. |
64 | */ | 51 | */ |
65 | .align 5 | 52 | .align 5 |
53 | .pushsection .idmap.text, "ax" | ||
66 | ENTRY(cpu_v7_reset) | 54 | ENTRY(cpu_v7_reset) |
67 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register | 55 | mrc p15, 0, r1, c1, c0, 0 @ ctrl register |
68 | bic r1, r1, #0x1 @ ...............m | 56 | bic r1, r1, #0x1 @ ...............m |
@@ -71,6 +59,7 @@ ENTRY(cpu_v7_reset) | |||
71 | isb | 59 | isb |
72 | mov pc, r0 | 60 | mov pc, r0 |
73 | ENDPROC(cpu_v7_reset) | 61 | ENDPROC(cpu_v7_reset) |
62 | .popsection | ||
74 | 63 | ||
75 | /* | 64 | /* |
76 | * cpu_v7_do_idle() | 65 | * cpu_v7_do_idle() |
@@ -97,127 +86,12 @@ ENTRY(cpu_v7_dcache_clean_area) | |||
97 | mov pc, lr | 86 | mov pc, lr |
98 | ENDPROC(cpu_v7_dcache_clean_area) | 87 | ENDPROC(cpu_v7_dcache_clean_area) |
99 | 88 | ||
100 | /* | ||
101 | * cpu_v7_switch_mm(pgd_phys, tsk) | ||
102 | * | ||
103 | * Set the translation table base pointer to be pgd_phys | ||
104 | * | ||
105 | * - pgd_phys - physical address of new TTB | ||
106 | * | ||
107 | * It is assumed that: | ||
108 | * - we are not using split page tables | ||
109 | */ | ||
110 | ENTRY(cpu_v7_switch_mm) | ||
111 | #ifdef CONFIG_MMU | ||
112 | mov r2, #0 | ||
113 | ldr r1, [r1, #MM_CONTEXT_ID] @ get mm->context.id | ||
114 | ALT_SMP(orr r0, r0, #TTB_FLAGS_SMP) | ||
115 | ALT_UP(orr r0, r0, #TTB_FLAGS_UP) | ||
116 | #ifdef CONFIG_ARM_ERRATA_430973 | ||
117 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
118 | #endif | ||
119 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
120 | dsb | ||
121 | #endif | ||
122 | mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID | ||
123 | isb | ||
124 | 1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 | ||
125 | isb | ||
126 | #ifdef CONFIG_ARM_ERRATA_754322 | ||
127 | dsb | ||
128 | #endif | ||
129 | mcr p15, 0, r1, c13, c0, 1 @ set context ID | ||
130 | isb | ||
131 | #endif | ||
132 | mov pc, lr | ||
133 | ENDPROC(cpu_v7_switch_mm) | ||
134 | |||
135 | /* | ||
136 | * cpu_v7_set_pte_ext(ptep, pte) | ||
137 | * | ||
138 | * Set a level 2 translation table entry. | ||
139 | * | ||
140 | * - ptep - pointer to level 2 translation table entry | ||
141 | * (hardware version is stored at +2048 bytes) | ||
142 | * - pte - PTE value to store | ||
143 | * - ext - value for extended PTE bits | ||
144 | */ | ||
145 | ENTRY(cpu_v7_set_pte_ext) | ||
146 | #ifdef CONFIG_MMU | ||
147 | str r1, [r0] @ linux version | ||
148 | |||
149 | bic r3, r1, #0x000003f0 | ||
150 | bic r3, r3, #PTE_TYPE_MASK | ||
151 | orr r3, r3, r2 | ||
152 | orr r3, r3, #PTE_EXT_AP0 | 2 | ||
153 | |||
154 | tst r1, #1 << 4 | ||
155 | orrne r3, r3, #PTE_EXT_TEX(1) | ||
156 | |||
157 | eor r1, r1, #L_PTE_DIRTY | ||
158 | tst r1, #L_PTE_RDONLY | L_PTE_DIRTY | ||
159 | orrne r3, r3, #PTE_EXT_APX | ||
160 | |||
161 | tst r1, #L_PTE_USER | ||
162 | orrne r3, r3, #PTE_EXT_AP1 | ||
163 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
164 | @ allow kernel read/write access to read-only user pages | ||
165 | tstne r3, #PTE_EXT_APX | ||
166 | bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 | ||
167 | #endif | ||
168 | |||
169 | tst r1, #L_PTE_XN | ||
170 | orrne r3, r3, #PTE_EXT_XN | ||
171 | |||
172 | tst r1, #L_PTE_YOUNG | ||
173 | tstne r1, #L_PTE_PRESENT | ||
174 | moveq r3, #0 | ||
175 | |||
176 | ARM( str r3, [r0, #2048]! ) | ||
177 | THUMB( add r0, r0, #2048 ) | ||
178 | THUMB( str r3, [r0] ) | ||
179 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte | ||
180 | #endif | ||
181 | mov pc, lr | ||
182 | ENDPROC(cpu_v7_set_pte_ext) | ||
183 | |||
184 | string cpu_v7_name, "ARMv7 Processor" | 89 | string cpu_v7_name, "ARMv7 Processor" |
185 | .align | 90 | .align |
186 | 91 | ||
187 | /* | ||
188 | * Memory region attributes with SCTLR.TRE=1 | ||
189 | * | ||
190 | * n = TEX[0],C,B | ||
191 | * TR = PRRR[2n+1:2n] - memory type | ||
192 | * IR = NMRR[2n+1:2n] - inner cacheable property | ||
193 | * OR = NMRR[2n+17:2n+16] - outer cacheable property | ||
194 | * | ||
195 | * n TR IR OR | ||
196 | * UNCACHED 000 00 | ||
197 | * BUFFERABLE 001 10 00 00 | ||
198 | * WRITETHROUGH 010 10 10 10 | ||
199 | * WRITEBACK 011 10 11 11 | ||
200 | * reserved 110 | ||
201 | * WRITEALLOC 111 10 01 01 | ||
202 | * DEV_SHARED 100 01 | ||
203 | * DEV_NONSHARED 100 01 | ||
204 | * DEV_WC 001 10 | ||
205 | * DEV_CACHED 011 10 | ||
206 | * | ||
207 | * Other attributes: | ||
208 | * | ||
209 | * DS0 = PRRR[16] = 0 - device shareable property | ||
210 | * DS1 = PRRR[17] = 1 - device shareable property | ||
211 | * NS0 = PRRR[18] = 0 - normal shareable property | ||
212 | * NS1 = PRRR[19] = 1 - normal shareable property | ||
213 | * NOS = PRRR[24+n] = 1 - not outer shareable | ||
214 | */ | ||
215 | .equ PRRR, 0xff0a81a8 | ||
216 | .equ NMRR, 0x40e040e0 | ||
217 | |||
218 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ | 92 | /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */ |
219 | .globl cpu_v7_suspend_size | 93 | .globl cpu_v7_suspend_size |
220 | .equ cpu_v7_suspend_size, 4 * 7 | 94 | .equ cpu_v7_suspend_size, 4 * 8 |
221 | #ifdef CONFIG_ARM_CPU_SUSPEND | 95 | #ifdef CONFIG_ARM_CPU_SUSPEND |
222 | ENTRY(cpu_v7_do_suspend) | 96 | ENTRY(cpu_v7_do_suspend) |
223 | stmfd sp!, {r4 - r10, lr} | 97 | stmfd sp!, {r4 - r10, lr} |
@@ -226,10 +100,11 @@ ENTRY(cpu_v7_do_suspend) | |||
226 | stmia r0!, {r4 - r5} | 100 | stmia r0!, {r4 - r5} |
227 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID | 101 | mrc p15, 0, r6, c3, c0, 0 @ Domain ID |
228 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 | 102 | mrc p15, 0, r7, c2, c0, 1 @ TTB 1 |
103 | mrc p15, 0, r11, c2, c0, 2 @ TTB control register | ||
229 | mrc p15, 0, r8, c1, c0, 0 @ Control register | 104 | mrc p15, 0, r8, c1, c0, 0 @ Control register |
230 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register | 105 | mrc p15, 0, r9, c1, c0, 1 @ Auxiliary control register |
231 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control | 106 | mrc p15, 0, r10, c1, c0, 2 @ Co-processor access control |
232 | stmia r0, {r6 - r10} | 107 | stmia r0, {r6 - r11} |
233 | ldmfd sp!, {r4 - r10, pc} | 108 | ldmfd sp!, {r4 - r10, pc} |
234 | ENDPROC(cpu_v7_do_suspend) | 109 | ENDPROC(cpu_v7_do_suspend) |
235 | 110 | ||
@@ -241,13 +116,15 @@ ENTRY(cpu_v7_do_resume) | |||
241 | ldmia r0!, {r4 - r5} | 116 | ldmia r0!, {r4 - r5} |
242 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID | 117 | mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID |
243 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID | 118 | mcr p15, 0, r5, c13, c0, 3 @ User r/o thread ID |
244 | ldmia r0, {r6 - r10} | 119 | ldmia r0, {r6 - r11} |
245 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID | 120 | mcr p15, 0, r6, c3, c0, 0 @ Domain ID |
121 | #ifndef CONFIG_ARM_LPAE | ||
246 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) | 122 | ALT_SMP(orr r1, r1, #TTB_FLAGS_SMP) |
247 | ALT_UP(orr r1, r1, #TTB_FLAGS_UP) | 123 | ALT_UP(orr r1, r1, #TTB_FLAGS_UP) |
124 | #endif | ||
248 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 | 125 | mcr p15, 0, r1, c2, c0, 0 @ TTB 0 |
249 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 | 126 | mcr p15, 0, r7, c2, c0, 1 @ TTB 1 |
250 | mcr p15, 0, ip, c2, c0, 2 @ TTB control register | 127 | mcr p15, 0, r11, c2, c0, 2 @ TTB control register |
251 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register | 128 | mrc p15, 0, r4, c1, c0, 1 @ Read Auxiliary control register |
252 | teq r4, r9 @ Is it already set? | 129 | teq r4, r9 @ Is it already set? |
253 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it | 130 | mcrne p15, 0, r9, c1, c0, 1 @ No, so write it |
@@ -377,12 +254,7 @@ __v7_setup: | |||
377 | dsb | 254 | dsb |
378 | #ifdef CONFIG_MMU | 255 | #ifdef CONFIG_MMU |
379 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs | 256 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
380 | mcr p15, 0, r10, c2, c0, 2 @ TTB control register | 257 | v7_ttb_setup r10, r4, r8, r5 @ TTBCR, TTBRx setup |
381 | ALT_SMP(orr r4, r4, #TTB_FLAGS_SMP) | ||
382 | ALT_UP(orr r4, r4, #TTB_FLAGS_UP) | ||
383 | ALT_SMP(orr r8, r8, #TTB_FLAGS_SMP) | ||
384 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) | ||
385 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 | ||
386 | ldr r5, =PRRR @ PRRR | 258 | ldr r5, =PRRR @ PRRR |
387 | ldr r6, =NMRR @ NMRR | 259 | ldr r6, =NMRR @ NMRR |
388 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 260 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
@@ -404,16 +276,7 @@ __v7_setup: | |||
404 | mov pc, lr @ return to head.S:__ret | 276 | mov pc, lr @ return to head.S:__ret |
405 | ENDPROC(__v7_setup) | 277 | ENDPROC(__v7_setup) |
406 | 278 | ||
407 | /* AT | 279 | .align 2 |
408 | * TFR EV X F I D LR S | ||
409 | * .EEE ..EE PUI. .T.T 4RVI ZWRS BLDP WCAM | ||
410 | * rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced | ||
411 | * 1 0 110 0011 1100 .111 1101 < we want | ||
412 | */ | ||
413 | .type v7_crval, #object | ||
414 | v7_crval: | ||
415 | crval clear=0x0120c302, mmuset=0x10c03c7d, ucset=0x00c01c7c | ||
416 | |||
417 | __v7_setup_stack: | 280 | __v7_setup_stack: |
418 | .space 4 * 11 @ 11 registers | 281 | .space 4 * 11 @ 11 registers |
419 | 282 | ||
@@ -435,11 +298,11 @@ __v7_setup_stack: | |||
435 | */ | 298 | */ |
436 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 | 299 | .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 |
437 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 300 | ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
438 | PMD_FLAGS_SMP | \mm_mmuflags) | 301 | PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) |
439 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ | 302 | ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ |
440 | PMD_FLAGS_UP | \mm_mmuflags) | 303 | PMD_SECT_AF | PMD_FLAGS_UP | \mm_mmuflags) |
441 | .long PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_AP_WRITE | \ | 304 | .long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | \ |
442 | PMD_SECT_AP_READ | \io_mmuflags | 305 | PMD_SECT_AP_READ | PMD_SECT_AF | \io_mmuflags |
443 | W(b) \initfunc | 306 | W(b) \initfunc |
444 | .long cpu_arch_name | 307 | .long cpu_arch_name |
445 | .long cpu_elf_name | 308 | .long cpu_elf_name |
@@ -452,6 +315,7 @@ __v7_setup_stack: | |||
452 | .long v7_cache_fns | 315 | .long v7_cache_fns |
453 | .endm | 316 | .endm |
454 | 317 | ||
318 | #ifndef CONFIG_ARM_LPAE | ||
455 | /* | 319 | /* |
456 | * ARM Ltd. Cortex A5 processor. | 320 | * ARM Ltd. Cortex A5 processor. |
457 | */ | 321 | */ |
@@ -471,6 +335,7 @@ __v7_ca9mp_proc_info: | |||
471 | .long 0xff0ffff0 | 335 | .long 0xff0ffff0 |
472 | __v7_proc __v7_ca9mp_setup | 336 | __v7_proc __v7_ca9mp_setup |
473 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info | 337 | .size __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info |
338 | #endif /* CONFIG_ARM_LPAE */ | ||
474 | 339 | ||
475 | /* | 340 | /* |
476 | * ARM Ltd. Cortex A15 processor. | 341 | * ARM Ltd. Cortex A15 processor. |
diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index abf0507a08ae..b0d57869da2d 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S | |||
@@ -105,6 +105,7 @@ ENTRY(cpu_xsc3_proc_fin) | |||
105 | * loc: location to jump to for soft reset | 105 | * loc: location to jump to for soft reset |
106 | */ | 106 | */ |
107 | .align 5 | 107 | .align 5 |
108 | .pushsection .idmap.text, "ax" | ||
108 | ENTRY(cpu_xsc3_reset) | 109 | ENTRY(cpu_xsc3_reset) |
109 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE | 110 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE |
110 | msr cpsr_c, r1 @ reset CPSR | 111 | msr cpsr_c, r1 @ reset CPSR |
@@ -119,6 +120,8 @@ ENTRY(cpu_xsc3_reset) | |||
119 | @ already containing those two last instructions to survive. | 120 | @ already containing those two last instructions to survive. |
120 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I and D TLBs | 121 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I and D TLBs |
121 | mov pc, r0 | 122 | mov pc, r0 |
123 | ENDPROC(cpu_xsc3_reset) | ||
124 | .popsection | ||
122 | 125 | ||
123 | /* | 126 | /* |
124 | * cpu_xsc3_do_idle() | 127 | * cpu_xsc3_do_idle() |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 3277904bebaf..4ffebaa595ee 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -142,6 +142,7 @@ ENTRY(cpu_xscale_proc_fin) | |||
142 | * Beware PXA270 erratum E7. | 142 | * Beware PXA270 erratum E7. |
143 | */ | 143 | */ |
144 | .align 5 | 144 | .align 5 |
145 | .pushsection .idmap.text, "ax" | ||
145 | ENTRY(cpu_xscale_reset) | 146 | ENTRY(cpu_xscale_reset) |
146 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE | 147 | mov r1, #PSR_F_BIT|PSR_I_BIT|SVC_MODE |
147 | msr cpsr_c, r1 @ reset CPSR | 148 | msr cpsr_c, r1 @ reset CPSR |
@@ -160,6 +161,8 @@ ENTRY(cpu_xscale_reset) | |||
160 | @ already containing those two last instructions to survive. | 161 | @ already containing those two last instructions to survive. |
161 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs | 162 | mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs |
162 | mov pc, r0 | 163 | mov pc, r0 |
164 | ENDPROC(cpu_xscale_reset) | ||
165 | .popsection | ||
163 | 166 | ||
164 | /* | 167 | /* |
165 | * cpu_xscale_do_idle() | 168 | * cpu_xscale_do_idle() |
diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile index 69b09c1cec8b..90f7153a8d78 100644 --- a/arch/arm/plat-iop/Makefile +++ b/arch/arm/plat-iop/Makefile | |||
@@ -10,7 +10,6 @@ obj-$(CONFIG_ARCH_IOP32X) += i2c.o | |||
10 | obj-$(CONFIG_ARCH_IOP32X) += pci.o | 10 | obj-$(CONFIG_ARCH_IOP32X) += pci.o |
11 | obj-$(CONFIG_ARCH_IOP32X) += setup.o | 11 | obj-$(CONFIG_ARCH_IOP32X) += setup.o |
12 | obj-$(CONFIG_ARCH_IOP32X) += time.o | 12 | obj-$(CONFIG_ARCH_IOP32X) += time.o |
13 | obj-$(CONFIG_ARCH_IOP32X) += io.o | ||
14 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o | 13 | obj-$(CONFIG_ARCH_IOP32X) += cp6.o |
15 | obj-$(CONFIG_ARCH_IOP32X) += adma.o | 14 | obj-$(CONFIG_ARCH_IOP32X) += adma.o |
16 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o | 15 | obj-$(CONFIG_ARCH_IOP32X) += pmu.o |
@@ -21,7 +20,6 @@ obj-$(CONFIG_ARCH_IOP33X) += i2c.o | |||
21 | obj-$(CONFIG_ARCH_IOP33X) += pci.o | 20 | obj-$(CONFIG_ARCH_IOP33X) += pci.o |
22 | obj-$(CONFIG_ARCH_IOP33X) += setup.o | 21 | obj-$(CONFIG_ARCH_IOP33X) += setup.o |
23 | obj-$(CONFIG_ARCH_IOP33X) += time.o | 22 | obj-$(CONFIG_ARCH_IOP33X) += time.o |
24 | obj-$(CONFIG_ARCH_IOP33X) += io.o | ||
25 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o | 23 | obj-$(CONFIG_ARCH_IOP33X) += cp6.o |
26 | obj-$(CONFIG_ARCH_IOP33X) += adma.o | 24 | obj-$(CONFIG_ARCH_IOP33X) += adma.o |
27 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o | 25 | obj-$(CONFIG_ARCH_IOP33X) += pmu.o |
diff --git a/arch/arm/plat-iop/io.c b/arch/arm/plat-iop/io.c deleted file mode 100644 index e15bc17db90b..000000000000 --- a/arch/arm/plat-iop/io.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * iop3xx custom ioremap implementation | ||
3 | * Copyright (c) 2006, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
16 | * Place - Suite 330, Boston, MA 02111-1307 USA. | ||
17 | * | ||
18 | */ | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <mach/hardware.h> | ||
23 | |||
24 | void * __iomem __iop3xx_ioremap(unsigned long cookie, size_t size, | ||
25 | unsigned int mtype) | ||
26 | { | ||
27 | void __iomem * retval; | ||
28 | |||
29 | switch (cookie) { | ||
30 | case IOP3XX_PCI_LOWER_IO_PA ... IOP3XX_PCI_UPPER_IO_PA: | ||
31 | retval = (void *) IOP3XX_PCI_IO_PHYS_TO_VIRT(cookie); | ||
32 | break; | ||
33 | case IOP3XX_PERIPHERAL_PHYS_BASE ... IOP3XX_PERIPHERAL_UPPER_PA: | ||
34 | retval = (void *) IOP3XX_PMMR_PHYS_TO_VIRT(cookie); | ||
35 | break; | ||
36 | default: | ||
37 | retval = __arm_ioremap_caller(cookie, size, mtype, | ||
38 | __builtin_return_address(0)); | ||
39 | } | ||
40 | |||
41 | return retval; | ||
42 | } | ||
43 | EXPORT_SYMBOL(__iop3xx_ioremap); | ||
44 | |||
45 | void __iop3xx_iounmap(void __iomem *addr) | ||
46 | { | ||
47 | extern void __iounmap(volatile void __iomem *addr); | ||
48 | |||
49 | switch ((u32) addr) { | ||
50 | case IOP3XX_PCI_LOWER_IO_VA ... IOP3XX_PCI_UPPER_IO_VA: | ||
51 | case IOP3XX_PERIPHERAL_VIRT_BASE ... IOP3XX_PERIPHERAL_UPPER_VA: | ||
52 | goto skip; | ||
53 | } | ||
54 | __iounmap(addr); | ||
55 | |||
56 | skip: | ||
57 | return; | ||
58 | } | ||
59 | EXPORT_SYMBOL(__iop3xx_iounmap); | ||
diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile index b9f0f5f499a4..076db84f3e31 100644 --- a/arch/arm/plat-mxc/Makefile +++ b/arch/arm/plat-mxc/Makefile | |||
@@ -5,7 +5,6 @@ | |||
5 | # Common support | 5 | # Common support |
6 | obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o | 6 | obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o |
7 | 7 | ||
8 | obj-$(CONFIG_ARM_GIC) += gic.o | ||
9 | obj-$(CONFIG_MXC_TZIC) += tzic.o | 8 | obj-$(CONFIG_MXC_TZIC) += tzic.o |
10 | obj-$(CONFIG_MXC_AVIC) += avic.o | 9 | obj-$(CONFIG_MXC_AVIC) += avic.o |
11 | 10 | ||
diff --git a/arch/arm/plat-mxc/gic.c b/arch/arm/plat-mxc/gic.c deleted file mode 100644 index 12f8f8109010..000000000000 --- a/arch/arm/plat-mxc/gic.c +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Freescale Semiconductor, Inc. | ||
3 | * Copyright 2011 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/io.h> | ||
14 | #include <asm/exception.h> | ||
15 | #include <asm/localtimer.h> | ||
16 | #include <asm/hardware/gic.h> | ||
17 | #ifdef CONFIG_SMP | ||
18 | #include <asm/smp.h> | ||
19 | #endif | ||
20 | |||
21 | asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) | ||
22 | { | ||
23 | u32 irqstat, irqnr; | ||
24 | |||
25 | do { | ||
26 | irqstat = readl_relaxed(gic_cpu_base_addr + GIC_CPU_INTACK); | ||
27 | irqnr = irqstat & 0x3ff; | ||
28 | if (irqnr == 1023) | ||
29 | break; | ||
30 | |||
31 | if (irqnr > 15 && irqnr < 1021) | ||
32 | handle_IRQ(irqnr, regs); | ||
33 | #ifdef CONFIG_SMP | ||
34 | else { | ||
35 | writel_relaxed(irqstat, gic_cpu_base_addr + | ||
36 | GIC_CPU_EOI); | ||
37 | handle_IPI(irqnr, regs); | ||
38 | } | ||
39 | #endif | ||
40 | } while (1); | ||
41 | } | ||
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index c75f254abd85..6698cae942f7 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -89,7 +89,6 @@ extern void imx_print_silicon_rev(const char *cpu, int srev); | |||
89 | 89 | ||
90 | void avic_handle_irq(struct pt_regs *); | 90 | void avic_handle_irq(struct pt_regs *); |
91 | void tzic_handle_irq(struct pt_regs *); | 91 | void tzic_handle_irq(struct pt_regs *); |
92 | void gic_handle_irq(struct pt_regs *); | ||
93 | 92 | ||
94 | #define imx1_handle_irq avic_handle_irq | 93 | #define imx1_handle_irq avic_handle_irq |
95 | #define imx21_handle_irq avic_handle_irq | 94 | #define imx21_handle_irq avic_handle_irq |
diff --git a/arch/arm/plat-mxc/include/mach/entry-macro.S b/arch/arm/plat-mxc/include/mach/entry-macro.S index ca5cf26a04b1..def5d30cb67e 100644 --- a/arch/arm/plat-mxc/include/mach/entry-macro.S +++ b/arch/arm/plat-mxc/include/mach/entry-macro.S | |||
@@ -9,19 +9,8 @@ | |||
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | 11 | ||
12 | /* Unused, we use CONFIG_MULTI_IRQ_HANDLER */ | ||
13 | |||
14 | .macro disable_fiq | 12 | .macro disable_fiq |
15 | .endm | 13 | .endm |
16 | 14 | ||
17 | .macro get_irqnr_preamble, base, tmp | ||
18 | .endm | ||
19 | |||
20 | .macro arch_ret_to_user, tmp1, tmp2 | 15 | .macro arch_ret_to_user, tmp1, tmp2 |
21 | .endm | 16 | .endm |
22 | |||
23 | .macro get_irqnr_and_base, irqnr, irqstat, base, tmp | ||
24 | .endm | ||
25 | |||
26 | .macro test_for_ipi, irqnr, irqstat, base, tmp | ||
27 | .endm | ||
diff --git a/arch/arm/plat-mxc/include/mach/mx1.h b/arch/arm/plat-mxc/include/mach/mx1.h index 97b19e7800bc..2b7c08d13e89 100644 --- a/arch/arm/plat-mxc/include/mach/mx1.h +++ b/arch/arm/plat-mxc/include/mach/mx1.h | |||
@@ -12,8 +12,6 @@ | |||
12 | #ifndef __MACH_MX1_H__ | 12 | #ifndef __MACH_MX1_H__ |
13 | #define __MACH_MX1_H__ | 13 | #define __MACH_MX1_H__ |
14 | 14 | ||
15 | #include <mach/vmalloc.h> | ||
16 | |||
17 | /* | 15 | /* |
18 | * Memory map | 16 | * Memory map |
19 | */ | 17 | */ |
diff --git a/arch/arm/plat-mxc/include/mach/vmalloc.h b/arch/arm/plat-mxc/include/mach/vmalloc.h deleted file mode 100644 index ef6379c474be..000000000000 --- a/arch/arm/plat-mxc/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 Russell King. | ||
3 | * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #ifndef __ASM_ARCH_MXC_VMALLOC_H__ | ||
17 | #define __ASM_ARCH_MXC_VMALLOC_H__ | ||
18 | |||
19 | /* vmalloc ending address */ | ||
20 | #define VMALLOC_END 0xf4000000UL | ||
21 | |||
22 | #endif /* __ASM_ARCH_MXC_VMALLOC_H__ */ | ||
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index d65fb31a55ca..7e5c76ea4466 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c | |||
@@ -71,7 +71,7 @@ void arch_reset(char mode, const char *cmd) | |||
71 | mdelay(50); | 71 | mdelay(50); |
72 | 72 | ||
73 | /* we'll take a jump through zero as a poor second */ | 73 | /* we'll take a jump through zero as a poor second */ |
74 | cpu_reset(0); | 74 | soft_restart(0); |
75 | } | 75 | } |
76 | 76 | ||
77 | void mxc_arch_reset_init(void __iomem *base) | 77 | void mxc_arch_reset_init(void __iomem *base) |
diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index 985262242f25..3df04d944e4d 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # Common support | 5 | # Common support |
6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ | 6 | obj-y := common.o sram.o clock.o devices.o dma.o mux.o \ |
7 | usb.o fb.o io.o counter_32k.o | 7 | usb.o fb.o counter_32k.o |
8 | obj-m := | 8 | obj-m := |
9 | obj-n := | 9 | obj-n := |
10 | obj- := | 10 | obj- := |
diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index d9f10a31e604..2ee6341fffdb 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/dma-mapping.h> | ||
17 | #include <linux/omapfb.h> | 18 | #include <linux/omapfb.h> |
18 | 19 | ||
19 | #include <plat/common.h> | 20 | #include <plat/common.h> |
@@ -66,3 +67,10 @@ void __init omap_reserve(void) | |||
66 | omap_vram_reserve_sdram_memblock(); | 67 | omap_vram_reserve_sdram_memblock(); |
67 | omap_dsp_reserve_sdram_memblock(); | 68 | omap_dsp_reserve_sdram_memblock(); |
68 | } | 69 | } |
70 | |||
71 | void __init omap_init_consistent_dma_size(void) | ||
72 | { | ||
73 | #ifdef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE | ||
74 | init_consistent_dma_size(CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE << 20); | ||
75 | #endif | ||
76 | } | ||
diff --git a/arch/arm/plat-omap/include/plat/common.h b/arch/arm/plat-omap/include/plat/common.h index 3ff3e36580f2..257f9770b2da 100644 --- a/arch/arm/plat-omap/include/plat/common.h +++ b/arch/arm/plat-omap/include/plat/common.h | |||
@@ -27,97 +27,15 @@ | |||
27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H | 27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H |
28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H | 28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H |
29 | 29 | ||
30 | #include <linux/delay.h> | ||
31 | |||
32 | #include <plat/i2c.h> | 30 | #include <plat/i2c.h> |
33 | #include <plat/omap_hwmod.h> | 31 | #include <plat/omap_hwmod.h> |
34 | 32 | ||
35 | struct sys_timer; | ||
36 | |||
37 | extern void omap_map_common_io(void); | ||
38 | extern struct sys_timer omap1_timer; | ||
39 | extern struct sys_timer omap2_timer; | ||
40 | extern struct sys_timer omap3_timer; | ||
41 | extern struct sys_timer omap3_secure_timer; | ||
42 | extern struct sys_timer omap4_timer; | ||
43 | extern bool omap_32k_timer_init(void); | ||
44 | extern int __init omap_init_clocksource_32k(void); | 33 | extern int __init omap_init_clocksource_32k(void); |
45 | extern unsigned long long notrace omap_32k_sched_clock(void); | 34 | extern unsigned long long notrace omap_32k_sched_clock(void); |
46 | 35 | ||
47 | extern void omap_reserve(void); | 36 | extern void omap_reserve(void); |
48 | |||
49 | void omap2420_init_early(void); | ||
50 | void omap2430_init_early(void); | ||
51 | void omap3430_init_early(void); | ||
52 | void omap35xx_init_early(void); | ||
53 | void omap3630_init_early(void); | ||
54 | void omap3_init_early(void); /* Do not use this one */ | ||
55 | void am35xx_init_early(void); | ||
56 | void ti816x_init_early(void); | ||
57 | void omap4430_init_early(void); | ||
58 | |||
59 | extern int omap_dss_reset(struct omap_hwmod *); | 37 | extern int omap_dss_reset(struct omap_hwmod *); |
60 | 38 | ||
61 | void omap_sram_init(void); | 39 | void omap_sram_init(void); |
62 | 40 | ||
63 | /* | ||
64 | * IO bases for various OMAP processors | ||
65 | * Except the tap base, rest all the io bases | ||
66 | * listed are physical addresses. | ||
67 | */ | ||
68 | struct omap_globals { | ||
69 | u32 class; /* OMAP class to detect */ | ||
70 | void __iomem *tap; /* Control module ID code */ | ||
71 | void __iomem *sdrc; /* SDRAM Controller */ | ||
72 | void __iomem *sms; /* SDRAM Memory Scheduler */ | ||
73 | void __iomem *ctrl; /* System Control Module */ | ||
74 | void __iomem *ctrl_pad; /* PAD Control Module */ | ||
75 | void __iomem *prm; /* Power and Reset Management */ | ||
76 | void __iomem *cm; /* Clock Management */ | ||
77 | void __iomem *cm2; | ||
78 | }; | ||
79 | |||
80 | void omap2_set_globals_242x(void); | ||
81 | void omap2_set_globals_243x(void); | ||
82 | void omap2_set_globals_3xxx(void); | ||
83 | void omap2_set_globals_443x(void); | ||
84 | void omap2_set_globals_ti816x(void); | ||
85 | |||
86 | /* These get called from omap2_set_globals_xxxx(), do not call these */ | ||
87 | void omap2_set_globals_tap(struct omap_globals *); | ||
88 | void omap2_set_globals_sdrc(struct omap_globals *); | ||
89 | void omap2_set_globals_control(struct omap_globals *); | ||
90 | void omap2_set_globals_prcm(struct omap_globals *); | ||
91 | |||
92 | void omap242x_map_io(void); | ||
93 | void omap243x_map_io(void); | ||
94 | void omap3_map_io(void); | ||
95 | void omap4_map_io(void); | ||
96 | |||
97 | |||
98 | /** | ||
99 | * omap_test_timeout - busy-loop, testing a condition | ||
100 | * @cond: condition to test until it evaluates to true | ||
101 | * @timeout: maximum number of microseconds in the timeout | ||
102 | * @index: loop index (integer) | ||
103 | * | ||
104 | * Loop waiting for @cond to become true or until at least @timeout | ||
105 | * microseconds have passed. To use, define some integer @index in the | ||
106 | * calling code. After running, if @index == @timeout, then the loop has | ||
107 | * timed out. | ||
108 | */ | ||
109 | #define omap_test_timeout(cond, timeout, index) \ | ||
110 | ({ \ | ||
111 | for (index = 0; index < timeout; index++) { \ | ||
112 | if (cond) \ | ||
113 | break; \ | ||
114 | udelay(1); \ | ||
115 | } \ | ||
116 | }) | ||
117 | |||
118 | extern struct device *omap2_get_mpuss_device(void); | ||
119 | extern struct device *omap2_get_iva_device(void); | ||
120 | extern struct device *omap2_get_l3_device(void); | ||
121 | extern struct device *omap4_get_dsp_device(void); | ||
122 | |||
123 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ | 41 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ |
diff --git a/arch/arm/plat-omap/include/plat/io.h b/arch/arm/plat-omap/include/plat/io.h index 7f2969eadb85..1234944a4da0 100644 --- a/arch/arm/plat-omap/include/plat/io.h +++ b/arch/arm/plat-omap/include/plat/io.h | |||
@@ -247,8 +247,6 @@ | |||
247 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these | 247 | * NOTE: Please use ioremap + __raw_read/write where possible instead of these |
248 | */ | 248 | */ |
249 | 249 | ||
250 | void omap_ioremap_init(void); | ||
251 | |||
252 | extern u8 omap_readb(u32 pa); | 250 | extern u8 omap_readb(u32 pa); |
253 | extern u16 omap_readw(u32 pa); | 251 | extern u16 omap_readw(u32 pa); |
254 | extern u32 omap_readl(u32 pa); | 252 | extern u32 omap_readl(u32 pa); |
@@ -257,83 +255,9 @@ extern void omap_writew(u16 v, u32 pa); | |||
257 | extern void omap_writel(u32 v, u32 pa); | 255 | extern void omap_writel(u32 v, u32 pa); |
258 | 256 | ||
259 | struct omap_sdrc_params; | 257 | struct omap_sdrc_params; |
260 | |||
261 | #if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850) | ||
262 | void omap7xx_map_io(void); | ||
263 | #else | ||
264 | static inline void omap_map_io(void) | ||
265 | { | ||
266 | } | ||
267 | #endif | ||
268 | |||
269 | #ifdef CONFIG_ARCH_OMAP15XX | ||
270 | void omap15xx_map_io(void); | ||
271 | #else | ||
272 | static inline void omap15xx_map_io(void) | ||
273 | { | ||
274 | } | ||
275 | #endif | ||
276 | |||
277 | #ifdef CONFIG_ARCH_OMAP16XX | ||
278 | void omap16xx_map_io(void); | ||
279 | #else | ||
280 | static inline void omap16xx_map_io(void) | ||
281 | { | ||
282 | } | ||
283 | #endif | ||
284 | |||
285 | void omap1_init_early(void); | ||
286 | |||
287 | #ifdef CONFIG_SOC_OMAP2420 | ||
288 | extern void omap242x_map_common_io(void); | ||
289 | #else | ||
290 | static inline void omap242x_map_common_io(void) | ||
291 | { | ||
292 | } | ||
293 | #endif | ||
294 | |||
295 | #ifdef CONFIG_SOC_OMAP2430 | ||
296 | extern void omap243x_map_common_io(void); | ||
297 | #else | ||
298 | static inline void omap243x_map_common_io(void) | ||
299 | { | ||
300 | } | ||
301 | #endif | ||
302 | |||
303 | #ifdef CONFIG_ARCH_OMAP3 | ||
304 | extern void omap34xx_map_common_io(void); | ||
305 | #else | ||
306 | static inline void omap34xx_map_common_io(void) | ||
307 | { | ||
308 | } | ||
309 | #endif | ||
310 | |||
311 | #ifdef CONFIG_SOC_OMAPTI816X | ||
312 | extern void omapti816x_map_common_io(void); | ||
313 | #else | ||
314 | static inline void omapti816x_map_common_io(void) | ||
315 | { | ||
316 | } | ||
317 | #endif | ||
318 | |||
319 | #ifdef CONFIG_ARCH_OMAP4 | ||
320 | extern void omap44xx_map_common_io(void); | ||
321 | #else | ||
322 | static inline void omap44xx_map_common_io(void) | ||
323 | { | ||
324 | } | ||
325 | #endif | ||
326 | |||
327 | extern void omap2_init_common_infrastructure(void); | ||
328 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, | 258 | extern void omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, |
329 | struct omap_sdrc_params *sdrc_cs1); | 259 | struct omap_sdrc_params *sdrc_cs1); |
330 | 260 | ||
331 | #define __arch_ioremap omap_ioremap | ||
332 | #define __arch_iounmap omap_iounmap | ||
333 | |||
334 | void __iomem *omap_ioremap(unsigned long phys, size_t size, unsigned int type); | ||
335 | void omap_iounmap(volatile void __iomem *addr); | ||
336 | |||
337 | extern void __init omap_init_consistent_dma_size(void); | 261 | extern void __init omap_init_consistent_dma_size(void); |
338 | 262 | ||
339 | #endif | 263 | #endif |
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h index 30e10719b774..ebda7382c65b 100644 --- a/arch/arm/plat-omap/include/plat/irqs.h +++ b/arch/arm/plat-omap/include/plat/irqs.h | |||
@@ -436,20 +436,6 @@ | |||
436 | #define INTCPS_NR_MIR_REGS 3 | 436 | #define INTCPS_NR_MIR_REGS 3 |
437 | #define INTCPS_NR_IRQS 96 | 437 | #define INTCPS_NR_IRQS 96 |
438 | 438 | ||
439 | #ifndef __ASSEMBLY__ | ||
440 | extern void __iomem *omap_irq_base; | ||
441 | void omap1_init_irq(void); | ||
442 | void omap2_init_irq(void); | ||
443 | void omap3_init_irq(void); | ||
444 | void ti816x_init_irq(void); | ||
445 | extern int omap_irq_pending(void); | ||
446 | void omap_intc_save_context(void); | ||
447 | void omap_intc_restore_context(void); | ||
448 | void omap3_intc_suspend(void); | ||
449 | void omap3_intc_prepare_idle(void); | ||
450 | void omap3_intc_resume_idle(void); | ||
451 | #endif | ||
452 | |||
453 | #include <mach/hardware.h> | 439 | #include <mach/hardware.h> |
454 | 440 | ||
455 | #ifdef CONFIG_FIQ | 441 | #ifdef CONFIG_FIQ |
diff --git a/arch/arm/plat-omap/io.c b/arch/arm/plat-omap/io.c deleted file mode 100644 index 333871f59995..000000000000 --- a/arch/arm/plat-omap/io.c +++ /dev/null | |||
@@ -1,159 +0,0 @@ | |||
1 | /* | ||
2 | * Common io.c file | ||
3 | * This file is created by Russell King <rmk+kernel@arm.linux.org.uk> | ||
4 | * | ||
5 | * Copyright (C) 2009 Texas Instruments | ||
6 | * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/dma-mapping.h> | ||
16 | |||
17 | #include <plat/omap7xx.h> | ||
18 | #include <plat/omap1510.h> | ||
19 | #include <plat/omap16xx.h> | ||
20 | #include <plat/omap24xx.h> | ||
21 | #include <plat/omap34xx.h> | ||
22 | #include <plat/omap44xx.h> | ||
23 | |||
24 | #define BETWEEN(p,st,sz) ((p) >= (st) && (p) < ((st) + (sz))) | ||
25 | #define XLATE(p,pst,vst) ((void __iomem *)((p) - (pst) + (vst))) | ||
26 | |||
27 | static int initialized; | ||
28 | |||
29 | /* | ||
30 | * Intercept ioremap() requests for addresses in our fixed mapping regions. | ||
31 | */ | ||
32 | void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) | ||
33 | { | ||
34 | |||
35 | WARN(!initialized, "Do not use ioremap before init_early\n"); | ||
36 | |||
37 | #ifdef CONFIG_ARCH_OMAP1 | ||
38 | if (cpu_class_is_omap1()) { | ||
39 | if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE)) | ||
40 | return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT); | ||
41 | } | ||
42 | if (cpu_is_omap7xx()) { | ||
43 | if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE)) | ||
44 | return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START); | ||
45 | |||
46 | if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE)) | ||
47 | return XLATE(p, OMAP7XX_DSPREG_BASE, | ||
48 | OMAP7XX_DSPREG_START); | ||
49 | } | ||
50 | if (cpu_is_omap15xx()) { | ||
51 | if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE)) | ||
52 | return XLATE(p, OMAP1510_DSP_BASE, OMAP1510_DSP_START); | ||
53 | |||
54 | if (BETWEEN(p, OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_SIZE)) | ||
55 | return XLATE(p, OMAP1510_DSPREG_BASE, | ||
56 | OMAP1510_DSPREG_START); | ||
57 | } | ||
58 | if (cpu_is_omap16xx()) { | ||
59 | if (BETWEEN(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_SIZE)) | ||
60 | return XLATE(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_START); | ||
61 | |||
62 | if (BETWEEN(p, OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_SIZE)) | ||
63 | return XLATE(p, OMAP16XX_DSPREG_BASE, | ||
64 | OMAP16XX_DSPREG_START); | ||
65 | } | ||
66 | #endif | ||
67 | #ifdef CONFIG_ARCH_OMAP2 | ||
68 | if (cpu_is_omap24xx()) { | ||
69 | if (BETWEEN(p, L3_24XX_PHYS, L3_24XX_SIZE)) | ||
70 | return XLATE(p, L3_24XX_PHYS, L3_24XX_VIRT); | ||
71 | if (BETWEEN(p, L4_24XX_PHYS, L4_24XX_SIZE)) | ||
72 | return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); | ||
73 | } | ||
74 | if (cpu_is_omap2420()) { | ||
75 | if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE)) | ||
76 | return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT); | ||
77 | if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE)) | ||
78 | return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE); | ||
79 | if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE)) | ||
80 | return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT); | ||
81 | } | ||
82 | if (cpu_is_omap2430()) { | ||
83 | if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) | ||
84 | return XLATE(p, L4_WK_243X_PHYS, L4_WK_243X_VIRT); | ||
85 | if (BETWEEN(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_SIZE)) | ||
86 | return XLATE(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_VIRT); | ||
87 | if (BETWEEN(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_SIZE)) | ||
88 | return XLATE(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_VIRT); | ||
89 | if (BETWEEN(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_SIZE)) | ||
90 | return XLATE(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_VIRT); | ||
91 | } | ||
92 | #endif | ||
93 | #ifdef CONFIG_ARCH_OMAP3 | ||
94 | if (cpu_is_ti816x()) { | ||
95 | if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) | ||
96 | return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); | ||
97 | } else if (cpu_is_omap34xx()) { | ||
98 | if (BETWEEN(p, L3_34XX_PHYS, L3_34XX_SIZE)) | ||
99 | return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT); | ||
100 | if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE)) | ||
101 | return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT); | ||
102 | if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE)) | ||
103 | return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT); | ||
104 | if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE)) | ||
105 | return XLATE(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_VIRT); | ||
106 | if (BETWEEN(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_SIZE)) | ||
107 | return XLATE(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_VIRT); | ||
108 | if (BETWEEN(p, L4_PER_34XX_PHYS, L4_PER_34XX_SIZE)) | ||
109 | return XLATE(p, L4_PER_34XX_PHYS, L4_PER_34XX_VIRT); | ||
110 | if (BETWEEN(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_SIZE)) | ||
111 | return XLATE(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_VIRT); | ||
112 | } | ||
113 | #endif | ||
114 | #ifdef CONFIG_ARCH_OMAP4 | ||
115 | if (cpu_is_omap44xx()) { | ||
116 | if (BETWEEN(p, L3_44XX_PHYS, L3_44XX_SIZE)) | ||
117 | return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT); | ||
118 | if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE)) | ||
119 | return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT); | ||
120 | if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE)) | ||
121 | return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT); | ||
122 | if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE)) | ||
123 | return XLATE(p, OMAP44XX_EMIF1_PHYS, \ | ||
124 | OMAP44XX_EMIF1_VIRT); | ||
125 | if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE)) | ||
126 | return XLATE(p, OMAP44XX_EMIF2_PHYS, \ | ||
127 | OMAP44XX_EMIF2_VIRT); | ||
128 | if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE)) | ||
129 | return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT); | ||
130 | if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE)) | ||
131 | return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT); | ||
132 | if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE)) | ||
133 | return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT); | ||
134 | } | ||
135 | #endif | ||
136 | return __arm_ioremap_caller(p, size, type, __builtin_return_address(0)); | ||
137 | } | ||
138 | EXPORT_SYMBOL(omap_ioremap); | ||
139 | |||
140 | void omap_iounmap(volatile void __iomem *addr) | ||
141 | { | ||
142 | unsigned long virt = (unsigned long)addr; | ||
143 | |||
144 | if (virt >= VMALLOC_START && virt < VMALLOC_END) | ||
145 | __iounmap(addr); | ||
146 | } | ||
147 | EXPORT_SYMBOL(omap_iounmap); | ||
148 | |||
149 | void __init omap_init_consistent_dma_size(void) | ||
150 | { | ||
151 | #ifdef CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE | ||
152 | init_consistent_dma_size(CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE << 20); | ||
153 | #endif | ||
154 | } | ||
155 | |||
156 | void __init omap_ioremap_init(void) | ||
157 | { | ||
158 | initialized++; | ||
159 | } | ||
diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig index 9b9968fa8695..8167ce66188c 100644 --- a/arch/arm/plat-s5p/Kconfig +++ b/arch/arm/plat-s5p/Kconfig | |||
@@ -11,6 +11,7 @@ config PLAT_S5P | |||
11 | default y | 11 | default y |
12 | select ARM_VIC if !ARCH_EXYNOS4 | 12 | select ARM_VIC if !ARCH_EXYNOS4 |
13 | select ARM_GIC if ARCH_EXYNOS4 | 13 | select ARM_GIC if ARCH_EXYNOS4 |
14 | select GIC_NON_BANKED if ARCH_EXYNOS4 | ||
14 | select NO_IOPORT | 15 | select NO_IOPORT |
15 | select ARCH_REQUIRE_GPIOLIB | 16 | select ARCH_REQUIRE_GPIOLIB |
16 | select S3C_GPIO_TRACK | 17 | select S3C_GPIO_TRACK |
diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h index a235fa0ca777..1171f228d718 100644 --- a/arch/arm/plat-spear/include/plat/system.h +++ b/arch/arm/plat-spear/include/plat/system.h | |||
@@ -31,7 +31,7 @@ static inline void arch_reset(char mode, const char *cmd) | |||
31 | { | 31 | { |
32 | if (mode == 's') { | 32 | if (mode == 's') { |
33 | /* software reset, Jump into ROM at address 0 */ | 33 | /* software reset, Jump into ROM at address 0 */ |
34 | cpu_reset(0); | 34 | soft_restart(0); |
35 | } else { | 35 | } else { |
36 | /* hardware reset, Use on-chip reset capability */ | 36 | /* hardware reset, Use on-chip reset capability */ |
37 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); | 37 | sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE); |
diff --git a/arch/arm/plat-spear/include/plat/vmalloc.h b/arch/arm/plat-spear/include/plat/vmalloc.h deleted file mode 100644 index 8c8b24d07046..000000000000 --- a/arch/arm/plat-spear/include/plat/vmalloc.h +++ /dev/null | |||
@@ -1,19 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-spear/include/plat/vmalloc.h | ||
3 | * | ||
4 | * Defining Vmalloc area for SPEAr platform | ||
5 | * | ||
6 | * Copyright (C) 2009 ST Microelectronics | ||
7 | * Viresh Kumar<viresh.kumar@st.com> | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | #ifndef __PLAT_VMALLOC_H | ||
15 | #define __PLAT_VMALLOC_H | ||
16 | |||
17 | #define VMALLOC_END 0xF0000000UL | ||
18 | |||
19 | #endif /* __PLAT_VMALLOC_H */ | ||
diff --git a/arch/arm/plat-tcc/include/mach/vmalloc.h b/arch/arm/plat-tcc/include/mach/vmalloc.h deleted file mode 100644 index 99414d9c2b94..000000000000 --- a/arch/arm/plat-tcc/include/mach/vmalloc.h +++ /dev/null | |||
@@ -1,10 +0,0 @@ | |||
1 | /* | ||
2 | * Author: <linux@telechips.com> | ||
3 | * Created: June 10, 2008 | ||
4 | * | ||
5 | * Copyright (C) 2000 Russell King. | ||
6 | * Copyright (C) 2008-2009 Telechips | ||
7 | * | ||
8 | * Licensed under the terms of the GPL v2. | ||
9 | */ | ||
10 | #define VMALLOC_END 0xf0000000UL | ||
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index db9d1b4bfbdc..dbc7fe8ca9e7 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c | |||
@@ -21,7 +21,12 @@ | |||
21 | #include <linux/platform_data/tegra_usb.h> | 21 | #include <linux/platform_data/tegra_usb.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/usb/otg.h> | 23 | #include <linux/usb/otg.h> |
24 | #include <linux/gpio.h> | ||
25 | #include <linux/of.h> | ||
26 | #include <linux/of_gpio.h> | ||
27 | |||
24 | #include <mach/usb_phy.h> | 28 | #include <mach/usb_phy.h> |
29 | #include <mach/iomap.h> | ||
25 | 30 | ||
26 | #define TEGRA_USB_DMA_ALIGN 32 | 31 | #define TEGRA_USB_DMA_ALIGN 32 |
27 | 32 | ||
@@ -574,6 +579,35 @@ static const struct hc_driver tegra_ehci_hc_driver = { | |||
574 | .port_handed_over = ehci_port_handed_over, | 579 | .port_handed_over = ehci_port_handed_over, |
575 | }; | 580 | }; |
576 | 581 | ||
582 | static int setup_vbus_gpio(struct platform_device *pdev) | ||
583 | { | ||
584 | int err = 0; | ||
585 | int gpio; | ||
586 | |||
587 | if (!pdev->dev.of_node) | ||
588 | return 0; | ||
589 | |||
590 | gpio = of_get_named_gpio(pdev->dev.of_node, "nvidia,vbus-gpio", 0); | ||
591 | if (!gpio_is_valid(gpio)) | ||
592 | return 0; | ||
593 | |||
594 | err = gpio_request(gpio, "vbus_gpio"); | ||
595 | if (err) { | ||
596 | dev_err(&pdev->dev, "can't request vbus gpio %d", gpio); | ||
597 | return err; | ||
598 | } | ||
599 | err = gpio_direction_output(gpio, 1); | ||
600 | if (err) { | ||
601 | dev_err(&pdev->dev, "can't enable vbus\n"); | ||
602 | return err; | ||
603 | } | ||
604 | gpio_set_value(gpio, 1); | ||
605 | |||
606 | return err; | ||
607 | } | ||
608 | |||
609 | static u64 tegra_ehci_dma_mask = DMA_BIT_MASK(32); | ||
610 | |||
577 | static int tegra_ehci_probe(struct platform_device *pdev) | 611 | static int tegra_ehci_probe(struct platform_device *pdev) |
578 | { | 612 | { |
579 | struct resource *res; | 613 | struct resource *res; |
@@ -590,6 +624,15 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
590 | return -EINVAL; | 624 | return -EINVAL; |
591 | } | 625 | } |
592 | 626 | ||
627 | /* Right now device-tree probed devices don't get dma_mask set. | ||
628 | * Since shared usb code relies on it, set it here for now. | ||
629 | * Once we have dma capability bindings this can go away. | ||
630 | */ | ||
631 | if (!pdev->dev.dma_mask) | ||
632 | pdev->dev.dma_mask = &tegra_ehci_dma_mask; | ||
633 | |||
634 | setup_vbus_gpio(pdev); | ||
635 | |||
593 | tegra = kzalloc(sizeof(struct tegra_ehci_hcd), GFP_KERNEL); | 636 | tegra = kzalloc(sizeof(struct tegra_ehci_hcd), GFP_KERNEL); |
594 | if (!tegra) | 637 | if (!tegra) |
595 | return -ENOMEM; | 638 | return -ENOMEM; |
@@ -640,6 +683,28 @@ static int tegra_ehci_probe(struct platform_device *pdev) | |||
640 | goto fail_io; | 683 | goto fail_io; |
641 | } | 684 | } |
642 | 685 | ||
686 | /* This is pretty ugly and needs to be fixed when we do only | ||
687 | * device-tree probing. Old code relies on the platform_device | ||
688 | * numbering that we lack for device-tree-instantiated devices. | ||
689 | */ | ||
690 | if (instance < 0) { | ||
691 | switch (res->start) { | ||
692 | case TEGRA_USB_BASE: | ||
693 | instance = 0; | ||
694 | break; | ||
695 | case TEGRA_USB2_BASE: | ||
696 | instance = 1; | ||
697 | break; | ||
698 | case TEGRA_USB3_BASE: | ||
699 | instance = 2; | ||
700 | break; | ||
701 | default: | ||
702 | err = -ENODEV; | ||
703 | dev_err(&pdev->dev, "unknown usb instance\n"); | ||
704 | goto fail_phy; | ||
705 | } | ||
706 | } | ||
707 | |||
643 | tegra->phy = tegra_usb_phy_open(instance, hcd->regs, pdata->phy_config, | 708 | tegra->phy = tegra_usb_phy_open(instance, hcd->regs, pdata->phy_config, |
644 | TEGRA_USB_PHY_MODE_HOST); | 709 | TEGRA_USB_PHY_MODE_HOST); |
645 | if (IS_ERR(tegra->phy)) { | 710 | if (IS_ERR(tegra->phy)) { |
@@ -773,6 +838,11 @@ static void tegra_ehci_hcd_shutdown(struct platform_device *pdev) | |||
773 | hcd->driver->shutdown(hcd); | 838 | hcd->driver->shutdown(hcd); |
774 | } | 839 | } |
775 | 840 | ||
841 | static struct of_device_id tegra_ehci_of_match[] __devinitdata = { | ||
842 | { .compatible = "nvidia,tegra20-ehci", }, | ||
843 | { }, | ||
844 | }; | ||
845 | |||
776 | static struct platform_driver tegra_ehci_driver = { | 846 | static struct platform_driver tegra_ehci_driver = { |
777 | .probe = tegra_ehci_probe, | 847 | .probe = tegra_ehci_probe, |
778 | .remove = tegra_ehci_remove, | 848 | .remove = tegra_ehci_remove, |
@@ -783,5 +853,6 @@ static struct platform_driver tegra_ehci_driver = { | |||
783 | .shutdown = tegra_ehci_hcd_shutdown, | 853 | .shutdown = tegra_ehci_hcd_shutdown, |
784 | .driver = { | 854 | .driver = { |
785 | .name = "tegra-ehci", | 855 | .name = "tegra-ehci", |
856 | .of_match_table = tegra_ehci_of_match, | ||
786 | } | 857 | } |
787 | }; | 858 | }; |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 4bde182fcf93..dcdfc2bda922 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -131,6 +131,7 @@ extern long vwrite(char *buf, char *addr, unsigned long count); | |||
131 | */ | 131 | */ |
132 | extern rwlock_t vmlist_lock; | 132 | extern rwlock_t vmlist_lock; |
133 | extern struct vm_struct *vmlist; | 133 | extern struct vm_struct *vmlist; |
134 | extern __init void vm_area_add_early(struct vm_struct *vm); | ||
134 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); | 135 | extern __init void vm_area_register_early(struct vm_struct *vm, size_t align); |
135 | 136 | ||
136 | #ifdef CONFIG_SMP | 137 | #ifdef CONFIG_SMP |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 3231bf332878..e583f770dfee 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -1118,6 +1118,32 @@ void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t pro | |||
1118 | EXPORT_SYMBOL(vm_map_ram); | 1118 | EXPORT_SYMBOL(vm_map_ram); |
1119 | 1119 | ||
1120 | /** | 1120 | /** |
1121 | * vm_area_add_early - add vmap area early during boot | ||
1122 | * @vm: vm_struct to add | ||
1123 | * | ||
1124 | * This function is used to add fixed kernel vm area to vmlist before | ||
1125 | * vmalloc_init() is called. @vm->addr, @vm->size, and @vm->flags | ||
1126 | * should contain proper values and the other fields should be zero. | ||
1127 | * | ||
1128 | * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING. | ||
1129 | */ | ||
1130 | void __init vm_area_add_early(struct vm_struct *vm) | ||
1131 | { | ||
1132 | struct vm_struct *tmp, **p; | ||
1133 | |||
1134 | BUG_ON(vmap_initialized); | ||
1135 | for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { | ||
1136 | if (tmp->addr >= vm->addr) { | ||
1137 | BUG_ON(tmp->addr < vm->addr + vm->size); | ||
1138 | break; | ||
1139 | } else | ||
1140 | BUG_ON(tmp->addr + tmp->size > vm->addr); | ||
1141 | } | ||
1142 | vm->next = *p; | ||
1143 | *p = vm; | ||
1144 | } | ||
1145 | |||
1146 | /** | ||
1121 | * vm_area_register_early - register vmap area early during boot | 1147 | * vm_area_register_early - register vmap area early during boot |
1122 | * @vm: vm_struct to register | 1148 | * @vm: vm_struct to register |
1123 | * @align: requested alignment | 1149 | * @align: requested alignment |
@@ -1139,8 +1165,7 @@ void __init vm_area_register_early(struct vm_struct *vm, size_t align) | |||
1139 | 1165 | ||
1140 | vm->addr = (void *)addr; | 1166 | vm->addr = (void *)addr; |
1141 | 1167 | ||
1142 | vm->next = vmlist; | 1168 | vm_area_add_early(vm); |
1143 | vmlist = vm; | ||
1144 | } | 1169 | } |
1145 | 1170 | ||
1146 | void __init vmalloc_init(void) | 1171 | void __init vmalloc_init(void) |