From: Gaurav Kohli <gaurav.kohli@oss.qualcomm.com>
To: "Rafael J. Wysocki" <rafael@kernel.org>,
Daniel Lezcano <daniel.lezcano@kernel.org>,
Zhang Rui <rui.zhang@intel.com>,
Lukasz Luba <lukasz.luba@arm.com>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Randy Dunlap <rdunlap@infradead.org>,
Amit Kucheria <amitk@kernel.org>,
Thara Gopinath <thara.gopinath@gmail.com>,
Bjorn Andersson <andersson@kernel.org>,
Konrad Dybcio <konradybcio@kernel.org>,
Abel Vesa <abelvesa@kernel.org>
Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-msm@vger.kernel.org,
Gaurav Kohli <gaurav.kohli@oss.qualcomm.com>,
Amit Kucheria <amit.kucheria@oss.qualcomm.com>
Subject: [PATCH v2 2/6] thermal: add hardware-binning trip-point filtering support
Date: Sat, 31 Oct 2026 18:52:48 +0530 [thread overview]
Message-ID: <20261031-thermal_bin-v2-2-d76fd073ae98@oss.qualcomm.com> (raw)
In-Reply-To: <20261031-thermal_bin-v2-0-d76fd073ae98@oss.qualcomm.com>
From: Amit Kucheria <amit.kucheria@oss.qualcomm.com>
Differences in SoC packaging can be used to provide multiple SoC SKUs at
different thermal and performance characteristics. The underlying SoC
remains the same except for how much heat the packaging can dissipate,
thereby influencing what is the critical trip point at which the SoC SKU
needs to be throttled. This is the basis for thermal-binning.
This SKU-specific data is typically burned into EFUSEs during
manufacturing. We can read back this information at runtime to populate
the appropriate trip points applicable to an SKU.
Linux support for this has been modeled along the lines of the
opp-supported-hw property in the OPP framework that already allows
similar mechanisms to allow/disallow certain operating frequencies for
the processor. The thermal-hw-bin property allows multiple SKUs of an
SoC to be configured for different critical trip points based on a fuse
mask.
Add thermal OF support to parse the thermal-hw-bin and temperature-bin
DT properties. Platform sensor drivers pass decoded hardware-version
information to devm_thermal_of_zone_register_with_bin() before trip
points are parsed, allowing the OF parser to filter trips and select
per-bin temperatures during zone registration.
Signed-off-by: Amit Kucheria <amit.kucheria@oss.qualcomm.com>
Co-developed-by: Gaurav Kohli <gaurav.kohli@oss.qualcomm.com>
Signed-off-by: Gaurav Kohli <gaurav.kohli@oss.qualcomm.com>
---
.../driver-api/thermal/hardware-binning.rst | 112 +++++++++
Documentation/driver-api/thermal/index.rst | 1 +
MAINTAINERS | 1 +
drivers/thermal/thermal_of.c | 253 +++++++++++++++++++--
include/linux/thermal.h | 32 +++
5 files changed, 377 insertions(+), 22 deletions(-)
diff --git a/Documentation/driver-api/thermal/hardware-binning.rst b/Documentation/driver-api/thermal/hardware-binning.rst
new file mode 100644
index 000000000000..c385a2e224e3
--- /dev/null
+++ b/Documentation/driver-api/thermal/hardware-binning.rst
@@ -0,0 +1,112 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+=====================
+Thermal hardware bins
+=====================
+
+:Author: Amit Kucheria
+
+Overview
+========
+
+Differences in SoC packaging let a vendor ship several SKUs built from the
+same silicon but with different thermal characteristics. Better packaging
+dissipates more heat, so the temperature at which a SKU must be throttled (or
+shut down) differs between SKUs. This SKU-specific information is typically
+burned into eFUSEs during manufacturing and can be read back at runtime.
+
+Thermal "hardware binning" lets a single device tree describe the trip points
+for every SKU of an SoC and have the kernel pick the values that match the
+silicon it is actually running on. The mechanism is modelled on the
+``opp-supported-hw`` property used by the OPP framework: the platform supplies
+one or more 32-bit hardware-version words decoded from fuses, and each trip
+point declares the hardware bitmasks for which it is valid.
+
+Hardware-bin trip parsing is part of the thermal OF helpers.
+
+Device tree properties
+=======================
+
+Two properties are added to a trip-point node (see
+``Documentation/devicetree/bindings/thermal/thermal-zones.yaml`` for the
+authoritative schema):
+
+``temperature-bin``
+ An array of trip temperatures in millicelsius, one entry per
+ ``thermal-hw-bin`` sub-group. It is used *instead of* the plain
+ ``temperature`` property when the trip temperature depends on the hardware
+ bin. Exactly one of ``temperature`` or ``temperature-bin`` must be present
+ in a trip node.
+
+``thermal-hw-bin``
+ One or more groups of N 32-bit masks describing the hardware revisions for
+ which the trip point is valid, where N is the number of hardware-version
+ words supplied by the platform (``supported_hw_bin_count``, see below). The
+ format and semantics match ``opp-supported-hw``: a sub-group matches when,
+ for every word ``i`` in ``[0 .. N-1]``, the bitwise AND of the ``i``-th mask
+ and the ``i``-th platform hardware value is non-zero. The trip is enabled if
+ any sub-group matches. When paired with ``temperature-bin`` the number of
+ sub-groups must equal the number of ``temperature-bin`` entries, and the
+ matching sub-group selects which ``temperature-bin`` entry is used. When
+ ``temperature-bin`` is present, ``thermal-hw-bin`` is required.
+
+Example::
+
+ trips {
+ cpu-critical {
+ /* bin 0 throttles at 95C, bin 1 at 105C */
+ temperature-bin = <95000 105000>;
+ thermal-hw-bin = <0x1>, <0x2>;
+ hysteresis = <1000>;
+ type = "critical";
+ };
+ };
+
+Here the platform registers a single hardware-version word (N = 1). If that
+word ANDed with ``0x1`` is non-zero, the first sub-group matches and the trip
+uses 95000 mC; if it ANDed with ``0x2`` is non-zero, the second sub-group
+matches and the trip uses 105000 mC. If neither matches the trip is skipped.
+
+Platform driver API
+===================
+
+A platform driver decodes the SoC fuses into hardware-version words and hands
+them to the thermal core, which makes them available to the OF trip parser.
+The words are carried in ``struct thermal_hw_bin_info``::
+
+ struct thermal_hw_bin_info {
+ const u32 *supported_hw_bin;
+ unsigned int supported_hw_bin_count;
+ };
+
+``supported_hw_bin``
+ Array of N bitfields identifying the running hardware version.
+
+``supported_hw_bin_count``
+ Number of valid entries in ``supported_hw_bin`` (the N above). Must be in
+ the range ``1 .. THERMAL_HW_BIN_MAX_LEVELS``.
+
+Pass a filled ``struct thermal_hw_bin_info`` to
+``devm_thermal_of_zone_register_with_bin()`` when registering the thermal zone.
+The hardware-version information must be available at registration time because
+the OF trip points are parsed synchronously during zone registration::
+
+ struct thermal_zone_device *
+ devm_thermal_of_zone_register_with_bin(struct device *dev, int id,
+ void *data,
+ const struct thermal_zone_device_ops *ops,
+ const struct thermal_hw_bin_info *hw_bin_info);
+
+The caller owns the storage referenced by ``hw_bin_info``. It only needs to
+remain valid for the duration of ``devm_thermal_of_zone_register_with_bin()``,
+because the OF parser consumes the values before the function returns.
+
+If a trip uses ``temperature-bin`` but no bin info has been provided for the
+zone, the core cannot select an entry; it warns once and falls back to the
+first ``temperature-bin`` value. Platform drivers should therefore provide
+the bin info before the zone's trips are parsed.
+
+The Qualcomm tsens driver is the reference user: it reads the named nvmem
+cells described by a per-SoC ``struct tsens_hw_bin_desc``, converts the raw
+fuse values into hardware-version words, and passes the result to
+``devm_thermal_of_zone_register_with_bin()``.
diff --git a/Documentation/driver-api/thermal/index.rst b/Documentation/driver-api/thermal/index.rst
index a886028014ab..5f858fabc865 100644
--- a/Documentation/driver-api/thermal/index.rst
+++ b/Documentation/driver-api/thermal/index.rst
@@ -11,6 +11,7 @@ Thermal
cpu-idle-cooling
sysfs-api
power_allocator
+ hardware-binning
exynos_thermal
exynos_thermal_emulation
diff --git a/MAINTAINERS b/MAINTAINERS
index 6e50747a621c..d99605b8b54c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -27343,6 +27343,7 @@ F: Documentation/ABI/testing/sysfs-class-thermal
F: Documentation/admin-guide/thermal/
F: Documentation/devicetree/bindings/thermal/
F: Documentation/driver-api/thermal/
+F: Documentation/driver-api/thermal/hardware-binning.rst
F: drivers/thermal/
F: include/dt-bindings/thermal/
F: include/linux/cpu_cooling.h
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index fe47d74b7219..c5ec7d2a38ca 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -60,18 +60,165 @@ static int thermal_of_get_trip_type(struct device_node *np,
return -ENODEV;
}
+/*
+ * thermal_of_match_hw_bin_group - test one thermal-hw-bin sub-group
+ * @np: device node containing the property
+ * @hw: hardware binning info (must be non-NULL)
+ * @levels: number of words per sub-group, equal to hw->supported_hw_bin_count
+ * @group: sub-group index to test
+ *
+ * Returns true if every word in sub-group @group has a non-zero bitwise
+ * AND with the corresponding hw->supported_hw_bin[] entry. The caller is
+ * responsible for ensuring @group < total-cells / @levels.
+ */
+static bool thermal_of_match_hw_bin_group(struct device_node *np,
+ const struct thermal_hw_bin_info *hw,
+ unsigned int levels, unsigned int group)
+{
+ unsigned int j;
+ u32 val;
+
+ for (j = 0; j < levels; j++) {
+ if (of_property_read_u32_index(np, "thermal-hw-bin",
+ group * levels + j, &val))
+ return false;
+ if (!(val & hw->supported_hw_bin[j]))
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * thermal_of_trip_is_supported - check if a trip node is valid for this hardware
+ * @np: device node for the trip point
+ * @hw: hardware binning info (may be NULL)
+ *
+ * If @hw is NULL or the trip node has no thermal-hw-bin property, the trip is
+ * considered valid for all hardware. Otherwise, the property is read as groups
+ * of hw->supported_hw_bin_count 32-bit masks; the trip is valid if any group
+ * matches (bitwise AND non-zero for every word in the group).
+ *
+ * Return: true if the trip is valid for the running hardware, false otherwise.
+ */
+static bool thermal_of_trip_is_supported(struct device_node *np,
+ const struct thermal_hw_bin_info *hw)
+{
+ unsigned int levels, ngroups, i;
+ int count;
+
+ if (!hw)
+ return true;
+
+ levels = hw->supported_hw_bin_count;
+
+ count = of_property_count_u32_elems(np, "thermal-hw-bin");
+ if (count == -EINVAL)
+ return true;
+ if (count < 0) {
+ pr_warn_once("%pOF: error reading thermal-hw-bin: %d\n", np, count);
+ return false;
+ }
+ if (count == 0)
+ return true;
+
+ if (count % levels) {
+ pr_warn("%pOF: thermal-hw-bin length %d not a multiple of supported_hw_bin_count %u; disabling trip\n",
+ np, count, levels);
+ return false;
+ }
+
+ ngroups = count / levels;
+ for (i = 0; i < ngroups; i++)
+ if (thermal_of_match_hw_bin_group(np, hw, levels, i))
+ return true;
+
+ return false;
+}
+
+/**
+ * thermal_of_trip_read_temperature - read trip temperature, with bin support
+ * @np: device node for the trip point
+ * @hw: hardware binning info (may be NULL)
+ * @temp: output temperature in millicelsius
+ *
+ * Tries the scalar 'temperature' property first. If absent, falls back to
+ * 'temperature-bin', selecting the entry whose corresponding thermal-hw-bin
+ * sub-group matches the running hardware. Returns -ENODEV if temperature-bin
+ * is present but no sub-group matches (caller should skip this trip).
+ *
+ * Return: 0 on success, negative errno on failure.
+ */
+static int thermal_of_trip_read_temperature(struct device_node *np,
+ const struct thermal_hw_bin_info *hw,
+ s32 *temp)
+{
+ unsigned int levels, ngroups, i;
+ int count_hw, count_temp;
+ s32 t;
+
+ if (!of_property_read_s32(np, "temperature", &t)) {
+ *temp = t;
+ return 0;
+ }
+
+ count_temp = of_property_count_elems_of_size(np, "temperature-bin",
+ sizeof(u32));
+ if (count_temp < 0)
+ return -EINVAL;
+
+ if (!hw) {
+ u32 utmp;
+
+ pr_warn("%pOF: temperature-bin requires platform hw binning info; using first entry\n",
+ np);
+ if (of_property_read_u32_index(np, "temperature-bin", 0, &utmp))
+ return -EINVAL;
+ *temp = (s32)utmp;
+ return 0;
+ }
+
+ levels = hw->supported_hw_bin_count;
+ count_hw = of_property_count_u32_elems(np, "thermal-hw-bin");
+ if (count_hw <= 0 || count_hw % levels)
+ return -EINVAL;
+
+ ngroups = count_hw / levels;
+ if (count_temp != (int)ngroups)
+ return -EINVAL;
+
+ for (i = 0; i < ngroups; i++) {
+ if (thermal_of_match_hw_bin_group(np, hw, levels, i)) {
+ u32 utmp;
+
+ if (of_property_read_u32_index(np, "temperature-bin",
+ i, &utmp))
+ return -EINVAL;
+ *temp = (s32)utmp;
+ return 0;
+ }
+ }
+
+ pr_warn("%pOF: no thermal-hw-bin sub-group matched for temperature-bin\n", np);
+ return -ENODEV;
+}
+
static int thermal_of_populate_trip(struct device_node *np,
- struct thermal_trip *trip)
+ struct thermal_trip *trip,
+ const struct thermal_hw_bin_info *hw)
{
u32 hysteresis;
s32 temperature;
int ret;
- ret = of_property_read_s32(np, "temperature", &temperature);
- if (ret < 0) {
- pr_err("missing temperature property\n");
- return ret;
+ if (!thermal_of_trip_is_supported(np, hw)) {
+ pr_debug("%pOF: trip skipped: no thermal-hw-bin match\n", np);
+ return -ENODEV;
}
+
+ ret = thermal_of_trip_read_temperature(np, hw, &temperature);
+ if (ret)
+ return ret;
trip->temperature = temperature;
ret = of_property_read_u32(np, "hysteresis", &hysteresis);
@@ -94,7 +241,9 @@ static int thermal_of_populate_trip(struct device_node *np,
return 0;
}
-static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *ntrips)
+static struct thermal_trip *thermal_of_trips_init(struct device_node *np,
+ int *ntrips,
+ const struct thermal_hw_bin_info *hw)
{
int ret, count;
@@ -114,9 +263,12 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
count = 0;
for_each_child_of_node_scoped(trips, trip) {
- ret = thermal_of_populate_trip(trip, &tt[count++]);
+ ret = thermal_of_populate_trip(trip, &tt[count], hw);
+ if (ret == -ENODEV)
+ continue;
if (ret)
return ERR_PTR(ret);
+ count++;
}
*ntrips = count;
@@ -364,27 +516,24 @@ 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.
+ * thermal_of_zone_register_with_bin - Register a thermal zone with device node
+ * sensor and optional hardware binning info
*
- * @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
+ * @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
+ * @hw_bin_info: Optional hardware binning info for trip filtering (may be NULL)
*
* 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 struct thermal_zone_device *
+thermal_of_zone_register_with_bin(struct device_node *sensor, int id, void *data,
+ const struct thermal_zone_device_ops *ops,
+ const struct thermal_hw_bin_info *hw_bin_info)
{
struct thermal_zone_device_ops of_ops = *ops;
struct thermal_zone_device *tz;
@@ -403,7 +552,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
return ERR_CAST(np);
}
- trips = thermal_of_trips_init(np, &ntrips);
+ trips = thermal_of_trips_init(np, &ntrips, hw_bin_info);
if (IS_ERR(trips)) {
pr_err("Failed to parse trip points for %pOFP id=%d\n", sensor, id);
ret = PTR_ERR(trips);
@@ -461,6 +610,26 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
return ERR_PTR(ret);
}
+/**
+ * thermal_of_zone_register - Register a thermal zone with device node sensor
+ *
+ * @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)
+{
+ return thermal_of_zone_register_with_bin(sensor, id, data, ops, NULL);
+}
+
static void devm_thermal_of_zone_release(struct device *dev, void *res)
{
thermal_of_zone_unregister(*(struct thermal_zone_device **)res);
@@ -510,6 +679,46 @@ struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, in
}
EXPORT_SYMBOL_GPL(devm_thermal_of_zone_register);
+/**
+ * devm_thermal_of_zone_register_with_bin - register a thermal zone with hardware binning info
+ *
+ * Like devm_thermal_of_zone_register(), but passes @hw_bin_info to the trip-point
+ * parser so that trips can be filtered and per-bin temperatures selected at
+ * zone registration time. Use this when fuse values are read before zone
+ * registration (e.g. in a platform driver's probe function).
+ *
+ * @dev: device structure pointer to sensor
+ * @id: the sensor identifier
+ * @data: private data stored in the thermal zone 'devdata' field
+ * @ops: ops structure associated with the sensor
+ * @hw_bin_info: hardware binning info for trip filtering (may be NULL)
+ */
+struct thermal_zone_device *
+devm_thermal_of_zone_register_with_bin(struct device *dev, int id, void *data,
+ const struct thermal_zone_device_ops *ops,
+ const struct thermal_hw_bin_info *hw_bin_info)
+{
+ struct thermal_zone_device **ptr, *tzd;
+
+ ptr = devres_alloc(devm_thermal_of_zone_release, sizeof(*ptr),
+ GFP_KERNEL);
+ if (!ptr)
+ return ERR_PTR(-ENOMEM);
+
+ tzd = thermal_of_zone_register_with_bin(dev->of_node, id, data,
+ ops, hw_bin_info);
+ if (IS_ERR(tzd)) {
+ devres_free(ptr);
+ return tzd;
+ }
+
+ *ptr = tzd;
+ devres_add(dev, ptr);
+
+ return tzd;
+}
+EXPORT_SYMBOL_GPL(devm_thermal_of_zone_register_with_bin);
+
/**
* devm_thermal_of_zone_unregister - Resource managed version of
* thermal_of_zone_unregister().
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 306ad17aed89..e9e4b2dc2824 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -86,6 +86,23 @@ struct thermal_trip {
#define THERMAL_TRIP_PRIV_TO_INT(_val_) (uintptr_t)(_val_)
#define THERMAL_INT_TO_TRIP_PRIV(_val_) (void *)(uintptr_t)(_val_)
+/* Matches the maxItems: 4 constraint on the thermal-hw-bin binding. */
+#define THERMAL_HW_BIN_MAX_LEVELS 4
+
+/**
+ * struct thermal_hw_bin_info - platform-specific hardware binning description
+ * @supported_hw_bin: array of bitfields identifying the running hardware version
+ * @supported_hw_bin_count: number of valid entries in @supported_hw_bin
+ *
+ * Filled by platform code that decodes SoC revision / fuse information.
+ * Shared with the thermal OF parser to filter trip points and select
+ * per-bin temperatures via the thermal-hw-bin / temperature-bin DT properties.
+ */
+struct thermal_hw_bin_info {
+ const u32 *supported_hw_bin;
+ unsigned int supported_hw_bin_count;
+};
+
struct cooling_spec {
unsigned long upper; /* Highest cooling state */
unsigned long lower; /* Lowest cooling state */
@@ -216,6 +233,12 @@ devm_thermal_of_child_cooling_device_register(struct device *dev,
struct device_node *np,
const char *type, void *devdata,
const struct thermal_cooling_device_ops *ops);
+
+struct thermal_zone_device *
+devm_thermal_of_zone_register_with_bin(struct device *dev, int id, void *data,
+ const struct thermal_zone_device_ops *ops,
+ const struct thermal_hw_bin_info *hw_bin_info);
+
#else
static inline
@@ -254,6 +277,15 @@ devm_thermal_of_child_cooling_device_register(struct device *dev,
{
return ERR_PTR(-ENODEV);
}
+
+static inline struct thermal_zone_device *
+devm_thermal_of_zone_register_with_bin(struct device *dev, int id, void *data,
+ const struct thermal_zone_device_ops *ops,
+ const struct thermal_hw_bin_info *hw_bin_info)
+{
+ return ERR_PTR(-EOPNOTSUPP);
+}
+
#endif
int for_each_thermal_trip(struct thermal_zone_device *tz,
--
2.34.1
next prev parent reply other threads:[~2026-10-31 13:23 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-31 13:22 [PATCH v2 0/6] thermal: Add hardware-binned trip point support Gaurav Kohli
2026-10-31 13:22 ` [PATCH v2 1/6] dt-bindings: thermal: thermal-zones: add hardware-binning trip properties Gaurav Kohli
2026-10-31 13:22 ` Gaurav Kohli [this message]
2026-10-31 13:22 ` [PATCH v2 3/6] dt-bindings: thermal: qcom-tsens: document qcm6490 tsens Gaurav Kohli
2026-10-31 13:22 ` [PATCH v2 4/6] thermal: qcom: tsens: add hardware-bin trip-point filtering Gaurav Kohli
2026-10-31 13:22 ` [PATCH v2 5/6] arm64: dts: qcom: kodiak: use thermal hw-bin trips Gaurav Kohli
2026-10-31 13:22 ` [PATCH v2 6/6] arm64: dts: qcom: hamoa: add thermal hw-bin support Gaurav Kohli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261031-thermal_bin-v2-2-d76fd073ae98@oss.qualcomm.com \
--to=gaurav.kohli@oss.qualcomm.com \
--cc=abelvesa@kernel.org \
--cc=amit.kucheria@oss.qualcomm.com \
--cc=amitk@kernel.org \
--cc=andersson@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=daniel.lezcano@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=rafael@kernel.org \
--cc=rdunlap@infradead.org \
--cc=robh@kernel.org \
--cc=rui.zhang@intel.com \
--cc=skhan@linuxfoundation.org \
--cc=thara.gopinath@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®