|
@@ -21,6 +21,8 @@
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
|
|
|
|
|
|
+#include "clk.h"
|
|
|
|
+
|
|
static DEFINE_SPINLOCK(enable_lock);
|
|
static DEFINE_SPINLOCK(enable_lock);
|
|
static DEFINE_MUTEX(prepare_lock);
|
|
static DEFINE_MUTEX(prepare_lock);
|
|
|
|
|
|
@@ -2111,7 +2113,18 @@ static const struct of_device_id __clk_of_table_sentinel
|
|
__used __section(__clk_of_table_end);
|
|
__used __section(__clk_of_table_end);
|
|
|
|
|
|
static LIST_HEAD(of_clk_providers);
|
|
static LIST_HEAD(of_clk_providers);
|
|
-static DEFINE_MUTEX(of_clk_lock);
|
|
|
|
|
|
+static DEFINE_MUTEX(of_clk_mutex);
|
|
|
|
+
|
|
|
|
+/* of_clk_provider list locking helpers */
|
|
|
|
+void of_clk_lock(void)
|
|
|
|
+{
|
|
|
|
+ mutex_lock(&of_clk_mutex);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void of_clk_unlock(void)
|
|
|
|
+{
|
|
|
|
+ mutex_unlock(&of_clk_mutex);
|
|
|
|
+}
|
|
|
|
|
|
struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,
|
|
struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,
|
|
void *data)
|
|
void *data)
|
|
@@ -2155,9 +2168,9 @@ int of_clk_add_provider(struct device_node *np,
|
|
cp->data = data;
|
|
cp->data = data;
|
|
cp->get = clk_src_get;
|
|
cp->get = clk_src_get;
|
|
|
|
|
|
- mutex_lock(&of_clk_lock);
|
|
|
|
|
|
+ mutex_lock(&of_clk_mutex);
|
|
list_add(&cp->link, &of_clk_providers);
|
|
list_add(&cp->link, &of_clk_providers);
|
|
- mutex_unlock(&of_clk_lock);
|
|
|
|
|
|
+ mutex_unlock(&of_clk_mutex);
|
|
pr_debug("Added clock from %s\n", np->full_name);
|
|
pr_debug("Added clock from %s\n", np->full_name);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -2172,7 +2185,7 @@ void of_clk_del_provider(struct device_node *np)
|
|
{
|
|
{
|
|
struct of_clk_provider *cp;
|
|
struct of_clk_provider *cp;
|
|
|
|
|
|
- mutex_lock(&of_clk_lock);
|
|
|
|
|
|
+ mutex_lock(&of_clk_mutex);
|
|
list_for_each_entry(cp, &of_clk_providers, link) {
|
|
list_for_each_entry(cp, &of_clk_providers, link) {
|
|
if (cp->node == np) {
|
|
if (cp->node == np) {
|
|
list_del(&cp->link);
|
|
list_del(&cp->link);
|
|
@@ -2181,24 +2194,33 @@ void of_clk_del_provider(struct device_node *np)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- mutex_unlock(&of_clk_lock);
|
|
|
|
|
|
+ mutex_unlock(&of_clk_mutex);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(of_clk_del_provider);
|
|
EXPORT_SYMBOL_GPL(of_clk_del_provider);
|
|
|
|
|
|
-struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec)
|
|
|
|
|
|
+struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec)
|
|
{
|
|
{
|
|
struct of_clk_provider *provider;
|
|
struct of_clk_provider *provider;
|
|
struct clk *clk = ERR_PTR(-ENOENT);
|
|
struct clk *clk = ERR_PTR(-ENOENT);
|
|
|
|
|
|
/* Check if we have such a provider in our array */
|
|
/* Check if we have such a provider in our array */
|
|
- mutex_lock(&of_clk_lock);
|
|
|
|
list_for_each_entry(provider, &of_clk_providers, link) {
|
|
list_for_each_entry(provider, &of_clk_providers, link) {
|
|
if (provider->node == clkspec->np)
|
|
if (provider->node == clkspec->np)
|
|
clk = provider->get(clkspec, provider->data);
|
|
clk = provider->get(clkspec, provider->data);
|
|
if (!IS_ERR(clk))
|
|
if (!IS_ERR(clk))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- mutex_unlock(&of_clk_lock);
|
|
|
|
|
|
+
|
|
|
|
+ return clk;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec)
|
|
|
|
+{
|
|
|
|
+ struct clk *clk;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&of_clk_mutex);
|
|
|
|
+ clk = __of_clk_get_from_provider(clkspec);
|
|
|
|
+ mutex_unlock(&of_clk_mutex);
|
|
|
|
|
|
return clk;
|
|
return clk;
|
|
}
|
|
}
|