Message ID | 2148114.bB369e8A3T@kreacher |
---|---|
State | New |
Headers | show |
Series | thermal: Eliminate trip IDs from thermal driver interface | expand |
Hi Rafael, On 2024/06/18 3:07, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > It is generally inefficient to iterate over trip indices and call > thermal_zone_get_trip() every time to get the struct thermal_trip > corresponding to the given trip index, so modify the uniphier thermal > driver to use thermal_zone_for_each_trip() for walking trips. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > drivers/thermal/uniphier_thermal.c | 37 > +++++++++++++++++++++++-------------- > 1 file changed, 23 insertions(+), 14 deletions(-) > > Index: linux-pm/drivers/thermal/uniphier_thermal.c > =================================================================== > --- linux-pm.orig/drivers/thermal/uniphier_thermal.c > +++ linux-pm/drivers/thermal/uniphier_thermal.c > @@ -239,13 +239,32 @@ static irqreturn_t uniphier_tm_alarm_irq > return IRQ_HANDLED; > } > > +struct trip_walk_data { > + struct uniphier_tm_dev *tdev; > + int crit_temp; > + int index; > +}; > + > +static int uniphier_tm_trip_walk_cb(struct thermal_trip *trip, void *arg) > +{ > + struct trip_walk_data *twd = arg; > + > + if (trip->type == THERMAL_TRIP_CRITICAL && > + trip->temperature < twd->crit_temp) > + twd->crit_temp = trip->temperature; > + > + uniphier_tm_set_alert(twd->tdev, twd->index, trip->temperature); > + twd->tdev->alert_en[twd->index++] = true; > +} > + > static int uniphier_tm_probe(struct platform_device *pdev) > { > + struct trip_walk_data twd = { .crit_temp = INT_MAX, .index = 0 }; > struct device *dev = &pdev->dev; > struct regmap *regmap; > struct device_node *parent; > struct uniphier_tm_dev *tdev; > - int i, ret, irq, crit_temp = INT_MAX; > + int i, ret, irq; > > tdev = devm_kzalloc(dev, sizeof(*tdev), GFP_KERNEL); > if (!tdev) > @@ -293,20 +312,10 @@ static int uniphier_tm_probe(struct plat > } > > /* set alert temperatures */ > - for (i = 0; i < thermal_zone_get_num_trips(tdev->tz_dev); i++) { > - struct thermal_trip trip; > + twd.tdev = tdev; > + thermal_zone_for_each_trip(tdev->tz_dev, uniphier_tm_trip_walk_cb, &twd); > > - ret = thermal_zone_get_trip(tdev->tz_dev, i, &trip); > - if (ret) > - return ret; > - > - if (trip.type == THERMAL_TRIP_CRITICAL && > - trip.temperature < crit_temp) > - crit_temp = trip.temperature; > - uniphier_tm_set_alert(tdev, i, trip.temperature); > - tdev->alert_en[i] = true; > - } > - if (crit_temp > CRITICAL_TEMP_LIMIT) { > + if (twd.crit_temp > CRITICAL_TEMP_LIMIT) { > dev_err(dev, "critical trip is over limit(>%d), or not set\n", > CRITICAL_TEMP_LIMIT); > return -EINVAL; I confirmed the updated code using the helper function is equivalent to the original. Reviewed-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com> Thank you, --- Best Regards Kunihiko Hayashi
Hi, On Tue, Jun 18, 2024 at 6:05 AM Kunihiko Hayashi <hayashi.kunihiko@socionext.com> wrote: > > Hi Rafael, > > On 2024/06/18 3:07, Rafael J. Wysocki wrote: > > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > > > It is generally inefficient to iterate over trip indices and call > > thermal_zone_get_trip() every time to get the struct thermal_trip > > corresponding to the given trip index, so modify the uniphier thermal > > driver to use thermal_zone_for_each_trip() for walking trips. > > > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > --- > > drivers/thermal/uniphier_thermal.c | 37 > > +++++++++++++++++++++++-------------- > > 1 file changed, 23 insertions(+), 14 deletions(-) > > > > Index: linux-pm/drivers/thermal/uniphier_thermal.c > > =================================================================== > > --- linux-pm.orig/drivers/thermal/uniphier_thermal.c > > +++ linux-pm/drivers/thermal/uniphier_thermal.c > > @@ -239,13 +239,32 @@ static irqreturn_t uniphier_tm_alarm_irq > > return IRQ_HANDLED; > > } > > > > +struct trip_walk_data { > > + struct uniphier_tm_dev *tdev; > > + int crit_temp; > > + int index; > > +}; > > + > > +static int uniphier_tm_trip_walk_cb(struct thermal_trip *trip, void *arg) > > +{ > > + struct trip_walk_data *twd = arg; > > + > > + if (trip->type == THERMAL_TRIP_CRITICAL && > > + trip->temperature < twd->crit_temp) > > + twd->crit_temp = trip->temperature; > > + > > + uniphier_tm_set_alert(twd->tdev, twd->index, trip->temperature); > > + twd->tdev->alert_en[twd->index++] = true; > > +} > > + > > static int uniphier_tm_probe(struct platform_device *pdev) > > { > > + struct trip_walk_data twd = { .crit_temp = INT_MAX, .index = 0 }; > > struct device *dev = &pdev->dev; > > struct regmap *regmap; > > struct device_node *parent; > > struct uniphier_tm_dev *tdev; > > - int i, ret, irq, crit_temp = INT_MAX; > > + int i, ret, irq; > > > > tdev = devm_kzalloc(dev, sizeof(*tdev), GFP_KERNEL); > > if (!tdev) > > @@ -293,20 +312,10 @@ static int uniphier_tm_probe(struct plat > > } > > > > /* set alert temperatures */ > > - for (i = 0; i < thermal_zone_get_num_trips(tdev->tz_dev); i++) { > > - struct thermal_trip trip; > > + twd.tdev = tdev; > > + thermal_zone_for_each_trip(tdev->tz_dev, uniphier_tm_trip_walk_cb, &twd); > > > > - ret = thermal_zone_get_trip(tdev->tz_dev, i, &trip); > > - if (ret) > > - return ret; > > - > > - if (trip.type == THERMAL_TRIP_CRITICAL && > > - trip.temperature < crit_temp) > > - crit_temp = trip.temperature; > > - uniphier_tm_set_alert(tdev, i, trip.temperature); > > - tdev->alert_en[i] = true; > > - } > > - if (crit_temp > CRITICAL_TEMP_LIMIT) { > > + if (twd.crit_temp > CRITICAL_TEMP_LIMIT) { > > dev_err(dev, "critical trip is over limit(>%d), or not set\n", > > CRITICAL_TEMP_LIMIT); > > return -EINVAL; > > I confirmed the updated code using the helper function is equivalent > to the original. > > Reviewed-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com> Thank you!
Index: linux-pm/drivers/thermal/uniphier_thermal.c =================================================================== --- linux-pm.orig/drivers/thermal/uniphier_thermal.c +++ linux-pm/drivers/thermal/uniphier_thermal.c @@ -239,13 +239,32 @@ static irqreturn_t uniphier_tm_alarm_irq return IRQ_HANDLED; } +struct trip_walk_data { + struct uniphier_tm_dev *tdev; + int crit_temp; + int index; +}; + +static int uniphier_tm_trip_walk_cb(struct thermal_trip *trip, void *arg) +{ + struct trip_walk_data *twd = arg; + + if (trip->type == THERMAL_TRIP_CRITICAL && + trip->temperature < twd->crit_temp) + twd->crit_temp = trip->temperature; + + uniphier_tm_set_alert(twd->tdev, twd->index, trip->temperature); + twd->tdev->alert_en[twd->index++] = true; +} + static int uniphier_tm_probe(struct platform_device *pdev) { + struct trip_walk_data twd = { .crit_temp = INT_MAX, .index = 0 }; struct device *dev = &pdev->dev; struct regmap *regmap; struct device_node *parent; struct uniphier_tm_dev *tdev; - int i, ret, irq, crit_temp = INT_MAX; + int i, ret, irq; tdev = devm_kzalloc(dev, sizeof(*tdev), GFP_KERNEL); if (!tdev) @@ -293,20 +312,10 @@ static int uniphier_tm_probe(struct plat } /* set alert temperatures */ - for (i = 0; i < thermal_zone_get_num_trips(tdev->tz_dev); i++) { - struct thermal_trip trip; + twd.tdev = tdev; + thermal_zone_for_each_trip(tdev->tz_dev, uniphier_tm_trip_walk_cb, &twd); - ret = thermal_zone_get_trip(tdev->tz_dev, i, &trip); - if (ret) - return ret; - - if (trip.type == THERMAL_TRIP_CRITICAL && - trip.temperature < crit_temp) - crit_temp = trip.temperature; - uniphier_tm_set_alert(tdev, i, trip.temperature); - tdev->alert_en[i] = true; - } - if (crit_temp > CRITICAL_TEMP_LIMIT) { + if (twd.crit_temp > CRITICAL_TEMP_LIMIT) { dev_err(dev, "critical trip is over limit(>%d), or not set\n", CRITICAL_TEMP_LIMIT); return -EINVAL;