18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *	m5441x.c -- support for Coldfire m5441x processors
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *	(C) Copyright Steven King <sfking@fdwdc.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/kernel.h>
98c2ecf20Sopenharmony_ci#include <linux/param.h>
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci#include <linux/io.h>
128c2ecf20Sopenharmony_ci#include <linux/clk.h>
138c2ecf20Sopenharmony_ci#include <asm/machdep.h>
148c2ecf20Sopenharmony_ci#include <asm/coldfire.h>
158c2ecf20Sopenharmony_ci#include <asm/mcfsim.h>
168c2ecf20Sopenharmony_ci#include <asm/mcfuart.h>
178c2ecf20Sopenharmony_ci#include <asm/mcfdma.h>
188c2ecf20Sopenharmony_ci#include <asm/mcfclk.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciDEFINE_CLK(0, "flexbus", 2, MCF_CLK);
218c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfcan.0", 8, MCF_CLK);
228c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfcan.1", 9, MCF_CLK);
238c2ecf20Sopenharmony_ciDEFINE_CLK(0, "imx1-i2c.1", 14, MCF_CLK);
248c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfdspi.1", 15, MCF_CLK);
258c2ecf20Sopenharmony_ciDEFINE_CLK(0, "edma", 17, MCF_CLK);
268c2ecf20Sopenharmony_ciDEFINE_CLK(0, "intc.0", 18, MCF_CLK);
278c2ecf20Sopenharmony_ciDEFINE_CLK(0, "intc.1", 19, MCF_CLK);
288c2ecf20Sopenharmony_ciDEFINE_CLK(0, "intc.2", 20, MCF_CLK);
298c2ecf20Sopenharmony_ciDEFINE_CLK(0, "imx1-i2c.0", 22, MCF_CLK);
308c2ecf20Sopenharmony_ciDEFINE_CLK(0, "fsl-dspi.0", 23, MCF_CLK);
318c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfuart.0", 24, MCF_BUSCLK);
328c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfuart.1", 25, MCF_BUSCLK);
338c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfuart.2", 26, MCF_BUSCLK);
348c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfuart.3", 27, MCF_BUSCLK);
358c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcftmr.0", 28, MCF_CLK);
368c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcftmr.1", 29, MCF_CLK);
378c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcftmr.2", 30, MCF_CLK);
388c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcftmr.3", 31, MCF_CLK);
398c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfpit.0", 32, MCF_CLK);
408c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfpit.1", 33, MCF_CLK);
418c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfpit.2", 34, MCF_CLK);
428c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfpit.3", 35, MCF_CLK);
438c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfeport.0", 37, MCF_CLK);
448c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfadc.0", 38, MCF_CLK);
458c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfdac.0", 39, MCF_CLK);
468c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfrtc.0", 42, MCF_CLK);
478c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfsim.0", 43, MCF_CLK);
488c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfusb-otg.0", 44, MCF_CLK);
498c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfusb-host.0", 45, MCF_CLK);
508c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfddr-sram.0", 46, MCF_CLK);
518c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfssi.0", 47, MCF_CLK);
528c2ecf20Sopenharmony_ciDEFINE_CLK(0, "pll.0", 48, MCF_CLK);
538c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfrng.0", 49, MCF_CLK);
548c2ecf20Sopenharmony_ciDEFINE_CLK(0, "mcfssi.1", 50, MCF_CLK);
558c2ecf20Sopenharmony_ciDEFINE_CLK(0, "sdhci-esdhc-mcf.0", 51, MCF_CLK);
568c2ecf20Sopenharmony_ciDEFINE_CLK(0, "enet-fec.0", 53, MCF_CLK);
578c2ecf20Sopenharmony_ciDEFINE_CLK(0, "enet-fec.1", 54, MCF_CLK);
588c2ecf20Sopenharmony_ciDEFINE_CLK(0, "switch.0", 55, MCF_CLK);
598c2ecf20Sopenharmony_ciDEFINE_CLK(0, "switch.1", 56, MCF_CLK);
608c2ecf20Sopenharmony_ciDEFINE_CLK(0, "nand.0", 63, MCF_CLK);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfow.0", 2, MCF_CLK);
638c2ecf20Sopenharmony_ciDEFINE_CLK(1, "imx1-i2c.2", 4, MCF_CLK);
648c2ecf20Sopenharmony_ciDEFINE_CLK(1, "imx1-i2c.3", 5, MCF_CLK);
658c2ecf20Sopenharmony_ciDEFINE_CLK(1, "imx1-i2c.4", 6, MCF_CLK);
668c2ecf20Sopenharmony_ciDEFINE_CLK(1, "imx1-i2c.5", 7, MCF_CLK);
678c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.4", 24, MCF_BUSCLK);
688c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.5", 25, MCF_BUSCLK);
698c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.6", 26, MCF_BUSCLK);
708c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.7", 27, MCF_BUSCLK);
718c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.8", 28, MCF_BUSCLK);
728c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfuart.9", 29, MCF_BUSCLK);
738c2ecf20Sopenharmony_ciDEFINE_CLK(1, "mcfpwm.0", 34, MCF_BUSCLK);
748c2ecf20Sopenharmony_ciDEFINE_CLK(1, "sys.0", 36, MCF_BUSCLK);
758c2ecf20Sopenharmony_ciDEFINE_CLK(1, "gpio.0", 37, MCF_BUSCLK);
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciDEFINE_CLK(2, "ipg.0", 0, MCF_CLK);
788c2ecf20Sopenharmony_ciDEFINE_CLK(2, "ahb.0", 1, MCF_CLK);
798c2ecf20Sopenharmony_ciDEFINE_CLK(2, "per.0", 2, MCF_CLK);
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistruct clk *mcf_clks[] = {
828c2ecf20Sopenharmony_ci	&__clk_0_2,
838c2ecf20Sopenharmony_ci	&__clk_0_8,
848c2ecf20Sopenharmony_ci	&__clk_0_9,
858c2ecf20Sopenharmony_ci	&__clk_0_14,
868c2ecf20Sopenharmony_ci	&__clk_0_15,
878c2ecf20Sopenharmony_ci	&__clk_0_17,
888c2ecf20Sopenharmony_ci	&__clk_0_18,
898c2ecf20Sopenharmony_ci	&__clk_0_19,
908c2ecf20Sopenharmony_ci	&__clk_0_20,
918c2ecf20Sopenharmony_ci	&__clk_0_22,
928c2ecf20Sopenharmony_ci	&__clk_0_23,
938c2ecf20Sopenharmony_ci	&__clk_0_24,
948c2ecf20Sopenharmony_ci	&__clk_0_25,
958c2ecf20Sopenharmony_ci	&__clk_0_26,
968c2ecf20Sopenharmony_ci	&__clk_0_27,
978c2ecf20Sopenharmony_ci	&__clk_0_28,
988c2ecf20Sopenharmony_ci	&__clk_0_29,
998c2ecf20Sopenharmony_ci	&__clk_0_30,
1008c2ecf20Sopenharmony_ci	&__clk_0_31,
1018c2ecf20Sopenharmony_ci	&__clk_0_32,
1028c2ecf20Sopenharmony_ci	&__clk_0_33,
1038c2ecf20Sopenharmony_ci	&__clk_0_34,
1048c2ecf20Sopenharmony_ci	&__clk_0_35,
1058c2ecf20Sopenharmony_ci	&__clk_0_37,
1068c2ecf20Sopenharmony_ci	&__clk_0_38,
1078c2ecf20Sopenharmony_ci	&__clk_0_39,
1088c2ecf20Sopenharmony_ci	&__clk_0_42,
1098c2ecf20Sopenharmony_ci	&__clk_0_43,
1108c2ecf20Sopenharmony_ci	&__clk_0_44,
1118c2ecf20Sopenharmony_ci	&__clk_0_45,
1128c2ecf20Sopenharmony_ci	&__clk_0_46,
1138c2ecf20Sopenharmony_ci	&__clk_0_47,
1148c2ecf20Sopenharmony_ci	&__clk_0_48,
1158c2ecf20Sopenharmony_ci	&__clk_0_49,
1168c2ecf20Sopenharmony_ci	&__clk_0_50,
1178c2ecf20Sopenharmony_ci	&__clk_0_51,
1188c2ecf20Sopenharmony_ci	&__clk_0_53,
1198c2ecf20Sopenharmony_ci	&__clk_0_54,
1208c2ecf20Sopenharmony_ci	&__clk_0_55,
1218c2ecf20Sopenharmony_ci	&__clk_0_56,
1228c2ecf20Sopenharmony_ci	&__clk_0_63,
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	&__clk_1_2,
1258c2ecf20Sopenharmony_ci	&__clk_1_4,
1268c2ecf20Sopenharmony_ci	&__clk_1_5,
1278c2ecf20Sopenharmony_ci	&__clk_1_6,
1288c2ecf20Sopenharmony_ci	&__clk_1_7,
1298c2ecf20Sopenharmony_ci	&__clk_1_24,
1308c2ecf20Sopenharmony_ci	&__clk_1_25,
1318c2ecf20Sopenharmony_ci	&__clk_1_26,
1328c2ecf20Sopenharmony_ci	&__clk_1_27,
1338c2ecf20Sopenharmony_ci	&__clk_1_28,
1348c2ecf20Sopenharmony_ci	&__clk_1_29,
1358c2ecf20Sopenharmony_ci	&__clk_1_34,
1368c2ecf20Sopenharmony_ci	&__clk_1_36,
1378c2ecf20Sopenharmony_ci	&__clk_1_37,
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_ci	&__clk_2_0,
1408c2ecf20Sopenharmony_ci	&__clk_2_1,
1418c2ecf20Sopenharmony_ci	&__clk_2_2,
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	NULL,
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_cistatic struct clk * const enable_clks[] __initconst = {
1488c2ecf20Sopenharmony_ci	/* make sure these clocks are enabled */
1498c2ecf20Sopenharmony_ci	&__clk_0_15, /* dspi.1 */
1508c2ecf20Sopenharmony_ci	&__clk_0_17, /* eDMA */
1518c2ecf20Sopenharmony_ci	&__clk_0_18, /* intc0 */
1528c2ecf20Sopenharmony_ci	&__clk_0_19, /* intc0 */
1538c2ecf20Sopenharmony_ci	&__clk_0_20, /* intc0 */
1548c2ecf20Sopenharmony_ci	&__clk_0_23, /* dspi.0 */
1558c2ecf20Sopenharmony_ci	&__clk_0_24, /* uart0 */
1568c2ecf20Sopenharmony_ci	&__clk_0_25, /* uart1 */
1578c2ecf20Sopenharmony_ci	&__clk_0_26, /* uart2 */
1588c2ecf20Sopenharmony_ci	&__clk_0_27, /* uart3 */
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	&__clk_0_33, /* pit.1 */
1618c2ecf20Sopenharmony_ci	&__clk_0_37, /* eport */
1628c2ecf20Sopenharmony_ci	&__clk_0_48, /* pll */
1638c2ecf20Sopenharmony_ci	&__clk_0_51, /* esdhc */
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	&__clk_1_36, /* CCM/reset module/Power management */
1668c2ecf20Sopenharmony_ci	&__clk_1_37, /* gpio */
1678c2ecf20Sopenharmony_ci};
1688c2ecf20Sopenharmony_cistatic struct clk * const disable_clks[] __initconst = {
1698c2ecf20Sopenharmony_ci	&__clk_0_8, /* can.0 */
1708c2ecf20Sopenharmony_ci	&__clk_0_9, /* can.1 */
1718c2ecf20Sopenharmony_ci	&__clk_0_14, /* i2c.1 */
1728c2ecf20Sopenharmony_ci	&__clk_0_22, /* i2c.0 */
1738c2ecf20Sopenharmony_ci	&__clk_0_23, /* dspi.0 */
1748c2ecf20Sopenharmony_ci	&__clk_0_28, /* tmr.1 */
1758c2ecf20Sopenharmony_ci	&__clk_0_29, /* tmr.2 */
1768c2ecf20Sopenharmony_ci	&__clk_0_30, /* tmr.2 */
1778c2ecf20Sopenharmony_ci	&__clk_0_31, /* tmr.3 */
1788c2ecf20Sopenharmony_ci	&__clk_0_32, /* pit.0 */
1798c2ecf20Sopenharmony_ci	&__clk_0_34, /* pit.2 */
1808c2ecf20Sopenharmony_ci	&__clk_0_35, /* pit.3 */
1818c2ecf20Sopenharmony_ci	&__clk_0_38, /* adc */
1828c2ecf20Sopenharmony_ci	&__clk_0_39, /* dac */
1838c2ecf20Sopenharmony_ci	&__clk_0_44, /* usb otg */
1848c2ecf20Sopenharmony_ci	&__clk_0_45, /* usb host */
1858c2ecf20Sopenharmony_ci	&__clk_0_47, /* ssi.0 */
1868c2ecf20Sopenharmony_ci	&__clk_0_49, /* rng */
1878c2ecf20Sopenharmony_ci	&__clk_0_50, /* ssi.1 */
1888c2ecf20Sopenharmony_ci	&__clk_0_51, /* eSDHC */
1898c2ecf20Sopenharmony_ci	&__clk_0_53, /* enet-fec */
1908c2ecf20Sopenharmony_ci	&__clk_0_54, /* enet-fec */
1918c2ecf20Sopenharmony_ci	&__clk_0_55, /* switch.0 */
1928c2ecf20Sopenharmony_ci	&__clk_0_56, /* switch.1 */
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	&__clk_1_2, /* 1-wire */
1958c2ecf20Sopenharmony_ci	&__clk_1_4, /* i2c.2 */
1968c2ecf20Sopenharmony_ci	&__clk_1_5, /* i2c.3 */
1978c2ecf20Sopenharmony_ci	&__clk_1_6, /* i2c.4 */
1988c2ecf20Sopenharmony_ci	&__clk_1_7, /* i2c.5 */
1998c2ecf20Sopenharmony_ci	&__clk_1_24, /* uart 4 */
2008c2ecf20Sopenharmony_ci	&__clk_1_25, /* uart 5 */
2018c2ecf20Sopenharmony_ci	&__clk_1_26, /* uart 6 */
2028c2ecf20Sopenharmony_ci	&__clk_1_27, /* uart 7 */
2038c2ecf20Sopenharmony_ci	&__clk_1_28, /* uart 8 */
2048c2ecf20Sopenharmony_ci	&__clk_1_29, /* uart 9 */
2058c2ecf20Sopenharmony_ci};
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_cistatic void __clk_enable2(struct clk *clk)
2088c2ecf20Sopenharmony_ci{
2098c2ecf20Sopenharmony_ci	__raw_writel(__raw_readl(MCFSDHC_CLK) | (1 << clk->slot), MCFSDHC_CLK);
2108c2ecf20Sopenharmony_ci}
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_cistatic void __clk_disable2(struct clk *clk)
2138c2ecf20Sopenharmony_ci{
2148c2ecf20Sopenharmony_ci	__raw_writel(__raw_readl(MCFSDHC_CLK) & ~(1 << clk->slot), MCFSDHC_CLK);
2158c2ecf20Sopenharmony_ci}
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_cistruct clk_ops clk_ops2 = {
2188c2ecf20Sopenharmony_ci	.enable		= __clk_enable2,
2198c2ecf20Sopenharmony_ci	.disable	= __clk_disable2,
2208c2ecf20Sopenharmony_ci};
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_cistatic void __init m5441x_clk_init(void)
2238c2ecf20Sopenharmony_ci{
2248c2ecf20Sopenharmony_ci	unsigned i;
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(enable_clks); ++i)
2278c2ecf20Sopenharmony_ci		__clk_init_enabled(enable_clks[i]);
2288c2ecf20Sopenharmony_ci	/* make sure these clocks are disabled */
2298c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(disable_clks); ++i)
2308c2ecf20Sopenharmony_ci		__clk_init_disabled(disable_clks[i]);
2318c2ecf20Sopenharmony_ci}
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_cistatic void __init m5441x_uarts_init(void)
2348c2ecf20Sopenharmony_ci{
2358c2ecf20Sopenharmony_ci	__raw_writeb(0x0f, MCFGPIO_PAR_UART0);
2368c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_UART1);
2378c2ecf20Sopenharmony_ci	__raw_writeb(0x00, MCFGPIO_PAR_UART2);
2388c2ecf20Sopenharmony_ci}
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_cistatic void __init m5441x_fec_init(void)
2418c2ecf20Sopenharmony_ci{
2428c2ecf20Sopenharmony_ci	__raw_writeb(0x03, MCFGPIO_PAR_FEC);
2438c2ecf20Sopenharmony_ci}
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_civoid __init config_BSP(char *commandp, int size)
2468c2ecf20Sopenharmony_ci{
2478c2ecf20Sopenharmony_ci	m5441x_clk_init();
2488c2ecf20Sopenharmony_ci	mach_sched_init = hw_timer_init;
2498c2ecf20Sopenharmony_ci	m5441x_uarts_init();
2508c2ecf20Sopenharmony_ci	m5441x_fec_init();
2518c2ecf20Sopenharmony_ci}
252