|
@@ -539,3 +539,111 @@ int omap2_clk_disable_autoidle_all(void)
|
|
|
list_for_each_entry(c, &clk_hw_omap_clocks, node)
|
|
|
if (c->ops && c->ops->deny_idle)
|
|
|
c->ops->deny_idle(c);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap2_clk_enable_init_clocks - prepare & enable a list of clocks
|
|
|
+ * @clk_names: ptr to an array of strings of clock names to enable
|
|
|
+ * @num_clocks: number of clock names in @clk_names
|
|
|
+ *
|
|
|
+ * Prepare and enable a list of clocks, named by @clk_names. No
|
|
|
+ * return value. XXX Deprecated; only needed until these clocks are
|
|
|
+ * properly claimed and enabled by the drivers or core code that uses
|
|
|
+ * them. XXX What code disables & calls clk_put on these clocks?
|
|
|
+ */
|
|
|
+void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)
|
|
|
+{
|
|
|
+ struct clk *init_clk;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < num_clocks; i++) {
|
|
|
+ init_clk = clk_get(NULL, clk_names[i]);
|
|
|
+ clk_prepare_enable(init_clk);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const struct clk_hw_omap_ops clkhwops_wait = {
|
|
|
+ .find_idlest = omap2_clk_dflt_find_idlest,
|
|
|
+ .find_companion = omap2_clk_dflt_find_companion,
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap2_clk_switch_mpurate_at_boot - switch ARM MPU rate by boot-time argument
|
|
|
+ * @mpurate_ck_name: clk name of the clock to change rate
|
|
|
+ *
|
|
|
+ * Change the ARM MPU clock rate to the rate specified on the command
|
|
|
+ * line, if one was specified. @mpurate_ck_name should be
|
|
|
+ * "virt_prcm_set" on OMAP2xxx and "dpll1_ck" on OMAP34xx/OMAP36xx.
|
|
|
+ * XXX Does not handle voltage scaling - on OMAP2xxx this is currently
|
|
|
+ * handled by the virt_prcm_set clock, but this should be handled by
|
|
|
+ * the OPP layer. XXX This is intended to be handled by the OPP layer
|
|
|
+ * code in the near future and should be removed from the clock code.
|
|
|
+ * Returns -EINVAL if 'mpurate' is zero or if clk_set_rate() rejects
|
|
|
+ * the rate, -ENOENT if the struct clk referred to by @mpurate_ck_name
|
|
|
+ * cannot be found, or 0 upon success.
|
|
|
+ */
|
|
|
+int __init omap2_clk_switch_mpurate_at_boot(const char *mpurate_ck_name)
|
|
|
+{
|
|
|
+ struct clk *mpurate_ck;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ if (!mpurate)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ mpurate_ck = clk_get(NULL, mpurate_ck_name);
|
|
|
+ if (WARN(IS_ERR(mpurate_ck), "Failed to get %s.\n", mpurate_ck_name))
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ r = clk_set_rate(mpurate_ck, mpurate);
|
|
|
+ if (IS_ERR_VALUE(r)) {
|
|
|
+ WARN(1, "clock: %s: unable to set MPU rate to %d: %d\n",
|
|
|
+ mpurate_ck_name, mpurate, r);
|
|
|
+ clk_put(mpurate_ck);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ calibrate_delay();
|
|
|
+ clk_put(mpurate_ck);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * omap2_clk_print_new_rates - print summary of current clock tree rates
|
|
|
+ * @hfclkin_ck_name: clk name for the off-chip HF oscillator
|
|
|
+ * @core_ck_name: clk name for the on-chip CORE_CLK
|
|
|
+ * @mpu_ck_name: clk name for the ARM MPU clock
|
|
|
+ *
|
|
|
+ * Prints a short message to the console with the HFCLKIN oscillator
|
|
|
+ * rate, the rate of the CORE clock, and the rate of the ARM MPU clock.
|
|
|
+ * Called by the boot-time MPU rate switching code. XXX This is intended
|
|
|
+ * to be handled by the OPP layer code in the near future and should be
|
|
|
+ * removed from the clock code. No return value.
|
|
|
+ */
|
|
|
+void __init omap2_clk_print_new_rates(const char *hfclkin_ck_name,
|
|
|
+ const char *core_ck_name,
|
|
|
+ const char *mpu_ck_name)
|
|
|
+{
|
|
|
+ struct clk *hfclkin_ck, *core_ck, *mpu_ck;
|
|
|
+ unsigned long hfclkin_rate;
|
|
|
+
|
|
|
+ mpu_ck = clk_get(NULL, mpu_ck_name);
|
|
|
+ if (WARN(IS_ERR(mpu_ck), "clock: failed to get %s.\n", mpu_ck_name))
|
|
|
+ return;
|
|
|
+
|
|
|
+ core_ck = clk_get(NULL, core_ck_name);
|
|
|
+ if (WARN(IS_ERR(core_ck), "clock: failed to get %s.\n", core_ck_name))
|
|
|
+ return;
|
|
|
+
|
|
|
+ hfclkin_ck = clk_get(NULL, hfclkin_ck_name);
|
|
|
+ if (WARN(IS_ERR(hfclkin_ck), "Failed to get %s.\n", hfclkin_ck_name))
|
|
|
+ return;
|
|
|
+
|
|
|
+ hfclkin_rate = clk_get_rate(hfclkin_ck);
|
|
|
+
|
|
|
+ pr_info("Switched to new clocking rate (Crystal/Core/MPU): %ld.%01ld/%ld/%ld MHz\n",
|
|
|
+ (hfclkin_rate / 1000000), ((hfclkin_rate / 100000) % 10),
|
|
|
+ (clk_get_rate(core_ck) / 1000000),
|
|
|
+ (clk_get_rate(mpu_ck) / 1000000));
|
|
|
+}
|