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