[PATCH] clk: Move devm_ APIs out of clkdev into HAVE_CLK
From: Mark Brown <hidden>
Date: 2012-06-05 12:24:57
Also in:
lkml
Subsystem:
arm/clkdev support, common clk framework, the rest · Maintainers:
Russell King, Michael Turquette, Stephen Boyd, Linus Torvalds
Move the devm_ versions of the clock APIs out of clkdev into a separate file built when HAVE_CLK is enabled so that we don't need to update all the myriad clock API implementations. Signed-off-by: Mark Brown <redacted> --- drivers/clk/Makefile | 2 +- drivers/clk/clk-devres.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/clk/clkdev.c | 45 ---------------------------------- 3 files changed, 62 insertions(+), 46 deletions(-) create mode 100644 drivers/clk/clk-devres.c
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index b679f11..40e6207 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile@@ -1,4 +1,4 @@ - +obj-$(CONFIG_HAVE_CLK) += clk-devres.o obj-$(CONFIG_CLKDEV_LOOKUP) += clkdev.o obj-$(CONFIG_COMMON_CLK) += clk.o clk-fixed-rate.o clk-gate.o \ clk-mux.o clk-divider.o clk-fixed-factor.o
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c
new file mode 100644
index 0000000..612db83
--- /dev/null
+++ b/drivers/clk/clk-devres.c@@ -0,0 +1,61 @@ +/* + * Copyright (C) 2012 Wolfson Microelectronics plc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * devres functionality layered on top of the standard clock API. + */ + +#include <linux/clk.h> +#include <linux/device.h> +#include <linux/err.h> +#include <linux/module.h> +#include <linux/slab.h> + +static void devm_clk_release(struct device *dev, void *res) +{ + clk_put(*(struct clk **)res); +} + +struct clk *devm_clk_get(struct device *dev, const char *id) +{ + struct clk **ptr, *clk; + + ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return ERR_PTR(-ENOMEM); + + clk = clk_get(dev, id); + if (!IS_ERR(clk)) { + *ptr = clk; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return clk; +} +EXPORT_SYMBOL(devm_clk_get); + +static int devm_clk_match(struct device *dev, void *res, void *data) +{ + struct clk **c = res; + if (!c || !*c) { + WARN_ON(!c || !*c); + return 0; + } + return *c == data; +} + +void devm_clk_put(struct device *dev, struct clk *clk) +{ + int ret; + + ret = devres_release(dev, devm_clk_release, devm_clk_match, clk); + + WARN_ON(ret); +} +EXPORT_SYMBOL(devm_clk_put); +
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c
index c7a4eee..16543af 100644
--- a/drivers/clk/clkdev.c
+++ b/drivers/clk/clkdev.c@@ -94,51 +94,6 @@ void clk_put(struct clk *clk) } EXPORT_SYMBOL(clk_put); -static void devm_clk_release(struct device *dev, void *res) -{ - clk_put(*(struct clk **)res); -} - -struct clk *devm_clk_get(struct device *dev, const char *id) -{ - struct clk **ptr, *clk; - - ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL); - if (!ptr) - return ERR_PTR(-ENOMEM); - - clk = clk_get(dev, id); - if (!IS_ERR(clk)) { - *ptr = clk; - devres_add(dev, ptr); - } else { - devres_free(ptr); - } - - return clk; -} -EXPORT_SYMBOL(devm_clk_get); - -static int devm_clk_match(struct device *dev, void *res, void *data) -{ - struct clk **c = res; - if (!c || !*c) { - WARN_ON(!c || !*c); - return 0; - } - return *c == data; -} - -void devm_clk_put(struct device *dev, struct clk *clk) -{ - int ret; - - ret = devres_release(dev, devm_clk_release, devm_clk_match, clk); - - WARN_ON(ret); -} -EXPORT_SYMBOL(devm_clk_put); - void clkdev_add(struct clk_lookup *cl) { mutex_lock(&clocks_mutex);
--
1.7.10