On Fri, Jul 3, 2020 at 2:23 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. > > Acked-by: Zhang Rui <rui.zh...@intel.com> > Signed-off-by: Daniel Lezcano <daniel.lezc...@linaro.org>
Reviewed-by: Amit Kucheria <amit.kuche...@linaro.org> > --- > drivers/thermal/thermal_core.c | 51 ++++++++++++++++++++++++++++++++++ > 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 b71196eaf90e..9caaa0b6d662 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -617,6 +617,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 c95689586e19..71d88dac0791 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 >