Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *	m53xx.c -- platform support for ColdFire 53xx based boards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *	Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *	Copyright (C) 2000, Lineo (www.lineo.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  *	Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *	Copyright Freescale Semiconductor, Inc 2006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *	Copyright (c) 2006, emlix, Sebastian Hess <shess@hessware.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <linux/param.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <asm/machdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <asm/coldfire.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <asm/mcfsim.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <asm/mcfuart.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <asm/mcfdma.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #include <asm/mcfwdebug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #include <asm/mcfclk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) DEFINE_CLK(0, "flexbus", 2, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) DEFINE_CLK(0, "mcfcan.0", 8, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) DEFINE_CLK(0, "fec.0", 12, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) DEFINE_CLK(0, "edma", 17, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) DEFINE_CLK(0, "intc.0", 18, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) DEFINE_CLK(0, "intc.1", 19, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) DEFINE_CLK(0, "iack.0", 21, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) DEFINE_CLK(0, "imx1-i2c.0", 22, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) DEFINE_CLK(0, "mcfqspi.0", 23, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) DEFINE_CLK(0, "mcfuart.0", 24, MCF_BUSCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) DEFINE_CLK(0, "mcfuart.1", 25, MCF_BUSCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) DEFINE_CLK(0, "mcfuart.2", 26, MCF_BUSCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) DEFINE_CLK(0, "mcftmr.0", 28, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) DEFINE_CLK(0, "mcftmr.1", 29, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) DEFINE_CLK(0, "mcftmr.2", 30, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) DEFINE_CLK(0, "mcftmr.3", 31, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) DEFINE_CLK(0, "mcfpit.0", 32, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) DEFINE_CLK(0, "mcfpit.1", 33, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) DEFINE_CLK(0, "mcfpit.2", 34, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) DEFINE_CLK(0, "mcfpit.3", 35, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) DEFINE_CLK(0, "mcfpwm.0", 36, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) DEFINE_CLK(0, "mcfeport.0", 37, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) DEFINE_CLK(0, "mcfwdt.0", 38, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) DEFINE_CLK(0, "sys.0", 40, MCF_BUSCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) DEFINE_CLK(0, "gpio.0", 41, MCF_BUSCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) DEFINE_CLK(0, "mcfrtc.0", 42, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) DEFINE_CLK(0, "mcflcd.0", 43, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) DEFINE_CLK(0, "mcfusb-otg.0", 44, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) DEFINE_CLK(0, "mcfusb-host.0", 45, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) DEFINE_CLK(0, "sdram.0", 46, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) DEFINE_CLK(0, "ssi.0", 47, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) DEFINE_CLK(0, "pll.0", 48, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) DEFINE_CLK(1, "mdha.0", 32, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) DEFINE_CLK(1, "skha.0", 33, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) DEFINE_CLK(1, "rng.0", 34, MCF_CLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) struct clk *mcf_clks[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	&__clk_0_2,	/* flexbus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	&__clk_0_8,	/* mcfcan.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	&__clk_0_12,	/* fec.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	&__clk_0_17,	/* edma */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	&__clk_0_18,	/* intc.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	&__clk_0_19,	/* intc.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	&__clk_0_21,	/* iack.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	&__clk_0_22,	/* imx1-i2c.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	&__clk_0_23,	/* mcfqspi.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	&__clk_0_24,	/* mcfuart.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	&__clk_0_25,	/* mcfuart.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	&__clk_0_26,	/* mcfuart.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	&__clk_0_28,	/* mcftmr.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	&__clk_0_29,	/* mcftmr.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	&__clk_0_30,	/* mcftmr.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	&__clk_0_31,	/* mcftmr.3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	&__clk_0_32,	/* mcfpit.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	&__clk_0_33,	/* mcfpit.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	&__clk_0_34,	/* mcfpit.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	&__clk_0_35,	/* mcfpit.3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	&__clk_0_36,	/* mcfpwm.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	&__clk_0_37,	/* mcfeport.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	&__clk_0_38,	/* mcfwdt.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	&__clk_0_40,	/* sys.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	&__clk_0_41,	/* gpio.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	&__clk_0_42,	/* mcfrtc.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	&__clk_0_43,	/* mcflcd.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	&__clk_0_44,	/* mcfusb-otg.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	&__clk_0_45,	/* mcfusb-host.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	&__clk_0_46,	/* sdram.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	&__clk_0_47,	/* ssi.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	&__clk_0_48,	/* pll.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	&__clk_1_32,	/* mdha.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	&__clk_1_33,	/* skha.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	&__clk_1_34,	/* rng.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static struct clk * const enable_clks[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	&__clk_0_2,	/* flexbus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	&__clk_0_18,	/* intc.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	&__clk_0_19,	/* intc.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	&__clk_0_21,	/* iack.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	&__clk_0_24,	/* mcfuart.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	&__clk_0_25,	/* mcfuart.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	&__clk_0_26,	/* mcfuart.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	&__clk_0_28,	/* mcftmr.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	&__clk_0_29,	/* mcftmr.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	&__clk_0_32,	/* mcfpit.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	&__clk_0_33,	/* mcfpit.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	&__clk_0_37,	/* mcfeport.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	&__clk_0_40,	/* sys.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	&__clk_0_41,	/* gpio.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	&__clk_0_46,	/* sdram.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	&__clk_0_48,	/* pll.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) static struct clk * const disable_clks[] __initconst = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	&__clk_0_8,	/* mcfcan.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	&__clk_0_12,	/* fec.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	&__clk_0_17,	/* edma */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	&__clk_0_22,	/* imx1-i2c.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	&__clk_0_23,	/* mcfqspi.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	&__clk_0_30,	/* mcftmr.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	&__clk_0_31,	/* mcftmr.3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	&__clk_0_34,	/* mcfpit.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	&__clk_0_35,	/* mcfpit.3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	&__clk_0_36,	/* mcfpwm.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	&__clk_0_38,	/* mcfwdt.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	&__clk_0_42,	/* mcfrtc.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	&__clk_0_43,	/* mcflcd.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	&__clk_0_44,	/* mcfusb-otg.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	&__clk_0_45,	/* mcfusb-host.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	&__clk_0_47,	/* ssi.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	&__clk_1_32,	/* mdha.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	&__clk_1_33,	/* skha.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	&__clk_1_34,	/* rng.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) static void __init m53xx_clk_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	unsigned i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	/* make sure these clocks are enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	for (i = 0; i < ARRAY_SIZE(enable_clks); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 		__clk_init_enabled(enable_clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	/* make sure these clocks are disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		__clk_init_disabled(disable_clks[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static void __init m53xx_qspi_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	/* setup QSPS pins for QSPI with gpio CS control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	writew(0x01f0, MCFGPIO_PAR_QSPI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static void __init m53xx_i2c_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #if IS_ENABLED(CONFIG_I2C_IMX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	/* setup Port AS Pin Assignment Register for I2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	/*  set PASPA0 to SCL and PASPA1 to SDA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	u8 r = readb(MCFGPIO_PAR_FECI2C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	r |= 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	writeb(r, MCFGPIO_PAR_FECI2C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #endif /* IS_ENABLED(CONFIG_I2C_IMX) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static void __init m53xx_uarts_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	/* UART GPIO initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	writew(readw(MCFGPIO_PAR_UART) | 0x0FFF, MCFGPIO_PAR_UART);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static void __init m53xx_fec_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	u8 v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	/* Set multi-function pins to ethernet mode for fec0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	v = readb(MCFGPIO_PAR_FECI2C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	v |= MCF_GPIO_PAR_FECI2C_PAR_MDC_EMDC |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		MCF_GPIO_PAR_FECI2C_PAR_MDIO_EMDIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	writeb(v, MCFGPIO_PAR_FECI2C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	v = readb(MCFGPIO_PAR_FEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	v = MCF_GPIO_PAR_FEC_PAR_FEC_7W_FEC | MCF_GPIO_PAR_FEC_PAR_FEC_MII_FEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	writeb(v, MCFGPIO_PAR_FEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) void __init config_BSP(char *commandp, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #if !defined(CONFIG_BOOTPARAM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	/* Copy command line from FLASH to local buffer... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	memcpy(commandp, (char *) 0x4000, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	if(strncmp(commandp, "kcl ", 4) == 0){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		memcpy(commandp, (char *) 0x4004, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		commandp[size-1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		memset(commandp, 0, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	mach_sched_init = hw_timer_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	m53xx_clk_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	m53xx_uarts_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	m53xx_fec_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	m53xx_qspi_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	m53xx_i2c_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #ifdef CONFIG_BDM_DISABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	 * Disable the BDM clocking.  This also turns off most of the rest of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	 * the BDM device.  This is good for EMC reasons. This option is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	 * incompatible with the memory protection option.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	wdebug(MCFDEBUG_CSR, MCFDEBUG_CSR_PSTCLK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* Board initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) /***************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) /* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)  * PLL min/max specifications
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #define MAX_FVCO	500000	/* KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define MAX_FSYS	80000 	/* KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) #define MIN_FSYS	58333 	/* KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #define FREF		16000   /* KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #define MAX_MFD		135     /* Multiplier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) #define MIN_MFD		88      /* Multiplier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define BUSDIV		6       /* Divider */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)  * Low Power Divider specifications
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #define MIN_LPD		(1 << 0)    /* Divider (not encoded) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #define MAX_LPD		(1 << 15)   /* Divider (not encoded) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define DEFAULT_LPD	(1 << 1)	/* Divider (not encoded) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) #define SYS_CLK_KHZ	80000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #define SYSTEM_PERIOD	12.5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)  *  SDRAM Timing Parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)  */  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #define SDRAM_BL	8	/* # of beats in a burst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define SDRAM_TWR	2	/* in clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) #define SDRAM_CASL	2.5	/* CASL in clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) #define SDRAM_TRCD	2	/* in clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #define SDRAM_TRP	2	/* in clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) #define SDRAM_TRFC	7	/* in clocks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define SDRAM_TREFI	7800	/* in ns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define EXT_SRAM_ADDRESS	(0xC0000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define FLASH_ADDRESS		(0x00000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define SDRAM_ADDRESS		(0x40000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define NAND_FLASH_ADDRESS	(0xD0000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) void wtm_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) void scm_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) void gpio_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) void fbcs_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) void sdramc_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) int  clock_pll (int fsys, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int  clock_limp (int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) int  clock_exit_limp (void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) int  get_sys_clock (void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) asmlinkage void __init sysinit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	clock_pll(0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	wtm_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	scm_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	gpio_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	fbcs_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	sdramc_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) void wtm_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	/* Disable watchdog timer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	writew(0, MCF_WTM_WCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) #define MCF_SCM_BCR_GBW		(0x00000100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define MCF_SCM_BCR_GBR		(0x00000200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) void scm_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	/* All masters are trusted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	writel(0x77777777, MCF_SCM_MPR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	/* Allow supervisor/user, read/write, and trusted/untrusted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	   access to all slaves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	writel(0, MCF_SCM_PACRA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	writel(0, MCF_SCM_PACRB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	writel(0, MCF_SCM_PACRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	writel(0, MCF_SCM_PACRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	writel(0, MCF_SCM_PACRE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	writel(0, MCF_SCM_PACRF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	/* Enable bursts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	writel(MCF_SCM_BCR_GBR | MCF_SCM_BCR_GBW, MCF_SCM_BCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) void fbcs_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	writeb(0x3E, MCFGPIO_PAR_CS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	/* Latch chip select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	writel(0x10080000, MCF_FBCS1_CSAR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	writel(0x002A3780, MCF_FBCS1_CSCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	writel(MCF_FBCS_CSMR_BAM_2M | MCF_FBCS_CSMR_V, MCF_FBCS1_CSMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	/* Initialize latch to drive signals to inactive states */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	writew(0xffff, 0x10080000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	/* External SRAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	writel(EXT_SRAM_ADDRESS, MCF_FBCS1_CSAR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	writel(MCF_FBCS_CSCR_PS_16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 		MCF_FBCS_CSCR_AA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 		MCF_FBCS_CSCR_SBM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 		MCF_FBCS_CSCR_WS(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		MCF_FBCS1_CSCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	writel(MCF_FBCS_CSMR_BAM_512K | MCF_FBCS_CSMR_V, MCF_FBCS1_CSMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	/* Boot Flash connected to FBCS0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	writel(FLASH_ADDRESS, MCF_FBCS0_CSAR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	writel(MCF_FBCS_CSCR_PS_16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 		MCF_FBCS_CSCR_BEM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 		MCF_FBCS_CSCR_AA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 		MCF_FBCS_CSCR_SBM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 		MCF_FBCS_CSCR_WS(7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 		MCF_FBCS0_CSCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	writel(MCF_FBCS_CSMR_BAM_32M | MCF_FBCS_CSMR_V, MCF_FBCS0_CSMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) void sdramc_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	 * Check to see if the SDRAM has already been initialized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	 * by a run control tool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	if (!(readl(MCF_SDRAMC_SDCR) & MCF_SDRAMC_SDCR_REF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		/* SDRAM chip select initialization */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		/* Initialize SDRAM chip select */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		writel(MCF_SDRAMC_SDCS_BA(SDRAM_ADDRESS) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 			MCF_SDRAMC_SDCS_CSSZ(MCF_SDRAMC_SDCS_CSSZ_32MBYTE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 			MCF_SDRAMC_SDCS0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	 * Basic configuration and initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	writel(MCF_SDRAMC_SDCFG1_SRD2RW((int)((SDRAM_CASL + 2) + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 		MCF_SDRAMC_SDCFG1_SWT2RD(SDRAM_TWR + 1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 		MCF_SDRAMC_SDCFG1_RDLAT((int)((SDRAM_CASL * 2) + 2)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		MCF_SDRAMC_SDCFG1_ACT2RW((int)(SDRAM_TRCD + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		MCF_SDRAMC_SDCFG1_PRE2ACT((int)(SDRAM_TRP + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 		MCF_SDRAMC_SDCFG1_REF2ACT((int)(SDRAM_TRFC + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		MCF_SDRAMC_SDCFG1_WTLAT(3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		MCF_SDRAMC_SDCFG1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	writel(MCF_SDRAMC_SDCFG2_BRD2PRE(SDRAM_BL / 2 + 1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 		MCF_SDRAMC_SDCFG2_BWT2RW(SDRAM_BL / 2 + SDRAM_TWR) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 		MCF_SDRAMC_SDCFG2_BRD2WT((int)((SDRAM_CASL + SDRAM_BL / 2 - 1.0) + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 		MCF_SDRAMC_SDCFG2_BL(SDRAM_BL - 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 		MCF_SDRAMC_SDCFG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)             
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	 * Precharge and enable write to SDMR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	writel(MCF_SDRAMC_SDCR_MODE_EN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 		MCF_SDRAMC_SDCR_CKE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 		MCF_SDRAMC_SDCR_DDR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 		MCF_SDRAMC_SDCR_MUX(1) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 		MCF_SDRAMC_SDCR_RCNT((int)(((SDRAM_TREFI / (SYSTEM_PERIOD * 64)) - 1) + 0.5)) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 		MCF_SDRAMC_SDCR_PS_16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 		MCF_SDRAMC_SDCR_IPALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 		MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	 * Write extended mode register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	writel(MCF_SDRAMC_SDMR_BNKAD_LEMR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 		MCF_SDRAMC_SDMR_AD(0x0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		MCF_SDRAMC_SDMR_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 		MCF_SDRAMC_SDMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	 * Write mode register and reset DLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	writel(MCF_SDRAMC_SDMR_BNKAD_LMR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 		MCF_SDRAMC_SDMR_AD(0x163) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 		MCF_SDRAMC_SDMR_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 		MCF_SDRAMC_SDMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	 * Execute a PALL command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	writel(readl(MCF_SDRAMC_SDCR) | MCF_SDRAMC_SDCR_IPALL, MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	 * Perform two REF cycles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	writel(readl(MCF_SDRAMC_SDCR) | MCF_SDRAMC_SDCR_IREF, MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	writel(readl(MCF_SDRAMC_SDCR) | MCF_SDRAMC_SDCR_IREF, MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	 * Write mode register and clear reset DLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	writel(MCF_SDRAMC_SDMR_BNKAD_LMR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 		MCF_SDRAMC_SDMR_AD(0x063) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 		MCF_SDRAMC_SDMR_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		MCF_SDRAMC_SDMR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 				
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	 * Enable auto refresh and lock SDMR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	writel(readl(MCF_SDRAMC_SDCR) & ~MCF_SDRAMC_SDCR_MODE_EN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 		MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	writel(MCF_SDRAMC_SDCR_REF | MCF_SDRAMC_SDCR_DQS_OE(0xC),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 		MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) void gpio_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	/* Enable UART0 pins */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	writew(MCF_GPIO_PAR_UART_PAR_URXD0 | MCF_GPIO_PAR_UART_PAR_UTXD0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 		MCFGPIO_PAR_UART);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	 * Initialize TIN3 as a GPIO output to enable the write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	 * half of the latch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	writeb(0x00, MCFGPIO_PAR_TIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	writeb(0x08, MCFGPIO_PDDR_TIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	writeb(0x00, MCFGPIO_PCLRR_TIMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int clock_pll(int fsys, int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	int fref, temp, fout, mfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	fref = FREF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)         
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 	if (fsys == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 		/* Return current PLL output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 		mfd = readb(MCF_PLL_PFDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 		return (fref * mfd / (BUSDIV * 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	/* Check bounds of requested system clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	if (fsys > MAX_FSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 		fsys = MAX_FSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	if (fsys < MIN_FSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 		fsys = MIN_FSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	/* Multiplying by 100 when calculating the temp value,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	   and then dividing by 100 to calculate the mfd allows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 	   for exact values without needing to include floating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	   point libraries. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	temp = 100 * fsys / fref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	mfd = 4 * BUSDIV * temp / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)     	    	    	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	/* Determine the output frequency for selected values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	fout = (fref * mfd / (BUSDIV * 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	 * Check to see if the SDRAM has already been initialized.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	 * If it has then the SDRAM needs to be put into self refresh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	 * mode before reprogramming the PLL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 	if (readl(MCF_SDRAMC_SDCR) & MCF_SDRAMC_SDCR_REF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 		/* Put SDRAM into self refresh mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 		writel(readl(MCF_SDRAMC_SDCR) & ~MCF_SDRAMC_SDCR_CKE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 			MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	 * Initialize the PLL to generate the new system clock frequency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	 * The device must be put into LIMP mode to reprogram the PLL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 	/* Enter LIMP mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	clock_limp(DEFAULT_LPD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)      					
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	/* Reprogram PLL for desired fsys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	writeb(MCF_PLL_PODR_CPUDIV(BUSDIV/3) | MCF_PLL_PODR_BUSDIV(BUSDIV),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 		MCF_PLL_PODR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 						
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	writeb(mfd, MCF_PLL_PFDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 		
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	/* Exit LIMP mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	clock_exit_limp();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	 * Return the SDRAM to normal operation if it is in use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	if (readl(MCF_SDRAMC_SDCR) & MCF_SDRAMC_SDCR_REF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 		/* Exit self refresh mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 		writel(readl(MCF_SDRAMC_SDCR) | MCF_SDRAMC_SDCR_CKE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 			MCF_SDRAMC_SDCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	/* Errata - workaround for SDRAM opeartion after exiting LIMP mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	writel(MCF_SDRAMC_REFRESH, MCF_SDRAMC_LIMP_FIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	/* wait for DQS logic to relock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 	for (i = 0; i < 0x200; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	return fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) int clock_limp(int div)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	u32 temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	/* Check bounds of divider */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	if (div < MIN_LPD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 		div = MIN_LPD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	if (div > MAX_LPD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 		div = MAX_LPD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	/* Save of the current value of the SSIDIV so we don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	   overwrite the value*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	temp = readw(MCF_CCM_CDR) & MCF_CCM_CDR_SSIDIV(0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)       
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	/* Apply the divider to the system clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	writew(MCF_CCM_CDR_LPDIV(div) | MCF_CCM_CDR_SSIDIV(temp), MCF_CCM_CDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	writew(readw(MCF_CCM_MISCCR) | MCF_CCM_MISCCR_LIMP, MCF_CCM_MISCCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	return (FREF/(3*(1 << div)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) int clock_exit_limp(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	int fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	/* Exit LIMP mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 	writew(readw(MCF_CCM_MISCCR) & ~MCF_CCM_MISCCR_LIMP, MCF_CCM_MISCCR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	/* Wait for PLL to lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	while (!(readw(MCF_CCM_MISCCR) & MCF_CCM_MISCCR_PLL_LOCK))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	fout = get_sys_clock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	return fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) int get_sys_clock(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 	int divider;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 	/* Test to see if device is in LIMP mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	if (readw(MCF_CCM_MISCCR) & MCF_CCM_MISCCR_LIMP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 		divider = readw(MCF_CCM_CDR) & MCF_CCM_CDR_LPDIV(0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 		return (FREF/(2 << divider));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 		return (FREF * readb(MCF_PLL_PFDR)) / (BUSDIV * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) }