|
@@ -332,3 +332,118 @@ int __init mx6q_clocks_init(void)
|
|
|
clk[enfc_podf] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6);
|
|
|
clk[emi_podf] = imx_clk_divider("emi_podf", "emi_sel", base + 0x1c, 20, 3);
|
|
|
clk[emi_slow_podf] = imx_clk_divider("emi_slow_podf", "emi_slow_sel", base + 0x1c, 23, 3);
|
|
|
+ clk[vpu_axi_podf] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3);
|
|
|
+ clk[cko1_podf] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3);
|
|
|
+
|
|
|
+ /* name parent_name reg shift width busy: reg, shift */
|
|
|
+ clk[axi] = imx_clk_busy_divider("axi", "axi_sel", base + 0x14, 16, 3, base + 0x48, 0);
|
|
|
+ clk[mmdc_ch0_axi_podf] = imx_clk_busy_divider("mmdc_ch0_axi_podf", "periph", base + 0x14, 19, 3, base + 0x48, 4);
|
|
|
+ clk[mmdc_ch1_axi_podf] = imx_clk_busy_divider("mmdc_ch1_axi_podf", "periph2", base + 0x14, 3, 3, base + 0x48, 2);
|
|
|
+ clk[arm] = imx_clk_busy_divider("arm", "pll1_sw", base + 0x10, 0, 3, base + 0x48, 16);
|
|
|
+ clk[ahb] = imx_clk_busy_divider("ahb", "periph", base + 0x14, 10, 3, base + 0x48, 1);
|
|
|
+
|
|
|
+ /* name parent_name reg shift */
|
|
|
+ clk[apbh_dma] = imx_clk_gate2("apbh_dma", "usdhc3", base + 0x68, 4);
|
|
|
+ clk[asrc] = imx_clk_gate2("asrc", "asrc_podf", base + 0x68, 6);
|
|
|
+ clk[can1_ipg] = imx_clk_gate2("can1_ipg", "ipg", base + 0x68, 14);
|
|
|
+ clk[can1_serial] = imx_clk_gate2("can1_serial", "can_root", base + 0x68, 16);
|
|
|
+ clk[can2_ipg] = imx_clk_gate2("can2_ipg", "ipg", base + 0x68, 18);
|
|
|
+ clk[can2_serial] = imx_clk_gate2("can2_serial", "can_root", base + 0x68, 20);
|
|
|
+ clk[ecspi1] = imx_clk_gate2("ecspi1", "ecspi_root", base + 0x6c, 0);
|
|
|
+ clk[ecspi2] = imx_clk_gate2("ecspi2", "ecspi_root", base + 0x6c, 2);
|
|
|
+ clk[ecspi3] = imx_clk_gate2("ecspi3", "ecspi_root", base + 0x6c, 4);
|
|
|
+ clk[ecspi4] = imx_clk_gate2("ecspi4", "ecspi_root", base + 0x6c, 6);
|
|
|
+ clk[ecspi5] = imx_clk_gate2("ecspi5", "ecspi_root", base + 0x6c, 8);
|
|
|
+ clk[enet] = imx_clk_gate2("enet", "ipg", base + 0x6c, 10);
|
|
|
+ clk[esai] = imx_clk_gate2("esai", "esai_podf", base + 0x6c, 16);
|
|
|
+ clk[gpt_ipg] = imx_clk_gate2("gpt_ipg", "ipg", base + 0x6c, 20);
|
|
|
+ clk[gpt_ipg_per] = imx_clk_gate2("gpt_ipg_per", "ipg_per", base + 0x6c, 22);
|
|
|
+ clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24);
|
|
|
+ clk[gpu3d_core] = imx_clk_gate2("gpu3d_core", "gpu3d_core_podf", base + 0x6c, 26);
|
|
|
+ clk[hdmi_iahb] = imx_clk_gate2("hdmi_iahb", "ahb", base + 0x70, 0);
|
|
|
+ clk[hdmi_isfr] = imx_clk_gate2("hdmi_isfr", "pll3_pfd1_540m", base + 0x70, 4);
|
|
|
+ clk[i2c1] = imx_clk_gate2("i2c1", "ipg_per", base + 0x70, 6);
|
|
|
+ clk[i2c2] = imx_clk_gate2("i2c2", "ipg_per", base + 0x70, 8);
|
|
|
+ clk[i2c3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10);
|
|
|
+ clk[iim] = imx_clk_gate2("iim", "ipg", base + 0x70, 12);
|
|
|
+ clk[enfc] = imx_clk_gate2("enfc", "enfc_podf", base + 0x70, 14);
|
|
|
+ clk[ipu1] = imx_clk_gate2("ipu1", "ipu1_podf", base + 0x74, 0);
|
|
|
+ clk[ipu1_di0] = imx_clk_gate2("ipu1_di0", "ipu1_di0_sel", base + 0x74, 2);
|
|
|
+ clk[ipu1_di1] = imx_clk_gate2("ipu1_di1", "ipu1_di1_sel", base + 0x74, 4);
|
|
|
+ clk[ipu2] = imx_clk_gate2("ipu2", "ipu2_podf", base + 0x74, 6);
|
|
|
+ clk[ipu2_di0] = imx_clk_gate2("ipu2_di0", "ipu2_di0_sel", base + 0x74, 8);
|
|
|
+ clk[ldb_di0] = imx_clk_gate2("ldb_di0", "ldb_di0_podf", base + 0x74, 12);
|
|
|
+ clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14);
|
|
|
+ clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10);
|
|
|
+ clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16);
|
|
|
+ clk[mlb] = imx_clk_gate2("mlb", "pll8_mlb", base + 0x74, 18);
|
|
|
+ clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20);
|
|
|
+ clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22);
|
|
|
+ clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
|
|
|
+ clk[openvg_axi] = imx_clk_gate2("openvg_axi", "axi", base + 0x74, 30);
|
|
|
+ clk[pcie_axi] = imx_clk_gate2("pcie_axi", "pcie_axi_sel", base + 0x78, 0);
|
|
|
+ clk[per1_bch] = imx_clk_gate2("per1_bch", "usdhc3", base + 0x78, 12);
|
|
|
+ clk[pwm1] = imx_clk_gate2("pwm1", "ipg_per", base + 0x78, 16);
|
|
|
+ clk[pwm2] = imx_clk_gate2("pwm2", "ipg_per", base + 0x78, 18);
|
|
|
+ clk[pwm3] = imx_clk_gate2("pwm3", "ipg_per", base + 0x78, 20);
|
|
|
+ clk[pwm4] = imx_clk_gate2("pwm4", "ipg_per", base + 0x78, 22);
|
|
|
+ clk[gpmi_bch_apb] = imx_clk_gate2("gpmi_bch_apb", "usdhc3", base + 0x78, 24);
|
|
|
+ clk[gpmi_bch] = imx_clk_gate2("gpmi_bch", "usdhc4", base + 0x78, 26);
|
|
|
+ clk[gpmi_io] = imx_clk_gate2("gpmi_io", "enfc", base + 0x78, 28);
|
|
|
+ clk[gpmi_apb] = imx_clk_gate2("gpmi_apb", "usdhc3", base + 0x78, 30);
|
|
|
+ clk[rom] = imx_clk_gate2("rom", "ahb", base + 0x7c, 0);
|
|
|
+ clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4);
|
|
|
+ clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6);
|
|
|
+ clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12);
|
|
|
+ clk[ssi1_ipg] = imx_clk_gate2("ssi1_ipg", "ipg", base + 0x7c, 18);
|
|
|
+ clk[ssi2_ipg] = imx_clk_gate2("ssi2_ipg", "ipg", base + 0x7c, 20);
|
|
|
+ clk[ssi3_ipg] = imx_clk_gate2("ssi3_ipg", "ipg", base + 0x7c, 22);
|
|
|
+ clk[uart_ipg] = imx_clk_gate2("uart_ipg", "ipg", base + 0x7c, 24);
|
|
|
+ clk[uart_serial] = imx_clk_gate2("uart_serial", "uart_serial_podf", base + 0x7c, 26);
|
|
|
+ clk[usboh3] = imx_clk_gate2("usboh3", "ipg", base + 0x80, 0);
|
|
|
+ clk[usdhc1] = imx_clk_gate2("usdhc1", "usdhc1_podf", base + 0x80, 2);
|
|
|
+ clk[usdhc2] = imx_clk_gate2("usdhc2", "usdhc2_podf", base + 0x80, 4);
|
|
|
+ clk[usdhc3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6);
|
|
|
+ clk[usdhc4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8);
|
|
|
+ clk[vdo_axi] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12);
|
|
|
+ clk[vpu_axi] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14);
|
|
|
+ clk[cko1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7);
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(clk); i++)
|
|
|
+ if (IS_ERR(clk[i]))
|
|
|
+ pr_err("i.MX6q clk %d: register failed with %ld\n",
|
|
|
+ i, PTR_ERR(clk[i]));
|
|
|
+
|
|
|
+ clk_data.clks = clk;
|
|
|
+ clk_data.clk_num = ARRAY_SIZE(clk);
|
|
|
+ of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
|
|
|
+
|
|
|
+ clk_register_clkdev(clk[gpt_ipg], "ipg", "imx-gpt.0");
|
|
|
+ clk_register_clkdev(clk[gpt_ipg_per], "per", "imx-gpt.0");
|
|
|
+ clk_register_clkdev(clk[twd], NULL, "smp_twd");
|
|
|
+ clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
|
|
|
+ clk_register_clkdev(clk[ahb], "ahb", NULL);
|
|
|
+ clk_register_clkdev(clk[cko1], "cko1", NULL);
|
|
|
+ clk_register_clkdev(clk[arm], NULL, "cpu0");
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The gpmi needs 100MHz frequency in the EDO/Sync mode,
|
|
|
+ * We can not get the 100MHz from the pll2_pfd0_352m.
|
|
|
+ * So choose pll2_pfd2_396m as enfc_sel's parent.
|
|
|
+ */
|
|
|
+ clk_set_parent(clk[enfc_sel], clk[pll2_pfd2_396m]);
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
|
|
|
+ clk_prepare_enable(clk[clks_init_on[i]]);
|
|
|
+
|
|
|
+ /* Set initial power mode */
|
|
|
+ imx6q_set_lpm(WAIT_CLOCKED);
|
|
|
+
|
|
|
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt");
|
|
|
+ base = of_iomap(np, 0);
|
|
|
+ WARN_ON(!base);
|
|
|
+ irq = irq_of_parse_and_map(np, 0);
|
|
|
+ mxc_timer_init(base, irq);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|