diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-09-19 17:04:48 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-09-19 17:04:48 -0400 |
commit | d99a910a00eded034c29aa3cb47b7b590784d331 (patch) | |
tree | f872cb24d8eb415ddd6a75b763ea44993a1f16f6 /drivers/clk/clk-devres.c | |
parent | 2b25d9f64b542cd19e020ce9d4d628c1feba96e5 (diff) | |
parent | 20332ff376995daa08dcee2a193555800f17514b (diff) |
Merge branch 'clkdev' into fixes
Diffstat (limited to 'drivers/clk/clk-devres.c')
-rw-r--r-- | drivers/clk/clk-devres.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c new file mode 100644 index 000000000000..8f571548870f --- /dev/null +++ b/drivers/clk/clk-devres.c | |||
@@ -0,0 +1,55 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License version 2 as | ||
4 | * published by the Free Software Foundation. | ||
5 | */ | ||
6 | |||
7 | #include <linux/clk.h> | ||
8 | #include <linux/device.h> | ||
9 | #include <linux/export.h> | ||
10 | #include <linux/gfp.h> | ||
11 | |||
12 | static void devm_clk_release(struct device *dev, void *res) | ||
13 | { | ||
14 | clk_put(*(struct clk **)res); | ||
15 | } | ||
16 | |||
17 | struct clk *devm_clk_get(struct device *dev, const char *id) | ||
18 | { | ||
19 | struct clk **ptr, *clk; | ||
20 | |||
21 | ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL); | ||
22 | if (!ptr) | ||
23 | return ERR_PTR(-ENOMEM); | ||
24 | |||
25 | clk = clk_get(dev, id); | ||
26 | if (!IS_ERR(clk)) { | ||
27 | *ptr = clk; | ||
28 | devres_add(dev, ptr); | ||
29 | } else { | ||
30 | devres_free(ptr); | ||
31 | } | ||
32 | |||
33 | return clk; | ||
34 | } | ||
35 | EXPORT_SYMBOL(devm_clk_get); | ||
36 | |||
37 | static int devm_clk_match(struct device *dev, void *res, void *data) | ||
38 | { | ||
39 | struct clk **c = res; | ||
40 | if (!c || !*c) { | ||
41 | WARN_ON(!c || !*c); | ||
42 | return 0; | ||
43 | } | ||
44 | return *c == data; | ||
45 | } | ||
46 | |||
47 | void devm_clk_put(struct device *dev, struct clk *clk) | ||
48 | { | ||
49 | int ret; | ||
50 | |||
51 | ret = devres_release(dev, devm_clk_release, devm_clk_match, clk); | ||
52 | |||
53 | WARN_ON(ret); | ||
54 | } | ||
55 | EXPORT_SYMBOL(devm_clk_put); | ||