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