Skip to content
Snippets Groups Projects
Commit 1f64629f authored by Cristian Ciocaltea's avatar Cristian Ciocaltea Committed by Detlev Casanova
Browse files

clk: Provide devm_clk_bulk_get_all_enabled() helper


Commit 265b07df ("clk: Provide managed helper to get and enable bulk
clocks") added devm_clk_bulk_get_all_enable() function, but missed to
return the number of clocks stored in the clk_bulk_data table referenced
by the clks argument.  Without knowing the number, it's not possible to
iterate these clocks when needed, hence the argument is useless and
could have been simply removed.

Introduce devm_clk_bulk_get_all_enabled() variant, which is consistent
with devm_clk_bulk_get_all() in terms of the returned value:

 > 0 if one or more clocks have been stored
 = 0 if there are no clocks
 < 0 if an error occurred

Moreover, the naming is consistent with devm_clk_get_enabled(), i.e. use
the past form of 'enable'.

To reduce code duplication and improve patch readability, make
devm_clk_bulk_get_all_enable() use the new helper, as suggested by
Stephen Boyd.

Reviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: default avatarCristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://lore.kernel.org/r/20241019-clk_bulk_ena_fix-v4-1-57f108f64e70@collabora.com


Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 866409de
No related branches found
No related tags found
No related merge requests found
...@@ -190,7 +190,7 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res) ...@@ -190,7 +190,7 @@ static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
clk_bulk_put_all(devres->num_clks, devres->clks); clk_bulk_put_all(devres->num_clks, devres->clks);
} }
int __must_check devm_clk_bulk_get_all_enable(struct device *dev, int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
struct clk_bulk_data **clks) struct clk_bulk_data **clks)
{ {
struct clk_bulk_devres *devres; struct clk_bulk_devres *devres;
...@@ -216,11 +216,12 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev, ...@@ -216,11 +216,12 @@ int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
} else { } else {
clk_bulk_put_all(devres->num_clks, devres->clks); clk_bulk_put_all(devres->num_clks, devres->clks);
devres_free(devres); devres_free(devres);
return ret;
} }
return ret; return devres->num_clks;
} }
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable); EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enabled);
static int devm_clk_match(struct device *dev, void *res, void *data) static int devm_clk_match(struct device *dev, void *res, void *data)
{ {
......
...@@ -496,11 +496,13 @@ int __must_check devm_clk_bulk_get_all(struct device *dev, ...@@ -496,11 +496,13 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
struct clk_bulk_data **clks); struct clk_bulk_data **clks);
/** /**
* devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed) * devm_clk_bulk_get_all_enabled - Get and enable all clocks of the consumer (managed)
* @dev: device for clock "consumer" * @dev: device for clock "consumer"
* @clks: pointer to the clk_bulk_data table of consumer * @clks: pointer to the clk_bulk_data table of consumer
* *
* Returns success (0) or negative errno. * Returns a positive value for the number of clocks obtained while the
* clock references are stored in the clk_bulk_data table in @clks field.
* Returns 0 if there're none and a negative value if something failed.
* *
* This helper function allows drivers to get all clocks of the * This helper function allows drivers to get all clocks of the
* consumer and enables them in one operation with management. * consumer and enables them in one operation with management.
...@@ -508,7 +510,7 @@ int __must_check devm_clk_bulk_get_all(struct device *dev, ...@@ -508,7 +510,7 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
* is unbound. * is unbound.
*/ */
int __must_check devm_clk_bulk_get_all_enable(struct device *dev, int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
struct clk_bulk_data **clks); struct clk_bulk_data **clks);
/** /**
...@@ -1001,7 +1003,7 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev, ...@@ -1001,7 +1003,7 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
return 0; return 0;
} }
static inline int __must_check devm_clk_bulk_get_all_enable(struct device *dev, static inline int __must_check devm_clk_bulk_get_all_enabled(struct device *dev,
struct clk_bulk_data **clks) struct clk_bulk_data **clks)
{ {
return 0; return 0;
...@@ -1103,6 +1105,15 @@ static inline void clk_restore_context(void) {} ...@@ -1103,6 +1105,15 @@ static inline void clk_restore_context(void) {}
#endif #endif
/* Deprecated. Use devm_clk_bulk_get_all_enabled() */
static inline int __must_check
devm_clk_bulk_get_all_enable(struct device *dev, struct clk_bulk_data **clks)
{
int ret = devm_clk_bulk_get_all_enabled(dev, clks);
return ret > 0 ? 0 : ret;
}
/* clk_prepare_enable helps cases using clk_enable in non-atomic context. */ /* clk_prepare_enable helps cases using clk_enable in non-atomic context. */
static inline int clk_prepare_enable(struct clk *clk) static inline int clk_prepare_enable(struct clk *clk)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment