162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/***************************************************************************/
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci *	m5249.c  -- platform support for ColdFire 5249 based boards
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *	Copyright (C) 2002, Greg Ungerer (gerg@snapgear.com)
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/io.h>
1762306a36Sopenharmony_ci#include <linux/platform_device.h>
1862306a36Sopenharmony_ci#include <asm/machdep.h>
1962306a36Sopenharmony_ci#include <asm/coldfire.h>
2062306a36Sopenharmony_ci#include <asm/mcfsim.h>
2162306a36Sopenharmony_ci#include <asm/mcfclk.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/***************************************************************************/
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciDEFINE_CLK(pll, "pll.0", MCF_CLK);
2662306a36Sopenharmony_ciDEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct clk_lookup m5249_clk_lookup[] = {
2962306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "pll.0", &clk_pll),
3062306a36Sopenharmony_ci	CLKDEV_INIT(NULL, "sys.0", &clk_sys),
3162306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
3262306a36Sopenharmony_ci	CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
3362306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
3462306a36Sopenharmony_ci	CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
3562306a36Sopenharmony_ci	CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
3662306a36Sopenharmony_ci	CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
3762306a36Sopenharmony_ci	CLKDEV_INIT("imx1-i2c.1", NULL, &clk_sys),
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/***************************************************************************/
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#ifdef CONFIG_M5249C3
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic struct resource m5249_smc91x_resources[] = {
4562306a36Sopenharmony_ci	{
4662306a36Sopenharmony_ci		.start		= 0xe0000300,
4762306a36Sopenharmony_ci		.end		= 0xe0000300 + 0x100,
4862306a36Sopenharmony_ci		.flags		= IORESOURCE_MEM,
4962306a36Sopenharmony_ci	},
5062306a36Sopenharmony_ci	{
5162306a36Sopenharmony_ci		.start		= MCF_IRQ_GPIO6,
5262306a36Sopenharmony_ci		.end		= MCF_IRQ_GPIO6,
5362306a36Sopenharmony_ci		.flags		= IORESOURCE_IRQ,
5462306a36Sopenharmony_ci	},
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic struct platform_device m5249_smc91x = {
5862306a36Sopenharmony_ci	.name			= "smc91x",
5962306a36Sopenharmony_ci	.id			= 0,
6062306a36Sopenharmony_ci	.num_resources		= ARRAY_SIZE(m5249_smc91x_resources),
6162306a36Sopenharmony_ci	.resource		= m5249_smc91x_resources,
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci#endif /* CONFIG_M5249C3 */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic struct platform_device *m5249_devices[] __initdata = {
6762306a36Sopenharmony_ci#ifdef CONFIG_M5249C3
6862306a36Sopenharmony_ci	&m5249_smc91x,
6962306a36Sopenharmony_ci#endif
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/***************************************************************************/
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cistatic void __init m5249_qspi_init(void)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
7762306a36Sopenharmony_ci	/* QSPI irq setup */
7862306a36Sopenharmony_ci	writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI0,
7962306a36Sopenharmony_ci	       MCFSIM_QSPIICR);
8062306a36Sopenharmony_ci	mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI);
8162306a36Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/***************************************************************************/
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic void __init m5249_i2c_init(void)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_I2C_IMX)
8962306a36Sopenharmony_ci	u32 r;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	/* first I2C controller uses regular irq setup */
9262306a36Sopenharmony_ci	writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL5 | MCFSIM_ICR_PRI0,
9362306a36Sopenharmony_ci	       MCFSIM_I2CICR);
9462306a36Sopenharmony_ci	mcf_mapirq2imr(MCF_IRQ_I2C0, MCFINTC_I2C);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	/* second I2C controller is completely different */
9762306a36Sopenharmony_ci	r = readl(MCFINTC2_INTPRI_REG(MCF_IRQ_I2C1));
9862306a36Sopenharmony_ci	r &= ~MCFINTC2_INTPRI_BITS(0xf, MCF_IRQ_I2C1);
9962306a36Sopenharmony_ci	r |= MCFINTC2_INTPRI_BITS(0x5, MCF_IRQ_I2C1);
10062306a36Sopenharmony_ci	writel(r, MCFINTC2_INTPRI_REG(MCF_IRQ_I2C1));
10162306a36Sopenharmony_ci#endif /* CONFIG_I2C_IMX */
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/***************************************************************************/
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci#ifdef CONFIG_M5249C3
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic void __init m5249_smc91x_init(void)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	u32  gpio;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	/* Set the GPIO line as interrupt source for smc91x device */
11362306a36Sopenharmony_ci	gpio = readl(MCFSIM2_GPIOINTENABLE);
11462306a36Sopenharmony_ci	writel(gpio | 0x40, MCFSIM2_GPIOINTENABLE);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	gpio = readl(MCFINTC2_INTPRI5);
11762306a36Sopenharmony_ci	writel(gpio | 0x04000000, MCFINTC2_INTPRI5);
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci#endif /* CONFIG_M5249C3 */
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/***************************************************************************/
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_civoid __init config_BSP(char *commandp, int size)
12562306a36Sopenharmony_ci{
12662306a36Sopenharmony_ci	mach_sched_init = hw_timer_init;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci#ifdef CONFIG_M5249C3
12962306a36Sopenharmony_ci	m5249_smc91x_init();
13062306a36Sopenharmony_ci#endif
13162306a36Sopenharmony_ci	m5249_qspi_init();
13262306a36Sopenharmony_ci	m5249_i2c_init();
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	clkdev_add_table(m5249_clk_lookup, ARRAY_SIZE(m5249_clk_lookup));
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/***************************************************************************/
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistatic int __init init_BSP(void)
14062306a36Sopenharmony_ci{
14162306a36Sopenharmony_ci	platform_add_devices(m5249_devices, ARRAY_SIZE(m5249_devices));
14262306a36Sopenharmony_ci	return 0;
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciarch_initcall(init_BSP);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/***************************************************************************/
148