* [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support
@ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay
0 siblings, 0 replies; 9+ messages in thread
From: Sarath Ganapathiraju @ 2026-07-23 11:10 UTC (permalink / raw)
To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney,
Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela,
Takashi Iwai
Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound,
prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju
The LPASS VA CSR block contains rate generator hardware that produces
a HeartBeat Pulse (also known as RateGen Pulse). This pulse
synchronizes the start of the DMAs and Codec Interfaces for the audio
usecases and can serve as a periodic wakeup source for the DSP.
This series adds the DT binding and driver support to model this
rate generator as a clock provider.
Patch 1 adds the YAML binding for the new qcom,hawi-lpass-va-csr
clock provider node under Documentation/devicetree/bindings/clock/.
Patch 2 adds the lpass-va-csr driver under drivers/clk/qcom that
registers the lpass_heartbeat_pulse clock and enables/disables the
rate generator via regmap when the clock consumer requests it.
Changes in v3:
- Moved the qcom,lpass-va-csr binding from
Documentation/devicetree/bindings/sound/ to
Documentation/devicetree/bindings/clock/ since it is a pure clock
provider with no ASoC dependency (Krzysztof).
- Moved the driver from sound/soc/codecs/ to drivers/clk/qcom/ for
the same reason; sound/soc/codecs/Kconfig now selects
QCOM_CLK_LPASS_VA_CSR instead of carrying the driver (Krzysztof).
- Rewrote the binding description to explain the hardware instead of
duplicating schema text (Krzysztof).
- Dropped redundant reg and "#clock-cells" descriptions from the
binding (Krzysztof).
- Switched from unevaluatedProperties to additionalProperties: false
in the binding (Krzysztof).
- Renamed the example node to the generic clock-controller@7ee0000
(Krzysztof).
- Dropped the qcom,lpass-va-macro binding extension patch — no
in-tree user yet; will be resubmitted with the hawi DTSI changes.
- Link to v2: https://lore.kernel.org/linux-arm-msm/20260717-master-v2-0-ae200627ad62@oss.qualcomm.com/
---
To: Bjorn Andersson <andersson@kernel.org>
To: Michael Turquette <mturquette@baylibre.com>
To: Stephen Boyd <sboyd@kernel.org>
To: Brian Masney <bmasney@redhat.com>
To: Rob Herring <robh@kernel.org>
To: Krzysztof Kozlowski <krzk+dt@kernel.org>
To: Conor Dooley <conor+dt@kernel.org>
To: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com>
To: Liam Girdwood <lgirdwood@gmail.com>
To: Mark Brown <broonie@kernel.org>
To: Jaroslav Kysela <perex@perex.cz>
To: Takashi Iwai <tiwai@suse.com>
Cc: linux-arm-msm@vger.kernel.org
Cc: linux-clk@vger.kernel.org
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-sound@vger.kernel.org
Cc: prasad.kumpatla@oss.qualcomm.com
Cc: konrad.dybcio@oss.qualcomm.com
---
Sarath Ganapathiraju (2):
dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock
clk: qcom: Add LPASS VA CSR heartbeat pulse clock
.../bindings/clock/qcom,lpass-va-csr.yaml | 49 +++++++
drivers/clk/qcom/Kconfig | 12 ++
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/lpass-va-csr.c | 143 +++++++++++++++++++++
sound/soc/codecs/Kconfig | 1 +
5 files changed, 206 insertions(+)
---
base-commit: a6092686b891422f5ba0106b5e0962aecd480b05
change-id: 20260722-master-5651ff5cd8f9
Best regards,
--
Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support @ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 0 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju via B4 Relay @ 2026-07-23 11:10 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju The LPASS VA CSR block contains rate generator hardware that produces a HeartBeat Pulse (also known as RateGen Pulse). This pulse synchronizes the start of the DMAs and Codec Interfaces for the audio usecases and can serve as a periodic wakeup source for the DSP. This series adds the DT binding and driver support to model this rate generator as a clock provider. Patch 1 adds the YAML binding for the new qcom,hawi-lpass-va-csr clock provider node under Documentation/devicetree/bindings/clock/. Patch 2 adds the lpass-va-csr driver under drivers/clk/qcom that registers the lpass_heartbeat_pulse clock and enables/disables the rate generator via regmap when the clock consumer requests it. Changes in v3: - Moved the qcom,lpass-va-csr binding from Documentation/devicetree/bindings/sound/ to Documentation/devicetree/bindings/clock/ since it is a pure clock provider with no ASoC dependency (Krzysztof). - Moved the driver from sound/soc/codecs/ to drivers/clk/qcom/ for the same reason; sound/soc/codecs/Kconfig now selects QCOM_CLK_LPASS_VA_CSR instead of carrying the driver (Krzysztof). - Rewrote the binding description to explain the hardware instead of duplicating schema text (Krzysztof). - Dropped redundant reg and "#clock-cells" descriptions from the binding (Krzysztof). - Switched from unevaluatedProperties to additionalProperties: false in the binding (Krzysztof). - Renamed the example node to the generic clock-controller@7ee0000 (Krzysztof). - Dropped the qcom,lpass-va-macro binding extension patch — no in-tree user yet; will be resubmitted with the hawi DTSI changes. - Link to v2: https://lore.kernel.org/linux-arm-msm/20260717-master-v2-0-ae200627ad62@oss.qualcomm.com/ --- To: Bjorn Andersson <andersson@kernel.org> To: Michael Turquette <mturquette@baylibre.com> To: Stephen Boyd <sboyd@kernel.org> To: Brian Masney <bmasney@redhat.com> To: Rob Herring <robh@kernel.org> To: Krzysztof Kozlowski <krzk+dt@kernel.org> To: Conor Dooley <conor+dt@kernel.org> To: Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com> To: Liam Girdwood <lgirdwood@gmail.com> To: Mark Brown <broonie@kernel.org> To: Jaroslav Kysela <perex@perex.cz> To: Takashi Iwai <tiwai@suse.com> Cc: linux-arm-msm@vger.kernel.org Cc: linux-clk@vger.kernel.org Cc: devicetree@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: linux-sound@vger.kernel.org Cc: prasad.kumpatla@oss.qualcomm.com Cc: konrad.dybcio@oss.qualcomm.com --- Sarath Ganapathiraju (2): dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock clk: qcom: Add LPASS VA CSR heartbeat pulse clock .../bindings/clock/qcom,lpass-va-csr.yaml | 49 +++++++ drivers/clk/qcom/Kconfig | 12 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/lpass-va-csr.c | 143 +++++++++++++++++++++ sound/soc/codecs/Kconfig | 1 + 5 files changed, 206 insertions(+) --- base-commit: a6092686b891422f5ba0106b5e0962aecd480b05 change-id: 20260722-master-5651ff5cd8f9 Best regards, -- Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/2] dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay @ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay -1 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju @ 2026-07-23 11:10 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju Add a binding for the Qualcomm LPASS VA CSR rate generator node that exposes the lpass_heartbeat_pulse clock on hawi. The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the start of the DMAs and Codec Interfaces for the audio usecase and can serve as a periodic wakeup source for the DSP. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- .../bindings/clock/qcom,lpass-va-csr.yaml | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml b/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml new file mode 100644 index 000000000000..b4bc33a86640 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/qcom,lpass-va-csr.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm LPASS VA CSR heartbeat pulse clock provider + +maintainers: + - Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com> + - Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> + +description: + The LPASS (Low Power Audio Subsystem) VA CSR block contains a rate + generator that produces a periodic HeartBeat Pulse, also known as + the RateGen Pulse. This pulse synchronizes the start of DMAs and + Codec Interfaces for audio usecases and can serve as a periodic + wakeup source for the DSP. + +properties: + compatible: + enum: + - qcom,hawi-lpass-va-csr + + reg: + maxItems: 1 + + "#clock-cells": + const: 0 + +required: + - compatible + - reg + - "#clock-cells" + +additionalProperties: false + +examples: + - | + soc { + #address-cells = <2>; + #size-cells = <2>; + + clock-controller@7ee0000 { + compatible = "qcom,hawi-lpass-va-csr"; + reg = <0x0 0x07ee0000 0x0 0xe000>; + #clock-cells = <0>; + }; + }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 1/2] dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock @ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 0 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju via B4 Relay @ 2026-07-23 11:10 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju From: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> Add a binding for the Qualcomm LPASS VA CSR rate generator node that exposes the lpass_heartbeat_pulse clock on hawi. The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the start of the DMAs and Codec Interfaces for the audio usecase and can serve as a periodic wakeup source for the DSP. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- .../bindings/clock/qcom,lpass-va-csr.yaml | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml b/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml new file mode 100644 index 000000000000..b4bc33a86640 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/qcom,lpass-va-csr.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm LPASS VA CSR heartbeat pulse clock provider + +maintainers: + - Srinivas Kandagatla <srinivas.kandagatla@oss.qualcomm.com> + - Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> + +description: + The LPASS (Low Power Audio Subsystem) VA CSR block contains a rate + generator that produces a periodic HeartBeat Pulse, also known as + the RateGen Pulse. This pulse synchronizes the start of DMAs and + Codec Interfaces for audio usecases and can serve as a periodic + wakeup source for the DSP. + +properties: + compatible: + enum: + - qcom,hawi-lpass-va-csr + + reg: + maxItems: 1 + + "#clock-cells": + const: 0 + +required: + - compatible + - reg + - "#clock-cells" + +additionalProperties: false + +examples: + - | + soc { + #address-cells = <2>; + #size-cells = <2>; + + clock-controller@7ee0000 { + compatible = "qcom,hawi-lpass-va-csr"; + reg = <0x0 0x07ee0000 0x0 0xe000>; + #clock-cells = <0>; + }; + }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/2] dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay (?) @ 2026-07-24 6:28 ` Krzysztof Kozlowski -1 siblings, 0 replies; 9+ messages in thread From: Krzysztof Kozlowski @ 2026-07-24 6:28 UTC (permalink / raw) To: Sarath Ganapathiraju Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai, linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio On Thu, Jul 23, 2026 at 04:40:40PM +0530, Sarath Ganapathiraju wrote: > Add a binding for the Qualcomm LPASS VA CSR rate generator node that > exposes the lpass_heartbeat_pulse clock on hawi. > > The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the > start of the DMAs and Codec Interfaces for the audio usecase and can > serve as a periodic wakeup source for the DSP. > > Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> > --- > .../bindings/clock/qcom,lpass-va-csr.yaml | 49 ++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml b/Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml Use compatible as filename, so qcom,hawi-lpass-va-csr.yaml. With this fixed: Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com> Best regards, Krzysztof ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay @ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay -1 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju @ 2026-07-23 11:10 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the start of the DMAs and Codec Interfaces for the audio usecases and can serve as a periodic wakeup source for the DSP. Add the LPASS VA CSR driver that models the rate generator as a clock provider so it is enabled and disabled automatically alongside the other clocks during runtime PM resume and suspend. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 12 ++++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/lpass-va-csr.c | 143 ++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/Kconfig | 1 + 4 files changed, 157 insertions(+) diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 63f271aff177..6ebdccfe37e0 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -1998,6 +1998,18 @@ config CLK_GFM_LPASS_SM8250 Support for the Glitch Free Mux (GFM) Low power audio subsystem (LPASS) clocks found on SM8250 SoCs. +config QCOM_CLK_LPASS_VA_CSR + tristate "Qualcomm LPASS VA CSR heartbeat pulse clock provider" + depends on COMMON_CLK + select REGMAP_MMIO + help + Qualcomm LPASS VA CSR block contains the rate generator hardware + that produces the HeartBeat Pulse (also known as RateGen Pulse). + This driver models the rate generator as a clock provider so + that consumers can enable or disable it via the common clock + framework, and it can be used to synchronize the start of DMAs + and Codec Interfaces or as a periodic wakeup source for the DSP. + config SM_VIDEOCC_8450 tristate "SM8450 Video Clock Controller" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index db7689ee5dc6..2be7da737eba 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_CLK_ELIZA_DISPCC) += dispcc-eliza.o obj-$(CONFIG_CLK_ELIZA_GCC) += gcc-eliza.o obj-$(CONFIG_CLK_ELIZA_TCSRCC) += tcsrcc-eliza.o obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o +obj-$(CONFIG_QCOM_CLK_LPASS_VA_CSR) += lpass-va-csr.o obj-$(CONFIG_CLK_GLYMUR_CAMCC) += camcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_DISPCC) += dispcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_EVACC) += evacc-glymur.o diff --git a/drivers/clk/qcom/lpass-va-csr.c b/drivers/clk/qcom/lpass-va-csr.c new file mode 100644 index 000000000000..1d0805789e25 --- /dev/null +++ b/drivers/clk/qcom/lpass-va-csr.c @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/module.h> +#include <linux/of_clk.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#define LPASS_RATE_GEN_CTRL 0xd000 +#define LPASS_RATE_GEN_COUNTER_0 0xd004 +#define LPASS_RATE_GEN_DELAY 0xd010 + +#define LPASS_RATE_GEN_MAX_REG LPASS_RATE_GEN_DELAY + +#define LPASS_RG_CTRL_EN BIT(0) + +struct lpass_va_csr_data { + u32 counter_0; + u32 delay; +}; + +static const struct lpass_va_csr_data hawi_csr_data = { + .counter_0 = 0x960, + .delay = 0x16, +}; + +static const struct regmap_config lpass_rate_gen_regmap_config = { + .name = "lpass_rate_gen", + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .max_register = LPASS_RATE_GEN_MAX_REG, + .cache_type = REGCACHE_MAPLE, +}; + +struct lpass_va_csr { + struct regmap *regmap; + const struct lpass_va_csr_data *data; + struct clk_hw hb_hw; +}; + +#define to_lpass_va_csr(_hw) container_of(_hw, struct lpass_va_csr, hb_hw) + +static int heartbeat_pulse_prepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + int ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_COUNTER_0, csr->data->counter_0); + if (ret) + return ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_DELAY, csr->data->delay); + if (ret) + return ret; + + return regmap_set_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static void heartbeat_pulse_unprepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + regmap_clear_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static int heartbeat_pulse_is_prepared(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + return regmap_test_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static const struct clk_ops heartbeat_pulse_ops = { + .prepare = heartbeat_pulse_prepare, + .unprepare = heartbeat_pulse_unprepare, + .is_prepared = heartbeat_pulse_is_prepared, +}; + +static int lpass_va_csr_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct lpass_va_csr *csr; + struct clk_init_data init = { + .name = "lpass_heartbeat_pulse", + .ops = &heartbeat_pulse_ops, + }; + void __iomem *base; + int ret; + + csr = devm_kzalloc(dev, sizeof(*csr), GFP_KERNEL); + if (!csr) + return -ENOMEM; + + csr->data = of_device_get_match_data(dev); + if (!csr->data) + return dev_err_probe(dev, -EINVAL, "no variant data for compatible\n"); + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + csr->regmap = devm_regmap_init_mmio(dev, base, + &lpass_rate_gen_regmap_config); + if (IS_ERR(csr->regmap)) + return dev_err_probe(dev, PTR_ERR(csr->regmap), + "failed to init regmap\n"); + + csr->hb_hw.init = &init; + + ret = devm_clk_hw_register(dev, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to register heartbeat clock\n"); + + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to add clock provider\n"); + + return 0; +} + +static const struct of_device_id lpass_va_csr_dt_match[] = { + { .compatible = "qcom,hawi-lpass-va-csr", .data = &hawi_csr_data }, + {} +}; +MODULE_DEVICE_TABLE(of, lpass_va_csr_dt_match); + +static struct platform_driver lpass_va_csr_driver = { + .driver = { + .name = "qcom-lpass-va-csr", + .of_match_table = lpass_va_csr_dt_match, + }, + .probe = lpass_va_csr_probe, +}; + +module_platform_driver(lpass_va_csr_driver); + +MODULE_DESCRIPTION("Qualcomm LPASS VA CSR heartbeat pulse clock provider"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 76e90144ea91..704401faa147 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2907,6 +2907,7 @@ config SND_SOC_LPASS_VA_MACRO depends on PM_CLK select REGMAP_MMIO select SND_SOC_LPASS_MACRO_COMMON + select QCOM_CLK_LPASS_VA_CSR tristate "Qualcomm VA Macro in LPASS(Low Power Audio SubSystem)" config SND_SOC_LPASS_RX_MACRO -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock @ 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 0 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju via B4 Relay @ 2026-07-23 11:10 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd, Brian Masney, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Srinivas Kandagatla, Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound, prasad.kumpatla, konrad.dybcio, Sarath Ganapathiraju From: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the start of the DMAs and Codec Interfaces for the audio usecases and can serve as a periodic wakeup source for the DSP. Add the LPASS VA CSR driver that models the rate generator as a clock provider so it is enabled and disabled automatically alongside the other clocks during runtime PM resume and suspend. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 12 ++++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/lpass-va-csr.c | 143 ++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/Kconfig | 1 + 4 files changed, 157 insertions(+) diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 63f271aff177..6ebdccfe37e0 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -1998,6 +1998,18 @@ config CLK_GFM_LPASS_SM8250 Support for the Glitch Free Mux (GFM) Low power audio subsystem (LPASS) clocks found on SM8250 SoCs. +config QCOM_CLK_LPASS_VA_CSR + tristate "Qualcomm LPASS VA CSR heartbeat pulse clock provider" + depends on COMMON_CLK + select REGMAP_MMIO + help + Qualcomm LPASS VA CSR block contains the rate generator hardware + that produces the HeartBeat Pulse (also known as RateGen Pulse). + This driver models the rate generator as a clock provider so + that consumers can enable or disable it via the common clock + framework, and it can be used to synchronize the start of DMAs + and Codec Interfaces or as a periodic wakeup source for the DSP. + config SM_VIDEOCC_8450 tristate "SM8450 Video Clock Controller" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index db7689ee5dc6..2be7da737eba 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_CLK_ELIZA_DISPCC) += dispcc-eliza.o obj-$(CONFIG_CLK_ELIZA_GCC) += gcc-eliza.o obj-$(CONFIG_CLK_ELIZA_TCSRCC) += tcsrcc-eliza.o obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o +obj-$(CONFIG_QCOM_CLK_LPASS_VA_CSR) += lpass-va-csr.o obj-$(CONFIG_CLK_GLYMUR_CAMCC) += camcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_DISPCC) += dispcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_EVACC) += evacc-glymur.o diff --git a/drivers/clk/qcom/lpass-va-csr.c b/drivers/clk/qcom/lpass-va-csr.c new file mode 100644 index 000000000000..1d0805789e25 --- /dev/null +++ b/drivers/clk/qcom/lpass-va-csr.c @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/module.h> +#include <linux/of_clk.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#define LPASS_RATE_GEN_CTRL 0xd000 +#define LPASS_RATE_GEN_COUNTER_0 0xd004 +#define LPASS_RATE_GEN_DELAY 0xd010 + +#define LPASS_RATE_GEN_MAX_REG LPASS_RATE_GEN_DELAY + +#define LPASS_RG_CTRL_EN BIT(0) + +struct lpass_va_csr_data { + u32 counter_0; + u32 delay; +}; + +static const struct lpass_va_csr_data hawi_csr_data = { + .counter_0 = 0x960, + .delay = 0x16, +}; + +static const struct regmap_config lpass_rate_gen_regmap_config = { + .name = "lpass_rate_gen", + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .max_register = LPASS_RATE_GEN_MAX_REG, + .cache_type = REGCACHE_MAPLE, +}; + +struct lpass_va_csr { + struct regmap *regmap; + const struct lpass_va_csr_data *data; + struct clk_hw hb_hw; +}; + +#define to_lpass_va_csr(_hw) container_of(_hw, struct lpass_va_csr, hb_hw) + +static int heartbeat_pulse_prepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + int ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_COUNTER_0, csr->data->counter_0); + if (ret) + return ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_DELAY, csr->data->delay); + if (ret) + return ret; + + return regmap_set_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static void heartbeat_pulse_unprepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + regmap_clear_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static int heartbeat_pulse_is_prepared(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + return regmap_test_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static const struct clk_ops heartbeat_pulse_ops = { + .prepare = heartbeat_pulse_prepare, + .unprepare = heartbeat_pulse_unprepare, + .is_prepared = heartbeat_pulse_is_prepared, +}; + +static int lpass_va_csr_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct lpass_va_csr *csr; + struct clk_init_data init = { + .name = "lpass_heartbeat_pulse", + .ops = &heartbeat_pulse_ops, + }; + void __iomem *base; + int ret; + + csr = devm_kzalloc(dev, sizeof(*csr), GFP_KERNEL); + if (!csr) + return -ENOMEM; + + csr->data = of_device_get_match_data(dev); + if (!csr->data) + return dev_err_probe(dev, -EINVAL, "no variant data for compatible\n"); + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + csr->regmap = devm_regmap_init_mmio(dev, base, + &lpass_rate_gen_regmap_config); + if (IS_ERR(csr->regmap)) + return dev_err_probe(dev, PTR_ERR(csr->regmap), + "failed to init regmap\n"); + + csr->hb_hw.init = &init; + + ret = devm_clk_hw_register(dev, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to register heartbeat clock\n"); + + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to add clock provider\n"); + + return 0; +} + +static const struct of_device_id lpass_va_csr_dt_match[] = { + { .compatible = "qcom,hawi-lpass-va-csr", .data = &hawi_csr_data }, + {} +}; +MODULE_DEVICE_TABLE(of, lpass_va_csr_dt_match); + +static struct platform_driver lpass_va_csr_driver = { + .driver = { + .name = "qcom-lpass-va-csr", + .of_match_table = lpass_va_csr_dt_match, + }, + .probe = lpass_va_csr_probe, +}; + +module_platform_driver(lpass_va_csr_driver); + +MODULE_DESCRIPTION("Qualcomm LPASS VA CSR heartbeat pulse clock provider"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 76e90144ea91..704401faa147 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2907,6 +2907,7 @@ config SND_SOC_LPASS_VA_MACRO depends on PM_CLK select REGMAP_MMIO select SND_SOC_LPASS_MACRO_COMMON + select QCOM_CLK_LPASS_VA_CSR tristate "Qualcomm VA Macro in LPASS(Low Power Audio SubSystem)" config SND_SOC_LPASS_RX_MACRO -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay (?) @ 2026-07-23 11:29 ` sashiko-bot -1 siblings, 0 replies; 9+ messages in thread From: sashiko-bot @ 2026-07-23 11:29 UTC (permalink / raw) To: Sarath Ganapathiraju; +Cc: robh, conor+dt, devicetree Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: - [High] Missing PM runtime enablement in lpass-va-csr causes a synchronous external abort when CCF reads the hardware state. -- --- Patch [2]: [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock --- commit f6c6796cc5343493b52dddf79a9e09e549136b51 Author: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> clk: qcom: Add LPASS VA CSR heartbeat pulse clock Adds the LPASS VA CSR driver to model the rate generator as a clock provider. This synchronizes the start of DMAs and Codec Interfaces and can serve as a periodic wakeup source for the DSP. > diff --git a/drivers/clk/qcom/lpass-va-csr.c b/drivers/clk/qcom/lpass-va-csr.c > new file mode 100644 > index 0000000000000..1d0805789e25a > --- /dev/null > +++ b/drivers/clk/qcom/lpass-va-csr.c [ ... ] > +static int heartbeat_pulse_is_prepared(struct clk_hw *hw) > +{ > + struct lpass_va_csr *csr = to_lpass_va_csr(hw); > + > + return regmap_test_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); [Severity: High] Could this MMIO read cause a synchronous external abort? When CCF calls the .is_prepared callback (e.g., during late boot via clk_disable_unused() or a debugfs read from clk_summary), this executes an unprotected MMIO read. If the LPASS hardware is power-gated at this time, the unpowered access can crash the system. > +} [ ... ] > +static int lpass_va_csr_probe(struct platform_device *pdev) > +{ [ ... ] > + csr->hb_hw.init = &init; > + > + ret = devm_clk_hw_register(dev, &csr->hb_hw); [Severity: High] Is a call to devm_pm_runtime_enable() missing before clock registration? Without PM runtime enabled on the device beforehand, CCF's clk_pm_runtime_get() sees core->rpm_enabled as false and skips acquiring the power domain. This leaves the hardware unpowered and vulnerable to crashes during the .is_prepared checks. > + if (ret) > + return dev_err_probe(dev, ret, "failed to register heartbeat clock\n"); > + > + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &csr->hb_hw); > + if (ret) > + return dev_err_probe(dev, ret, "failed to add clock provider\n"); > + > + return 0; > +} -- Sashiko AI review · https://sashiko.dev/#/patchset/20260723-master-v3-0-3d67b79b0515@oss.qualcomm.com?part=2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support @ 2026-07-23 11:02 Sarath Ganapathiraju 2026-07-23 11:02 ` [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock Sarath Ganapathiraju 0 siblings, 1 reply; 9+ messages in thread From: Sarath Ganapathiraju @ 2026-07-23 11:02 UTC (permalink / raw) To: andersson, mturquette, sboyd, bmasney, robh, krzk+dt, conor+dt, lgirdwood, broonie, perex, tiwai, srinivas.kandagatla Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound The LPASS VA CSR block contains rate generator hardware that produces a HeartBeat Pulse (also known as RateGen Pulse). This pulse synchronizes the start of the DMAs and Codec Interfaces for the audio usecases and can serve as a periodic wakeup source for the DSP. This series adds the DT binding and driver support to model this rate generator as a clock provider. Patch 1 adds the YAML binding for the new qcom,hawi-lpass-va-csr clock provider node under Documentation/devicetree/bindings/clock/. Patch 2 adds the lpass-va-csr driver under drivers/clk/qcom that registers the lpass_heartbeat_pulse clock and enables/disables the rate generator via regmap when the clock consumer requests it. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- Changes in v3: - Moved the qcom,lpass-va-csr binding from Documentation/devicetree/bindings/sound/ to Documentation/devicetree/bindings/clock/ since it is a pure clock provider with no ASoC dependency (Krzysztof). - Moved the driver from sound/soc/codecs/ to drivers/clk/qcom/ for the same reason; sound/soc/codecs/Kconfig now selects QCOM_CLK_LPASS_VA_CSR instead of carrying the driver (Krzysztof). - Rewrote the binding description to explain the hardware instead of duplicating schema text (Krzysztof). - Dropped redundant reg and "#clock-cells" descriptions from the binding (Krzysztof). - Switched from unevaluatedProperties to additionalProperties: false in the binding (Krzysztof). - Renamed the example node to the generic clock-controller@7ee0000 (Krzysztof). - Dropped the qcom,lpass-va-macro binding extension patch — no in-tree user yet; will be resubmitted with the hawi DTSI changes. - Link to v2: https://lore.kernel.org/linux-arm-msm/20260717-master-v2-0-ae200627ad62@oss.qualcomm.com/ Sarath Ganapathiraju (2): dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock clk: qcom: Add LPASS VA CSR heartbeat pulse clock .../bindings/clock/qcom,lpass-va-csr.yaml | 49 ++++++ drivers/clk/qcom/Kconfig | 12 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/lpass-va-csr.c | 143 ++++++++++++++++++ sound/soc/codecs/Kconfig | 1 + 5 files changed, 206 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,lpass-va-csr.yaml create mode 100644 drivers/clk/qcom/lpass-va-csr.c -- 2.34.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock 2026-07-23 11:02 [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support Sarath Ganapathiraju @ 2026-07-23 11:02 ` Sarath Ganapathiraju 0 siblings, 0 replies; 9+ messages in thread From: Sarath Ganapathiraju @ 2026-07-23 11:02 UTC (permalink / raw) To: andersson, mturquette, sboyd, bmasney, robh, krzk+dt, conor+dt, lgirdwood, broonie, perex, tiwai, srinivas.kandagatla Cc: linux-arm-msm, linux-clk, devicetree, linux-kernel, linux-sound The HeartBeat Pulse (also known as RateGen Pulse) synchronizes the start of the DMAs and Codec Interfaces for the audio usecases and can serve as a periodic wakeup source for the DSP. Add the LPASS VA CSR driver that models the rate generator as a clock provider so it is enabled and disabled automatically alongside the other clocks during runtime PM resume and suspend. Signed-off-by: Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 12 +++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/lpass-va-csr.c | 143 ++++++++++++++++++++++++++++++++ sound/soc/codecs/Kconfig | 1 + 4 files changed, 157 insertions(+) create mode 100644 drivers/clk/qcom/lpass-va-csr.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 63f271aff177..6ebdccfe37e0 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -1998,6 +1998,18 @@ config CLK_GFM_LPASS_SM8250 Support for the Glitch Free Mux (GFM) Low power audio subsystem (LPASS) clocks found on SM8250 SoCs. +config QCOM_CLK_LPASS_VA_CSR + tristate "Qualcomm LPASS VA CSR heartbeat pulse clock provider" + depends on COMMON_CLK + select REGMAP_MMIO + help + Qualcomm LPASS VA CSR block contains the rate generator hardware + that produces the HeartBeat Pulse (also known as RateGen Pulse). + This driver models the rate generator as a clock provider so + that consumers can enable or disable it via the common clock + framework, and it can be used to synchronize the start of DMAs + and Codec Interfaces or as a periodic wakeup source for the DSP. + config SM_VIDEOCC_8450 tristate "SM8450 Video Clock Controller" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index db7689ee5dc6..2be7da737eba 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -24,6 +24,7 @@ obj-$(CONFIG_CLK_ELIZA_DISPCC) += dispcc-eliza.o obj-$(CONFIG_CLK_ELIZA_GCC) += gcc-eliza.o obj-$(CONFIG_CLK_ELIZA_TCSRCC) += tcsrcc-eliza.o obj-$(CONFIG_CLK_GFM_LPASS_SM8250) += lpass-gfm-sm8250.o +obj-$(CONFIG_QCOM_CLK_LPASS_VA_CSR) += lpass-va-csr.o obj-$(CONFIG_CLK_GLYMUR_CAMCC) += camcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_DISPCC) += dispcc-glymur.o obj-$(CONFIG_CLK_GLYMUR_EVACC) += evacc-glymur.o diff --git a/drivers/clk/qcom/lpass-va-csr.c b/drivers/clk/qcom/lpass-va-csr.c new file mode 100644 index 000000000000..1d0805789e25 --- /dev/null +++ b/drivers/clk/qcom/lpass-va-csr.c @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/module.h> +#include <linux/of_clk.h> +#include <linux/platform_device.h> +#include <linux/regmap.h> + +#define LPASS_RATE_GEN_CTRL 0xd000 +#define LPASS_RATE_GEN_COUNTER_0 0xd004 +#define LPASS_RATE_GEN_DELAY 0xd010 + +#define LPASS_RATE_GEN_MAX_REG LPASS_RATE_GEN_DELAY + +#define LPASS_RG_CTRL_EN BIT(0) + +struct lpass_va_csr_data { + u32 counter_0; + u32 delay; +}; + +static const struct lpass_va_csr_data hawi_csr_data = { + .counter_0 = 0x960, + .delay = 0x16, +}; + +static const struct regmap_config lpass_rate_gen_regmap_config = { + .name = "lpass_rate_gen", + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, + .max_register = LPASS_RATE_GEN_MAX_REG, + .cache_type = REGCACHE_MAPLE, +}; + +struct lpass_va_csr { + struct regmap *regmap; + const struct lpass_va_csr_data *data; + struct clk_hw hb_hw; +}; + +#define to_lpass_va_csr(_hw) container_of(_hw, struct lpass_va_csr, hb_hw) + +static int heartbeat_pulse_prepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + int ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_COUNTER_0, csr->data->counter_0); + if (ret) + return ret; + + ret = regmap_write(csr->regmap, LPASS_RATE_GEN_DELAY, csr->data->delay); + if (ret) + return ret; + + return regmap_set_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static void heartbeat_pulse_unprepare(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + regmap_clear_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static int heartbeat_pulse_is_prepared(struct clk_hw *hw) +{ + struct lpass_va_csr *csr = to_lpass_va_csr(hw); + + return regmap_test_bits(csr->regmap, LPASS_RATE_GEN_CTRL, LPASS_RG_CTRL_EN); +} + +static const struct clk_ops heartbeat_pulse_ops = { + .prepare = heartbeat_pulse_prepare, + .unprepare = heartbeat_pulse_unprepare, + .is_prepared = heartbeat_pulse_is_prepared, +}; + +static int lpass_va_csr_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct lpass_va_csr *csr; + struct clk_init_data init = { + .name = "lpass_heartbeat_pulse", + .ops = &heartbeat_pulse_ops, + }; + void __iomem *base; + int ret; + + csr = devm_kzalloc(dev, sizeof(*csr), GFP_KERNEL); + if (!csr) + return -ENOMEM; + + csr->data = of_device_get_match_data(dev); + if (!csr->data) + return dev_err_probe(dev, -EINVAL, "no variant data for compatible\n"); + + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) + return PTR_ERR(base); + + csr->regmap = devm_regmap_init_mmio(dev, base, + &lpass_rate_gen_regmap_config); + if (IS_ERR(csr->regmap)) + return dev_err_probe(dev, PTR_ERR(csr->regmap), + "failed to init regmap\n"); + + csr->hb_hw.init = &init; + + ret = devm_clk_hw_register(dev, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to register heartbeat clock\n"); + + ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, &csr->hb_hw); + if (ret) + return dev_err_probe(dev, ret, "failed to add clock provider\n"); + + return 0; +} + +static const struct of_device_id lpass_va_csr_dt_match[] = { + { .compatible = "qcom,hawi-lpass-va-csr", .data = &hawi_csr_data }, + {} +}; +MODULE_DEVICE_TABLE(of, lpass_va_csr_dt_match); + +static struct platform_driver lpass_va_csr_driver = { + .driver = { + .name = "qcom-lpass-va-csr", + .of_match_table = lpass_va_csr_dt_match, + }, + .probe = lpass_va_csr_probe, +}; + +module_platform_driver(lpass_va_csr_driver); + +MODULE_DESCRIPTION("Qualcomm LPASS VA CSR heartbeat pulse clock provider"); +MODULE_LICENSE("GPL"); diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 76e90144ea91..704401faa147 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig @@ -2907,6 +2907,7 @@ config SND_SOC_LPASS_VA_MACRO depends on PM_CLK select REGMAP_MMIO select SND_SOC_LPASS_MACRO_COMMON + select QCOM_CLK_LPASS_VA_CSR tristate "Qualcomm VA Macro in LPASS(Low Power Audio SubSystem)" config SND_SOC_LPASS_RX_MACRO -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-24 6:28 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-07-23 11:10 [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support Sarath Ganapathiraju 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 2026-07-23 11:10 ` [PATCH v3 1/2] dt-bindings: clock: qcom: Add LPASS VA CSR HeartBeat pulse clock Sarath Ganapathiraju 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 2026-07-24 6:28 ` Krzysztof Kozlowski 2026-07-23 11:10 ` [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat " Sarath Ganapathiraju 2026-07-23 11:10 ` Sarath Ganapathiraju via B4 Relay 2026-07-23 11:29 ` sashiko-bot -- strict thread matches above, loose matches on Subject: below -- 2026-07-23 11:02 [PATCH v3 0/2] Add LPASS VA CSR HeartBeat pulse clock support Sarath Ganapathiraju 2026-07-23 11:02 ` [PATCH v3 2/2] clk: qcom: Add LPASS VA CSR heartbeat pulse clock Sarath Ganapathiraju
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.