Commit 265b07df authored by Shradha Todi's avatar Shradha Todi Committed by Stephen Boyd
Browse files

clk: Provide managed helper to get and enable bulk clocks



Provide a managed devm_clk_bulk* wrapper to get and enable all
bulk clocks in order to simplify drivers that keeps all clocks
enabled for the time of driver operation.

Suggested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: default avatarAlim Akhtar <alim.akhtar@samsung.com>
Reviewed-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: default avatarShradha Todi <shradha.t@samsung.com>
Link: https://lore.kernel.org/r/20240220084046.23786-2-shradha.t@samsung.com


Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
parent 6613476e
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -182,6 +182,46 @@ int __must_check devm_clk_bulk_get_all(struct device *dev,
}
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all);

static void devm_clk_bulk_release_all_enable(struct device *dev, void *res)
{
	struct clk_bulk_devres *devres = res;

	clk_bulk_disable_unprepare(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,
					      struct clk_bulk_data **clks)
{
	struct clk_bulk_devres *devres;
	int ret;

	devres = devres_alloc(devm_clk_bulk_release_all_enable,
			      sizeof(*devres), GFP_KERNEL);
	if (!devres)
		return -ENOMEM;

	ret = clk_bulk_get_all(dev, &devres->clks);
	if (ret > 0) {
		*clks = devres->clks;
		devres->num_clks = ret;
	} else {
		devres_free(devres);
		return ret;
	}

	ret = clk_bulk_prepare_enable(devres->num_clks, *clks);
	if (!ret) {
		devres_add(dev, devres);
	} else {
		clk_bulk_put_all(devres->num_clks, devres->clks);
		devres_free(devres);
	}

	return ret;
}
EXPORT_SYMBOL_GPL(devm_clk_bulk_get_all_enable);

static int devm_clk_match(struct device *dev, void *res, void *data)
{
	struct clk **c = res;
+22 −0
Original line number Diff line number Diff line
@@ -478,6 +478,22 @@ int __must_check devm_clk_bulk_get_optional(struct device *dev, int num_clks,
int __must_check devm_clk_bulk_get_all(struct device *dev,
				       struct clk_bulk_data **clks);

/**
 * devm_clk_bulk_get_all_enable - Get and enable all clocks of the consumer (managed)
 * @dev: device for clock "consumer"
 * @clks: pointer to the clk_bulk_data table of consumer
 *
 * Returns success (0) or negative errno.
 *
 * This helper function allows drivers to get all clocks of the
 * consumer and enables them in one operation with management.
 * The clks will automatically be disabled and freed when the device
 * is unbound.
 */

int __must_check devm_clk_bulk_get_all_enable(struct device *dev,
					      struct clk_bulk_data **clks);

/**
 * devm_clk_get - lookup and obtain a managed reference to a clock producer.
 * @dev: device for clock "consumer"
@@ -968,6 +984,12 @@ static inline int __must_check devm_clk_bulk_get_all(struct device *dev,
	return 0;
}

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

static inline struct clk *devm_get_clk_from_child(struct device *dev,
				struct device_node *np, const char *con_id)
{