Commit 9bd5ef0b authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Stephen Boyd
Browse files

clk: Add devm_clk_bulk_get_optional() function



Add managed version of the clk_bulk_get_optional() helper function.

Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
[sboyd@kernel.org: Mark __devm_clk_bulk_get() static]
Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 2f25528e
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ static void devm_clk_bulk_release(struct device *dev, void *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)
static int __devm_clk_bulk_get(struct device *dev, int num_clks,
			       struct clk_bulk_data *clks, bool optional)
{
	struct clk_bulk_devres *devres;
	int ret;
@@ -63,6 +63,9 @@ int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
	if (!devres)
		return -ENOMEM;

	if (optional)
		ret = clk_bulk_get_optional(dev, num_clks, clks);
	else
		ret = clk_bulk_get(dev, num_clks, clks);
	if (!ret) {
		devres->clks = clks;
@@ -74,8 +77,21 @@ int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,

	return ret;
}

int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
		      struct clk_bulk_data *clks)
{
	return __devm_clk_bulk_get(dev, num_clks, clks, false);
}
EXPORT_SYMBOL_GPL(devm_clk_bulk_get);

int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
		      struct clk_bulk_data *clks)
{
	return __devm_clk_bulk_get(dev, num_clks, clks, true);
}
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_optional);

int __must_check devm_clk_bulk_get_all(struct device *dev,
				       struct clk_bulk_data **clks)
{
+28 −0
Original line number Diff line number Diff line
@@ -359,6 +359,28 @@ int __must_check clk_bulk_get_optional(struct device *dev, int num_clks,
 */
int __must_check devm_clk_bulk_get(struct device *dev, int num_clks,
				   struct clk_bulk_data *clks);
/**
 * devm_clk_bulk_get_optional - managed get multiple optional consumer clocks
 * @dev: device for clock "consumer"
 * @clks: pointer to the clk_bulk_data table of consumer
 *
 * Behaves the same as devm_clk_bulk_get() except where there is no clock
 * producer.  In this case, instead of returning -ENOENT, the function returns
 * NULL for given clk. It is assumed all clocks in clk_bulk_data are optional.
 *
 * Returns 0 if all clocks specified in clk_bulk_data table are obtained
 * successfully or for any clk there was no clk provider available, otherwise
 * returns valid IS_ERR() condition containing errno.
 * The implementation uses @dev and @clk_bulk_data.id to determine the
 * clock consumer, and thereby the clock producer.
 * The clock returned is stored in each @clk_bulk_data.clk field.
 *
 * Drivers must assume that the clock source is not enabled.
 *
 * clk_bulk_get should not be called from within interrupt context.
 */
int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
					    struct clk_bulk_data *clks);
/**
 * devm_clk_bulk_get_all - managed get multiple clk consumers
 * @dev: device for clock "consumer"
@@ -760,6 +782,12 @@ static inline int __must_check devm_clk_bulk_get(struct device *dev, int num_clk
	return 0;
}

static inline int __must_check devm_clk_bulk_get_optional(struct device *dev,
				int num_clks, struct clk_bulk_data *clks)
{
	return 0;
}

static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
						     struct clk_bulk_data **clks)
{