|
@@ -49,3 +49,62 @@ static const char *std_sel[] = {"ppll", "arm"};
|
|
static const char *ipg_per_sel[] = {"ahb_per_div", "arm_per_div"};
|
|
static const char *ipg_per_sel[] = {"ahb_per_div", "arm_per_div"};
|
|
|
|
|
|
enum mx35_clks {
|
|
enum mx35_clks {
|
|
|
|
+ ckih, mpll, ppll, mpll_075, arm, hsp, hsp_div, hsp_sel, ahb, ipg,
|
|
|
|
+ arm_per_div, ahb_per_div, ipg_per, uart_sel, uart_div, esdhc_sel,
|
|
|
|
+ esdhc1_div, esdhc2_div, esdhc3_div, spdif_sel, spdif_div_pre,
|
|
|
|
+ spdif_div_post, ssi_sel, ssi1_div_pre, ssi1_div_post, ssi2_div_pre,
|
|
|
|
+ ssi2_div_post, usb_sel, usb_div, nfc_div, asrc_gate, pata_gate,
|
|
|
|
+ audmux_gate, can1_gate, can2_gate, cspi1_gate, cspi2_gate, ect_gate,
|
|
|
|
+ edio_gate, emi_gate, epit1_gate, epit2_gate, esai_gate, esdhc1_gate,
|
|
|
|
+ esdhc2_gate, esdhc3_gate, fec_gate, gpio1_gate, gpio2_gate, gpio3_gate,
|
|
|
|
+ gpt_gate, i2c1_gate, i2c2_gate, i2c3_gate, iomuxc_gate, ipu_gate,
|
|
|
|
+ kpp_gate, mlb_gate, mshc_gate, owire_gate, pwm_gate, rngc_gate,
|
|
|
|
+ rtc_gate, rtic_gate, scc_gate, sdma_gate, spba_gate, spdif_gate,
|
|
|
|
+ ssi1_gate, ssi2_gate, uart1_gate, uart2_gate, uart3_gate, usbotg_gate,
|
|
|
|
+ wdog_gate, max_gate, admux_gate, csi_gate, csi_div, csi_sel, iim_gate,
|
|
|
|
+ gpu2d_gate, clk_max
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk *clk[clk_max];
|
|
|
|
+
|
|
|
|
+int __init mx35_clocks_init()
|
|
|
|
+{
|
|
|
|
+ void __iomem *base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR);
|
|
|
|
+ u32 pdr0, consumer_sel, hsp_sel;
|
|
|
|
+ struct arm_ahb_div *aad;
|
|
|
|
+ unsigned char *hsp_div;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ pdr0 = __raw_readl(base + MXC_CCM_PDR0);
|
|
|
|
+ consumer_sel = (pdr0 >> 16) & 0xf;
|
|
|
|
+ aad = &clk_consumer[consumer_sel];
|
|
|
|
+ if (!aad->arm) {
|
|
|
|
+ pr_err("i.MX35 clk: illegal consumer mux selection 0x%x\n", consumer_sel);
|
|
|
|
+ /*
|
|
|
|
+ * We are basically stuck. Continue with a default entry and hope we
|
|
|
|
+ * get far enough to actually show the above message
|
|
|
|
+ */
|
|
|
|
+ aad = &clk_consumer[0];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ clk[ckih] = imx_clk_fixed("ckih", 24000000);
|
|
|
|
+ clk[mpll] = imx_clk_pllv1("mpll", "ckih", base + MX35_CCM_MPCTL);
|
|
|
|
+ clk[ppll] = imx_clk_pllv1("ppll", "ckih", base + MX35_CCM_PPCTL);
|
|
|
|
+
|
|
|
|
+ clk[mpll] = imx_clk_fixed_factor("mpll_075", "mpll", 3, 4);
|
|
|
|
+
|
|
|
|
+ if (aad->sel)
|
|
|
|
+ clk[arm] = imx_clk_fixed_factor("arm", "mpll_075", 1, aad->arm);
|
|
|
|
+ else
|
|
|
|
+ clk[arm] = imx_clk_fixed_factor("arm", "mpll", 1, aad->arm);
|
|
|
|
+
|
|
|
|
+ if (clk_get_rate(clk[arm]) > 400000000)
|
|
|
|
+ hsp_div = hsp_div_532;
|
|
|
|
+ else
|
|
|
|
+ hsp_div = hsp_div_400;
|
|
|
|
+
|
|
|
|
+ hsp_sel = (pdr0 >> 20) & 0x3;
|
|
|
|
+ if (!hsp_div[hsp_sel]) {
|
|
|
|
+ pr_err("i.MX35 clk: illegal hsp clk selection 0x%x\n", hsp_sel);
|
|
|
|
+ hsp_sel = 0;
|
|
|
|
+ }
|