Commit 463b86fe authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

thermal: helpers: Introduce thermal_trip_is_bound_to_cdev()



Introduce a new helper function thermal_trip_is_bound_to_cdev() for
checking whether or not a given trip point has been bound to a given
cooling device.

The primary user of it will be the Tegra thermal driver.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://patch.msgid.link/13545762.uLZWGnKmhe@rjwysocki.net
parent d05374de
Loading
Loading
Loading
Loading
+35 −12
Original line number Diff line number Diff line
@@ -39,30 +39,53 @@ int get_tz_trend(struct thermal_zone_device *tz, const struct thermal_trip *trip
	return trend;
}

static struct thermal_instance *get_instance(struct thermal_zone_device *tz,
					     struct thermal_cooling_device *cdev,
					     const struct thermal_trip *trip)
{
	struct thermal_instance *ti;

	list_for_each_entry(ti, &tz->thermal_instances, tz_node) {
		if (ti->trip == trip && ti->cdev == cdev)
			return ti;
	}

	return NULL;
}

bool thermal_trip_is_bound_to_cdev(struct thermal_zone_device *tz,
				   const struct thermal_trip *trip,
				   struct thermal_cooling_device *cdev)
{
	bool ret;

	mutex_lock(&tz->lock);
	mutex_lock(&cdev->lock);

	ret = !!get_instance(tz, cdev, trip);

	mutex_unlock(&cdev->lock);
	mutex_unlock(&tz->lock);

	return ret;
}
EXPORT_SYMBOL_GPL(thermal_trip_is_bound_to_cdev);

struct thermal_instance *
get_thermal_instance(struct thermal_zone_device *tz,
		     struct thermal_cooling_device *cdev, int trip_index)
{
	struct thermal_instance *pos = NULL;
	struct thermal_instance *target_instance = NULL;
	const struct thermal_trip *trip;
	struct thermal_instance *ti;

	mutex_lock(&tz->lock);
	mutex_lock(&cdev->lock);

	trip = &tz->trips[trip_index].trip;

	list_for_each_entry(pos, &tz->thermal_instances, tz_node) {
		if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) {
			target_instance = pos;
			break;
		}
	}
	ti = get_instance(tz, cdev, &tz->trips[trip_index].trip);

	mutex_unlock(&cdev->lock);
	mutex_unlock(&tz->lock);

	return target_instance;
	return ti;
}
EXPORT_SYMBOL(get_thermal_instance);

+3 −0
Original line number Diff line number Diff line
@@ -270,6 +270,9 @@ struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
int thermal_zone_get_slope(struct thermal_zone_device *tz);
int thermal_zone_get_offset(struct thermal_zone_device *tz);
bool thermal_trip_is_bound_to_cdev(struct thermal_zone_device *tz,
				   const struct thermal_trip *trip,
				   struct thermal_cooling_device *cdev);

int thermal_zone_device_enable(struct thermal_zone_device *tz);
int thermal_zone_device_disable(struct thermal_zone_device *tz);