]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
firmware: samsung: acpm: Add devm_acpm_get_by_phandle helper
authorTudor Ambarus <tudor.ambarus@linaro.org>
Fri, 15 May 2026 09:32:30 +0000 (09:32 +0000)
committerKrzysztof Kozlowski <krzk@kernel.org>
Fri, 29 May 2026 14:02:23 +0000 (16:02 +0200)
Introduce devm_acpm_get_by_phandle() to standardize how consumer
drivers acquire a handle to the ACPM IPC interface. Enforce the
use of the "samsung,acpm-ipc" property name across the SoC and
simplify the boilerplate code in client drivers.

The first consumer of this helper is the Exynos ACPM Thermal Management
Unit (TMU) driver. The TMU utilizes a hybrid management approach: direct
register access from the Application Processor (AP) is restricted to the
interrupt pending (INTPEND) registers for event identification.
High-level functional tasks, such as sensor initialization, threshold
programming, and temperature reads, are delegated to the ACPM firmware
via this IPC interface.

Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Reviewed-by: Peter Griffin <peter.griffin@linaro.org>
Link: https://patch.msgid.link/20260515-acpm-tmu-helpers-v2-6-8ca011d5a965@linaro.org
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
drivers/firmware/samsung/exynos-acpm.c
include/linux/firmware/samsung/exynos-acpm-protocol.h

index 2f3b9a1bd74aa5ada98b5d3b12c630026ff8aeb3..942a2e9f02f521eaefe1e389908e5185a3839352 100644 (file)
@@ -853,6 +853,29 @@ struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_acpm_get_by_node);
 
+/**
+ * devm_acpm_get_by_phandle - Resource managed lookup of the standardized
+ * "samsung,acpm-ipc" handle.
+ * @dev: consumer device
+ *
+ * Return: pointer to handle on success, ERR_PTR(-errno) otherwise.
+ */
+struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev)
+{
+       struct acpm_handle *handle;
+       struct device_node *np;
+
+       np = of_parse_phandle(dev->of_node, "samsung,acpm-ipc", 0);
+       if (!np)
+               return ERR_PTR(-ENODEV);
+
+       handle = devm_acpm_get_by_node(dev, np);
+       of_node_put(np);
+
+       return handle;
+}
+EXPORT_SYMBOL_GPL(devm_acpm_get_by_phandle);
+
 static const struct acpm_match_data acpm_gs101 = {
        .initdata_base = ACPM_GS101_INITDATA_BASE,
        .acpm_clk_dev_name = "gs101-acpm-clk",
index 8511c3c3983bf52ad5fb020253fae547ce117b91..dbf052c4139ba921ecc234e6c10bae3826eed1d8 100644 (file)
@@ -70,6 +70,7 @@ struct device;
 #if IS_ENABLED(CONFIG_EXYNOS_ACPM_PROTOCOL)
 struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
                                          struct device_node *np);
+struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev);
 #else
 
 static inline struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
@@ -77,6 +78,11 @@ static inline struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
 {
        return NULL;
 }
+
+static inline struct acpm_handle *devm_acpm_get_by_phandle(struct device *dev)
+{
+       return ERR_PTR(-ENODEV);
+}
 #endif
 
 #endif /* __EXYNOS_ACPM_PROTOCOL_H */