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