| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * thermal-fw.c - Thermal components creation from firmware description |
| * |
| * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. |
| */ |
| #include <linux/fwnode.h> |
| #include <linux/module.h> |
| #include <linux/platform_device.h> |
| #include <linux/thermal.h> |
| |
| /** |
| * thermal_fwnode_cooling_device_register() - register an thermal cooling device |
| * @np: a pointer to a device tree node. |
| * @of_index: a cooling device index in the cooling controller |
| * @type: the thermal cooling device type. |
| * @devdata: device private data. |
| * @ops: standard thermal cooling devices callbacks. |
| * |
| * This function will register a cooling device with device tree node reference. |
| * This interface function adds a new thermal cooling device (fan/processor/...) |
| * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself |
| * to all the thermal zone devices registered at the same time. |
| * |
| * Return: a pointer to the created struct thermal_cooling_device or an |
| * ERR_PTR. Caller must check return value with IS_ERR*() helpers. |
| */ |
| struct thermal_cooling_device * |
| thermal_fwnode_cooling_device_register(struct fwnode_handle *fwnode, int fwn_index, |
| const char *type, void *devdata, |
| const struct thermal_cooling_device_ops *ops) |
| { |
| struct thermal_cooling_device *cdev; |
| |
| cdev = __thermal_cooling_device_register(type, devdata, ops); |
| if (IS_ERR(cdev)) |
| return cdev; |
| |
| cdev->np = (struct device_node *)fwnode; |
| cdev->of_index = fwn_index; |
| thermal_cooling_device_init_complete(cdev); |
| |
| return cdev; |
| } |
| EXPORT_SYMBOL_GPL(thermal_fwnode_cooling_device_register); |
| |
| static struct thermal_cooling_device * |
| __devm_thermal_fwnode_cooling_device_register(struct device *dev, struct fwnode_handle *fwnode, |
| int fwn_index, const char *type, void *devdata, |
| const struct thermal_cooling_device_ops *ops) |
| { |
| struct thermal_cooling_device **ptr, *tcd; |
| |
| ptr = devres_alloc(thermal_cooling_device_release, sizeof(*ptr), |
| GFP_KERNEL); |
| if (!ptr) |
| return ERR_PTR(-ENOMEM); |
| |
| tcd = thermal_fwnode_cooling_device_register(fwnode, fwn_index, type, devdata, ops); |
| if (IS_ERR(tcd)) { |
| devres_free(ptr); |
| return tcd; |
| } |
| |
| *ptr = tcd; |
| devres_add(dev, ptr); |
| |
| return tcd; |
| } |
| |
| /** |
| * devm_thermal_fwnode_cooling_device_register() - register a thermal cooling device |
| * @dev: a valid struct device pointer of a sensor device. |
| * @fw_index: a cooling device index in the cooling controller |
| * @type: the thermal cooling device type. |
| * @devdata: device private data. |
| * @ops: standard thermal cooling devices callbacks. |
| * |
| * This function will register a cooling device with a firmware node reference. |
| * This interface function adds a new thermal cooling device (fan/processor/...) |
| * to /sys/class/thermal/ folder as cooling_device[0-*]. It tries to bind itself |
| * to all the thermal zone devices registered at the same time. |
| * |
| * Return: a pointer to the created struct thermal_cooling_device or an |
| * ERR_PTR. Caller must check return value with IS_ERR*() helpers. |
| */ |
| struct thermal_cooling_device * |
| devm_thermal_fwnode_cooling_device_register(struct device *dev, int fwn_index, |
| const char *type, void *devdata, |
| const struct thermal_cooling_device_ops *ops) |
| { |
| return __devm_thermal_fwnode_cooling_device_register(dev, dev_fwnode(dev), fwn_index, |
| type, devdata, ops); |
| } |
| EXPORT_SYMBOL_GPL(devm_thermal_fwnode_cooling_device_register); |
| |
| |