]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ARM: OMAP2: clock: add DT boot support for cpufreq_ck
authorTero Kristo <t-kristo@ti.com>
Mon, 24 Feb 2014 16:49:35 +0000 (18:49 +0200)
committerTero Kristo <t-kristo@ti.com>
Wed, 28 May 2014 10:05:57 +0000 (13:05 +0300)
The clock and clkdev for this are added manually.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c
drivers/clk/ti/clk-2xxx.c
include/linux/clk/ti.h

index b935ed2922d806725cd6916ce18bd429acf8e926..85e0b0c06718f0e8f1127192bfd65d5a2d4210ce 100644 (file)
@@ -208,3 +208,56 @@ void omap2xxx_clkt_vps_late_init(void)
                clk_put(c);
        }
 }
+
+#ifdef CONFIG_OF
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+
+static const struct clk_ops virt_prcm_set_ops = {
+       .recalc_rate    = &omap2_table_mpu_recalc,
+       .set_rate       = &omap2_select_table_rate,
+       .round_rate     = &omap2_round_to_table_rate,
+};
+
+/**
+ * omap2xxx_clkt_vps_init - initialize virt_prcm_set clock
+ *
+ * Does a manual init for the virtual prcm DVFS clock for OMAP2. This
+ * function is called only from omap2 DT clock init, as the virtual
+ * node is not modelled in the DT clock data.
+ */
+void omap2xxx_clkt_vps_init(void)
+{
+       struct clk_init_data init = { NULL };
+       struct clk_hw_omap *hw = NULL;
+       struct clk *clk;
+       const char *parent_name = "mpu_ck";
+       struct clk_lookup *lookup = NULL;
+
+       omap2xxx_clkt_vps_late_init();
+       omap2xxx_clkt_vps_check_bootloader_rates();
+
+       hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+       lookup = kzalloc(sizeof(*lookup), GFP_KERNEL);
+       if (!hw || !lookup)
+               goto cleanup;
+       init.name = "virt_prcm_set";
+       init.ops = &virt_prcm_set_ops;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       hw->hw.init = &init;
+
+       clk = clk_register(NULL, &hw->hw);
+
+       lookup->dev_id = NULL;
+       lookup->con_id = "cpufreq_ck";
+       lookup->clk = clk;
+
+       clkdev_add(lookup);
+       return;
+cleanup:
+       kfree(hw);
+       kfree(lookup);
+}
+#endif
index f6400fb5ee3eb76606e7896decf2056b0a2009e0..c808ab3d2bb22e7ceca914de1a7287c73d0cf5cb 100644 (file)
@@ -229,6 +229,8 @@ static int __init omap2xxx_dt_clk_init(int soc_type)
        else
                ti_dt_clocks_register(omap2430_clks);
 
+       omap2xxx_clkt_vps_init();
+
        omap2_clk_disable_autoidle_all();
 
        omap2_clk_enable_init_clocks(enable_init_clks,
index 188f0cbb26c2b1196e357234b8c270f0d71817c5..4231c41bed517d91b03dc398d4a56b07ca152b21 100644 (file)
@@ -283,6 +283,7 @@ unsigned long omap2_dpllcore_recalc(struct clk_hw *hw,
 int omap2_reprogram_dpllcore(struct clk_hw *clk, unsigned long rate,
                             unsigned long parent_rate);
 void omap2xxx_clkt_dpllcore_init(struct clk_hw *hw);
+void omap2xxx_clkt_vps_init(void);
 
 void __iomem *ti_clk_get_reg_addr(struct device_node *node, int index);
 void ti_dt_clocks_register(struct ti_dt_clk *oclks);