162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/***************************************************************************/
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci *  m520x.c  -- platform support for ColdFire 520x based boards
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *  Copyright (C) 2005,      Freescale (www.freescale.com)
862306a36Sopenharmony_ci *  Copyright (C) 2005,      Intec Automation (mike@steroidmicros.com)
962306a36Sopenharmony_ci *  Copyright (C) 1999-2007, Greg Ungerer (gerg@snapgear.com)
1062306a36Sopenharmony_ci *  Copyright (C) 2001-2003, SnapGear Inc. (www.snapgear.com)
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/***************************************************************************/
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/clkdev.h>
1662306a36Sopenharmony_ci#include <linux/kernel.h>
1762306a36Sopenharmony_ci#include <linux/param.h>
1862306a36Sopenharmony_ci#include <linux/init.h>
1962306a36Sopenharmony_ci#include <linux/io.h>
2062306a36Sopenharmony_ci#include <asm/machdep.h>
2162306a36Sopenharmony_ci#include <asm/coldfire.h>
2262306a36Sopenharmony_ci#include <asm/mcfsim.h>
2362306a36Sopenharmony_ci#include <asm/mcfuart.h>
2462306a36Sopenharmony_ci#include <asm/mcfclk.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/***************************************************************************/
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciDEFINE_CLK(0, "flexbus", 2, MCF_CLK);
2962306a36Sopenharmony_ciDEFINE_CLK(0, "fec.0", 12, MCF_CLK);
3062306a36Sopenharmony_ciDEFINE_CLK(0, "edma", 17, MCF_CLK);
3162306a36Sopenharmony_ciDEFINE_CLK(0, "intc.0", 18, MCF_CLK);
3262306a36Sopenharmony_ciDEFINE_CLK(0, "iack.0", 21, MCF_CLK);
3362306a36Sopenharmony_ciDEFINE_CLK(0, "imx1-i2c.0", 22, MCF_CLK);
3462306a36Sopenharmony_ciDEFINE_CLK(0, "mcfqspi.0", 23, MCF_CLK);
3562306a36Sopenharmony_ciDEFINE_CLK(0, "mcfuart.0", 24, MCF_BUSCLK);
3662306a36Sopenharmony_ciDEFINE_CLK(0, "mcfuart.1", 25, MCF_BUSCLK);
3762306a36Sopenharmony_ciDEFINE_CLK(0, "mcfuart.2", 26, MCF_BUSCLK);
3862306a36Sopenharmony_ciDEFINE_CLK(0, "mcftmr.0", 28, MCF_CLK);
3962306a36Sopenharmony_ciDEFINE_CLK(0, "mcftmr.1", 29, MCF_CLK);
4062306a36Sopenharmony_ciDEFINE_CLK(0, "mcftmr.2", 30, MCF_CLK);
4162306a36Sopenharmony_ciDEFINE_CLK(0, "mcftmr.3", 31, MCF_CLK);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciDEFINE_CLK(0, "mcfpit.0", 32, MCF_CLK);
4462306a36Sopenharmony_ciDEFINE_CLK(0, "mcfpit.1", 33, MCF_CLK);
4562306a36Sopenharmony_ciDEFINE_CLK(0, "mcfeport.0", 34, MCF_CLK);
4662306a36Sopenharmony_ciDEFINE_CLK(0, "mcfwdt.0", 35, MCF_CLK);
4762306a36Sopenharmony_ciDEFINE_CLK(0, "pll.0", 36, MCF_CLK);
4862306a36Sopenharmony_ciDEFINE_CLK(0, "sys.0", 40, MCF_BUSCLK);
4962306a36Sopenharmony_ciDEFINE_CLK(0, "gpio.0", 41, MCF_BUSCLK);
5062306a36Sopenharmony_ciDEFINE_CLK(0, "sdram.0", 42, MCF_CLK);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic struct clk_lookup m520x_clk_lookup[] = {
5362306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "flexbus", &__clk_0_2),
5462306a36Sopenharmony_ci	CLKDEV_INIT("fec.0", NULL, &__clk_0_12),
5562306a36Sopenharmony_ci	CLKDEV_INIT("edma", NULL, &__clk_0_17),
5662306a36Sopenharmony_ci	CLKDEV_INIT("intc.0", NULL, &__clk_0_18),
5762306a36Sopenharmony_ci	CLKDEV_INIT("iack.0", NULL, &__clk_0_21),
5862306a36Sopenharmony_ci	CLKDEV_INIT("imx1-i2c.0", NULL, &__clk_0_22),
5962306a36Sopenharmony_ci	CLKDEV_INIT("mcfqspi.0", NULL, &__clk_0_23),
6062306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.0", NULL, &__clk_0_24),
6162306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.1", NULL, &__clk_0_25),
6262306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.2", NULL, &__clk_0_26),
6362306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.0", NULL, &__clk_0_28),
6462306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.1", NULL, &__clk_0_29),
6562306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.2", NULL, &__clk_0_30),
6662306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.3", NULL, &__clk_0_31),
6762306a36Sopenharmony_ci	CLKDEV_INIT("mcfpit.0", NULL, &__clk_0_32),
6862306a36Sopenharmony_ci	CLKDEV_INIT("mcfpit.1", NULL, &__clk_0_33),
6962306a36Sopenharmony_ci	CLKDEV_INIT("mcfeport.0", NULL, &__clk_0_34),
7062306a36Sopenharmony_ci	CLKDEV_INIT("mcfwdt.0", NULL, &__clk_0_35),
7162306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "pll.0", &__clk_0_36),
7262306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "sys.0", &__clk_0_40),
7362306a36Sopenharmony_ci	CLKDEV_INIT("gpio.0", NULL, &__clk_0_41),
7462306a36Sopenharmony_ci	CLKDEV_INIT("sdram.0", NULL, &__clk_0_42),
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic struct clk * const enable_clks[] __initconst = {
7862306a36Sopenharmony_ci	&__clk_0_2, /* flexbus */
7962306a36Sopenharmony_ci	&__clk_0_18, /* intc.0 */
8062306a36Sopenharmony_ci	&__clk_0_21, /* iack.0 */
8162306a36Sopenharmony_ci	&__clk_0_24, /* mcfuart.0 */
8262306a36Sopenharmony_ci	&__clk_0_25, /* mcfuart.1 */
8362306a36Sopenharmony_ci	&__clk_0_26, /* mcfuart.2 */
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	&__clk_0_32, /* mcfpit.0 */
8662306a36Sopenharmony_ci	&__clk_0_33, /* mcfpit.1 */
8762306a36Sopenharmony_ci	&__clk_0_34, /* mcfeport.0 */
8862306a36Sopenharmony_ci	&__clk_0_36, /* pll.0 */
8962306a36Sopenharmony_ci	&__clk_0_40, /* sys.0 */
9062306a36Sopenharmony_ci	&__clk_0_41, /* gpio.0 */
9162306a36Sopenharmony_ci	&__clk_0_42, /* sdram.0 */
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic struct clk * const disable_clks[] __initconst = {
9562306a36Sopenharmony_ci	&__clk_0_12, /* fec.0 */
9662306a36Sopenharmony_ci	&__clk_0_17, /* edma */
9762306a36Sopenharmony_ci	&__clk_0_22, /* imx1-i2c.0 */
9862306a36Sopenharmony_ci	&__clk_0_23, /* mcfqspi.0 */
9962306a36Sopenharmony_ci	&__clk_0_28, /* mcftmr.0 */
10062306a36Sopenharmony_ci	&__clk_0_29, /* mcftmr.1 */
10162306a36Sopenharmony_ci	&__clk_0_30, /* mcftmr.2 */
10262306a36Sopenharmony_ci	&__clk_0_31, /* mcftmr.3 */
10362306a36Sopenharmony_ci	&__clk_0_35, /* mcfwdt.0 */
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic void __init m520x_clk_init(void)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	unsigned i;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	/* make sure these clocks are enabled */
11262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(enable_clks); ++i)
11362306a36Sopenharmony_ci		__clk_init_enabled(enable_clks[i]);
11462306a36Sopenharmony_ci	/* make sure these clocks are disabled */
11562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
11662306a36Sopenharmony_ci		__clk_init_disabled(disable_clks[i]);
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	clkdev_add_table(m520x_clk_lookup, ARRAY_SIZE(m520x_clk_lookup));
11962306a36Sopenharmony_ci}
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci/***************************************************************************/
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic void __init m520x_qspi_init(void)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
12662306a36Sopenharmony_ci	u16 par;
12762306a36Sopenharmony_ci	/* setup Port QS for QSPI with gpio CS control */
12862306a36Sopenharmony_ci	writeb(0x3f, MCF_GPIO_PAR_QSPI);
12962306a36Sopenharmony_ci	/* make U1CTS and U2RTS gpio for cs_control */
13062306a36Sopenharmony_ci	par = readw(MCF_GPIO_PAR_UART);
13162306a36Sopenharmony_ci	par &= 0x00ff;
13262306a36Sopenharmony_ci	writew(par, MCF_GPIO_PAR_UART);
13362306a36Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci/***************************************************************************/
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cistatic void __init m520x_i2c_init(void)
13962306a36Sopenharmony_ci{
14062306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_I2C_IMX)
14162306a36Sopenharmony_ci	u8 par;
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	/* setup Port FECI2C Pin Assignment Register for I2C */
14462306a36Sopenharmony_ci	/*  set PAR_SCL to SCL and PAR_SDA to SDA */
14562306a36Sopenharmony_ci	par = readb(MCF_GPIO_PAR_FECI2C);
14662306a36Sopenharmony_ci	par |= 0x0f;
14762306a36Sopenharmony_ci	writeb(par, MCF_GPIO_PAR_FECI2C);
14862306a36Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_I2C_IMX) */
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci/***************************************************************************/
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic void __init m520x_uarts_init(void)
15462306a36Sopenharmony_ci{
15562306a36Sopenharmony_ci	u16 par;
15662306a36Sopenharmony_ci	u8 par2;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	/* UART0 and UART1 GPIO pin setup */
15962306a36Sopenharmony_ci	par = readw(MCF_GPIO_PAR_UART);
16062306a36Sopenharmony_ci	par |= MCF_GPIO_PAR_UART_PAR_UTXD0 | MCF_GPIO_PAR_UART_PAR_URXD0;
16162306a36Sopenharmony_ci	par |= MCF_GPIO_PAR_UART_PAR_UTXD1 | MCF_GPIO_PAR_UART_PAR_URXD1;
16262306a36Sopenharmony_ci	writew(par, MCF_GPIO_PAR_UART);
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	/* UART1 GPIO pin setup */
16562306a36Sopenharmony_ci	par2 = readb(MCF_GPIO_PAR_FECI2C);
16662306a36Sopenharmony_ci	par2 &= ~0x0F;
16762306a36Sopenharmony_ci	par2 |= MCF_GPIO_PAR_FECI2C_PAR_SCL_UTXD2 |
16862306a36Sopenharmony_ci		MCF_GPIO_PAR_FECI2C_PAR_SDA_URXD2;
16962306a36Sopenharmony_ci	writeb(par2, MCF_GPIO_PAR_FECI2C);
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci/***************************************************************************/
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cistatic void __init m520x_fec_init(void)
17562306a36Sopenharmony_ci{
17662306a36Sopenharmony_ci	u8 v;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* Set multi-function pins to ethernet mode */
17962306a36Sopenharmony_ci	v = readb(MCF_GPIO_PAR_FEC);
18062306a36Sopenharmony_ci	writeb(v | 0xf0, MCF_GPIO_PAR_FEC);
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	v = readb(MCF_GPIO_PAR_FECI2C);
18362306a36Sopenharmony_ci	writeb(v | 0x0f, MCF_GPIO_PAR_FECI2C);
18462306a36Sopenharmony_ci}
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/***************************************************************************/
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_civoid __init config_BSP(char *commandp, int size)
18962306a36Sopenharmony_ci{
19062306a36Sopenharmony_ci	mach_sched_init = hw_timer_init;
19162306a36Sopenharmony_ci	m520x_clk_init();
19262306a36Sopenharmony_ci	m520x_uarts_init();
19362306a36Sopenharmony_ci	m520x_fec_init();
19462306a36Sopenharmony_ci	m520x_qspi_init();
19562306a36Sopenharmony_ci	m520x_i2c_init();
19662306a36Sopenharmony_ci}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci/***************************************************************************/
199