aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/platforms/85xx
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2007-10-08 17:08:51 -0400
committerKumar Gala <galak@kernel.crashing.org>2007-10-11 10:14:31 -0400
commit8abc8f5f1eda7a34394c8006fe1cb4c13ffca682 (patch)
tree2fc088a89679cde38bcf7b78c70699c1e1f4cf2d /arch/powerpc/platforms/85xx
parent52aff9f93e452b3a55be74018dc90eb0ddde0a9c (diff)
[POWERPC] 85xx: Convert mpc8560ads to the new CPM binding.
Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/platforms/85xx')
-rw-r--r--arch/powerpc/platforms/85xx/Kconfig1
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_ads.c167
2 files changed, 90 insertions, 78 deletions
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
index cf815b22b9fb..7748a3a426db 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -12,6 +12,7 @@ config MPC8540_ADS
12config MPC8560_ADS 12config MPC8560_ADS
13 bool "Freescale MPC8560 ADS" 13 bool "Freescale MPC8560 ADS"
14 select DEFAULT_UIMAGE 14 select DEFAULT_UIMAGE
15 select PPC_CPM_NEW_BINDING
15 help 16 help
16 This option enables support for the MPC 8560 ADS board 17 This option enables support for the MPC 8560 ADS board
17 18
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.c b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
index 378a244b3bac..509d46beee11 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
@@ -17,13 +17,13 @@
17#include <linux/kdev_t.h> 17#include <linux/kdev_t.h>
18#include <linux/delay.h> 18#include <linux/delay.h>
19#include <linux/seq_file.h> 19#include <linux/seq_file.h>
20#include <linux/of_platform.h>
20 21
21#include <asm/system.h> 22#include <asm/system.h>
22#include <asm/time.h> 23#include <asm/time.h>
23#include <asm/machdep.h> 24#include <asm/machdep.h>
24#include <asm/pci-bridge.h> 25#include <asm/pci-bridge.h>
25#include <asm/mpc85xx.h> 26#include <asm/mpc85xx.h>
26#include <asm/prom.h>
27#include <asm/mpic.h> 27#include <asm/mpic.h>
28#include <mm/mmu_decl.h> 28#include <mm/mmu_decl.h>
29#include <asm/udbg.h> 29#include <asm/udbg.h>
@@ -32,10 +32,8 @@
32#include <sysdev/fsl_pci.h> 32#include <sysdev/fsl_pci.h>
33 33
34#ifdef CONFIG_CPM2 34#ifdef CONFIG_CPM2
35#include <linux/fs_enet_pd.h>
36#include <asm/cpm2.h> 35#include <asm/cpm2.h>
37#include <sysdev/cpm2_pic.h> 36#include <sysdev/cpm2_pic.h>
38#include <asm/fs_pd.h>
39#endif 37#endif
40 38
41#ifdef CONFIG_PCI 39#ifdef CONFIG_PCI
@@ -95,10 +93,10 @@ static void __init mpc85xx_ads_pic_init(void)
95 93
96#ifdef CONFIG_CPM2 94#ifdef CONFIG_CPM2
97 /* Setup CPM2 PIC */ 95 /* Setup CPM2 PIC */
98 np = of_find_node_by_type(NULL, "cpm-pic"); 96 np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
99 if (np == NULL) { 97 if (np == NULL) {
100 printk(KERN_ERR "PIC init: can not find cpm-pic node\n"); 98 printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
101 return; 99 return;
102 } 100 }
103 irq = irq_of_parse_and_map(np, 0); 101 irq = irq_of_parse_and_map(np, 0);
104 102
@@ -111,81 +109,75 @@ static void __init mpc85xx_ads_pic_init(void)
111 * Setup the architecture 109 * Setup the architecture
112 */ 110 */
113#ifdef CONFIG_CPM2 111#ifdef CONFIG_CPM2
114void init_fcc_ioports(struct fs_platform_info *fpi) 112struct cpm_pin {
113 int port, pin, flags;
114};
115
116static struct cpm_pin mpc8560_ads_pins[] = {
117 /* SCC1 */
118 {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
119 {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
120 {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
121
122 /* SCC2 */
123 {3, 26, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
124 {3, 27, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
125 {3, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
126
127 /* FCC2 */
128 {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
129 {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
130 {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
131 {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
132 {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
133 {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
134 {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
135 {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
136 {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
137 {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
138 {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
139 {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
140 {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
141 {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
142 {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK14 */
143 {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK13 */
144
145 /* FCC3 */
146 {1, 4, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
147 {1, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
148 {1, 6, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
149 {1, 7, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
150 {1, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
151 {1, 9, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
152 {1, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
153 {1, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
154 {1, 12, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
155 {1, 13, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
156 {1, 14, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
157 {1, 15, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
158 {1, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
159 {1, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
160 {2, 16, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* CLK16 */
161 {2, 17, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* CLK15 */
162};
163
164static void __init init_ioports(void)
115{ 165{
116 struct io_port *io = cpm2_map(im_ioport); 166 int i;
117 int fcc_no = fs_get_fcc_index(fpi->fs_no); 167
118 int target; 168 for (i = 0; i < ARRAY_SIZE(mpc8560_ads_pins); i++) {
119 u32 tempval; 169 struct cpm_pin *pin = &mpc8560_ads_pins[i];
120 170 cpm2_set_pin(pin->port, pin->pin, pin->flags);
121 switch(fcc_no) {
122 case 1:
123 tempval = in_be32(&io->iop_pdirb);
124 tempval &= ~PB2_DIRB0;
125 tempval |= PB2_DIRB1;
126 out_be32(&io->iop_pdirb, tempval);
127
128 tempval = in_be32(&io->iop_psorb);
129 tempval &= ~PB2_PSORB0;
130 tempval |= PB2_PSORB1;
131 out_be32(&io->iop_psorb, tempval);
132
133 tempval = in_be32(&io->iop_pparb);
134 tempval |= (PB2_DIRB0 | PB2_DIRB1);
135 out_be32(&io->iop_pparb, tempval);
136
137 target = CPM_CLK_FCC2;
138 break;
139 case 2:
140 tempval = in_be32(&io->iop_pdirb);
141 tempval &= ~PB3_DIRB0;
142 tempval |= PB3_DIRB1;
143 out_be32(&io->iop_pdirb, tempval);
144
145 tempval = in_be32(&io->iop_psorb);
146 tempval &= ~PB3_PSORB0;
147 tempval |= PB3_PSORB1;
148 out_be32(&io->iop_psorb, tempval);
149
150 tempval = in_be32(&io->iop_pparb);
151 tempval |= (PB3_DIRB0 | PB3_DIRB1);
152 out_be32(&io->iop_pparb, tempval);
153
154 tempval = in_be32(&io->iop_pdirc);
155 tempval |= PC3_DIRC1;
156 out_be32(&io->iop_pdirc, tempval);
157
158 tempval = in_be32(&io->iop_pparc);
159 tempval |= PC3_DIRC1;
160 out_be32(&io->iop_pparc, tempval);
161
162 target = CPM_CLK_FCC3;
163 break;
164 default:
165 printk(KERN_ERR "init_fcc_ioports: invalid FCC number\n");
166 return;
167 } 171 }
168 172
169 /* Port C has clocks...... */ 173 cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
170 tempval = in_be32(&io->iop_psorc); 174 cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
171 tempval &= ~(PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8)); 175 cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
172 out_be32(&io->iop_psorc, tempval); 176 cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
173 177 cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
174 tempval = in_be32(&io->iop_pdirc); 178 cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
175 tempval &= ~(PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8)); 179 cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK15, CPM_CLK_RX);
176 out_be32(&io->iop_pdirc, tempval); 180 cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK16, CPM_CLK_TX);
177 tempval = in_be32(&io->iop_pparc);
178 tempval |= (PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8));
179 out_be32(&io->iop_pparc, tempval);
180
181 cpm2_unmap(io);
182
183 /* Configure Serial Interface clock routing.
184 * First, clear FCC bits to zero,
185 * then set the ones we want.
186 */
187 cpm2_clk_setup(target, fpi->clk_rx, CPM_CLK_RX);
188 cpm2_clk_setup(target, fpi->clk_tx, CPM_CLK_TX);
189} 181}
190#endif 182#endif
191 183
@@ -200,6 +192,7 @@ static void __init mpc85xx_ads_setup_arch(void)
200 192
201#ifdef CONFIG_CPM2 193#ifdef CONFIG_CPM2
202 cpm2_reset(); 194 cpm2_reset();
195 init_ioports();
203#endif 196#endif
204 197
205#ifdef CONFIG_PCI 198#ifdef CONFIG_PCI
@@ -231,6 +224,24 @@ static void mpc85xx_ads_show_cpuinfo(struct seq_file *m)
231 seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024)); 224 seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
232} 225}
233 226
227static struct of_device_id __initdata of_bus_ids[] = {
228 { .name = "soc", },
229 { .type = "soc", },
230 { .name = "cpm", },
231 { .name = "localbus", },
232 {},
233};
234
235static int __init declare_of_platform_devices(void)
236{
237 if (!machine_is(mpc85xx_ads))
238 return 0;
239
240 of_platform_bus_probe(NULL, of_bus_ids, NULL);
241 return 0;
242}
243device_initcall(declare_of_platform_devices);
244
234/* 245/*
235 * Called very early, device-tree isn't unflattened 246 * Called very early, device-tree isn't unflattened
236 */ 247 */