diff options
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.patch | 168 |
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 + |