Commit 829f4166 authored by Lukasz Luba's avatar Lukasz Luba Committed by Daniel Lezcano
Browse files

drivers/thermal/devfreq_cooling: Extend the devfreq_cooling_device with ops



Remove unneeded global variable devfreq_cooling_ops which is used only
as a copy pattern. Instead, extend the struct devfreq_cooling_device with
the needed ops structure. This also simplifies the allocation/free code
during the setup/cleanup.

Signed-off-by: default avatarLukasz Luba <lukasz.luba@arm.com>
Link: https://lore.kernel.org/r/20220613124327.30766-5-lukasz.luba@arm.com


Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
parent 9784d2fb
Loading
Loading
Loading
Loading
+9 −18
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
 * struct devfreq_cooling_device - Devfreq cooling device
 *		devfreq_cooling_device registered.
 * @cdev:	Pointer to associated thermal cooling device.
 * @cooling_ops: devfreq callbacks to thermal cooling device ops
 * @devfreq:	Pointer to associated devfreq device.
 * @cooling_state:	Current cooling state.
 * @freq_table:	Pointer to a table with the frequencies sorted in descending
@@ -48,6 +49,7 @@
 */
struct devfreq_cooling_device {
	struct thermal_cooling_device *cdev;
	struct thermal_cooling_device_ops cooling_ops;
	struct devfreq *devfreq;
	unsigned long cooling_state;
	u32 *freq_table;
@@ -290,12 +292,6 @@ static int devfreq_cooling_power2state(struct thermal_cooling_device *cdev,
	return 0;
}

static struct thermal_cooling_device_ops devfreq_cooling_ops = {
	.get_max_state = devfreq_cooling_get_max_state,
	.get_cur_state = devfreq_cooling_get_cur_state,
	.set_cur_state = devfreq_cooling_set_cur_state,
};

/**
 * devfreq_cooling_gen_tables() - Generate frequency table.
 * @dfc:	Pointer to devfreq cooling device.
@@ -363,18 +359,18 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
	char *name;
	int err, num_opps;

	ops = kmemdup(&devfreq_cooling_ops, sizeof(*ops), GFP_KERNEL);
	if (!ops)
		return ERR_PTR(-ENOMEM);

	dfc = kzalloc(sizeof(*dfc), GFP_KERNEL);
	if (!dfc) {
		err = -ENOMEM;
		goto free_ops;
	}
	if (!dfc)
		return ERR_PTR(-ENOMEM);

	dfc->devfreq = df;

	ops = &dfc->cooling_ops;
	ops->get_max_state = devfreq_cooling_get_max_state;
	ops->get_cur_state = devfreq_cooling_get_cur_state;
	ops->set_cur_state = devfreq_cooling_set_cur_state;

	em = em_pd_get(dev);
	if (em && !em_is_artificial(em)) {
		dfc->em_pd = em;
@@ -437,8 +433,6 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
	kfree(dfc->freq_table);
free_dfc:
	kfree(dfc);
free_ops:
	kfree(ops);

	return ERR_PTR(err);
}
@@ -520,13 +514,11 @@ EXPORT_SYMBOL_GPL(devfreq_cooling_em_register);
void devfreq_cooling_unregister(struct thermal_cooling_device *cdev)
{
	struct devfreq_cooling_device *dfc;
	const struct thermal_cooling_device_ops *ops;
	struct device *dev;

	if (IS_ERR_OR_NULL(cdev))
		return;

	ops = cdev->ops;
	dfc = cdev->devdata;
	dev = dfc->devfreq->dev.parent;

@@ -537,6 +529,5 @@ void devfreq_cooling_unregister(struct thermal_cooling_device *cdev)

	kfree(dfc->freq_table);
	kfree(dfc);
	kfree(ops);
}
EXPORT_SYMBOL_GPL(devfreq_cooling_unregister);