|
@@ -154,3 +154,191 @@ static int __init __mx25_clocks_init(unsigned long osc_rate)
|
|
|
clk[csi_ahb] = imx_clk_gate("csi_ahb", "ahb", ccm(CCM_CGCR0), 18);
|
|
|
clk[emi_ahb] = imx_clk_gate("emi_ahb", "ahb", ccm(CCM_CGCR0), 19);
|
|
|
clk[esai_ahb] = imx_clk_gate("esai_ahb", "ahb", ccm(CCM_CGCR0), 20);
|
|
|
+ clk[esdhc1_ahb] = imx_clk_gate("esdhc1_ahb", "ahb", ccm(CCM_CGCR0), 21);
|
|
|
+ clk[esdhc2_ahb] = imx_clk_gate("esdhc2_ahb", "ahb", ccm(CCM_CGCR0), 22);
|
|
|
+ clk[fec_ahb] = imx_clk_gate("fec_ahb", "ahb", ccm(CCM_CGCR0), 23);
|
|
|
+ clk[lcdc_ahb] = imx_clk_gate("lcdc_ahb", "ahb", ccm(CCM_CGCR0), 24);
|
|
|
+ clk[rtic_ahb] = imx_clk_gate("rtic_ahb", "ahb", ccm(CCM_CGCR0), 25);
|
|
|
+ clk[sdma_ahb] = imx_clk_gate("sdma_ahb", "ahb", ccm(CCM_CGCR0), 26);
|
|
|
+ clk[slcdc_ahb] = imx_clk_gate("slcdc_ahb", "ahb", ccm(CCM_CGCR0), 27);
|
|
|
+ clk[usbotg_ahb] = imx_clk_gate("usbotg_ahb", "ahb", ccm(CCM_CGCR0), 28);
|
|
|
+ /* CCM_CGCR0(29-31): reserved */
|
|
|
+ /* CCM_CGCR1(0): reserved in datasheet, used as audmux in FSL kernel */
|
|
|
+ clk[can1_ipg] = imx_clk_gate("can1_ipg", "ipg", ccm(CCM_CGCR1), 2);
|
|
|
+ clk[can2_ipg] = imx_clk_gate("can2_ipg", "ipg", ccm(CCM_CGCR1), 3);
|
|
|
+ clk[csi_ipg] = imx_clk_gate("csi_ipg", "ipg", ccm(CCM_CGCR1), 4);
|
|
|
+ clk[cspi1_ipg] = imx_clk_gate("cspi1_ipg", "ipg", ccm(CCM_CGCR1), 5);
|
|
|
+ clk[cspi2_ipg] = imx_clk_gate("cspi2_ipg", "ipg", ccm(CCM_CGCR1), 6);
|
|
|
+ clk[cspi3_ipg] = imx_clk_gate("cspi3_ipg", "ipg", ccm(CCM_CGCR1), 7);
|
|
|
+ clk[dryice_ipg] = imx_clk_gate("dryice_ipg", "ipg", ccm(CCM_CGCR1), 8);
|
|
|
+ clk[ect_ipg] = imx_clk_gate("ect_ipg", "ipg", ccm(CCM_CGCR1), 9);
|
|
|
+ clk[epit1_ipg] = imx_clk_gate("epit1_ipg", "ipg", ccm(CCM_CGCR1), 10);
|
|
|
+ clk[epit2_ipg] = imx_clk_gate("epit2_ipg", "ipg", ccm(CCM_CGCR1), 11);
|
|
|
+ /* CCM_CGCR1(12): reserved in datasheet, used as esai in FSL kernel */
|
|
|
+ clk[esdhc1_ipg] = imx_clk_gate("esdhc1_ipg", "ipg", ccm(CCM_CGCR1), 13);
|
|
|
+ clk[esdhc2_ipg] = imx_clk_gate("esdhc2_ipg", "ipg", ccm(CCM_CGCR1), 14);
|
|
|
+ clk[fec_ipg] = imx_clk_gate("fec_ipg", "ipg", ccm(CCM_CGCR1), 15);
|
|
|
+ /* CCM_CGCR1(16): reserved in datasheet, used as gpio1 in FSL kernel */
|
|
|
+ /* CCM_CGCR1(17): reserved in datasheet, used as gpio2 in FSL kernel */
|
|
|
+ /* CCM_CGCR1(18): reserved in datasheet, used as gpio3 in FSL kernel */
|
|
|
+ clk[gpt1_ipg] = imx_clk_gate("gpt1_ipg", "ipg", ccm(CCM_CGCR1), 19);
|
|
|
+ clk[gpt2_ipg] = imx_clk_gate("gpt2_ipg", "ipg", ccm(CCM_CGCR1), 20);
|
|
|
+ clk[gpt3_ipg] = imx_clk_gate("gpt3_ipg", "ipg", ccm(CCM_CGCR1), 21);
|
|
|
+ clk[gpt4_ipg] = imx_clk_gate("gpt4_ipg", "ipg", ccm(CCM_CGCR1), 22);
|
|
|
+ /* CCM_CGCR1(23): reserved in datasheet, used as i2c1 in FSL kernel */
|
|
|
+ /* CCM_CGCR1(24): reserved in datasheet, used as i2c2 in FSL kernel */
|
|
|
+ /* CCM_CGCR1(25): reserved in datasheet, used as i2c3 in FSL kernel */
|
|
|
+ clk[iim_ipg] = imx_clk_gate("iim_ipg", "ipg", ccm(CCM_CGCR1), 26);
|
|
|
+ /* CCM_CGCR1(27): reserved in datasheet, used as iomuxc in FSL kernel */
|
|
|
+ /* CCM_CGCR1(28): reserved in datasheet, used as kpp in FSL kernel */
|
|
|
+ clk[kpp_ipg] = imx_clk_gate("kpp_ipg", "ipg", ccm(CCM_CGCR1), 28);
|
|
|
+ clk[lcdc_ipg] = imx_clk_gate("lcdc_ipg", "ipg", ccm(CCM_CGCR1), 29);
|
|
|
+ /* CCM_CGCR1(30): reserved in datasheet, used as owire in FSL kernel */
|
|
|
+ clk[pwm1_ipg] = imx_clk_gate("pwm1_ipg", "ipg", ccm(CCM_CGCR1), 31);
|
|
|
+ clk[pwm2_ipg] = imx_clk_gate("pwm2_ipg", "ipg", ccm(CCM_CGCR2), 0);
|
|
|
+ clk[pwm3_ipg] = imx_clk_gate("pwm3_ipg", "ipg", ccm(CCM_CGCR2), 1);
|
|
|
+ clk[pwm4_ipg] = imx_clk_gate("pwm4_ipg", "ipg", ccm(CCM_CGCR2), 2);
|
|
|
+ clk[rngb_ipg] = imx_clk_gate("rngb_ipg", "ipg", ccm(CCM_CGCR2), 3);
|
|
|
+ /* CCM_CGCR2(4): reserved in datasheet, used as rtic in FSL kernel */
|
|
|
+ clk[scc_ipg] = imx_clk_gate("scc_ipg", "ipg", ccm(CCM_CGCR2), 5);
|
|
|
+ clk[sdma_ipg] = imx_clk_gate("sdma_ipg", "ipg", ccm(CCM_CGCR2), 6);
|
|
|
+ clk[sim1_ipg] = imx_clk_gate("sim1_ipg", "ipg", ccm(CCM_CGCR2), 7);
|
|
|
+ clk[sim2_ipg] = imx_clk_gate("sim2_ipg", "ipg", ccm(CCM_CGCR2), 8);
|
|
|
+ clk[slcdc_ipg] = imx_clk_gate("slcdc_ipg", "ipg", ccm(CCM_CGCR2), 9);
|
|
|
+ clk[spba_ipg] = imx_clk_gate("spba_ipg", "ipg", ccm(CCM_CGCR2), 10);
|
|
|
+ clk[ssi1_ipg] = imx_clk_gate("ssi1_ipg", "ipg", ccm(CCM_CGCR2), 11);
|
|
|
+ clk[ssi2_ipg] = imx_clk_gate("ssi2_ipg", "ipg", ccm(CCM_CGCR2), 12);
|
|
|
+ clk[tsc_ipg] = imx_clk_gate("tsc_ipg", "ipg", ccm(CCM_CGCR2), 13);
|
|
|
+ clk[uart1_ipg] = imx_clk_gate("uart1_ipg", "ipg", ccm(CCM_CGCR2), 14);
|
|
|
+ clk[uart2_ipg] = imx_clk_gate("uart2_ipg", "ipg", ccm(CCM_CGCR2), 15);
|
|
|
+ clk[uart3_ipg] = imx_clk_gate("uart3_ipg", "ipg", ccm(CCM_CGCR2), 16);
|
|
|
+ clk[uart4_ipg] = imx_clk_gate("uart4_ipg", "ipg", ccm(CCM_CGCR2), 17);
|
|
|
+ clk[uart5_ipg] = imx_clk_gate("uart5_ipg", "ipg", ccm(CCM_CGCR2), 18);
|
|
|
+ /* CCM_CGCR2(19): reserved in datasheet, but used as wdt in FSL kernel */
|
|
|
+ clk[wdt_ipg] = imx_clk_gate("wdt_ipg", "ipg", ccm(CCM_CGCR2), 19);
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(clk); i++)
|
|
|
+ if (IS_ERR(clk[i]))
|
|
|
+ pr_err("i.MX25 clk %d: register failed with %ld\n",
|
|
|
+ i, PTR_ERR(clk[i]));
|
|
|
+
|
|
|
+ clk_prepare_enable(clk[emi_ahb]);
|
|
|
+
|
|
|
+ /* Clock source for gpt must be derived from AHB */
|
|
|
+ clk_set_parent(clk[per5_sel], clk[ahb]);
|
|
|
+
|
|
|
+ clk_register_clkdev(clk[ipg], "ipg", "imx-gpt.0");
|
|
|
+ clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int __init mx25_clocks_init(void)
|
|
|
+{
|
|
|
+ __mx25_clocks_init(24000000);
|
|
|
+
|
|
|
+ /* i.mx25 has the i.mx21 type uart */
|
|
|
+ clk_register_clkdev(clk[uart1_ipg], "ipg", "imx21-uart.0");
|
|
|
+ clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.0");
|
|
|
+ clk_register_clkdev(clk[uart2_ipg], "ipg", "imx21-uart.1");
|
|
|
+ clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.1");
|
|
|
+ clk_register_clkdev(clk[uart3_ipg], "ipg", "imx21-uart.2");
|
|
|
+ clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.2");
|
|
|
+ clk_register_clkdev(clk[uart4_ipg], "ipg", "imx21-uart.3");
|
|
|
+ clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.3");
|
|
|
+ clk_register_clkdev(clk[uart5_ipg], "ipg", "imx21-uart.4");
|
|
|
+ clk_register_clkdev(clk[uart_ipg_per], "per", "imx21-uart.4");
|
|
|
+ clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.0");
|
|
|
+ clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.0");
|
|
|
+ clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.0");
|
|
|
+ clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.1");
|
|
|
+ clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.1");
|
|
|
+ clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.1");
|
|
|
+ clk_register_clkdev(clk[ipg], "ipg", "mxc-ehci.2");
|
|
|
+ clk_register_clkdev(clk[usbotg_ahb], "ahb", "mxc-ehci.2");
|
|
|
+ clk_register_clkdev(clk[usb_div], "per", "mxc-ehci.2");
|
|
|
+ clk_register_clkdev(clk[ipg], "ipg", "imx-udc-mx27");
|
|
|
+ clk_register_clkdev(clk[usbotg_ahb], "ahb", "imx-udc-mx27");
|
|
|
+ clk_register_clkdev(clk[usb_div], "per", "imx-udc-mx27");
|
|
|
+ clk_register_clkdev(clk[nfc_ipg_per], NULL, "imx25-nand.0");
|
|
|
+ /* i.mx25 has the i.mx35 type cspi */
|
|
|
+ clk_register_clkdev(clk[cspi1_ipg], NULL, "imx35-cspi.0");
|
|
|
+ clk_register_clkdev(clk[cspi2_ipg], NULL, "imx35-cspi.1");
|
|
|
+ clk_register_clkdev(clk[cspi3_ipg], NULL, "imx35-cspi.2");
|
|
|
+ clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.0");
|
|
|
+ clk_register_clkdev(clk[per10], "per", "mxc_pwm.0");
|
|
|
+ clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.1");
|
|
|
+ clk_register_clkdev(clk[per10], "per", "mxc_pwm.1");
|
|
|
+ clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.2");
|
|
|
+ clk_register_clkdev(clk[per10], "per", "mxc_pwm.2");
|
|
|
+ clk_register_clkdev(clk[pwm1_ipg], "ipg", "mxc_pwm.3");
|
|
|
+ clk_register_clkdev(clk[per10], "per", "mxc_pwm.3");
|
|
|
+ clk_register_clkdev(clk[kpp_ipg], NULL, "imx-keypad");
|
|
|
+ clk_register_clkdev(clk[tsc_ipg], NULL, "mx25-adc");
|
|
|
+ clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx21-i2c.0");
|
|
|
+ clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx21-i2c.1");
|
|
|
+ clk_register_clkdev(clk[i2c_ipg_per], NULL, "imx21-i2c.2");
|
|
|
+ clk_register_clkdev(clk[fec_ipg], "ipg", "imx25-fec.0");
|
|
|
+ clk_register_clkdev(clk[fec_ahb], "ahb", "imx25-fec.0");
|
|
|
+ clk_register_clkdev(clk[dryice_ipg], NULL, "imxdi_rtc.0");
|
|
|
+ clk_register_clkdev(clk[lcdc_ipg_per], "per", "imx21-fb.0");
|
|
|
+ clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx21-fb.0");
|
|
|
+ clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx21-fb.0");
|
|
|
+ clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0");
|
|
|
+ clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0");
|
|
|
+ clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1");
|
|
|
+ clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0");
|
|
|
+ clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0");
|
|
|
+ clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0");
|
|
|
+ clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1");
|
|
|
+ clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1");
|
|
|
+ clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1");
|
|
|
+ clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0");
|
|
|
+ clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0");
|
|
|
+ clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0");
|
|
|
+ clk_register_clkdev(clk[dummy], "audmux", NULL);
|
|
|
+ clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0");
|
|
|
+ clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1");
|
|
|
+ /* i.mx25 has the i.mx35 type sdma */
|
|
|
+ clk_register_clkdev(clk[sdma_ipg], "ipg", "imx35-sdma");
|
|
|
+ clk_register_clkdev(clk[sdma_ahb], "ahb", "imx35-sdma");
|
|
|
+ clk_register_clkdev(clk[iim_ipg], "iim", NULL);
|
|
|
+
|
|
|
+ mxc_timer_init(MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), MX25_INT_GPT1);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int __init mx25_clocks_init_dt(void)
|
|
|
+{
|
|
|
+ struct device_node *np;
|
|
|
+ void __iomem *base;
|
|
|
+ int irq;
|
|
|
+ unsigned long osc_rate = 24000000;
|
|
|
+
|
|
|
+ /* retrieve the freqency of fixed clocks from device tree */
|
|
|
+ for_each_compatible_node(np, NULL, "fixed-clock") {
|
|
|
+ u32 rate;
|
|
|
+ if (of_property_read_u32(np, "clock-frequency", &rate))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (of_device_is_compatible(np, "fsl,imx-osc"))
|
|
|
+ osc_rate = rate;
|
|
|
+ }
|
|
|
+
|
|
|
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx25-ccm");
|
|
|
+ clk_data.clks = clk;
|
|
|
+ clk_data.clk_num = ARRAY_SIZE(clk);
|
|
|
+ of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
|
|
|
+
|
|
|
+ __mx25_clocks_init(osc_rate);
|
|
|
+
|
|
|
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx25-gpt");
|
|
|
+ base = of_iomap(np, 0);
|
|
|
+ WARN_ON(!base);
|
|
|
+ irq = irq_of_parse_and_map(np, 0);
|
|
|
+
|
|
|
+ mxc_timer_init(base, irq);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|