summaryrefslogtreecommitdiff
path: root/patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch')
-rw-r--r--patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch168
1 files changed, 168 insertions, 0 deletions
diff --git a/patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch b/patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch
new file mode 100644
index 00000000000..f011e2f3e8c
--- /dev/null
+++ b/patches.tizen/0683-clk-Add-common-__clk_get-__clk_put-implementations.patch
@@ -0,0 +1,168 @@
+From 37daacc3ba1138c570ac7e914785d2714d8da20b Mon Sep 17 00:00:00 2001
+From: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Date: Fri, 30 Aug 2013 13:02:40 +0200
+Subject: [PATCH 0683/1302] clk: Add common __clk_get(), __clk_put()
+ implementations
+
+This patch adds common __clk_get(), __clk_put() clkdev helpers which
+replace their platform specific counterparts when the common clock
+API is enabled.
+
+The owner module pointer field is added to struct clk so a reference
+to the clock supplier module can be taken by the clock consumers.
+
+Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+---
+Changes since v5:
+ - none.
+
+Changes since v4:
+ - dropped unnecessary struct module forward declaration from
+ clk-provider.h
+
+Changes since v3:
+ - dropped exporting of __clk_get(), __clk_put().
+
+Changes since v2:
+ - fixed handling of NULL clock pointers in __clk_get(), __clk_put();
+
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ arch/arm/include/asm/clkdev.h | 2 ++
+ arch/blackfin/include/asm/clkdev.h | 2 ++
+ arch/mips/include/asm/clkdev.h | 2 ++
+ arch/sh/include/asm/clkdev.h | 2 ++
+ drivers/clk/clk.c | 20 ++++++++++++++++++++
+ include/linux/clk-private.h | 3 +++
+ include/linux/clkdev.h | 5 +++++
+ 7 files changed, 36 insertions(+)
+
+diff --git a/arch/arm/include/asm/clkdev.h b/arch/arm/include/asm/clkdev.h
+index 80751c1..4e8a4b2 100644
+--- a/arch/arm/include/asm/clkdev.h
++++ b/arch/arm/include/asm/clkdev.h
+@@ -14,12 +14,14 @@
+
+ #include <linux/slab.h>
+
++#ifndef CONFIG_COMMON_CLK
+ #ifdef CONFIG_HAVE_MACH_CLKDEV
+ #include <mach/clkdev.h>
+ #else
+ #define __clk_get(clk) ({ 1; })
+ #define __clk_put(clk) do { } while (0)
+ #endif
++#endif
+
+ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
+ {
+diff --git a/arch/blackfin/include/asm/clkdev.h b/arch/blackfin/include/asm/clkdev.h
+index 9053bed..7ac2436 100644
+--- a/arch/blackfin/include/asm/clkdev.h
++++ b/arch/blackfin/include/asm/clkdev.h
+@@ -8,7 +8,9 @@ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
+ return kzalloc(size, GFP_KERNEL);
+ }
+
++#ifndef CONFIG_COMMON_CLK
+ #define __clk_put(clk)
+ #define __clk_get(clk) ({ 1; })
++#endif
+
+ #endif
+diff --git a/arch/mips/include/asm/clkdev.h b/arch/mips/include/asm/clkdev.h
+index 2624754..1b3ad7b 100644
+--- a/arch/mips/include/asm/clkdev.h
++++ b/arch/mips/include/asm/clkdev.h
+@@ -14,8 +14,10 @@
+
+ #include <linux/slab.h>
+
++#ifndef CONFIG_COMMON_CLK
+ #define __clk_get(clk) ({ 1; })
+ #define __clk_put(clk) do { } while (0)
++#endif
+
+ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
+ {
+diff --git a/arch/sh/include/asm/clkdev.h b/arch/sh/include/asm/clkdev.h
+index 6ba9186..c419014 100644
+--- a/arch/sh/include/asm/clkdev.h
++++ b/arch/sh/include/asm/clkdev.h
+@@ -25,7 +25,9 @@ static inline struct clk_lookup_alloc *__clkdev_alloc(size_t size)
+ return kzalloc(size, GFP_KERNEL);
+ }
+
++#ifndef CONFIG_COMMON_CLK
+ #define __clk_put(clk)
+ #define __clk_get(clk) ({ 1; })
++#endif
+
+ #endif /* __CLKDEV_H__ */
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index 8f56e3d..05a60cf 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -1857,6 +1857,26 @@ void devm_clk_unregister(struct device *dev, struct clk *clk)
+ }
+ EXPORT_SYMBOL_GPL(devm_clk_unregister);
+
++/*
++ * clkdev helpers
++ */
++int __clk_get(struct clk *clk)
++{
++ if (clk && !try_module_get(clk->owner))
++ return 0;
++
++ return 1;
++}
++
++void __clk_put(struct clk *clk)
++{
++ if (WARN_ON_ONCE(IS_ERR(clk)))
++ return;
++
++ if (clk)
++ module_put(clk->owner);
++}
++
+ /*** clk rate change notifiers ***/
+
+ /**
+diff --git a/include/linux/clk-private.h b/include/linux/clk-private.h
+index dd7adff..b7c0b58 100644
+--- a/include/linux/clk-private.h
++++ b/include/linux/clk-private.h
+@@ -25,10 +25,13 @@
+
+ #ifdef CONFIG_COMMON_CLK
+
++struct module;
++
+ struct clk {
+ const char *name;
+ const struct clk_ops *ops;
+ struct clk_hw *hw;
++ struct module *owner;
+ struct clk *parent;
+ const char **parent_names;
+ struct clk **parents;
+diff --git a/include/linux/clkdev.h b/include/linux/clkdev.h
+index a6a6f60..94bad77 100644
+--- a/include/linux/clkdev.h
++++ b/include/linux/clkdev.h
+@@ -43,4 +43,9 @@ int clk_add_alias(const char *, const char *, char *, struct device *);
+ int clk_register_clkdev(struct clk *, const char *, const char *, ...);
+ int clk_register_clkdevs(struct clk *, struct clk_lookup *, size_t);
+
++#ifdef CONFIG_COMMON_CLK
++int __clk_get(struct clk *clk);
++void __clk_put(struct clk *clk);
++#endif
++
+ #endif
+--
+1.8.3.2
+