xref: /openbmc/u-boot/arch/m68k/cpu/mcf5445x/cpu_init.c (revision dca47409)
1 /*
2  *
3  * (C) Copyright 2000-2003
4  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5  *
6  * (C) Copyright 2004-2007, 2012 Freescale Semiconductor, Inc.
7  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
8  *
9  * SPDX-License-Identifier:	GPL-2.0+
10  */
11 
12 #include <common.h>
13 #include <watchdog.h>
14 #include <asm/immap.h>
15 #include <asm/processor.h>
16 #include <asm/rtc.h>
17 #include <asm/io.h>
18 #include <linux/compiler.h>
19 
20 #if defined(CONFIG_CMD_NET)
21 #include <config.h>
22 #include <net.h>
23 #include <asm/fec.h>
24 #endif
25 
26 void init_fbcs(void)
27 {
28 	fbcs_t *fbcs __maybe_unused = (fbcs_t *) MMAP_FBCS;
29 
30 #if !defined(CONFIG_SERIAL_BOOT)
31 #if (defined(CONFIG_SYS_CS0_BASE) && defined(CONFIG_SYS_CS0_MASK) && defined(CONFIG_SYS_CS0_CTRL))
32 	out_be32(&fbcs->csar0, CONFIG_SYS_CS0_BASE);
33 	out_be32(&fbcs->cscr0, CONFIG_SYS_CS0_CTRL);
34 	out_be32(&fbcs->csmr0, CONFIG_SYS_CS0_MASK);
35 #endif
36 #endif
37 
38 #if (defined(CONFIG_SYS_CS1_BASE) && defined(CONFIG_SYS_CS1_MASK) && defined(CONFIG_SYS_CS1_CTRL))
39 	/* Latch chipselect */
40 	out_be32(&fbcs->csar1, CONFIG_SYS_CS1_BASE);
41 	out_be32(&fbcs->cscr1, CONFIG_SYS_CS1_CTRL);
42 	out_be32(&fbcs->csmr1, CONFIG_SYS_CS1_MASK);
43 #endif
44 
45 #if (defined(CONFIG_SYS_CS2_BASE) && defined(CONFIG_SYS_CS2_MASK) && defined(CONFIG_SYS_CS2_CTRL))
46 	out_be32(&fbcs->csar2, CONFIG_SYS_CS2_BASE);
47 	out_be32(&fbcs->cscr2, CONFIG_SYS_CS2_CTRL);
48 	out_be32(&fbcs->csmr2, CONFIG_SYS_CS2_MASK);
49 #endif
50 
51 #if (defined(CONFIG_SYS_CS3_BASE) && defined(CONFIG_SYS_CS3_MASK) && defined(CONFIG_SYS_CS3_CTRL))
52 	out_be32(&fbcs->csar3, CONFIG_SYS_CS3_BASE);
53 	out_be32(&fbcs->cscr3, CONFIG_SYS_CS3_CTRL);
54 	out_be32(&fbcs->csmr3, CONFIG_SYS_CS3_MASK);
55 #endif
56 
57 #if (defined(CONFIG_SYS_CS4_BASE) && defined(CONFIG_SYS_CS4_MASK) && defined(CONFIG_SYS_CS4_CTRL))
58 	out_be32(&fbcs->csar4, CONFIG_SYS_CS4_BASE);
59 	out_be32(&fbcs->cscr4, CONFIG_SYS_CS4_CTRL);
60 	out_be32(&fbcs->csmr4, CONFIG_SYS_CS4_MASK);
61 #endif
62 
63 #if (defined(CONFIG_SYS_CS5_BASE) && defined(CONFIG_SYS_CS5_MASK) && defined(CONFIG_SYS_CS5_CTRL))
64 	out_be32(&fbcs->csar5, CONFIG_SYS_CS5_BASE);
65 	out_be32(&fbcs->cscr5, CONFIG_SYS_CS5_CTRL);
66 	out_be32(&fbcs->csmr5, CONFIG_SYS_CS5_MASK);
67 #endif
68 }
69 
70 /*
71  * Breath some life into the CPU...
72  *
73  * Set up the memory map,
74  * initialize a bunch of registers,
75  * initialize the UPM's
76  */
77 void cpu_init_f(void)
78 {
79 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
80 
81 #ifdef CONFIG_MCF5441x
82 	scm_t *scm = (scm_t *) MMAP_SCM;
83 	pm_t *pm = (pm_t *) MMAP_PM;
84 
85 	/* Disable Switch */
86 	*(unsigned long *)(MMAP_L2_SW0 + 0x00000024) = 0;
87 
88 	/* Disable core watchdog */
89 	out_be16(&scm->cwcr, 0);
90 	out_8(&gpio->par_fbctl,
91 		GPIO_PAR_FBCTL_ALE_FB_ALE | GPIO_PAR_FBCTL_OE_FB_OE |
92 		GPIO_PAR_FBCTL_FBCLK | GPIO_PAR_FBCTL_RW |
93 		GPIO_PAR_FBCTL_TA_TA);
94 	out_8(&gpio->par_be,
95 		GPIO_PAR_BE_BE3_BE3 | GPIO_PAR_BE_BE2_BE2 |
96 		GPIO_PAR_BE_BE1_BE1 | GPIO_PAR_BE_BE0_BE0);
97 
98 	/* eDMA */
99 	out_8(&pm->pmcr0, 17);
100 
101 	/* INTR0 - INTR2 */
102 	out_8(&pm->pmcr0, 18);
103 	out_8(&pm->pmcr0, 19);
104 	out_8(&pm->pmcr0, 20);
105 
106 	/* I2C */
107 	out_8(&pm->pmcr0, 22);
108 	out_8(&pm->pmcr1, 4);
109 	out_8(&pm->pmcr1, 7);
110 
111 	/* DTMR0 - DTMR3*/
112 	out_8(&pm->pmcr0, 28);
113 	out_8(&pm->pmcr0, 29);
114 	out_8(&pm->pmcr0, 30);
115 	out_8(&pm->pmcr0, 31);
116 
117 	/* PIT0 - PIT3 */
118 	out_8(&pm->pmcr0, 32);
119 	out_8(&pm->pmcr0, 33);
120 	out_8(&pm->pmcr0, 34);
121 	out_8(&pm->pmcr0, 35);
122 
123 	/* Edge Port */
124 	out_8(&pm->pmcr0, 36);
125 	out_8(&pm->pmcr0, 37);
126 
127 	/* USB OTG */
128 	out_8(&pm->pmcr0, 44);
129 	/* USB Host */
130 	out_8(&pm->pmcr0, 45);
131 
132 	/* ESDHC */
133 	out_8(&pm->pmcr0, 51);
134 
135 	/* ENET0 - ENET1 */
136 	out_8(&pm->pmcr0, 53);
137 	out_8(&pm->pmcr0, 54);
138 
139 	/* NAND */
140 	out_8(&pm->pmcr0, 63);
141 
142 #ifdef CONFIG_SYS_I2C_0
143 	out_8(&gpio->par_cani2c, 0xF0);
144 	/* I2C0 pull up */
145 	out_be16(&gpio->pcr_b, 0x003C);
146 	/* I2C0 max speed */
147 	out_8(&gpio->srcr_cani2c, 0x03);
148 #endif
149 #ifdef CONFIG_SYS_I2C_2
150 	/* I2C2 */
151 	out_8(&gpio->par_ssi0h, 0xA0);
152 	/* I2C2, UART7 */
153 	out_8(&gpio->par_ssi0h, 0xA8);
154 	/* UART7 */
155 	out_8(&gpio->par_ssi0l, 0x2);
156 	/* UART8, UART9 */
157 	out_8(&gpio->par_cani2c, 0xAA);
158 	/* UART4, UART0 */
159 	out_8(&gpio->par_uart0, 0xAF);
160 	/* UART5, UART1 */
161 	out_8(&gpio->par_uart1, 0xAF);
162 	/* UART6, UART2 */
163 	out_8(&gpio->par_uart2, 0xAF);
164 	/* I2C2 pull up */
165 	out_be16(&gpio->pcr_h, 0xF000);
166 #endif
167 #ifdef CONFIG_SYS_I2C_5
168 	/* I2C5 */
169 	out_8(&gpio->par_uart1, 0x0A);
170 	/* I2C5 pull up */
171 	out_be16(&gpio->pcr_e, 0x0003);
172 	out_be16(&gpio->pcr_f, 0xC000);
173 #endif
174 
175 	/* Lowest slew rate for UART0,1,2 */
176 	out_8(&gpio->srcr_uart, 0x00);
177 #endif		/* CONFIG_MCF5441x */
178 
179 #ifdef CONFIG_MCF5445x
180 	scm1_t *scm1 = (scm1_t *) MMAP_SCM1;
181 
182 	out_be32(&scm1->mpr, 0x77777777);
183 	out_be32(&scm1->pacra, 0);
184 	out_be32(&scm1->pacrb, 0);
185 	out_be32(&scm1->pacrc, 0);
186 	out_be32(&scm1->pacrd, 0);
187 	out_be32(&scm1->pacre, 0);
188 	out_be32(&scm1->pacrf, 0);
189 	out_be32(&scm1->pacrg, 0);
190 
191 	/* FlexBus */
192 	out_8(&gpio->par_be,
193 		GPIO_PAR_BE_BE3_BE3 | GPIO_PAR_BE_BE2_BE2 |
194 		GPIO_PAR_BE_BE1_BE1 | GPIO_PAR_BE_BE0_BE0);
195 	out_8(&gpio->par_fbctl,
196 		GPIO_PAR_FBCTL_OE | GPIO_PAR_FBCTL_TA_TA |
197 		GPIO_PAR_FBCTL_RW_RW | GPIO_PAR_FBCTL_TS_TS);
198 
199 #ifdef CONFIG_SYS_FSL_I2C
200 	out_be16(&gpio->par_feci2c,
201 		GPIO_PAR_FECI2C_SCL_SCL | GPIO_PAR_FECI2C_SDA_SDA);
202 #endif
203 #endif		/* CONFIG_MCF5445x */
204 
205 	/* FlexBus Chipselect */
206 	init_fbcs();
207 
208 #ifdef CONFIG_SYS_CS0_BASE
209 	/*
210 	 * now the flash base address is no longer at 0 (Newer ColdFire family
211 	 * boot at address 0 instead of 0xFFnn_nnnn). The vector table must
212 	 * also move to the new location.
213 	 */
214 	if (CONFIG_SYS_CS0_BASE != 0)
215 		setvbr(CONFIG_SYS_CS0_BASE);
216 #endif
217 
218 	icache_enable();
219 }
220 
221 /*
222  * initialize higher level parts of CPU like timers
223  */
224 int cpu_init_r(void)
225 {
226 #ifdef CONFIG_MCFRTC
227 	rtc_t *rtc = (rtc_t *)(CONFIG_SYS_MCFRTC_BASE);
228 	rtcex_t *rtcex = (rtcex_t *)&rtc->extended;
229 
230 	out_be32(&rtcex->gocu, (CONFIG_SYS_RTC_OSCILLATOR >> 16) & 0xffff);
231 	out_be32(&rtcex->gocl, CONFIG_SYS_RTC_OSCILLATOR & 0xffff);
232 #endif
233 
234 	return (0);
235 }
236 
237 void uart_port_conf(int port)
238 {
239 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
240 #ifdef CONFIG_MCF5441x
241 	pm_t *pm = (pm_t *) MMAP_PM;
242 #endif
243 
244 	/* Setup Ports: */
245 	switch (port) {
246 #ifdef CONFIG_MCF5441x
247 	case 0:
248 		/* UART0 */
249 		out_8(&pm->pmcr0, 24);
250 		clrbits_8(&gpio->par_uart0,
251 			~(GPIO_PAR_UART0_U0RXD_MASK | GPIO_PAR_UART0_U0TXD_MASK));
252 		setbits_8(&gpio->par_uart0,
253 			GPIO_PAR_UART0_U0RXD_U0RXD | GPIO_PAR_UART0_U0TXD_U0TXD);
254 		break;
255 	case 1:
256 		/* UART1 */
257 		out_8(&pm->pmcr0, 25);
258 		clrbits_8(&gpio->par_uart1,
259 			~(GPIO_PAR_UART1_U1RXD_MASK | GPIO_PAR_UART1_U1TXD_MASK));
260 		setbits_8(&gpio->par_uart1,
261 			GPIO_PAR_UART1_U1RXD_U1RXD | GPIO_PAR_UART1_U1TXD_U1TXD);
262 		break;
263 	case 2:
264 		/* UART2 */
265 		out_8(&pm->pmcr0, 26);
266 		clrbits_8(&gpio->par_uart2,
267 			~(GPIO_PAR_UART2_U2RXD_MASK | GPIO_PAR_UART2_U2TXD_MASK));
268 		setbits_8(&gpio->par_uart2,
269 			GPIO_PAR_UART2_U2RXD_U2RXD | GPIO_PAR_UART2_U2TXD_U2TXD);
270 		break;
271 	case 3:
272 		/* UART3 */
273 		out_8(&pm->pmcr0, 27);
274 		clrbits_8(&gpio->par_dspi0,
275 			~(GPIO_PAR_DSPI0_SIN_MASK | GPIO_PAR_DSPI0_SOUT_MASK));
276 		setbits_8(&gpio->par_dspi0,
277 			GPIO_PAR_DSPI0_SIN_U3RXD | GPIO_PAR_DSPI0_SOUT_U3TXD);
278 		break;
279 	case 4:
280 		/* UART4 */
281 		out_8(&pm->pmcr1, 24);
282 		clrbits_8(&gpio->par_uart0,
283 			~(GPIO_PAR_UART0_U0CTS_MASK | GPIO_PAR_UART0_U0RTS_MASK));
284 		setbits_8(&gpio->par_uart0,
285 			GPIO_PAR_UART0_U0CTS_U4TXD | GPIO_PAR_UART0_U0RTS_U4RXD);
286 		break;
287 	case 5:
288 		/* UART5 */
289 		out_8(&pm->pmcr1, 25);
290 		clrbits_8(&gpio->par_uart1,
291 			~(GPIO_PAR_UART1_U1CTS_MASK | GPIO_PAR_UART1_U1RTS_MASK));
292 		setbits_8(&gpio->par_uart1,
293 			GPIO_PAR_UART1_U1CTS_U5TXD | GPIO_PAR_UART1_U1RTS_U5RXD);
294 		break;
295 	case 6:
296 		/* UART6 */
297 		out_8(&pm->pmcr1, 26);
298 		clrbits_8(&gpio->par_uart2,
299 			~(GPIO_PAR_UART2_U2CTS_MASK | GPIO_PAR_UART2_U2RTS_MASK));
300 		setbits_8(&gpio->par_uart2,
301 			GPIO_PAR_UART2_U2CTS_U6TXD | GPIO_PAR_UART2_U2RTS_U6RXD);
302 		break;
303 	case 7:
304 		/* UART7 */
305 		out_8(&pm->pmcr1, 27);
306 		clrbits_8(&gpio->par_ssi0h, ~GPIO_PAR_SSI0H_RXD_MASK);
307 		clrbits_8(&gpio->par_ssi0l, ~GPIO_PAR_SSI0L_BCLK_MASK);
308 		setbits_8(&gpio->par_ssi0h, GPIO_PAR_SSI0H_FS_U7TXD);
309 		setbits_8(&gpio->par_ssi0l, GPIO_PAR_SSI0L_BCLK_U7RXD);
310 		break;
311 	case 8:
312 		/* UART8 */
313 		out_8(&pm->pmcr0, 28);
314 		clrbits_8(&gpio->par_cani2c,
315 			~(GPIO_PAR_CANI2C_I2C0SCL_MASK | GPIO_PAR_CANI2C_I2C0SDA_MASK));
316 		setbits_8(&gpio->par_cani2c,
317 			GPIO_PAR_CANI2C_I2C0SCL_U8TXD | GPIO_PAR_CANI2C_I2C0SDA_U8RXD);
318 		break;
319 	case 9:
320 		/* UART9 */
321 		out_8(&pm->pmcr1, 29);
322 		clrbits_8(&gpio->par_cani2c,
323 			~(GPIO_PAR_CANI2C_CAN1TX_MASK | GPIO_PAR_CANI2C_CAN1RX_MASK));
324 		setbits_8(&gpio->par_cani2c,
325 			GPIO_PAR_CANI2C_CAN1TX_U9TXD | GPIO_PAR_CANI2C_CAN1RX_U9RXD);
326 		break;
327 #endif
328 #ifdef CONFIG_MCF5445x
329 	case 0:
330 		clrbits_8(&gpio->par_uart,
331 			GPIO_PAR_UART_U0TXD_U0TXD | GPIO_PAR_UART_U0RXD_U0RXD);
332 		setbits_8(&gpio->par_uart,
333 			GPIO_PAR_UART_U0TXD_U0TXD | GPIO_PAR_UART_U0RXD_U0RXD);
334 		break;
335 	case 1:
336 #ifdef CONFIG_SYS_UART1_PRI_GPIO
337 		clrbits_8(&gpio->par_uart,
338 			GPIO_PAR_UART_U1TXD_U1TXD | GPIO_PAR_UART_U1RXD_U1RXD);
339 		setbits_8(&gpio->par_uart,
340 			GPIO_PAR_UART_U1TXD_U1TXD | GPIO_PAR_UART_U1RXD_U1RXD);
341 #elif defined(CONFIG_SYS_UART1_ALT1_GPIO)
342 		clrbits_be16(&gpio->par_ssi,
343 			~(GPIO_PAR_SSI_SRXD_UNMASK | GPIO_PAR_SSI_STXD_UNMASK));
344 		setbits_be16(&gpio->par_ssi,
345 			GPIO_PAR_SSI_SRXD_U1RXD | GPIO_PAR_SSI_STXD_U1TXD);
346 #endif
347 		break;
348 	case 2:
349 #if defined(CONFIG_SYS_UART2_ALT1_GPIO)
350 		clrbits_8(&gpio->par_timer,
351 			~(GPIO_PAR_TIMER_T3IN_UNMASK | GPIO_PAR_TIMER_T2IN_UNMASK));
352 		setbits_8(&gpio->par_timer,
353 			GPIO_PAR_TIMER_T3IN_U2RXD | GPIO_PAR_TIMER_T2IN_U2TXD);
354 #elif defined(CONFIG_SYS_UART2_ALT2_GPIO)
355 		clrbits_8(&gpio->par_timer,
356 			~(GPIO_PAR_FECI2C_SCL_UNMASK | GPIO_PAR_FECI2C_SDA_UNMASK));
357 		setbits_8(&gpio->par_timer,
358 			GPIO_PAR_FECI2C_SCL_U2TXD | GPIO_PAR_FECI2C_SDA_U2RXD);
359 #endif
360 		break;
361 #endif	/* CONFIG_MCF5445x */
362 	}
363 }
364 
365 #if defined(CONFIG_CMD_NET)
366 int fecpin_setclear(struct eth_device *dev, int setclear)
367 {
368 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
369 #ifdef CONFIG_MCF5445x
370 	struct fec_info_s *info = (struct fec_info_s *)dev->priv;
371 
372 	if (setclear) {
373 #ifdef CONFIG_SYS_FEC_NO_SHARED_PHY
374 		if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
375 			setbits_be16(&gpio->par_feci2c,
376 				GPIO_PAR_FECI2C_MDC0_MDC0 |
377 				GPIO_PAR_FECI2C_MDIO0_MDIO0);
378 		else
379 			setbits_be16(&gpio->par_feci2c,
380 				GPIO_PAR_FECI2C_MDC1_MDC1 |
381 				GPIO_PAR_FECI2C_MDIO1_MDIO1);
382 #else
383 		setbits_be16(&gpio->par_feci2c,
384 			GPIO_PAR_FECI2C_MDC0_MDC0 | GPIO_PAR_FECI2C_MDIO0_MDIO0);
385 #endif
386 
387 		if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
388 			setbits_8(&gpio->par_fec, GPIO_PAR_FEC_FEC0_RMII_GPIO);
389 		else
390 			setbits_8(&gpio->par_fec, GPIO_PAR_FEC_FEC1_RMII_ATA);
391 	} else {
392 		clrbits_be16(&gpio->par_feci2c,
393 			GPIO_PAR_FECI2C_MDC0_MDC0 | GPIO_PAR_FECI2C_MDIO0_MDIO0);
394 
395 		if (info->iobase == CONFIG_SYS_FEC0_IOBASE) {
396 #ifdef CONFIG_SYS_FEC_FULL_MII
397 			setbits_8(&gpio->par_fec, GPIO_PAR_FEC_FEC0_MII);
398 #else
399 			clrbits_8(&gpio->par_fec, ~GPIO_PAR_FEC_FEC0_UNMASK);
400 #endif
401 		} else {
402 #ifdef CONFIG_SYS_FEC_FULL_MII
403 			setbits_8(&gpio->par_fec, GPIO_PAR_FEC_FEC1_MII);
404 #else
405 			clrbits_8(&gpio->par_fec, ~GPIO_PAR_FEC_FEC1_UNMASK);
406 #endif
407 		}
408 	}
409 #endif	/* CONFIG_MCF5445x */
410 
411 #ifdef CONFIG_MCF5441x
412 	if (setclear) {
413 		out_8(&gpio->par_fec, 0x03);
414 		out_8(&gpio->srcr_fec, 0x0F);
415 		clrsetbits_8(&gpio->par_simp0h, ~GPIO_PAR_SIMP0H_DAT_MASK,
416 			GPIO_PAR_SIMP0H_DAT_GPIO);
417 		clrsetbits_8(&gpio->pddr_g, ~GPIO_PDDR_G4_MASK,
418 			GPIO_PDDR_G4_OUTPUT);
419 		clrbits_8(&gpio->podr_g, ~GPIO_PODR_G4_MASK);
420 
421 	} else
422 		clrbits_8(&gpio->par_fec, ~GPIO_PAR_FEC_FEC_MASK);
423 #endif
424 	return 0;
425 }
426 #endif
427 
428 #ifdef CONFIG_CF_DSPI
429 void cfspi_port_conf(void)
430 {
431 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
432 
433 #ifdef CONFIG_MCF5445x
434 	out_8(&gpio->par_dspi,
435 		GPIO_PAR_DSPI_SIN_SIN |
436 		GPIO_PAR_DSPI_SOUT_SOUT |
437 		GPIO_PAR_DSPI_SCK_SCK);
438 #endif
439 
440 #ifdef CONFIG_MCF5441x
441 	pm_t *pm = (pm_t *) MMAP_PM;
442 
443 	out_8(&gpio->par_dspi0,
444 		GPIO_PAR_DSPI0_SIN_DSPI0SIN | GPIO_PAR_DSPI0_SOUT_DSPI0SOUT |
445 		GPIO_PAR_DSPI0_SCK_DSPI0SCK);
446 	out_8(&gpio->srcr_dspiow, 3);
447 
448 	/* DSPI0 */
449 	out_8(&pm->pmcr0, 23);
450 #endif
451 }
452 
453 int cfspi_claim_bus(uint bus, uint cs)
454 {
455 	dspi_t *dspi = (dspi_t *) MMAP_DSPI;
456 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
457 
458 	if ((in_be32(&dspi->sr) & DSPI_SR_TXRXS) != DSPI_SR_TXRXS)
459 		return -1;
460 
461 	/* Clear FIFO and resume transfer */
462 	clrbits_be32(&dspi->mcr, DSPI_MCR_CTXF | DSPI_MCR_CRXF);
463 
464 #ifdef CONFIG_MCF5445x
465 	switch (cs) {
466 	case 0:
467 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS0_PCS0);
468 		setbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS0_PCS0);
469 		break;
470 	case 1:
471 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS1_PCS1);
472 		setbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS1_PCS1);
473 		break;
474 	case 2:
475 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS2_PCS2);
476 		setbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS2_PCS2);
477 		break;
478 	case 3:
479 		clrbits_8(&gpio->par_dma, ~GPIO_PAR_DMA_DACK0_UNMASK);
480 		setbits_8(&gpio->par_dma, GPIO_PAR_DMA_DACK0_PCS3);
481 		break;
482 	case 5:
483 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS5_PCS5);
484 		setbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS5_PCS5);
485 		break;
486 	}
487 #endif
488 
489 #ifdef CONFIG_MCF5441x
490 	switch (cs) {
491 	case 0:
492 		clrbits_8(&gpio->par_dspi0, ~GPIO_PAR_DSPI0_PCS0_MASK);
493 		setbits_8(&gpio->par_dspi0, GPIO_PAR_DSPI0_PCS0_DSPI0PCS0);
494 		break;
495 	case 1:
496 		clrbits_8(&gpio->par_dspiow, GPIO_PAR_DSPIOW_DSPI0PSC1);
497 		setbits_8(&gpio->par_dspiow, GPIO_PAR_DSPIOW_DSPI0PSC1);
498 		break;
499 	}
500 #endif
501 
502 	return 0;
503 }
504 
505 void cfspi_release_bus(uint bus, uint cs)
506 {
507 	dspi_t *dspi = (dspi_t *) MMAP_DSPI;
508 	gpio_t *gpio = (gpio_t *) MMAP_GPIO;
509 
510 	/* Clear FIFO */
511 	clrbits_be32(&dspi->mcr, DSPI_MCR_CTXF | DSPI_MCR_CRXF);
512 
513 #ifdef CONFIG_MCF5445x
514 	switch (cs) {
515 	case 0:
516 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS0_PCS0);
517 		break;
518 	case 1:
519 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS1_PCS1);
520 		break;
521 	case 2:
522 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS2_PCS2);
523 		break;
524 	case 3:
525 		clrbits_8(&gpio->par_dma, ~GPIO_PAR_DMA_DACK0_UNMASK);
526 		break;
527 	case 5:
528 		clrbits_8(&gpio->par_dspi, GPIO_PAR_DSPI_PCS5_PCS5);
529 		break;
530 	}
531 #endif
532 
533 #ifdef CONFIG_MCF5441x
534 	if (cs == 1)
535 		clrbits_8(&gpio->par_dspiow, GPIO_PAR_DSPIOW_DSPI0PSC1);
536 #endif
537 }
538 #endif
539