* [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver
@ 2025-08-27 12:42 Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
` (5 more replies)
0 siblings, 6 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
The Alive CLock and Power Manager (ACPM) firmware exposes clocks that
are variable and index based. These clocks don't provide an entire range
of values between the limits but only discrete points within the range.
The firmware also manages the voltage scaling appropriately with the
clock scaling. Make the ACPM node a clock provider.
Add support for the ACPM DVFS protocol. It translates clock frequency
requests to messages that can be interpreted by the ACPM firmware.
Add an ACPM clock driver to model the clocks exposed by the ACPM firmware.
All patches can go through the samsung tree.
Thanks,
ta
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
Changes in v2:
- dt-bindings: clocks are not longer a child of ACPM protocol. Instead
make Alive Clock and Power Manager (ACPM) node a clock provider.
Update commit message.
- firmware: exynos-acpm: register by hand the ACPM clocks dev (new
patch)
- firmware: exynos-acpm: use defines intead of enum
- acpm-clk:
- switch to determine_rate
- drop __init, __refdata, __initconst, this is a module, we need those
methods and data, after boot as well.
- fix the assumption that the clocks are defined by ID in ascending order.
There's still an assumption that the clk_id < nr_clks, but this is
now covered by a sanity check in the clock driver.
- arm64: defconfig: enable Exynos ACPM clocks (add patch together with
this patch set)
- Link to v1: https://lore.kernel.org/r/20250819-acpm-clk-v1-0-6bbd97474671@linaro.org
---
Tudor Ambarus (5):
dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells
firmware: exynos-acpm: add DVFS protocol
clk: samsung: add Exynos ACPM clock driver
firmware: exynos-acpm: register ACPM clocks dev
arm64: defconfig: enable Exynos ACPM clocks
.../bindings/firmware/google,gs101-acpm-ipc.yaml | 11 ++
arch/arm64/configs/defconfig | 1 +
drivers/clk/samsung/Kconfig | 10 ++
drivers/clk/samsung/Makefile | 1 +
drivers/clk/samsung/clk-acpm.c | 148 +++++++++++++++++++++
drivers/firmware/samsung/Makefile | 4 +-
drivers/firmware/samsung/exynos-acpm-dvfs.c | 83 ++++++++++++
drivers/firmware/samsung/exynos-acpm-dvfs.h | 21 +++
drivers/firmware/samsung/exynos-acpm.c | 69 +++++++++-
include/dt-bindings/clock/google,gs101.h | 15 +++
.../linux/firmware/samsung/exynos-acpm-protocol.h | 10 ++
include/linux/platform_data/clk-acpm.h | 24 ++++
12 files changed, 395 insertions(+), 2 deletions(-)
---
base-commit: c17b750b3ad9f45f2b6f7e6f7f4679844244f0b9
change-id: 20250819-acpm-clk-28d2a78e0307
Best regards,
--
Tudor Ambarus <tudor.ambarus@linaro.org>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
@ 2025-08-27 12:42 ` Tudor Ambarus
2025-08-29 16:51 ` Rob Herring (Arm)
2025-08-31 10:40 ` Krzysztof Kozlowski
2025-08-27 12:42 ` [PATCH v2 2/5] firmware: exynos-acpm: add DVFS protocol Tudor Ambarus
` (4 subsequent siblings)
5 siblings, 2 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
The firmware exposes clocks that can be controlled via the
Alive Clock and Power Manager (ACPM) interface.
Make the ACPM node a clock provider by adding the mandatory
"#clock-cells" property, which allows devices to reference its
clock outputs.
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
.../bindings/firmware/google,gs101-acpm-ipc.yaml | 11 +++++++++++
include/dt-bindings/clock/google,gs101.h | 15 +++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml b/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
index 9785aac3b5f34955bbfe2718eec48581d050954f..d3bca6088d128485618bb2b538ed8596b4ba14f0 100644
--- a/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
+++ b/Documentation/devicetree/bindings/firmware/google,gs101-acpm-ipc.yaml
@@ -24,6 +24,15 @@ properties:
compatible:
const: google,gs101-acpm-ipc
+ "#clock-cells":
+ const: 1
+ description:
+ Clocks that are variable and index based. These clocks don't provide
+ an entire range of values between the limits but only discrete points
+ within the range. The firmware also manages the voltage scaling
+ appropriately with the clock scaling. The argument is the ID of the
+ clock contained by the firmware messages.
+
mboxes:
maxItems: 1
@@ -45,6 +54,7 @@ properties:
required:
- compatible
+ - "#clock-cells"
- mboxes
- shmem
@@ -56,6 +66,7 @@ examples:
power-management {
compatible = "google,gs101-acpm-ipc";
+ #clock-cells = <1>;
mboxes = <&ap2apm_mailbox>;
shmem = <&apm_sram>;
diff --git a/include/dt-bindings/clock/google,gs101.h b/include/dt-bindings/clock/google,gs101.h
index 442f9e9037dc33198a1cee20af62fc70bbd96605..f1d0df412fdd49b300db4ba88bc0b1674cf0cdf8 100644
--- a/include/dt-bindings/clock/google,gs101.h
+++ b/include/dt-bindings/clock/google,gs101.h
@@ -634,4 +634,19 @@
#define CLK_GOUT_PERIC1_CLK_PERIC1_USI9_USI_CLK 45
#define CLK_GOUT_PERIC1_SYSREG_PERIC1_PCLK 46
+#define CLK_ACPM_DVFS_MIF 0
+#define CLK_ACPM_DVFS_INT 1
+#define CLK_ACPM_DVFS_CPUCL0 2
+#define CLK_ACPM_DVFS_CPUCL1 3
+#define CLK_ACPM_DVFS_CPUCL2 4
+#define CLK_ACPM_DVFS_G3D 5
+#define CLK_ACPM_DVFS_G3DL2 6
+#define CLK_ACPM_DVFS_TPU 7
+#define CLK_ACPM_DVFS_INTCAM 8
+#define CLK_ACPM_DVFS_TNR 9
+#define CLK_ACPM_DVFS_CAM 10
+#define CLK_ACPM_DVFS_MFC 11
+#define CLK_ACPM_DVFS_DISP 12
+#define CLK_ACPM_DVFS_BO 13
+
#endif /* _DT_BINDINGS_CLOCK_GOOGLE_GS101_H */
--
2.51.0.261.g7ce5a0a67e-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 2/5] firmware: exynos-acpm: add DVFS protocol
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
@ 2025-08-27 12:42 ` Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver Tudor Ambarus
` (3 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
Add ACPM DVFS protocol handler. It constructs DVFS messages that
the APM firmware can understand.
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
drivers/firmware/samsung/Makefile | 4 +-
drivers/firmware/samsung/exynos-acpm-dvfs.c | 83 ++++++++++++++++++++++
drivers/firmware/samsung/exynos-acpm-dvfs.h | 21 ++++++
drivers/firmware/samsung/exynos-acpm.c | 5 ++
.../linux/firmware/samsung/exynos-acpm-protocol.h | 10 +++
5 files changed, 122 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/samsung/Makefile b/drivers/firmware/samsung/Makefile
index 7b4c9f6f34f54fd731886d97a615fe1aa97ba9a0..80d4f89b33a9558b68c9083da675c70ec3d05f19 100644
--- a/drivers/firmware/samsung/Makefile
+++ b/drivers/firmware/samsung/Makefile
@@ -1,4 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
-acpm-protocol-objs := exynos-acpm.o exynos-acpm-pmic.o
+acpm-protocol-objs := exynos-acpm.o
+acpm-protocol-objs += exynos-acpm-pmic.o
+acpm-protocol-objs += exynos-acpm-dvfs.o
obj-$(CONFIG_EXYNOS_ACPM_PROTOCOL) += acpm-protocol.o
diff --git a/drivers/firmware/samsung/exynos-acpm-dvfs.c b/drivers/firmware/samsung/exynos-acpm-dvfs.c
new file mode 100644
index 0000000000000000000000000000000000000000..a8763bf9374d41952a8d26124cc77baae0f1c723
--- /dev/null
+++ b/drivers/firmware/samsung/exynos-acpm-dvfs.c
@@ -0,0 +1,83 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright 2020 Samsung Electronics Co., Ltd.
+ * Copyright 2020 Google LLC.
+ * Copyright 2025 Linaro Ltd.
+ */
+
+#include <linux/bitfield.h>
+#include <linux/firmware/samsung/exynos-acpm-protocol.h>
+#include <linux/ktime.h>
+#include <linux/types.h>
+#include <linux/units.h>
+
+#include "exynos-acpm.h"
+#include "exynos-acpm-dvfs.h"
+
+#define ACPM_DVFS_ID GENMASK(11, 0)
+#define ACPM_DVFS_REQ_TYPE GENMASK(15, 0)
+
+#define ACPM_DVFS_FREQ_REQ 0
+#define ACPM_DVFS_FREQ_GET 1
+
+static void acpm_dvfs_set_xfer(struct acpm_xfer *xfer, u32 *cmd, size_t cmdlen,
+ unsigned int acpm_chan_id, bool response)
+{
+ xfer->acpm_chan_id = acpm_chan_id;
+ xfer->txd = cmd;
+ xfer->txlen = cmdlen;
+
+ if (response) {
+ xfer->rxd = cmd;
+ xfer->rxlen = cmdlen;
+ }
+}
+
+static void acpm_dvfs_init_set_rate_cmd(u32 cmd[4], unsigned int clk_id,
+ unsigned long rate)
+{
+ cmd[0] = FIELD_PREP(ACPM_DVFS_ID, clk_id);
+ cmd[1] = rate / HZ_PER_KHZ;
+ cmd[2] = FIELD_PREP(ACPM_DVFS_REQ_TYPE, ACPM_DVFS_FREQ_REQ);
+ cmd[3] = ktime_to_ms(ktime_get());
+}
+
+int acpm_dvfs_set_rate(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id, unsigned int clk_id,
+ unsigned long rate)
+{
+ struct acpm_xfer xfer = {0};
+ u32 cmd[4];
+
+ acpm_dvfs_init_set_rate_cmd(cmd, clk_id, rate);
+ acpm_dvfs_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id, false);
+
+ return acpm_do_xfer(handle, &xfer);
+}
+
+static void acpm_dvfs_init_get_rate_cmd(u32 cmd[4], unsigned int clk_id,
+ u32 dbg_val)
+{
+ cmd[0] = FIELD_PREP(ACPM_DVFS_ID, clk_id);
+ cmd[1] = dbg_val;
+ cmd[2] = FIELD_PREP(ACPM_DVFS_REQ_TYPE, ACPM_DVFS_FREQ_GET);
+ cmd[3] = ktime_to_ms(ktime_get());
+}
+
+unsigned long acpm_dvfs_get_rate(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id, unsigned int clk_id,
+ u32 dbg_val)
+{
+ struct acpm_xfer xfer;
+ unsigned int cmd[4];
+ int ret;
+
+ acpm_dvfs_init_get_rate_cmd(cmd, clk_id, dbg_val);
+ acpm_dvfs_set_xfer(&xfer, cmd, sizeof(cmd), acpm_chan_id, true);
+
+ ret = acpm_do_xfer(handle, &xfer);
+ if (ret)
+ return 0;
+
+ return xfer.rxd[1] * HZ_PER_KHZ;
+}
diff --git a/drivers/firmware/samsung/exynos-acpm-dvfs.h b/drivers/firmware/samsung/exynos-acpm-dvfs.h
new file mode 100644
index 0000000000000000000000000000000000000000..85a10bd535d118f2f36e9888e41b9b705b08ea59
--- /dev/null
+++ b/drivers/firmware/samsung/exynos-acpm-dvfs.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright 2020 Samsung Electronics Co., Ltd.
+ * Copyright 2020 Google LLC.
+ * Copyright 2025 Linaro Ltd.
+ */
+#ifndef __EXYNOS_ACPM_DVFS_H__
+#define __EXYNOS_ACPM_DVFS_H__
+
+#include <linux/types.h>
+
+struct acpm_handle;
+
+int acpm_dvfs_set_rate(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id, unsigned int id,
+ unsigned long rate);
+unsigned long acpm_dvfs_get_rate(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id, unsigned int clk_id,
+ u32 dbg_val);
+
+#endif /* __EXYNOS_ACPM_DVFS_H__ */
diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/samsung/exynos-acpm.c
index 3a69fe3234c75e0b5a93cbea6bb210dc6f69d2a6..9fa0335ccf5db32892fdf09e8d4b0a885a8f8fb5 100644
--- a/drivers/firmware/samsung/exynos-acpm.c
+++ b/drivers/firmware/samsung/exynos-acpm.c
@@ -29,6 +29,7 @@
#include <linux/types.h>
#include "exynos-acpm.h"
+#include "exynos-acpm-dvfs.h"
#include "exynos-acpm-pmic.h"
#define ACPM_PROTOCOL_SEQNUM GENMASK(21, 16)
@@ -590,8 +591,12 @@ static int acpm_channels_init(struct acpm_info *acpm)
*/
static void acpm_setup_ops(struct acpm_info *acpm)
{
+ struct acpm_dvfs_ops *dvfs_ops = &acpm->handle.ops.dvfs_ops;
struct acpm_pmic_ops *pmic_ops = &acpm->handle.ops.pmic_ops;
+ dvfs_ops->set_rate = acpm_dvfs_set_rate;
+ dvfs_ops->get_rate = acpm_dvfs_get_rate;
+
pmic_ops->read_reg = acpm_pmic_read_reg;
pmic_ops->bulk_read = acpm_pmic_bulk_read;
pmic_ops->write_reg = acpm_pmic_write_reg;
diff --git a/include/linux/firmware/samsung/exynos-acpm-protocol.h b/include/linux/firmware/samsung/exynos-acpm-protocol.h
index f628bf1862c25fa018a2fe5e7e123bf05c5254b9..e41055316bb578bb8250a1b1177f1059eeeb2611 100644
--- a/include/linux/firmware/samsung/exynos-acpm-protocol.h
+++ b/include/linux/firmware/samsung/exynos-acpm-protocol.h
@@ -13,6 +13,15 @@
struct acpm_handle;
struct device_node;
+struct acpm_dvfs_ops {
+ int (*set_rate)(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id, unsigned int clk_id,
+ unsigned long rate);
+ unsigned long (*get_rate)(const struct acpm_handle *handle,
+ unsigned int acpm_chan_id,
+ unsigned int clk_id, u32 dbg_val);
+};
+
struct acpm_pmic_ops {
int (*read_reg)(const struct acpm_handle *handle,
unsigned int acpm_chan_id, u8 type, u8 reg, u8 chan,
@@ -32,6 +41,7 @@ struct acpm_pmic_ops {
};
struct acpm_ops {
+ struct acpm_dvfs_ops dvfs_ops;
struct acpm_pmic_ops pmic_ops;
};
--
2.51.0.261.g7ce5a0a67e-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 2/5] firmware: exynos-acpm: add DVFS protocol Tudor Ambarus
@ 2025-08-27 12:42 ` Tudor Ambarus
2025-08-28 5:35 ` Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev Tudor Ambarus
` (2 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
Add the Exynos ACPM clock driver. It provides support for clocks that
are controlled by firmware that implements the ACPM interface.
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
drivers/clk/samsung/Kconfig | 10 +++
drivers/clk/samsung/Makefile | 1 +
drivers/clk/samsung/clk-acpm.c | 148 +++++++++++++++++++++++++++++++++
include/linux/platform_data/clk-acpm.h | 24 ++++++
4 files changed, 183 insertions(+)
diff --git a/drivers/clk/samsung/Kconfig b/drivers/clk/samsung/Kconfig
index 76a494e95027af26272e30876a87ac293bd56dfa..fe05212d7dd882adde9cd5c656cd0d58d501c42f 100644
--- a/drivers/clk/samsung/Kconfig
+++ b/drivers/clk/samsung/Kconfig
@@ -95,6 +95,16 @@ config EXYNOS_CLKOUT
status of the certains clocks from SoC, but it could also be tied to
other devices as an input clock.
+config EXYNOS_ACPM_CLK
+ tristate "Clock driver controlled via ACPM interface"
+ depends on EXYNOS_ACPM_PROTOCOL || COMPILE_TEST
+ help
+ This driver provides support for clocks that are controlled by
+ firmware that implements the ACPM interface.
+
+ This driver uses the ACPM interface to interact with the firmware
+ providing all the clock controlls.
+
config TESLA_FSD_COMMON_CLK
bool "Tesla FSD clock controller support" if COMPILE_TEST
depends on COMMON_CLK_SAMSUNG
diff --git a/drivers/clk/samsung/Makefile b/drivers/clk/samsung/Makefile
index b77fe288e4bb484c68d1ff497acc0b83d132ea03..04b63436b12f6f5169575d74f54b105e97bbb052 100644
--- a/drivers/clk/samsung/Makefile
+++ b/drivers/clk/samsung/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynos990.o
obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynosautov9.o
obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-exynosautov920.o
obj-$(CONFIG_EXYNOS_ARM64_COMMON_CLK) += clk-gs101.o
+obj-$(CONFIG_EXYNOS_ACPM_CLK) += clk-acpm.o
obj-$(CONFIG_S3C64XX_COMMON_CLK) += clk-s3c64xx.o
obj-$(CONFIG_S5PV210_COMMON_CLK) += clk-s5pv210.o clk-s5pv210-audss.o
obj-$(CONFIG_TESLA_FSD_COMMON_CLK) += clk-fsd.o
diff --git a/drivers/clk/samsung/clk-acpm.c b/drivers/clk/samsung/clk-acpm.c
new file mode 100644
index 0000000000000000000000000000000000000000..e0db63ba1e07efdae53e340bc24c3576b2a5fd04
--- /dev/null
+++ b/drivers/clk/samsung/clk-acpm.c
@@ -0,0 +1,148 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Samsung Exynos ACPM protocol based clock driver.
+ *
+ * Copyright 2025 Linaro Ltd.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/firmware/samsung/exynos-acpm-protocol.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_data/clk-acpm.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+
+struct acpm_clk {
+ u32 id;
+ struct clk_hw hw;
+ unsigned int mbox_chan_id;
+ const struct acpm_handle *handle;
+};
+
+#define to_acpm_clk(clk) container_of(clk, struct acpm_clk, hw)
+
+static unsigned long acpm_clk_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct acpm_clk *clk = to_acpm_clk(hw);
+
+ return clk->handle->ops.dvfs_ops.get_rate(clk->handle,
+ clk->mbox_chan_id, clk->id, 0);
+}
+
+static int acpm_clk_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ /*
+ * We can't figure out what rate it will be, so just return the
+ * rate back to the caller. acpm_clk_recalc_rate() will be called
+ * after the rate is set and we'll know what rate the clock is
+ * running at then.
+ */
+ return 0;
+}
+
+static int acpm_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct acpm_clk *clk = to_acpm_clk(hw);
+
+ return clk->handle->ops.dvfs_ops.set_rate(clk->handle,
+ clk->mbox_chan_id, clk->id, rate);
+}
+
+static const struct clk_ops acpm_clk_ops = {
+ .recalc_rate = acpm_clk_recalc_rate,
+ .determine_rate = acpm_clk_determine_rate,
+ .set_rate = acpm_clk_set_rate,
+};
+
+static int acpm_clk_ops_init(struct device *dev, struct acpm_clk *aclk,
+ const char *name)
+{
+ struct clk_init_data init = {};
+
+ init.name = name;
+ init.ops = &acpm_clk_ops;
+ aclk->hw.init = &init;
+
+ return devm_clk_hw_register(dev, &aclk->hw);
+}
+
+static int acpm_clk_probe(struct platform_device *pdev)
+{
+ const struct acpm_clk_platform_data *pdata;
+ const struct acpm_handle *acpm_handle;
+ struct clk_hw_onecell_data *clk_data;
+ struct clk_hw **hws;
+ struct device *dev = &pdev->dev;
+ struct acpm_clk *aclks;
+ unsigned int mbox_chan_id;
+ int i, err, count;
+
+ pdata = dev_get_platdata(&pdev->dev);
+ if (!pdata)
+ return dev_err_probe(dev, -EINVAL,
+ "Failed to get platform data.\n");
+
+ acpm_handle = devm_acpm_get_by_node(dev, dev->parent->of_node);
+ if (IS_ERR(acpm_handle))
+ return dev_err_probe(dev, PTR_ERR(acpm_handle),
+ "Failed to get acpm handle.\n");
+
+ count = pdata->nr_clks;
+ mbox_chan_id = pdata->mbox_chan_id;
+
+ clk_data = devm_kzalloc(dev, struct_size(clk_data, hws, count),
+ GFP_KERNEL);
+ if (!clk_data)
+ return -ENOMEM;
+
+ clk_data->num = count;
+ hws = clk_data->hws;
+
+ aclks = devm_kcalloc(dev, count, sizeof(*aclks), GFP_KERNEL);
+ if (!aclks)
+ return -ENOMEM;
+
+ for (i = 0; i < count; i++) {
+ const struct acpm_clk_variant *variant = &pdata->clks[i];
+ unsigned int id = variant->id;
+ struct acpm_clk *aclk;
+
+ if (id >= count)
+ return dev_err_probe(dev, -EINVAL,
+ "Invalid ACPM clock ID.\n");
+
+ aclk = &aclks[id];
+ aclk->id = id;
+ aclk->handle = acpm_handle;
+ aclk->mbox_chan_id = mbox_chan_id;
+
+ hws[id] = &aclk->hw;
+
+ err = acpm_clk_ops_init(dev, aclk, variant->name);
+ if (err)
+ return dev_err_probe(dev, err,
+ "Failed to register clock.\n");
+ }
+
+ return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
+ clk_data);
+}
+
+static struct platform_driver acpm_clk_driver = {
+ .driver = {
+ .name = "acpm-clocks",
+ },
+ .probe = acpm_clk_probe,
+};
+module_platform_driver(acpm_clk_driver);
+
+MODULE_ALIAS("platform:acpm-clocks");
+MODULE_AUTHOR("Tudor Ambarus <tudor.ambarus@linaro.org>");
+MODULE_DESCRIPTION("Samsung Exynos ACPM clock driver");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/platform_data/clk-acpm.h b/include/linux/platform_data/clk-acpm.h
new file mode 100644
index 0000000000000000000000000000000000000000..8327435fbb603472346b14b81160ffe98a79486b
--- /dev/null
+++ b/include/linux/platform_data/clk-acpm.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Samsung Exynos Alive Clock and Power Manager (ACPM) clock driver.
+ *
+ * Copyright 2025 Linaro Ltd.
+ */
+
+#ifndef __LINUX_PLATFORM_DATA_CLK_ACPM_H__
+#define __LINUX_PLATFORM_DATA_CLK_ACPM_H__
+
+#include <linux/types.h>
+
+struct acpm_clk_variant {
+ unsigned int id;
+ const char *name;
+};
+
+struct acpm_clk_platform_data {
+ const struct acpm_clk_variant *clks;
+ unsigned int nr_clks;
+ unsigned int mbox_chan_id;
+};
+
+#endif /* __LINUX_PLATFORM_DATA_CLK_ACPM_H__ */
--
2.51.0.261.g7ce5a0a67e-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
` (2 preceding siblings ...)
2025-08-27 12:42 ` [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver Tudor Ambarus
@ 2025-08-27 12:42 ` Tudor Ambarus
2025-08-31 10:50 ` Krzysztof Kozlowski
2025-08-27 12:42 ` [PATCH v2 5/5] arm64: defconfig: enable Exynos ACPM clocks Tudor Ambarus
2025-08-31 10:42 ` [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Krzysztof Kozlowski
5 siblings, 1 reply; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
Register by hand a platform device for the ACPM clocks.
The ACPM clocks are not modeled as a DT child of ACPM because:
1/ they don't have their own resources.
2/ they are not a block that can be reused. The clock identifying
data is reduced (clock ID, clock name and mailbox channel ID)
and may differ from a SoC to another.
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
drivers/firmware/samsung/exynos-acpm.c | 64 +++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/samsung/exynos-acpm.c b/drivers/firmware/samsung/exynos-acpm.c
index 9fa0335ccf5db32892fdf09e8d4b0a885a8f8fb5..86a220a845d2934aa28e9bb8996cf914f65cdae6 100644
--- a/drivers/firmware/samsung/exynos-acpm.c
+++ b/drivers/firmware/samsung/exynos-acpm.c
@@ -24,10 +24,13 @@
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
+#include <linux/platform_data/clk-acpm.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/types.h>
+#include <dt-bindings/clock/google,gs101.h>
+
#include "exynos-acpm.h"
#include "exynos-acpm-dvfs.h"
#include "exynos-acpm-pmic.h"
@@ -160,6 +163,7 @@ struct acpm_chan {
* struct acpm_info - driver's private data.
* @shmem: pointer to the SRAM configuration data.
* @sram_base: base address of SRAM.
+ * @clk_pdev: ACPM clocks platform device.
* @chans: pointer to the ACPM channel parameters retrieved from SRAM.
* @dev: pointer to the exynos-acpm device.
* @handle: instance of acpm_handle to send to clients.
@@ -168,6 +172,7 @@ struct acpm_chan {
struct acpm_info {
struct acpm_shmem __iomem *shmem;
void __iomem *sram_base;
+ struct platform_device *clk_pdev;
struct acpm_chan *chans;
struct device *dev;
struct acpm_handle handle;
@@ -177,14 +182,39 @@ struct acpm_info {
/**
* struct acpm_match_data - of_device_id data.
* @initdata_base: offset in SRAM where the channels configuration resides.
+ * @acpm_clk_pdata: ACPM clocks platform data.
*/
struct acpm_match_data {
loff_t initdata_base;
+ const struct acpm_clk_platform_data *acpm_clk_pdata;
};
#define client_to_acpm_chan(c) container_of(c, struct acpm_chan, cl)
#define handle_to_acpm_info(h) container_of(h, struct acpm_info, handle)
+#define ACPM_CLK(_id, cname) \
+ { \
+ .id = _id, \
+ .name = cname, \
+ }
+
+static const struct acpm_clk_variant gs101_acpm_clks[] = {
+ ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
+ ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
+ ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
+ ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
+ ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
+ ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
+ ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
+ ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
+ ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
+ ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
+ ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
+ ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
+ ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
+ ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
+};
+
/**
* acpm_get_saved_rx() - get the response if it was already saved.
* @achan: ACPM channel info.
@@ -606,6 +636,7 @@ static void acpm_setup_ops(struct acpm_info *acpm)
static int acpm_probe(struct platform_device *pdev)
{
+ const struct acpm_clk_platform_data *acpm_clk_pdata;
const struct acpm_match_data *match_data;
struct device *dev = &pdev->dev;
struct device_node *shmem;
@@ -647,7 +678,30 @@ static int acpm_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, acpm);
- return devm_of_platform_populate(dev);
+ acpm_clk_pdata = match_data->acpm_clk_pdata;
+ acpm->clk_pdev = platform_device_register_data(dev, "acpm-clocks",
+ PLATFORM_DEVID_NONE,
+ acpm_clk_pdata,
+ sizeof(*acpm_clk_pdata));
+ if (IS_ERR(acpm->clk_pdev))
+ return dev_err_probe(dev, PTR_ERR(acpm->clk_pdev),
+ "Failed to register ACPM clocks device.\n");
+
+ ret = devm_of_platform_populate(dev);
+ if (ret) {
+ platform_device_unregister(acpm->clk_pdev);
+ return dev_err_probe(dev, ret,
+ "Failed to populate platform devices.\n");
+ }
+
+ return 0;
+}
+
+static void acpm_remove(struct platform_device *pdev)
+{
+ struct acpm_info *acpm = platform_get_drvdata(pdev);
+
+ platform_device_unregister(acpm->clk_pdev);
}
/**
@@ -744,8 +798,15 @@ const struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
}
EXPORT_SYMBOL_GPL(devm_acpm_get_by_node);
+static const struct acpm_clk_platform_data acpm_clk_gs101 = {
+ .clks = gs101_acpm_clks,
+ .nr_clks = ARRAY_SIZE(gs101_acpm_clks),
+ .mbox_chan_id = 0,
+};
+
static const struct acpm_match_data acpm_gs101 = {
.initdata_base = ACPM_GS101_INITDATA_BASE,
+ .acpm_clk_pdata = &acpm_clk_gs101,
};
static const struct of_device_id acpm_match[] = {
@@ -759,6 +820,7 @@ MODULE_DEVICE_TABLE(of, acpm_match);
static struct platform_driver acpm_driver = {
.probe = acpm_probe,
+ .remove = acpm_remove,
.driver = {
.name = "exynos-acpm-protocol",
.of_match_table = acpm_match,
--
2.51.0.261.g7ce5a0a67e-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 5/5] arm64: defconfig: enable Exynos ACPM clocks
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
` (3 preceding siblings ...)
2025-08-27 12:42 ` [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev Tudor Ambarus
@ 2025-08-27 12:42 ` Tudor Ambarus
2025-08-31 10:42 ` [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Krzysztof Kozlowski
5 siblings, 0 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-27 12:42 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team, Tudor Ambarus
Enable the Exynos ACPM clocks driver. Samsung Exynos platforms
implement ACPM to provide support for clock configuration, PMIC
and temperature sensors.
Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
---
arch/arm64/configs/defconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 58f87d09366cd12ae212a1d107660afe8be6c5ef..4255bc885545fb3bb7e9cf02760cac35bf2872fa 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -1445,6 +1445,7 @@ CONFIG_CLK_GFM_LPASS_SM8250=m
CONFIG_SM_VIDEOCC_8450=m
CONFIG_CLK_RCAR_USB2_CLOCK_SEL=y
CONFIG_CLK_RENESAS_VBATTB=m
+CONFIG_EXYNOS_ACPM_CLK=m
CONFIG_CLK_SOPHGO_CV1800=y
CONFIG_HWSPINLOCK=y
CONFIG_HWSPINLOCK_OMAP=m
--
2.51.0.261.g7ce5a0a67e-goog
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver
2025-08-27 12:42 ` [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver Tudor Ambarus
@ 2025-08-28 5:35 ` Tudor Ambarus
0 siblings, 0 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-08-28 5:35 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Peter Griffin,
André Draszik, Michael Turquette, Stephen Boyd,
Krzysztof Kozlowski, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 8/27/25 1:42 PM, Tudor Ambarus wrote:
> +config EXYNOS_ACPM_CLK
> + tristate "Clock driver controlled via ACPM interface"
> + depends on EXYNOS_ACPM_PROTOCOL || COMPILE_TEST
I'll need to update the depends on line to:
depends on EXYNOS_ACPM_PROTOCOL || (COMPILE_TEST && !EXYNOS_ACPM_PROTOCOL)
otherwise on randconfigs where COMPILE_TEST=y and EXYNOS_ACPM_PROTOCOL=n I get:
ERROR: modpost: "devm_acpm_get_by_node" [drivers/clk/samsung/clk-acpm.ko] undefined!
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
@ 2025-08-29 16:51 ` Rob Herring (Arm)
2025-08-31 10:40 ` Krzysztof Kozlowski
1 sibling, 0 replies; 17+ messages in thread
From: Rob Herring (Arm) @ 2025-08-29 16:51 UTC (permalink / raw)
To: Tudor Ambarus
Cc: Conor Dooley, Sylwester Nawrocki, Michael Turquette,
Peter Griffin, linux-kernel, Will Deacon, linux-clk,
Catalin Marinas, willmcvicker, Chanwoo Choi, linux-arm-kernel,
kernel-team, Stephen Boyd, Alim Akhtar, linux-samsung-soc,
André Draszik, Krzysztof Kozlowski, devicetree,
Krzysztof Kozlowski
On Wed, 27 Aug 2025 12:42:11 +0000, Tudor Ambarus wrote:
> The firmware exposes clocks that can be controlled via the
> Alive Clock and Power Manager (ACPM) interface.
>
> Make the ACPM node a clock provider by adding the mandatory
> "#clock-cells" property, which allows devices to reference its
> clock outputs.
>
> Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
> ---
> .../bindings/firmware/google,gs101-acpm-ipc.yaml | 11 +++++++++++
> include/dt-bindings/clock/google,gs101.h | 15 +++++++++++++++
> 2 files changed, 26 insertions(+)
>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
2025-08-29 16:51 ` Rob Herring (Arm)
@ 2025-08-31 10:40 ` Krzysztof Kozlowski
2025-09-01 6:25 ` Tudor Ambarus
1 sibling, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-31 10:40 UTC (permalink / raw)
To: Tudor Ambarus, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Peter Griffin, André Draszik, Michael Turquette,
Stephen Boyd, Alim Akhtar, Sylwester Nawrocki, Chanwoo Choi,
Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 27/08/2025 14:42, Tudor Ambarus wrote:
> diff --git a/include/dt-bindings/clock/google,gs101.h b/include/dt-bindings/clock/google,gs101.h
> index 442f9e9037dc33198a1cee20af62fc70bbd96605..f1d0df412fdd49b300db4ba88bc0b1674cf0cdf8 100644
> --- a/include/dt-bindings/clock/google,gs101.h
> +++ b/include/dt-bindings/clock/google,gs101.h
> @@ -634,4 +634,19 @@
> #define CLK_GOUT_PERIC1_CLK_PERIC1_USI9_USI_CLK 45
> #define CLK_GOUT_PERIC1_SYSREG_PERIC1_PCLK 46
I missed it last time - this is a header for SoC clock controller
bindings. ACPM firmware is completely different device, so should go to
its own binding header.
>
> +#define CLK_ACPM_DVFS_MIF 0
> +#define CLK_ACPM_DVFS_INT 1
> +#define CLK_ACPM_DVFS_CPUCL0 2
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
` (4 preceding siblings ...)
2025-08-27 12:42 ` [PATCH v2 5/5] arm64: defconfig: enable Exynos ACPM clocks Tudor Ambarus
@ 2025-08-31 10:42 ` Krzysztof Kozlowski
2025-09-01 7:06 ` Tudor Ambarus
5 siblings, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-31 10:42 UTC (permalink / raw)
To: Tudor Ambarus, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Peter Griffin, André Draszik, Michael Turquette,
Stephen Boyd, Alim Akhtar, Sylwester Nawrocki, Chanwoo Choi,
Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 27/08/2025 14:42, Tudor Ambarus wrote:
> The Alive CLock and Power Manager (ACPM) firmware exposes clocks that
> are variable and index based. These clocks don't provide an entire range
> of values between the limits but only discrete points within the range.
> The firmware also manages the voltage scaling appropriately with the
> clock scaling. Make the ACPM node a clock provider.
>
> Add support for the ACPM DVFS protocol. It translates clock frequency
> requests to messages that can be interpreted by the ACPM firmware.
> Add an ACPM clock driver to model the clocks exposed by the ACPM firmware.
>
> All patches can go through the samsung tree.
You really should have explained the dependencies instead of me trying
to decipher how to handle this patch. It's really not trivial.
You do understand that clock is completely different subsystem (Stephen
Boyd)?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-08-27 12:42 ` [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev Tudor Ambarus
@ 2025-08-31 10:50 ` Krzysztof Kozlowski
2025-09-01 6:56 ` Tudor Ambarus
0 siblings, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-31 10:50 UTC (permalink / raw)
To: Tudor Ambarus, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Peter Griffin, André Draszik, Michael Turquette,
Stephen Boyd, Alim Akhtar, Sylwester Nawrocki, Chanwoo Choi,
Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 27/08/2025 14:42, Tudor Ambarus wrote:
> +
> +static const struct acpm_clk_variant gs101_acpm_clks[] = {
> + ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
> + ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
> + ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
> + ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
> + ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
> + ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
> + ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
> + ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
> + ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
> + ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
> + ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
> +};
I don't understand why clocks are defined in the firmware driver, not in
the clock driver.
This creates dependency of this patch on the clock patch, so basically
there is no way I will take it in one cycle.
> +
> /**
> * acpm_get_saved_rx() - get the response if it was already saved.
> * @achan: ACPM channel info.
> @@ -606,6 +636,7 @@ static void acpm_setup_ops(struct acpm_info *acpm)
>
> static int acpm_probe(struct platform_device *pdev)
> {
> + const struct acpm_clk_platform_data *acpm_clk_pdata;
> const struct acpm_match_data *match_data;
> struct device *dev = &pdev->dev;
> struct device_node *shmem;
> @@ -647,7 +678,30 @@ static int acpm_probe(struct platform_device *pdev)
>
> platform_set_drvdata(pdev, acpm);
>
> - return devm_of_platform_populate(dev);
> + acpm_clk_pdata = match_data->acpm_clk_pdata;
> + acpm->clk_pdev = platform_device_register_data(dev, "acpm-clocks",
> + PLATFORM_DEVID_NONE,
> + acpm_clk_pdata,
> + sizeof(*acpm_clk_pdata));
> + if (IS_ERR(acpm->clk_pdev))
> + return dev_err_probe(dev, PTR_ERR(acpm->clk_pdev),
> + "Failed to register ACPM clocks device.\n");
> +
> + ret = devm_of_platform_populate(dev);
> + if (ret) {
> + platform_device_unregister(acpm->clk_pdev);
I think this should stick to devm-interfaces everywhere, not mix them,
to have exactly expected cleanup sequence. Now your remove() first
unregisters and then de-populates, which is different order than it was
done in probe(). Use devm-action handler for device unregistering.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells
2025-08-31 10:40 ` Krzysztof Kozlowski
@ 2025-09-01 6:25 ` Tudor Ambarus
0 siblings, 0 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-09-01 6:25 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Peter Griffin, André Draszik,
Michael Turquette, Stephen Boyd, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 8/31/25 11:40 AM, Krzysztof Kozlowski wrote:
> On 27/08/2025 14:42, Tudor Ambarus wrote:
>> diff --git a/include/dt-bindings/clock/google,gs101.h b/include/dt-bindings/clock/google,gs101.h
>> index 442f9e9037dc33198a1cee20af62fc70bbd96605..f1d0df412fdd49b300db4ba88bc0b1674cf0cdf8 100644
>> --- a/include/dt-bindings/clock/google,gs101.h
>> +++ b/include/dt-bindings/clock/google,gs101.h
>> @@ -634,4 +634,19 @@
>> #define CLK_GOUT_PERIC1_CLK_PERIC1_USI9_USI_CLK 45
>> #define CLK_GOUT_PERIC1_SYSREG_PERIC1_PCLK 46
>
> I missed it last time - this is a header for SoC clock controller
> bindings. ACPM firmware is completely different device, so should go to
> its own binding header.
right. Will do, thanks!
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-08-31 10:50 ` Krzysztof Kozlowski
@ 2025-09-01 6:56 ` Tudor Ambarus
2025-09-01 7:48 ` Krzysztof Kozlowski
0 siblings, 1 reply; 17+ messages in thread
From: Tudor Ambarus @ 2025-09-01 6:56 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Peter Griffin, André Draszik,
Michael Turquette, Stephen Boyd, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 8/31/25 11:50 AM, Krzysztof Kozlowski wrote:
> On 27/08/2025 14:42, Tudor Ambarus wrote:
>> +
>> +static const struct acpm_clk_variant gs101_acpm_clks[] = {
>> + ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
>> + ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
>> + ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
>> + ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
>> + ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
>> + ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
>> + ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
>> + ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
>> + ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
>> + ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
>> + ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
>> +};
>
> I don't understand why clocks are defined in the firmware driver, not in
> the clock driver.
I chose to define the clocks in the firmware driver and pass them as
platform data to the clock platform device for extensibility. In case
other SoCs have different clock IDs, they'll be able to pass the
clock data without needing to modify the clock driver. GS201 defines
the same ACPM clocks as GS101, but I don't have access to other newer
SoCs to tell if the ACPM clocks differ or not.
The alternative is to define the clocks in the clock driver and
use platform_device_register_simple() to register the clock platform
device. The clock driver will be rigid in what clocks it supports.
I'm fine either way for now. What do you prefer?
>
> This creates dependency of this patch on the clock patch, so basically
> there is no way I will take it in one cycle.
Would it work to have an immutable tag for the clock and samsung-soc
subsytems to use?
>
>> +
>> /**
>> * acpm_get_saved_rx() - get the response if it was already saved.
>> * @achan: ACPM channel info.
>> @@ -606,6 +636,7 @@ static void acpm_setup_ops(struct acpm_info *acpm)
>>
>> static int acpm_probe(struct platform_device *pdev)
>> {
>> + const struct acpm_clk_platform_data *acpm_clk_pdata;
>> const struct acpm_match_data *match_data;
>> struct device *dev = &pdev->dev;
>> struct device_node *shmem;
>> @@ -647,7 +678,30 @@ static int acpm_probe(struct platform_device *pdev)
>>
>> platform_set_drvdata(pdev, acpm);
>>
>> - return devm_of_platform_populate(dev);
>> + acpm_clk_pdata = match_data->acpm_clk_pdata;
>> + acpm->clk_pdev = platform_device_register_data(dev, "acpm-clocks",
>> + PLATFORM_DEVID_NONE,
>> + acpm_clk_pdata,
>> + sizeof(*acpm_clk_pdata));
>> + if (IS_ERR(acpm->clk_pdev))
>> + return dev_err_probe(dev, PTR_ERR(acpm->clk_pdev),
>> + "Failed to register ACPM clocks device.\n");
>> +
>> + ret = devm_of_platform_populate(dev);
>> + if (ret) {
>> + platform_device_unregister(acpm->clk_pdev);
>
> I think this should stick to devm-interfaces everywhere, not mix them,
> to have exactly expected cleanup sequence. Now your remove() first
> unregisters and then de-populates, which is different order than it was
> done in probe(). Use devm-action handler for device unregistering.
>
Right, I will take a look. Thanks!
ta
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver
2025-08-31 10:42 ` [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Krzysztof Kozlowski
@ 2025-09-01 7:06 ` Tudor Ambarus
0 siblings, 0 replies; 17+ messages in thread
From: Tudor Ambarus @ 2025-09-01 7:06 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Peter Griffin, André Draszik,
Michael Turquette, Stephen Boyd, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 8/31/25 11:42 AM, Krzysztof Kozlowski wrote:
> On 27/08/2025 14:42, Tudor Ambarus wrote:
>> The Alive CLock and Power Manager (ACPM) firmware exposes clocks that
>> are variable and index based. These clocks don't provide an entire range
>> of values between the limits but only discrete points within the range.
>> The firmware also manages the voltage scaling appropriately with the
>> clock scaling. Make the ACPM node a clock provider.
>>
>> Add support for the ACPM DVFS protocol. It translates clock frequency
>> requests to messages that can be interpreted by the ACPM firmware.
>> Add an ACPM clock driver to model the clocks exposed by the ACPM firmware.
>>
>> All patches can go through the samsung tree.
>
> You really should have explained the dependencies instead of me trying
> to decipher how to handle this patch. It's really not trivial.
My apologies, I forgot. If I tested individual patches, I would have
remind about the dependency. Something to automate for the next time ...
>
> You do understand that clock is completely different subsystem (Stephen
> Boyd)?
>
Yes, I do, sorry.
Cheers,
ta
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-09-01 6:56 ` Tudor Ambarus
@ 2025-09-01 7:48 ` Krzysztof Kozlowski
2025-09-01 8:43 ` Tudor Ambarus
0 siblings, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-09-01 7:48 UTC (permalink / raw)
To: Tudor Ambarus, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Peter Griffin, André Draszik, Michael Turquette,
Stephen Boyd, Alim Akhtar, Sylwester Nawrocki, Chanwoo Choi,
Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 01/09/2025 08:56, Tudor Ambarus wrote:
>
>
> On 8/31/25 11:50 AM, Krzysztof Kozlowski wrote:
>> On 27/08/2025 14:42, Tudor Ambarus wrote:
>>> +
>>> +static const struct acpm_clk_variant gs101_acpm_clks[] = {
>>> + ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
>>> + ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
>>> +};
>>
>> I don't understand why clocks are defined in the firmware driver, not in
>> the clock driver.
>
> I chose to define the clocks in the firmware driver and pass them as
> platform data to the clock platform device for extensibility. In case
> other SoCs have different clock IDs, they'll be able to pass the
You will have to modify firmware driver, so still at least one driver
has to be changed. Having clocks defined in non-clock driver is really
unusual.
This solution here creates also dependency on clock bindings and makes
merging everything unnecessary difficult.
> clock data without needing to modify the clock driver. GS201 defines
> the same ACPM clocks as GS101, but I don't have access to other newer
> SoCs to tell if the ACPM clocks differ or not.
>
> The alternative is to define the clocks in the clock driver and
> use platform_device_register_simple() to register the clock platform
> device. The clock driver will be rigid in what clocks it supports.
>
> I'm fine either way for now. What do you prefer?
Please move them to the driver.
>
>>
>> This creates dependency of this patch on the clock patch, so basically
>> there is no way I will take it in one cycle.
>
> Would it work to have an immutable tag for the clock and samsung-soc
> subsytems to use?
No, just try yourself. Patch #3 depends on patch #2, so that's the cross
tree merge. It's fine, but now patch #4 depends on patch #3, so you need
two merges.
Or how do you actually see it being merged with immutable tag? What goes
where?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-09-01 7:48 ` Krzysztof Kozlowski
@ 2025-09-01 8:43 ` Tudor Ambarus
2025-09-01 9:34 ` Krzysztof Kozlowski
0 siblings, 1 reply; 17+ messages in thread
From: Tudor Ambarus @ 2025-09-01 8:43 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Peter Griffin, André Draszik,
Michael Turquette, Stephen Boyd, Alim Akhtar, Sylwester Nawrocki,
Chanwoo Choi, Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 9/1/25 8:48 AM, Krzysztof Kozlowski wrote:
> On 01/09/2025 08:56, Tudor Ambarus wrote:
>>
>>
>> On 8/31/25 11:50 AM, Krzysztof Kozlowski wrote:
>>> On 27/08/2025 14:42, Tudor Ambarus wrote:
>>>> +
>>>> +static const struct acpm_clk_variant gs101_acpm_clks[] = {
>>>> + ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
>>>> + ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
>>>> +};
>>>
>>> I don't understand why clocks are defined in the firmware driver, not in
>>> the clock driver.
>>
>> I chose to define the clocks in the firmware driver and pass them as
>> platform data to the clock platform device for extensibility. In case
>> other SoCs have different clock IDs, they'll be able to pass the
>
> You will have to modify firmware driver, so still at least one driver
> has to be changed. Having clocks defined in non-clock driver is really
> unusual.
>
> This solution here creates also dependency on clock bindings and makes
> merging everything unnecessary difficult.
>
>> clock data without needing to modify the clock driver. GS201 defines
>> the same ACPM clocks as GS101, but I don't have access to other newer
>> SoCs to tell if the ACPM clocks differ or not.
>>
>> The alternative is to define the clocks in the clock driver and
>> use platform_device_register_simple() to register the clock platform
>> device. The clock driver will be rigid in what clocks it supports.
>>
>> I'm fine either way for now. What do you prefer?
>
> Please move them to the driver.
Okay, will move the clock definitions to the clock driver.
>
>>
>>>
>>> This creates dependency of this patch on the clock patch, so basically
>>> there is no way I will take it in one cycle.
>>
>> Would it work to have an immutable tag for the clock and samsung-soc
>> subsytems to use?
>
> No, just try yourself. Patch #3 depends on patch #2, so that's the cross
> tree merge. It's fine, but now patch #4 depends on patch #3, so you need
> two merges.
>
> Or how do you actually see it being merged with immutable tag? What goes
> where?
>
Unnecessary difficult indeed. Hypothetically, if we kept the current
structure, we could have have a single tag on #4. Since the dependency was
on a new clock driver, the clock subsystem could have lived without merging
the tag, as the chances of conflicts with the clk core are small. But not
ideal. Lesson learnt, always put yourself in the maintainer's shoes.
Thanks for the patience!
Cheers,
ta
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev
2025-09-01 8:43 ` Tudor Ambarus
@ 2025-09-01 9:34 ` Krzysztof Kozlowski
0 siblings, 0 replies; 17+ messages in thread
From: Krzysztof Kozlowski @ 2025-09-01 9:34 UTC (permalink / raw)
To: Tudor Ambarus, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Peter Griffin, André Draszik, Michael Turquette,
Stephen Boyd, Alim Akhtar, Sylwester Nawrocki, Chanwoo Choi,
Catalin Marinas, Will Deacon
Cc: linux-kernel, linux-samsung-soc, devicetree, linux-arm-kernel,
linux-clk, willmcvicker, kernel-team
On 01/09/2025 10:43, Tudor Ambarus wrote:
>
>
> On 9/1/25 8:48 AM, Krzysztof Kozlowski wrote:
>> On 01/09/2025 08:56, Tudor Ambarus wrote:
>>>
>>>
>>> On 8/31/25 11:50 AM, Krzysztof Kozlowski wrote:
>>>> On 27/08/2025 14:42, Tudor Ambarus wrote:
>>>>> +
>>>>> +static const struct acpm_clk_variant gs101_acpm_clks[] = {
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_MIF, "mif"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_INT, "int"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL0, "cpucl0"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL1, "cpucl1"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_CPUCL2, "cpucl2"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_G3D, "g3d"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_G3DL2, "g3dl2"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_TPU, "tpu"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_INTCAM, "intcam"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_TNR, "tnr"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_CAM, "cam"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_MFC, "mfc"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_DISP, "disp"),
>>>>> + ACPM_CLK(CLK_ACPM_DVFS_BO, "b0"),
>>>>> +};
>>>>
>>>> I don't understand why clocks are defined in the firmware driver, not in
>>>> the clock driver.
>>>
>>> I chose to define the clocks in the firmware driver and pass them as
>>> platform data to the clock platform device for extensibility. In case
>>> other SoCs have different clock IDs, they'll be able to pass the
>>
>> You will have to modify firmware driver, so still at least one driver
>> has to be changed. Having clocks defined in non-clock driver is really
>> unusual.
>>
>> This solution here creates also dependency on clock bindings and makes
>> merging everything unnecessary difficult.
>>
>>> clock data without needing to modify the clock driver. GS201 defines
>>> the same ACPM clocks as GS101, but I don't have access to other newer
>>> SoCs to tell if the ACPM clocks differ or not.
>>>
>>> The alternative is to define the clocks in the clock driver and
>>> use platform_device_register_simple() to register the clock platform
>>> device. The clock driver will be rigid in what clocks it supports.
>>>
>>> I'm fine either way for now. What do you prefer?
>>
>> Please move them to the driver.
>
> Okay, will move the clock definitions to the clock driver.
>
>>
>>>
>>>>
>>>> This creates dependency of this patch on the clock patch, so basically
>>>> there is no way I will take it in one cycle.
>>>
>>> Would it work to have an immutable tag for the clock and samsung-soc
>>> subsytems to use?
>>
>> No, just try yourself. Patch #3 depends on patch #2, so that's the cross
>> tree merge. It's fine, but now patch #4 depends on patch #3, so you need
>> two merges.
>>
>> Or how do you actually see it being merged with immutable tag? What goes
>> where?
>>
>
> Unnecessary difficult indeed. Hypothetically, if we kept the current
No, it is impossible.
> structure, we could have have a single tag on #4. Since the dependency was
What does it mean tag on #4? There are no further users, so tagging this
patch has zero effect.
> on a new clock driver, the clock subsystem could have lived without merging
> the tag, as the chances of conflicts with the clk core are small. But not
Quick look tells me nothing would compile. Really, try yourself. Neither
patch #3 nor patch #4 builds!
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-09-01 10:40 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-27 12:42 [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 1/5] dt-bindings: firmware: google,gs101-acpm-ipc: add #clock-cells Tudor Ambarus
2025-08-29 16:51 ` Rob Herring (Arm)
2025-08-31 10:40 ` Krzysztof Kozlowski
2025-09-01 6:25 ` Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 2/5] firmware: exynos-acpm: add DVFS protocol Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 3/5] clk: samsung: add Exynos ACPM clock driver Tudor Ambarus
2025-08-28 5:35 ` Tudor Ambarus
2025-08-27 12:42 ` [PATCH v2 4/5] firmware: exynos-acpm: register ACPM clocks dev Tudor Ambarus
2025-08-31 10:50 ` Krzysztof Kozlowski
2025-09-01 6:56 ` Tudor Ambarus
2025-09-01 7:48 ` Krzysztof Kozlowski
2025-09-01 8:43 ` Tudor Ambarus
2025-09-01 9:34 ` Krzysztof Kozlowski
2025-08-27 12:42 ` [PATCH v2 5/5] arm64: defconfig: enable Exynos ACPM clocks Tudor Ambarus
2025-08-31 10:42 ` [PATCH v2 0/5] exynos-acpm: add DVFS protocol and clock driver Krzysztof Kozlowski
2025-09-01 7:06 ` Tudor Ambarus
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).