xref: /linux/arch/m68k/coldfire/m5249.c (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2f86b9e03SGreg Ungerer /***************************************************************************/
3f86b9e03SGreg Ungerer 
4f86b9e03SGreg Ungerer /*
5ece9ae65SGreg Ungerer  *	m5249.c  -- platform support for ColdFire 5249 based boards
6f86b9e03SGreg Ungerer  *
7f86b9e03SGreg Ungerer  *	Copyright (C) 2002, Greg Ungerer (gerg@snapgear.com)
8f86b9e03SGreg Ungerer  */
9f86b9e03SGreg Ungerer 
10f86b9e03SGreg Ungerer /***************************************************************************/
11f86b9e03SGreg Ungerer 
12*63aadb77SArnd Bergmann #include <linux/clkdev.h>
13f86b9e03SGreg Ungerer #include <linux/kernel.h>
14f86b9e03SGreg Ungerer #include <linux/param.h>
15f86b9e03SGreg Ungerer #include <linux/init.h>
16f86b9e03SGreg Ungerer #include <linux/io.h>
17f86b9e03SGreg Ungerer #include <linux/platform_device.h>
18f86b9e03SGreg Ungerer #include <asm/machdep.h>
19f86b9e03SGreg Ungerer #include <asm/coldfire.h>
20f86b9e03SGreg Ungerer #include <asm/mcfsim.h>
21f86b9e03SGreg Ungerer #include <asm/mcfclk.h>
22f86b9e03SGreg Ungerer 
23f86b9e03SGreg Ungerer /***************************************************************************/
24f86b9e03SGreg Ungerer 
25f86b9e03SGreg Ungerer DEFINE_CLK(pll, "pll.0", MCF_CLK);
26f86b9e03SGreg Ungerer DEFINE_CLK(sys, "sys.0", MCF_BUSCLK);
27f86b9e03SGreg Ungerer 
28*63aadb77SArnd Bergmann struct clk_lookup m5249_clk_lookup[] = {
29*63aadb77SArnd Bergmann 	CLKDEV_INIT(NULL, "pll.0", &clk_pll),
30*63aadb77SArnd Bergmann 	CLKDEV_INIT(NULL, "sys.0", &clk_sys),
31*63aadb77SArnd Bergmann 	CLKDEV_INIT("mcftmr.0", NULL, &clk_sys),
32*63aadb77SArnd Bergmann 	CLKDEV_INIT("mcftmr.1", NULL, &clk_sys),
33*63aadb77SArnd Bergmann 	CLKDEV_INIT("mcfuart.0", NULL, &clk_sys),
34*63aadb77SArnd Bergmann 	CLKDEV_INIT("mcfuart.1", NULL, &clk_sys),
35*63aadb77SArnd Bergmann 	CLKDEV_INIT("mcfqspi.0", NULL, &clk_sys),
36*63aadb77SArnd Bergmann 	CLKDEV_INIT("imx1-i2c.0", NULL, &clk_sys),
37*63aadb77SArnd Bergmann 	CLKDEV_INIT("imx1-i2c.1", NULL, &clk_sys),
38f86b9e03SGreg Ungerer };
39f86b9e03SGreg Ungerer 
40f86b9e03SGreg Ungerer /***************************************************************************/
41f86b9e03SGreg Ungerer 
42f86b9e03SGreg Ungerer #ifdef CONFIG_M5249C3
43f86b9e03SGreg Ungerer 
44f86b9e03SGreg Ungerer static struct resource m5249_smc91x_resources[] = {
45f86b9e03SGreg Ungerer 	{
46f86b9e03SGreg Ungerer 		.start		= 0xe0000300,
47f86b9e03SGreg Ungerer 		.end		= 0xe0000300 + 0x100,
48f86b9e03SGreg Ungerer 		.flags		= IORESOURCE_MEM,
49f86b9e03SGreg Ungerer 	},
50f86b9e03SGreg Ungerer 	{
51f86b9e03SGreg Ungerer 		.start		= MCF_IRQ_GPIO6,
52f86b9e03SGreg Ungerer 		.end		= MCF_IRQ_GPIO6,
53f86b9e03SGreg Ungerer 		.flags		= IORESOURCE_IRQ,
54f86b9e03SGreg Ungerer 	},
55f86b9e03SGreg Ungerer };
56f86b9e03SGreg Ungerer 
57f86b9e03SGreg Ungerer static struct platform_device m5249_smc91x = {
58f86b9e03SGreg Ungerer 	.name			= "smc91x",
59f86b9e03SGreg Ungerer 	.id			= 0,
60f86b9e03SGreg Ungerer 	.num_resources		= ARRAY_SIZE(m5249_smc91x_resources),
61f86b9e03SGreg Ungerer 	.resource		= m5249_smc91x_resources,
62f86b9e03SGreg Ungerer };
63f86b9e03SGreg Ungerer 
64f86b9e03SGreg Ungerer #endif /* CONFIG_M5249C3 */
65f86b9e03SGreg Ungerer 
66f86b9e03SGreg Ungerer static struct platform_device *m5249_devices[] __initdata = {
67f86b9e03SGreg Ungerer #ifdef CONFIG_M5249C3
68f86b9e03SGreg Ungerer 	&m5249_smc91x,
69f86b9e03SGreg Ungerer #endif
70f86b9e03SGreg Ungerer };
71f86b9e03SGreg Ungerer 
72f86b9e03SGreg Ungerer /***************************************************************************/
73f86b9e03SGreg Ungerer 
m5249_qspi_init(void)74f86b9e03SGreg Ungerer static void __init m5249_qspi_init(void)
75f86b9e03SGreg Ungerer {
76f86b9e03SGreg Ungerer #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
77f86b9e03SGreg Ungerer 	/* QSPI irq setup */
78f86b9e03SGreg Ungerer 	writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI0,
79f86b9e03SGreg Ungerer 	       MCFSIM_QSPIICR);
80f86b9e03SGreg Ungerer 	mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI);
81f86b9e03SGreg Ungerer #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
82f86b9e03SGreg Ungerer }
83f86b9e03SGreg Ungerer 
84f86b9e03SGreg Ungerer /***************************************************************************/
85f86b9e03SGreg Ungerer 
m5249_i2c_init(void)862d24b532SSteven King static void __init m5249_i2c_init(void)
872d24b532SSteven King {
882d24b532SSteven King #if IS_ENABLED(CONFIG_I2C_IMX)
892d24b532SSteven King 	u32 r;
902d24b532SSteven King 
912d24b532SSteven King 	/* first I2C controller uses regular irq setup */
922d24b532SSteven King 	writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL5 | MCFSIM_ICR_PRI0,
932d24b532SSteven King 	       MCFSIM_I2CICR);
942d24b532SSteven King 	mcf_mapirq2imr(MCF_IRQ_I2C0, MCFINTC_I2C);
952d24b532SSteven King 
962d24b532SSteven King 	/* second I2C controller is completely different */
972d24b532SSteven King 	r = readl(MCFINTC2_INTPRI_REG(MCF_IRQ_I2C1));
982d24b532SSteven King 	r &= ~MCFINTC2_INTPRI_BITS(0xf, MCF_IRQ_I2C1);
992d24b532SSteven King 	r |= MCFINTC2_INTPRI_BITS(0x5, MCF_IRQ_I2C1);
1002d24b532SSteven King 	writel(r, MCFINTC2_INTPRI_REG(MCF_IRQ_I2C1));
1012d24b532SSteven King #endif /* CONFIG_I2C_IMX */
1022d24b532SSteven King }
1032d24b532SSteven King 
1042d24b532SSteven King /***************************************************************************/
1052d24b532SSteven King 
106f86b9e03SGreg Ungerer #ifdef CONFIG_M5249C3
107f86b9e03SGreg Ungerer 
m5249_smc91x_init(void)108f86b9e03SGreg Ungerer static void __init m5249_smc91x_init(void)
109f86b9e03SGreg Ungerer {
110f86b9e03SGreg Ungerer 	u32  gpio;
111f86b9e03SGreg Ungerer 
112f86b9e03SGreg Ungerer 	/* Set the GPIO line as interrupt source for smc91x device */
113f86b9e03SGreg Ungerer 	gpio = readl(MCFSIM2_GPIOINTENABLE);
114f86b9e03SGreg Ungerer 	writel(gpio | 0x40, MCFSIM2_GPIOINTENABLE);
115f86b9e03SGreg Ungerer 
116f86b9e03SGreg Ungerer 	gpio = readl(MCFINTC2_INTPRI5);
117f86b9e03SGreg Ungerer 	writel(gpio | 0x04000000, MCFINTC2_INTPRI5);
118f86b9e03SGreg Ungerer }
119f86b9e03SGreg Ungerer 
120f86b9e03SGreg Ungerer #endif /* CONFIG_M5249C3 */
121f86b9e03SGreg Ungerer 
122f86b9e03SGreg Ungerer /***************************************************************************/
123f86b9e03SGreg Ungerer 
config_BSP(char * commandp,int size)124f86b9e03SGreg Ungerer void __init config_BSP(char *commandp, int size)
125f86b9e03SGreg Ungerer {
126f86b9e03SGreg Ungerer 	mach_sched_init = hw_timer_init;
127f86b9e03SGreg Ungerer 
128f86b9e03SGreg Ungerer #ifdef CONFIG_M5249C3
129f86b9e03SGreg Ungerer 	m5249_smc91x_init();
130f86b9e03SGreg Ungerer #endif
131f86b9e03SGreg Ungerer 	m5249_qspi_init();
1322d24b532SSteven King 	m5249_i2c_init();
133*63aadb77SArnd Bergmann 
134*63aadb77SArnd Bergmann 	clkdev_add_table(m5249_clk_lookup, ARRAY_SIZE(m5249_clk_lookup));
135f86b9e03SGreg Ungerer }
136f86b9e03SGreg Ungerer 
137f86b9e03SGreg Ungerer /***************************************************************************/
138f86b9e03SGreg Ungerer 
init_BSP(void)139f86b9e03SGreg Ungerer static int __init init_BSP(void)
140f86b9e03SGreg Ungerer {
141f86b9e03SGreg Ungerer 	platform_add_devices(m5249_devices, ARRAY_SIZE(m5249_devices));
142f86b9e03SGreg Ungerer 	return 0;
143f86b9e03SGreg Ungerer }
144f86b9e03SGreg Ungerer 
145f86b9e03SGreg Ungerer arch_initcall(init_BSP);
146f86b9e03SGreg Ungerer 
147f86b9e03SGreg Ungerer /***************************************************************************/
148