Blame view
arch/arm/mach-orion5x/common.c
8.84 KB
585cf1756 [ARM] basic suppo... |
1 |
/* |
9dd0b194b Orion: orion -> o... |
2 |
* arch/arm/mach-orion5x/common.c |
585cf1756 [ARM] basic suppo... |
3 |
* |
9dd0b194b Orion: orion -> o... |
4 |
* Core functions for Marvell Orion 5x SoCs |
585cf1756 [ARM] basic suppo... |
5 6 7 |
* * Maintainer: Tzachi Perelstein <tzachi@marvell.com> * |
159ffb3a0 Orion: general cl... |
8 9 |
* This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any |
585cf1756 [ARM] basic suppo... |
10 11 12 13 14 |
* warranty of any kind, whether express or implied. */ #include <linux/kernel.h> #include <linux/init.h> |
ca26f7d3e [ARM] Orion: plat... |
15 |
#include <linux/platform_device.h> |
ee9627234 ARM: orion: Conso... |
16 |
#include <linux/dma-mapping.h> |
ca26f7d3e [ARM] Orion: plat... |
17 |
#include <linux/serial_8250.h> |
144aa3db1 [ARM] Orion: I2C ... |
18 |
#include <linux/mv643xx_i2c.h> |
15a32632d sata_mv: mbus dec... |
19 |
#include <linux/ata_platform.h> |
764cbcc2e ARM: restart: ori... |
20 |
#include <linux/delay.h> |
dcf1cece1 [ARM] Orion: inst... |
21 |
#include <net/dsa.h> |
585cf1756 [ARM] basic suppo... |
22 |
#include <asm/page.h> |
be73a347e [ARM] 4845/1: Ori... |
23 |
#include <asm/setup.h> |
c67de5b3c [ARM] Orion: prog... |
24 |
#include <asm/timex.h> |
be73a347e [ARM] 4845/1: Ori... |
25 |
#include <asm/mach/arch.h> |
585cf1756 [ARM] basic suppo... |
26 |
#include <asm/mach/map.h> |
2bac1de20 plat-orion: share... |
27 |
#include <asm/mach/time.h> |
4ee1f6b57 ARM: Remove depen... |
28 |
#include <mach/bridge-regs.h> |
a09e64fbc [ARM] Move includ... |
29 30 |
#include <mach/hardware.h> #include <mach/orion5x.h> |
6f088f1d2 [ARM] Move includ... |
31 32 |
#include <plat/orion_nand.h> #include <plat/time.h> |
28a2b4505 ARM: orion: Conso... |
33 |
#include <plat/common.h> |
45173d5ed ARM: Orion: mbus_... |
34 |
#include <plat/addr-map.h> |
585cf1756 [ARM] basic suppo... |
35 36 37 38 39 |
#include "common.h" /***************************************************************************** * I/O Address Mapping ****************************************************************************/ |
9dd0b194b Orion: orion -> o... |
40 |
static struct map_desc orion5x_io_desc[] __initdata = { |
585cf1756 [ARM] basic suppo... |
41 |
{ |
9dd0b194b Orion: orion -> o... |
42 43 44 |
.virtual = ORION5X_REGS_VIRT_BASE, .pfn = __phys_to_pfn(ORION5X_REGS_PHYS_BASE), .length = ORION5X_REGS_SIZE, |
e7068ad33 [ARM] Orion: fix ... |
45 46 |
.type = MT_DEVICE, }, { |
9dd0b194b Orion: orion -> o... |
47 48 49 |
.virtual = ORION5X_PCIE_IO_VIRT_BASE, .pfn = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE), .length = ORION5X_PCIE_IO_SIZE, |
e7068ad33 [ARM] Orion: fix ... |
50 51 |
.type = MT_DEVICE, }, { |
9dd0b194b Orion: orion -> o... |
52 53 54 |
.virtual = ORION5X_PCI_IO_VIRT_BASE, .pfn = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE), .length = ORION5X_PCI_IO_SIZE, |
e7068ad33 [ARM] Orion: fix ... |
55 56 |
.type = MT_DEVICE, }, { |
9dd0b194b Orion: orion -> o... |
57 58 59 |
.virtual = ORION5X_PCIE_WA_VIRT_BASE, .pfn = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE), .length = ORION5X_PCIE_WA_SIZE, |
e7068ad33 [ARM] Orion: fix ... |
60 |
.type = MT_DEVICE, |
585cf1756 [ARM] basic suppo... |
61 62 |
}, }; |
9dd0b194b Orion: orion -> o... |
63 |
void __init orion5x_map_io(void) |
585cf1756 [ARM] basic suppo... |
64 |
{ |
9dd0b194b Orion: orion -> o... |
65 |
iotable_init(orion5x_io_desc, ARRAY_SIZE(orion5x_io_desc)); |
585cf1756 [ARM] basic suppo... |
66 |
} |
c67de5b3c [ARM] Orion: prog... |
67 |
|
044f6c7c4 [ARM] Orion: move... |
68 |
|
c67de5b3c [ARM] Orion: prog... |
69 |
/***************************************************************************** |
044f6c7c4 [ARM] Orion: move... |
70 71 |
* EHCI0 ****************************************************************************/ |
044f6c7c4 [ARM] Orion: move... |
72 73 |
void __init orion5x_ehci0_init(void) { |
db33f4de9 ARM: Orion: Remov... |
74 |
orion_ehci_init(ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL); |
044f6c7c4 [ARM] Orion: move... |
75 76 77 78 79 80 |
} /***************************************************************************** * EHCI1 ****************************************************************************/ |
044f6c7c4 [ARM] Orion: move... |
81 82 |
void __init orion5x_ehci1_init(void) { |
db33f4de9 ARM: Orion: Remov... |
83 |
orion_ehci_1_init(ORION5X_USB1_PHYS_BASE, IRQ_ORION5X_USB1_CTRL); |
044f6c7c4 [ARM] Orion: move... |
84 |
} |
ca26f7d3e [ARM] Orion: plat... |
85 |
/***************************************************************************** |
5c6025514 ARM: orion: Renam... |
86 |
* GE00 |
e07c9d857 [ARM] Orion: comm... |
87 |
****************************************************************************/ |
9dd0b194b Orion: orion -> o... |
88 |
void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) |
e07c9d857 [ARM] Orion: comm... |
89 |
{ |
db33f4de9 ARM: Orion: Remov... |
90 |
orion_ge00_init(eth_data, |
7e3819d82 ARM: orion: Conso... |
91 92 |
ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, IRQ_ORION5X_ETH_ERR, orion5x_tclk); |
e07c9d857 [ARM] Orion: comm... |
93 |
} |
044f6c7c4 [ARM] Orion: move... |
94 |
|
e07c9d857 [ARM] Orion: comm... |
95 |
/***************************************************************************** |
dcf1cece1 [ARM] Orion: inst... |
96 97 |
* Ethernet switch ****************************************************************************/ |
dcf1cece1 [ARM] Orion: inst... |
98 99 |
void __init orion5x_eth_switch_init(struct dsa_platform_data *d, int irq) { |
7e3819d82 ARM: orion: Conso... |
100 |
orion_ge00_switch_init(d, irq); |
dcf1cece1 [ARM] Orion: inst... |
101 102 103 104 |
} /***************************************************************************** |
044f6c7c4 [ARM] Orion: move... |
105 |
* I2C |
144aa3db1 [ARM] Orion: I2C ... |
106 |
****************************************************************************/ |
044f6c7c4 [ARM] Orion: move... |
107 108 |
void __init orion5x_i2c_init(void) { |
aac7ffa3e ARM: orion: Conso... |
109 |
orion_i2c_init(I2C_PHYS_BASE, IRQ_ORION5X_I2C, 8); |
044f6c7c4 [ARM] Orion: move... |
110 |
} |
144aa3db1 [ARM] Orion: I2C ... |
111 |
/***************************************************************************** |
044f6c7c4 [ARM] Orion: move... |
112 |
* SATA |
f244baa3c [ARM] Orion: Use ... |
113 |
****************************************************************************/ |
9dd0b194b Orion: orion -> o... |
114 |
void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data) |
f244baa3c [ARM] Orion: Use ... |
115 |
{ |
db33f4de9 ARM: Orion: Remov... |
116 |
orion_sata_init(sata_data, ORION5X_SATA_PHYS_BASE, IRQ_ORION5X_SATA); |
f244baa3c [ARM] Orion: Use ... |
117 |
} |
044f6c7c4 [ARM] Orion: move... |
118 |
|
f244baa3c [ARM] Orion: Use ... |
119 |
/***************************************************************************** |
d323ade13 [ARM] Orion: add ... |
120 121 |
* SPI ****************************************************************************/ |
d323ade13 [ARM] Orion: add ... |
122 123 |
void __init orion5x_spi_init() { |
980f9f601 ARM: orion: Conso... |
124 |
orion_spi_init(SPI_PHYS_BASE, orion5x_tclk); |
d323ade13 [ARM] Orion: add ... |
125 126 127 128 |
} /***************************************************************************** |
044f6c7c4 [ARM] Orion: move... |
129 130 |
* UART0 ****************************************************************************/ |
044f6c7c4 [ARM] Orion: move... |
131 132 |
void __init orion5x_uart0_init(void) { |
28a2b4505 ARM: orion: Conso... |
133 134 |
orion_uart0_init(UART0_VIRT_BASE, UART0_PHYS_BASE, IRQ_ORION5X_UART0, orion5x_tclk); |
044f6c7c4 [ARM] Orion: move... |
135 |
} |
044f6c7c4 [ARM] Orion: move... |
136 137 |
/***************************************************************************** * UART1 |
2bac1de20 plat-orion: share... |
138 |
****************************************************************************/ |
044f6c7c4 [ARM] Orion: move... |
139 140 |
void __init orion5x_uart1_init(void) { |
28a2b4505 ARM: orion: Conso... |
141 142 |
orion_uart1_init(UART1_VIRT_BASE, UART1_PHYS_BASE, IRQ_ORION5X_UART1, orion5x_tclk); |
044f6c7c4 [ARM] Orion: move... |
143 |
} |
2bac1de20 plat-orion: share... |
144 |
|
044f6c7c4 [ARM] Orion: move... |
145 |
/***************************************************************************** |
1d5a1a6e9 [ARM] Orion: Inst... |
146 147 |
* XOR engine ****************************************************************************/ |
1d5a1a6e9 [ARM] Orion: Inst... |
148 149 |
void __init orion5x_xor_init(void) { |
db33f4de9 ARM: Orion: Remov... |
150 |
orion_xor0_init(ORION5X_XOR_PHYS_BASE, |
ee9627234 ARM: orion: Conso... |
151 152 |
ORION5X_XOR_PHYS_BASE + 0x200, IRQ_ORION5X_XOR0, IRQ_ORION5X_XOR1); |
1d5a1a6e9 [ARM] Orion: Inst... |
153 |
} |
443500619 ARM: orion: Conso... |
154 155 156 157 |
/***************************************************************************** * Cryptographic Engines and Security Accelerator (CESA) ****************************************************************************/ static void __init orion5x_crypto_init(void) |
3a8f74416 [ARM] orion5x: ad... |
158 |
{ |
b6d1c33a3 ARM: Orion: Conso... |
159 |
orion5x_setup_sram_win(); |
443500619 ARM: orion: Conso... |
160 161 |
orion_crypto_init(ORION5X_CRYPTO_PHYS_BASE, ORION5X_SRAM_PHYS_BASE, SZ_8K, IRQ_ORION5X_CESA); |
3a8f74416 [ARM] orion5x: ad... |
162 |
} |
1d5a1a6e9 [ARM] Orion: Inst... |
163 164 |
/***************************************************************************** |
9e058d4f5 [WATCHDOG] orion5... |
165 166 |
* Watchdog ****************************************************************************/ |
9e058d4f5 [WATCHDOG] orion5... |
167 168 |
void __init orion5x_wdt_init(void) { |
5e00d3783 ARM: orion: Conso... |
169 |
orion_wdt_init(orion5x_tclk); |
9e058d4f5 [WATCHDOG] orion5... |
170 171 172 173 |
} /***************************************************************************** |
044f6c7c4 [ARM] Orion: move... |
174 175 |
* Time handling ****************************************************************************/ |
4ee1f6b57 ARM: Remove depen... |
176 177 178 179 |
void __init orion5x_init_early(void) { orion_time_set_base(TIMER_VIRT_BASE); } |
ebe35aff8 [ARM] Orion: prep... |
180 181 182 183 |
int orion5x_tclk; int __init orion5x_find_tclk(void) { |
d323ade13 [ARM] Orion: add ... |
184 185 186 187 188 189 |
u32 dev, rev; orion5x_pcie_id(&dev, &rev); if (dev == MV88F6183_DEV_ID && (readl(MPP_RESET_SAMPLE) & 0x00000200) == 0) return 133333333; |
ebe35aff8 [ARM] Orion: prep... |
190 191 |
return 166666667; } |
9dd0b194b Orion: orion -> o... |
192 |
static void orion5x_timer_init(void) |
2bac1de20 plat-orion: share... |
193 |
{ |
ebe35aff8 [ARM] Orion: prep... |
194 |
orion5x_tclk = orion5x_find_tclk(); |
4ee1f6b57 ARM: Remove depen... |
195 196 197 |
orion_time_init(ORION5X_BRIDGE_VIRT_BASE, BRIDGE_INT_TIMER1_CLR, IRQ_ORION5X_BRIDGE, orion5x_tclk); |
2bac1de20 plat-orion: share... |
198 |
} |
9dd0b194b Orion: orion -> o... |
199 |
struct sys_timer orion5x_timer = { |
e7068ad33 [ARM] Orion: fix ... |
200 |
.init = orion5x_timer_init, |
2bac1de20 plat-orion: share... |
201 |
}; |
044f6c7c4 [ARM] Orion: move... |
202 |
|
2bac1de20 plat-orion: share... |
203 |
/***************************************************************************** |
c67de5b3c [ARM] Orion: prog... |
204 205 |
* General ****************************************************************************/ |
c67de5b3c [ARM] Orion: prog... |
206 |
/* |
b46926bb2 [ARM] Orion: catc... |
207 |
* Identify device ID and rev from PCIe configuration header space '0'. |
c67de5b3c [ARM] Orion: prog... |
208 |
*/ |
9dd0b194b Orion: orion -> o... |
209 |
static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) |
c67de5b3c [ARM] Orion: prog... |
210 |
{ |
9dd0b194b Orion: orion -> o... |
211 |
orion5x_pcie_id(dev, rev); |
c67de5b3c [ARM] Orion: prog... |
212 213 214 215 216 217 |
if (*dev == MV88F5281_DEV_ID) { if (*rev == MV88F5281_REV_D2) { *dev_name = "MV88F5281-D2"; } else if (*rev == MV88F5281_REV_D1) { *dev_name = "MV88F5281-D1"; |
ce72e36ed [ARM] Orion: supp... |
218 219 |
} else if (*rev == MV88F5281_REV_D0) { *dev_name = "MV88F5281-D0"; |
c67de5b3c [ARM] Orion: prog... |
220 221 222 223 224 225 226 227 228 |
} else { *dev_name = "MV88F5281-Rev-Unsupported"; } } else if (*dev == MV88F5182_DEV_ID) { if (*rev == MV88F5182_REV_A2) { *dev_name = "MV88F5182-A2"; } else { *dev_name = "MV88F5182-Rev-Unsupported"; } |
c9e3de941 [ARM] Orion: MV88... |
229 230 231 |
} else if (*dev == MV88F5181_DEV_ID) { if (*rev == MV88F5181_REV_B1) { *dev_name = "MV88F5181-Rev-B1"; |
d2b2a6bbc [ARM] Orion: add ... |
232 233 |
} else if (*rev == MV88F5181L_REV_A1) { *dev_name = "MV88F5181L-Rev-A1"; |
c9e3de941 [ARM] Orion: MV88... |
234 |
} else { |
d2b2a6bbc [ARM] Orion: add ... |
235 |
*dev_name = "MV88F5181(L)-Rev-Unsupported"; |
c9e3de941 [ARM] Orion: MV88... |
236 |
} |
d323ade13 [ARM] Orion: add ... |
237 238 239 240 241 242 |
} else if (*dev == MV88F6183_DEV_ID) { if (*rev == MV88F6183_REV_B0) { *dev_name = "MV88F6183-Rev-B0"; } else { *dev_name = "MV88F6183-Rev-Unsupported"; } |
c67de5b3c [ARM] Orion: prog... |
243 244 245 246 |
} else { *dev_name = "Device-Unknown"; } } |
9dd0b194b Orion: orion -> o... |
247 |
void __init orion5x_init(void) |
c67de5b3c [ARM] Orion: prog... |
248 249 250 |
{ char *dev_name; u32 dev, rev; |
9dd0b194b Orion: orion -> o... |
251 |
orion5x_id(&dev, &rev, &dev_name); |
ebe35aff8 [ARM] Orion: prep... |
252 253 |
printk(KERN_INFO "Orion ID: %s. TCLK=%d. ", dev_name, orion5x_tclk); |
c67de5b3c [ARM] Orion: prog... |
254 255 256 |
/* * Setup Orion address map */ |
9dd0b194b Orion: orion -> o... |
257 |
orion5x_setup_cpu_mbus_bridge(); |
ce72e36ed [ARM] Orion: supp... |
258 259 260 261 262 263 264 265 266 267 |
/* * Don't issue "Wait for Interrupt" instruction if we are * running on D0 5281 silicon. */ if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround. "); disable_hlt(); } |
9e058d4f5 [WATCHDOG] orion5... |
268 269 |
/* |
3fade49b7 [ARM] orion5x: re... |
270 271 272 273 274 275 276 277 |
* The 5082/5181l/5182/6082/6082l/6183 have crypto * while 5180n/5181/5281 don't have crypto. */ if ((dev == MV88F5181_DEV_ID && rev >= MV88F5181L_REV_A0) || dev == MV88F5182_DEV_ID || dev == MV88F6183_DEV_ID) orion5x_crypto_init(); /* |
9e058d4f5 [WATCHDOG] orion5... |
278 279 280 |
* Register watchdog driver */ orion5x_wdt_init(); |
c67de5b3c [ARM] Orion: prog... |
281 |
} |
be73a347e [ARM] 4845/1: Ori... |
282 |
|
764cbcc2e ARM: restart: ori... |
283 284 285 286 287 288 289 290 291 292 |
void orion5x_restart(char mode, const char *cmd) { /* * Enable and issue soft reset */ orion5x_setbits(RSTOUTn_MASK, (1 << 2)); orion5x_setbits(CPU_SOFT_RESET, 1); mdelay(200); orion5x_clrbits(CPU_SOFT_RESET, 1); } |
be73a347e [ARM] 4845/1: Ori... |
293 294 295 296 |
/* * Many orion-based systems have buggy bootloader implementations. * This is a common fixup for bogus memory tags. */ |
0744a3ee3 ARM: platform fix... |
297 298 |
void __init tag_fixup_mem32(struct tag *t, char **from, struct meminfo *meminfo) |
be73a347e [ARM] 4845/1: Ori... |
299 300 301 302 303 304 305 306 307 308 309 310 |
{ for (; t->hdr.size; t = tag_next(t)) if (t->hdr.tag == ATAG_MEM && (!t->u.mem.size || t->u.mem.size & ~PAGE_MASK || t->u.mem.start & ~PAGE_MASK)) { printk(KERN_WARNING "Clearing invalid memory bank %dKB@0x%08x ", t->u.mem.size / 1024, t->u.mem.start); t->hdr.tag = 0; } } |