Merge branch 'next/devel2' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/linux...
[pandora-kernel.git] / arch / arm / plat-omap / omap_device.c
index 3471c65..b6b4097 100644 (file)
@@ -236,56 +236,71 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
        return 0;
 }
 
+static void _add_clkdev(struct omap_device *od, const char *clk_alias,
+                      const char *clk_name)
+{
+       struct clk *r;
+       struct clk_lookup *l;
+
+       if (!clk_alias || !clk_name)
+               return;
+
+       pr_debug("omap_device: %s: Creating %s -> %s\n",
+                dev_name(&od->pdev.dev), clk_alias, clk_name);
+
+       r = clk_get_sys(dev_name(&od->pdev.dev), clk_alias);
+       if (!IS_ERR(r)) {
+               pr_warning("omap_device: %s: alias %s already exists\n",
+                          dev_name(&od->pdev.dev), clk_alias);
+               clk_put(r);
+               return;
+       }
+
+       r = omap_clk_get_by_name(clk_name);
+       if (IS_ERR(r)) {
+               pr_err("omap_device: %s: omap_clk_get_by_name for %s failed\n",
+                      dev_name(&od->pdev.dev), clk_name);
+               return;
+       }
+
+       l = clkdev_alloc(r, clk_alias, dev_name(&od->pdev.dev));
+       if (!l) {
+               pr_err("omap_device: %s: clkdev_alloc for %s failed\n",
+                      dev_name(&od->pdev.dev), clk_alias);
+               return;
+       }
+
+       clkdev_add(l);
+}
+
 /**
- * _add_optional_clock_clkdev - Add clkdev entry for hwmod optional clocks
+ * _add_hwmod_clocks_clkdev - Add clkdev entry for hwmod optional clocks
+ * and main clock
  * @od: struct omap_device *od
+ * @oh: struct omap_hwmod *oh
  *
- * For every optional clock present per hwmod per omap_device, this function
- * adds an entry in the clkdev table of the form <dev-id=dev_name, con-id=role>
- * if it does not exist already.
+ * For the main clock and every optional clock present per hwmod per
+ * omap_device, this function adds an entry in the clkdev table of the
+ * form <dev-id=dev_name, con-id=role> if it does not exist already.
  *
  * The function is called from inside omap_device_build_ss(), after
  * omap_device_register.
  *
  * This allows drivers to get a pointer to its optional clocks based on its role
  * by calling clk_get(<dev*>, <role>).
+ * In the case of the main clock, a "fck" alias is used.
  *
  * No return value.
  */
-static void _add_optional_clock_clkdev(struct omap_device *od,
-                                     struct omap_hwmod *oh)
+static void _add_hwmod_clocks_clkdev(struct omap_device *od,
+                                    struct omap_hwmod *oh)
 {
        int i;
 
-       for (i = 0; i < oh->opt_clks_cnt; i++) {
-               struct omap_hwmod_opt_clk *oc;
-               struct clk *r;
-               struct clk_lookup *l;
-
-               oc = &oh->opt_clks[i];
-
-               if (!oc->_clk)
-                       continue;
-
-               r = clk_get_sys(dev_name(&od->pdev.dev), oc->role);
-               if (!IS_ERR(r))
-                       continue; /* clkdev entry exists */
+       _add_clkdev(od, "fck", oh->main_clk);
 
-               r = omap_clk_get_by_name((char *)oc->clk);
-               if (IS_ERR(r)) {
-                       pr_err("omap_device: %s: omap_clk_get_by_name for %s failed\n",
-                              dev_name(&od->pdev.dev), oc->clk);
-                       continue;
-               }
-
-               l = clkdev_alloc(r, oc->role, dev_name(&od->pdev.dev));
-               if (!l) {
-                       pr_err("omap_device: %s: clkdev_alloc for %s failed\n",
-                              dev_name(&od->pdev.dev), oc->role);
-                       return;
-               }
-               clkdev_add(l);
-       }
+       for (i = 0; i < oh->opt_clks_cnt; i++)
+               _add_clkdev(od, oh->opt_clks[i].role, oh->opt_clks[i].clk);
 }
 
 
@@ -492,7 +507,7 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
 
        for (i = 0; i < oh_cnt; i++) {
                hwmods[i]->od = od;
-               _add_optional_clock_clkdev(od, hwmods[i]);
+               _add_hwmod_clocks_clkdev(od, hwmods[i]);
        }
 
        if (ret)