18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2009 by Sascha Hauer, Pengutronix
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/kernel.h>
78c2ecf20Sopenharmony_ci#include <linux/init.h>
88c2ecf20Sopenharmony_ci#include <linux/list.h>
98c2ecf20Sopenharmony_ci#include <linux/clk.h>
108c2ecf20Sopenharmony_ci#include <linux/io.h>
118c2ecf20Sopenharmony_ci#include <linux/clkdev.h>
128c2ecf20Sopenharmony_ci#include <linux/err.h>
138c2ecf20Sopenharmony_ci#include <linux/of.h>
148c2ecf20Sopenharmony_ci#include <linux/of_address.h>
158c2ecf20Sopenharmony_ci#include <linux/of_irq.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include "clk.h"
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define CCM_MPCTL	0x00
208c2ecf20Sopenharmony_ci#define CCM_UPCTL	0x04
218c2ecf20Sopenharmony_ci#define CCM_CCTL	0x08
228c2ecf20Sopenharmony_ci#define CCM_CGCR0	0x0C
238c2ecf20Sopenharmony_ci#define CCM_CGCR1	0x10
248c2ecf20Sopenharmony_ci#define CCM_CGCR2	0x14
258c2ecf20Sopenharmony_ci#define CCM_PCDR0	0x18
268c2ecf20Sopenharmony_ci#define CCM_PCDR1	0x1C
278c2ecf20Sopenharmony_ci#define CCM_PCDR2	0x20
288c2ecf20Sopenharmony_ci#define CCM_PCDR3	0x24
298c2ecf20Sopenharmony_ci#define CCM_RCSR	0x28
308c2ecf20Sopenharmony_ci#define CCM_CRDR	0x2C
318c2ecf20Sopenharmony_ci#define CCM_DCVR0	0x30
328c2ecf20Sopenharmony_ci#define CCM_DCVR1	0x34
338c2ecf20Sopenharmony_ci#define CCM_DCVR2	0x38
348c2ecf20Sopenharmony_ci#define CCM_DCVR3	0x3c
358c2ecf20Sopenharmony_ci#define CCM_LTR0	0x40
368c2ecf20Sopenharmony_ci#define CCM_LTR1	0x44
378c2ecf20Sopenharmony_ci#define CCM_LTR2	0x48
388c2ecf20Sopenharmony_ci#define CCM_LTR3	0x4c
398c2ecf20Sopenharmony_ci#define CCM_MCR		0x64
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define ccm(x)	(ccm_base + (x))
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistatic struct clk_onecell_data clk_data;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic const char *cpu_sel_clks[] = { "mpll", "mpll_cpu_3_4", };
468c2ecf20Sopenharmony_cistatic const char *per_sel_clks[] = { "ahb", "upll", };
478c2ecf20Sopenharmony_cistatic const char *cko_sel_clks[] = { "dummy", "osc", "cpu", "ahb",
488c2ecf20Sopenharmony_ci				      "ipg", "dummy", "dummy", "dummy",
498c2ecf20Sopenharmony_ci				      "dummy", "dummy", "per0", "per2",
508c2ecf20Sopenharmony_ci				      "per13", "per14", "usbotg_ahb", "dummy",};
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cienum mx25_clks {
538c2ecf20Sopenharmony_ci	dummy, osc, mpll, upll, mpll_cpu_3_4, cpu_sel, cpu, ahb, usb_div, ipg,
548c2ecf20Sopenharmony_ci	per0_sel, per1_sel, per2_sel, per3_sel, per4_sel, per5_sel, per6_sel,
558c2ecf20Sopenharmony_ci	per7_sel, per8_sel, per9_sel, per10_sel, per11_sel, per12_sel,
568c2ecf20Sopenharmony_ci	per13_sel, per14_sel, per15_sel, per0, per1, per2, per3, per4, per5,
578c2ecf20Sopenharmony_ci	per6, per7, per8, per9, per10, per11, per12, per13, per14, per15,
588c2ecf20Sopenharmony_ci	csi_ipg_per, epit_ipg_per, esai_ipg_per, esdhc1_ipg_per, esdhc2_ipg_per,
598c2ecf20Sopenharmony_ci	gpt_ipg_per, i2c_ipg_per, lcdc_ipg_per, nfc_ipg_per, owire_ipg_per,
608c2ecf20Sopenharmony_ci	pwm_ipg_per, sim1_ipg_per, sim2_ipg_per, ssi1_ipg_per, ssi2_ipg_per,
618c2ecf20Sopenharmony_ci	uart_ipg_per, ata_ahb, reserved1, csi_ahb, emi_ahb, esai_ahb, esdhc1_ahb,
628c2ecf20Sopenharmony_ci	esdhc2_ahb, fec_ahb, lcdc_ahb, rtic_ahb, sdma_ahb, slcdc_ahb, usbotg_ahb,
638c2ecf20Sopenharmony_ci	reserved2, reserved3, reserved4, reserved5, can1_ipg, can2_ipg,	csi_ipg,
648c2ecf20Sopenharmony_ci	cspi1_ipg, cspi2_ipg, cspi3_ipg, dryice_ipg, ect_ipg, epit1_ipg, epit2_ipg,
658c2ecf20Sopenharmony_ci	reserved6, esdhc1_ipg, esdhc2_ipg, fec_ipg, reserved7, reserved8, reserved9,
668c2ecf20Sopenharmony_ci	gpt1_ipg, gpt2_ipg, gpt3_ipg, gpt4_ipg, reserved10, reserved11, reserved12,
678c2ecf20Sopenharmony_ci	iim_ipg, reserved13, reserved14, kpp_ipg, lcdc_ipg, reserved15, pwm1_ipg,
688c2ecf20Sopenharmony_ci	pwm2_ipg, pwm3_ipg, pwm4_ipg, rngb_ipg, reserved16, scc_ipg, sdma_ipg,
698c2ecf20Sopenharmony_ci	sim1_ipg, sim2_ipg, slcdc_ipg, spba_ipg, ssi1_ipg, ssi2_ipg, tsc_ipg,
708c2ecf20Sopenharmony_ci	uart1_ipg, uart2_ipg, uart3_ipg, uart4_ipg, uart5_ipg, reserved17,
718c2ecf20Sopenharmony_ci	wdt_ipg, cko_div, cko_sel, cko, clk_max
728c2ecf20Sopenharmony_ci};
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cistatic struct clk *clk[clk_max];
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistatic int __init __mx25_clocks_init(void __iomem *ccm_base)
778c2ecf20Sopenharmony_ci{
788c2ecf20Sopenharmony_ci	BUG_ON(!ccm_base);
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	clk[dummy] = imx_clk_fixed("dummy", 0);
818c2ecf20Sopenharmony_ci	clk[mpll] = imx_clk_pllv1(IMX_PLLV1_IMX25, "mpll", "osc", ccm(CCM_MPCTL));
828c2ecf20Sopenharmony_ci	clk[upll] = imx_clk_pllv1(IMX_PLLV1_IMX25, "upll", "osc", ccm(CCM_UPCTL));
838c2ecf20Sopenharmony_ci	clk[mpll_cpu_3_4] = imx_clk_fixed_factor("mpll_cpu_3_4", "mpll", 3, 4);
848c2ecf20Sopenharmony_ci	clk[cpu_sel] = imx_clk_mux("cpu_sel", ccm(CCM_CCTL), 14, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
858c2ecf20Sopenharmony_ci	clk[cpu] = imx_clk_divider("cpu", "cpu_sel", ccm(CCM_CCTL), 30, 2);
868c2ecf20Sopenharmony_ci	clk[ahb] = imx_clk_divider("ahb", "cpu", ccm(CCM_CCTL), 28, 2);
878c2ecf20Sopenharmony_ci	clk[usb_div] = imx_clk_divider("usb_div", "upll", ccm(CCM_CCTL), 16, 6);
888c2ecf20Sopenharmony_ci	clk[ipg] = imx_clk_fixed_factor("ipg", "ahb", 1, 2);
898c2ecf20Sopenharmony_ci	clk[per0_sel] = imx_clk_mux("per0_sel", ccm(CCM_MCR), 0, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
908c2ecf20Sopenharmony_ci	clk[per1_sel] = imx_clk_mux("per1_sel", ccm(CCM_MCR), 1, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
918c2ecf20Sopenharmony_ci	clk[per2_sel] = imx_clk_mux("per2_sel", ccm(CCM_MCR), 2, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
928c2ecf20Sopenharmony_ci	clk[per3_sel] = imx_clk_mux("per3_sel", ccm(CCM_MCR), 3, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
938c2ecf20Sopenharmony_ci	clk[per4_sel] = imx_clk_mux("per4_sel", ccm(CCM_MCR), 4, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
948c2ecf20Sopenharmony_ci	clk[per5_sel] = imx_clk_mux("per5_sel", ccm(CCM_MCR), 5, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
958c2ecf20Sopenharmony_ci	clk[per6_sel] = imx_clk_mux("per6_sel", ccm(CCM_MCR), 6, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
968c2ecf20Sopenharmony_ci	clk[per7_sel] = imx_clk_mux("per7_sel", ccm(CCM_MCR), 7, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
978c2ecf20Sopenharmony_ci	clk[per8_sel] = imx_clk_mux("per8_sel", ccm(CCM_MCR), 8, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
988c2ecf20Sopenharmony_ci	clk[per9_sel] = imx_clk_mux("per9_sel", ccm(CCM_MCR), 9, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
998c2ecf20Sopenharmony_ci	clk[per10_sel] = imx_clk_mux("per10_sel", ccm(CCM_MCR), 10, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1008c2ecf20Sopenharmony_ci	clk[per11_sel] = imx_clk_mux("per11_sel", ccm(CCM_MCR), 11, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1018c2ecf20Sopenharmony_ci	clk[per12_sel] = imx_clk_mux("per12_sel", ccm(CCM_MCR), 12, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1028c2ecf20Sopenharmony_ci	clk[per13_sel] = imx_clk_mux("per13_sel", ccm(CCM_MCR), 13, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1038c2ecf20Sopenharmony_ci	clk[per14_sel] = imx_clk_mux("per14_sel", ccm(CCM_MCR), 14, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1048c2ecf20Sopenharmony_ci	clk[per15_sel] = imx_clk_mux("per15_sel", ccm(CCM_MCR), 15, 1, per_sel_clks, ARRAY_SIZE(per_sel_clks));
1058c2ecf20Sopenharmony_ci	clk[cko_div] = imx_clk_divider("cko_div", "cko_sel", ccm(CCM_MCR), 24, 6);
1068c2ecf20Sopenharmony_ci	clk[cko_sel] = imx_clk_mux("cko_sel", ccm(CCM_MCR), 20, 4, cko_sel_clks, ARRAY_SIZE(cko_sel_clks));
1078c2ecf20Sopenharmony_ci	clk[cko] = imx_clk_gate("cko", "cko_div", ccm(CCM_MCR),  30);
1088c2ecf20Sopenharmony_ci	clk[per0] = imx_clk_divider("per0", "per0_sel", ccm(CCM_PCDR0), 0, 6);
1098c2ecf20Sopenharmony_ci	clk[per1] = imx_clk_divider("per1", "per1_sel", ccm(CCM_PCDR0), 8, 6);
1108c2ecf20Sopenharmony_ci	clk[per2] = imx_clk_divider("per2", "per2_sel", ccm(CCM_PCDR0), 16, 6);
1118c2ecf20Sopenharmony_ci	clk[per3] = imx_clk_divider("per3", "per3_sel", ccm(CCM_PCDR0), 24, 6);
1128c2ecf20Sopenharmony_ci	clk[per4] = imx_clk_divider("per4", "per4_sel", ccm(CCM_PCDR1), 0, 6);
1138c2ecf20Sopenharmony_ci	clk[per5] = imx_clk_divider("per5", "per5_sel", ccm(CCM_PCDR1), 8, 6);
1148c2ecf20Sopenharmony_ci	clk[per6] = imx_clk_divider("per6", "per6_sel", ccm(CCM_PCDR1), 16, 6);
1158c2ecf20Sopenharmony_ci	clk[per7] = imx_clk_divider("per7", "per7_sel", ccm(CCM_PCDR1), 24, 6);
1168c2ecf20Sopenharmony_ci	clk[per8] = imx_clk_divider("per8", "per8_sel", ccm(CCM_PCDR2), 0, 6);
1178c2ecf20Sopenharmony_ci	clk[per9] = imx_clk_divider("per9", "per9_sel", ccm(CCM_PCDR2), 8, 6);
1188c2ecf20Sopenharmony_ci	clk[per10] = imx_clk_divider("per10", "per10_sel", ccm(CCM_PCDR2), 16, 6);
1198c2ecf20Sopenharmony_ci	clk[per11] = imx_clk_divider("per11", "per11_sel", ccm(CCM_PCDR2), 24, 6);
1208c2ecf20Sopenharmony_ci	clk[per12] = imx_clk_divider("per12", "per12_sel", ccm(CCM_PCDR3), 0, 6);
1218c2ecf20Sopenharmony_ci	clk[per13] = imx_clk_divider("per13", "per13_sel", ccm(CCM_PCDR3), 8, 6);
1228c2ecf20Sopenharmony_ci	clk[per14] = imx_clk_divider("per14", "per14_sel", ccm(CCM_PCDR3), 16, 6);
1238c2ecf20Sopenharmony_ci	clk[per15] = imx_clk_divider("per15", "per15_sel", ccm(CCM_PCDR3), 24, 6);
1248c2ecf20Sopenharmony_ci	clk[csi_ipg_per] = imx_clk_gate("csi_ipg_per", "per0", ccm(CCM_CGCR0), 0);
1258c2ecf20Sopenharmony_ci	clk[epit_ipg_per] = imx_clk_gate("epit_ipg_per", "per1", ccm(CCM_CGCR0),  1);
1268c2ecf20Sopenharmony_ci	clk[esai_ipg_per] = imx_clk_gate("esai_ipg_per", "per2", ccm(CCM_CGCR0),  2);
1278c2ecf20Sopenharmony_ci	clk[esdhc1_ipg_per] = imx_clk_gate("esdhc1_ipg_per", "per3", ccm(CCM_CGCR0),  3);
1288c2ecf20Sopenharmony_ci	clk[esdhc2_ipg_per] = imx_clk_gate("esdhc2_ipg_per", "per4", ccm(CCM_CGCR0),  4);
1298c2ecf20Sopenharmony_ci	clk[gpt_ipg_per] = imx_clk_gate("gpt_ipg_per", "per5", ccm(CCM_CGCR0),  5);
1308c2ecf20Sopenharmony_ci	clk[i2c_ipg_per] = imx_clk_gate("i2c_ipg_per", "per6", ccm(CCM_CGCR0),  6);
1318c2ecf20Sopenharmony_ci	clk[lcdc_ipg_per] = imx_clk_gate("lcdc_ipg_per", "per7", ccm(CCM_CGCR0),  7);
1328c2ecf20Sopenharmony_ci	clk[nfc_ipg_per] = imx_clk_gate("nfc_ipg_per", "per8", ccm(CCM_CGCR0),  8);
1338c2ecf20Sopenharmony_ci	clk[owire_ipg_per] = imx_clk_gate("owire_ipg_per", "per9", ccm(CCM_CGCR0),  9);
1348c2ecf20Sopenharmony_ci	clk[pwm_ipg_per] = imx_clk_gate("pwm_ipg_per", "per10", ccm(CCM_CGCR0),  10);
1358c2ecf20Sopenharmony_ci	clk[sim1_ipg_per] = imx_clk_gate("sim1_ipg_per", "per11", ccm(CCM_CGCR0),  11);
1368c2ecf20Sopenharmony_ci	clk[sim2_ipg_per] = imx_clk_gate("sim2_ipg_per", "per12", ccm(CCM_CGCR0),  12);
1378c2ecf20Sopenharmony_ci	clk[ssi1_ipg_per] = imx_clk_gate("ssi1_ipg_per", "per13", ccm(CCM_CGCR0), 13);
1388c2ecf20Sopenharmony_ci	clk[ssi2_ipg_per] = imx_clk_gate("ssi2_ipg_per", "per14", ccm(CCM_CGCR0), 14);
1398c2ecf20Sopenharmony_ci	clk[uart_ipg_per] = imx_clk_gate("uart_ipg_per", "per15", ccm(CCM_CGCR0), 15);
1408c2ecf20Sopenharmony_ci	clk[ata_ahb] = imx_clk_gate("ata_ahb", "ahb", ccm(CCM_CGCR0), 16);
1418c2ecf20Sopenharmony_ci	/* CCM_CGCR0(17): reserved */
1428c2ecf20Sopenharmony_ci	clk[csi_ahb] = imx_clk_gate("csi_ahb", "ahb", ccm(CCM_CGCR0), 18);
1438c2ecf20Sopenharmony_ci	clk[emi_ahb] = imx_clk_gate("emi_ahb", "ahb", ccm(CCM_CGCR0), 19);
1448c2ecf20Sopenharmony_ci	clk[esai_ahb] = imx_clk_gate("esai_ahb", "ahb", ccm(CCM_CGCR0), 20);
1458c2ecf20Sopenharmony_ci	clk[esdhc1_ahb] = imx_clk_gate("esdhc1_ahb", "ahb", ccm(CCM_CGCR0), 21);
1468c2ecf20Sopenharmony_ci	clk[esdhc2_ahb] = imx_clk_gate("esdhc2_ahb", "ahb", ccm(CCM_CGCR0), 22);
1478c2ecf20Sopenharmony_ci	clk[fec_ahb] = imx_clk_gate("fec_ahb", "ahb", ccm(CCM_CGCR0), 23);
1488c2ecf20Sopenharmony_ci	clk[lcdc_ahb] = imx_clk_gate("lcdc_ahb", "ahb", ccm(CCM_CGCR0), 24);
1498c2ecf20Sopenharmony_ci	clk[rtic_ahb] = imx_clk_gate("rtic_ahb", "ahb", ccm(CCM_CGCR0), 25);
1508c2ecf20Sopenharmony_ci	clk[sdma_ahb] = imx_clk_gate("sdma_ahb", "ahb", ccm(CCM_CGCR0), 26);
1518c2ecf20Sopenharmony_ci	clk[slcdc_ahb] = imx_clk_gate("slcdc_ahb", "ahb", ccm(CCM_CGCR0), 27);
1528c2ecf20Sopenharmony_ci	clk[usbotg_ahb] = imx_clk_gate("usbotg_ahb", "ahb", ccm(CCM_CGCR0), 28);
1538c2ecf20Sopenharmony_ci	/* CCM_CGCR0(29-31): reserved */
1548c2ecf20Sopenharmony_ci	/* CCM_CGCR1(0): reserved in datasheet, used as audmux in FSL kernel */
1558c2ecf20Sopenharmony_ci	clk[can1_ipg] = imx_clk_gate("can1_ipg", "ipg", ccm(CCM_CGCR1),  2);
1568c2ecf20Sopenharmony_ci	clk[can2_ipg] = imx_clk_gate("can2_ipg", "ipg", ccm(CCM_CGCR1),  3);
1578c2ecf20Sopenharmony_ci	clk[csi_ipg] = imx_clk_gate("csi_ipg", "ipg", ccm(CCM_CGCR1),  4);
1588c2ecf20Sopenharmony_ci	clk[cspi1_ipg] = imx_clk_gate("cspi1_ipg", "ipg", ccm(CCM_CGCR1),  5);
1598c2ecf20Sopenharmony_ci	clk[cspi2_ipg] = imx_clk_gate("cspi2_ipg", "ipg", ccm(CCM_CGCR1),  6);
1608c2ecf20Sopenharmony_ci	clk[cspi3_ipg] = imx_clk_gate("cspi3_ipg", "ipg", ccm(CCM_CGCR1),  7);
1618c2ecf20Sopenharmony_ci	clk[dryice_ipg] = imx_clk_gate("dryice_ipg", "ipg", ccm(CCM_CGCR1),  8);
1628c2ecf20Sopenharmony_ci	clk[ect_ipg] = imx_clk_gate("ect_ipg", "ipg", ccm(CCM_CGCR1),  9);
1638c2ecf20Sopenharmony_ci	clk[epit1_ipg] = imx_clk_gate("epit1_ipg", "ipg", ccm(CCM_CGCR1),  10);
1648c2ecf20Sopenharmony_ci	clk[epit2_ipg] = imx_clk_gate("epit2_ipg", "ipg", ccm(CCM_CGCR1),  11);
1658c2ecf20Sopenharmony_ci	/* CCM_CGCR1(12): reserved in datasheet, used as esai in FSL kernel */
1668c2ecf20Sopenharmony_ci	clk[esdhc1_ipg] = imx_clk_gate("esdhc1_ipg", "ipg", ccm(CCM_CGCR1), 13);
1678c2ecf20Sopenharmony_ci	clk[esdhc2_ipg] = imx_clk_gate("esdhc2_ipg", "ipg", ccm(CCM_CGCR1), 14);
1688c2ecf20Sopenharmony_ci	clk[fec_ipg] = imx_clk_gate("fec_ipg", "ipg", ccm(CCM_CGCR1), 15);
1698c2ecf20Sopenharmony_ci	/* CCM_CGCR1(16): reserved in datasheet, used as gpio1 in FSL kernel */
1708c2ecf20Sopenharmony_ci	/* CCM_CGCR1(17): reserved in datasheet, used as gpio2 in FSL kernel */
1718c2ecf20Sopenharmony_ci	/* CCM_CGCR1(18): reserved in datasheet, used as gpio3 in FSL kernel */
1728c2ecf20Sopenharmony_ci	clk[gpt1_ipg] = imx_clk_gate("gpt1_ipg", "ipg", ccm(CCM_CGCR1), 19);
1738c2ecf20Sopenharmony_ci	clk[gpt2_ipg] = imx_clk_gate("gpt2_ipg", "ipg", ccm(CCM_CGCR1), 20);
1748c2ecf20Sopenharmony_ci	clk[gpt3_ipg] = imx_clk_gate("gpt3_ipg", "ipg", ccm(CCM_CGCR1), 21);
1758c2ecf20Sopenharmony_ci	clk[gpt4_ipg] = imx_clk_gate("gpt4_ipg", "ipg", ccm(CCM_CGCR1), 22);
1768c2ecf20Sopenharmony_ci	/* CCM_CGCR1(23): reserved in datasheet, used as i2c1 in FSL kernel */
1778c2ecf20Sopenharmony_ci	/* CCM_CGCR1(24): reserved in datasheet, used as i2c2 in FSL kernel */
1788c2ecf20Sopenharmony_ci	/* CCM_CGCR1(25): reserved in datasheet, used as i2c3 in FSL kernel */
1798c2ecf20Sopenharmony_ci	clk[iim_ipg] = imx_clk_gate("iim_ipg", "ipg", ccm(CCM_CGCR1), 26);
1808c2ecf20Sopenharmony_ci	/* CCM_CGCR1(27): reserved in datasheet, used as iomuxc in FSL kernel */
1818c2ecf20Sopenharmony_ci	/* CCM_CGCR1(28): reserved in datasheet, used as kpp in FSL kernel */
1828c2ecf20Sopenharmony_ci	clk[kpp_ipg] = imx_clk_gate("kpp_ipg", "ipg", ccm(CCM_CGCR1), 28);
1838c2ecf20Sopenharmony_ci	clk[lcdc_ipg] = imx_clk_gate("lcdc_ipg", "ipg", ccm(CCM_CGCR1), 29);
1848c2ecf20Sopenharmony_ci	/* CCM_CGCR1(30): reserved in datasheet, used as owire in FSL kernel */
1858c2ecf20Sopenharmony_ci	clk[pwm1_ipg] = imx_clk_gate("pwm1_ipg", "ipg", ccm(CCM_CGCR1), 31);
1868c2ecf20Sopenharmony_ci	clk[pwm2_ipg] = imx_clk_gate("pwm2_ipg", "ipg", ccm(CCM_CGCR2),  0);
1878c2ecf20Sopenharmony_ci	clk[pwm3_ipg] = imx_clk_gate("pwm3_ipg", "ipg", ccm(CCM_CGCR2),  1);
1888c2ecf20Sopenharmony_ci	clk[pwm4_ipg] = imx_clk_gate("pwm4_ipg", "ipg", ccm(CCM_CGCR2),  2);
1898c2ecf20Sopenharmony_ci	clk[rngb_ipg] = imx_clk_gate("rngb_ipg", "ipg", ccm(CCM_CGCR2),  3);
1908c2ecf20Sopenharmony_ci	/* CCM_CGCR2(4): reserved in datasheet, used as rtic in FSL kernel */
1918c2ecf20Sopenharmony_ci	clk[scc_ipg] = imx_clk_gate("scc_ipg", "ipg", ccm(CCM_CGCR2),  5);
1928c2ecf20Sopenharmony_ci	clk[sdma_ipg] = imx_clk_gate("sdma_ipg", "ipg", ccm(CCM_CGCR2),  6);
1938c2ecf20Sopenharmony_ci	clk[sim1_ipg] = imx_clk_gate("sim1_ipg", "ipg", ccm(CCM_CGCR2),  7);
1948c2ecf20Sopenharmony_ci	clk[sim2_ipg] = imx_clk_gate("sim2_ipg", "ipg", ccm(CCM_CGCR2),  8);
1958c2ecf20Sopenharmony_ci	clk[slcdc_ipg] = imx_clk_gate("slcdc_ipg", "ipg", ccm(CCM_CGCR2),  9);
1968c2ecf20Sopenharmony_ci	clk[spba_ipg] = imx_clk_gate("spba_ipg", "ipg", ccm(CCM_CGCR2),  10);
1978c2ecf20Sopenharmony_ci	clk[ssi1_ipg] = imx_clk_gate("ssi1_ipg", "ipg", ccm(CCM_CGCR2), 11);
1988c2ecf20Sopenharmony_ci	clk[ssi2_ipg] = imx_clk_gate("ssi2_ipg", "ipg", ccm(CCM_CGCR2), 12);
1998c2ecf20Sopenharmony_ci	clk[tsc_ipg] = imx_clk_gate("tsc_ipg", "ipg", ccm(CCM_CGCR2), 13);
2008c2ecf20Sopenharmony_ci	clk[uart1_ipg] = imx_clk_gate("uart1_ipg", "ipg", ccm(CCM_CGCR2), 14);
2018c2ecf20Sopenharmony_ci	clk[uart2_ipg] = imx_clk_gate("uart2_ipg", "ipg", ccm(CCM_CGCR2), 15);
2028c2ecf20Sopenharmony_ci	clk[uart3_ipg] = imx_clk_gate("uart3_ipg", "ipg", ccm(CCM_CGCR2), 16);
2038c2ecf20Sopenharmony_ci	clk[uart4_ipg] = imx_clk_gate("uart4_ipg", "ipg", ccm(CCM_CGCR2), 17);
2048c2ecf20Sopenharmony_ci	clk[uart5_ipg] = imx_clk_gate("uart5_ipg", "ipg", ccm(CCM_CGCR2), 18);
2058c2ecf20Sopenharmony_ci	/* CCM_CGCR2(19): reserved in datasheet, but used as wdt in FSL kernel */
2068c2ecf20Sopenharmony_ci	clk[wdt_ipg] = imx_clk_gate("wdt_ipg", "ipg", ccm(CCM_CGCR2), 19);
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci	imx_check_clocks(clk, ARRAY_SIZE(clk));
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	clk_prepare_enable(clk[emi_ahb]);
2118c2ecf20Sopenharmony_ci
2128c2ecf20Sopenharmony_ci	/* Clock source for gpt must be derived from AHB */
2138c2ecf20Sopenharmony_ci	clk_set_parent(clk[per5_sel], clk[ahb]);
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	/*
2168c2ecf20Sopenharmony_ci	 * Let's initially set up CLKO parent as ipg, since this configuration
2178c2ecf20Sopenharmony_ci	 * is used on some imx25 board designs to clock the audio codec.
2188c2ecf20Sopenharmony_ci	 */
2198c2ecf20Sopenharmony_ci	clk_set_parent(clk[cko_sel], clk[ipg]);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci	imx_register_uart_clocks(6);
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci	return 0;
2248c2ecf20Sopenharmony_ci}
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_cistatic void __init mx25_clocks_init_dt(struct device_node *np)
2278c2ecf20Sopenharmony_ci{
2288c2ecf20Sopenharmony_ci	void __iomem *ccm;
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	ccm = of_iomap(np, 0);
2318c2ecf20Sopenharmony_ci	__mx25_clocks_init(ccm);
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	clk_data.clks = clk;
2348c2ecf20Sopenharmony_ci	clk_data.clk_num = ARRAY_SIZE(clk);
2358c2ecf20Sopenharmony_ci	of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
2368c2ecf20Sopenharmony_ci}
2378c2ecf20Sopenharmony_ciCLK_OF_DECLARE(imx25_ccm, "fsl,imx25-ccm", mx25_clocks_init_dt);
238