// 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 #include #include #include /** * 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);