Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
[sfrench/cifs-2.6.git] / drivers / clk / clk.c
index 87b410d6e51def62a75417e93304f7997becfa4b..c0990703ce5403c1092bda6d982c56dffd70e6a0 100644 (file)
@@ -1324,10 +1324,7 @@ static void clk_core_init_rate_req(struct clk_core * const core,
 
 static bool clk_core_can_round(struct clk_core * const core)
 {
-       if (core->ops->determine_rate || core->ops->round_rate)
-               return true;
-
-       return false;
+       return core->ops->determine_rate || core->ops->round_rate;
 }
 
 static int clk_core_round_rate_nolock(struct clk_core *core,
@@ -2194,7 +2191,7 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
 EXPORT_SYMBOL_GPL(clk_set_rate);
 
 /**
- * clk_set_rate_exclusive - specify a new rate get exclusive control
+ * clk_set_rate_exclusive - specify a new rate and get exclusive control
  * @clk: the clk whose rate is being changed
  * @rate: the new rate for clk
  *
@@ -2202,7 +2199,7 @@ EXPORT_SYMBOL_GPL(clk_set_rate);
  * within a critical section
  *
  * This can be used initially to ensure that at least 1 consumer is
- * statisfied when several consumers are competing for exclusivity over the
+ * satisfied when several consumers are competing for exclusivity over the
  * same clock provider.
  *
  * The exclusivity is not applied if setting the rate failed.
@@ -2997,20 +2994,65 @@ static int clk_flags_show(struct seq_file *s, void *data)
 }
 DEFINE_SHOW_ATTRIBUTE(clk_flags);
 
+static void possible_parent_show(struct seq_file *s, struct clk_core *core,
+                                unsigned int i, char terminator)
+{
+       struct clk_core *parent;
+
+       /*
+        * Go through the following options to fetch a parent's name.
+        *
+        * 1. Fetch the registered parent clock and use its name
+        * 2. Use the global (fallback) name if specified
+        * 3. Use the local fw_name if provided
+        * 4. Fetch parent clock's clock-output-name if DT index was set
+        *
+        * This may still fail in some cases, such as when the parent is
+        * specified directly via a struct clk_hw pointer, but it isn't
+        * registered (yet).
+        */
+       parent = clk_core_get_parent_by_index(core, i);
+       if (parent)
+               seq_printf(s, "%s", parent->name);
+       else if (core->parents[i].name)
+               seq_printf(s, "%s", core->parents[i].name);
+       else if (core->parents[i].fw_name)
+               seq_printf(s, "<%s>(fw)", core->parents[i].fw_name);
+       else if (core->parents[i].index >= 0)
+               seq_printf(s, "%s",
+                          of_clk_get_parent_name(core->of_node,
+                                                 core->parents[i].index));
+       else
+               seq_puts(s, "(missing)");
+
+       seq_putc(s, terminator);
+}
+
 static int possible_parents_show(struct seq_file *s, void *data)
 {
        struct clk_core *core = s->private;
        int i;
 
        for (i = 0; i < core->num_parents - 1; i++)
-               seq_printf(s, "%s ", core->parents[i].name);
+               possible_parent_show(s, core, i, ' ');
 
-       seq_printf(s, "%s\n", core->parents[i].name);
+       possible_parent_show(s, core, i, '\n');
 
        return 0;
 }
 DEFINE_SHOW_ATTRIBUTE(possible_parents);
 
+static int current_parent_show(struct seq_file *s, void *data)
+{
+       struct clk_core *core = s->private;
+
+       if (core->parent)
+               seq_printf(s, "%s\n", core->parent->name);
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(current_parent);
+
 static int clk_duty_cycle_show(struct seq_file *s, void *data)
 {
        struct clk_core *core = s->private;
@@ -3043,6 +3085,10 @@ static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)
        debugfs_create_file("clk_duty_cycle", 0444, root, core,
                            &clk_duty_cycle_fops);
 
+       if (core->num_parents > 0)
+               debugfs_create_file("clk_parent", 0444, root, core,
+                                   &current_parent_fops);
+
        if (core->num_parents > 1)
                debugfs_create_file("clk_possible_parents", 0444, root, core,
                                    &possible_parents_fops);
@@ -4038,6 +4084,7 @@ struct of_clk_provider {
        void *data;
 };
 
+extern struct of_device_id __clk_of_table;
 static const struct of_device_id __clk_of_table_sentinel
        __used __section(__clk_of_table_end);