On Thu, Jun 25, 2020 at 8:15 PM Daniel Lezcano <daniel.lezc...@linaro.org> wrote: > > The cdev, tz and governor list, as well as their respective locks are > statically defined in the thermal_core.c file. > > In order to give a sane access to these list, like browsing all the > thermal zones or all the cooling devices, let's define a set of > helpers where we pass a callback as a parameter to be called for each > thermal entity. > > We keep the self-encapsulation and ensure the locks are correctly > taken when looking at the list. > > Signed-off-by: Daniel Lezcano <daniel.lezc...@linaro.org> > --- > drivers/thermal/thermal_core.c | 51 ++++++++++++++++++++++++++++++++++
Is the idea to not use thermal_helpers.c from now on? It fits perfectly with a patch I have to merge all its contents to thermal_core.c :-) > drivers/thermal/thermal_core.h | 9 ++++++ > 2 files changed, 60 insertions(+) > > diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c > index 2a3f83265d8b..e2f8d2550ecd 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -611,6 +611,57 @@ void thermal_zone_device_rebind_exception(struct > thermal_zone_device *tz, > mutex_unlock(&thermal_list_lock); > } > > +int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *), > + void *data) > +{ > + struct thermal_governor *gov; > + int ret = 0; > + > + mutex_lock(&thermal_governor_lock); > + list_for_each_entry(gov, &thermal_governor_list, governor_list) { > + ret = cb(gov, data); > + if (ret) > + break; > + } > + mutex_unlock(&thermal_governor_lock); > + > + return ret; > +} > + > +int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device > *, > + void *), void *data) > +{ > + struct thermal_cooling_device *cdev; > + int ret = 0; > + > + mutex_lock(&thermal_list_lock); > + list_for_each_entry(cdev, &thermal_cdev_list, node) { > + ret = cb(cdev, data); > + if (ret) > + break; > + } > + mutex_unlock(&thermal_list_lock); > + > + return ret; > +} > + > +int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *), > + void *data) > +{ > + struct thermal_zone_device *tz; > + int ret = 0; > + > + mutex_lock(&thermal_list_lock); > + list_for_each_entry(tz, &thermal_tz_list, node) { > + ret = cb(tz, data); > + if (ret) > + break; > + } > + mutex_unlock(&thermal_list_lock); > + > + return ret; > +} > + > void thermal_zone_device_unbind_exception(struct thermal_zone_device *tz, > const char *cdev_type, size_t size) > { > diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h > index 4e271016b7a9..bb8f8aee79eb 100644 > --- a/drivers/thermal/thermal_core.h > +++ b/drivers/thermal/thermal_core.h > @@ -41,6 +41,15 @@ extern struct thermal_governor > *__governor_thermal_table_end[]; > __governor < __governor_thermal_table_end; \ > __governor++) > > +int for_each_thermal_zone(int (*cb)(struct thermal_zone_device *, void *), > + void *); > + > +int for_each_thermal_cooling_device(int (*cb)(struct thermal_cooling_device > *, > + void *), void *); > + > +int for_each_thermal_governor(int (*cb)(struct thermal_governor *, void *), > + void *thermal_governor); > + > struct thermal_attr { > struct device_attribute attr; > char name[THERMAL_NAME_LENGTH]; > -- > 2.17.1 >