diff options
43 files changed, 1387 insertions, 569 deletions
diff --git a/Documentation/devicetree/bindings/arm/mrvl/intc.txt b/Documentation/devicetree/bindings/arm/mrvl/intc.txt index 80b9a94d9a23..8b53273cb22f 100644 --- a/Documentation/devicetree/bindings/arm/mrvl/intc.txt +++ b/Documentation/devicetree/bindings/arm/mrvl/intc.txt | |||
@@ -38,3 +38,23 @@ Example: | |||
38 | reg-names = "mux status", "mux mask"; | 38 | reg-names = "mux status", "mux mask"; |
39 | mrvl,intc-nr-irqs = <2>; | 39 | mrvl,intc-nr-irqs = <2>; |
40 | }; | 40 | }; |
41 | |||
42 | * Marvell Orion Interrupt controller | ||
43 | |||
44 | Required properties | ||
45 | - compatible : Should be "marvell,orion-intc". | ||
46 | - #interrupt-cells: Specifies the number of cells needed to encode an | ||
47 | interrupt source. Supported value is <1>. | ||
48 | - interrupt-controller : Declare this node to be an interrupt controller. | ||
49 | - reg : Interrupt mask address. A list of 4 byte ranges, one per controller. | ||
50 | One entry in the list represents 32 interrupts. | ||
51 | |||
52 | Example: | ||
53 | |||
54 | intc: interrupt-controller { | ||
55 | compatible = "marvell,orion-intc", "marvell,intc"; | ||
56 | interrupt-controller; | ||
57 | #interrupt-cells = <1>; | ||
58 | reg = <0xfed20204 0x04>, | ||
59 | <0xfed20214 0x04>; | ||
60 | }; | ||
diff --git a/Documentation/devicetree/bindings/ata/marvell.txt b/Documentation/devicetree/bindings/ata/marvell.txt new file mode 100644 index 000000000000..b5cdd20cde9c --- /dev/null +++ b/Documentation/devicetree/bindings/ata/marvell.txt | |||
@@ -0,0 +1,16 @@ | |||
1 | * Marvell Orion SATA | ||
2 | |||
3 | Required Properties: | ||
4 | - compatibility : "marvell,orion-sata" | ||
5 | - reg : Address range of controller | ||
6 | - interrupts : Interrupt controller is using | ||
7 | - nr-ports : Number of SATA ports in use. | ||
8 | |||
9 | Example: | ||
10 | |||
11 | sata@80000 { | ||
12 | compatible = "marvell,orion-sata"; | ||
13 | reg = <0x80000 0x5000>; | ||
14 | interrupts = <21>; | ||
15 | nr-ports = <2>; | ||
16 | } | ||
diff --git a/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt b/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt index 05428f39d9ac..e13787498bcf 100644 --- a/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt +++ b/Documentation/devicetree/bindings/gpio/mrvl-gpio.txt | |||
@@ -27,3 +27,26 @@ Example: | |||
27 | interrupt-controller; | 27 | interrupt-controller; |
28 | #interrupt-cells = <1>; | 28 | #interrupt-cells = <1>; |
29 | }; | 29 | }; |
30 | |||
31 | * Marvell Orion GPIO Controller | ||
32 | |||
33 | Required properties: | ||
34 | - compatible : Should be "marvell,orion-gpio" | ||
35 | - reg : Address and length of the register set for controller. | ||
36 | - gpio-controller : So we know this is a gpio controller. | ||
37 | - ngpio : How many gpios this controller has. | ||
38 | - interrupts : Up to 4 Interrupts for the controller. | ||
39 | |||
40 | Optional properties: | ||
41 | - mask-offset : For SMP Orions, offset for Nth CPU | ||
42 | |||
43 | Example: | ||
44 | |||
45 | gpio0: gpio@10100 { | ||
46 | compatible = "marvell,orion-gpio"; | ||
47 | #gpio-cells = <2>; | ||
48 | gpio-controller; | ||
49 | reg = <0x10100 0x40>; | ||
50 | ngpio = <32>; | ||
51 | interrupts = <35>, <36>, <37>, <38>; | ||
52 | }; | ||
diff --git a/Documentation/devicetree/bindings/watchdog/marvel.txt b/Documentation/devicetree/bindings/watchdog/marvel.txt new file mode 100644 index 000000000000..0b2503ab0a05 --- /dev/null +++ b/Documentation/devicetree/bindings/watchdog/marvel.txt | |||
@@ -0,0 +1,14 @@ | |||
1 | * Marvell Orion Watchdog Time | ||
2 | |||
3 | Required Properties: | ||
4 | |||
5 | - Compatibility : "marvell,orion-wdt" | ||
6 | - reg : Address of the timer registers | ||
7 | |||
8 | Example: | ||
9 | |||
10 | wdt@20300 { | ||
11 | compatible = "marvell,orion-wdt"; | ||
12 | reg = <0x20300 0x28>; | ||
13 | status = "okay"; | ||
14 | }; | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7980873525b2..e91c7cdc6fe5 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1151,6 +1151,7 @@ config PLAT_ORION | |||
1151 | bool | 1151 | bool |
1152 | select CLKSRC_MMIO | 1152 | select CLKSRC_MMIO |
1153 | select GENERIC_IRQ_CHIP | 1153 | select GENERIC_IRQ_CHIP |
1154 | select IRQ_DOMAIN | ||
1154 | select COMMON_CLK | 1155 | select COMMON_CLK |
1155 | 1156 | ||
1156 | config PLAT_PXA | 1157 | config PLAT_PXA |
diff --git a/arch/arm/boot/dts/kirkwood-dns320.dts b/arch/arm/boot/dts/kirkwood-dns320.dts index 9a33077130e8..5bb0bf39d3b8 100644 --- a/arch/arm/boot/dts/kirkwood-dns320.dts +++ b/arch/arm/boot/dts/kirkwood-dns320.dts | |||
@@ -1,6 +1,6 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood-dnskw.dtsi" |
4 | 4 | ||
5 | / { | 5 | / { |
6 | model = "D-Link DNS-320 NAS (Rev A1)"; | 6 | model = "D-Link DNS-320 NAS (Rev A1)"; |
@@ -15,6 +15,31 @@ | |||
15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | 15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; |
16 | }; | 16 | }; |
17 | 17 | ||
18 | gpio-leds { | ||
19 | compatible = "gpio-leds"; | ||
20 | blue-power { | ||
21 | label = "dns320:blue:power"; | ||
22 | gpios = <&gpio0 26 1>; /* GPIO 26 Active Low */ | ||
23 | linux,default-trigger = "default-on"; | ||
24 | }; | ||
25 | blue-usb { | ||
26 | label = "dns320:blue:usb"; | ||
27 | gpios = <&gpio1 11 1>; /* GPIO 43 Active Low */ | ||
28 | }; | ||
29 | orange-l_hdd { | ||
30 | label = "dns320:orange:l_hdd"; | ||
31 | gpios = <&gpio0 28 1>; /* GPIO 28 Active Low */ | ||
32 | }; | ||
33 | orange-r_hdd { | ||
34 | label = "dns320:orange:r_hdd"; | ||
35 | gpios = <&gpio0 27 1>; /* GPIO 27 Active Low */ | ||
36 | }; | ||
37 | orange-usb { | ||
38 | label = "dns320:orange:usb"; | ||
39 | gpios = <&gpio1 3 1>; /* GPIO 35 Active Low */ | ||
40 | }; | ||
41 | }; | ||
42 | |||
18 | ocp@f1000000 { | 43 | ocp@f1000000 { |
19 | serial@12000 { | 44 | serial@12000 { |
20 | clock-frequency = <166666667>; | 45 | clock-frequency = <166666667>; |
@@ -25,40 +50,5 @@ | |||
25 | clock-frequency = <166666667>; | 50 | clock-frequency = <166666667>; |
26 | status = "okay"; | 51 | status = "okay"; |
27 | }; | 52 | }; |
28 | |||
29 | nand@3000000 { | ||
30 | status = "okay"; | ||
31 | |||
32 | partition@0 { | ||
33 | label = "u-boot"; | ||
34 | reg = <0x0000000 0x100000>; | ||
35 | read-only; | ||
36 | }; | ||
37 | |||
38 | partition@100000 { | ||
39 | label = "uImage"; | ||
40 | reg = <0x0100000 0x500000>; | ||
41 | }; | ||
42 | |||
43 | partition@600000 { | ||
44 | label = "ramdisk"; | ||
45 | reg = <0x0600000 0x500000>; | ||
46 | }; | ||
47 | |||
48 | partition@b00000 { | ||
49 | label = "image"; | ||
50 | reg = <0x0b00000 0x6600000>; | ||
51 | }; | ||
52 | |||
53 | partition@7100000 { | ||
54 | label = "mini firmware"; | ||
55 | reg = <0x7100000 0xa00000>; | ||
56 | }; | ||
57 | |||
58 | partition@7b00000 { | ||
59 | label = "config"; | ||
60 | reg = <0x7b00000 0x500000>; | ||
61 | }; | ||
62 | }; | ||
63 | }; | 53 | }; |
64 | }; | 54 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-dns325.dts b/arch/arm/boot/dts/kirkwood-dns325.dts index 16734c1b5dfe..d430713ea9b9 100644 --- a/arch/arm/boot/dts/kirkwood-dns325.dts +++ b/arch/arm/boot/dts/kirkwood-dns325.dts | |||
@@ -1,6 +1,6 @@ | |||
1 | /dts-v1/; | 1 | /dts-v1/; |
2 | 2 | ||
3 | /include/ "kirkwood.dtsi" | 3 | /include/ "kirkwood-dnskw.dtsi" |
4 | 4 | ||
5 | / { | 5 | / { |
6 | model = "D-Link DNS-325 NAS (Rev A1)"; | 6 | model = "D-Link DNS-325 NAS (Rev A1)"; |
@@ -15,45 +15,43 @@ | |||
15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | 15 | bootargs = "console=ttyS0,115200n8 earlyprintk"; |
16 | }; | 16 | }; |
17 | 17 | ||
18 | ocp@f1000000 { | 18 | gpio-leds { |
19 | serial@12000 { | 19 | compatible = "gpio-leds"; |
20 | clock-frequency = <200000000>; | 20 | white-power { |
21 | status = "okay"; | 21 | label = "dns325:white:power"; |
22 | gpios = <&gpio0 26 1>; /* GPIO 26 Active Low */ | ||
23 | linux,default-trigger = "default-on"; | ||
24 | }; | ||
25 | white-usb { | ||
26 | label = "dns325:white:usb"; | ||
27 | gpios = <&gpio1 11 1>; /* GPIO 43 Active Low */ | ||
28 | }; | ||
29 | red-l_hdd { | ||
30 | label = "dns325:red:l_hdd"; | ||
31 | gpios = <&gpio0 28 1>; /* GPIO 28 Active Low */ | ||
22 | }; | 32 | }; |
33 | red-r_hdd { | ||
34 | label = "dns325:red:r_hdd"; | ||
35 | gpios = <&gpio0 27 1>; /* GPIO 27 Active Low */ | ||
36 | }; | ||
37 | red-usb { | ||
38 | label = "dns325:red:usb"; | ||
39 | gpios = <&gpio0 29 1>; /* GPIO 29 Active Low */ | ||
40 | }; | ||
41 | }; | ||
23 | 42 | ||
24 | nand@3000000 { | 43 | ocp@f1000000 { |
44 | i2c@11000 { | ||
25 | status = "okay"; | 45 | status = "okay"; |
26 | 46 | ||
27 | partition@0 { | 47 | lm75: lm75@48 { |
28 | label = "u-boot"; | 48 | compatible = "national,lm75"; |
29 | reg = <0x0000000 0x100000>; | 49 | reg = <0x48>; |
30 | read-only; | ||
31 | }; | ||
32 | |||
33 | partition@100000 { | ||
34 | label = "uImage"; | ||
35 | reg = <0x0100000 0x500000>; | ||
36 | }; | ||
37 | |||
38 | partition@600000 { | ||
39 | label = "ramdisk"; | ||
40 | reg = <0x0600000 0x500000>; | ||
41 | }; | ||
42 | |||
43 | partition@b00000 { | ||
44 | label = "image"; | ||
45 | reg = <0x0b00000 0x6600000>; | ||
46 | }; | ||
47 | |||
48 | partition@7100000 { | ||
49 | label = "mini firmware"; | ||
50 | reg = <0x7100000 0xa00000>; | ||
51 | }; | ||
52 | |||
53 | partition@7b00000 { | ||
54 | label = "config"; | ||
55 | reg = <0x7b00000 0x500000>; | ||
56 | }; | 50 | }; |
57 | }; | 51 | }; |
52 | serial@12000 { | ||
53 | clock-frequency = <200000000>; | ||
54 | status = "okay"; | ||
55 | }; | ||
58 | }; | 56 | }; |
59 | }; | 57 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi new file mode 100644 index 000000000000..7408655f91b5 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi | |||
@@ -0,0 +1,69 @@ | |||
1 | /include/ "kirkwood.dtsi" | ||
2 | |||
3 | / { | ||
4 | model = "D-Link DNS NASes (kirkwood-based)"; | ||
5 | compatible = "dlink,dns-kirkwood", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
6 | |||
7 | gpio_keys { | ||
8 | compatible = "gpio-keys"; | ||
9 | #address-cells = <1>; | ||
10 | #size-cells = <0>; | ||
11 | button@1 { | ||
12 | label = "Power button"; | ||
13 | linux,code = <116>; | ||
14 | gpios = <&gpio1 2 1>; | ||
15 | }; | ||
16 | button@2 { | ||
17 | label = "USB unmount button"; | ||
18 | linux,code = <161>; | ||
19 | gpios = <&gpio1 15 1>; | ||
20 | }; | ||
21 | button@3 { | ||
22 | label = "Reset button"; | ||
23 | linux,code = <0x198>; | ||
24 | gpios = <&gpio1 16 1>; | ||
25 | }; | ||
26 | }; | ||
27 | |||
28 | ocp@f1000000 { | ||
29 | sata@80000 { | ||
30 | status = "okay"; | ||
31 | nr-ports = <2>; | ||
32 | }; | ||
33 | |||
34 | nand@3000000 { | ||
35 | status = "okay"; | ||
36 | |||
37 | partition@0 { | ||
38 | label = "u-boot"; | ||
39 | reg = <0x0000000 0x100000>; | ||
40 | read-only; | ||
41 | }; | ||
42 | |||
43 | partition@100000 { | ||
44 | label = "uImage"; | ||
45 | reg = <0x0100000 0x500000>; | ||
46 | }; | ||
47 | |||
48 | partition@600000 { | ||
49 | label = "ramdisk"; | ||
50 | reg = <0x0600000 0x500000>; | ||
51 | }; | ||
52 | |||
53 | partition@b00000 { | ||
54 | label = "image"; | ||
55 | reg = <0x0b00000 0x6600000>; | ||
56 | }; | ||
57 | |||
58 | partition@7100000 { | ||
59 | label = "mini firmware"; | ||
60 | reg = <0x7100000 0xa00000>; | ||
61 | }; | ||
62 | |||
63 | partition@7b00000 { | ||
64 | label = "config"; | ||
65 | reg = <0x7b00000 0x500000>; | ||
66 | }; | ||
67 | }; | ||
68 | }; | ||
69 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index 78b0f06a09a2..26e281fbf6bc 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts | |||
@@ -20,5 +20,55 @@ | |||
20 | clock-frequency = <200000000>; | 20 | clock-frequency = <200000000>; |
21 | status = "ok"; | 21 | status = "ok"; |
22 | }; | 22 | }; |
23 | |||
24 | spi@10600 { | ||
25 | status = "okay"; | ||
26 | |||
27 | m25p40@0 { | ||
28 | #address-cells = <1>; | ||
29 | #size-cells = <1>; | ||
30 | compatible = "mx25l1606e"; | ||
31 | reg = <0>; | ||
32 | spi-max-frequency = <50000000>; | ||
33 | mode = <0>; | ||
34 | |||
35 | partition@0 { | ||
36 | reg = <0x0 0x80000>; | ||
37 | label = "u-boot"; | ||
38 | }; | ||
39 | |||
40 | partition@100000 { | ||
41 | reg = <0x100000 0x10000>; | ||
42 | label = "u-boot env"; | ||
43 | }; | ||
44 | |||
45 | partition@180000 { | ||
46 | reg = <0x180000 0x10000>; | ||
47 | label = "dtb"; | ||
48 | }; | ||
49 | }; | ||
50 | }; | ||
51 | |||
52 | sata@80000 { | ||
53 | status = "okay"; | ||
54 | nr-ports = <1>; | ||
55 | }; | ||
56 | }; | ||
57 | |||
58 | gpio-leds { | ||
59 | compatible = "gpio-leds"; | ||
60 | |||
61 | bluetooth { | ||
62 | label = "dreamplug:blue:bluetooth"; | ||
63 | gpios = <&gpio1 15 1>; | ||
64 | }; | ||
65 | wifi { | ||
66 | label = "dreamplug:green:wifi"; | ||
67 | gpios = <&gpio1 16 1>; | ||
68 | }; | ||
69 | wifi-ap { | ||
70 | label = "dreamplug:green:wifi_ap"; | ||
71 | gpios = <&gpio1 17 1>; | ||
72 | }; | ||
23 | }; | 73 | }; |
24 | }; | 74 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-goflexnet.dts b/arch/arm/boot/dts/kirkwood-goflexnet.dts new file mode 100644 index 000000000000..7c8238fbb6f9 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-goflexnet.dts | |||
@@ -0,0 +1,99 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Seagate GoFlex Net"; | ||
7 | compatible = "seagate,goflexnet", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x8000000>; | ||
12 | }; | ||
13 | |||
14 | chosen { | ||
15 | bootargs = "console=ttyS0,115200n8 earlyprintk root=/dev/sda1 rootdelay=10"; | ||
16 | }; | ||
17 | |||
18 | ocp@f1000000 { | ||
19 | serial@12000 { | ||
20 | clock-frequency = <200000000>; | ||
21 | status = "ok"; | ||
22 | }; | ||
23 | |||
24 | nand@3000000 { | ||
25 | status = "okay"; | ||
26 | |||
27 | partition@0 { | ||
28 | label = "u-boot"; | ||
29 | reg = <0x0000000 0x100000>; | ||
30 | read-only; | ||
31 | }; | ||
32 | |||
33 | partition@100000 { | ||
34 | label = "uImage"; | ||
35 | reg = <0x0100000 0x400000>; | ||
36 | }; | ||
37 | |||
38 | partition@500000 { | ||
39 | label = "pogoplug"; | ||
40 | reg = <0x0500000 0x2000000>; | ||
41 | }; | ||
42 | |||
43 | partition@2500000 { | ||
44 | label = "root"; | ||
45 | reg = <0x02500000 0xd800000>; | ||
46 | }; | ||
47 | }; | ||
48 | sata@80000 { | ||
49 | status = "okay"; | ||
50 | nr-ports = <2>; | ||
51 | }; | ||
52 | |||
53 | }; | ||
54 | gpio-leds { | ||
55 | compatible = "gpio-leds"; | ||
56 | |||
57 | health { | ||
58 | label = "status:green:health"; | ||
59 | gpios = <&gpio1 14 1>; | ||
60 | linux,default-trigger = "default-on"; | ||
61 | }; | ||
62 | fault { | ||
63 | label = "status:orange:fault"; | ||
64 | gpios = <&gpio1 15 1>; | ||
65 | }; | ||
66 | left0 { | ||
67 | label = "status:white:left0"; | ||
68 | gpios = <&gpio1 10 0>; | ||
69 | }; | ||
70 | left1 { | ||
71 | label = "status:white:left1"; | ||
72 | gpios = <&gpio1 11 0>; | ||
73 | }; | ||
74 | left2 { | ||
75 | label = "status:white:left2"; | ||
76 | gpios = <&gpio1 12 0>; | ||
77 | }; | ||
78 | left3 { | ||
79 | label = "status:white:left3"; | ||
80 | gpios = <&gpio1 13 0>; | ||
81 | }; | ||
82 | right0 { | ||
83 | label = "status:white:right0"; | ||
84 | gpios = <&gpio1 6 0>; | ||
85 | }; | ||
86 | right1 { | ||
87 | label = "status:white:right1"; | ||
88 | gpios = <&gpio1 7 0>; | ||
89 | }; | ||
90 | right2 { | ||
91 | label = "status:white:right2"; | ||
92 | gpios = <&gpio1 8 0>; | ||
93 | }; | ||
94 | right3 { | ||
95 | label = "status:white:right3"; | ||
96 | gpios = <&gpio1 9 0>; | ||
97 | }; | ||
98 | }; | ||
99 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ib62x0.dts b/arch/arm/boot/dts/kirkwood-ib62x0.dts index f59dcf6dc45f..66794ed75ff1 100644 --- a/arch/arm/boot/dts/kirkwood-ib62x0.dts +++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts | |||
@@ -21,6 +21,11 @@ | |||
21 | status = "okay"; | 21 | status = "okay"; |
22 | }; | 22 | }; |
23 | 23 | ||
24 | sata@80000 { | ||
25 | status = "okay"; | ||
26 | nr-ports = <2>; | ||
27 | }; | ||
28 | |||
24 | nand@3000000 { | 29 | nand@3000000 { |
25 | status = "okay"; | 30 | status = "okay"; |
26 | 31 | ||
@@ -41,4 +46,37 @@ | |||
41 | 46 | ||
42 | }; | 47 | }; |
43 | }; | 48 | }; |
49 | |||
50 | gpio_keys { | ||
51 | compatible = "gpio-keys"; | ||
52 | #address-cells = <1>; | ||
53 | #size-cells = <0>; | ||
54 | button@1 { | ||
55 | label = "USB Copy"; | ||
56 | linux,code = <133>; | ||
57 | gpios = <&gpio0 29 1>; | ||
58 | }; | ||
59 | button@2 { | ||
60 | label = "Reset"; | ||
61 | linux,code = <0x198>; | ||
62 | gpios = <&gpio0 28 1>; | ||
63 | }; | ||
64 | }; | ||
65 | gpio-leds { | ||
66 | compatible = "gpio-leds"; | ||
67 | |||
68 | green-os { | ||
69 | label = "ib62x0:green:os"; | ||
70 | gpios = <&gpio0 25 0>; | ||
71 | linux,default-trigger = "default-on"; | ||
72 | }; | ||
73 | red-os { | ||
74 | label = "ib62x0:red:os"; | ||
75 | gpios = <&gpio0 22 0>; | ||
76 | }; | ||
77 | usb-copy { | ||
78 | label = "ib62x0:red:usb_copy"; | ||
79 | gpios = <&gpio0 27 0>; | ||
80 | }; | ||
81 | }; | ||
44 | }; | 82 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-iconnect.dts b/arch/arm/boot/dts/kirkwood-iconnect.dts index 026a1f82d813..52d947045106 100644 --- a/arch/arm/boot/dts/kirkwood-iconnect.dts +++ b/arch/arm/boot/dts/kirkwood-iconnect.dts | |||
@@ -18,9 +18,51 @@ | |||
18 | }; | 18 | }; |
19 | 19 | ||
20 | ocp@f1000000 { | 20 | ocp@f1000000 { |
21 | i2c@11000 { | ||
22 | status = "okay"; | ||
23 | |||
24 | lm63: lm63@4c { | ||
25 | compatible = "national,lm63"; | ||
26 | reg = <0x4c>; | ||
27 | }; | ||
28 | }; | ||
21 | serial@12000 { | 29 | serial@12000 { |
22 | clock-frequency = <200000000>; | 30 | clock-frequency = <200000000>; |
23 | status = "ok"; | 31 | status = "ok"; |
24 | }; | 32 | }; |
25 | }; | 33 | }; |
34 | gpio-leds { | ||
35 | compatible = "gpio-leds"; | ||
36 | |||
37 | led-level { | ||
38 | label = "led_level"; | ||
39 | gpios = <&gpio1 9 0>; | ||
40 | linux,default-trigger = "default-on"; | ||
41 | }; | ||
42 | power-blue { | ||
43 | label = "power:blue"; | ||
44 | gpios = <&gpio1 11 0>; | ||
45 | linux,default-trigger = "timer"; | ||
46 | }; | ||
47 | usb1 { | ||
48 | label = "usb1:blue"; | ||
49 | gpios = <&gpio1 12 0>; | ||
50 | }; | ||
51 | usb2 { | ||
52 | label = "usb2:blue"; | ||
53 | gpios = <&gpio1 13 0>; | ||
54 | }; | ||
55 | usb3 { | ||
56 | label = "usb3:blue"; | ||
57 | gpios = <&gpio1 14 0>; | ||
58 | }; | ||
59 | usb4 { | ||
60 | label = "usb4:blue"; | ||
61 | gpios = <&gpio1 15 0>; | ||
62 | }; | ||
63 | otb { | ||
64 | label = "otb:blue"; | ||
65 | gpios = <&gpio1 16 0>; | ||
66 | }; | ||
67 | }; | ||
26 | }; | 68 | }; |
diff --git a/arch/arm/boot/dts/kirkwood-lschlv2.dts b/arch/arm/boot/dts/kirkwood-lschlv2.dts new file mode 100644 index 000000000000..9510c9ea666c --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-lschlv2.dts | |||
@@ -0,0 +1,20 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-lsxl.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Buffalo Linkstation LS-CHLv2"; | ||
7 | compatible = "buffalo,lschlv2", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x4000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | serial@12000 { | ||
16 | clock-frequency = <166666667>; | ||
17 | status = "okay"; | ||
18 | }; | ||
19 | }; | ||
20 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-lsxhl.dts b/arch/arm/boot/dts/kirkwood-lsxhl.dts new file mode 100644 index 000000000000..739019c4cba9 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-lsxhl.dts | |||
@@ -0,0 +1,20 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-lsxl.dtsi" | ||
4 | |||
5 | / { | ||
6 | model = "Buffalo Linkstation LS-XHL"; | ||
7 | compatible = "buffalo,lsxhl", "buffalo,lsxl", "marvell,kirkwood-88f6281", "marvell,kirkwood"; | ||
8 | |||
9 | memory { | ||
10 | device_type = "memory"; | ||
11 | reg = <0x00000000 0x10000000>; | ||
12 | }; | ||
13 | |||
14 | ocp@f1000000 { | ||
15 | serial@12000 { | ||
16 | clock-frequency = <200000000>; | ||
17 | status = "okay"; | ||
18 | }; | ||
19 | }; | ||
20 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-lsxl.dtsi b/arch/arm/boot/dts/kirkwood-lsxl.dtsi new file mode 100644 index 000000000000..8ac51c08269d --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-lsxl.dtsi | |||
@@ -0,0 +1,95 @@ | |||
1 | /include/ "kirkwood.dtsi" | ||
2 | |||
3 | / { | ||
4 | chosen { | ||
5 | bootargs = "console=ttyS0,115200n8 earlyprintk"; | ||
6 | }; | ||
7 | |||
8 | ocp@f1000000 { | ||
9 | sata@80000 { | ||
10 | status = "okay"; | ||
11 | nr-ports = <1>; | ||
12 | }; | ||
13 | |||
14 | spi@10600 { | ||
15 | status = "okay"; | ||
16 | |||
17 | m25p40@0 { | ||
18 | #address-cells = <1>; | ||
19 | #size-cells = <1>; | ||
20 | compatible = "m25p40"; | ||
21 | reg = <0>; | ||
22 | spi-max-frequency = <25000000>; | ||
23 | mode = <0>; | ||
24 | |||
25 | partition@0 { | ||
26 | reg = <0x0 0x60000>; | ||
27 | label = "uboot"; | ||
28 | read-only; | ||
29 | }; | ||
30 | |||
31 | partition@60000 { | ||
32 | reg = <0x60000 0x10000>; | ||
33 | label = "dtb"; | ||
34 | read-only; | ||
35 | }; | ||
36 | |||
37 | partition@70000 { | ||
38 | reg = <0x70000 0x10000>; | ||
39 | label = "uboot_env"; | ||
40 | }; | ||
41 | }; | ||
42 | }; | ||
43 | }; | ||
44 | |||
45 | gpio_keys { | ||
46 | compatible = "gpio-keys"; | ||
47 | #address-cells = <1>; | ||
48 | #size-cells = <0>; | ||
49 | button@1 { | ||
50 | label = "Function Button"; | ||
51 | linux,code = <132>; | ||
52 | gpios = <&gpio1 9 1>; | ||
53 | }; | ||
54 | button@2 { | ||
55 | label = "Power-on Switch"; | ||
56 | linux,code = <116>; | ||
57 | gpios = <&gpio1 10 1>; | ||
58 | }; | ||
59 | button@3 { | ||
60 | label = "Power-auto Switch"; | ||
61 | linux,code = <142>; | ||
62 | gpios = <&gpio1 11 1>; | ||
63 | }; | ||
64 | }; | ||
65 | |||
66 | gpio_leds { | ||
67 | compatible = "gpio-leds"; | ||
68 | |||
69 | led@1 { | ||
70 | label = "lschlv2:blue:func"; | ||
71 | gpios = <&gpio1 4 1>; | ||
72 | }; | ||
73 | |||
74 | led@2 { | ||
75 | label = "lschlv2:red:alarm"; | ||
76 | gpios = <&gpio1 5 1>; | ||
77 | }; | ||
78 | |||
79 | led@3 { | ||
80 | label = "lschlv2:amber:info"; | ||
81 | gpios = <&gpio1 6 1>; | ||
82 | }; | ||
83 | |||
84 | led@4 { | ||
85 | label = "lschlv2:blue:power"; | ||
86 | gpios = <&gpio1 7 1>; | ||
87 | linux,default-trigger = "default-on"; | ||
88 | }; | ||
89 | |||
90 | led@5 { | ||
91 | label = "lschlv2:red:func"; | ||
92 | gpios = <&gpio1 16 1>; | ||
93 | }; | ||
94 | }; | ||
95 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6281.dts b/arch/arm/boot/dts/kirkwood-ts219-6281.dts new file mode 100644 index 000000000000..ccbf32757800 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ts219-6281.dts | |||
@@ -0,0 +1,21 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ts219.dtsi" | ||
4 | |||
5 | / { | ||
6 | gpio_keys { | ||
7 | compatible = "gpio-keys"; | ||
8 | #address-cells = <1>; | ||
9 | #size-cells = <0>; | ||
10 | button@1 { | ||
11 | label = "USB Copy"; | ||
12 | linux,code = <133>; | ||
13 | gpios = <&gpio0 15 1>; | ||
14 | }; | ||
15 | button@2 { | ||
16 | label = "Reset"; | ||
17 | linux,code = <0x198>; | ||
18 | gpios = <&gpio0 16 1>; | ||
19 | }; | ||
20 | }; | ||
21 | }; \ No newline at end of file | ||
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6282.dts b/arch/arm/boot/dts/kirkwood-ts219-6282.dts new file mode 100644 index 000000000000..fbe9932161a1 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ts219-6282.dts | |||
@@ -0,0 +1,21 @@ | |||
1 | /dts-v1/; | ||
2 | |||
3 | /include/ "kirkwood-ts219.dtsi" | ||
4 | |||
5 | / { | ||
6 | gpio_keys { | ||
7 | compatible = "gpio-keys"; | ||
8 | #address-cells = <1>; | ||
9 | #size-cells = <0>; | ||
10 | button@1 { | ||
11 | label = "USB Copy"; | ||
12 | linux,code = <133>; | ||
13 | gpios = <&gpio1 11 1>; | ||
14 | }; | ||
15 | button@2 { | ||
16 | label = "Reset"; | ||
17 | linux,code = <0x198>; | ||
18 | gpios = <&gpio1 5 1>; | ||
19 | }; | ||
20 | }; | ||
21 | }; \ No newline at end of file | ||
diff --git a/arch/arm/boot/dts/kirkwood-ts219.dtsi b/arch/arm/boot/dts/kirkwood-ts219.dtsi new file mode 100644 index 000000000000..64ea27cb3298 --- /dev/null +++ b/arch/arm/boot/dts/kirkwood-ts219.dtsi | |||
@@ -0,0 +1,78 @@ | |||
1 | /include/ "kirkwood.dtsi" | ||
2 | |||
3 | / { | ||
4 | model = "QNAP TS219 family"; | ||
5 | compatible = "qnap,ts219", "marvell,kirkwood"; | ||
6 | |||
7 | memory { | ||
8 | device_type = "memory"; | ||
9 | reg = <0x00000000 0x20000000>; | ||
10 | }; | ||
11 | |||
12 | chosen { | ||
13 | bootargs = "console=ttyS0,115200n8"; | ||
14 | }; | ||
15 | |||
16 | ocp@f1000000 { | ||
17 | i2c@11000 { | ||
18 | status = "okay"; | ||
19 | clock-frequency = <400000>; | ||
20 | |||
21 | s35390a: s35390a@30 { | ||
22 | compatible = "s35390a"; | ||
23 | reg = <0x30>; | ||
24 | }; | ||
25 | }; | ||
26 | serial@12000 { | ||
27 | clock-frequency = <200000000>; | ||
28 | status = "okay"; | ||
29 | }; | ||
30 | serial@12100 { | ||
31 | clock-frequency = <200000000>; | ||
32 | status = "okay"; | ||
33 | }; | ||
34 | spi@10600 { | ||
35 | status = "okay"; | ||
36 | |||
37 | m25p128@0 { | ||
38 | #address-cells = <1>; | ||
39 | #size-cells = <1>; | ||
40 | compatible = "m25p128"; | ||
41 | reg = <0>; | ||
42 | spi-max-frequency = <20000000>; | ||
43 | mode = <0>; | ||
44 | |||
45 | partition@0000000 { | ||
46 | reg = <0x00000000 0x00080000>; | ||
47 | label = "U-Boot"; | ||
48 | }; | ||
49 | |||
50 | partition@00200000 { | ||
51 | reg = <0x00200000 0x00200000>; | ||
52 | label = "Kernel"; | ||
53 | }; | ||
54 | |||
55 | partition@00400000 { | ||
56 | reg = <0x00400000 0x00900000>; | ||
57 | label = "RootFS1"; | ||
58 | }; | ||
59 | partition@00d00000 { | ||
60 | reg = <0x00d00000 0x00300000>; | ||
61 | label = "RootFS2"; | ||
62 | }; | ||
63 | partition@00040000 { | ||
64 | reg = <0x00080000 0x00040000>; | ||
65 | label = "U-Boot Config"; | ||
66 | }; | ||
67 | partition@000c0000 { | ||
68 | reg = <0x000c0000 0x00140000>; | ||
69 | label = "NAS Config"; | ||
70 | }; | ||
71 | }; | ||
72 | }; | ||
73 | sata@80000 { | ||
74 | status = "okay"; | ||
75 | nr-ports = <2>; | ||
76 | }; | ||
77 | }; | ||
78 | }; | ||
diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi index f95dbc190ab6..cef9616f330a 100644 --- a/arch/arm/boot/dts/kirkwood.dtsi +++ b/arch/arm/boot/dts/kirkwood.dtsi | |||
@@ -2,6 +2,15 @@ | |||
2 | 2 | ||
3 | / { | 3 | / { |
4 | compatible = "marvell,kirkwood"; | 4 | compatible = "marvell,kirkwood"; |
5 | interrupt-parent = <&intc>; | ||
6 | |||
7 | intc: interrupt-controller { | ||
8 | compatible = "marvell,orion-intc", "marvell,intc"; | ||
9 | interrupt-controller; | ||
10 | #interrupt-cells = <1>; | ||
11 | reg = <0xf1020204 0x04>, | ||
12 | <0xf1020214 0x04>; | ||
13 | }; | ||
5 | 14 | ||
6 | ocp@f1000000 { | 15 | ocp@f1000000 { |
7 | compatible = "simple-bus"; | 16 | compatible = "simple-bus"; |
@@ -9,6 +18,24 @@ | |||
9 | #address-cells = <1>; | 18 | #address-cells = <1>; |
10 | #size-cells = <1>; | 19 | #size-cells = <1>; |
11 | 20 | ||
21 | gpio0: gpio@10100 { | ||
22 | compatible = "marvell,orion-gpio"; | ||
23 | #gpio-cells = <2>; | ||
24 | gpio-controller; | ||
25 | reg = <0x10100 0x40>; | ||
26 | ngpio = <32>; | ||
27 | interrupts = <35>, <36>, <37>, <38>; | ||
28 | }; | ||
29 | |||
30 | gpio1: gpio@10140 { | ||
31 | compatible = "marvell,orion-gpio"; | ||
32 | #gpio-cells = <2>; | ||
33 | gpio-controller; | ||
34 | reg = <0x10140 0x40>; | ||
35 | ngpio = <18>; | ||
36 | interrupts = <39>, <40>, <41>; | ||
37 | }; | ||
38 | |||
12 | serial@12000 { | 39 | serial@12000 { |
13 | compatible = "ns16550a"; | 40 | compatible = "ns16550a"; |
14 | reg = <0x12000 0x100>; | 41 | reg = <0x12000 0x100>; |
@@ -33,6 +60,29 @@ | |||
33 | interrupts = <53>; | 60 | interrupts = <53>; |
34 | }; | 61 | }; |
35 | 62 | ||
63 | spi@10600 { | ||
64 | compatible = "marvell,orion-spi"; | ||
65 | #address-cells = <1>; | ||
66 | #size-cells = <0>; | ||
67 | cell-index = <0>; | ||
68 | interrupts = <23>; | ||
69 | reg = <0x10600 0x28>; | ||
70 | status = "disabled"; | ||
71 | }; | ||
72 | |||
73 | wdt@20300 { | ||
74 | compatible = "marvell,orion-wdt"; | ||
75 | reg = <0x20300 0x28>; | ||
76 | status = "okay"; | ||
77 | }; | ||
78 | |||
79 | sata@80000 { | ||
80 | compatible = "marvell,orion-sata"; | ||
81 | reg = <0x80000 0x5000>; | ||
82 | interrupts = <21>; | ||
83 | status = "disabled"; | ||
84 | }; | ||
85 | |||
36 | nand@3000000 { | 86 | nand@3000000 { |
37 | #address-cells = <1>; | 87 | #address-cells = <1>; |
38 | #size-cells = <1>; | 88 | #size-cells = <1>; |
@@ -45,5 +95,15 @@ | |||
45 | /* set partition map and/or chip-delay in board dts */ | 95 | /* set partition map and/or chip-delay in board dts */ |
46 | status = "disabled"; | 96 | status = "disabled"; |
47 | }; | 97 | }; |
98 | |||
99 | i2c@11000 { | ||
100 | compatible = "marvell,mv64xxx-i2c"; | ||
101 | reg = <0x11000 0x20>; | ||
102 | #address-cells = <1>; | ||
103 | #size-cells = <0>; | ||
104 | interrupts = <29>; | ||
105 | clock-frequency = <100000>; | ||
106 | status = "disabled"; | ||
107 | }; | ||
48 | }; | 108 | }; |
49 | }; | 109 | }; |
diff --git a/arch/arm/mach-dove/irq.c b/arch/arm/mach-dove/irq.c index f07fd16e0c9b..9bc97a5baaa8 100644 --- a/arch/arm/mach-dove/irq.c +++ b/arch/arm/mach-dove/irq.c | |||
@@ -20,22 +20,6 @@ | |||
20 | #include <mach/bridge-regs.h> | 20 | #include <mach/bridge-regs.h> |
21 | #include "common.h" | 21 | #include "common.h" |
22 | 22 | ||
23 | static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | ||
24 | { | ||
25 | int irqoff; | ||
26 | BUG_ON(irq < IRQ_DOVE_GPIO_0_7 || irq > IRQ_DOVE_HIGH_GPIO); | ||
27 | |||
28 | irqoff = irq <= IRQ_DOVE_GPIO_16_23 ? irq - IRQ_DOVE_GPIO_0_7 : | ||
29 | 3 + irq - IRQ_DOVE_GPIO_24_31; | ||
30 | |||
31 | orion_gpio_irq_handler(irqoff << 3); | ||
32 | if (irq == IRQ_DOVE_HIGH_GPIO) { | ||
33 | orion_gpio_irq_handler(40); | ||
34 | orion_gpio_irq_handler(48); | ||
35 | orion_gpio_irq_handler(56); | ||
36 | } | ||
37 | } | ||
38 | |||
39 | static void pmu_irq_mask(struct irq_data *d) | 23 | static void pmu_irq_mask(struct irq_data *d) |
40 | { | 24 | { |
41 | int pin = irq_to_pmu(d->irq); | 25 | int pin = irq_to_pmu(d->irq); |
@@ -90,6 +74,27 @@ static void pmu_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
90 | } | 74 | } |
91 | } | 75 | } |
92 | 76 | ||
77 | static int __initdata gpio0_irqs[4] = { | ||
78 | IRQ_DOVE_GPIO_0_7, | ||
79 | IRQ_DOVE_GPIO_8_15, | ||
80 | IRQ_DOVE_GPIO_16_23, | ||
81 | IRQ_DOVE_GPIO_24_31, | ||
82 | }; | ||
83 | |||
84 | static int __initdata gpio1_irqs[4] = { | ||
85 | IRQ_DOVE_HIGH_GPIO, | ||
86 | 0, | ||
87 | 0, | ||
88 | 0, | ||
89 | }; | ||
90 | |||
91 | static int __initdata gpio2_irqs[4] = { | ||
92 | 0, | ||
93 | 0, | ||
94 | 0, | ||
95 | 0, | ||
96 | }; | ||
97 | |||
93 | void __init dove_init_irq(void) | 98 | void __init dove_init_irq(void) |
94 | { | 99 | { |
95 | int i; | 100 | int i; |
@@ -100,19 +105,14 @@ void __init dove_init_irq(void) | |||
100 | /* | 105 | /* |
101 | * Initialize gpiolib for GPIOs 0-71. | 106 | * Initialize gpiolib for GPIOs 0-71. |
102 | */ | 107 | */ |
103 | orion_gpio_init(0, 32, DOVE_GPIO_LO_VIRT_BASE, 0, | 108 | orion_gpio_init(NULL, 0, 32, (void __iomem *)DOVE_GPIO_LO_VIRT_BASE, 0, |
104 | IRQ_DOVE_GPIO_START); | 109 | IRQ_DOVE_GPIO_START, gpio0_irqs); |
105 | irq_set_chained_handler(IRQ_DOVE_GPIO_0_7, gpio_irq_handler); | 110 | |
106 | irq_set_chained_handler(IRQ_DOVE_GPIO_8_15, gpio_irq_handler); | 111 | orion_gpio_init(NULL, 32, 32, (void __iomem *)DOVE_GPIO_HI_VIRT_BASE, 0, |
107 | irq_set_chained_handler(IRQ_DOVE_GPIO_16_23, gpio_irq_handler); | 112 | IRQ_DOVE_GPIO_START + 32, gpio1_irqs); |
108 | irq_set_chained_handler(IRQ_DOVE_GPIO_24_31, gpio_irq_handler); | 113 | |
109 | 114 | orion_gpio_init(NULL, 64, 8, (void __iomem *)DOVE_GPIO2_VIRT_BASE, 0, | |
110 | orion_gpio_init(32, 32, DOVE_GPIO_HI_VIRT_BASE, 0, | 115 | IRQ_DOVE_GPIO_START + 64, gpio2_irqs); |
111 | IRQ_DOVE_GPIO_START + 32); | ||
112 | irq_set_chained_handler(IRQ_DOVE_HIGH_GPIO, gpio_irq_handler); | ||
113 | |||
114 | orion_gpio_init(64, 8, DOVE_GPIO2_VIRT_BASE, 0, | ||
115 | IRQ_DOVE_GPIO_START + 64); | ||
116 | 116 | ||
117 | /* | 117 | /* |
118 | * Mask and clear PMU interrupts | 118 | * Mask and clear PMU interrupts |
diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig index 199764fe0fb0..ca5c15a4e626 100644 --- a/arch/arm/mach-kirkwood/Kconfig +++ b/arch/arm/mach-kirkwood/Kconfig | |||
@@ -80,6 +80,35 @@ config MACH_IB62X0_DT | |||
80 | RaidSonic IB-NAS6210 & IB-NAS6220 devices, using | 80 | RaidSonic IB-NAS6210 & IB-NAS6220 devices, using |
81 | Flattened Device Tree. | 81 | Flattened Device Tree. |
82 | 82 | ||
83 | config MACH_TS219_DT | ||
84 | bool "Device Tree for QNAP TS-11X, TS-21X NAS" | ||
85 | select ARCH_KIRKWOOD_DT | ||
86 | select ARM_APPENDED_DTB | ||
87 | select ARM_ATAG_DTB_COMPAT | ||
88 | help | ||
89 | Say 'Y' here if you want your kernel to support the QNAP | ||
90 | TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and | ||
91 | TS-219P+ Turbo NAS devices using Fattened Device Tree. | ||
92 | There are two different Device Tree descriptions, depending | ||
93 | on if the device is based on an if the board uses the MV6281 | ||
94 | or MV6282. If you have the wrong one, the buttons will not | ||
95 | work. | ||
96 | |||
97 | config MACH_GOFLEXNET_DT | ||
98 | bool "Seagate GoFlex Net (Flattened Device Tree)" | ||
99 | select ARCH_KIRKWOOD_DT | ||
100 | help | ||
101 | Say 'Y' here if you want your kernel to support the | ||
102 | Seagate GoFlex Net (Flattened Device Tree). | ||
103 | |||
104 | config MACH_LSXL_DT | ||
105 | bool "Buffalo Linkstation LS-XHL, LS-CHLv2 (Flattened Device Tree)" | ||
106 | select ARCH_KIRKWOOD_DT | ||
107 | help | ||
108 | Say 'Y' here if you want your kernel to support the | ||
109 | Buffalo Linkstation LS-XHL & LS-CHLv2 devices, using | ||
110 | Flattened Device Tree. | ||
111 | |||
83 | config MACH_TS219 | 112 | config MACH_TS219 |
84 | bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" | 113 | bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" |
85 | help | 114 | help |
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile index d2b05907b10e..055c85a1cc46 100644 --- a/arch/arm/mach-kirkwood/Makefile +++ b/arch/arm/mach-kirkwood/Makefile | |||
@@ -25,3 +25,6 @@ obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o | |||
25 | obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o | 25 | obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o |
26 | obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += board-dnskw.o | 26 | obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += board-dnskw.o |
27 | obj-$(CONFIG_MACH_IB62X0_DT) += board-ib62x0.o | 27 | obj-$(CONFIG_MACH_IB62X0_DT) += board-ib62x0.o |
28 | obj-$(CONFIG_MACH_TS219_DT) += board-ts219.o tsx1x-common.o | ||
29 | obj-$(CONFIG_MACH_GOFLEXNET_DT) += board-goflexnet.o | ||
30 | obj-$(CONFIG_MACH_LSXL_DT) += board-lsxl.o | ||
diff --git a/arch/arm/mach-kirkwood/Makefile.boot b/arch/arm/mach-kirkwood/Makefile.boot index 02edbdf5b065..2a576abf409b 100644 --- a/arch/arm/mach-kirkwood/Makefile.boot +++ b/arch/arm/mach-kirkwood/Makefile.boot | |||
@@ -7,3 +7,7 @@ dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns320.dtb | |||
7 | dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb | 7 | dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb |
8 | dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb | 8 | dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb |
9 | dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb | 9 | dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb |
10 | dtb-$(CONFIG_MACH_TS219_DT) += kirkwood-qnap-ts219.dtb | ||
11 | dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb | ||
12 | dbt-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb | ||
13 | dbt-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb | ||
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c index 58c2d68f9443..4ab35065a144 100644 --- a/arch/arm/mach-kirkwood/board-dnskw.c +++ b/arch/arm/mach-kirkwood/board-dnskw.c | |||
@@ -14,13 +14,11 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/i2c.h> | ||
18 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
19 | #include <linux/mv643xx_eth.h> | 18 | #include <linux/mv643xx_eth.h> |
20 | #include <linux/of.h> | 19 | #include <linux/of.h> |
21 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
22 | #include <linux/input.h> | 21 | #include <linux/input.h> |
23 | #include <linux/gpio_keys.h> | ||
24 | #include <linux/gpio-fan.h> | 22 | #include <linux/gpio-fan.h> |
25 | #include <linux/leds.h> | 23 | #include <linux/leds.h> |
26 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
@@ -35,10 +33,6 @@ static struct mv643xx_eth_platform_data dnskw_ge00_data = { | |||
35 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 33 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
36 | }; | 34 | }; |
37 | 35 | ||
38 | static struct mv_sata_platform_data dnskw_sata_data = { | ||
39 | .n_ports = 2, | ||
40 | }; | ||
41 | |||
42 | static unsigned int dnskw_mpp_config[] __initdata = { | 36 | static unsigned int dnskw_mpp_config[] __initdata = { |
43 | MPP13_UART1_TXD, /* Custom ... */ | 37 | MPP13_UART1_TXD, /* Custom ... */ |
44 | MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */ | 38 | MPP14_UART1_RXD, /* ... Controller (DNS-320 only) */ |
@@ -73,132 +67,6 @@ static unsigned int dnskw_mpp_config[] __initdata = { | |||
73 | 0 | 67 | 0 |
74 | }; | 68 | }; |
75 | 69 | ||
76 | static struct gpio_led dns325_led_pins[] = { | ||
77 | { | ||
78 | .name = "dns325:white:power", | ||
79 | .gpio = 26, | ||
80 | .active_low = 1, | ||
81 | .default_trigger = "default-on", | ||
82 | }, | ||
83 | { | ||
84 | .name = "dns325:white:usb", | ||
85 | .gpio = 43, | ||
86 | .active_low = 1, | ||
87 | }, | ||
88 | { | ||
89 | .name = "dns325:red:l_hdd", | ||
90 | .gpio = 28, | ||
91 | .active_low = 1, | ||
92 | }, | ||
93 | { | ||
94 | .name = "dns325:red:r_hdd", | ||
95 | .gpio = 27, | ||
96 | .active_low = 1, | ||
97 | }, | ||
98 | { | ||
99 | .name = "dns325:red:usb", | ||
100 | .gpio = 29, | ||
101 | .active_low = 1, | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static struct gpio_led_platform_data dns325_led_data = { | ||
106 | .num_leds = ARRAY_SIZE(dns325_led_pins), | ||
107 | .leds = dns325_led_pins, | ||
108 | }; | ||
109 | |||
110 | static struct platform_device dns325_led_device = { | ||
111 | .name = "leds-gpio", | ||
112 | .id = -1, | ||
113 | .dev = { | ||
114 | .platform_data = &dns325_led_data, | ||
115 | }, | ||
116 | }; | ||
117 | |||
118 | static struct gpio_led dns320_led_pins[] = { | ||
119 | { | ||
120 | .name = "dns320:blue:power", | ||
121 | .gpio = 26, | ||
122 | .active_low = 1, | ||
123 | .default_trigger = "default-on", | ||
124 | }, | ||
125 | { | ||
126 | .name = "dns320:blue:usb", | ||
127 | .gpio = 43, | ||
128 | .active_low = 1, | ||
129 | }, | ||
130 | { | ||
131 | .name = "dns320:orange:l_hdd", | ||
132 | .gpio = 28, | ||
133 | .active_low = 1, | ||
134 | }, | ||
135 | { | ||
136 | .name = "dns320:orange:r_hdd", | ||
137 | .gpio = 27, | ||
138 | .active_low = 1, | ||
139 | }, | ||
140 | { | ||
141 | .name = "dns320:orange:usb", | ||
142 | .gpio = 35, | ||
143 | .active_low = 1, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | static struct gpio_led_platform_data dns320_led_data = { | ||
148 | .num_leds = ARRAY_SIZE(dns320_led_pins), | ||
149 | .leds = dns320_led_pins, | ||
150 | }; | ||
151 | |||
152 | static struct platform_device dns320_led_device = { | ||
153 | .name = "leds-gpio", | ||
154 | .id = -1, | ||
155 | .dev = { | ||
156 | .platform_data = &dns320_led_data, | ||
157 | }, | ||
158 | }; | ||
159 | |||
160 | static struct i2c_board_info dns325_i2c_board_info[] __initdata = { | ||
161 | { | ||
162 | I2C_BOARD_INFO("lm75", 0x48), | ||
163 | }, | ||
164 | /* Something at 0x0c also */ | ||
165 | }; | ||
166 | |||
167 | static struct gpio_keys_button dnskw_button_pins[] = { | ||
168 | { | ||
169 | .code = KEY_POWER, | ||
170 | .gpio = 34, | ||
171 | .desc = "Power button", | ||
172 | .active_low = 1, | ||
173 | }, | ||
174 | { | ||
175 | .code = KEY_EJECTCD, | ||
176 | .gpio = 47, | ||
177 | .desc = "USB unmount button", | ||
178 | .active_low = 1, | ||
179 | }, | ||
180 | { | ||
181 | .code = KEY_RESTART, | ||
182 | .gpio = 48, | ||
183 | .desc = "Reset button", | ||
184 | .active_low = 1, | ||
185 | }, | ||
186 | }; | ||
187 | |||
188 | static struct gpio_keys_platform_data dnskw_button_data = { | ||
189 | .buttons = dnskw_button_pins, | ||
190 | .nbuttons = ARRAY_SIZE(dnskw_button_pins), | ||
191 | }; | ||
192 | |||
193 | static struct platform_device dnskw_button_device = { | ||
194 | .name = "gpio-keys", | ||
195 | .id = -1, | ||
196 | .num_resources = 0, | ||
197 | .dev = { | ||
198 | .platform_data = &dnskw_button_data, | ||
199 | } | ||
200 | }; | ||
201 | |||
202 | /* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */ | 70 | /* Fan: ADDA AD045HB-G73 40mm 6000rpm@5v */ |
203 | static struct gpio_fan_speed dnskw_fan_speed[] = { | 71 | static struct gpio_fan_speed dnskw_fan_speed[] = { |
204 | { 0, 0 }, | 72 | { 0, 0 }, |
@@ -245,20 +113,9 @@ void __init dnskw_init(void) | |||
245 | 113 | ||
246 | kirkwood_ehci_init(); | 114 | kirkwood_ehci_init(); |
247 | kirkwood_ge00_init(&dnskw_ge00_data); | 115 | kirkwood_ge00_init(&dnskw_ge00_data); |
248 | kirkwood_sata_init(&dnskw_sata_data); | ||
249 | kirkwood_i2c_init(); | ||
250 | 116 | ||
251 | platform_device_register(&dnskw_button_device); | ||
252 | platform_device_register(&dnskw_fan_device); | 117 | platform_device_register(&dnskw_fan_device); |
253 | 118 | ||
254 | if (of_machine_is_compatible("dlink,dns-325")) { | ||
255 | i2c_register_board_info(0, dns325_i2c_board_info, | ||
256 | ARRAY_SIZE(dns325_i2c_board_info)); | ||
257 | platform_device_register(&dns325_led_device); | ||
258 | |||
259 | } else if (of_machine_is_compatible("dlink,dns-320")) | ||
260 | platform_device_register(&dns320_led_device); | ||
261 | |||
262 | /* Register power-off GPIO. */ | 119 | /* Register power-off GPIO. */ |
263 | if (gpio_request(36, "dnskw:power:off") == 0 | 120 | if (gpio_request(36, "dnskw:power:off") == 0 |
264 | && gpio_direction_output(36, 0) == 0) | 121 | && gpio_direction_output(36, 0) == 0) |
diff --git a/arch/arm/mach-kirkwood/board-dreamplug.c b/arch/arm/mach-kirkwood/board-dreamplug.c index 55e357ab2923..aeb234d0d0e3 100644 --- a/arch/arm/mach-kirkwood/board-dreamplug.c +++ b/arch/arm/mach-kirkwood/board-dreamplug.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/mtd/partitions.h> | ||
18 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
19 | #include <linux/mv643xx_eth.h> | 18 | #include <linux/mv643xx_eth.h> |
20 | #include <linux/of.h> | 19 | #include <linux/of.h> |
@@ -23,7 +22,6 @@ | |||
23 | #include <linux/of_irq.h> | 22 | #include <linux/of_irq.h> |
24 | #include <linux/of_platform.h> | 23 | #include <linux/of_platform.h> |
25 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
26 | #include <linux/leds.h> | ||
27 | #include <linux/mtd/physmap.h> | 25 | #include <linux/mtd/physmap.h> |
28 | #include <linux/spi/flash.h> | 26 | #include <linux/spi/flash.h> |
29 | #include <linux/spi/spi.h> | 27 | #include <linux/spi/spi.h> |
@@ -36,42 +34,6 @@ | |||
36 | #include "common.h" | 34 | #include "common.h" |
37 | #include "mpp.h" | 35 | #include "mpp.h" |
38 | 36 | ||
39 | struct mtd_partition dreamplug_partitions[] = { | ||
40 | { | ||
41 | .name = "u-boot", | ||
42 | .size = SZ_512K, | ||
43 | .offset = 0, | ||
44 | }, | ||
45 | { | ||
46 | .name = "u-boot env", | ||
47 | .size = SZ_64K, | ||
48 | .offset = SZ_512K + SZ_512K, | ||
49 | }, | ||
50 | { | ||
51 | .name = "dtb", | ||
52 | .size = SZ_64K, | ||
53 | .offset = SZ_512K + SZ_512K + SZ_512K, | ||
54 | }, | ||
55 | }; | ||
56 | |||
57 | static const struct flash_platform_data dreamplug_spi_slave_data = { | ||
58 | .type = "mx25l1606e", | ||
59 | .name = "spi_flash", | ||
60 | .parts = dreamplug_partitions, | ||
61 | .nr_parts = ARRAY_SIZE(dreamplug_partitions), | ||
62 | }; | ||
63 | |||
64 | static struct spi_board_info __initdata dreamplug_spi_slave_info[] = { | ||
65 | { | ||
66 | .modalias = "m25p80", | ||
67 | .platform_data = &dreamplug_spi_slave_data, | ||
68 | .irq = -1, | ||
69 | .max_speed_hz = 50000000, | ||
70 | .bus_num = 0, | ||
71 | .chip_select = 0, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { | 37 | static struct mv643xx_eth_platform_data dreamplug_ge00_data = { |
76 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | 38 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), |
77 | }; | 39 | }; |
@@ -80,45 +42,10 @@ static struct mv643xx_eth_platform_data dreamplug_ge01_data = { | |||
80 | .phy_addr = MV643XX_ETH_PHY_ADDR(1), | 42 | .phy_addr = MV643XX_ETH_PHY_ADDR(1), |
81 | }; | 43 | }; |
82 | 44 | ||
83 | static struct mv_sata_platform_data dreamplug_sata_data = { | ||
84 | .n_ports = 1, | ||
85 | }; | ||
86 | |||
87 | static struct mvsdio_platform_data dreamplug_mvsdio_data = { | 45 | static struct mvsdio_platform_data dreamplug_mvsdio_data = { |
88 | /* unfortunately the CD signal has not been connected */ | 46 | /* unfortunately the CD signal has not been connected */ |
89 | }; | 47 | }; |
90 | 48 | ||
91 | static struct gpio_led dreamplug_led_pins[] = { | ||
92 | { | ||
93 | .name = "dreamplug:blue:bluetooth", | ||
94 | .gpio = 47, | ||
95 | .active_low = 1, | ||
96 | }, | ||
97 | { | ||
98 | .name = "dreamplug:green:wifi", | ||
99 | .gpio = 48, | ||
100 | .active_low = 1, | ||
101 | }, | ||
102 | { | ||
103 | .name = "dreamplug:green:wifi_ap", | ||
104 | .gpio = 49, | ||
105 | .active_low = 1, | ||
106 | }, | ||
107 | }; | ||
108 | |||
109 | static struct gpio_led_platform_data dreamplug_led_data = { | ||
110 | .leds = dreamplug_led_pins, | ||
111 | .num_leds = ARRAY_SIZE(dreamplug_led_pins), | ||
112 | }; | ||
113 | |||
114 | static struct platform_device dreamplug_leds = { | ||
115 | .name = "leds-gpio", | ||
116 | .id = -1, | ||
117 | .dev = { | ||
118 | .platform_data = &dreamplug_led_data, | ||
119 | } | ||
120 | }; | ||
121 | |||
122 | static unsigned int dreamplug_mpp_config[] __initdata = { | 49 | static unsigned int dreamplug_mpp_config[] __initdata = { |
123 | MPP0_SPI_SCn, | 50 | MPP0_SPI_SCn, |
124 | MPP1_SPI_MOSI, | 51 | MPP1_SPI_MOSI, |
@@ -137,15 +64,8 @@ void __init dreamplug_init(void) | |||
137 | */ | 64 | */ |
138 | kirkwood_mpp_conf(dreamplug_mpp_config); | 65 | kirkwood_mpp_conf(dreamplug_mpp_config); |
139 | 66 | ||
140 | spi_register_board_info(dreamplug_spi_slave_info, | ||
141 | ARRAY_SIZE(dreamplug_spi_slave_info)); | ||
142 | kirkwood_spi_init(); | ||
143 | |||
144 | kirkwood_ehci_init(); | 67 | kirkwood_ehci_init(); |
145 | kirkwood_ge00_init(&dreamplug_ge00_data); | 68 | kirkwood_ge00_init(&dreamplug_ge00_data); |
146 | kirkwood_ge01_init(&dreamplug_ge01_data); | 69 | kirkwood_ge01_init(&dreamplug_ge01_data); |
147 | kirkwood_sata_init(&dreamplug_sata_data); | ||
148 | kirkwood_sdio_init(&dreamplug_mvsdio_data); | 70 | kirkwood_sdio_init(&dreamplug_mvsdio_data); |
149 | |||
150 | platform_device_register(&dreamplug_leds); | ||
151 | } | 71 | } |
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index edc3f8a9d45e..e4eb450de301 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/mach/arch.h> | 18 | #include <asm/mach/arch.h> |
19 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
20 | #include <mach/bridge-regs.h> | 20 | #include <mach/bridge-regs.h> |
21 | #include <plat/irq.h> | ||
21 | #include "common.h" | 22 | #include "common.h" |
22 | 23 | ||
23 | static struct of_device_id kirkwood_dt_match_table[] __initdata = { | 24 | static struct of_device_id kirkwood_dt_match_table[] __initdata = { |
@@ -25,6 +26,16 @@ static struct of_device_id kirkwood_dt_match_table[] __initdata = { | |||
25 | { } | 26 | { } |
26 | }; | 27 | }; |
27 | 28 | ||
29 | struct of_dev_auxdata kirkwood_auxdata_lookup[] __initdata = { | ||
30 | OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL), | ||
31 | OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0", | ||
32 | NULL), | ||
33 | OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL), | ||
34 | OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL), | ||
35 | OF_DEV_AUXDATA("marvell,orion-nand", 0xf4000000, "orion_nand", NULL), | ||
36 | {}, | ||
37 | }; | ||
38 | |||
28 | static void __init kirkwood_dt_init(void) | 39 | static void __init kirkwood_dt_init(void) |
29 | { | 40 | { |
30 | pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk); | 41 | pr_info("Kirkwood: %s, TCLK=%d.\n", kirkwood_id(), kirkwood_tclk); |
@@ -47,7 +58,6 @@ static void __init kirkwood_dt_init(void) | |||
47 | kirkwood_clk_init(); | 58 | kirkwood_clk_init(); |
48 | 59 | ||
49 | /* internal devices that every board has */ | 60 | /* internal devices that every board has */ |
50 | kirkwood_wdt_init(); | ||
51 | kirkwood_xor0_init(); | 61 | kirkwood_xor0_init(); |
52 | kirkwood_xor1_init(); | 62 | kirkwood_xor1_init(); |
53 | kirkwood_crypto_init(); | 63 | kirkwood_crypto_init(); |
@@ -68,7 +78,17 @@ static void __init kirkwood_dt_init(void) | |||
68 | if (of_machine_is_compatible("raidsonic,ib-nas62x0")) | 78 | if (of_machine_is_compatible("raidsonic,ib-nas62x0")) |
69 | ib62x0_init(); | 79 | ib62x0_init(); |
70 | 80 | ||
71 | of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL); | 81 | if (of_machine_is_compatible("qnap,ts219")) |
82 | qnap_dt_ts219_init(); | ||
83 | |||
84 | if (of_machine_is_compatible("seagate,goflexnet")) | ||
85 | goflexnet_init(); | ||
86 | |||
87 | if (of_machine_is_compatible("buffalo,lsxl")) | ||
88 | lsxl_init(); | ||
89 | |||
90 | of_platform_populate(NULL, kirkwood_dt_match_table, | ||
91 | kirkwood_auxdata_lookup, NULL); | ||
72 | } | 92 | } |
73 | 93 | ||
74 | static const char *kirkwood_dt_board_compat[] = { | 94 | static const char *kirkwood_dt_board_compat[] = { |
@@ -77,6 +97,9 @@ static const char *kirkwood_dt_board_compat[] = { | |||
77 | "dlink,dns-325", | 97 | "dlink,dns-325", |
78 | "iom,iconnect", | 98 | "iom,iconnect", |
79 | "raidsonic,ib-nas62x0", | 99 | "raidsonic,ib-nas62x0", |
100 | "qnap,ts219", | ||
101 | "seagate,goflexnet", | ||
102 | "buffalo,lsxl", | ||
80 | NULL | 103 | NULL |
81 | }; | 104 | }; |
82 | 105 | ||
@@ -84,7 +107,7 @@ DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)") | |||
84 | /* Maintainer: Jason Cooper <jason@lakedaemon.net> */ | 107 | /* Maintainer: Jason Cooper <jason@lakedaemon.net> */ |
85 | .map_io = kirkwood_map_io, | 108 | .map_io = kirkwood_map_io, |
86 | .init_early = kirkwood_init_early, | 109 | .init_early = kirkwood_init_early, |
87 | .init_irq = kirkwood_init_irq, | 110 | .init_irq = orion_dt_init_irq, |
88 | .timer = &kirkwood_timer, | 111 | .timer = &kirkwood_timer, |
89 | .init_machine = kirkwood_dt_init, | 112 | .init_machine = kirkwood_dt_init, |
90 | .restart = kirkwood_restart, | 113 | .restart = kirkwood_restart, |
diff --git a/arch/arm/mach-kirkwood/board-goflexnet.c b/arch/arm/mach-kirkwood/board-goflexnet.c new file mode 100644 index 000000000000..413e2c8ef5fe --- /dev/null +++ b/arch/arm/mach-kirkwood/board-goflexnet.c | |||
@@ -0,0 +1,71 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-goflexnet.c | ||
5 | * | ||
6 | * Seagate GoFlext Net Board Init for drivers not converted to | ||
7 | * flattened device tree yet. | ||
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 | * Copied and modified for Seagate GoFlex Net support by | ||
14 | * Joshua Coombs <josh.coombs@gmail.com> based on ArchLinux ARM's | ||
15 | * GoFlex kernel patches. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/ata_platform.h> | ||
23 | #include <linux/mv643xx_eth.h> | ||
24 | #include <linux/of.h> | ||
25 | #include <linux/of_address.h> | ||
26 | #include <linux/of_fdt.h> | ||
27 | #include <linux/of_irq.h> | ||
28 | #include <linux/of_platform.h> | ||
29 | #include <linux/gpio.h> | ||
30 | #include <asm/mach-types.h> | ||
31 | #include <asm/mach/arch.h> | ||
32 | #include <asm/mach/map.h> | ||
33 | #include <mach/kirkwood.h> | ||
34 | #include <mach/bridge-regs.h> | ||
35 | #include <plat/mvsdio.h> | ||
36 | #include "common.h" | ||
37 | #include "mpp.h" | ||
38 | |||
39 | static struct mv643xx_eth_platform_data goflexnet_ge00_data = { | ||
40 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
41 | }; | ||
42 | |||
43 | static unsigned int goflexnet_mpp_config[] __initdata = { | ||
44 | MPP29_GPIO, /* USB Power Enable */ | ||
45 | MPP47_GPIO, /* LED Orange */ | ||
46 | MPP46_GPIO, /* LED Green */ | ||
47 | MPP45_GPIO, /* LED Left Capacity 3 */ | ||
48 | MPP44_GPIO, /* LED Left Capacity 2 */ | ||
49 | MPP43_GPIO, /* LED Left Capacity 1 */ | ||
50 | MPP42_GPIO, /* LED Left Capacity 0 */ | ||
51 | MPP41_GPIO, /* LED Right Capacity 3 */ | ||
52 | MPP40_GPIO, /* LED Right Capacity 2 */ | ||
53 | MPP39_GPIO, /* LED Right Capacity 1 */ | ||
54 | MPP38_GPIO, /* LED Right Capacity 0 */ | ||
55 | 0 | ||
56 | }; | ||
57 | |||
58 | void __init goflexnet_init(void) | ||
59 | { | ||
60 | /* | ||
61 | * Basic setup. Needs to be called early. | ||
62 | */ | ||
63 | kirkwood_mpp_conf(goflexnet_mpp_config); | ||
64 | |||
65 | if (gpio_request(29, "USB Power Enable") != 0 || | ||
66 | gpio_direction_output(29, 1) != 0) | ||
67 | pr_err("can't setup GPIO 29 (USB Power Enable)\n"); | ||
68 | kirkwood_ehci_init(); | ||
69 | |||
70 | kirkwood_ge00_init(&goflexnet_ge00_data); | ||
71 | } | ||
diff --git a/arch/arm/mach-kirkwood/board-ib62x0.c b/arch/arm/mach-kirkwood/board-ib62x0.c index eddf1df8891f..cfc47f80e734 100644 --- a/arch/arm/mach-kirkwood/board-ib62x0.c +++ b/arch/arm/mach-kirkwood/board-ib62x0.c | |||
@@ -18,9 +18,7 @@ | |||
18 | #include <linux/ata_platform.h> | 18 | #include <linux/ata_platform.h> |
19 | #include <linux/mv643xx_eth.h> | 19 | #include <linux/mv643xx_eth.h> |
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | #include <linux/gpio_keys.h> | ||
22 | #include <linux/input.h> | 21 | #include <linux/input.h> |
23 | #include <linux/leds.h> | ||
24 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
25 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
26 | #include <mach/kirkwood.h> | 24 | #include <mach/kirkwood.h> |
@@ -33,10 +31,6 @@ static struct mv643xx_eth_platform_data ib62x0_ge00_data = { | |||
33 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | 31 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), |
34 | }; | 32 | }; |
35 | 33 | ||
36 | static struct mv_sata_platform_data ib62x0_sata_data = { | ||
37 | .n_ports = 2, | ||
38 | }; | ||
39 | |||
40 | static unsigned int ib62x0_mpp_config[] __initdata = { | 34 | static unsigned int ib62x0_mpp_config[] __initdata = { |
41 | MPP0_NF_IO2, | 35 | MPP0_NF_IO2, |
42 | MPP1_NF_IO3, | 36 | MPP1_NF_IO3, |
@@ -55,69 +49,6 @@ static unsigned int ib62x0_mpp_config[] __initdata = { | |||
55 | 0 | 49 | 0 |
56 | }; | 50 | }; |
57 | 51 | ||
58 | static struct gpio_led ib62x0_led_pins[] = { | ||
59 | { | ||
60 | .name = "ib62x0:green:os", | ||
61 | .default_trigger = "default-on", | ||
62 | .gpio = 25, | ||
63 | .active_low = 0, | ||
64 | }, | ||
65 | { | ||
66 | .name = "ib62x0:red:os", | ||
67 | .default_trigger = "none", | ||
68 | .gpio = 22, | ||
69 | .active_low = 0, | ||
70 | }, | ||
71 | { | ||
72 | .name = "ib62x0:red:usb_copy", | ||
73 | .default_trigger = "none", | ||
74 | .gpio = 27, | ||
75 | .active_low = 0, | ||
76 | }, | ||
77 | }; | ||
78 | |||
79 | static struct gpio_led_platform_data ib62x0_led_data = { | ||
80 | .leds = ib62x0_led_pins, | ||
81 | .num_leds = ARRAY_SIZE(ib62x0_led_pins), | ||
82 | }; | ||
83 | |||
84 | static struct platform_device ib62x0_led_device = { | ||
85 | .name = "leds-gpio", | ||
86 | .id = -1, | ||
87 | .dev = { | ||
88 | .platform_data = &ib62x0_led_data, | ||
89 | } | ||
90 | }; | ||
91 | |||
92 | static struct gpio_keys_button ib62x0_button_pins[] = { | ||
93 | { | ||
94 | .code = KEY_COPY, | ||
95 | .gpio = 29, | ||
96 | .desc = "USB Copy", | ||
97 | .active_low = 1, | ||
98 | }, | ||
99 | { | ||
100 | .code = KEY_RESTART, | ||
101 | .gpio = 28, | ||
102 | .desc = "Reset", | ||
103 | .active_low = 1, | ||
104 | }, | ||
105 | }; | ||
106 | |||
107 | static struct gpio_keys_platform_data ib62x0_button_data = { | ||
108 | .buttons = ib62x0_button_pins, | ||
109 | .nbuttons = ARRAY_SIZE(ib62x0_button_pins), | ||
110 | }; | ||
111 | |||
112 | static struct platform_device ib62x0_button_device = { | ||
113 | .name = "gpio-keys", | ||
114 | .id = -1, | ||
115 | .num_resources = 0, | ||
116 | .dev = { | ||
117 | .platform_data = &ib62x0_button_data, | ||
118 | } | ||
119 | }; | ||
120 | |||
121 | static void ib62x0_power_off(void) | 52 | static void ib62x0_power_off(void) |
122 | { | 53 | { |
123 | gpio_set_value(IB62X0_GPIO_POWER_OFF, 1); | 54 | gpio_set_value(IB62X0_GPIO_POWER_OFF, 1); |
@@ -132,9 +63,6 @@ void __init ib62x0_init(void) | |||
132 | 63 | ||
133 | kirkwood_ehci_init(); | 64 | kirkwood_ehci_init(); |
134 | kirkwood_ge00_init(&ib62x0_ge00_data); | 65 | kirkwood_ge00_init(&ib62x0_ge00_data); |
135 | kirkwood_sata_init(&ib62x0_sata_data); | ||
136 | platform_device_register(&ib62x0_led_device); | ||
137 | platform_device_register(&ib62x0_button_device); | ||
138 | if (gpio_request(IB62X0_GPIO_POWER_OFF, "ib62x0:power:off") == 0 && | 66 | if (gpio_request(IB62X0_GPIO_POWER_OFF, "ib62x0:power:off") == 0 && |
139 | gpio_direction_output(IB62X0_GPIO_POWER_OFF, 0) == 0) | 67 | gpio_direction_output(IB62X0_GPIO_POWER_OFF, 0) == 0) |
140 | pm_power_off = ib62x0_power_off; | 68 | pm_power_off = ib62x0_power_off; |
diff --git a/arch/arm/mach-kirkwood/board-iconnect.c b/arch/arm/mach-kirkwood/board-iconnect.c index b0d3cc49269d..d7a9198ed300 100644 --- a/arch/arm/mach-kirkwood/board-iconnect.c +++ b/arch/arm/mach-kirkwood/board-iconnect.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #include <linux/mtd/partitions.h> | 19 | #include <linux/mtd/partitions.h> |
20 | #include <linux/mv643xx_eth.h> | 20 | #include <linux/mv643xx_eth.h> |
21 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
22 | #include <linux/leds.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/input.h> | 22 | #include <linux/input.h> |
25 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
26 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
@@ -32,50 +30,6 @@ static struct mv643xx_eth_platform_data iconnect_ge00_data = { | |||
32 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), | 30 | .phy_addr = MV643XX_ETH_PHY_ADDR(11), |
33 | }; | 31 | }; |
34 | 32 | ||
35 | static struct gpio_led iconnect_led_pins[] = { | ||
36 | { | ||
37 | .name = "led_level", | ||
38 | .gpio = 41, | ||
39 | .default_trigger = "default-on", | ||
40 | }, { | ||
41 | .name = "power:blue", | ||
42 | .gpio = 42, | ||
43 | .default_trigger = "timer", | ||
44 | }, { | ||
45 | .name = "power:red", | ||
46 | .gpio = 43, | ||
47 | }, { | ||
48 | .name = "usb1:blue", | ||
49 | .gpio = 44, | ||
50 | }, { | ||
51 | .name = "usb2:blue", | ||
52 | .gpio = 45, | ||
53 | }, { | ||
54 | .name = "usb3:blue", | ||
55 | .gpio = 46, | ||
56 | }, { | ||
57 | .name = "usb4:blue", | ||
58 | .gpio = 47, | ||
59 | }, { | ||
60 | .name = "otb:blue", | ||
61 | .gpio = 48, | ||
62 | }, | ||
63 | }; | ||
64 | |||
65 | static struct gpio_led_platform_data iconnect_led_data = { | ||
66 | .leds = iconnect_led_pins, | ||
67 | .num_leds = ARRAY_SIZE(iconnect_led_pins), | ||
68 | .gpio_blink_set = orion_gpio_led_blink_set, | ||
69 | }; | ||
70 | |||
71 | static struct platform_device iconnect_leds = { | ||
72 | .name = "leds-gpio", | ||
73 | .id = -1, | ||
74 | .dev = { | ||
75 | .platform_data = &iconnect_led_data, | ||
76 | } | ||
77 | }; | ||
78 | |||
79 | static unsigned int iconnect_mpp_config[] __initdata = { | 33 | static unsigned int iconnect_mpp_config[] __initdata = { |
80 | MPP12_GPIO, | 34 | MPP12_GPIO, |
81 | MPP35_GPIO, | 35 | MPP35_GPIO, |
@@ -90,12 +44,6 @@ static unsigned int iconnect_mpp_config[] __initdata = { | |||
90 | 0 | 44 | 0 |
91 | }; | 45 | }; |
92 | 46 | ||
93 | static struct i2c_board_info __initdata iconnect_board_info[] = { | ||
94 | { | ||
95 | I2C_BOARD_INFO("lm63", 0x4c), | ||
96 | }, | ||
97 | }; | ||
98 | |||
99 | static struct mtd_partition iconnect_nand_parts[] = { | 47 | static struct mtd_partition iconnect_nand_parts[] = { |
100 | { | 48 | { |
101 | .name = "flash", | 49 | .name = "flash", |
@@ -142,15 +90,11 @@ void __init iconnect_init(void) | |||
142 | { | 90 | { |
143 | kirkwood_mpp_conf(iconnect_mpp_config); | 91 | kirkwood_mpp_conf(iconnect_mpp_config); |
144 | kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25); | 92 | kirkwood_nand_init(ARRAY_AND_SIZE(iconnect_nand_parts), 25); |
145 | kirkwood_i2c_init(); | ||
146 | i2c_register_board_info(0, iconnect_board_info, | ||
147 | ARRAY_SIZE(iconnect_board_info)); | ||
148 | 93 | ||
149 | kirkwood_ehci_init(); | 94 | kirkwood_ehci_init(); |
150 | kirkwood_ge00_init(&iconnect_ge00_data); | 95 | kirkwood_ge00_init(&iconnect_ge00_data); |
151 | 96 | ||
152 | platform_device_register(&iconnect_button_device); | 97 | platform_device_register(&iconnect_button_device); |
153 | platform_device_register(&iconnect_leds); | ||
154 | } | 98 | } |
155 | 99 | ||
156 | static int __init iconnect_pci_init(void) | 100 | static int __init iconnect_pci_init(void) |
diff --git a/arch/arm/mach-kirkwood/board-lsxl.c b/arch/arm/mach-kirkwood/board-lsxl.c new file mode 100644 index 000000000000..83d8975592f8 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-lsxl.c | |||
@@ -0,0 +1,135 @@ | |||
1 | /* | ||
2 | * Copyright 2012 (C), Michael Walle <michael@walle.cc> | ||
3 | * | ||
4 | * arch/arm/mach-kirkwood/board-lsxl.c | ||
5 | * | ||
6 | * Buffalo Linkstation LS-XHL and LS-CHLv2 init for drivers not | ||
7 | * converted to flattened device tree yet. | ||
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 | #include <linux/kernel.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mtd/partitions.h> | ||
18 | #include <linux/ata_platform.h> | ||
19 | #include <linux/spi/flash.h> | ||
20 | #include <linux/spi/spi.h> | ||
21 | #include <linux/mv643xx_eth.h> | ||
22 | #include <linux/gpio.h> | ||
23 | #include <linux/gpio-fan.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <asm/mach-types.h> | ||
26 | #include <asm/mach/arch.h> | ||
27 | #include <mach/kirkwood.h> | ||
28 | #include "common.h" | ||
29 | #include "mpp.h" | ||
30 | |||
31 | static struct mv643xx_eth_platform_data lsxl_ge00_data = { | ||
32 | .phy_addr = MV643XX_ETH_PHY_ADDR(0), | ||
33 | }; | ||
34 | |||
35 | static struct mv643xx_eth_platform_data lsxl_ge01_data = { | ||
36 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
37 | }; | ||
38 | |||
39 | static unsigned int lsxl_mpp_config[] __initdata = { | ||
40 | MPP10_GPO, /* HDD Power Enable */ | ||
41 | MPP11_GPIO, /* USB Vbus Enable */ | ||
42 | MPP18_GPO, /* FAN High Enable# */ | ||
43 | MPP19_GPO, /* FAN Low Enable# */ | ||
44 | MPP36_GPIO, /* Function Blue LED */ | ||
45 | MPP37_GPIO, /* Alarm LED */ | ||
46 | MPP38_GPIO, /* Info LED */ | ||
47 | MPP39_GPIO, /* Power LED */ | ||
48 | MPP40_GPIO, /* Fan Lock */ | ||
49 | MPP41_GPIO, /* Function Button */ | ||
50 | MPP42_GPIO, /* Power Switch */ | ||
51 | MPP43_GPIO, /* Power Auto Switch */ | ||
52 | MPP48_GPIO, /* Function Red LED */ | ||
53 | 0 | ||
54 | }; | ||
55 | |||
56 | #define LSXL_GPIO_FAN_HIGH 18 | ||
57 | #define LSXL_GPIO_FAN_LOW 19 | ||
58 | #define LSXL_GPIO_FAN_LOCK 40 | ||
59 | |||
60 | static struct gpio_fan_alarm lsxl_alarm = { | ||
61 | .gpio = LSXL_GPIO_FAN_LOCK, | ||
62 | }; | ||
63 | |||
64 | static struct gpio_fan_speed lsxl_speeds[] = { | ||
65 | { | ||
66 | .rpm = 0, | ||
67 | .ctrl_val = 3, | ||
68 | }, { | ||
69 | .rpm = 1500, | ||
70 | .ctrl_val = 1, | ||
71 | }, { | ||
72 | .rpm = 3250, | ||
73 | .ctrl_val = 2, | ||
74 | }, { | ||
75 | .rpm = 5000, | ||
76 | .ctrl_val = 0, | ||
77 | } | ||
78 | }; | ||
79 | |||
80 | static int lsxl_gpio_list[] = { | ||
81 | LSXL_GPIO_FAN_HIGH, LSXL_GPIO_FAN_LOW, | ||
82 | }; | ||
83 | |||
84 | static struct gpio_fan_platform_data lsxl_fan_data = { | ||
85 | .num_ctrl = ARRAY_SIZE(lsxl_gpio_list), | ||
86 | .ctrl = lsxl_gpio_list, | ||
87 | .alarm = &lsxl_alarm, | ||
88 | .num_speed = ARRAY_SIZE(lsxl_speeds), | ||
89 | .speed = lsxl_speeds, | ||
90 | }; | ||
91 | |||
92 | static struct platform_device lsxl_fan_device = { | ||
93 | .name = "gpio-fan", | ||
94 | .id = -1, | ||
95 | .num_resources = 0, | ||
96 | .dev = { | ||
97 | .platform_data = &lsxl_fan_data, | ||
98 | }, | ||
99 | }; | ||
100 | |||
101 | /* | ||
102 | * On the LS-XHL/LS-CHLv2, the shutdown process is following: | ||
103 | * - Userland monitors key events until the power switch goes to off position | ||
104 | * - The board reboots | ||
105 | * - U-boot starts and goes into an idle mode waiting for the user | ||
106 | * to move the switch to ON position | ||
107 | * | ||
108 | */ | ||
109 | static void lsxl_power_off(void) | ||
110 | { | ||
111 | kirkwood_restart('h', NULL); | ||
112 | } | ||
113 | |||
114 | #define LSXL_GPIO_HDD_POWER 10 | ||
115 | #define LSXL_GPIO_USB_POWER 11 | ||
116 | |||
117 | void __init lsxl_init(void) | ||
118 | { | ||
119 | /* | ||
120 | * Basic setup. Needs to be called early. | ||
121 | */ | ||
122 | kirkwood_mpp_conf(lsxl_mpp_config); | ||
123 | |||
124 | /* usb and sata power on */ | ||
125 | gpio_set_value(LSXL_GPIO_USB_POWER, 1); | ||
126 | gpio_set_value(LSXL_GPIO_HDD_POWER, 1); | ||
127 | |||
128 | kirkwood_ehci_init(); | ||
129 | kirkwood_ge00_init(&lsxl_ge00_data); | ||
130 | kirkwood_ge01_init(&lsxl_ge01_data); | ||
131 | platform_device_register(&lsxl_fan_device); | ||
132 | |||
133 | /* register power-off method */ | ||
134 | pm_power_off = lsxl_power_off; | ||
135 | } | ||
diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c new file mode 100644 index 000000000000..1750e68506c1 --- /dev/null +++ b/arch/arm/mach-kirkwood/board-ts219.c | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | * | ||
3 | * QNAP TS-11x/TS-21x Turbo NAS Board Setup via DT | ||
4 | * | ||
5 | * Copyright (C) 2012 Andrew Lunn <andrew@lunn.ch> | ||
6 | * | ||
7 | * Based on the board file ts219-setup.c: | ||
8 | * | ||
9 | * Copyright (C) 2009 Martin Michlmayr <tbm@cyrius.com> | ||
10 | * Copyright (C) 2008 Byron Bradley <byron.bbradley@gmail.com> | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version | ||
15 | * 2 of the License, or (at your option) any later version. | ||
16 | */ | ||
17 | |||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/init.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | #include <linux/mv643xx_eth.h> | ||
22 | #include <linux/ata_platform.h> | ||
23 | #include <linux/gpio_keys.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <asm/mach-types.h> | ||
26 | #include <asm/mach/arch.h> | ||
27 | #include <mach/kirkwood.h> | ||
28 | #include "common.h" | ||
29 | #include "mpp.h" | ||
30 | #include "tsx1x-common.h" | ||
31 | |||
32 | static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = { | ||
33 | .phy_addr = MV643XX_ETH_PHY_ADDR(8), | ||
34 | }; | ||
35 | |||
36 | static unsigned int qnap_ts219_mpp_config[] __initdata = { | ||
37 | MPP0_SPI_SCn, | ||
38 | MPP1_SPI_MOSI, | ||
39 | MPP2_SPI_SCK, | ||
40 | MPP3_SPI_MISO, | ||
41 | MPP4_SATA1_ACTn, | ||
42 | MPP5_SATA0_ACTn, | ||
43 | MPP8_TW0_SDA, | ||
44 | MPP9_TW0_SCK, | ||
45 | MPP10_UART0_TXD, | ||
46 | MPP11_UART0_RXD, | ||
47 | MPP13_UART1_TXD, /* PIC controller */ | ||
48 | MPP14_UART1_RXD, /* PIC controller */ | ||
49 | MPP15_GPIO, /* USB Copy button (on devices with 88F6281) */ | ||
50 | MPP16_GPIO, /* Reset button (on devices with 88F6281) */ | ||
51 | MPP36_GPIO, /* RAM: 0: 256 MB, 1: 512 MB */ | ||
52 | MPP37_GPIO, /* Reset button (on devices with 88F6282) */ | ||
53 | MPP43_GPIO, /* USB Copy button (on devices with 88F6282) */ | ||
54 | MPP44_GPIO, /* Board ID: 0: TS-11x, 1: TS-21x */ | ||
55 | 0 | ||
56 | }; | ||
57 | |||
58 | void __init qnap_dt_ts219_init(void) | ||
59 | { | ||
60 | u32 dev, rev; | ||
61 | |||
62 | kirkwood_mpp_conf(qnap_ts219_mpp_config); | ||
63 | |||
64 | kirkwood_pcie_id(&dev, &rev); | ||
65 | if (dev == MV88F6282_DEV_ID) | ||
66 | qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0); | ||
67 | |||
68 | kirkwood_ge00_init(&qnap_ts219_ge00_data); | ||
69 | kirkwood_ehci_init(); | ||
70 | |||
71 | pm_power_off = qnap_tsx1x_power_off; | ||
72 | } | ||
73 | |||
74 | /* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ | ||
75 | static int __init ts219_pci_init(void) | ||
76 | { | ||
77 | if (machine_is_ts219()) | ||
78 | kirkwood_pcie_init(KW_PCIE0); | ||
79 | |||
80 | return 0; | ||
81 | } | ||
82 | subsys_initcall(ts219_pci_init); | ||
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index c9201539ffbd..c4b64adcbfce 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/dma-mapping.h> | 17 | #include <linux/dma-mapping.h> |
18 | #include <linux/clk-provider.h> | 18 | #include <linux/clk-provider.h> |
19 | #include <linux/spinlock.h> | 19 | #include <linux/spinlock.h> |
20 | #include <linux/mv643xx_i2c.h> | ||
20 | #include <net/dsa.h> | 21 | #include <net/dsa.h> |
21 | #include <asm/page.h> | 22 | #include <asm/page.h> |
22 | #include <asm/timex.h> | 23 | #include <asm/timex.h> |
@@ -276,6 +277,7 @@ void __init kirkwood_clk_init(void) | |||
276 | orion_clkdev_add("0", "pcie", pex0); | 277 | orion_clkdev_add("0", "pcie", pex0); |
277 | orion_clkdev_add("1", "pcie", pex1); | 278 | orion_clkdev_add("1", "pcie", pex1); |
278 | orion_clkdev_add(NULL, "kirkwood-i2s", audio); | 279 | orion_clkdev_add(NULL, "kirkwood-i2s", audio); |
280 | orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit); | ||
279 | 281 | ||
280 | /* Marvell says runit is used by SPI, UART, NAND, TWSI, ..., | 282 | /* Marvell says runit is used by SPI, UART, NAND, TWSI, ..., |
281 | * so should never be gated. | 283 | * so should never be gated. |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 9248fa2c165b..304dd1abfdca 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
@@ -58,6 +58,11 @@ void dreamplug_init(void); | |||
58 | #else | 58 | #else |
59 | static inline void dreamplug_init(void) {}; | 59 | static inline void dreamplug_init(void) {}; |
60 | #endif | 60 | #endif |
61 | #ifdef CONFIG_MACH_TS219_DT | ||
62 | void qnap_dt_ts219_init(void); | ||
63 | #else | ||
64 | static inline void qnap_dt_ts219_init(void) {}; | ||
65 | #endif | ||
61 | 66 | ||
62 | #ifdef CONFIG_MACH_DLINK_KIRKWOOD_DT | 67 | #ifdef CONFIG_MACH_DLINK_KIRKWOOD_DT |
63 | void dnskw_init(void); | 68 | void dnskw_init(void); |
@@ -77,6 +82,18 @@ void ib62x0_init(void); | |||
77 | static inline void ib62x0_init(void) {}; | 82 | static inline void ib62x0_init(void) {}; |
78 | #endif | 83 | #endif |
79 | 84 | ||
85 | #ifdef CONFIG_MACH_GOFLEXNET_DT | ||
86 | void goflexnet_init(void); | ||
87 | #else | ||
88 | static inline void goflexnet_init(void) {}; | ||
89 | #endif | ||
90 | |||
91 | #ifdef CONFIG_MACH_LSXL_DT | ||
92 | void lsxl_init(void); | ||
93 | #else | ||
94 | static inline void lsxl_init(void) {}; | ||
95 | #endif | ||
96 | |||
80 | /* early init functions not converted to fdt yet */ | 97 | /* early init functions not converted to fdt yet */ |
81 | char *kirkwood_id(void); | 98 | char *kirkwood_id(void); |
82 | void kirkwood_l2_init(void); | 99 | void kirkwood_l2_init(void); |
diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c index c4c68e5b94f1..720063ffa19d 100644 --- a/arch/arm/mach-kirkwood/irq.c +++ b/arch/arm/mach-kirkwood/irq.c | |||
@@ -9,20 +9,23 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/gpio.h> | 10 | #include <linux/gpio.h> |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | ||
13 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
14 | #include <linux/io.h> | ||
15 | #include <mach/bridge-regs.h> | 13 | #include <mach/bridge-regs.h> |
16 | #include <plat/irq.h> | 14 | #include <plat/irq.h> |
17 | #include "common.h" | ||
18 | 15 | ||
19 | static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | 16 | static int __initdata gpio0_irqs[4] = { |
20 | { | 17 | IRQ_KIRKWOOD_GPIO_LOW_0_7, |
21 | BUG_ON(irq < IRQ_KIRKWOOD_GPIO_LOW_0_7); | 18 | IRQ_KIRKWOOD_GPIO_LOW_8_15, |
22 | BUG_ON(irq > IRQ_KIRKWOOD_GPIO_HIGH_16_23); | 19 | IRQ_KIRKWOOD_GPIO_LOW_16_23, |
20 | IRQ_KIRKWOOD_GPIO_LOW_24_31, | ||
21 | }; | ||
23 | 22 | ||
24 | orion_gpio_irq_handler((irq - IRQ_KIRKWOOD_GPIO_LOW_0_7) << 3); | 23 | static int __initdata gpio1_irqs[4] = { |
25 | } | 24 | IRQ_KIRKWOOD_GPIO_HIGH_0_7, |
25 | IRQ_KIRKWOOD_GPIO_HIGH_8_15, | ||
26 | IRQ_KIRKWOOD_GPIO_HIGH_16_23, | ||
27 | 0, | ||
28 | }; | ||
26 | 29 | ||
27 | void __init kirkwood_init_irq(void) | 30 | void __init kirkwood_init_irq(void) |
28 | { | 31 | { |
@@ -32,17 +35,8 @@ void __init kirkwood_init_irq(void) | |||
32 | /* | 35 | /* |
33 | * Initialize gpiolib for GPIOs 0-49. | 36 | * Initialize gpiolib for GPIOs 0-49. |
34 | */ | 37 | */ |
35 | orion_gpio_init(0, 32, GPIO_LOW_VIRT_BASE, 0, | 38 | orion_gpio_init(NULL, 0, 32, (void __iomem *)GPIO_LOW_VIRT_BASE, 0, |
36 | IRQ_KIRKWOOD_GPIO_START); | 39 | IRQ_KIRKWOOD_GPIO_START, gpio0_irqs); |
37 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_0_7, gpio_irq_handler); | 40 | orion_gpio_init(NULL, 32, 18, (void __iomem *)GPIO_HIGH_VIRT_BASE, 0, |
38 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_8_15, gpio_irq_handler); | 41 | IRQ_KIRKWOOD_GPIO_START + 32, gpio1_irqs); |
39 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_16_23, gpio_irq_handler); | ||
40 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_LOW_24_31, gpio_irq_handler); | ||
41 | |||
42 | orion_gpio_init(32, 18, GPIO_HIGH_VIRT_BASE, 0, | ||
43 | IRQ_KIRKWOOD_GPIO_START + 32); | ||
44 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_0_7, gpio_irq_handler); | ||
45 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_8_15, gpio_irq_handler); | ||
46 | irq_set_chained_handler(IRQ_KIRKWOOD_GPIO_HIGH_16_23, | ||
47 | gpio_irq_handler); | ||
48 | } | 42 | } |
diff --git a/arch/arm/mach-mv78xx0/irq.c b/arch/arm/mach-mv78xx0/irq.c index e421b701663b..eff9a750bbe2 100644 --- a/arch/arm/mach-mv78xx0/irq.c +++ b/arch/arm/mach-mv78xx0/irq.c | |||
@@ -9,19 +9,17 @@ | |||
9 | */ | 9 | */ |
10 | #include <linux/gpio.h> | 10 | #include <linux/gpio.h> |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | ||
13 | #include <linux/pci.h> | ||
14 | #include <linux/irq.h> | 12 | #include <linux/irq.h> |
15 | #include <mach/bridge-regs.h> | 13 | #include <mach/bridge-regs.h> |
16 | #include <plat/irq.h> | 14 | #include <plat/irq.h> |
17 | #include "common.h" | 15 | #include "common.h" |
18 | 16 | ||
19 | static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | 17 | static int __initdata gpio0_irqs[4] = { |
20 | { | 18 | IRQ_MV78XX0_GPIO_0_7, |
21 | BUG_ON(irq < IRQ_MV78XX0_GPIO_0_7 || irq > IRQ_MV78XX0_GPIO_24_31); | 19 | IRQ_MV78XX0_GPIO_8_15, |
22 | 20 | IRQ_MV78XX0_GPIO_16_23, | |
23 | orion_gpio_irq_handler((irq - IRQ_MV78XX0_GPIO_0_7) << 3); | 21 | IRQ_MV78XX0_GPIO_24_31, |
24 | } | 22 | }; |
25 | 23 | ||
26 | void __init mv78xx0_init_irq(void) | 24 | void __init mv78xx0_init_irq(void) |
27 | { | 25 | { |
@@ -34,11 +32,7 @@ void __init mv78xx0_init_irq(void) | |||
34 | * registers for core #1 are at an offset of 0x18 from those of | 32 | * registers for core #1 are at an offset of 0x18 from those of |
35 | * core #0.) | 33 | * core #0.) |
36 | */ | 34 | */ |
37 | orion_gpio_init(0, 32, GPIO_VIRT_BASE, | 35 | orion_gpio_init(NULL, 0, 32, (void __iomem *)GPIO_VIRT_BASE, |
38 | mv78xx0_core_index() ? 0x18 : 0, | 36 | mv78xx0_core_index() ? 0x18 : 0, |
39 | IRQ_MV78XX0_GPIO_START); | 37 | IRQ_MV78XX0_GPIO_START, gpio0_irqs); |
40 | irq_set_chained_handler(IRQ_MV78XX0_GPIO_0_7, gpio_irq_handler); | ||
41 | irq_set_chained_handler(IRQ_MV78XX0_GPIO_8_15, gpio_irq_handler); | ||
42 | irq_set_chained_handler(IRQ_MV78XX0_GPIO_16_23, gpio_irq_handler); | ||
43 | irq_set_chained_handler(IRQ_MV78XX0_GPIO_24_31, gpio_irq_handler); | ||
44 | } | 38 | } |
diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index b1b45fff776e..17da7091d310 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c | |||
@@ -11,19 +11,16 @@ | |||
11 | */ | 11 | */ |
12 | #include <linux/gpio.h> | 12 | #include <linux/gpio.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | ||
15 | #include <linux/irq.h> | 14 | #include <linux/irq.h> |
16 | #include <linux/io.h> | ||
17 | #include <mach/bridge-regs.h> | 15 | #include <mach/bridge-regs.h> |
18 | #include <plat/irq.h> | 16 | #include <plat/irq.h> |
19 | #include "common.h" | ||
20 | 17 | ||
21 | static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | 18 | static int __initdata gpio0_irqs[4] = { |
22 | { | 19 | IRQ_ORION5X_GPIO_0_7, |
23 | BUG_ON(irq < IRQ_ORION5X_GPIO_0_7 || irq > IRQ_ORION5X_GPIO_24_31); | 20 | IRQ_ORION5X_GPIO_8_15, |
24 | 21 | IRQ_ORION5X_GPIO_16_23, | |
25 | orion_gpio_irq_handler((irq - IRQ_ORION5X_GPIO_0_7) << 3); | 22 | IRQ_ORION5X_GPIO_24_31, |
26 | } | 23 | }; |
27 | 24 | ||
28 | void __init orion5x_init_irq(void) | 25 | void __init orion5x_init_irq(void) |
29 | { | 26 | { |
@@ -32,9 +29,6 @@ void __init orion5x_init_irq(void) | |||
32 | /* | 29 | /* |
33 | * Initialize gpiolib for GPIOs 0-31. | 30 | * Initialize gpiolib for GPIOs 0-31. |
34 | */ | 31 | */ |
35 | orion_gpio_init(0, 32, GPIO_VIRT_BASE, 0, IRQ_ORION5X_GPIO_START); | 32 | orion_gpio_init(NULL, 0, 32, (void __iomem *)GPIO_VIRT_BASE, 0, |
36 | irq_set_chained_handler(IRQ_ORION5X_GPIO_0_7, gpio_irq_handler); | 33 | IRQ_ORION5X_GPIO_START, gpio0_irqs); |
37 | irq_set_chained_handler(IRQ_ORION5X_GPIO_8_15, gpio_irq_handler); | ||
38 | irq_set_chained_handler(IRQ_ORION5X_GPIO_16_23, gpio_irq_handler); | ||
39 | irq_set_chained_handler(IRQ_ORION5X_GPIO_24_31, gpio_irq_handler); | ||
40 | } | 34 | } |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index c1793786aea9..d245a87dc014 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
@@ -47,6 +47,7 @@ void __init orion_clkdev_init(struct clk *tclk) | |||
47 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk); | 47 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".2", tclk); |
48 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk); | 48 | orion_clkdev_add(NULL, MV643XX_ETH_NAME ".3", tclk); |
49 | orion_clkdev_add(NULL, "orion_wdt", tclk); | 49 | orion_clkdev_add(NULL, "orion_wdt", tclk); |
50 | orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", tclk); | ||
50 | } | 51 | } |
51 | 52 | ||
52 | /* Fill in the resources structure and link it into the platform | 53 | /* Fill in the resources structure and link it into the platform |
diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c index af95af257301..dfda74fae6f2 100644 --- a/arch/arm/plat-orion/gpio.c +++ b/arch/arm/plat-orion/gpio.c | |||
@@ -8,15 +8,22 @@ | |||
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #define DEBUG | ||
12 | |||
11 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 14 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #include <linux/irqdomain.h> | ||
14 | #include <linux/module.h> | 17 | #include <linux/module.h> |
15 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
16 | #include <linux/bitops.h> | 19 | #include <linux/bitops.h> |
17 | #include <linux/io.h> | 20 | #include <linux/io.h> |
18 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
19 | #include <linux/leds.h> | 22 | #include <linux/leds.h> |
23 | #include <linux/of.h> | ||
24 | #include <linux/of_irq.h> | ||
25 | #include <linux/of_address.h> | ||
26 | #include <plat/gpio.h> | ||
20 | 27 | ||
21 | /* | 28 | /* |
22 | * GPIO unit register offsets. | 29 | * GPIO unit register offsets. |
@@ -38,6 +45,7 @@ struct orion_gpio_chip { | |||
38 | unsigned long valid_output; | 45 | unsigned long valid_output; |
39 | int mask_offset; | 46 | int mask_offset; |
40 | int secondary_irq_base; | 47 | int secondary_irq_base; |
48 | struct irq_domain *domain; | ||
41 | }; | 49 | }; |
42 | 50 | ||
43 | static void __iomem *GPIO_OUT(struct orion_gpio_chip *ochip) | 51 | static void __iomem *GPIO_OUT(struct orion_gpio_chip *ochip) |
@@ -222,10 +230,10 @@ static int orion_gpio_to_irq(struct gpio_chip *chip, unsigned pin) | |||
222 | struct orion_gpio_chip *ochip = | 230 | struct orion_gpio_chip *ochip = |
223 | container_of(chip, struct orion_gpio_chip, chip); | 231 | container_of(chip, struct orion_gpio_chip, chip); |
224 | 232 | ||
225 | return ochip->secondary_irq_base + pin; | 233 | return irq_create_mapping(ochip->domain, |
234 | ochip->secondary_irq_base + pin); | ||
226 | } | 235 | } |
227 | 236 | ||
228 | |||
229 | /* | 237 | /* |
230 | * Orion-specific GPIO API extensions. | 238 | * Orion-specific GPIO API extensions. |
231 | */ | 239 | */ |
@@ -353,12 +361,10 @@ static int gpio_irq_set_type(struct irq_data *d, u32 type) | |||
353 | int pin; | 361 | int pin; |
354 | u32 u; | 362 | u32 u; |
355 | 363 | ||
356 | pin = d->irq - gc->irq_base; | 364 | pin = d->hwirq - ochip->secondary_irq_base; |
357 | 365 | ||
358 | u = readl(GPIO_IO_CONF(ochip)) & (1 << pin); | 366 | u = readl(GPIO_IO_CONF(ochip)) & (1 << pin); |
359 | if (!u) { | 367 | if (!u) { |
360 | printk(KERN_ERR "orion gpio_irq_set_type failed " | ||
361 | "(irq %d, pin %d).\n", d->irq, pin); | ||
362 | return -EINVAL; | 368 | return -EINVAL; |
363 | } | 369 | } |
364 | 370 | ||
@@ -397,17 +403,53 @@ static int gpio_irq_set_type(struct irq_data *d, u32 type) | |||
397 | u &= ~(1 << pin); /* rising */ | 403 | u &= ~(1 << pin); /* rising */ |
398 | writel(u, GPIO_IN_POL(ochip)); | 404 | writel(u, GPIO_IN_POL(ochip)); |
399 | } | 405 | } |
400 | |||
401 | return 0; | 406 | return 0; |
402 | } | 407 | } |
403 | 408 | ||
404 | void __init orion_gpio_init(int gpio_base, int ngpio, | 409 | static void gpio_irq_handler(unsigned irq, struct irq_desc *desc) |
405 | u32 base, int mask_offset, int secondary_irq_base) | 410 | { |
411 | struct orion_gpio_chip *ochip = irq_get_handler_data(irq); | ||
412 | u32 cause, type; | ||
413 | int i; | ||
414 | |||
415 | if (ochip == NULL) | ||
416 | return; | ||
417 | |||
418 | cause = readl(GPIO_DATA_IN(ochip)) & readl(GPIO_LEVEL_MASK(ochip)); | ||
419 | cause |= readl(GPIO_EDGE_CAUSE(ochip)) & readl(GPIO_EDGE_MASK(ochip)); | ||
420 | |||
421 | for (i = 0; i < ochip->chip.ngpio; i++) { | ||
422 | int irq; | ||
423 | |||
424 | irq = ochip->secondary_irq_base + i; | ||
425 | |||
426 | if (!(cause & (1 << i))) | ||
427 | continue; | ||
428 | |||
429 | type = irqd_get_trigger_type(irq_get_irq_data(irq)); | ||
430 | if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) { | ||
431 | /* Swap polarity (race with GPIO line) */ | ||
432 | u32 polarity; | ||
433 | |||
434 | polarity = readl(GPIO_IN_POL(ochip)); | ||
435 | polarity ^= 1 << i; | ||
436 | writel(polarity, GPIO_IN_POL(ochip)); | ||
437 | } | ||
438 | generic_handle_irq(irq); | ||
439 | } | ||
440 | } | ||
441 | |||
442 | void __init orion_gpio_init(struct device_node *np, | ||
443 | int gpio_base, int ngpio, | ||
444 | void __iomem *base, int mask_offset, | ||
445 | int secondary_irq_base, | ||
446 | int irqs[4]) | ||
406 | { | 447 | { |
407 | struct orion_gpio_chip *ochip; | 448 | struct orion_gpio_chip *ochip; |
408 | struct irq_chip_generic *gc; | 449 | struct irq_chip_generic *gc; |
409 | struct irq_chip_type *ct; | 450 | struct irq_chip_type *ct; |
410 | char gc_label[16]; | 451 | char gc_label[16]; |
452 | int i; | ||
411 | 453 | ||
412 | if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips)) | 454 | if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips)) |
413 | return; | 455 | return; |
@@ -426,6 +468,10 @@ void __init orion_gpio_init(int gpio_base, int ngpio, | |||
426 | ochip->chip.base = gpio_base; | 468 | ochip->chip.base = gpio_base; |
427 | ochip->chip.ngpio = ngpio; | 469 | ochip->chip.ngpio = ngpio; |
428 | ochip->chip.can_sleep = 0; | 470 | ochip->chip.can_sleep = 0; |
471 | #ifdef CONFIG_OF | ||
472 | ochip->chip.of_node = np; | ||
473 | #endif | ||
474 | |||
429 | spin_lock_init(&ochip->lock); | 475 | spin_lock_init(&ochip->lock); |
430 | ochip->base = (void __iomem *)base; | 476 | ochip->base = (void __iomem *)base; |
431 | ochip->valid_input = 0; | 477 | ochip->valid_input = 0; |
@@ -435,8 +481,6 @@ void __init orion_gpio_init(int gpio_base, int ngpio, | |||
435 | 481 | ||
436 | gpiochip_add(&ochip->chip); | 482 | gpiochip_add(&ochip->chip); |
437 | 483 | ||
438 | orion_gpio_chip_count++; | ||
439 | |||
440 | /* | 484 | /* |
441 | * Mask and clear GPIO interrupts. | 485 | * Mask and clear GPIO interrupts. |
442 | */ | 486 | */ |
@@ -444,16 +488,28 @@ void __init orion_gpio_init(int gpio_base, int ngpio, | |||
444 | writel(0, GPIO_EDGE_MASK(ochip)); | 488 | writel(0, GPIO_EDGE_MASK(ochip)); |
445 | writel(0, GPIO_LEVEL_MASK(ochip)); | 489 | writel(0, GPIO_LEVEL_MASK(ochip)); |
446 | 490 | ||
447 | gc = irq_alloc_generic_chip("orion_gpio_irq", 2, secondary_irq_base, | 491 | /* Setup the interrupt handlers. Each chip can have up to 4 |
492 | * interrupt handlers, with each handler dealing with 8 GPIO | ||
493 | * pins. */ | ||
494 | |||
495 | for (i = 0; i < 4; i++) { | ||
496 | if (irqs[i]) { | ||
497 | irq_set_handler_data(irqs[i], ochip); | ||
498 | irq_set_chained_handler(irqs[i], gpio_irq_handler); | ||
499 | } | ||
500 | } | ||
501 | |||
502 | gc = irq_alloc_generic_chip("orion_gpio_irq", 2, | ||
503 | secondary_irq_base, | ||
448 | ochip->base, handle_level_irq); | 504 | ochip->base, handle_level_irq); |
449 | gc->private = ochip; | 505 | gc->private = ochip; |
450 | |||
451 | ct = gc->chip_types; | 506 | ct = gc->chip_types; |
452 | ct->regs.mask = ochip->mask_offset + GPIO_LEVEL_MASK_OFF; | 507 | ct->regs.mask = ochip->mask_offset + GPIO_LEVEL_MASK_OFF; |
453 | ct->type = IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW; | 508 | ct->type = IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW; |
454 | ct->chip.irq_mask = irq_gc_mask_clr_bit; | 509 | ct->chip.irq_mask = irq_gc_mask_clr_bit; |
455 | ct->chip.irq_unmask = irq_gc_mask_set_bit; | 510 | ct->chip.irq_unmask = irq_gc_mask_set_bit; |
456 | ct->chip.irq_set_type = gpio_irq_set_type; | 511 | ct->chip.irq_set_type = gpio_irq_set_type; |
512 | ct->chip.name = ochip->chip.label; | ||
457 | 513 | ||
458 | ct++; | 514 | ct++; |
459 | ct->regs.mask = ochip->mask_offset + GPIO_EDGE_MASK_OFF; | 515 | ct->regs.mask = ochip->mask_offset + GPIO_EDGE_MASK_OFF; |
@@ -464,41 +520,69 @@ void __init orion_gpio_init(int gpio_base, int ngpio, | |||
464 | ct->chip.irq_unmask = irq_gc_mask_set_bit; | 520 | ct->chip.irq_unmask = irq_gc_mask_set_bit; |
465 | ct->chip.irq_set_type = gpio_irq_set_type; | 521 | ct->chip.irq_set_type = gpio_irq_set_type; |
466 | ct->handler = handle_edge_irq; | 522 | ct->handler = handle_edge_irq; |
523 | ct->chip.name = ochip->chip.label; | ||
467 | 524 | ||
468 | irq_setup_generic_chip(gc, IRQ_MSK(ngpio), IRQ_GC_INIT_MASK_CACHE, | 525 | irq_setup_generic_chip(gc, IRQ_MSK(ngpio), IRQ_GC_INIT_MASK_CACHE, |
469 | IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE); | 526 | IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE); |
470 | } | ||
471 | 527 | ||
472 | void orion_gpio_irq_handler(int pinoff) | 528 | /* Setup irq domain on top of the generic chip. */ |
473 | { | 529 | ochip->domain = irq_domain_add_legacy(np, |
474 | struct orion_gpio_chip *ochip; | 530 | ochip->chip.ngpio, |
475 | u32 cause, type; | 531 | ochip->secondary_irq_base, |
476 | int i; | 532 | ochip->secondary_irq_base, |
477 | 533 | &irq_domain_simple_ops, | |
478 | ochip = orion_gpio_chip_find(pinoff); | 534 | ochip); |
479 | if (ochip == NULL) | 535 | if (!ochip->domain) |
480 | return; | 536 | panic("%s: couldn't allocate irq domain (DT).\n", |
481 | 537 | ochip->chip.label); | |
482 | cause = readl(GPIO_DATA_IN(ochip)) & readl(GPIO_LEVEL_MASK(ochip)); | ||
483 | cause |= readl(GPIO_EDGE_CAUSE(ochip)) & readl(GPIO_EDGE_MASK(ochip)); | ||
484 | |||
485 | for (i = 0; i < ochip->chip.ngpio; i++) { | ||
486 | int irq; | ||
487 | 538 | ||
488 | irq = ochip->secondary_irq_base + i; | 539 | orion_gpio_chip_count++; |
540 | } | ||
489 | 541 | ||
490 | if (!(cause & (1 << i))) | 542 | #ifdef CONFIG_OF |
491 | continue; | 543 | static void __init orion_gpio_of_init_one(struct device_node *np, |
544 | int irq_gpio_base) | ||
545 | { | ||
546 | int ngpio, gpio_base, mask_offset; | ||
547 | void __iomem *base; | ||
548 | int ret, i; | ||
549 | int irqs[4]; | ||
550 | int secondary_irq_base; | ||
551 | |||
552 | ret = of_property_read_u32(np, "ngpio", &ngpio); | ||
553 | if (ret) | ||
554 | goto out; | ||
555 | ret = of_property_read_u32(np, "mask-offset", &mask_offset); | ||
556 | if (ret == -EINVAL) | ||
557 | mask_offset = 0; | ||
558 | else | ||
559 | goto out; | ||
560 | base = of_iomap(np, 0); | ||
561 | if (!base) | ||
562 | goto out; | ||
563 | |||
564 | secondary_irq_base = irq_gpio_base + (32 * orion_gpio_chip_count); | ||
565 | gpio_base = 32 * orion_gpio_chip_count; | ||
566 | |||
567 | /* Get the interrupt numbers. Each chip can have up to 4 | ||
568 | * interrupt handlers, with each handler dealing with 8 GPIO | ||
569 | * pins. */ | ||
570 | |||
571 | for (i = 0; i < 4; i++) | ||
572 | irqs[i] = irq_of_parse_and_map(np, i); | ||
573 | |||
574 | orion_gpio_init(np, gpio_base, ngpio, base, mask_offset, | ||
575 | secondary_irq_base, irqs); | ||
576 | return; | ||
577 | out: | ||
578 | pr_err("%s: %s: missing mandatory property\n", __func__, np->name); | ||
579 | } | ||
492 | 580 | ||
493 | type = irqd_get_trigger_type(irq_get_irq_data(irq)); | 581 | void __init orion_gpio_of_init(int irq_gpio_base) |
494 | if ((type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) { | 582 | { |
495 | /* Swap polarity (race with GPIO line) */ | 583 | struct device_node *np; |
496 | u32 polarity; | ||
497 | 584 | ||
498 | polarity = readl(GPIO_IN_POL(ochip)); | 585 | for_each_compatible_node(np, NULL, "marvell,orion-gpio") |
499 | polarity ^= 1 << i; | 586 | orion_gpio_of_init_one(np, irq_gpio_base); |
500 | writel(polarity, GPIO_IN_POL(ochip)); | ||
501 | } | ||
502 | generic_handle_irq(irq); | ||
503 | } | ||
504 | } | 587 | } |
588 | #endif | ||
diff --git a/arch/arm/plat-orion/include/plat/gpio.h b/arch/arm/plat-orion/include/plat/gpio.h index bec0c98ce41f..81c6fc8a7b28 100644 --- a/arch/arm/plat-orion/include/plat/gpio.h +++ b/arch/arm/plat-orion/include/plat/gpio.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/types.h> | 15 | #include <linux/types.h> |
16 | 16 | #include <linux/irqdomain.h> | |
17 | /* | 17 | /* |
18 | * Orion-specific GPIO API extensions. | 18 | * Orion-specific GPIO API extensions. |
19 | */ | 19 | */ |
@@ -27,13 +27,11 @@ int orion_gpio_led_blink_set(unsigned gpio, int state, | |||
27 | void orion_gpio_set_valid(unsigned pin, int mode); | 27 | void orion_gpio_set_valid(unsigned pin, int mode); |
28 | 28 | ||
29 | /* Initialize gpiolib. */ | 29 | /* Initialize gpiolib. */ |
30 | void __init orion_gpio_init(int gpio_base, int ngpio, | 30 | void __init orion_gpio_init(struct device_node *np, |
31 | u32 base, int mask_offset, int secondary_irq_base); | 31 | int gpio_base, int ngpio, |
32 | 32 | void __iomem *base, int mask_offset, | |
33 | /* | 33 | int secondary_irq_base, |
34 | * GPIO interrupt handling. | 34 | int irq[4]); |
35 | */ | ||
36 | void orion_gpio_irq_handler(int irqoff); | ||
37 | |||
38 | 35 | ||
36 | void __init orion_gpio_of_init(int irq_gpio_base); | ||
39 | #endif | 37 | #endif |
diff --git a/arch/arm/plat-orion/include/plat/irq.h b/arch/arm/plat-orion/include/plat/irq.h index f05eeab94968..50547e417936 100644 --- a/arch/arm/plat-orion/include/plat/irq.h +++ b/arch/arm/plat-orion/include/plat/irq.h | |||
@@ -12,6 +12,5 @@ | |||
12 | #define __PLAT_IRQ_H | 12 | #define __PLAT_IRQ_H |
13 | 13 | ||
14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); | 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); |
15 | 15 | void __init orion_dt_init_irq(void); | |
16 | |||
17 | #endif | 16 | #endif |
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c index 2d5b9c1ef389..d751964def4c 100644 --- a/arch/arm/plat-orion/irq.c +++ b/arch/arm/plat-orion/irq.c | |||
@@ -11,8 +11,12 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/irqdomain.h> | ||
14 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/of_address.h> | ||
17 | #include <linux/of_irq.h> | ||
15 | #include <plat/irq.h> | 18 | #include <plat/irq.h> |
19 | #include <plat/gpio.h> | ||
16 | 20 | ||
17 | void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) | 21 | void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) |
18 | { | 22 | { |
@@ -32,3 +36,39 @@ void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) | |||
32 | irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_MASK_CACHE, | 36 | irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_MASK_CACHE, |
33 | IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE); | 37 | IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE); |
34 | } | 38 | } |
39 | |||
40 | #ifdef CONFIG_OF | ||
41 | static int __init orion_add_irq_domain(struct device_node *np, | ||
42 | struct device_node *interrupt_parent) | ||
43 | { | ||
44 | int i = 0, irq_gpio; | ||
45 | void __iomem *base; | ||
46 | |||
47 | do { | ||
48 | base = of_iomap(np, i); | ||
49 | if (base) { | ||
50 | orion_irq_init(i * 32, base); | ||
51 | i++; | ||
52 | } | ||
53 | } while (base); | ||
54 | |||
55 | irq_domain_add_legacy(np, i * 32, 0, 0, | ||
56 | &irq_domain_simple_ops, NULL); | ||
57 | |||
58 | irq_gpio = i * 32; | ||
59 | orion_gpio_of_init(irq_gpio); | ||
60 | |||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static const struct of_device_id orion_irq_match[] = { | ||
65 | { .compatible = "marvell,orion-intc", | ||
66 | .data = orion_add_irq_domain, }, | ||
67 | {}, | ||
68 | }; | ||
69 | |||
70 | void __init orion_dt_init_irq(void) | ||
71 | { | ||
72 | of_irq_init(orion_irq_match); | ||
73 | } | ||
74 | #endif | ||
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 24712adf69df..311be18d3f03 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -65,6 +65,8 @@ | |||
65 | #include <linux/mbus.h> | 65 | #include <linux/mbus.h> |
66 | #include <linux/bitops.h> | 66 | #include <linux/bitops.h> |
67 | #include <linux/gfp.h> | 67 | #include <linux/gfp.h> |
68 | #include <linux/of.h> | ||
69 | #include <linux/of_irq.h> | ||
68 | #include <scsi/scsi_host.h> | 70 | #include <scsi/scsi_host.h> |
69 | #include <scsi/scsi_cmnd.h> | 71 | #include <scsi/scsi_cmnd.h> |
70 | #include <scsi/scsi_device.h> | 72 | #include <scsi/scsi_device.h> |
@@ -4026,7 +4028,7 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
4026 | struct ata_host *host; | 4028 | struct ata_host *host; |
4027 | struct mv_host_priv *hpriv; | 4029 | struct mv_host_priv *hpriv; |
4028 | struct resource *res; | 4030 | struct resource *res; |
4029 | int n_ports = 0; | 4031 | int n_ports = 0, irq = 0; |
4030 | int rc; | 4032 | int rc; |
4031 | #if defined(CONFIG_HAVE_CLK) | 4033 | #if defined(CONFIG_HAVE_CLK) |
4032 | int port; | 4034 | int port; |
@@ -4050,8 +4052,14 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
4050 | return -EINVAL; | 4052 | return -EINVAL; |
4051 | 4053 | ||
4052 | /* allocate host */ | 4054 | /* allocate host */ |
4053 | mv_platform_data = pdev->dev.platform_data; | 4055 | if (pdev->dev.of_node) { |
4054 | n_ports = mv_platform_data->n_ports; | 4056 | of_property_read_u32(pdev->dev.of_node, "nr-ports", &n_ports); |
4057 | irq = irq_of_parse_and_map(pdev->dev.of_node, 0); | ||
4058 | } else { | ||
4059 | mv_platform_data = pdev->dev.platform_data; | ||
4060 | n_ports = mv_platform_data->n_ports; | ||
4061 | irq = platform_get_irq(pdev, 0); | ||
4062 | } | ||
4055 | 4063 | ||
4056 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); | 4064 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); |
4057 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); | 4065 | hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); |
@@ -4109,8 +4117,7 @@ static int mv_platform_probe(struct platform_device *pdev) | |||
4109 | dev_info(&pdev->dev, "slots %u ports %d\n", | 4117 | dev_info(&pdev->dev, "slots %u ports %d\n", |
4110 | (unsigned)MV_MAX_Q_DEPTH, host->n_ports); | 4118 | (unsigned)MV_MAX_Q_DEPTH, host->n_ports); |
4111 | 4119 | ||
4112 | rc = ata_host_activate(host, platform_get_irq(pdev, 0), mv_interrupt, | 4120 | rc = ata_host_activate(host, irq, mv_interrupt, IRQF_SHARED, &mv6_sht); |
4113 | IRQF_SHARED, &mv6_sht); | ||
4114 | if (!rc) | 4121 | if (!rc) |
4115 | return 0; | 4122 | return 0; |
4116 | 4123 | ||
@@ -4205,15 +4212,24 @@ static int mv_platform_resume(struct platform_device *pdev) | |||
4205 | #define mv_platform_resume NULL | 4212 | #define mv_platform_resume NULL |
4206 | #endif | 4213 | #endif |
4207 | 4214 | ||
4215 | #ifdef CONFIG_OF | ||
4216 | static struct of_device_id mv_sata_dt_ids[] __devinitdata = { | ||
4217 | { .compatible = "marvell,orion-sata", }, | ||
4218 | {}, | ||
4219 | }; | ||
4220 | MODULE_DEVICE_TABLE(of, mv_sata_dt_ids); | ||
4221 | #endif | ||
4222 | |||
4208 | static struct platform_driver mv_platform_driver = { | 4223 | static struct platform_driver mv_platform_driver = { |
4209 | .probe = mv_platform_probe, | 4224 | .probe = mv_platform_probe, |
4210 | .remove = __devexit_p(mv_platform_remove), | 4225 | .remove = __devexit_p(mv_platform_remove), |
4211 | .suspend = mv_platform_suspend, | 4226 | .suspend = mv_platform_suspend, |
4212 | .resume = mv_platform_resume, | 4227 | .resume = mv_platform_resume, |
4213 | .driver = { | 4228 | .driver = { |
4214 | .name = DRV_NAME, | 4229 | .name = DRV_NAME, |
4215 | .owner = THIS_MODULE, | 4230 | .owner = THIS_MODULE, |
4216 | }, | 4231 | .of_match_table = of_match_ptr(mv_sata_dt_ids), |
4232 | }, | ||
4217 | }; | 4233 | }; |
4218 | 4234 | ||
4219 | 4235 | ||
diff --git a/drivers/watchdog/orion_wdt.c b/drivers/watchdog/orion_wdt.c index a73bea4aa1ba..c20f96b579d9 100644 --- a/drivers/watchdog/orion_wdt.c +++ b/drivers/watchdog/orion_wdt.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <linux/clk.h> | 25 | #include <linux/clk.h> |
26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
27 | #include <linux/of.h> | ||
27 | #include <mach/bridge-regs.h> | 28 | #include <mach/bridge-regs.h> |
28 | 29 | ||
29 | /* | 30 | /* |
@@ -192,6 +193,12 @@ static void orion_wdt_shutdown(struct platform_device *pdev) | |||
192 | orion_wdt_stop(&orion_wdt); | 193 | orion_wdt_stop(&orion_wdt); |
193 | } | 194 | } |
194 | 195 | ||
196 | static const struct of_device_id orion_wdt_of_match_table[] __devinitdata = { | ||
197 | { .compatible = "marvell,orion-wdt", }, | ||
198 | {}, | ||
199 | }; | ||
200 | MODULE_DEVICE_TABLE(of, orion_wdt_of_match_table); | ||
201 | |||
195 | static struct platform_driver orion_wdt_driver = { | 202 | static struct platform_driver orion_wdt_driver = { |
196 | .probe = orion_wdt_probe, | 203 | .probe = orion_wdt_probe, |
197 | .remove = __devexit_p(orion_wdt_remove), | 204 | .remove = __devexit_p(orion_wdt_remove), |
@@ -199,6 +206,7 @@ static struct platform_driver orion_wdt_driver = { | |||
199 | .driver = { | 206 | .driver = { |
200 | .owner = THIS_MODULE, | 207 | .owner = THIS_MODULE, |
201 | .name = "orion_wdt", | 208 | .name = "orion_wdt", |
209 | .of_match_table = of_match_ptr(orion_wdt_of_match_table), | ||
202 | }, | 210 | }, |
203 | }; | 211 | }; |
204 | 212 | ||