Commit 20d3f241 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'thermal-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull thermal control fixes from Rafael Wysocki:
 "Constify thermal_zone_device_register() parameters, which was omitted
  by mistake, and fix a double free on thermal zone unregistration in
  the generic DT thermal driver (Ahmad Fatoum)"

* tag 'thermal-6.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  thermal: of: fix double-free on unregistration
  thermal: core: constify params in thermal_zone_device_register
parents 3632f421 ac4436a5
...@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp); ...@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
struct thermal_zone_device * struct thermal_zone_device *
thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *trips, int num_trips, int mask, thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *trips, int num_trips, int mask,
void *devdata, struct thermal_zone_device_ops *ops, void *devdata, struct thermal_zone_device_ops *ops,
struct thermal_zone_params *tzp, int passive_delay, const struct thermal_zone_params *tzp, int passive_delay,
int polling_delay) int polling_delay)
{ {
struct thermal_zone_device *tz; struct thermal_zone_device *tz;
...@@ -1371,7 +1371,7 @@ EXPORT_SYMBOL_GPL(thermal_zone_device_register_with_trips); ...@@ -1371,7 +1371,7 @@ EXPORT_SYMBOL_GPL(thermal_zone_device_register_with_trips);
struct thermal_zone_device *thermal_zone_device_register(const char *type, int ntrips, int mask, struct thermal_zone_device *thermal_zone_device_register(const char *type, int ntrips, int mask,
void *devdata, struct thermal_zone_device_ops *ops, void *devdata, struct thermal_zone_device_ops *ops,
struct thermal_zone_params *tzp, int passive_delay, const struct thermal_zone_params *tzp, int passive_delay,
int polling_delay) int polling_delay)
{ {
return thermal_zone_device_register_with_trips(type, NULL, ntrips, mask, return thermal_zone_device_register_with_trips(type, NULL, ntrips, mask,
......
...@@ -238,17 +238,13 @@ static int thermal_of_monitor_init(struct device_node *np, int *delay, int *pdel ...@@ -238,17 +238,13 @@ static int thermal_of_monitor_init(struct device_node *np, int *delay, int *pdel
return 0; return 0;
} }
static struct thermal_zone_params *thermal_of_parameters_init(struct device_node *np) static void thermal_of_parameters_init(struct device_node *np,
struct thermal_zone_params *tzp)
{ {
struct thermal_zone_params *tzp;
int coef[2]; int coef[2];
int ncoef = ARRAY_SIZE(coef); int ncoef = ARRAY_SIZE(coef);
int prop, ret; int prop, ret;
tzp = kzalloc(sizeof(*tzp), GFP_KERNEL);
if (!tzp)
return ERR_PTR(-ENOMEM);
tzp->no_hwmon = true; tzp->no_hwmon = true;
if (!of_property_read_u32(np, "sustainable-power", &prop)) if (!of_property_read_u32(np, "sustainable-power", &prop))
...@@ -267,8 +263,6 @@ static struct thermal_zone_params *thermal_of_parameters_init(struct device_node ...@@ -267,8 +263,6 @@ static struct thermal_zone_params *thermal_of_parameters_init(struct device_node
tzp->slope = coef[0]; tzp->slope = coef[0];
tzp->offset = coef[1]; tzp->offset = coef[1];
return tzp;
} }
static struct device_node *thermal_of_zone_get_by_name(struct thermal_zone_device *tz) static struct device_node *thermal_of_zone_get_by_name(struct thermal_zone_device *tz)
...@@ -442,13 +436,11 @@ static int thermal_of_unbind(struct thermal_zone_device *tz, ...@@ -442,13 +436,11 @@ static int thermal_of_unbind(struct thermal_zone_device *tz,
static void thermal_of_zone_unregister(struct thermal_zone_device *tz) static void thermal_of_zone_unregister(struct thermal_zone_device *tz)
{ {
struct thermal_trip *trips = tz->trips; struct thermal_trip *trips = tz->trips;
struct thermal_zone_params *tzp = tz->tzp;
struct thermal_zone_device_ops *ops = tz->ops; struct thermal_zone_device_ops *ops = tz->ops;
thermal_zone_device_disable(tz); thermal_zone_device_disable(tz);
thermal_zone_device_unregister(tz); thermal_zone_device_unregister(tz);
kfree(trips); kfree(trips);
kfree(tzp);
kfree(ops); kfree(ops);
} }
...@@ -477,7 +469,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -477,7 +469,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
{ {
struct thermal_zone_device *tz; struct thermal_zone_device *tz;
struct thermal_trip *trips; struct thermal_trip *trips;
struct thermal_zone_params *tzp; struct thermal_zone_params tzp = {};
struct thermal_zone_device_ops *of_ops; struct thermal_zone_device_ops *of_ops;
struct device_node *np; struct device_node *np;
int delay, pdelay; int delay, pdelay;
...@@ -509,12 +501,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -509,12 +501,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
goto out_kfree_trips; goto out_kfree_trips;
} }
tzp = thermal_of_parameters_init(np); thermal_of_parameters_init(np, &tzp);
if (IS_ERR(tzp)) {
ret = PTR_ERR(tzp);
pr_err("Failed to initialize parameter from %pOFn: %d\n", np, ret);
goto out_kfree_trips;
}
of_ops->bind = thermal_of_bind; of_ops->bind = thermal_of_bind;
of_ops->unbind = thermal_of_unbind; of_ops->unbind = thermal_of_unbind;
...@@ -522,12 +509,12 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -522,12 +509,12 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
mask = GENMASK_ULL((ntrips) - 1, 0); mask = GENMASK_ULL((ntrips) - 1, 0);
tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips, tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips,
mask, data, of_ops, tzp, mask, data, of_ops, &tzp,
pdelay, delay); pdelay, delay);
if (IS_ERR(tz)) { if (IS_ERR(tz)) {
ret = PTR_ERR(tz); ret = PTR_ERR(tz);
pr_err("Failed to register thermal zone %pOFn: %d\n", np, ret); pr_err("Failed to register thermal zone %pOFn: %d\n", np, ret);
goto out_kfree_tzp; goto out_kfree_trips;
} }
ret = thermal_zone_device_enable(tz); ret = thermal_zone_device_enable(tz);
...@@ -540,8 +527,6 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node * ...@@ -540,8 +527,6 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
return tz; return tz;
out_kfree_tzp:
kfree(tzp);
out_kfree_trips: out_kfree_trips:
kfree(trips); kfree(trips);
out_kfree_of_ops: out_kfree_of_ops:
......
...@@ -301,14 +301,14 @@ int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp); ...@@ -301,14 +301,14 @@ int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp);
#ifdef CONFIG_THERMAL #ifdef CONFIG_THERMAL
struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, struct thermal_zone_device *thermal_zone_device_register(const char *, int, int,
void *, struct thermal_zone_device_ops *, void *, struct thermal_zone_device_ops *,
struct thermal_zone_params *, int, int); const struct thermal_zone_params *, int, int);
void thermal_zone_device_unregister(struct thermal_zone_device *); void thermal_zone_device_unregister(struct thermal_zone_device *);
struct thermal_zone_device * struct thermal_zone_device *
thermal_zone_device_register_with_trips(const char *, struct thermal_trip *, int, int, thermal_zone_device_register_with_trips(const char *, struct thermal_trip *, int, int,
void *, struct thermal_zone_device_ops *, void *, struct thermal_zone_device_ops *,
struct thermal_zone_params *, int, int); const struct thermal_zone_params *, int, int);
void *thermal_zone_device_priv(struct thermal_zone_device *tzd); void *thermal_zone_device_priv(struct thermal_zone_device *tzd);
const char *thermal_zone_device_type(struct thermal_zone_device *tzd); const char *thermal_zone_device_type(struct thermal_zone_device *tzd);
...@@ -348,7 +348,7 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz); ...@@ -348,7 +348,7 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz);
static inline struct thermal_zone_device *thermal_zone_device_register( static inline struct thermal_zone_device *thermal_zone_device_register(
const char *type, int trips, int mask, void *devdata, const char *type, int trips, int mask, void *devdata,
struct thermal_zone_device_ops *ops, struct thermal_zone_device_ops *ops,
struct thermal_zone_params *tzp, const struct thermal_zone_params *tzp,
int passive_delay, int polling_delay) int passive_delay, int polling_delay)
{ return ERR_PTR(-ENODEV); } { return ERR_PTR(-ENODEV); }
static inline void thermal_zone_device_unregister( static inline void thermal_zone_device_unregister(
......
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