// SPDX-License-Identifier: GPL-2.0 /* * of-thermal.c - Generic Thermal Management device tree support. * * Copyright (C) 2013 Texas Instruments * Copyright (C) 2013 Eduardo Valentin <[email protected]> */ #define pr_fmt(fmt) … #include <linux/err.h> #include <linux/export.h> #include <linux/of.h> #include <linux/slab.h> #include <linux/thermal.h> #include <linux/types.h> #include <linux/string.h> #include "thermal_core.h" /*** functions parsing device tree nodes ***/ static int of_find_trip_id(struct device_node *np, struct device_node *trip) { … } /* * It maps 'enum thermal_trip_type' found in include/linux/thermal.h * into the device tree binding of 'trip', property type. */ static const char * const trip_types[] = …; /** * thermal_of_get_trip_type - Get phy mode for given device_node * @np: Pointer to the given device_node * @type: Pointer to resulting trip type * * The function gets trip type string from property 'type', * and store its index in trip_types table in @type, * * Return: 0 on success, or errno in error case. */ static int thermal_of_get_trip_type(struct device_node *np, enum thermal_trip_type *type) { … } static int thermal_of_populate_trip(struct device_node *np, struct thermal_trip *trip) { … } static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips) { … } static struct device_node *of_thermal_zone_find(struct device_node *sensor, int id) { … } static int thermal_of_monitor_init(struct device_node *np, int *delay, int *pdelay) { … } static void thermal_of_parameters_init(struct device_node *np, struct thermal_zone_params *tzp) { … } static struct device_node *thermal_of_zone_get_by_name(struct thermal_zone_device *tz) { … } static int __thermal_of_unbind(struct device_node *map_np, int index, int trip_id, struct thermal_zone_device *tz, struct thermal_cooling_device *cdev) { … } static int __thermal_of_bind(struct device_node *map_np, int index, int trip_id, struct thermal_zone_device *tz, struct thermal_cooling_device *cdev) { … } static int thermal_of_for_each_cooling_device(struct device_node *tz_np, struct device_node *map_np, struct thermal_zone_device *tz, struct thermal_cooling_device *cdev, int (*action)(struct device_node *, int, int, struct thermal_zone_device *, struct thermal_cooling_device *)) { … } static int thermal_of_for_each_cooling_maps(struct thermal_zone_device *tz, struct thermal_cooling_device *cdev, int (*action)(struct device_node *, int, int, struct thermal_zone_device *, struct thermal_cooling_device *)) { … } static int thermal_of_bind(struct thermal_zone_device *tz, struct thermal_cooling_device *cdev) { … } static int thermal_of_unbind(struct thermal_zone_device *tz, struct thermal_cooling_device *cdev) { … } /** * thermal_of_zone_unregister - Cleanup the specific allocated ressources * * This function disables the thermal zone and frees the different * ressources allocated specific to the thermal OF. * * @tz: a pointer to the thermal zone structure */ static void thermal_of_zone_unregister(struct thermal_zone_device *tz) { … } /** * thermal_of_zone_register - Register a thermal zone with device node * sensor * * The thermal_of_zone_register() parses a device tree given a device * node sensor and identifier. It searches for the thermal zone * associated to the couple sensor/id and retrieves all the thermal * zone properties and registers new thermal zone with those * properties. * * @sensor: A device node pointer corresponding to the sensor in the device tree * @id: An integer as sensor identifier * @data: A private data to be stored in the thermal zone dedicated private area * @ops: A set of thermal sensor ops * * Return: a valid thermal zone structure pointer on success. * - EINVAL: if the device tree thermal description is malformed * - ENOMEM: if one structure can not be allocated * - Other negative errors are returned by the underlying called functions */ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data, const struct thermal_zone_device_ops *ops) { … } static void devm_thermal_of_zone_release(struct device *dev, void *res) { … } static int devm_thermal_of_zone_match(struct device *dev, void *res, void *data) { … } /** * devm_thermal_of_zone_register - register a thermal tied with the sensor life cycle * * This function is the device version of the thermal_of_zone_register() function. * * @dev: a device structure pointer to sensor to be tied with the thermal zone OF life cycle * @sensor_id: the sensor identifier * @data: a pointer to a private data to be stored in the thermal zone 'devdata' field * @ops: a pointer to the ops structure associated with the sensor */ struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int sensor_id, void *data, const struct thermal_zone_device_ops *ops) { … } EXPORT_SYMBOL_GPL(…); /** * devm_thermal_of_zone_unregister - Resource managed version of * thermal_of_zone_unregister(). * @dev: Device for which which resource was allocated. * @tz: a pointer to struct thermal_zone where the sensor is registered. * * This function removes the sensor callbacks and private data from the * thermal zone device registered with devm_thermal_zone_of_sensor_register() * API. It will also silent the zone by remove the .get_temp() and .get_trend() * thermal zone device callbacks. * Normally this function will not need to be called and the resource * management code will ensure that the resource is freed. */ void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz) { … } EXPORT_SYMBOL_GPL(…);