162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/***************************************************************************/
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci *	m54xx.c  -- platform support for ColdFire 54xx based boards
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *	Copyright (C) 2010, Philippe De Muyter <phdm@macqel.be>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/***************************************************************************/
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/clkdev.h>
1362306a36Sopenharmony_ci#include <linux/kernel.h>
1462306a36Sopenharmony_ci#include <linux/param.h>
1562306a36Sopenharmony_ci#include <linux/init.h>
1662306a36Sopenharmony_ci#include <linux/interrupt.h>
1762306a36Sopenharmony_ci#include <linux/io.h>
1862306a36Sopenharmony_ci#include <linux/mm.h>
1962306a36Sopenharmony_ci#include <linux/clk.h>
2062306a36Sopenharmony_ci#include <linux/memblock.h>
2162306a36Sopenharmony_ci#include <asm/pgalloc.h>
2262306a36Sopenharmony_ci#include <asm/machdep.h>
2362306a36Sopenharmony_ci#include <asm/coldfire.h>
2462306a36Sopenharmony_ci#include <asm/m54xxsim.h>
2562306a36Sopenharmony_ci#include <asm/mcfuart.h>
2662306a36Sopenharmony_ci#include <asm/mcfclk.h>
2762306a36Sopenharmony_ci#include <asm/m54xxgpt.h>
2862306a36Sopenharmony_ci#ifdef CONFIG_MMU
2962306a36Sopenharmony_ci#include <asm/mmu_context.h>
3062306a36Sopenharmony_ci#endif
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/***************************************************************************/
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciDEFINE_CLK(pll, "pll.0", MCF_CLK);
3562306a36Sopenharmony_ciDEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic struct clk_lookup m54xx_clk_lookup[] = {
3862306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "pll.0", &clk_pll),
3962306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "sys.0", &clk_sys),
4062306a36Sopenharmony_ci	CLKDEV_INIT("mcfslt.0", NULL, &clk_sys),
4162306a36Sopenharmony_ci	CLKDEV_INIT("mcfslt.1", NULL, &clk_sys),
4262306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
4362306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
4462306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.2", NULL, &clk_sys),
4562306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.3", NULL, &clk_sys),
4662306a36Sopenharmony_ci	CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/***************************************************************************/
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic void __init m54xx_uarts_init(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	/* enable io pins */
5462306a36Sopenharmony_ci	__raw_writeb(MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD, MCFGPIO_PAR_PSC0);
5562306a36Sopenharmony_ci	__raw_writeb(MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD | MCF_PAR_PSC_RTS_RTS,
5662306a36Sopenharmony_ci		MCFGPIO_PAR_PSC1);
5762306a36Sopenharmony_ci	__raw_writeb(MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD | MCF_PAR_PSC_RTS_RTS |
5862306a36Sopenharmony_ci		MCF_PAR_PSC_CTS_CTS, MCFGPIO_PAR_PSC2);
5962306a36Sopenharmony_ci	__raw_writeb(MCF_PAR_PSC_TXD | MCF_PAR_PSC_RXD, MCFGPIO_PAR_PSC3);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/***************************************************************************/
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic void __init m54xx_i2c_init(void)
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_I2C_IMX)
6762306a36Sopenharmony_ci	u32 r;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	/* set the fec/i2c/irq pin assignment register for i2c */
7062306a36Sopenharmony_ci	r = readl(MCF_PAR_FECI2CIRQ);
7162306a36Sopenharmony_ci	r |= MCF_PAR_FECI2CIRQ_SDA | MCF_PAR_FECI2CIRQ_SCL;
7262306a36Sopenharmony_ci	writel(r, MCF_PAR_FECI2CIRQ);
7362306a36Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_I2C_IMX) */
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/***************************************************************************/
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic void mcf54xx_reset(void)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	/* disable interrupts and enable the watchdog */
8162306a36Sopenharmony_ci	asm("movew #0x2700, %sr\n");
8262306a36Sopenharmony_ci	__raw_writel(0, MCF_GPT_GMS0);
8362306a36Sopenharmony_ci	__raw_writel(MCF_GPT_GCIR_CNT(1), MCF_GPT_GCIR0);
8462306a36Sopenharmony_ci	__raw_writel(MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS(4),
8562306a36Sopenharmony_ci		MCF_GPT_GMS0);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/***************************************************************************/
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civoid __init config_BSP(char *commandp, int size)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	mach_reset = mcf54xx_reset;
9362306a36Sopenharmony_ci	mach_sched_init = hw_timer_init;
9462306a36Sopenharmony_ci	m54xx_uarts_init();
9562306a36Sopenharmony_ci	m54xx_i2c_init();
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	clkdev_add_table(m54xx_clk_lookup, ARRAY_SIZE(m54xx_clk_lookup));
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci/***************************************************************************/
101