diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-19 20:40:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-19 20:40:40 -0400 |
commit | 773d7a09e1a1349a5319ac8665e9c612c6aa27d8 (patch) | |
tree | 3b2272bb3cfcab04ba6459cba116e577278c9392 /arch/powerpc/platforms | |
parent | 17fad5209e6b55148dbd20156cdaf2c7e67faa40 (diff) | |
parent | b71a107c66ad952c9d35ec046a803efc89a80556 (diff) |
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (35 commits)
powerpc/5121: make clock debug output more readable
powerpc/5xxx: Add common mpc5xxx_get_bus_frequency() function
powerpc/5200: Update pcm030.dts to add i2c eeprom and delete cruft
powerpc/5200: convert mpc52xx_psc_spi to use cs_control callback
fbdev/xilinxfb: Fix improper casting and tighen up probe path
usb/ps3: Add missing annotations
powerpc: Add memory clobber to mtspr()
powerpc: Fix invalid construct in our CPU selection Kconfig
ps3rom: Use ps3_system_bus_[gs]et_drvdata() instead of direct access
powerpc: Add configurable -Werror for arch/powerpc
of_serial: Add UPF_FIXED_TYPE flag
drivers/hvc: Add missing __devexit_p()
net/ps3: gelic - Add missing annotations
powerpc: Introduce macro spin_event_timeout()
powerpc/warp: Fix ISA_DMA_THRESHOLD default
powerpc/bootwrapper: Custom build options for XPedite52xx targets
powerpc/85xx: Add defconfig for X-ES MPC85xx boards
powerpc/85xx: Add dts files for X-ES MPC85xx boards
powerpc/85xx: Add platform support for X-ES MPC85xx boards
83xx: add support for the kmeter1 board.
...
Diffstat (limited to 'arch/powerpc/platforms')
20 files changed, 595 insertions, 71 deletions
diff --git a/arch/powerpc/platforms/44x/warp.c b/arch/powerpc/platforms/44x/warp.c index c5118802a281..42e09a9f77e2 100644 --- a/arch/powerpc/platforms/44x/warp.c +++ b/arch/powerpc/platforms/44x/warp.c | |||
@@ -43,7 +43,13 @@ static int __init warp_probe(void) | |||
43 | { | 43 | { |
44 | unsigned long root = of_get_flat_dt_root(); | 44 | unsigned long root = of_get_flat_dt_root(); |
45 | 45 | ||
46 | return of_flat_dt_is_compatible(root, "pika,warp"); | 46 | if (!of_flat_dt_is_compatible(root, "pika,warp")) |
47 | return 0; | ||
48 | |||
49 | /* For __dma_alloc_coherent */ | ||
50 | ISA_DMA_THRESHOLD = ~0L; | ||
51 | |||
52 | return 1; | ||
47 | } | 53 | } |
48 | 54 | ||
49 | define_machine(warp) { | 55 | define_machine(warp) { |
diff --git a/arch/powerpc/platforms/512x/clock.c b/arch/powerpc/platforms/512x/clock.c index 1bcff94eb924..84544d072043 100644 --- a/arch/powerpc/platforms/512x/clock.c +++ b/arch/powerpc/platforms/512x/clock.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
25 | 25 | ||
26 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
27 | #include <asm/mpc512x.h> | 27 | #include <asm/mpc5xxx.h> |
28 | #include <asm/clk_interface.h> | 28 | #include <asm/clk_interface.h> |
29 | 29 | ||
30 | #undef CLK_DEBUG | 30 | #undef CLK_DEBUG |
@@ -83,13 +83,13 @@ static void dump_clocks(void) | |||
83 | mutex_lock(&clocks_mutex); | 83 | mutex_lock(&clocks_mutex); |
84 | printk(KERN_INFO "CLOCKS:\n"); | 84 | printk(KERN_INFO "CLOCKS:\n"); |
85 | list_for_each_entry(p, &clocks, node) { | 85 | list_for_each_entry(p, &clocks, node) { |
86 | printk(KERN_INFO " %s %ld", p->name, p->rate); | 86 | pr_info(" %s=%ld", p->name, p->rate); |
87 | if (p->parent) | 87 | if (p->parent) |
88 | printk(KERN_INFO " %s %ld", p->parent->name, | 88 | pr_cont(" %s=%ld", p->parent->name, |
89 | p->parent->rate); | 89 | p->parent->rate); |
90 | if (p->flags & CLK_HAS_CTRL) | 90 | if (p->flags & CLK_HAS_CTRL) |
91 | printk(KERN_INFO " reg/bit %d/%d", p->reg, p->bit); | 91 | pr_cont(" reg/bit=%d/%d", p->reg, p->bit); |
92 | printk("\n"); | 92 | pr_cont("\n"); |
93 | } | 93 | } |
94 | mutex_unlock(&clocks_mutex); | 94 | mutex_unlock(&clocks_mutex); |
95 | } | 95 | } |
diff --git a/arch/powerpc/platforms/512x/mpc512x.h b/arch/powerpc/platforms/512x/mpc512x.h index 9c03693cb009..22a5352407e0 100644 --- a/arch/powerpc/platforms/512x/mpc512x.h +++ b/arch/powerpc/platforms/512x/mpc512x.h | |||
@@ -11,7 +11,6 @@ | |||
11 | 11 | ||
12 | #ifndef __MPC512X_H__ | 12 | #ifndef __MPC512X_H__ |
13 | #define __MPC512X_H__ | 13 | #define __MPC512X_H__ |
14 | extern unsigned long mpc512x_find_ips_freq(struct device_node *node); | ||
15 | extern void __init mpc512x_init_IRQ(void); | 14 | extern void __init mpc512x_init_IRQ(void); |
16 | void __init mpc512x_declare_of_platform_devices(void); | 15 | void __init mpc512x_declare_of_platform_devices(void); |
17 | #endif /* __MPC512X_H__ */ | 16 | #endif /* __MPC512X_H__ */ |
diff --git a/arch/powerpc/platforms/512x/mpc512x_shared.c b/arch/powerpc/platforms/512x/mpc512x_shared.c index d8cd579f3191..434d683df5a0 100644 --- a/arch/powerpc/platforms/512x/mpc512x_shared.c +++ b/arch/powerpc/platforms/512x/mpc512x_shared.c | |||
@@ -24,29 +24,6 @@ | |||
24 | 24 | ||
25 | #include "mpc512x.h" | 25 | #include "mpc512x.h" |
26 | 26 | ||
27 | unsigned long | ||
28 | mpc512x_find_ips_freq(struct device_node *node) | ||
29 | { | ||
30 | struct device_node *np; | ||
31 | const unsigned int *p_ips_freq = NULL; | ||
32 | |||
33 | of_node_get(node); | ||
34 | while (node) { | ||
35 | p_ips_freq = of_get_property(node, "bus-frequency", NULL); | ||
36 | if (p_ips_freq) | ||
37 | break; | ||
38 | |||
39 | np = of_get_parent(node); | ||
40 | of_node_put(node); | ||
41 | node = np; | ||
42 | } | ||
43 | if (node) | ||
44 | of_node_put(node); | ||
45 | |||
46 | return p_ips_freq ? *p_ips_freq : 0; | ||
47 | } | ||
48 | EXPORT_SYMBOL(mpc512x_find_ips_freq); | ||
49 | |||
50 | void __init mpc512x_init_IRQ(void) | 27 | void __init mpc512x_init_IRQ(void) |
51 | { | 28 | { |
52 | struct device_node *np; | 29 | struct device_node *np; |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c b/arch/powerpc/platforms/52xx/mpc52xx_common.c index 8e3dd5a0f228..a46bad0c2339 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c | |||
@@ -47,36 +47,6 @@ static DEFINE_SPINLOCK(mpc52xx_lock); | |||
47 | static struct mpc52xx_gpt __iomem *mpc52xx_wdt; | 47 | static struct mpc52xx_gpt __iomem *mpc52xx_wdt; |
48 | static struct mpc52xx_cdm __iomem *mpc52xx_cdm; | 48 | static struct mpc52xx_cdm __iomem *mpc52xx_cdm; |
49 | 49 | ||
50 | /** | ||
51 | * mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device | ||
52 | * @node: device node | ||
53 | * | ||
54 | * Returns IPB bus frequency, or 0 if the bus frequency cannot be found. | ||
55 | */ | ||
56 | unsigned int | ||
57 | mpc52xx_find_ipb_freq(struct device_node *node) | ||
58 | { | ||
59 | struct device_node *np; | ||
60 | const unsigned int *p_ipb_freq = NULL; | ||
61 | |||
62 | of_node_get(node); | ||
63 | while (node) { | ||
64 | p_ipb_freq = of_get_property(node, "bus-frequency", NULL); | ||
65 | if (p_ipb_freq) | ||
66 | break; | ||
67 | |||
68 | np = of_get_parent(node); | ||
69 | of_node_put(node); | ||
70 | node = np; | ||
71 | } | ||
72 | if (node) | ||
73 | of_node_put(node); | ||
74 | |||
75 | return p_ipb_freq ? *p_ipb_freq : 0; | ||
76 | } | ||
77 | EXPORT_SYMBOL(mpc52xx_find_ipb_freq); | ||
78 | |||
79 | |||
80 | /* | 50 | /* |
81 | * Configure the XLB arbiter settings to match what Linux expects. | 51 | * Configure the XLB arbiter settings to match what Linux expects. |
82 | */ | 52 | */ |
@@ -221,7 +191,7 @@ unsigned int mpc52xx_get_xtal_freq(struct device_node *node) | |||
221 | if (!mpc52xx_cdm) | 191 | if (!mpc52xx_cdm) |
222 | return 0; | 192 | return 0; |
223 | 193 | ||
224 | freq = mpc52xx_find_ipb_freq(node); | 194 | freq = mpc5xxx_get_bus_frequency(node); |
225 | if (!freq) | 195 | if (!freq) |
226 | return 0; | 196 | return 0; |
227 | 197 | ||
diff --git a/arch/powerpc/platforms/83xx/Kconfig b/arch/powerpc/platforms/83xx/Kconfig index 437d29a59d72..083ebee9a16d 100644 --- a/arch/powerpc/platforms/83xx/Kconfig +++ b/arch/powerpc/platforms/83xx/Kconfig | |||
@@ -96,6 +96,13 @@ config ASP834x | |||
96 | This enables support for the Analogue & Micro ASP 83xx | 96 | This enables support for the Analogue & Micro ASP 83xx |
97 | board. | 97 | board. |
98 | 98 | ||
99 | config KMETER1 | ||
100 | bool "Keymile KMETER1" | ||
101 | select DEFAULT_UIMAGE | ||
102 | select QUICC_ENGINE | ||
103 | help | ||
104 | This enables support for the Keymile KMETER1 board. | ||
105 | |||
99 | 106 | ||
100 | endif | 107 | endif |
101 | 108 | ||
diff --git a/arch/powerpc/platforms/83xx/Makefile b/arch/powerpc/platforms/83xx/Makefile index 051777c542c7..e139c36572ec 100644 --- a/arch/powerpc/platforms/83xx/Makefile +++ b/arch/powerpc/platforms/83xx/Makefile | |||
@@ -15,3 +15,4 @@ obj-$(CONFIG_MPC837x_MDS) += mpc837x_mds.o | |||
15 | obj-$(CONFIG_SBC834x) += sbc834x.o | 15 | obj-$(CONFIG_SBC834x) += sbc834x.o |
16 | obj-$(CONFIG_MPC837x_RDB) += mpc837x_rdb.o | 16 | obj-$(CONFIG_MPC837x_RDB) += mpc837x_rdb.o |
17 | obj-$(CONFIG_ASP834x) += asp834x.o | 17 | obj-$(CONFIG_ASP834x) += asp834x.o |
18 | obj-$(CONFIG_KMETER1) += kmeter1.o | ||
diff --git a/arch/powerpc/platforms/83xx/kmeter1.c b/arch/powerpc/platforms/83xx/kmeter1.c new file mode 100644 index 000000000000..903acfd851ac --- /dev/null +++ b/arch/powerpc/platforms/83xx/kmeter1.c | |||
@@ -0,0 +1,191 @@ | |||
1 | /* | ||
2 | * Copyright 2008 DENX Software Engineering GmbH | ||
3 | * Author: Heiko Schocher <hs@denx.de> | ||
4 | * | ||
5 | * Description: | ||
6 | * Keymile KMETER1 board specific routines. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | |||
14 | #include <linux/stddef.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/init.h> | ||
17 | #include <linux/errno.h> | ||
18 | #include <linux/reboot.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <linux/kdev_t.h> | ||
21 | #include <linux/major.h> | ||
22 | #include <linux/console.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/seq_file.h> | ||
25 | #include <linux/root_dev.h> | ||
26 | #include <linux/initrd.h> | ||
27 | #include <linux/of_platform.h> | ||
28 | #include <linux/of_device.h> | ||
29 | |||
30 | #include <asm/system.h> | ||
31 | #include <asm/atomic.h> | ||
32 | #include <asm/time.h> | ||
33 | #include <asm/io.h> | ||
34 | #include <asm/machdep.h> | ||
35 | #include <asm/ipic.h> | ||
36 | #include <asm/irq.h> | ||
37 | #include <asm/prom.h> | ||
38 | #include <asm/udbg.h> | ||
39 | #include <sysdev/fsl_soc.h> | ||
40 | #include <sysdev/fsl_pci.h> | ||
41 | #include <asm/qe.h> | ||
42 | #include <asm/qe_ic.h> | ||
43 | |||
44 | #include "mpc83xx.h" | ||
45 | |||
46 | #define SVR_REV(svr) (((svr) >> 0) & 0xFFFF) /* Revision field */ | ||
47 | /* ************************************************************************ | ||
48 | * | ||
49 | * Setup the architecture | ||
50 | * | ||
51 | */ | ||
52 | static void __init kmeter1_setup_arch(void) | ||
53 | { | ||
54 | struct device_node *np; | ||
55 | |||
56 | if (ppc_md.progress) | ||
57 | ppc_md.progress("kmeter1_setup_arch()", 0); | ||
58 | |||
59 | #ifdef CONFIG_PCI | ||
60 | for_each_compatible_node(np, "pci", "fsl,mpc8349-pci") | ||
61 | mpc83xx_add_bridge(np); | ||
62 | #endif | ||
63 | |||
64 | #ifdef CONFIG_QUICC_ENGINE | ||
65 | qe_reset(); | ||
66 | |||
67 | np = of_find_node_by_name(NULL, "par_io"); | ||
68 | if (np != NULL) { | ||
69 | par_io_init(np); | ||
70 | of_node_put(np); | ||
71 | |||
72 | for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;) | ||
73 | par_io_of_config(np); | ||
74 | } | ||
75 | |||
76 | np = of_find_compatible_node(NULL, "network", "ucc_geth"); | ||
77 | if (np != NULL) { | ||
78 | uint svid; | ||
79 | |||
80 | /* handle mpc8360ea rev.2.1 erratum 2: RGMII Timing */ | ||
81 | svid = mfspr(SPRN_SVR); | ||
82 | if (SVR_REV(svid) == 0x0021) { | ||
83 | struct device_node *np_par; | ||
84 | struct resource res; | ||
85 | void __iomem *base; | ||
86 | int ret; | ||
87 | |||
88 | np_par = of_find_node_by_name(NULL, "par_io"); | ||
89 | if (np_par == NULL) { | ||
90 | printk(KERN_WARNING "%s couldn;t find par_io node\n", | ||
91 | __func__); | ||
92 | return; | ||
93 | } | ||
94 | /* Map Parallel I/O ports registers */ | ||
95 | ret = of_address_to_resource(np_par, 0, &res); | ||
96 | if (ret) { | ||
97 | printk(KERN_WARNING "%s couldn;t map par_io registers\n", | ||
98 | __func__); | ||
99 | return; | ||
100 | } | ||
101 | base = ioremap(res.start, res.end - res.start + 1); | ||
102 | |||
103 | /* | ||
104 | * IMMR + 0x14A8[4:5] = 11 (clk delay for UCC 2) | ||
105 | * IMMR + 0x14A8[18:19] = 11 (clk delay for UCC 1) | ||
106 | */ | ||
107 | setbits32((base + 0xa8), 0x0c003000); | ||
108 | |||
109 | /* | ||
110 | * IMMR + 0x14AC[20:27] = 10101010 | ||
111 | * (data delay for both UCC's) | ||
112 | */ | ||
113 | clrsetbits_be32((base + 0xac), 0xff0, 0xaa0); | ||
114 | iounmap(base); | ||
115 | of_node_put(np_par); | ||
116 | } | ||
117 | of_node_put(np); | ||
118 | } | ||
119 | #endif /* CONFIG_QUICC_ENGINE */ | ||
120 | } | ||
121 | |||
122 | static struct of_device_id kmeter_ids[] = { | ||
123 | { .type = "soc", }, | ||
124 | { .compatible = "soc", }, | ||
125 | { .compatible = "simple-bus", }, | ||
126 | { .type = "qe", }, | ||
127 | { .compatible = "fsl,qe", }, | ||
128 | {}, | ||
129 | }; | ||
130 | |||
131 | static int __init kmeter_declare_of_platform_devices(void) | ||
132 | { | ||
133 | /* Publish the QE devices */ | ||
134 | of_platform_bus_probe(NULL, kmeter_ids, NULL); | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | machine_device_initcall(kmeter1, kmeter_declare_of_platform_devices); | ||
139 | |||
140 | static void __init kmeter1_init_IRQ(void) | ||
141 | { | ||
142 | struct device_node *np; | ||
143 | |||
144 | np = of_find_compatible_node(NULL, NULL, "fsl,pq2pro-pic"); | ||
145 | if (!np) { | ||
146 | np = of_find_node_by_type(NULL, "ipic"); | ||
147 | if (!np) | ||
148 | return; | ||
149 | } | ||
150 | |||
151 | ipic_init(np, 0); | ||
152 | |||
153 | /* Initialize the default interrupt mapping priorities, | ||
154 | * in case the boot rom changed something on us. | ||
155 | */ | ||
156 | ipic_set_default_priority(); | ||
157 | of_node_put(np); | ||
158 | |||
159 | #ifdef CONFIG_QUICC_ENGINE | ||
160 | np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic"); | ||
161 | if (!np) { | ||
162 | np = of_find_node_by_type(NULL, "qeic"); | ||
163 | if (!np) | ||
164 | return; | ||
165 | } | ||
166 | qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic); | ||
167 | of_node_put(np); | ||
168 | #endif /* CONFIG_QUICC_ENGINE */ | ||
169 | } | ||
170 | |||
171 | /* | ||
172 | * Called very early, MMU is off, device-tree isn't unflattened | ||
173 | */ | ||
174 | static int __init kmeter1_probe(void) | ||
175 | { | ||
176 | unsigned long root = of_get_flat_dt_root(); | ||
177 | |||
178 | return of_flat_dt_is_compatible(root, "keymile,KMETER1"); | ||
179 | } | ||
180 | |||
181 | define_machine(kmeter1) { | ||
182 | .name = "KMETER1", | ||
183 | .probe = kmeter1_probe, | ||
184 | .setup_arch = kmeter1_setup_arch, | ||
185 | .init_IRQ = kmeter1_init_IRQ, | ||
186 | .get_irq = ipic_get_irq, | ||
187 | .restart = mpc83xx_restart, | ||
188 | .time_init = mpc83xx_time_init, | ||
189 | .calibrate_decr = generic_calibrate_decr, | ||
190 | .progress = udbg_progress, | ||
191 | }; | ||
diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h index 83cfe51526ec..d1dc5b0b4fbf 100644 --- a/arch/powerpc/platforms/83xx/mpc83xx.h +++ b/arch/powerpc/platforms/83xx/mpc83xx.h | |||
@@ -22,8 +22,8 @@ | |||
22 | /* system i/o configuration register low */ | 22 | /* system i/o configuration register low */ |
23 | #define MPC83XX_SICRL_OFFS 0x114 | 23 | #define MPC83XX_SICRL_OFFS 0x114 |
24 | #define MPC834X_SICRL_USB_MASK 0x60000000 | 24 | #define MPC834X_SICRL_USB_MASK 0x60000000 |
25 | #define MPC834X_SICRL_USB0 0x40000000 | 25 | #define MPC834X_SICRL_USB0 0x20000000 |
26 | #define MPC834X_SICRL_USB1 0x20000000 | 26 | #define MPC834X_SICRL_USB1 0x40000000 |
27 | #define MPC831X_SICRL_USB_MASK 0x00000c00 | 27 | #define MPC831X_SICRL_USB_MASK 0x00000c00 |
28 | #define MPC831X_SICRL_USB_ULPI 0x00000800 | 28 | #define MPC831X_SICRL_USB_ULPI 0x00000800 |
29 | #define MPC8315_SICRL_USB_MASK 0x000000fc | 29 | #define MPC8315_SICRL_USB_MASK 0x000000fc |
diff --git a/arch/powerpc/platforms/83xx/usb.c b/arch/powerpc/platforms/83xx/usb.c index 11e1fac17c7f..3ba4bb7d41bb 100644 --- a/arch/powerpc/platforms/83xx/usb.c +++ b/arch/powerpc/platforms/83xx/usb.c | |||
@@ -47,25 +47,25 @@ int mpc834x_usb_cfg(void) | |||
47 | sccr |= MPC83XX_SCCR_USB_DRCM_11; /* 1:3 */ | 47 | sccr |= MPC83XX_SCCR_USB_DRCM_11; /* 1:3 */ |
48 | 48 | ||
49 | prop = of_get_property(np, "phy_type", NULL); | 49 | prop = of_get_property(np, "phy_type", NULL); |
50 | port1_is_dr = 1; | ||
50 | if (prop && (!strcmp(prop, "utmi") || | 51 | if (prop && (!strcmp(prop, "utmi") || |
51 | !strcmp(prop, "utmi_wide"))) { | 52 | !strcmp(prop, "utmi_wide"))) { |
52 | sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1; | 53 | sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1; |
53 | sicrh |= MPC834X_SICRH_USB_UTMI; | 54 | sicrh |= MPC834X_SICRH_USB_UTMI; |
54 | port1_is_dr = 1; | 55 | port0_is_dr = 1; |
55 | } else if (prop && !strcmp(prop, "serial")) { | 56 | } else if (prop && !strcmp(prop, "serial")) { |
56 | dr_mode = of_get_property(np, "dr_mode", NULL); | 57 | dr_mode = of_get_property(np, "dr_mode", NULL); |
57 | if (dr_mode && !strcmp(dr_mode, "otg")) { | 58 | if (dr_mode && !strcmp(dr_mode, "otg")) { |
58 | sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1; | 59 | sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1; |
59 | port1_is_dr = 1; | 60 | port0_is_dr = 1; |
60 | } else { | 61 | } else { |
61 | sicrl |= MPC834X_SICRL_USB0; | 62 | sicrl |= MPC834X_SICRL_USB1; |
62 | } | 63 | } |
63 | } else if (prop && !strcmp(prop, "ulpi")) { | 64 | } else if (prop && !strcmp(prop, "ulpi")) { |
64 | sicrl |= MPC834X_SICRL_USB0; | 65 | sicrl |= MPC834X_SICRL_USB1; |
65 | } else { | 66 | } else { |
66 | printk(KERN_WARNING "834x USB PHY type not supported\n"); | 67 | printk(KERN_WARNING "834x USB PHY type not supported\n"); |
67 | } | 68 | } |
68 | port0_is_dr = 1; | ||
69 | of_node_put(np); | 69 | of_node_put(np); |
70 | } | 70 | } |
71 | np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph"); | 71 | np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph"); |
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 43d385cedcd7..a9b416688975 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
@@ -35,12 +35,14 @@ config MPC85xx_MDS | |||
35 | select DEFAULT_UIMAGE | 35 | select DEFAULT_UIMAGE |
36 | select PHYLIB | 36 | select PHYLIB |
37 | select HAS_RAPIDIO | 37 | select HAS_RAPIDIO |
38 | select SWIOTLB | ||
38 | help | 39 | help |
39 | This option enables support for the MPC85xx MDS board | 40 | This option enables support for the MPC85xx MDS board |
40 | 41 | ||
41 | config MPC8536_DS | 42 | config MPC8536_DS |
42 | bool "Freescale MPC8536 DS" | 43 | bool "Freescale MPC8536 DS" |
43 | select DEFAULT_UIMAGE | 44 | select DEFAULT_UIMAGE |
45 | select SWIOTLB | ||
44 | help | 46 | help |
45 | This option enables support for the MPC8536 DS board | 47 | This option enables support for the MPC8536 DS board |
46 | 48 | ||
@@ -49,6 +51,7 @@ config MPC85xx_DS | |||
49 | select PPC_I8259 | 51 | select PPC_I8259 |
50 | select DEFAULT_UIMAGE | 52 | select DEFAULT_UIMAGE |
51 | select FSL_ULI1575 | 53 | select FSL_ULI1575 |
54 | select SWIOTLB | ||
52 | help | 55 | help |
53 | This option enables support for the MPC85xx DS (MPC8544 DS) board | 56 | This option enables support for the MPC85xx DS (MPC8544 DS) board |
54 | 57 | ||
@@ -64,6 +67,16 @@ config KSI8560 | |||
64 | help | 67 | help |
65 | This option enables support for the Emerson KSI8560 board | 68 | This option enables support for the Emerson KSI8560 board |
66 | 69 | ||
70 | config XES_MPC85xx | ||
71 | bool "X-ES single-board computer" | ||
72 | select DEFAULT_UIMAGE | ||
73 | help | ||
74 | This option enables support for the various single-board | ||
75 | computers from Extreme Engineering Solutions (X-ES) based on | ||
76 | Freescale MPC85xx processors. | ||
77 | Manufacturer: Extreme Engineering Solutions, Inc. | ||
78 | URL: <http://www.xes-inc.com/> | ||
79 | |||
67 | config STX_GP3 | 80 | config STX_GP3 |
68 | bool "Silicon Turnkey Express GP3" | 81 | bool "Silicon Turnkey Express GP3" |
69 | help | 82 | help |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index a857b35b9828..835733f2b12c 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
@@ -15,3 +15,4 @@ obj-$(CONFIG_SBC8560) += sbc8560.o | |||
15 | obj-$(CONFIG_SBC8548) += sbc8548.o | 15 | obj-$(CONFIG_SBC8548) += sbc8548.o |
16 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o | 16 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o |
17 | obj-$(CONFIG_KSI8560) += ksi8560.o | 17 | obj-$(CONFIG_KSI8560) += ksi8560.o |
18 | obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o \ No newline at end of file | ||
diff --git a/arch/powerpc/platforms/85xx/mpc8536_ds.c b/arch/powerpc/platforms/85xx/mpc8536_ds.c index 63efca20d7bd..055ff417bae9 100644 --- a/arch/powerpc/platforms/85xx/mpc8536_ds.c +++ b/arch/powerpc/platforms/85xx/mpc8536_ds.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/seq_file.h> | 17 | #include <linux/seq_file.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/of_platform.h> | 19 | #include <linux/of_platform.h> |
20 | #include <linux/lmb.h> | ||
20 | 21 | ||
21 | #include <asm/system.h> | 22 | #include <asm/system.h> |
22 | #include <asm/time.h> | 23 | #include <asm/time.h> |
@@ -26,6 +27,7 @@ | |||
26 | #include <asm/prom.h> | 27 | #include <asm/prom.h> |
27 | #include <asm/udbg.h> | 28 | #include <asm/udbg.h> |
28 | #include <asm/mpic.h> | 29 | #include <asm/mpic.h> |
30 | #include <asm/swiotlb.h> | ||
29 | 31 | ||
30 | #include <sysdev/fsl_soc.h> | 32 | #include <sysdev/fsl_soc.h> |
31 | #include <sysdev/fsl_pci.h> | 33 | #include <sysdev/fsl_pci.h> |
@@ -65,7 +67,9 @@ static void __init mpc8536_ds_setup_arch(void) | |||
65 | { | 67 | { |
66 | #ifdef CONFIG_PCI | 68 | #ifdef CONFIG_PCI |
67 | struct device_node *np; | 69 | struct device_node *np; |
70 | struct pci_controller *hose; | ||
68 | #endif | 71 | #endif |
72 | dma_addr_t max = 0xffffffff; | ||
69 | 73 | ||
70 | if (ppc_md.progress) | 74 | if (ppc_md.progress) |
71 | ppc_md.progress("mpc8536_ds_setup_arch()", 0); | 75 | ppc_md.progress("mpc8536_ds_setup_arch()", 0); |
@@ -80,11 +84,22 @@ static void __init mpc8536_ds_setup_arch(void) | |||
80 | fsl_add_bridge(np, 1); | 84 | fsl_add_bridge(np, 1); |
81 | else | 85 | else |
82 | fsl_add_bridge(np, 0); | 86 | fsl_add_bridge(np, 0); |
87 | |||
88 | hose = pci_find_hose_for_OF_device(np); | ||
89 | max = min(max, hose->dma_window_base_cur + | ||
90 | hose->dma_window_size); | ||
83 | } | 91 | } |
84 | } | 92 | } |
85 | 93 | ||
86 | #endif | 94 | #endif |
87 | 95 | ||
96 | #ifdef CONFIG_SWIOTLB | ||
97 | if (lmb_end_of_DRAM() > max) { | ||
98 | ppc_swiotlb_enable = 1; | ||
99 | set_pci_dma_ops(&swiotlb_pci_dma_ops); | ||
100 | } | ||
101 | #endif | ||
102 | |||
88 | printk("MPC8536 DS board from Freescale Semiconductor\n"); | 103 | printk("MPC8536 DS board from Freescale Semiconductor\n"); |
89 | } | 104 | } |
90 | 105 | ||
@@ -102,6 +117,8 @@ static int __init mpc8536_ds_publish_devices(void) | |||
102 | } | 117 | } |
103 | machine_device_initcall(mpc8536_ds, mpc8536_ds_publish_devices); | 118 | machine_device_initcall(mpc8536_ds, mpc8536_ds_publish_devices); |
104 | 119 | ||
120 | machine_arch_initcall(mpc8536_ds, swiotlb_setup_bus_notifier); | ||
121 | |||
105 | /* | 122 | /* |
106 | * Called very early, device-tree isn't unflattened | 123 | * Called very early, device-tree isn't unflattened |
107 | */ | 124 | */ |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c index 53d5851a6c97..849c0ac0025f 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/seq_file.h> | 20 | #include <linux/seq_file.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/of_platform.h> | 22 | #include <linux/of_platform.h> |
23 | #include <linux/lmb.h> | ||
23 | 24 | ||
24 | #include <asm/system.h> | 25 | #include <asm/system.h> |
25 | #include <asm/time.h> | 26 | #include <asm/time.h> |
@@ -30,6 +31,7 @@ | |||
30 | #include <asm/udbg.h> | 31 | #include <asm/udbg.h> |
31 | #include <asm/mpic.h> | 32 | #include <asm/mpic.h> |
32 | #include <asm/i8259.h> | 33 | #include <asm/i8259.h> |
34 | #include <asm/swiotlb.h> | ||
33 | 35 | ||
34 | #include <sysdev/fsl_soc.h> | 36 | #include <sysdev/fsl_soc.h> |
35 | #include <sysdev/fsl_pci.h> | 37 | #include <sysdev/fsl_pci.h> |
@@ -155,7 +157,9 @@ static void __init mpc85xx_ds_setup_arch(void) | |||
155 | { | 157 | { |
156 | #ifdef CONFIG_PCI | 158 | #ifdef CONFIG_PCI |
157 | struct device_node *np; | 159 | struct device_node *np; |
160 | struct pci_controller *hose; | ||
158 | #endif | 161 | #endif |
162 | dma_addr_t max = 0xffffffff; | ||
159 | 163 | ||
160 | if (ppc_md.progress) | 164 | if (ppc_md.progress) |
161 | ppc_md.progress("mpc85xx_ds_setup_arch()", 0); | 165 | ppc_md.progress("mpc85xx_ds_setup_arch()", 0); |
@@ -171,6 +175,10 @@ static void __init mpc85xx_ds_setup_arch(void) | |||
171 | fsl_add_bridge(np, 1); | 175 | fsl_add_bridge(np, 1); |
172 | else | 176 | else |
173 | fsl_add_bridge(np, 0); | 177 | fsl_add_bridge(np, 0); |
178 | |||
179 | hose = pci_find_hose_for_OF_device(np); | ||
180 | max = min(max, hose->dma_window_base_cur + | ||
181 | hose->dma_window_size); | ||
174 | } | 182 | } |
175 | } | 183 | } |
176 | 184 | ||
@@ -181,6 +189,13 @@ static void __init mpc85xx_ds_setup_arch(void) | |||
181 | mpc85xx_smp_init(); | 189 | mpc85xx_smp_init(); |
182 | #endif | 190 | #endif |
183 | 191 | ||
192 | #ifdef CONFIG_SWIOTLB | ||
193 | if (lmb_end_of_DRAM() > max) { | ||
194 | ppc_swiotlb_enable = 1; | ||
195 | set_pci_dma_ops(&swiotlb_pci_dma_ops); | ||
196 | } | ||
197 | #endif | ||
198 | |||
184 | printk("MPC85xx DS board from Freescale Semiconductor\n"); | 199 | printk("MPC85xx DS board from Freescale Semiconductor\n"); |
185 | } | 200 | } |
186 | 201 | ||
@@ -217,6 +232,10 @@ machine_device_initcall(mpc8544_ds, mpc85xxds_publish_devices); | |||
217 | machine_device_initcall(mpc8572_ds, mpc85xxds_publish_devices); | 232 | machine_device_initcall(mpc8572_ds, mpc85xxds_publish_devices); |
218 | machine_device_initcall(p2020_ds, mpc85xxds_publish_devices); | 233 | machine_device_initcall(p2020_ds, mpc85xxds_publish_devices); |
219 | 234 | ||
235 | machine_arch_initcall(mpc8544_ds, swiotlb_setup_bus_notifier); | ||
236 | machine_arch_initcall(mpc8572_ds, swiotlb_setup_bus_notifier); | ||
237 | machine_arch_initcall(p2020_ds, swiotlb_setup_bus_notifier); | ||
238 | |||
220 | /* | 239 | /* |
221 | * Called very early, device-tree isn't unflattened | 240 | * Called very early, device-tree isn't unflattened |
222 | */ | 241 | */ |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c index b2c0a4319973..77f90b356356 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/of_platform.h> | 33 | #include <linux/of_platform.h> |
34 | #include <linux/of_device.h> | 34 | #include <linux/of_device.h> |
35 | #include <linux/phy.h> | 35 | #include <linux/phy.h> |
36 | #include <linux/lmb.h> | ||
36 | 37 | ||
37 | #include <asm/system.h> | 38 | #include <asm/system.h> |
38 | #include <asm/atomic.h> | 39 | #include <asm/atomic.h> |
@@ -49,6 +50,7 @@ | |||
49 | #include <asm/qe.h> | 50 | #include <asm/qe.h> |
50 | #include <asm/qe_ic.h> | 51 | #include <asm/qe_ic.h> |
51 | #include <asm/mpic.h> | 52 | #include <asm/mpic.h> |
53 | #include <asm/swiotlb.h> | ||
52 | 54 | ||
53 | #undef DEBUG | 55 | #undef DEBUG |
54 | #ifdef DEBUG | 56 | #ifdef DEBUG |
@@ -155,6 +157,10 @@ static void __init mpc85xx_mds_setup_arch(void) | |||
155 | { | 157 | { |
156 | struct device_node *np; | 158 | struct device_node *np; |
157 | static u8 __iomem *bcsr_regs = NULL; | 159 | static u8 __iomem *bcsr_regs = NULL; |
160 | #ifdef CONFIG_PCI | ||
161 | struct pci_controller *hose; | ||
162 | #endif | ||
163 | dma_addr_t max = 0xffffffff; | ||
158 | 164 | ||
159 | if (ppc_md.progress) | 165 | if (ppc_md.progress) |
160 | ppc_md.progress("mpc85xx_mds_setup_arch()", 0); | 166 | ppc_md.progress("mpc85xx_mds_setup_arch()", 0); |
@@ -179,6 +185,10 @@ static void __init mpc85xx_mds_setup_arch(void) | |||
179 | fsl_add_bridge(np, 1); | 185 | fsl_add_bridge(np, 1); |
180 | else | 186 | else |
181 | fsl_add_bridge(np, 0); | 187 | fsl_add_bridge(np, 0); |
188 | |||
189 | hose = pci_find_hose_for_OF_device(np); | ||
190 | max = min(max, hose->dma_window_base_cur + | ||
191 | hose->dma_window_size); | ||
182 | } | 192 | } |
183 | } | 193 | } |
184 | #endif | 194 | #endif |
@@ -227,6 +237,13 @@ static void __init mpc85xx_mds_setup_arch(void) | |||
227 | iounmap(bcsr_regs); | 237 | iounmap(bcsr_regs); |
228 | } | 238 | } |
229 | #endif /* CONFIG_QUICC_ENGINE */ | 239 | #endif /* CONFIG_QUICC_ENGINE */ |
240 | |||
241 | #ifdef CONFIG_SWIOTLB | ||
242 | if (lmb_end_of_DRAM() > max) { | ||
243 | ppc_swiotlb_enable = 1; | ||
244 | set_pci_dma_ops(&swiotlb_pci_dma_ops); | ||
245 | } | ||
246 | #endif | ||
230 | } | 247 | } |
231 | 248 | ||
232 | 249 | ||
@@ -281,6 +298,9 @@ static int __init mpc85xx_publish_devices(void) | |||
281 | machine_device_initcall(mpc8568_mds, mpc85xx_publish_devices); | 298 | machine_device_initcall(mpc8568_mds, mpc85xx_publish_devices); |
282 | machine_device_initcall(mpc8569_mds, mpc85xx_publish_devices); | 299 | machine_device_initcall(mpc8569_mds, mpc85xx_publish_devices); |
283 | 300 | ||
301 | machine_arch_initcall(mpc8568_mds, swiotlb_setup_bus_notifier); | ||
302 | machine_arch_initcall(mpc8569_mds, swiotlb_setup_bus_notifier); | ||
303 | |||
284 | static void __init mpc85xx_mds_pic_init(void) | 304 | static void __init mpc85xx_mds_pic_init(void) |
285 | { | 305 | { |
286 | struct mpic *mpic; | 306 | struct mpic *mpic; |
diff --git a/arch/powerpc/platforms/85xx/xes_mpc85xx.c b/arch/powerpc/platforms/85xx/xes_mpc85xx.c new file mode 100644 index 000000000000..ee01532786e4 --- /dev/null +++ b/arch/powerpc/platforms/85xx/xes_mpc85xx.c | |||
@@ -0,0 +1,282 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 Extreme Engineering Solutions, Inc. | ||
3 | * | ||
4 | * X-ES board-specific functionality | ||
5 | * | ||
6 | * Based on mpc85xx_ds code from Freescale Semiconductor, Inc. | ||
7 | * | ||
8 | * Author: Nate Case <ncase@xes-inc.com> | ||
9 | * | ||
10 | * This is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #include <linux/stddef.h> | ||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/pci.h> | ||
18 | #include <linux/kdev_t.h> | ||
19 | #include <linux/delay.h> | ||
20 | #include <linux/seq_file.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/of_platform.h> | ||
23 | |||
24 | #include <asm/system.h> | ||
25 | #include <asm/time.h> | ||
26 | #include <asm/machdep.h> | ||
27 | #include <asm/pci-bridge.h> | ||
28 | #include <mm/mmu_decl.h> | ||
29 | #include <asm/prom.h> | ||
30 | #include <asm/udbg.h> | ||
31 | #include <asm/mpic.h> | ||
32 | |||
33 | #include <sysdev/fsl_soc.h> | ||
34 | #include <sysdev/fsl_pci.h> | ||
35 | #include <linux/of_platform.h> | ||
36 | |||
37 | /* A few bit definitions needed for fixups on some boards */ | ||
38 | #define MPC85xx_L2CTL_L2E 0x80000000 /* L2 enable */ | ||
39 | #define MPC85xx_L2CTL_L2I 0x40000000 /* L2 flash invalidate */ | ||
40 | #define MPC85xx_L2CTL_L2SIZ_MASK 0x30000000 /* L2 SRAM size (R/O) */ | ||
41 | |||
42 | void __init xes_mpc85xx_pic_init(void) | ||
43 | { | ||
44 | struct mpic *mpic; | ||
45 | struct resource r; | ||
46 | struct device_node *np; | ||
47 | |||
48 | np = of_find_node_by_type(NULL, "open-pic"); | ||
49 | if (np == NULL) { | ||
50 | printk(KERN_ERR "Could not find open-pic node\n"); | ||
51 | return; | ||
52 | } | ||
53 | |||
54 | if (of_address_to_resource(np, 0, &r)) { | ||
55 | printk(KERN_ERR "Failed to map mpic register space\n"); | ||
56 | of_node_put(np); | ||
57 | return; | ||
58 | } | ||
59 | |||
60 | mpic = mpic_alloc(np, r.start, | ||
61 | MPIC_PRIMARY | MPIC_WANTS_RESET | | ||
62 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
63 | 0, 256, " OpenPIC "); | ||
64 | BUG_ON(mpic == NULL); | ||
65 | of_node_put(np); | ||
66 | |||
67 | mpic_init(mpic); | ||
68 | } | ||
69 | |||
70 | static void xes_mpc85xx_configure_l2(void __iomem *l2_base) | ||
71 | { | ||
72 | volatile uint32_t ctl, tmp; | ||
73 | |||
74 | asm volatile("msync; isync"); | ||
75 | tmp = in_be32(l2_base); | ||
76 | |||
77 | /* | ||
78 | * xMon may have enabled part of L2 as SRAM, so we need to set it | ||
79 | * up for all cache mode just to be safe. | ||
80 | */ | ||
81 | printk(KERN_INFO "xes_mpc85xx: Enabling L2 as cache\n"); | ||
82 | |||
83 | ctl = MPC85xx_L2CTL_L2E | MPC85xx_L2CTL_L2I; | ||
84 | if (machine_is_compatible("MPC8540") || | ||
85 | machine_is_compatible("MPC8560")) | ||
86 | /* | ||
87 | * Assume L2 SRAM is used fully for cache, so set | ||
88 | * L2BLKSZ (bits 4:5) to match L2SIZ (bits 2:3). | ||
89 | */ | ||
90 | ctl |= (tmp & MPC85xx_L2CTL_L2SIZ_MASK) >> 2; | ||
91 | |||
92 | asm volatile("msync; isync"); | ||
93 | out_be32(l2_base, ctl); | ||
94 | asm volatile("msync; isync"); | ||
95 | } | ||
96 | |||
97 | static void xes_mpc85xx_fixups(void) | ||
98 | { | ||
99 | struct device_node *np; | ||
100 | int err; | ||
101 | |||
102 | /* | ||
103 | * Legacy xMon firmware on some X-ES boards does not enable L2 | ||
104 | * as cache. We must ensure that they get enabled here. | ||
105 | */ | ||
106 | for_each_node_by_name(np, "l2-cache-controller") { | ||
107 | struct resource r[2]; | ||
108 | void __iomem *l2_base; | ||
109 | |||
110 | /* Only MPC8548, MPC8540, and MPC8560 boards are affected */ | ||
111 | if (!of_device_is_compatible(np, | ||
112 | "fsl,mpc8548-l2-cache-controller") && | ||
113 | !of_device_is_compatible(np, | ||
114 | "fsl,mpc8540-l2-cache-controller") && | ||
115 | !of_device_is_compatible(np, | ||
116 | "fsl,mpc8560-l2-cache-controller")) | ||
117 | continue; | ||
118 | |||
119 | err = of_address_to_resource(np, 0, &r[0]); | ||
120 | if (err) { | ||
121 | printk(KERN_WARNING "xes_mpc85xx: Could not get " | ||
122 | "resource for device tree node '%s'", | ||
123 | np->full_name); | ||
124 | continue; | ||
125 | } | ||
126 | |||
127 | l2_base = ioremap(r[0].start, r[0].end - r[0].start + 1); | ||
128 | |||
129 | xes_mpc85xx_configure_l2(l2_base); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | #ifdef CONFIG_PCI | ||
134 | static int primary_phb_addr; | ||
135 | #endif | ||
136 | |||
137 | /* | ||
138 | * Setup the architecture | ||
139 | */ | ||
140 | #ifdef CONFIG_SMP | ||
141 | extern void __init mpc85xx_smp_init(void); | ||
142 | #endif | ||
143 | static void __init xes_mpc85xx_setup_arch(void) | ||
144 | { | ||
145 | #ifdef CONFIG_PCI | ||
146 | struct device_node *np; | ||
147 | #endif | ||
148 | struct device_node *root; | ||
149 | const char *model = "Unknown"; | ||
150 | |||
151 | root = of_find_node_by_path("/"); | ||
152 | if (root == NULL) | ||
153 | return; | ||
154 | |||
155 | model = of_get_property(root, "model", NULL); | ||
156 | |||
157 | printk(KERN_INFO "X-ES MPC85xx-based single-board computer: %s\n", | ||
158 | model + strlen("xes,")); | ||
159 | |||
160 | xes_mpc85xx_fixups(); | ||
161 | |||
162 | #ifdef CONFIG_PCI | ||
163 | for_each_node_by_type(np, "pci") { | ||
164 | if (of_device_is_compatible(np, "fsl,mpc8540-pci") || | ||
165 | of_device_is_compatible(np, "fsl,mpc8548-pcie")) { | ||
166 | struct resource rsrc; | ||
167 | of_address_to_resource(np, 0, &rsrc); | ||
168 | if ((rsrc.start & 0xfffff) == primary_phb_addr) | ||
169 | fsl_add_bridge(np, 1); | ||
170 | else | ||
171 | fsl_add_bridge(np, 0); | ||
172 | } | ||
173 | } | ||
174 | #endif | ||
175 | |||
176 | #ifdef CONFIG_SMP | ||
177 | mpc85xx_smp_init(); | ||
178 | #endif | ||
179 | } | ||
180 | |||
181 | static struct of_device_id __initdata xes_mpc85xx_ids[] = { | ||
182 | { .type = "soc", }, | ||
183 | { .compatible = "soc", }, | ||
184 | { .compatible = "simple-bus", }, | ||
185 | { .compatible = "gianfar", }, | ||
186 | {}, | ||
187 | }; | ||
188 | |||
189 | static int __init xes_mpc85xx_publish_devices(void) | ||
190 | { | ||
191 | return of_platform_bus_probe(NULL, xes_mpc85xx_ids, NULL); | ||
192 | } | ||
193 | machine_device_initcall(xes_mpc8572, xes_mpc85xx_publish_devices); | ||
194 | machine_device_initcall(xes_mpc8548, xes_mpc85xx_publish_devices); | ||
195 | machine_device_initcall(xes_mpc8540, xes_mpc85xx_publish_devices); | ||
196 | |||
197 | /* | ||
198 | * Called very early, device-tree isn't unflattened | ||
199 | */ | ||
200 | static int __init xes_mpc8572_probe(void) | ||
201 | { | ||
202 | unsigned long root = of_get_flat_dt_root(); | ||
203 | |||
204 | if (of_flat_dt_is_compatible(root, "xes,MPC8572")) { | ||
205 | #ifdef CONFIG_PCI | ||
206 | primary_phb_addr = 0x8000; | ||
207 | #endif | ||
208 | return 1; | ||
209 | } else { | ||
210 | return 0; | ||
211 | } | ||
212 | } | ||
213 | |||
214 | static int __init xes_mpc8548_probe(void) | ||
215 | { | ||
216 | unsigned long root = of_get_flat_dt_root(); | ||
217 | |||
218 | if (of_flat_dt_is_compatible(root, "xes,MPC8548")) { | ||
219 | #ifdef CONFIG_PCI | ||
220 | primary_phb_addr = 0xb000; | ||
221 | #endif | ||
222 | return 1; | ||
223 | } else { | ||
224 | return 0; | ||
225 | } | ||
226 | } | ||
227 | |||
228 | static int __init xes_mpc8540_probe(void) | ||
229 | { | ||
230 | unsigned long root = of_get_flat_dt_root(); | ||
231 | |||
232 | if (of_flat_dt_is_compatible(root, "xes,MPC8540")) { | ||
233 | #ifdef CONFIG_PCI | ||
234 | primary_phb_addr = 0xb000; | ||
235 | #endif | ||
236 | return 1; | ||
237 | } else { | ||
238 | return 0; | ||
239 | } | ||
240 | } | ||
241 | |||
242 | define_machine(xes_mpc8572) { | ||
243 | .name = "X-ES MPC8572", | ||
244 | .probe = xes_mpc8572_probe, | ||
245 | .setup_arch = xes_mpc85xx_setup_arch, | ||
246 | .init_IRQ = xes_mpc85xx_pic_init, | ||
247 | #ifdef CONFIG_PCI | ||
248 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
249 | #endif | ||
250 | .get_irq = mpic_get_irq, | ||
251 | .restart = fsl_rstcr_restart, | ||
252 | .calibrate_decr = generic_calibrate_decr, | ||
253 | .progress = udbg_progress, | ||
254 | }; | ||
255 | |||
256 | define_machine(xes_mpc8548) { | ||
257 | .name = "X-ES MPC8548", | ||
258 | .probe = xes_mpc8548_probe, | ||
259 | .setup_arch = xes_mpc85xx_setup_arch, | ||
260 | .init_IRQ = xes_mpc85xx_pic_init, | ||
261 | #ifdef CONFIG_PCI | ||
262 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
263 | #endif | ||
264 | .get_irq = mpic_get_irq, | ||
265 | .restart = fsl_rstcr_restart, | ||
266 | .calibrate_decr = generic_calibrate_decr, | ||
267 | .progress = udbg_progress, | ||
268 | }; | ||
269 | |||
270 | define_machine(xes_mpc8540) { | ||
271 | .name = "X-ES MPC8540", | ||
272 | .probe = xes_mpc8540_probe, | ||
273 | .setup_arch = xes_mpc85xx_setup_arch, | ||
274 | .init_IRQ = xes_mpc85xx_pic_init, | ||
275 | #ifdef CONFIG_PCI | ||
276 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
277 | #endif | ||
278 | .get_irq = mpic_get_irq, | ||
279 | .restart = fsl_rstcr_restart, | ||
280 | .calibrate_decr = generic_calibrate_decr, | ||
281 | .progress = udbg_progress, | ||
282 | }; | ||
diff --git a/arch/powerpc/platforms/86xx/Kconfig b/arch/powerpc/platforms/86xx/Kconfig index fdaf4ddaa955..9c7b64a3402b 100644 --- a/arch/powerpc/platforms/86xx/Kconfig +++ b/arch/powerpc/platforms/86xx/Kconfig | |||
@@ -15,6 +15,7 @@ config MPC8641_HPCN | |||
15 | select DEFAULT_UIMAGE | 15 | select DEFAULT_UIMAGE |
16 | select FSL_ULI1575 | 16 | select FSL_ULI1575 |
17 | select HAS_RAPIDIO | 17 | select HAS_RAPIDIO |
18 | select SWIOTLB | ||
18 | help | 19 | help |
19 | This option enables support for the MPC8641 HPCN board. | 20 | This option enables support for the MPC8641 HPCN board. |
20 | 21 | ||
diff --git a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c index 7e9e83c04a8a..66327024a6a6 100644 --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c +++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/delay.h> | 19 | #include <linux/delay.h> |
20 | #include <linux/seq_file.h> | 20 | #include <linux/seq_file.h> |
21 | #include <linux/of_platform.h> | 21 | #include <linux/of_platform.h> |
22 | #include <linux/lmb.h> | ||
22 | 23 | ||
23 | #include <asm/system.h> | 24 | #include <asm/system.h> |
24 | #include <asm/time.h> | 25 | #include <asm/time.h> |
@@ -27,6 +28,7 @@ | |||
27 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
28 | #include <mm/mmu_decl.h> | 29 | #include <mm/mmu_decl.h> |
29 | #include <asm/udbg.h> | 30 | #include <asm/udbg.h> |
31 | #include <asm/swiotlb.h> | ||
30 | 32 | ||
31 | #include <asm/mpic.h> | 33 | #include <asm/mpic.h> |
32 | 34 | ||
@@ -70,7 +72,9 @@ mpc86xx_hpcn_setup_arch(void) | |||
70 | { | 72 | { |
71 | #ifdef CONFIG_PCI | 73 | #ifdef CONFIG_PCI |
72 | struct device_node *np; | 74 | struct device_node *np; |
75 | struct pci_controller *hose; | ||
73 | #endif | 76 | #endif |
77 | dma_addr_t max = 0xffffffff; | ||
74 | 78 | ||
75 | if (ppc_md.progress) | 79 | if (ppc_md.progress) |
76 | ppc_md.progress("mpc86xx_hpcn_setup_arch()", 0); | 80 | ppc_md.progress("mpc86xx_hpcn_setup_arch()", 0); |
@@ -83,6 +87,9 @@ mpc86xx_hpcn_setup_arch(void) | |||
83 | fsl_add_bridge(np, 1); | 87 | fsl_add_bridge(np, 1); |
84 | else | 88 | else |
85 | fsl_add_bridge(np, 0); | 89 | fsl_add_bridge(np, 0); |
90 | hose = pci_find_hose_for_OF_device(np); | ||
91 | max = min(max, hose->dma_window_base_cur + | ||
92 | hose->dma_window_size); | ||
86 | } | 93 | } |
87 | 94 | ||
88 | ppc_md.pci_exclude_device = mpc86xx_exclude_device; | 95 | ppc_md.pci_exclude_device = mpc86xx_exclude_device; |
@@ -94,6 +101,13 @@ mpc86xx_hpcn_setup_arch(void) | |||
94 | #ifdef CONFIG_SMP | 101 | #ifdef CONFIG_SMP |
95 | mpc86xx_smp_init(); | 102 | mpc86xx_smp_init(); |
96 | #endif | 103 | #endif |
104 | |||
105 | #ifdef CONFIG_SWIOTLB | ||
106 | if (lmb_end_of_DRAM() > max) { | ||
107 | ppc_swiotlb_enable = 1; | ||
108 | set_pci_dma_ops(&swiotlb_pci_dma_ops); | ||
109 | } | ||
110 | #endif | ||
97 | } | 111 | } |
98 | 112 | ||
99 | 113 | ||
@@ -158,6 +172,7 @@ static int __init declare_of_platform_devices(void) | |||
158 | return 0; | 172 | return 0; |
159 | } | 173 | } |
160 | machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices); | 174 | machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices); |
175 | machine_arch_initcall(mpc86xx_hpcn, swiotlb_setup_bus_notifier); | ||
161 | 176 | ||
162 | define_machine(mpc86xx_hpcn) { | 177 | define_machine(mpc86xx_hpcn) { |
163 | .name = "MPC86xx HPCN", | 178 | .name = "MPC86xx HPCN", |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index cca6b4fc719a..c4192542b809 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -21,7 +21,7 @@ choice | |||
21 | 21 | ||
22 | If unsure, select 52xx/6xx/7xx/74xx/82xx/83xx/86xx. | 22 | If unsure, select 52xx/6xx/7xx/74xx/82xx/83xx/86xx. |
23 | 23 | ||
24 | config PPC_BOOK3S | 24 | config PPC_BOOK3S_32 |
25 | bool "512x/52xx/6xx/7xx/74xx/82xx/83xx/86xx" | 25 | bool "512x/52xx/6xx/7xx/74xx/82xx/83xx/86xx" |
26 | select PPC_FPU | 26 | select PPC_FPU |
27 | 27 | ||
@@ -57,11 +57,14 @@ config E200 | |||
57 | 57 | ||
58 | endchoice | 58 | endchoice |
59 | 59 | ||
60 | config PPC_BOOK3S | 60 | config PPC_BOOK3S_64 |
61 | default y | 61 | def_bool y |
62 | depends on PPC64 | 62 | depends on PPC64 |
63 | select PPC_FPU | 63 | select PPC_FPU |
64 | 64 | ||
65 | config PPC_BOOK3S | ||
66 | def_bool y | ||
67 | depends on PPC_BOOK3S_32 || PPC_BOOK3S_64 | ||
65 | 68 | ||
66 | config POWER4_ONLY | 69 | config POWER4_ONLY |
67 | bool "Optimize for POWER4" | 70 | bool "Optimize for POWER4" |
diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile index f7419198e635..a6812ee00100 100644 --- a/arch/powerpc/platforms/Makefile +++ b/arch/powerpc/platforms/Makefile | |||
@@ -1,4 +1,6 @@ | |||
1 | 1 | ||
2 | subdir-ccflags-$(CONFIG_PPC_WERROR) := -Werror | ||
3 | |||
2 | obj-$(CONFIG_FSL_ULI1575) += fsl_uli1575.o | 4 | obj-$(CONFIG_FSL_ULI1575) += fsl_uli1575.o |
3 | 5 | ||
4 | obj-$(CONFIG_PPC_PMAC) += powermac/ | 6 | obj-$(CONFIG_PPC_PMAC) += powermac/ |