Commit 618aee02 authored by Dong Aisheng's avatar Dong Aisheng Committed by Stephen Boyd

clk: add managed version of clk_bulk_get

This patch introduces the managed version of clk_bulk_get.

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: Sascha Hauer <kernel@pengutronix.de>
Cc: Anson Huang <anson.huang@nxp.com>
Cc: Robin Gong <yibin.gong@nxp.com>
Cc: Bai Ping <ping.bai@nxp.com>
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: Octavian Purdila <octavian.purdila@nxp.com>
Signed-off-by: default avatarDong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent 266e4e9d
...@@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char *id) ...@@ -34,6 +34,42 @@ struct clk *devm_clk_get(struct device *dev, const char *id)
} }
EXPORT_SYMBOL(devm_clk_get); EXPORT_SYMBOL(devm_clk_get);
struct clk_bulk_devres {
struct clk_bulk_data *clks;
int num_clks;
};
static void devm_clk_bulk_release(struct device *dev, void *res)
{
struct clk_bulk_devres *devres = res;
clk_bulk_put(devres->num_clks, devres->clks);
}
int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
struct clk_bulk_data *clks)
{
struct clk_bulk_devres *devres;
int ret;
devres = devres_alloc(devm_clk_bulk_release,
sizeof(*devres), GFP_KERNEL);
if (!devres)
return -ENOMEM;
ret = clk_bulk_get(dev, num_clks, clks);
if (!ret) {
devres->clks = clks;
devres->num_clks = num_clks;
devres_add(dev, devres);
} else {
devres_free(devres);
}
return ret;
}
EXPORT_SYMBOL_GPL(devm_clk_bulk_get);
static int devm_clk_match(struct device *dev, void *res, void *data) static int devm_clk_match(struct device *dev, void *res, void *data)
{ {
struct clk **c = res; struct clk **c = res;
......
...@@ -280,6 +280,21 @@ struct clk *clk_get(struct device *dev, const char *id); ...@@ -280,6 +280,21 @@ struct clk *clk_get(struct device *dev, const char *id);
int __must_check clk_bulk_get(struct device *dev, int num_clks, int __must_check clk_bulk_get(struct device *dev, int num_clks,
struct clk_bulk_data *clks); struct clk_bulk_data *clks);
/**
* devm_clk_bulk_get - managed get multiple clk consumers
* @dev: device for clock "consumer"
* @num_clks: the number of clk_bulk_data
* @clks: the clk_bulk_data table of consumer
*
* Return 0 on success, an errno on failure.
*
* This helper function allows drivers to get several clk
* consumers in one operation with management, the clks will
* automatically be freed when the device is unbound.
*/
int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
struct clk_bulk_data *clks);
/** /**
* devm_clk_get - lookup and obtain a managed reference to a clock producer. * devm_clk_get - lookup and obtain a managed reference to a clock producer.
* @dev: device for clock "consumer" * @dev: device for clock "consumer"
...@@ -550,6 +565,12 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id) ...@@ -550,6 +565,12 @@ static inline struct clk *devm_clk_get(struct device *dev, const char *id)
return NULL; return NULL;
} }
static inline int devm_clk_bulk_get(struct device *dev, int num_clks,
struct clk_bulk_data *clks)
{
return 0;
}
static inline struct clk *devm_get_clk_from_child(struct device *dev, static inline struct clk *devm_get_clk_from_child(struct device *dev,
struct device_node *np, const char *con_id) struct device_node *np, const char *con_id)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment