summaryrefslogtreecommitdiff
path: root/drivers/thermal/thermal_fw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/thermal/thermal_fw.c')
-rw-r--r--drivers/thermal/thermal_fw.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/drivers/thermal/thermal_fw.c b/drivers/thermal/thermal_fw.c
new file mode 100644
index 000000000000..e8bd2049cf74
--- /dev/null
+++ b/drivers/thermal/thermal_fw.c
@@ -0,0 +1,97 @@
+// 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);
+
+