diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 13:09:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-11 13:09:45 -0400 |
commit | 7cc4e87f912bbefa440a51856b8d076e5d1f554a (patch) | |
tree | 1b8df8683f3de37d2e8211ffa8d151f60d59af62 /arch/arm/mach-orion5x | |
parent | 5ba2f67afb02c5302b2898949ed6fc3b3d37dcf1 (diff) | |
parent | 69fc7eed5f56bce15b239e5110de2575a6970df4 (diff) |
Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (236 commits)
[ARM] 5300/1: fixup spitz reset during boot
[ARM] 5295/1: make ZONE_DMA optional
[ARM] 5239/1: Palm Zire 72 power management support
[ARM] 5298/1: Drop desc_handle_irq()
[ARM] 5297/1: [KS8695] Fix two compile-time warnings
[ARM] 5296/1: [KS8695] Replace macro's with trailing underscores.
[ARM] pxa: allow multi-machine PCMCIA builds
[ARM] pxa: add preliminary CPUFREQ support for PXA3xx
[ARM] pxa: add missing ACCR bit definitions to pxa3xx-regs.h
[ARM] pxa: rename cpu-pxa.c to cpufreq-pxa2xx.c
[ARM] pxa/zylonite: add support for USB OHCI
[ARM] ohci-pxa27x: use ioremap() and offset for register access
[ARM] ohci-pxa27x: introduce pxa27x_clear_otgph()
[ARM] ohci-pxa27x: use platform_get_{irq,resource} for the resource
[ARM] ohci-pxa27x: move OHCI controller specific registers into the driver
[ARM] ohci-pxa27x: introduce flags to avoid direct access to OHCI registers
[ARM] pxa: move I2S register and bit definitions into pxa2xx-i2s.c
[ARM] pxa: simplify DMA register definitions
[ARM] pxa: make additional DCSR bits valid for PXA3xx
[ARM] pxa: move i2c register and bit definitions into i2c-pxa.c
...
Fixed up conflicts in
arch/arm/mach-versatile/core.c
sound/soc/pxa/pxa2xx-ac97.c
sound/soc/pxa/pxa2xx-i2s.c
manually.
Diffstat (limited to 'arch/arm/mach-orion5x')
-rw-r--r-- | arch/arm/mach-orion5x/Kconfig | 26 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/Makefile | 4 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/addr-map.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/common.c | 74 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/common.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/edmini_v2-setup.c | 262 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/gpio.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/include/mach/orion5x.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/include/mach/timex.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/irq.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/kurobox_pro-setup.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/lsmini-setup.c | 279 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/mpp.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c | 117 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/terastation_pro2-setup.c | 369 | ||||
-rw-r--r-- | arch/arm/mach-orion5x/tsx09-common.c | 3 |
16 files changed, 1140 insertions, 16 deletions
diff --git a/arch/arm/mach-orion5x/Kconfig b/arch/arm/mach-orion5x/Kconfig index ddcd41b15d17..f59a8d0e0824 100644 --- a/arch/arm/mach-orion5x/Kconfig +++ b/arch/arm/mach-orion5x/Kconfig | |||
@@ -36,6 +36,12 @@ config MACH_TS209 | |||
36 | Say 'Y' here if you want your kernel to support the | 36 | Say 'Y' here if you want your kernel to support the |
37 | QNAP TS-109/TS-209 platform. | 37 | QNAP TS-109/TS-209 platform. |
38 | 38 | ||
39 | config MACH_TERASTATION_PRO2 | ||
40 | bool "Buffalo Terastation Pro II/Live" | ||
41 | help | ||
42 | Say 'Y' here if you want your kernel to support the | ||
43 | Buffalo Terastation Pro II/Live platform. | ||
44 | |||
39 | config MACH_LINKSTATION_PRO | 45 | config MACH_LINKSTATION_PRO |
40 | bool "Buffalo Linkstation Pro/Live" | 46 | bool "Buffalo Linkstation Pro/Live" |
41 | select I2C_BOARDINFO | 47 | select I2C_BOARDINFO |
@@ -44,6 +50,13 @@ config MACH_LINKSTATION_PRO | |||
44 | Buffalo Linkstation Pro/Live platform. Both v1 and | 50 | Buffalo Linkstation Pro/Live platform. Both v1 and |
45 | v2 devices are supported. | 51 | v2 devices are supported. |
46 | 52 | ||
53 | config MACH_LINKSTATION_MINI | ||
54 | bool "Buffalo Linkstation Mini" | ||
55 | select I2C_BOARDINFO | ||
56 | help | ||
57 | Say 'Y' here if you want your kernel to support the | ||
58 | Buffalo Linkstation Mini platform. | ||
59 | |||
47 | config MACH_TS409 | 60 | config MACH_TS409 |
48 | bool "QNAP TS-409" | 61 | bool "QNAP TS-409" |
49 | help | 62 | help |
@@ -68,6 +81,13 @@ config MACH_MV2120 | |||
68 | Say 'Y' here if you want your kernel to support the | 81 | Say 'Y' here if you want your kernel to support the |
69 | HP Media Vault mv2120 or mv5100. | 82 | HP Media Vault mv2120 or mv5100. |
70 | 83 | ||
84 | config MACH_EDMINI_V2 | ||
85 | bool "LaCie Ethernet Disk mini V2" | ||
86 | select I2C_BOARDINFO | ||
87 | help | ||
88 | Say 'Y' here if you want your kernel to support the | ||
89 | LaCie Ethernet Disk mini V2. | ||
90 | |||
71 | config MACH_MSS2 | 91 | config MACH_MSS2 |
72 | bool "Maxtor Shared Storage II" | 92 | bool "Maxtor Shared Storage II" |
73 | help | 93 | help |
@@ -92,6 +112,12 @@ config MACH_RD88F5181L_FXO | |||
92 | Say 'Y' here if you want your kernel to support the | 112 | Say 'Y' here if you want your kernel to support the |
93 | Marvell Orion-VoIP FXO (88F5181L) RD. | 113 | Marvell Orion-VoIP FXO (88F5181L) RD. |
94 | 114 | ||
115 | config MACH_RD88F6183AP_GE | ||
116 | bool "Marvell Orion-1-90 AP GE Reference Design" | ||
117 | help | ||
118 | Say 'Y' here if you want your kernel to support the | ||
119 | Marvell Orion-1-90 (88F6183) AP GE RD. | ||
120 | |||
95 | endmenu | 121 | endmenu |
96 | 122 | ||
97 | endif | 123 | endif |
diff --git a/arch/arm/mach-orion5x/Makefile b/arch/arm/mach-orion5x/Makefile index fcc48a8864f3..3d4a1bc12355 100644 --- a/arch/arm/mach-orion5x/Makefile +++ b/arch/arm/mach-orion5x/Makefile | |||
@@ -2,14 +2,18 @@ obj-y += common.o addr-map.o pci.o gpio.o irq.o mpp.o | |||
2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o | 2 | obj-$(CONFIG_MACH_DB88F5281) += db88f5281-setup.o |
3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o | 3 | obj-$(CONFIG_MACH_RD88F5182) += rd88f5182-setup.o |
4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o | 4 | obj-$(CONFIG_MACH_KUROBOX_PRO) += kurobox_pro-setup.o |
5 | obj-$(CONFIG_MACH_TERASTATION_PRO2) += terastation_pro2-setup.o | ||
5 | obj-$(CONFIG_MACH_LINKSTATION_PRO) += kurobox_pro-setup.o | 6 | obj-$(CONFIG_MACH_LINKSTATION_PRO) += kurobox_pro-setup.o |
7 | obj-$(CONFIG_MACH_LINKSTATION_MINI) += lsmini-setup.o | ||
6 | obj-$(CONFIG_MACH_DNS323) += dns323-setup.o | 8 | obj-$(CONFIG_MACH_DNS323) += dns323-setup.o |
7 | obj-$(CONFIG_MACH_TS209) += ts209-setup.o tsx09-common.o | 9 | obj-$(CONFIG_MACH_TS209) += ts209-setup.o tsx09-common.o |
8 | obj-$(CONFIG_MACH_TS409) += ts409-setup.o tsx09-common.o | 10 | obj-$(CONFIG_MACH_TS409) += ts409-setup.o tsx09-common.o |
9 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o | 11 | obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o |
10 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o | 12 | obj-$(CONFIG_MACH_TS78XX) += ts78xx-setup.o |
11 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o | 13 | obj-$(CONFIG_MACH_MV2120) += mv2120-setup.o |
14 | obj-$(CONFIG_MACH_EDMINI_V2) += edmini_v2-setup.o | ||
12 | obj-$(CONFIG_MACH_MSS2) += mss2-setup.o | 15 | obj-$(CONFIG_MACH_MSS2) += mss2-setup.o |
13 | obj-$(CONFIG_MACH_WNR854T) += wnr854t-setup.o | 16 | obj-$(CONFIG_MACH_WNR854T) += wnr854t-setup.o |
14 | obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o | 17 | obj-$(CONFIG_MACH_RD88F5181L_GE) += rd88f5181l-ge-setup.o |
15 | obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o | 18 | obj-$(CONFIG_MACH_RD88F5181L_FXO) += rd88f5181l-fxo-setup.o |
19 | obj-$(CONFIG_MACH_RD88F6183AP_GE) += rd88f6183ap-ge-setup.o | ||
diff --git a/arch/arm/mach-orion5x/addr-map.c b/arch/arm/mach-orion5x/addr-map.c index bea37972120a..719957e05d9e 100644 --- a/arch/arm/mach-orion5x/addr-map.c +++ b/arch/arm/mach-orion5x/addr-map.c | |||
@@ -13,8 +13,8 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
16 | #include <linux/io.h> | ||
16 | #include <mach/hardware.h> | 17 | #include <mach/hardware.h> |
17 | #include <asm/io.h> | ||
18 | #include "common.h" | 18 | #include "common.h" |
19 | 19 | ||
20 | /* | 20 | /* |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 7b11e552bc5a..9625ef5975d0 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/mv643xx_eth.h> | 18 | #include <linux/mv643xx_eth.h> |
19 | #include <linux/mv643xx_i2c.h> | 19 | #include <linux/mv643xx_i2c.h> |
20 | #include <linux/ata_platform.h> | 20 | #include <linux/ata_platform.h> |
21 | #include <linux/spi/orion_spi.h> | ||
21 | #include <asm/page.h> | 22 | #include <asm/page.h> |
22 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
23 | #include <asm/timex.h> | 24 | #include <asm/timex.h> |
@@ -146,7 +147,6 @@ void __init orion5x_ehci1_init(void) | |||
146 | ****************************************************************************/ | 147 | ****************************************************************************/ |
147 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { | 148 | struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = { |
148 | .dram = &orion5x_mbus_dram_info, | 149 | .dram = &orion5x_mbus_dram_info, |
149 | .t_clk = ORION5X_TCLK, | ||
150 | }; | 150 | }; |
151 | 151 | ||
152 | static struct resource orion5x_eth_shared_resources[] = { | 152 | static struct resource orion5x_eth_shared_resources[] = { |
@@ -154,6 +154,10 @@ static struct resource orion5x_eth_shared_resources[] = { | |||
154 | .start = ORION5X_ETH_PHYS_BASE + 0x2000, | 154 | .start = ORION5X_ETH_PHYS_BASE + 0x2000, |
155 | .end = ORION5X_ETH_PHYS_BASE + 0x3fff, | 155 | .end = ORION5X_ETH_PHYS_BASE + 0x3fff, |
156 | .flags = IORESOURCE_MEM, | 156 | .flags = IORESOURCE_MEM, |
157 | }, { | ||
158 | .start = IRQ_ORION5X_ETH_ERR, | ||
159 | .end = IRQ_ORION5X_ETH_ERR, | ||
160 | .flags = IORESOURCE_IRQ, | ||
157 | }, | 161 | }, |
158 | }; | 162 | }; |
159 | 163 | ||
@@ -163,7 +167,7 @@ static struct platform_device orion5x_eth_shared = { | |||
163 | .dev = { | 167 | .dev = { |
164 | .platform_data = &orion5x_eth_shared_data, | 168 | .platform_data = &orion5x_eth_shared_data, |
165 | }, | 169 | }, |
166 | .num_resources = 1, | 170 | .num_resources = ARRAY_SIZE(orion5x_eth_shared_resources), |
167 | .resource = orion5x_eth_shared_resources, | 171 | .resource = orion5x_eth_shared_resources, |
168 | }; | 172 | }; |
169 | 173 | ||
@@ -268,6 +272,38 @@ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) | |||
268 | 272 | ||
269 | 273 | ||
270 | /***************************************************************************** | 274 | /***************************************************************************** |
275 | * SPI | ||
276 | ****************************************************************************/ | ||
277 | static struct orion_spi_info orion5x_spi_plat_data = { | ||
278 | .tclk = 0, | ||
279 | }; | ||
280 | |||
281 | static struct resource orion5x_spi_resources[] = { | ||
282 | { | ||
283 | .name = "spi base", | ||
284 | .start = SPI_PHYS_BASE, | ||
285 | .end = SPI_PHYS_BASE + 0x1f, | ||
286 | .flags = IORESOURCE_MEM, | ||
287 | }, | ||
288 | }; | ||
289 | |||
290 | static struct platform_device orion5x_spi = { | ||
291 | .name = "orion_spi", | ||
292 | .id = 0, | ||
293 | .dev = { | ||
294 | .platform_data = &orion5x_spi_plat_data, | ||
295 | }, | ||
296 | .num_resources = ARRAY_SIZE(orion5x_spi_resources), | ||
297 | .resource = orion5x_spi_resources, | ||
298 | }; | ||
299 | |||
300 | void __init orion5x_spi_init() | ||
301 | { | ||
302 | platform_device_register(&orion5x_spi); | ||
303 | } | ||
304 | |||
305 | |||
306 | /***************************************************************************** | ||
271 | * UART0 | 307 | * UART0 |
272 | ****************************************************************************/ | 308 | ****************************************************************************/ |
273 | static struct plat_serial8250_port orion5x_uart0_data[] = { | 309 | static struct plat_serial8250_port orion5x_uart0_data[] = { |
@@ -278,7 +314,7 @@ static struct plat_serial8250_port orion5x_uart0_data[] = { | |||
278 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | 314 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, |
279 | .iotype = UPIO_MEM, | 315 | .iotype = UPIO_MEM, |
280 | .regshift = 2, | 316 | .regshift = 2, |
281 | .uartclk = ORION5X_TCLK, | 317 | .uartclk = 0, |
282 | }, { | 318 | }, { |
283 | }, | 319 | }, |
284 | }; | 320 | }; |
@@ -322,7 +358,7 @@ static struct plat_serial8250_port orion5x_uart1_data[] = { | |||
322 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | 358 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, |
323 | .iotype = UPIO_MEM, | 359 | .iotype = UPIO_MEM, |
324 | .regshift = 2, | 360 | .regshift = 2, |
325 | .uartclk = ORION5X_TCLK, | 361 | .uartclk = 0, |
326 | }, { | 362 | }, { |
327 | }, | 363 | }, |
328 | }; | 364 | }; |
@@ -455,9 +491,24 @@ void __init orion5x_xor_init(void) | |||
455 | /***************************************************************************** | 491 | /***************************************************************************** |
456 | * Time handling | 492 | * Time handling |
457 | ****************************************************************************/ | 493 | ****************************************************************************/ |
494 | int orion5x_tclk; | ||
495 | |||
496 | int __init orion5x_find_tclk(void) | ||
497 | { | ||
498 | u32 dev, rev; | ||
499 | |||
500 | orion5x_pcie_id(&dev, &rev); | ||
501 | if (dev == MV88F6183_DEV_ID && | ||
502 | (readl(MPP_RESET_SAMPLE) & 0x00000200) == 0) | ||
503 | return 133333333; | ||
504 | |||
505 | return 166666667; | ||
506 | } | ||
507 | |||
458 | static void orion5x_timer_init(void) | 508 | static void orion5x_timer_init(void) |
459 | { | 509 | { |
460 | orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK); | 510 | orion5x_tclk = orion5x_find_tclk(); |
511 | orion_time_init(IRQ_ORION5X_BRIDGE, orion5x_tclk); | ||
461 | } | 512 | } |
462 | 513 | ||
463 | struct sys_timer orion5x_timer = { | 514 | struct sys_timer orion5x_timer = { |
@@ -499,6 +550,12 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
499 | } else { | 550 | } else { |
500 | *dev_name = "MV88F5181(L)-Rev-Unsupported"; | 551 | *dev_name = "MV88F5181(L)-Rev-Unsupported"; |
501 | } | 552 | } |
553 | } else if (*dev == MV88F6183_DEV_ID) { | ||
554 | if (*rev == MV88F6183_REV_B0) { | ||
555 | *dev_name = "MV88F6183-Rev-B0"; | ||
556 | } else { | ||
557 | *dev_name = "MV88F6183-Rev-Unsupported"; | ||
558 | } | ||
502 | } else { | 559 | } else { |
503 | *dev_name = "Device-Unknown"; | 560 | *dev_name = "Device-Unknown"; |
504 | } | 561 | } |
@@ -510,7 +567,12 @@ void __init orion5x_init(void) | |||
510 | u32 dev, rev; | 567 | u32 dev, rev; |
511 | 568 | ||
512 | orion5x_id(&dev, &rev, &dev_name); | 569 | orion5x_id(&dev, &rev, &dev_name); |
513 | printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, ORION5X_TCLK); | 570 | printk(KERN_INFO "Orion ID: %s. TCLK=%d.\n", dev_name, orion5x_tclk); |
571 | |||
572 | orion5x_eth_shared_data.t_clk = orion5x_tclk; | ||
573 | orion5x_spi_plat_data.tclk = orion5x_tclk; | ||
574 | orion5x_uart0_data[0].uartclk = orion5x_tclk; | ||
575 | orion5x_uart1_data[0].uartclk = orion5x_tclk; | ||
514 | 576 | ||
515 | /* | 577 | /* |
516 | * Setup Orion address map | 578 | * Setup Orion address map |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index 0bd195551a27..1f8b2da676a5 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
@@ -10,6 +10,7 @@ struct mv_sata_platform_data; | |||
10 | void orion5x_map_io(void); | 10 | void orion5x_map_io(void); |
11 | void orion5x_init_irq(void); | 11 | void orion5x_init_irq(void); |
12 | void orion5x_init(void); | 12 | void orion5x_init(void); |
13 | extern int orion5x_tclk; | ||
13 | extern struct sys_timer orion5x_timer; | 14 | extern struct sys_timer orion5x_timer; |
14 | 15 | ||
15 | /* | 16 | /* |
@@ -30,6 +31,7 @@ void orion5x_ehci1_init(void); | |||
30 | void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data); | 31 | void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data); |
31 | void orion5x_i2c_init(void); | 32 | void orion5x_i2c_init(void); |
32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); | 33 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); |
34 | void orion5x_spi_init(void); | ||
33 | void orion5x_uart0_init(void); | 35 | void orion5x_uart0_init(void); |
34 | void orion5x_uart1_init(void); | 36 | void orion5x_uart1_init(void); |
35 | void orion5x_xor_init(void); | 37 | void orion5x_xor_init(void); |
diff --git a/arch/arm/mach-orion5x/edmini_v2-setup.c b/arch/arm/mach-orion5x/edmini_v2-setup.c new file mode 100644 index 000000000000..b24ee0c2cd61 --- /dev/null +++ b/arch/arm/mach-orion5x/edmini_v2-setup.c | |||
@@ -0,0 +1,262 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/edmini_v2-setup.c | ||
3 | * | ||
4 | * LaCie Ethernet Disk mini V2 Setup | ||
5 | * | ||
6 | * Copyright (C) 2008 Christopher Moore <moore@free.fr> | ||
7 | * Copyright (C) 2008 Albert Aribaud <albert.aribaud@free.fr> | ||
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 | /* | ||
15 | * TODO: add Orion USB device port init when kernel.org support is added. | ||
16 | * TODO: add flash write support: see below. | ||
17 | * TODO: add power-off support. | ||
18 | * TODO: add I2C EEPROM support. | ||
19 | */ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/irq.h> | ||
26 | #include <linux/mtd/physmap.h> | ||
27 | #include <linux/mv643xx_eth.h> | ||
28 | #include <linux/leds.h> | ||
29 | #include <linux/gpio_keys.h> | ||
30 | #include <linux/input.h> | ||
31 | #include <linux/i2c.h> | ||
32 | #include <linux/ata_platform.h> | ||
33 | #include <linux/gpio.h> | ||
34 | #include <asm/mach-types.h> | ||
35 | #include <asm/mach/arch.h> | ||
36 | #include <asm/mach/pci.h> | ||
37 | #include <mach/orion5x.h> | ||
38 | #include "common.h" | ||
39 | #include "mpp.h" | ||
40 | |||
41 | /***************************************************************************** | ||
42 | * EDMINI_V2 Info | ||
43 | ****************************************************************************/ | ||
44 | |||
45 | /* | ||
46 | * 512KB NOR flash Device bus boot chip select | ||
47 | */ | ||
48 | |||
49 | #define EDMINI_V2_NOR_BOOT_BASE 0xfff80000 | ||
50 | #define EDMINI_V2_NOR_BOOT_SIZE SZ_512K | ||
51 | |||
52 | /***************************************************************************** | ||
53 | * 512KB NOR Flash on BOOT Device | ||
54 | ****************************************************************************/ | ||
55 | |||
56 | /* | ||
57 | * Currently the MTD code does not recognize the MX29LV400CBCT as a bottom | ||
58 | * -type device. This could cause risks of accidentally erasing critical | ||
59 | * flash sectors. We thus define a single, write-protected partition covering | ||
60 | * the whole flash. | ||
61 | * TODO: once the flash part TOP/BOTTOM detection issue is sorted out in the MTD | ||
62 | * code, break this into at least three partitions: 'u-boot code', 'u-boot | ||
63 | * environment' and 'whatever is left'. | ||
64 | */ | ||
65 | |||
66 | static struct mtd_partition edmini_v2_partitions[] = { | ||
67 | { | ||
68 | .name = "Full512kb", | ||
69 | .size = 0x00080000, | ||
70 | .offset = 0x00000000, | ||
71 | .mask_flags = MTD_WRITEABLE, | ||
72 | }, | ||
73 | }; | ||
74 | |||
75 | static struct physmap_flash_data edmini_v2_nor_flash_data = { | ||
76 | .width = 1, | ||
77 | .parts = edmini_v2_partitions, | ||
78 | .nr_parts = ARRAY_SIZE(edmini_v2_partitions), | ||
79 | }; | ||
80 | |||
81 | static struct resource edmini_v2_nor_flash_resource = { | ||
82 | .flags = IORESOURCE_MEM, | ||
83 | .start = EDMINI_V2_NOR_BOOT_BASE, | ||
84 | .end = EDMINI_V2_NOR_BOOT_BASE | ||
85 | + EDMINI_V2_NOR_BOOT_SIZE - 1, | ||
86 | }; | ||
87 | |||
88 | static struct platform_device edmini_v2_nor_flash = { | ||
89 | .name = "physmap-flash", | ||
90 | .id = 0, | ||
91 | .dev = { | ||
92 | .platform_data = &edmini_v2_nor_flash_data, | ||
93 | }, | ||
94 | .num_resources = 1, | ||
95 | .resource = &edmini_v2_nor_flash_resource, | ||
96 | }; | ||
97 | |||
98 | /***************************************************************************** | ||
99 | * Ethernet | ||
100 | ****************************************************************************/ | ||
101 | |||
102 | static struct mv643xx_eth_platform_data edmini_v2_eth_data = { | ||
103 | .phy_addr = 8, | ||
104 | }; | ||
105 | |||
106 | /***************************************************************************** | ||
107 | * RTC 5C372a on I2C bus | ||
108 | ****************************************************************************/ | ||
109 | |||
110 | #define EDMINIV2_RTC_GPIO 3 | ||
111 | |||
112 | static struct i2c_board_info __initdata edmini_v2_i2c_rtc = { | ||
113 | I2C_BOARD_INFO("rs5c372a", 0x32), | ||
114 | .irq = 0, | ||
115 | }; | ||
116 | |||
117 | /***************************************************************************** | ||
118 | * Sata | ||
119 | ****************************************************************************/ | ||
120 | |||
121 | static struct mv_sata_platform_data edmini_v2_sata_data = { | ||
122 | .n_ports = 2, | ||
123 | }; | ||
124 | |||
125 | /***************************************************************************** | ||
126 | * GPIO LED (simple - doesn't use hardware blinking support) | ||
127 | ****************************************************************************/ | ||
128 | |||
129 | #define EDMINI_V2_GPIO_LED_POWER 16 | ||
130 | |||
131 | static struct gpio_led edmini_v2_leds[] = { | ||
132 | { | ||
133 | .name = "power:blue", | ||
134 | .gpio = EDMINI_V2_GPIO_LED_POWER, | ||
135 | .active_low = 1, | ||
136 | }, | ||
137 | }; | ||
138 | |||
139 | static struct gpio_led_platform_data edmini_v2_led_data = { | ||
140 | .num_leds = ARRAY_SIZE(edmini_v2_leds), | ||
141 | .leds = edmini_v2_leds, | ||
142 | }; | ||
143 | |||
144 | static struct platform_device edmini_v2_gpio_leds = { | ||
145 | .name = "leds-gpio", | ||
146 | .id = -1, | ||
147 | .dev = { | ||
148 | .platform_data = &edmini_v2_led_data, | ||
149 | }, | ||
150 | }; | ||
151 | |||
152 | /**************************************************************************** | ||
153 | * GPIO key | ||
154 | ****************************************************************************/ | ||
155 | |||
156 | #define EDMINI_V2_GPIO_KEY_POWER 18 | ||
157 | |||
158 | static struct gpio_keys_button edmini_v2_buttons[] = { | ||
159 | { | ||
160 | .code = KEY_POWER, | ||
161 | .gpio = EDMINI_V2_GPIO_KEY_POWER, | ||
162 | .desc = "Power Button", | ||
163 | .active_low = 0, | ||
164 | }, | ||
165 | }; | ||
166 | |||
167 | static struct gpio_keys_platform_data edmini_v2_button_data = { | ||
168 | .buttons = edmini_v2_buttons, | ||
169 | .nbuttons = ARRAY_SIZE(edmini_v2_buttons), | ||
170 | }; | ||
171 | |||
172 | static struct platform_device edmini_v2_gpio_buttons = { | ||
173 | .name = "gpio-keys", | ||
174 | .id = -1, | ||
175 | .dev = { | ||
176 | .platform_data = &edmini_v2_button_data, | ||
177 | }, | ||
178 | }; | ||
179 | |||
180 | /***************************************************************************** | ||
181 | * General Setup | ||
182 | ****************************************************************************/ | ||
183 | static struct orion5x_mpp_mode edminiv2_mpp_modes[] __initdata = { | ||
184 | { 0, MPP_UNUSED }, | ||
185 | { 1, MPP_UNUSED }, | ||
186 | { 2, MPP_UNUSED }, | ||
187 | { 3, MPP_GPIO }, /* RTC interrupt */ | ||
188 | { 4, MPP_UNUSED }, | ||
189 | { 5, MPP_UNUSED }, | ||
190 | { 6, MPP_UNUSED }, | ||
191 | { 7, MPP_UNUSED }, | ||
192 | { 8, MPP_UNUSED }, | ||
193 | { 9, MPP_UNUSED }, | ||
194 | { 10, MPP_UNUSED }, | ||
195 | { 11, MPP_UNUSED }, | ||
196 | { 12, MPP_SATA_LED }, /* SATA 0 presence */ | ||
197 | { 13, MPP_SATA_LED }, /* SATA 1 presence */ | ||
198 | { 14, MPP_SATA_LED }, /* SATA 0 active */ | ||
199 | { 15, MPP_SATA_LED }, /* SATA 1 active */ | ||
200 | /* 16: Power LED control (0 = On, 1 = Off) */ | ||
201 | { 16, MPP_GPIO }, | ||
202 | /* 17: Power LED control select (0 = CPLD, 1 = GPIO16) */ | ||
203 | { 17, MPP_GPIO }, | ||
204 | /* 18: Power button status (0 = Released, 1 = Pressed) */ | ||
205 | { 18, MPP_GPIO }, | ||
206 | { 19, MPP_UNUSED }, | ||
207 | { -1 } | ||
208 | }; | ||
209 | |||
210 | static void __init edmini_v2_init(void) | ||
211 | { | ||
212 | /* | ||
213 | * Setup basic Orion functions. Need to be called early. | ||
214 | */ | ||
215 | orion5x_init(); | ||
216 | |||
217 | orion5x_mpp_conf(edminiv2_mpp_modes); | ||
218 | |||
219 | /* | ||
220 | * Configure peripherals. | ||
221 | */ | ||
222 | orion5x_ehci0_init(); | ||
223 | orion5x_eth_init(&edmini_v2_eth_data); | ||
224 | orion5x_i2c_init(); | ||
225 | orion5x_sata_init(&edmini_v2_sata_data); | ||
226 | orion5x_uart0_init(); | ||
227 | |||
228 | orion5x_setup_dev_boot_win(EDMINI_V2_NOR_BOOT_BASE, | ||
229 | EDMINI_V2_NOR_BOOT_SIZE); | ||
230 | platform_device_register(&edmini_v2_nor_flash); | ||
231 | platform_device_register(&edmini_v2_gpio_leds); | ||
232 | platform_device_register(&edmini_v2_gpio_buttons); | ||
233 | |||
234 | pr_notice("edmini_v2: USB device port, flash write and power-off " | ||
235 | "are not yet supported.\n"); | ||
236 | |||
237 | /* Get RTC IRQ and register the chip */ | ||
238 | if (gpio_request(EDMINIV2_RTC_GPIO, "rtc") == 0) { | ||
239 | if (gpio_direction_input(EDMINIV2_RTC_GPIO) == 0) | ||
240 | edmini_v2_i2c_rtc.irq = gpio_to_irq(EDMINIV2_RTC_GPIO); | ||
241 | else | ||
242 | gpio_free(EDMINIV2_RTC_GPIO); | ||
243 | } | ||
244 | |||
245 | if (edmini_v2_i2c_rtc.irq == 0) | ||
246 | pr_warning("edmini_v2: failed to get RTC IRQ\n"); | ||
247 | |||
248 | i2c_register_board_info(0, &edmini_v2_i2c_rtc, 1); | ||
249 | } | ||
250 | |||
251 | /* Warning: LaCie use a wrong mach-type (0x20e=526) in their bootloader. */ | ||
252 | MACHINE_START(EDMINI_V2, "LaCie Ethernet Disk mini V2") | ||
253 | /* Maintainer: Christopher Moore <moore@free.fr> */ | ||
254 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
255 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
256 | .boot_params = 0x00000100, | ||
257 | .init_machine = edmini_v2_init, | ||
258 | .map_io = orion5x_map_io, | ||
259 | .init_irq = orion5x_init_irq, | ||
260 | .timer = &orion5x_timer, | ||
261 | .fixup = tag_fixup_mem32, | ||
262 | MACHINE_END | ||
diff --git a/arch/arm/mach-orion5x/gpio.c b/arch/arm/mach-orion5x/gpio.c index cd8a16f67d2b..fc419868e39f 100644 --- a/arch/arm/mach-orion5x/gpio.c +++ b/arch/arm/mach-orion5x/gpio.c | |||
@@ -15,8 +15,8 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/bitops.h> | 17 | #include <linux/bitops.h> |
18 | #include <linux/io.h> | ||
18 | #include <asm/gpio.h> | 19 | #include <asm/gpio.h> |
19 | #include <asm/io.h> | ||
20 | #include <mach/orion5x.h> | 20 | #include <mach/orion5x.h> |
21 | #include "common.h" | 21 | #include "common.h" |
22 | 22 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/orion5x.h b/arch/arm/mach-orion5x/include/mach/orion5x.h index 61eb74a88862..e67c843baa02 100644 --- a/arch/arm/mach-orion5x/include/mach/orion5x.h +++ b/arch/arm/mach-orion5x/include/mach/orion5x.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/arm/mach-orion5x/include/mach/orion5x.h | 2 | * arch/arm/mach-orion5x/include/mach/orion5x.h |
3 | * | 3 | * |
4 | * Generic definitions of Orion SoC flavors: | 4 | * Generic definitions of Orion SoC flavors: |
5 | * Orion-1, Orion-VoIP, Orion-NAS, and Orion-2. | 5 | * Orion-1, Orion-VoIP, Orion-NAS, Orion-2, and Orion-1-90. |
6 | * | 6 | * |
7 | * Maintainer: Tzachi Perelstein <tzachi@marvell.com> | 7 | * Maintainer: Tzachi Perelstein <tzachi@marvell.com> |
8 | * | 8 | * |
@@ -76,6 +76,9 @@ | |||
76 | #define MV88F5281_REV_D0 4 | 76 | #define MV88F5281_REV_D0 4 |
77 | #define MV88F5281_REV_D1 5 | 77 | #define MV88F5281_REV_D1 5 |
78 | #define MV88F5281_REV_D2 6 | 78 | #define MV88F5281_REV_D2 6 |
79 | /* Orion-1-90 (88F6183) */ | ||
80 | #define MV88F6183_DEV_ID 0x6183 | ||
81 | #define MV88F6183_REV_B0 3 | ||
79 | 82 | ||
80 | /******************************************************************************* | 83 | /******************************************************************************* |
81 | * Orion Registers Map | 84 | * Orion Registers Map |
@@ -86,6 +89,7 @@ | |||
86 | #define ORION5X_DEV_BUS_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x10000) | 89 | #define ORION5X_DEV_BUS_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x10000) |
87 | #define ORION5X_DEV_BUS_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x10000) | 90 | #define ORION5X_DEV_BUS_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x10000) |
88 | #define ORION5X_DEV_BUS_REG(x) (ORION5X_DEV_BUS_VIRT_BASE | (x)) | 91 | #define ORION5X_DEV_BUS_REG(x) (ORION5X_DEV_BUS_VIRT_BASE | (x)) |
92 | #define SPI_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x0600) | ||
89 | #define I2C_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x1000) | 93 | #define I2C_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x1000) |
90 | #define UART0_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x2000) | 94 | #define UART0_PHYS_BASE (ORION5X_DEV_BUS_PHYS_BASE | 0x2000) |
91 | #define UART0_VIRT_BASE (ORION5X_DEV_BUS_VIRT_BASE | 0x2000) | 95 | #define UART0_VIRT_BASE (ORION5X_DEV_BUS_VIRT_BASE | 0x2000) |
diff --git a/arch/arm/mach-orion5x/include/mach/timex.h b/arch/arm/mach-orion5x/include/mach/timex.h index e82e44db7629..4c69820e0810 100644 --- a/arch/arm/mach-orion5x/include/mach/timex.h +++ b/arch/arm/mach-orion5x/include/mach/timex.h | |||
@@ -9,5 +9,3 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #define CLOCK_TICK_RATE (100 * HZ) | 11 | #define CLOCK_TICK_RATE (100 * HZ) |
12 | |||
13 | #define ORION5X_TCLK 166666667 | ||
diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index 2545ff9e5830..632a36f5cf14 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c | |||
@@ -13,8 +13,8 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #include <linux/io.h> | ||
16 | #include <asm/gpio.h> | 17 | #include <asm/gpio.h> |
17 | #include <asm/io.h> | ||
18 | #include <mach/orion5x.h> | 18 | #include <mach/orion5x.h> |
19 | #include <plat/irq.h> | 19 | #include <plat/irq.h> |
20 | #include "common.h" | 20 | #include "common.h" |
@@ -162,7 +162,7 @@ static void orion5x_gpio_irq_handler(unsigned int irq, struct irq_desc *desc) | |||
162 | polarity ^= 1 << pin; | 162 | polarity ^= 1 << pin; |
163 | writel(polarity, GPIO_IN_POL); | 163 | writel(polarity, GPIO_IN_POL); |
164 | } | 164 | } |
165 | desc_handle_irq(irq, desc); | 165 | generic_handle_irq(irq); |
166 | } | 166 | } |
167 | } | 167 | } |
168 | } | 168 | } |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 610f2a6297f8..dfbb68df7b09 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
@@ -293,7 +293,7 @@ static void kurobox_pro_power_off(void) | |||
293 | const unsigned char shutdownwait[] = {0x00, 0x0c}; | 293 | const unsigned char shutdownwait[] = {0x00, 0x0c}; |
294 | const unsigned char poweroff[] = {0x00, 0x06}; | 294 | const unsigned char poweroff[] = {0x00, 0x06}; |
295 | /* 38400 baud divisor */ | 295 | /* 38400 baud divisor */ |
296 | const unsigned divisor = ((ORION5X_TCLK + (8 * 38400)) / (16 * 38400)); | 296 | const unsigned divisor = ((orion5x_tclk + (8 * 38400)) / (16 * 38400)); |
297 | 297 | ||
298 | pr_info("%s: triggering power-off...\n", __func__); | 298 | pr_info("%s: triggering power-off...\n", __func__); |
299 | 299 | ||
diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c new file mode 100644 index 000000000000..e0c43b8beb72 --- /dev/null +++ b/arch/arm/mach-orion5x/lsmini-setup.c | |||
@@ -0,0 +1,279 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/lsmini-setup.c | ||
3 | * | ||
4 | * Maintainer: Alexey Kopytko <alexey@kopytko.ru> | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/pci.h> | ||
15 | #include <linux/mtd/physmap.h> | ||
16 | #include <linux/mv643xx_eth.h> | ||
17 | #include <linux/leds.h> | ||
18 | #include <linux/gpio_keys.h> | ||
19 | #include <linux/input.h> | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/ata_platform.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | #include <linux/gpio.h> | ||
24 | #include <asm/mach/arch.h> | ||
25 | #include "common.h" | ||
26 | #include "mpp.h" | ||
27 | #include "include/mach/system.h" | ||
28 | |||
29 | /***************************************************************************** | ||
30 | * Linkstation Mini Info | ||
31 | ****************************************************************************/ | ||
32 | |||
33 | /* | ||
34 | * 256K NOR flash Device bus boot chip select | ||
35 | */ | ||
36 | |||
37 | #define LSMINI_NOR_BOOT_BASE 0xf4000000 | ||
38 | #define LSMINI_NOR_BOOT_SIZE SZ_256K | ||
39 | |||
40 | /***************************************************************************** | ||
41 | * 256KB NOR Flash on BOOT Device | ||
42 | ****************************************************************************/ | ||
43 | |||
44 | static struct physmap_flash_data lsmini_nor_flash_data = { | ||
45 | .width = 1, | ||
46 | }; | ||
47 | |||
48 | static struct resource lsmini_nor_flash_resource = { | ||
49 | .flags = IORESOURCE_MEM, | ||
50 | .start = LSMINI_NOR_BOOT_BASE, | ||
51 | .end = LSMINI_NOR_BOOT_BASE + LSMINI_NOR_BOOT_SIZE - 1, | ||
52 | }; | ||
53 | |||
54 | static struct platform_device lsmini_nor_flash = { | ||
55 | .name = "physmap-flash", | ||
56 | .id = 0, | ||
57 | .dev = { | ||
58 | .platform_data = &lsmini_nor_flash_data, | ||
59 | }, | ||
60 | .num_resources = 1, | ||
61 | .resource = &lsmini_nor_flash_resource, | ||
62 | }; | ||
63 | |||
64 | /***************************************************************************** | ||
65 | * Ethernet | ||
66 | ****************************************************************************/ | ||
67 | |||
68 | static struct mv643xx_eth_platform_data lsmini_eth_data = { | ||
69 | .phy_addr = 8, | ||
70 | }; | ||
71 | |||
72 | /***************************************************************************** | ||
73 | * RTC 5C372a on I2C bus | ||
74 | ****************************************************************************/ | ||
75 | |||
76 | static struct i2c_board_info __initdata lsmini_i2c_rtc = { | ||
77 | I2C_BOARD_INFO("rs5c372a", 0x32), | ||
78 | }; | ||
79 | |||
80 | /***************************************************************************** | ||
81 | * LEDs attached to GPIO | ||
82 | ****************************************************************************/ | ||
83 | |||
84 | #define LSMINI_GPIO_LED_ALARM 2 | ||
85 | #define LSMINI_GPIO_LED_INFO 3 | ||
86 | #define LSMINI_GPIO_LED_FUNC 9 | ||
87 | #define LSMINI_GPIO_LED_PWR 14 | ||
88 | |||
89 | static struct gpio_led lsmini_led_pins[] = { | ||
90 | { | ||
91 | .name = "alarm:red", | ||
92 | .gpio = LSMINI_GPIO_LED_ALARM, | ||
93 | .active_low = 1, | ||
94 | }, { | ||
95 | .name = "info:amber", | ||
96 | .gpio = LSMINI_GPIO_LED_INFO, | ||
97 | .active_low = 1, | ||
98 | }, { | ||
99 | .name = "func:blue:top", | ||
100 | .gpio = LSMINI_GPIO_LED_FUNC, | ||
101 | .active_low = 1, | ||
102 | }, { | ||
103 | .name = "power:blue:bottom", | ||
104 | .gpio = LSMINI_GPIO_LED_PWR, | ||
105 | }, | ||
106 | }; | ||
107 | |||
108 | static struct gpio_led_platform_data lsmini_led_data = { | ||
109 | .leds = lsmini_led_pins, | ||
110 | .num_leds = ARRAY_SIZE(lsmini_led_pins), | ||
111 | }; | ||
112 | |||
113 | static struct platform_device lsmini_leds = { | ||
114 | .name = "leds-gpio", | ||
115 | .id = -1, | ||
116 | .dev = { | ||
117 | .platform_data = &lsmini_led_data, | ||
118 | }, | ||
119 | }; | ||
120 | |||
121 | /**************************************************************************** | ||
122 | * GPIO Attached Keys | ||
123 | ****************************************************************************/ | ||
124 | |||
125 | #define LSMINI_GPIO_KEY_FUNC 15 | ||
126 | #define LSMINI_GPIO_KEY_POWER 18 | ||
127 | #define LSMINI_GPIO_KEY_AUTOPOWER 17 | ||
128 | |||
129 | #define LSMINI_SW_POWER 0x00 | ||
130 | #define LSMINI_SW_AUTOPOWER 0x01 | ||
131 | |||
132 | static struct gpio_keys_button lsmini_buttons[] = { | ||
133 | { | ||
134 | .code = KEY_OPTION, | ||
135 | .gpio = LSMINI_GPIO_KEY_FUNC, | ||
136 | .desc = "Function Button", | ||
137 | .active_low = 1, | ||
138 | }, { | ||
139 | .type = EV_SW, | ||
140 | .code = LSMINI_SW_POWER, | ||
141 | .gpio = LSMINI_GPIO_KEY_POWER, | ||
142 | .desc = "Power-on Switch", | ||
143 | .active_low = 1, | ||
144 | }, { | ||
145 | .type = EV_SW, | ||
146 | .code = LSMINI_SW_AUTOPOWER, | ||
147 | .gpio = LSMINI_GPIO_KEY_AUTOPOWER, | ||
148 | .desc = "Power-auto Switch", | ||
149 | .active_low = 1, | ||
150 | }, | ||
151 | }; | ||
152 | |||
153 | static struct gpio_keys_platform_data lsmini_button_data = { | ||
154 | .buttons = lsmini_buttons, | ||
155 | .nbuttons = ARRAY_SIZE(lsmini_buttons), | ||
156 | }; | ||
157 | |||
158 | static struct platform_device lsmini_button_device = { | ||
159 | .name = "gpio-keys", | ||
160 | .id = -1, | ||
161 | .num_resources = 0, | ||
162 | .dev = { | ||
163 | .platform_data = &lsmini_button_data, | ||
164 | }, | ||
165 | }; | ||
166 | |||
167 | |||
168 | /***************************************************************************** | ||
169 | * SATA | ||
170 | ****************************************************************************/ | ||
171 | static struct mv_sata_platform_data lsmini_sata_data = { | ||
172 | .n_ports = 2, | ||
173 | }; | ||
174 | |||
175 | |||
176 | /***************************************************************************** | ||
177 | * Linkstation Mini specific power off method: reboot | ||
178 | ****************************************************************************/ | ||
179 | /* | ||
180 | * On the Linkstation Mini, the shutdown process is following: | ||
181 | * - Userland monitors key events until the power switch goes to off position | ||
182 | * - The board reboots | ||
183 | * - U-boot starts and goes into an idle mode waiting for the user | ||
184 | * to move the switch to ON position | ||
185 | */ | ||
186 | |||
187 | static void lsmini_power_off(void) | ||
188 | { | ||
189 | arch_reset(0); | ||
190 | } | ||
191 | |||
192 | |||
193 | /***************************************************************************** | ||
194 | * General Setup | ||
195 | ****************************************************************************/ | ||
196 | |||
197 | #define LSMINI_GPIO_USB_POWER 16 | ||
198 | #define LSMINI_GPIO_AUTO_POWER 17 | ||
199 | #define LSMINI_GPIO_POWER 18 | ||
200 | |||
201 | #define LSMINI_GPIO_HDD_POWER0 1 | ||
202 | #define LSMINI_GPIO_HDD_POWER1 19 | ||
203 | |||
204 | static struct orion5x_mpp_mode lsmini_mpp_modes[] __initdata = { | ||
205 | { 0, MPP_UNUSED }, /* LED_RESERVE1 (unused) */ | ||
206 | { 1, MPP_GPIO }, /* HDD_PWR */ | ||
207 | { 2, MPP_GPIO }, /* LED_ALARM */ | ||
208 | { 3, MPP_GPIO }, /* LED_INFO */ | ||
209 | { 4, MPP_UNUSED }, | ||
210 | { 5, MPP_UNUSED }, | ||
211 | { 6, MPP_UNUSED }, | ||
212 | { 7, MPP_UNUSED }, | ||
213 | { 8, MPP_UNUSED }, | ||
214 | { 9, MPP_GPIO }, /* LED_FUNC */ | ||
215 | { 10, MPP_UNUSED }, | ||
216 | { 11, MPP_UNUSED }, /* LED_ETH (dummy) */ | ||
217 | { 12, MPP_UNUSED }, | ||
218 | { 13, MPP_UNUSED }, | ||
219 | { 14, MPP_GPIO }, /* LED_PWR */ | ||
220 | { 15, MPP_GPIO }, /* FUNC */ | ||
221 | { 16, MPP_GPIO }, /* USB_PWR */ | ||
222 | { 17, MPP_GPIO }, /* AUTO_POWER */ | ||
223 | { 18, MPP_GPIO }, /* POWER */ | ||
224 | { 19, MPP_GPIO }, /* HDD_PWR1 */ | ||
225 | { -1 }, | ||
226 | }; | ||
227 | |||
228 | static void __init lsmini_init(void) | ||
229 | { | ||
230 | /* | ||
231 | * Setup basic Orion functions. Need to be called early. | ||
232 | */ | ||
233 | orion5x_init(); | ||
234 | |||
235 | orion5x_mpp_conf(lsmini_mpp_modes); | ||
236 | |||
237 | /* | ||
238 | * Configure peripherals. | ||
239 | */ | ||
240 | orion5x_ehci0_init(); | ||
241 | orion5x_ehci1_init(); | ||
242 | orion5x_eth_init(&lsmini_eth_data); | ||
243 | orion5x_i2c_init(); | ||
244 | orion5x_sata_init(&lsmini_sata_data); | ||
245 | orion5x_uart0_init(); | ||
246 | orion5x_xor_init(); | ||
247 | |||
248 | orion5x_setup_dev_boot_win(LSMINI_NOR_BOOT_BASE, | ||
249 | LSMINI_NOR_BOOT_SIZE); | ||
250 | platform_device_register(&lsmini_nor_flash); | ||
251 | |||
252 | platform_device_register(&lsmini_button_device); | ||
253 | |||
254 | platform_device_register(&lsmini_leds); | ||
255 | |||
256 | i2c_register_board_info(0, &lsmini_i2c_rtc, 1); | ||
257 | |||
258 | /* enable USB power */ | ||
259 | gpio_set_value(LSMINI_GPIO_USB_POWER, 1); | ||
260 | |||
261 | /* register power-off method */ | ||
262 | pm_power_off = lsmini_power_off; | ||
263 | |||
264 | pr_info("%s: finished\n", __func__); | ||
265 | } | ||
266 | |||
267 | #ifdef CONFIG_MACH_LINKSTATION_MINI | ||
268 | MACHINE_START(LINKSTATION_MINI, "Buffalo Linkstation Mini") | ||
269 | /* Maintainer: Alexey Kopytko <alexey@kopytko.ru> */ | ||
270 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
271 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
272 | .boot_params = 0x00000100, | ||
273 | .init_machine = lsmini_init, | ||
274 | .map_io = orion5x_map_io, | ||
275 | .init_irq = orion5x_init_irq, | ||
276 | .timer = &orion5x_timer, | ||
277 | .fixup = tag_fixup_mem32, | ||
278 | MACHINE_END | ||
279 | #endif | ||
diff --git a/arch/arm/mach-orion5x/mpp.c b/arch/arm/mach-orion5x/mpp.c index c04ab0e16ea1..640ea2a3fc6c 100644 --- a/arch/arm/mach-orion5x/mpp.c +++ b/arch/arm/mach-orion5x/mpp.c | |||
@@ -11,8 +11,8 @@ | |||
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <linux/io.h> | ||
14 | #include <mach/hardware.h> | 15 | #include <mach/hardware.h> |
15 | #include <asm/io.h> | ||
16 | #include "common.h" | 16 | #include "common.h" |
17 | #include "mpp.h" | 17 | #include "mpp.h" |
18 | 18 | ||
diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c new file mode 100644 index 000000000000..40e049539091 --- /dev/null +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c | |||
@@ -0,0 +1,117 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-orion5x/rd88f6183-ap-ge-setup.c | ||
3 | * | ||
4 | * Marvell Orion-1-90 AP GE Reference Design Setup | ||
5 | * | ||
6 | * This file is licensed under the terms of the GNU General Public | ||
7 | * License version 2. This program is licensed "as is" without any | ||
8 | * warranty of any kind, whether express or implied. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/platform_device.h> | ||
14 | #include <linux/pci.h> | ||
15 | #include <linux/irq.h> | ||
16 | #include <linux/mtd/physmap.h> | ||
17 | #include <linux/mv643xx_eth.h> | ||
18 | #include <linux/spi/spi.h> | ||
19 | #include <linux/spi/orion_spi.h> | ||
20 | #include <linux/spi/flash.h> | ||
21 | #include <linux/ethtool.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | #include <asm/gpio.h> | ||
24 | #include <asm/leds.h> | ||
25 | #include <asm/mach/arch.h> | ||
26 | #include <asm/mach/pci.h> | ||
27 | #include <mach/orion5x.h> | ||
28 | #include "common.h" | ||
29 | #include "mpp.h" | ||
30 | |||
31 | static struct mv643xx_eth_platform_data rd88f6183ap_ge_eth_data = { | ||
32 | .phy_addr = -1, | ||
33 | .speed = SPEED_1000, | ||
34 | .duplex = DUPLEX_FULL, | ||
35 | }; | ||
36 | |||
37 | static struct mtd_partition rd88f6183ap_ge_partitions[] = { | ||
38 | { | ||
39 | .name = "kernel", | ||
40 | .offset = 0x00000000, | ||
41 | .size = 0x00200000, | ||
42 | }, { | ||
43 | .name = "rootfs", | ||
44 | .offset = 0x00200000, | ||
45 | .size = 0x00500000, | ||
46 | }, { | ||
47 | .name = "nvram", | ||
48 | .offset = 0x00700000, | ||
49 | .size = 0x00080000, | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | static struct flash_platform_data rd88f6183ap_ge_spi_slave_data = { | ||
54 | .type = "m25p64", | ||
55 | .nr_parts = ARRAY_SIZE(rd88f6183ap_ge_partitions), | ||
56 | .parts = rd88f6183ap_ge_partitions, | ||
57 | }; | ||
58 | |||
59 | static struct spi_board_info __initdata rd88f6183ap_ge_spi_slave_info[] = { | ||
60 | { | ||
61 | .modalias = "m25p80", | ||
62 | .platform_data = &rd88f6183ap_ge_spi_slave_data, | ||
63 | .irq = NO_IRQ, | ||
64 | .max_speed_hz = 20000000, | ||
65 | .bus_num = 0, | ||
66 | .chip_select = 0, | ||
67 | }, | ||
68 | }; | ||
69 | |||
70 | static void __init rd88f6183ap_ge_init(void) | ||
71 | { | ||
72 | /* | ||
73 | * Setup basic Orion functions. Need to be called early. | ||
74 | */ | ||
75 | orion5x_init(); | ||
76 | |||
77 | /* | ||
78 | * Configure peripherals. | ||
79 | */ | ||
80 | orion5x_ehci0_init(); | ||
81 | orion5x_eth_init(&rd88f6183ap_ge_eth_data); | ||
82 | spi_register_board_info(rd88f6183ap_ge_spi_slave_info, | ||
83 | ARRAY_SIZE(rd88f6183ap_ge_spi_slave_info)); | ||
84 | orion5x_spi_init(); | ||
85 | orion5x_uart0_init(); | ||
86 | } | ||
87 | |||
88 | static struct hw_pci rd88f6183ap_ge_pci __initdata = { | ||
89 | .nr_controllers = 2, | ||
90 | .swizzle = pci_std_swizzle, | ||
91 | .setup = orion5x_pci_sys_setup, | ||
92 | .scan = orion5x_pci_sys_scan_bus, | ||
93 | .map_irq = orion5x_pci_map_irq, | ||
94 | }; | ||
95 | |||
96 | static int __init rd88f6183ap_ge_pci_init(void) | ||
97 | { | ||
98 | if (machine_is_rd88f6183ap_ge()) { | ||
99 | orion5x_pci_disable(); | ||
100 | pci_common_init(&rd88f6183ap_ge_pci); | ||
101 | } | ||
102 | |||
103 | return 0; | ||
104 | } | ||
105 | subsys_initcall(rd88f6183ap_ge_pci_init); | ||
106 | |||
107 | MACHINE_START(RD88F6183AP_GE, "Marvell Orion-1-90 AP GE Reference Design") | ||
108 | /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */ | ||
109 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
110 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
111 | .boot_params = 0x00000100, | ||
112 | .init_machine = rd88f6183ap_ge_init, | ||
113 | .map_io = orion5x_map_io, | ||
114 | .init_irq = orion5x_init_irq, | ||
115 | .timer = &orion5x_timer, | ||
116 | .fixup = tag_fixup_mem32, | ||
117 | MACHINE_END | ||
diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c new file mode 100644 index 000000000000..0b101d7d41c2 --- /dev/null +++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c | |||
@@ -0,0 +1,369 @@ | |||
1 | /* | ||
2 | * Buffalo Terastation Pro II/Live Board Setup | ||
3 | * | ||
4 | * Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/pci.h> | ||
16 | #include <linux/irq.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/mtd/physmap.h> | ||
19 | #include <linux/mv643xx_eth.h> | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/serial_reg.h> | ||
22 | #include <asm/mach-types.h> | ||
23 | #include <asm/gpio.h> | ||
24 | #include <asm/mach/arch.h> | ||
25 | #include <asm/mach/pci.h> | ||
26 | #include <mach/orion5x.h> | ||
27 | #include "common.h" | ||
28 | #include "mpp.h" | ||
29 | |||
30 | /***************************************************************************** | ||
31 | * Terastation Pro 2/Live Info | ||
32 | ****************************************************************************/ | ||
33 | |||
34 | /* | ||
35 | * Terastation Pro 2 hardware : | ||
36 | * - Marvell 88F5281-D0 | ||
37 | * - Marvell 88SX6042 SATA controller (PCI) | ||
38 | * - Marvell 88E1118 Gigabit Ethernet PHY | ||
39 | * - 256KB NOR flash | ||
40 | * - 128MB of DDR RAM | ||
41 | * - PCIe port (not equipped) | ||
42 | */ | ||
43 | |||
44 | /* | ||
45 | * 256K NOR flash Device bus boot chip select | ||
46 | */ | ||
47 | |||
48 | #define TSP2_NOR_BOOT_BASE 0xf4000000 | ||
49 | #define TSP2_NOR_BOOT_SIZE SZ_256K | ||
50 | |||
51 | /***************************************************************************** | ||
52 | * 256KB NOR Flash on BOOT Device | ||
53 | ****************************************************************************/ | ||
54 | |||
55 | static struct physmap_flash_data tsp2_nor_flash_data = { | ||
56 | .width = 1, | ||
57 | }; | ||
58 | |||
59 | static struct resource tsp2_nor_flash_resource = { | ||
60 | .flags = IORESOURCE_MEM, | ||
61 | .start = TSP2_NOR_BOOT_BASE, | ||
62 | .end = TSP2_NOR_BOOT_BASE + TSP2_NOR_BOOT_SIZE - 1, | ||
63 | }; | ||
64 | |||
65 | static struct platform_device tsp2_nor_flash = { | ||
66 | .name = "physmap-flash", | ||
67 | .id = 0, | ||
68 | .dev = { | ||
69 | .platform_data = &tsp2_nor_flash_data, | ||
70 | }, | ||
71 | .num_resources = 1, | ||
72 | .resource = &tsp2_nor_flash_resource, | ||
73 | }; | ||
74 | |||
75 | /***************************************************************************** | ||
76 | * PCI | ||
77 | ****************************************************************************/ | ||
78 | #define TSP2_PCI_SLOT0_OFFS 7 | ||
79 | #define TSP2_PCI_SLOT0_IRQ_PIN 11 | ||
80 | |||
81 | void __init tsp2_pci_preinit(void) | ||
82 | { | ||
83 | int pin; | ||
84 | |||
85 | /* | ||
86 | * Configure PCI GPIO IRQ pins | ||
87 | */ | ||
88 | pin = TSP2_PCI_SLOT0_IRQ_PIN; | ||
89 | if (gpio_request(pin, "PCI Int1") == 0) { | ||
90 | if (gpio_direction_input(pin) == 0) { | ||
91 | set_irq_type(gpio_to_irq(pin), IRQ_TYPE_LEVEL_LOW); | ||
92 | } else { | ||
93 | printk(KERN_ERR "tsp2_pci_preinit failed " | ||
94 | "to set_irq_type pin %d\n", pin); | ||
95 | gpio_free(pin); | ||
96 | } | ||
97 | } else { | ||
98 | printk(KERN_ERR "tsp2_pci_preinit failed to " | ||
99 | "gpio_request %d\n", pin); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | static int __init tsp2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | ||
104 | { | ||
105 | int irq; | ||
106 | |||
107 | /* | ||
108 | * Check for devices with hard-wired IRQs. | ||
109 | */ | ||
110 | irq = orion5x_pci_map_irq(dev, slot, pin); | ||
111 | if (irq != -1) | ||
112 | return irq; | ||
113 | |||
114 | /* | ||
115 | * PCI IRQs are connected via GPIOs. | ||
116 | */ | ||
117 | if (slot == TSP2_PCI_SLOT0_OFFS) | ||
118 | return gpio_to_irq(TSP2_PCI_SLOT0_IRQ_PIN); | ||
119 | |||
120 | return -1; | ||
121 | } | ||
122 | |||
123 | static struct hw_pci tsp2_pci __initdata = { | ||
124 | .nr_controllers = 2, | ||
125 | .preinit = tsp2_pci_preinit, | ||
126 | .swizzle = pci_std_swizzle, | ||
127 | .setup = orion5x_pci_sys_setup, | ||
128 | .scan = orion5x_pci_sys_scan_bus, | ||
129 | .map_irq = tsp2_pci_map_irq, | ||
130 | }; | ||
131 | |||
132 | static int __init tsp2_pci_init(void) | ||
133 | { | ||
134 | if (machine_is_terastation_pro2()) | ||
135 | pci_common_init(&tsp2_pci); | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | |||
140 | subsys_initcall(tsp2_pci_init); | ||
141 | |||
142 | /***************************************************************************** | ||
143 | * Ethernet | ||
144 | ****************************************************************************/ | ||
145 | |||
146 | static struct mv643xx_eth_platform_data tsp2_eth_data = { | ||
147 | .phy_addr = 0, | ||
148 | }; | ||
149 | |||
150 | /***************************************************************************** | ||
151 | * RTC 5C372a on I2C bus | ||
152 | ****************************************************************************/ | ||
153 | |||
154 | #define TSP2_RTC_GPIO 9 | ||
155 | |||
156 | static struct i2c_board_info __initdata tsp2_i2c_rtc = { | ||
157 | I2C_BOARD_INFO("rs5c372a", 0x32), | ||
158 | }; | ||
159 | |||
160 | /***************************************************************************** | ||
161 | * Terastation Pro II specific power off method via UART1-attached | ||
162 | * microcontroller | ||
163 | ****************************************************************************/ | ||
164 | |||
165 | #define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2)) | ||
166 | |||
167 | static int tsp2_miconread(unsigned char *buf, int count) | ||
168 | { | ||
169 | int i; | ||
170 | int timeout; | ||
171 | |||
172 | for (i = 0; i < count; i++) { | ||
173 | timeout = 10; | ||
174 | |||
175 | while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) { | ||
176 | if (--timeout == 0) | ||
177 | break; | ||
178 | udelay(1000); | ||
179 | } | ||
180 | |||
181 | if (timeout == 0) | ||
182 | break; | ||
183 | buf[i] = readl(UART1_REG(RX)); | ||
184 | } | ||
185 | |||
186 | /* return read bytes */ | ||
187 | return i; | ||
188 | } | ||
189 | |||
190 | static int tsp2_miconwrite(const unsigned char *buf, int count) | ||
191 | { | ||
192 | int i = 0; | ||
193 | |||
194 | while (count--) { | ||
195 | while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE)) | ||
196 | barrier(); | ||
197 | writel(buf[i++], UART1_REG(TX)); | ||
198 | } | ||
199 | |||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | static int tsp2_miconsend(const unsigned char *data, int count) | ||
204 | { | ||
205 | int i; | ||
206 | unsigned char checksum = 0; | ||
207 | unsigned char recv_buf[40]; | ||
208 | unsigned char send_buf[40]; | ||
209 | unsigned char correct_ack[3]; | ||
210 | int retry = 2; | ||
211 | |||
212 | /* Generate checksum */ | ||
213 | for (i = 0; i < count; i++) | ||
214 | checksum -= data[i]; | ||
215 | |||
216 | do { | ||
217 | /* Send data */ | ||
218 | tsp2_miconwrite(data, count); | ||
219 | |||
220 | /* send checksum */ | ||
221 | tsp2_miconwrite(&checksum, 1); | ||
222 | |||
223 | if (tsp2_miconread(recv_buf, sizeof(recv_buf)) <= 3) { | ||
224 | printk(KERN_ERR ">%s: receive failed.\n", __func__); | ||
225 | |||
226 | /* send preamble to clear the receive buffer */ | ||
227 | memset(&send_buf, 0xff, sizeof(send_buf)); | ||
228 | tsp2_miconwrite(send_buf, sizeof(send_buf)); | ||
229 | |||
230 | /* make dummy reads */ | ||
231 | mdelay(100); | ||
232 | tsp2_miconread(recv_buf, sizeof(recv_buf)); | ||
233 | } else { | ||
234 | /* Generate expected ack */ | ||
235 | correct_ack[0] = 0x01; | ||
236 | correct_ack[1] = data[1]; | ||
237 | correct_ack[2] = 0x00; | ||
238 | |||
239 | /* checksum Check */ | ||
240 | if ((recv_buf[0] + recv_buf[1] + recv_buf[2] + | ||
241 | recv_buf[3]) & 0xFF) { | ||
242 | printk(KERN_ERR ">%s: Checksum Error : " | ||
243 | "Received data[%02x, %02x, %02x, %02x]" | ||
244 | "\n", __func__, recv_buf[0], | ||
245 | recv_buf[1], recv_buf[2], recv_buf[3]); | ||
246 | } else { | ||
247 | /* Check Received Data */ | ||
248 | if (correct_ack[0] == recv_buf[0] && | ||
249 | correct_ack[1] == recv_buf[1] && | ||
250 | correct_ack[2] == recv_buf[2]) { | ||
251 | /* Interval for next command */ | ||
252 | mdelay(10); | ||
253 | |||
254 | /* Receive ACK */ | ||
255 | return 0; | ||
256 | } | ||
257 | } | ||
258 | /* Received NAK or illegal Data */ | ||
259 | printk(KERN_ERR ">%s: Error : NAK or Illegal Data " | ||
260 | "Received\n", __func__); | ||
261 | } | ||
262 | } while (retry--); | ||
263 | |||
264 | /* Interval for next command */ | ||
265 | mdelay(10); | ||
266 | |||
267 | return -1; | ||
268 | } | ||
269 | |||
270 | static void tsp2_power_off(void) | ||
271 | { | ||
272 | const unsigned char watchdogkill[] = {0x01, 0x35, 0x00}; | ||
273 | const unsigned char shutdownwait[] = {0x00, 0x0c}; | ||
274 | const unsigned char poweroff[] = {0x00, 0x06}; | ||
275 | /* 38400 baud divisor */ | ||
276 | const unsigned divisor = ((orion5x_tclk + (8 * 38400)) / (16 * 38400)); | ||
277 | |||
278 | pr_info("%s: triggering power-off...\n", __func__); | ||
279 | |||
280 | /* hijack uart1 and reset into sane state (38400,8n1,even parity) */ | ||
281 | writel(0x83, UART1_REG(LCR)); | ||
282 | writel(divisor & 0xff, UART1_REG(DLL)); | ||
283 | writel((divisor >> 8) & 0xff, UART1_REG(DLM)); | ||
284 | writel(0x1b, UART1_REG(LCR)); | ||
285 | writel(0x00, UART1_REG(IER)); | ||
286 | writel(0x07, UART1_REG(FCR)); | ||
287 | writel(0x00, UART1_REG(MCR)); | ||
288 | |||
289 | /* Send the commands to shutdown the Terastation Pro II */ | ||
290 | tsp2_miconsend(watchdogkill, sizeof(watchdogkill)) ; | ||
291 | tsp2_miconsend(shutdownwait, sizeof(shutdownwait)) ; | ||
292 | tsp2_miconsend(poweroff, sizeof(poweroff)); | ||
293 | } | ||
294 | |||
295 | /***************************************************************************** | ||
296 | * General Setup | ||
297 | ****************************************************************************/ | ||
298 | static struct orion5x_mpp_mode tsp2_mpp_modes[] __initdata = { | ||
299 | { 0, MPP_PCIE_RST_OUTn }, | ||
300 | { 1, MPP_UNUSED }, | ||
301 | { 2, MPP_UNUSED }, | ||
302 | { 3, MPP_UNUSED }, | ||
303 | { 4, MPP_NAND }, /* BOOT NAND Flash REn */ | ||
304 | { 5, MPP_NAND }, /* BOOT NAND Flash WEn */ | ||
305 | { 6, MPP_NAND }, /* BOOT NAND Flash HREn[0] */ | ||
306 | { 7, MPP_NAND }, /* BOOT NAND Flash WEn[0] */ | ||
307 | { 8, MPP_GPIO }, /* MICON int */ | ||
308 | { 9, MPP_GPIO }, /* RTC int */ | ||
309 | { 10, MPP_UNUSED }, | ||
310 | { 11, MPP_GPIO }, /* PCI Int A */ | ||
311 | { 12, MPP_UNUSED }, | ||
312 | { 13, MPP_GPIO }, /* UPS on UART0 enable */ | ||
313 | { 14, MPP_GPIO }, /* UPS low battery detection */ | ||
314 | { 15, MPP_UNUSED }, | ||
315 | { 16, MPP_UART }, /* UART1 RXD */ | ||
316 | { 17, MPP_UART }, /* UART1 TXD */ | ||
317 | { 18, MPP_UART }, /* UART1 CTSn */ | ||
318 | { 19, MPP_UART }, /* UART1 RTSn */ | ||
319 | { -1 }, | ||
320 | }; | ||
321 | |||
322 | static void __init tsp2_init(void) | ||
323 | { | ||
324 | /* | ||
325 | * Setup basic Orion functions. Need to be called early. | ||
326 | */ | ||
327 | orion5x_init(); | ||
328 | |||
329 | orion5x_mpp_conf(tsp2_mpp_modes); | ||
330 | |||
331 | /* | ||
332 | * Configure peripherals. | ||
333 | */ | ||
334 | orion5x_setup_dev_boot_win(TSP2_NOR_BOOT_BASE, | ||
335 | TSP2_NOR_BOOT_SIZE); | ||
336 | platform_device_register(&tsp2_nor_flash); | ||
337 | |||
338 | orion5x_ehci0_init(); | ||
339 | orion5x_eth_init(&tsp2_eth_data); | ||
340 | orion5x_i2c_init(); | ||
341 | orion5x_uart0_init(); | ||
342 | orion5x_uart1_init(); | ||
343 | |||
344 | /* Get RTC IRQ and register the chip */ | ||
345 | if (gpio_request(TSP2_RTC_GPIO, "rtc") == 0) { | ||
346 | if (gpio_direction_input(TSP2_RTC_GPIO) == 0) | ||
347 | tsp2_i2c_rtc.irq = gpio_to_irq(TSP2_RTC_GPIO); | ||
348 | else | ||
349 | gpio_free(TSP2_RTC_GPIO); | ||
350 | } | ||
351 | if (tsp2_i2c_rtc.irq == 0) | ||
352 | pr_warning("tsp2_init: failed to get RTC IRQ\n"); | ||
353 | i2c_register_board_info(0, &tsp2_i2c_rtc, 1); | ||
354 | |||
355 | /* register Terastation Pro II specific power-off method */ | ||
356 | pm_power_off = tsp2_power_off; | ||
357 | } | ||
358 | |||
359 | MACHINE_START(TERASTATION_PRO2, "Buffalo Terastation Pro II/Live") | ||
360 | /* Maintainer: Sylver Bruneau <sylver.bruneau@googlemail.com> */ | ||
361 | .phys_io = ORION5X_REGS_PHYS_BASE, | ||
362 | .io_pg_offst = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC, | ||
363 | .boot_params = 0x00000100, | ||
364 | .init_machine = tsp2_init, | ||
365 | .map_io = orion5x_map_io, | ||
366 | .init_irq = orion5x_init_irq, | ||
367 | .timer = &orion5x_timer, | ||
368 | .fixup = tag_fixup_mem32, | ||
369 | MACHINE_END | ||
diff --git a/arch/arm/mach-orion5x/tsx09-common.c b/arch/arm/mach-orion5x/tsx09-common.c index 19cde24fbfdf..c9abb8fbfa70 100644 --- a/arch/arm/mach-orion5x/tsx09-common.c +++ b/arch/arm/mach-orion5x/tsx09-common.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/timex.h> | 16 | #include <linux/timex.h> |
17 | #include <linux/serial_reg.h> | 17 | #include <linux/serial_reg.h> |
18 | #include "tsx09-common.h" | 18 | #include "tsx09-common.h" |
19 | #include "common.h" | ||
19 | 20 | ||
20 | /***************************************************************************** | 21 | /***************************************************************************** |
21 | * QNAP TS-x09 specific power off method via UART1-attached PIC | 22 | * QNAP TS-x09 specific power off method via UART1-attached PIC |
@@ -26,7 +27,7 @@ | |||
26 | void qnap_tsx09_power_off(void) | 27 | void qnap_tsx09_power_off(void) |
27 | { | 28 | { |
28 | /* 19200 baud divisor */ | 29 | /* 19200 baud divisor */ |
29 | const unsigned divisor = ((ORION5X_TCLK + (8 * 19200)) / (16 * 19200)); | 30 | const unsigned divisor = ((orion5x_tclk + (8 * 19200)) / (16 * 19200)); |
30 | 31 | ||
31 | pr_info("%s: triggering power-off...\n", __func__); | 32 | pr_info("%s: triggering power-off...\n", __func__); |
32 | 33 | ||