drivers/thermal/thermal_thresholds.c

Source file repositories/reference/linux-study-clean/drivers/thermal/thermal_thresholds.c

File Facts

System
Linux kernel
Corpus path
drivers/thermal/thermal_thresholds.c
Extension
.c
Size
5758 bytes
Lines
245
Domain
Driver Families
Bucket
drivers/thermal
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright 2024 Linaro Limited
 *
 * Author: Daniel Lezcano <daniel.lezcano@linaro.org>
 *
 * Thermal thresholds
 */
#include <linux/list.h>
#include <linux/list_sort.h>
#include <linux/slab.h>

#include "thermal_core.h"
#include "thermal_thresholds.h"

int thermal_thresholds_init(struct thermal_zone_device *tz)
{
	INIT_LIST_HEAD(&tz->user_thresholds);

	return 0;
}

static void __thermal_thresholds_flush(struct thermal_zone_device *tz)
{
	struct list_head *thresholds = &tz->user_thresholds;
	struct user_threshold *entry, *tmp;

	list_for_each_entry_safe(entry, tmp, thresholds, list_node) {
		list_del(&entry->list_node);
		kfree(entry);
	}
}

void thermal_thresholds_flush(struct thermal_zone_device *tz)
{
	lockdep_assert_held(&tz->lock);

	__thermal_thresholds_flush(tz);

	thermal_notify_threshold_flush(tz);

	__thermal_zone_device_update(tz, THERMAL_TZ_FLUSH_THRESHOLDS);
}

void thermal_thresholds_exit(struct thermal_zone_device *tz)
{
	__thermal_thresholds_flush(tz);
}

static int __thermal_thresholds_cmp(void *data,
				    const struct list_head *l1,
				    const struct list_head *l2)
{
	struct user_threshold *t1 = container_of(l1, struct user_threshold, list_node);
	struct user_threshold *t2 = container_of(l2, struct user_threshold, list_node);

	return t1->temperature - t2->temperature;
}

static struct user_threshold *__thermal_thresholds_find(const struct list_head *thresholds,
							int temperature)
{
	struct user_threshold *t;

	list_for_each_entry(t, thresholds, list_node)
		if (t->temperature == temperature)
			return t;

	return NULL;
}

static bool thermal_thresholds_handle_raising(struct list_head *thresholds, int temperature,
					      int last_temperature)
{
	struct user_threshold *t;

	list_for_each_entry(t, thresholds, list_node) {

		if (!(t->direction & THERMAL_THRESHOLD_WAY_UP))
		    continue;

		if (temperature >= t->temperature &&
		    last_temperature < t->temperature)
			return true;
	}

	return false;
}

static bool thermal_thresholds_handle_dropping(struct list_head *thresholds, int temperature,

Annotation

Implementation Notes