|
@@ -657,3 +657,189 @@ static struct clk virtual_ck_mpu = {
|
|
.round_rate = &omap1_round_to_table_rate,
|
|
.round_rate = &omap1_round_to_table_rate,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
|
|
|
|
+remains active during MPU idle whenever this is enabled */
|
|
|
|
+static struct clk i2c_fck = {
|
|
|
|
+ .name = "i2c_fck",
|
|
|
|
+ .ops = &clkops_null,
|
|
|
|
+ .flags = CLOCK_NO_IDLE_PARENT,
|
|
|
|
+ .parent = &armxor_ck.clk,
|
|
|
|
+ .recalc = &followparent_recalc,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct clk i2c_ick = {
|
|
|
|
+ .name = "i2c_ick",
|
|
|
|
+ .ops = &clkops_null,
|
|
|
|
+ .flags = CLOCK_NO_IDLE_PARENT,
|
|
|
|
+ .parent = &armper_ck.clk,
|
|
|
|
+ .recalc = &followparent_recalc,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * clkdev integration
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static struct omap_clk omap_clks[] = {
|
|
|
|
+ /* non-ULPD clocks */
|
|
|
|
+ CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ /* CK_GEN1 clocks */
|
|
|
|
+ CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
|
|
|
|
+ CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap_gpio.0", "ick", &arm_gpio_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap_wdt", "ick", &armper_ck.clk, CK_16XX),
|
|
|
|
+ CLK("omap_wdt", "ick", &dummy_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "arminth_ck", &arminth_ck1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "arminth_ck", &arminth_ck16xx, CK_16XX),
|
|
|
|
+ /* CK_GEN2 clocks */
|
|
|
|
+ CLK(NULL, "dsp_ck", &dsp_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "dspmmu_ck", &dspmmu_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "dspper_ck", &dspper_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "dspxor_ck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "dsptim_ck", &dsptim_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ /* CK_GEN3 clocks */
|
|
|
|
+ CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK(NULL, "tipb_ck", &tipb_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "l3_ocpi_ck", &l3_ocpi_ck, CK_16XX | CK_7XX),
|
|
|
|
+ CLK(NULL, "tc1_ck", &tc1_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "lcd_ck", &lcd_ck_16xx, CK_16XX | CK_7XX),
|
|
|
|
+ CLK(NULL, "lcd_ck", &lcd_ck_1510.clk, CK_1510 | CK_310),
|
|
|
|
+ /* ULPD clocks */
|
|
|
|
+ CLK(NULL, "uart1_ck", &uart1_1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "uart1_ck", &uart1_16xx.clk, CK_16XX),
|
|
|
|
+ CLK(NULL, "uart1_ck", &uart1_7xx, CK_7XX),
|
|
|
|
+ CLK(NULL, "uart2_ck", &uart2_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "uart2_ck", &uart2_7xx, CK_7XX),
|
|
|
|
+ CLK(NULL, "uart3_ck", &uart3_1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "uart3_ck", &uart3_16xx.clk, CK_16XX),
|
|
|
|
+ CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
|
|
|
|
+ CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX),
|
|
|
|
+ CLK(NULL, "usb_dc_ck", &usb_dc_ck7xx, CK_7XX),
|
|
|
|
+ CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
|
|
|
|
+ CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
|
|
|
|
+ CLK(NULL, "bclk", &bclk_16xx, CK_16XX),
|
|
|
|
+ CLK("mmci-omap.0", "fck", &mmc1_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("mmci-omap.0", "fck", &mmc3_ck, CK_7XX),
|
|
|
|
+ CLK("mmci-omap.0", "ick", &armper_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK("mmci-omap.1", "fck", &mmc2_ck, CK_16XX),
|
|
|
|
+ CLK("mmci-omap.1", "ick", &armper_ck.clk, CK_16XX),
|
|
|
|
+ /* Virtual clocks */
|
|
|
|
+ CLK(NULL, "mpu", &virtual_ck_mpu, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap_i2c.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK("omap_i2c.1", "ick", &i2c_ick, CK_16XX),
|
|
|
|
+ CLK("omap_i2c.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),
|
|
|
|
+ CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX),
|
|
|
|
+ CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX),
|
|
|
|
+ CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX),
|
|
|
|
+ CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX),
|
|
|
|
+ CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),
|
|
|
|
+ CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.2", "ick", &armper_ck.clk, CK_16XX),
|
|
|
|
+ CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.3", "ick", &dspper_ck, CK_16XX),
|
|
|
|
+ CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.1", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.2", "fck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+ CLK("omap-mcbsp.3", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * init
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static void __init omap1_show_rates(void)
|
|
|
|
+{
|
|
|
|
+ pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
|
|
|
|
+ ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
|
|
|
|
+ ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
|
|
|
|
+ arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+u32 cpu_mask;
|
|
|
|
+
|
|
|
|
+int __init omap1_clk_init(void)
|
|
|
|
+{
|
|
|
|
+ struct omap_clk *c;
|
|
|
|
+ int crystal_type = 0; /* Default 12 MHz */
|
|
|
|
+ u32 reg;
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_DEBUG_LL
|
|
|
|
+ /*
|
|
|
|
+ * Resets some clocks that may be left on from bootloader,
|
|
|
|
+ * but leaves serial clocks on.
|
|
|
|
+ */
|
|
|
|
+ omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */
|
|
|
|
+ reg = omap_readw(SOFT_REQ_REG) & (1 << 4);
|
|
|
|
+ omap_writew(reg, SOFT_REQ_REG);
|
|
|
|
+ if (!cpu_is_omap15xx())
|
|
|
|
+ omap_writew(0, SOFT_REQ_REG2);
|
|
|
|
+
|
|
|
|
+ /* By default all idlect1 clocks are allowed to idle */
|
|
|
|
+ arm_idlect1_mask = ~0;
|
|
|
|
+
|
|
|
|
+ for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
|
|
|
|
+ clk_preinit(c->lk.clk);
|
|
|
|
+
|
|
|
|
+ cpu_mask = 0;
|
|
|
|
+ if (cpu_is_omap1710())
|
|
|
|
+ cpu_mask |= CK_1710;
|
|
|
|
+ if (cpu_is_omap16xx())
|
|
|
|
+ cpu_mask |= CK_16XX;
|
|
|
|
+ if (cpu_is_omap1510())
|
|
|
|
+ cpu_mask |= CK_1510;
|
|
|
|
+ if (cpu_is_omap7xx())
|
|
|
|
+ cpu_mask |= CK_7XX;
|
|
|
|
+ if (cpu_is_omap310())
|
|
|
|
+ cpu_mask |= CK_310;
|
|
|
|
+
|
|
|
|
+ for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
|
|
|
|
+ if (c->cpu & cpu_mask) {
|
|
|
|
+ clkdev_add(&c->lk);
|
|
|
|
+ clk_register(c->lk.clk);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Pointers to these clocks are needed by code in clock.c */
|
|
|
|
+ api_ck_p = clk_get(NULL, "api_ck");
|
|
|
|
+ ck_dpll1_p = clk_get(NULL, "ck_dpll1");
|
|
|
|
+ ck_ref_p = clk_get(NULL, "ck_ref");
|
|
|
|
+
|
|
|
|
+ if (cpu_is_omap7xx())
|
|
|
|
+ ck_ref.rate = 13000000;
|
|
|
|
+ if (cpu_is_omap16xx() && crystal_type == 2)
|
|
|
|
+ ck_ref.rate = 19200000;
|
|
|
|
+
|
|
|
|
+ pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
|
|
|
|
+ omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
|
|
|
|
+ omap_readw(ARM_CKCTL));
|
|
|
|
+
|
|
|
|
+ /* We want to be in syncronous scalable mode */
|
|
|
|
+ omap_writew(0x1000, ARM_SYSST);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Initially use the values set by bootloader. Determine PLL rate and
|
|
|
|
+ * recalculate dependent clocks as if kernel had changed PLL or
|
|
|
|
+ * divisors. See also omap1_clk_late_init() that can reprogram dpll1
|
|
|
|
+ * after the SRAM is initialized.
|
|
|
|
+ */
|
|
|
|
+ {
|
|
|
|
+ unsigned pll_ctl_val = omap_readw(DPLL_CTL);
|