Message ID | 20200703085309.32166-1-daniel.lezcano@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | [v3,1/4] thermal: core: Add helpers to browse the cdev, tz and governor list | expand |
On Fri, Jul 3, 2020 at 2:23 PM Daniel Lezcano <daniel.lezcano@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.zhang@intel.com> > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Reviewed-by: Amit Kucheria <amit.kucheria@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 >
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];