From: Harendra Gautam <harendra.gautam@oss.qualcomm.com>
To: Srinivas Kandagatla <srini@kernel.org>
Cc: Mark Brown <broonie@kernel.org>,
Liam Girdwood <lgirdwood@gmail.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Prasad Kumpatla <prasad.kumpatla@oss.qualcomm.com>,
Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>,
Sarath Ganapathiraju <sarath.ganapathiraju@oss.qualcomm.com>,
Kumar Anurag Singh <kumar.singh@oss.qualcomm.com>,
Mohammad Rafi Shaik <mohammad.rafi.shaik@oss.qualcomm.com>
Subject: [PATCH v4 08/10] ASoC: qcom: Add QAIF IRQ handling, suspend/resume and platform register
Date: Thu, 3 Sep 2026 12:58:59 +0530 [thread overview]
Message-ID: <20260903072902.3870009-9-harendra.gautam@oss.qualcomm.com> (raw)
In-Reply-To: <20260903072902.3870009-1-harendra.gautam@oss.qualcomm.com>
Finish the QAIF PCM platform support so streams can be registered, started,
stopped and serviced by DMA interrupts.
Register the ASoC component, request the QAIF interrupt and add trigger
handling to enable or disable DMA and its interrupt sources. Dispatch the
top-level IRQ status to the AIF and CIF DMA handlers, report period elapsed
events to ALSA, warn on xrun conditions and stop the stream on bus errors.
Signed-off-by: Harendra Gautam <harendra.gautam@oss.qualcomm.com>
---
sound/soc/qcom/qaif-platform.c | 392 +++++++++++++++++++++++++++++++++
1 file changed, 392 insertions(+)
diff --git a/sound/soc/qcom/qaif-platform.c b/sound/soc/qcom/qaif-platform.c
index 5b5308d824e2..8890d2373354 100644
--- a/sound/soc/qcom/qaif-platform.c
+++ b/sound/soc/qcom/qaif-platform.c
@@ -534,3 +534,395 @@ static int qaif_platform_copy(struct snd_soc_component *component,
return (copied != bytes) ? -EFAULT : 0;
}
+
+static int qaif_platform_irq_op(struct qaif_drv_data *drvdata, int dir,
+ enum qaif_irq_type irq_type, int idx,
+ enum qaif_irq_op op)
+{
+ const struct qaif_variant *v = drvdata->variant;
+ struct regmap *map = drvdata->audio_qaif_map;
+ unsigned int bit = BIT(idx);
+ unsigned int val = op == QAIF_IRQ_ENABLE ? bit : 0;
+ u32 per_reg, err_reg, xrun_reg;
+ int ret;
+
+ if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
+ per_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_RDDMA_PERIOD_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_RDDMA_PERIOD_IRQ_EN_REG(v, irq_type);
+ xrun_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_RDDMA_UF_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_RDDMA_UF_IRQ_EN_REG(v, irq_type);
+ err_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_RDDMA_ERR_RSP_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_RDDMA_ERR_RSP_IRQ_EN_REG(v, irq_type);
+ } else {
+ per_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_WRDMA_PERIOD_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_WRDMA_PERIOD_IRQ_EN_REG(v, irq_type);
+ xrun_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_WRDMA_OF_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_WRDMA_OF_IRQ_EN_REG(v, irq_type);
+ err_reg = op == QAIF_IRQ_CLEAR ? QAIF_EE_WRDMA_ERR_RSP_IRQ_CLR_REG(v, irq_type)
+ : QAIF_EE_WRDMA_ERR_RSP_IRQ_EN_REG(v, irq_type);
+ }
+
+ if (op == QAIF_IRQ_CLEAR) {
+ ret = regmap_write(map, per_reg, bit);
+ if (ret)
+ return ret;
+ ret = regmap_write(map, xrun_reg, bit);
+ if (ret)
+ return ret;
+ return regmap_write(map, err_reg, bit);
+ }
+
+ ret = regmap_write_bits(map, per_reg, bit, val);
+ if (ret)
+ return ret;
+ ret = regmap_write_bits(map, xrun_reg, bit, val);
+ if (ret)
+ return ret;
+ return regmap_write_bits(map, err_reg, bit, val);
+}
+
+static int qaif_platform_pcmops_trigger(struct snd_soc_component *component,
+ struct snd_pcm_substream *substream,
+ int cmd)
+{
+ struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
+ struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
+ struct qaif_drv_data *drvdata = snd_soc_component_get_drvdata(component);
+ const struct qaif_variant *v = drvdata->variant;
+ struct qaif_pcm_data *data = substream->runtime->private_data;
+ unsigned int dai_id = cpu_dai->driver->id;
+ enum qaif_irq_type irq_type = qaif_is_cif_port(dai_id) ? QAIF_CIF_IRQ : QAIF_AIF_IRQ;
+ struct regmap *map = drvdata->audio_qaif_map;
+ int idx = data->dma_reg_idx;
+ int ret;
+
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+ case SNDRV_PCM_TRIGGER_RESUME:
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ ret = qaif_platform_irq_op(drvdata, substream->stream, irq_type,
+ idx, QAIF_IRQ_CLEAR);
+ if (ret) {
+ dev_err(soc_runtime->dev, "error clearing irq regs: %d\n", ret);
+ return ret;
+ }
+ ret = regmap_update_bits(map,
+ qaif_dmacfg_reg(v, idx, substream->stream, dai_id),
+ QAIF_DMACFG_DYNCLK_BIT, QAIF_DMACFG_DYNCLK_BIT);
+ if (ret) {
+ dev_err(soc_runtime->dev, "error enabling dma_dynclk: %d\n", ret);
+ return ret;
+ }
+ ret = regmap_update_bits(map,
+ qaif_dmactl_reg(v, idx, substream->stream, dai_id),
+ QAIF_DMACTL_ENABLE_BIT, QAIF_DMACTL_ENABLE_BIT);
+ if (ret) {
+ dev_err(soc_runtime->dev, "error enabling DMA: %d\n", ret);
+ return ret;
+ }
+ ret = qaif_platform_irq_op(drvdata, substream->stream, irq_type,
+ idx, QAIF_IRQ_ENABLE);
+ if (ret)
+ dev_err(soc_runtime->dev, "error enabling irq regs: %d\n", ret);
+ break;
+ case SNDRV_PCM_TRIGGER_STOP:
+ case SNDRV_PCM_TRIGGER_SUSPEND:
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ ret = regmap_update_bits(map,
+ qaif_dmactl_reg(v, idx, substream->stream, dai_id),
+ QAIF_DMACTL_ENABLE_BIT, 0);
+ if (ret) {
+ dev_err(soc_runtime->dev, "error disabling DMA: %d\n", ret);
+ return ret;
+ }
+ ret = regmap_update_bits(map,
+ qaif_dmacfg_reg(v, idx, substream->stream, dai_id),
+ QAIF_DMACFG_DYNCLK_BIT, 0);
+ if (ret)
+ dev_err(soc_runtime->dev, "error disabling dma_dynclk: %d\n", ret);
+ ret = qaif_platform_irq_op(drvdata, substream->stream, irq_type,
+ idx, QAIF_IRQ_DISABLE);
+ if (ret)
+ dev_err(soc_runtime->dev, "error disabling irq regs: %d\n", ret);
+ break;
+ default:
+ return -EINVAL;
+ }
+ return ret;
+}
+
+static int qaif_platform_pcmops_sync_stop(struct snd_soc_component *component,
+ struct snd_pcm_substream *substream)
+{
+ struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
+ struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
+ struct qaif_drv_data *drvdata = snd_soc_component_get_drvdata(component);
+ struct qaif_pcm_data *data = substream->runtime->private_data;
+ unsigned int dai_id = cpu_dai->driver->id;
+ enum qaif_irq_type irq_type = qaif_is_cif_port(dai_id) ? QAIF_CIF_IRQ : QAIF_AIF_IRQ;
+ int idx = data->dma_reg_idx;
+ int ret;
+
+ synchronize_irq(drvdata->audio_qaif_irq);
+ ret = qaif_platform_irq_op(drvdata, substream->stream, irq_type,
+ idx, QAIF_IRQ_CLEAR);
+ if (ret)
+ dev_err(soc_runtime->dev, "error clearing irq regs: %d\n", ret);
+ return ret;
+}
+
+static irqreturn_t qaif_process_dma_irq(struct qaif_drv_data *drvdata,
+ u32 stat_reg_addr,
+ u32 clr_reg_addr,
+ enum qaif_irq_type irq_type,
+ enum qaif_dma_dir dma_type,
+ enum qaif_irq irq,
+ struct snd_pcm_substream **substream)
+{
+ const struct qaif_variant *v = drvdata->variant;
+ unsigned int reg = 0;
+ int dma_idx, stream_dma_idx, rv, num_dma, stream_offset, array_size;
+ u32 mask;
+ struct snd_pcm_substream *ss;
+
+ stream_offset = (dma_type == QAIF_DMA_WRDMA) ?
+ ((irq_type == QAIF_AIF_IRQ) ? v->wrdma_start : v->codec_wrdma_start) : 0;
+ num_dma = (dma_type == QAIF_DMA_WRDMA) ?
+ ((irq_type == QAIF_AIF_IRQ) ? v->num_wrdma : v->num_codec_wrdma) :
+ ((irq_type == QAIF_AIF_IRQ) ? v->num_rddma : v->num_codec_rddma);
+ if (!num_dma)
+ return IRQ_NONE;
+
+ array_size = (irq_type == QAIF_AIF_IRQ) ?
+ QAIF_MAX_AIF_DMA_IDX : QAIF_MAX_CIF_DMA_IDX;
+ if (stream_offset + num_dma > array_size) {
+ dev_err(regmap_get_device(drvdata->audio_qaif_map),
+ "DMA index range %d+%d exceeds substream table %d\n",
+ stream_offset, num_dma, array_size);
+ return IRQ_NONE;
+ }
+ mask = GENMASK(num_dma - 1, 0);
+
+ rv = regmap_read(drvdata->audio_qaif_map, stat_reg_addr, ®);
+ if (rv) {
+ dev_err_ratelimited(regmap_get_device(drvdata->audio_qaif_map),
+ "error reading stat reg 0x%x: %d\n", stat_reg_addr, rv);
+ return IRQ_NONE;
+ }
+
+ if (!(reg & mask)) {
+ dev_warn_ratelimited(regmap_get_device(drvdata->audio_qaif_map),
+ "spurious IRQ: stat reg 0x%x status 0x%x mask 0x%x\n",
+ stat_reg_addr, reg, mask);
+ return IRQ_NONE;
+ }
+
+ if (regmap_write(drvdata->audio_qaif_map, clr_reg_addr, reg & mask))
+ return IRQ_NONE;
+
+ for (dma_idx = 0; dma_idx < num_dma; dma_idx++) {
+ stream_dma_idx = dma_idx + stream_offset;
+ ss = READ_ONCE(substream[stream_dma_idx]);
+ if (!(reg & BIT(dma_idx)) || !ss)
+ continue;
+ switch (irq) {
+ case QAIF_IRQ_PERIOD:
+ snd_pcm_period_elapsed(ss);
+ break;
+ case QAIF_IRQ_OVERFLOW:
+ case QAIF_IRQ_UNDERFLOW:
+ dev_warn_ratelimited(regmap_get_device(drvdata->audio_qaif_map),
+ "QAIF DMA xRun\n");
+ snd_pcm_stop_xrun(ss);
+ break;
+ case QAIF_IRQ_ERROR:
+ snd_pcm_stop_xrun(ss);
+ dev_err_ratelimited(regmap_get_device(drvdata->audio_qaif_map),
+ "QAIF bus error\n");
+ break;
+ }
+ }
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t qaif_aif_irq_handler(struct qaif_drv_data *drvdata, u32 status)
+{
+ const struct qaif_variant *v = drvdata->variant;
+ struct snd_pcm_substream **ss = drvdata->aif_substream;
+ irqreturn_t ret = IRQ_NONE;
+
+ if (status & QAIF_SUMMARY_BITMASK_AIF_PERIOD_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_PERIOD_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_RDDMA_PERIOD_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_PERIOD, ss);
+ if (status & QAIF_SUMMARY_BITMASK_AIF_PERIOD_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_PERIOD_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_WRDMA_PERIOD_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_PERIOD, ss);
+ if (status & QAIF_SUMMARY_BITMASK_AIF_OVERFLOW_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_OF_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_WRDMA_OF_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_OVERFLOW, ss);
+ if (status & QAIF_SUMMARY_BITMASK_AIF_UNDERFLOW_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_UF_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_RDDMA_UF_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_UNDERFLOW, ss);
+ if (status & QAIF_SUMMARY_BITMASK_AIF_ERR_RSP_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_ERR_RSP_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_RDDMA_ERR_RSP_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_ERROR, ss);
+ if (status & QAIF_SUMMARY_BITMASK_AIF_ERR_RSP_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_ERR_RSP_IRQ_STAT_REG(v, QAIF_AIF_IRQ),
+ QAIF_EE_WRDMA_ERR_RSP_IRQ_CLR_REG(v, QAIF_AIF_IRQ),
+ QAIF_AIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_ERROR, ss);
+ return ret;
+}
+
+static irqreturn_t qaif_cif_irq_handler(struct qaif_drv_data *drvdata, u32 status)
+{
+ const struct qaif_variant *v = drvdata->variant;
+ struct snd_pcm_substream **ss = drvdata->cif_substream;
+ irqreturn_t ret = IRQ_NONE;
+
+ if (status & QAIF_SUMMARY_BITMASK_CIF_PERIOD_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_PERIOD_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_RDDMA_PERIOD_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_PERIOD, ss);
+ if (status & QAIF_SUMMARY_BITMASK_CIF_PERIOD_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_PERIOD_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_WRDMA_PERIOD_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_PERIOD, ss);
+ if (status & QAIF_SUMMARY_BITMASK_CIF_OVERFLOW_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_OF_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_WRDMA_OF_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_OVERFLOW, ss);
+ if (status & QAIF_SUMMARY_BITMASK_CIF_UNDERFLOW_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_UF_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_RDDMA_UF_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_UNDERFLOW, ss);
+ if (status & QAIF_SUMMARY_BITMASK_CIF_ERR_RSP_RDDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_RDDMA_ERR_RSP_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_RDDMA_ERR_RSP_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_RDDMA, QAIF_IRQ_ERROR, ss);
+ if (status & QAIF_SUMMARY_BITMASK_CIF_ERR_RSP_WRDMA)
+ ret |= qaif_process_dma_irq(drvdata,
+ QAIF_EE_WRDMA_ERR_RSP_IRQ_STAT_REG(v, QAIF_CIF_IRQ),
+ QAIF_EE_WRDMA_ERR_RSP_IRQ_CLR_REG(v, QAIF_CIF_IRQ),
+ QAIF_CIF_IRQ, QAIF_DMA_WRDMA, QAIF_IRQ_ERROR, ss);
+ return ret;
+}
+
+static const struct qaif_irq_map qaif_irq_clients[] = {
+ { QAIF_CLIENT_ID_AIF_DMA, QAIF_BITMASK_AIF_RDDMA_WRDMA, qaif_aif_irq_handler },
+ { QAIF_CLIENT_ID_CIF_DMA, QAIF_BITMASK_CIF_RDDMA_WRDMA, qaif_cif_irq_handler },
+};
+
+static irqreturn_t asoc_platform_qaif_irq(int irq, void *data)
+{
+ struct qaif_drv_data *drvdata = data;
+ const struct qaif_variant *v = drvdata->variant;
+ u32 summary_irq_status;
+ int rv, client;
+ irqreturn_t ret = IRQ_NONE;
+
+ rv = regmap_read(drvdata->audio_qaif_map, QAIF_SUMMARY_IRQSTAT_REG(v),
+ &summary_irq_status);
+ if (rv) {
+ dev_err(regmap_get_device(drvdata->audio_qaif_map),
+ "error reading from irqstat reg: %d\n", rv);
+ return IRQ_NONE;
+ }
+
+ if (!(summary_irq_status & QAIF_ALL_CLIENTS_MASK))
+ return IRQ_NONE;
+
+ for (client = 0; client < ARRAY_SIZE(qaif_irq_clients); client++) {
+ if (summary_irq_status & qaif_irq_clients[client].mask)
+ ret |= qaif_irq_clients[client].client_irq_handler(drvdata,
+ summary_irq_status);
+ }
+ return ret;
+}
+
+static const struct snd_soc_component_driver qaif_component_driver = {
+ .name = DRV_NAME,
+ .open = qaif_platform_pcmops_open,
+ .close = qaif_platform_pcmops_close,
+ .hw_params = qaif_platform_pcmops_hw_params,
+ .hw_free = qaif_platform_pcmops_hw_free,
+ .prepare = qaif_platform_pcmops_prepare,
+ .trigger = qaif_platform_pcmops_trigger,
+ .sync_stop = qaif_platform_pcmops_sync_stop,
+ .pointer = qaif_platform_pcmops_pointer,
+ .mmap = qaif_platform_pcmops_mmap,
+ .copy = qaif_platform_copy,
+};
+
+int asoc_qcom_qaif_platform_register(struct platform_device *pdev)
+{
+ struct qaif_drv_data *drvdata = platform_get_drvdata(pdev);
+ struct of_phandle_args iommu_spec;
+ u32 sid;
+ int ret;
+
+ if (!drvdata->variant->alloc_stream_dma_idx ||
+ !drvdata->variant->free_stream_dma_idx)
+ return dev_err_probe(&pdev->dev, -EINVAL,
+ "Variant missing mandatory callbacks\n");
+
+ ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
+ "iommus", 2, 0,
+ &iommu_spec);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "failed to parse iommus property\n");
+ sid = iommu_spec.args[0];
+ of_node_put(iommu_spec.np);
+ drvdata->smmu_csid_bits = sid & QAIF_CSID_MASK;
+
+ /*
+ * The DMA base register only holds the low 32 bits of the buffer
+ * address, so the coherent buffer must come from the low 32-bit
+ * address space.
+ */
+ ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Failed to set 32-bit DMA mask\n");
+
+ drvdata->audio_qaif_irq = platform_get_irq(pdev, 0);
+ if (drvdata->audio_qaif_irq < 0)
+ return dev_err_probe(&pdev->dev, drvdata->audio_qaif_irq,
+ "Failed to get IRQ\n");
+
+ drvdata->qaif_hw_configured = false;
+ mutex_init(&drvdata->stream_lock);
+
+ ret = devm_request_irq(&pdev->dev, drvdata->audio_qaif_irq,
+ asoc_platform_qaif_irq, 0,
+ "qaif-irq-audio-core", drvdata);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "irq request failed\n");
+
+ ret = devm_snd_soc_register_component(&pdev->dev, &qaif_component_driver, NULL, 0);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "Failed to register platform component\n");
+ return 0;
+}
+EXPORT_SYMBOL_GPL(asoc_qcom_qaif_platform_register);
+
+MODULE_DESCRIPTION("Qualcomm Audio Interface (QAIF) PCM platform driver");
+MODULE_AUTHOR("Harendra Gautam <harendra.gautam@oss.qualcomm.com>");
+MODULE_LICENSE("GPL");
--
2.34.1
next prev parent reply other threads:[~2026-09-03 7:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 7:28 [PATCH v4 00/10] ASoC: qcom: Add QAIF driver for Shikra audio platform Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 01/10] ASoC: dt-bindings: qcom,shikra-qaif-cpu: Add binding Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 02/10] ASoC: qcom: Add QAIF shared data structures and variant interface Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 03/10] ASoC: qcom: Add QAIF hardware register map Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 04/10] ASoC: qcom: Add QAIF CPU DAI ops, regmap, DT parsing and platform init Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 05/10] ASoC: soc-core: Add snd_soc_of_xlate_dai_name() generic helper Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 06/10] ASoC: qcom: Switch lpass-cpu and qaif-cpu to snd_soc_of_xlate_dai_name() Harendra Gautam
2026-09-03 7:28 ` [PATCH v4 07/10] ASoC: qcom: Add QAIF PCM operations Harendra Gautam
2026-09-03 19:34 ` Mark Brown
2026-09-03 7:28 ` Harendra Gautam [this message]
2026-09-03 7:29 ` [PATCH v4 09/10] ASoC: qcom: Add Shikra QAIF support Harendra Gautam
2026-09-03 7:29 ` [PATCH v4] MAINTAINERS: Add Qualcomm QAIF driver entry Harendra Gautam
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260903072902.3870009-9-harendra.gautam@oss.qualcomm.com \
--to=harendra.gautam@oss.qualcomm.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=krzysztof.kozlowski@oss.qualcomm.com \
--cc=kumar.singh@oss.qualcomm.com \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=mohammad.rafi.shaik@oss.qualcomm.com \
--cc=perex@perex.cz \
--cc=prasad.kumpatla@oss.qualcomm.com \
--cc=robh@kernel.org \
--cc=sarath.ganapathiraju@oss.qualcomm.com \
--cc=srini@kernel.org \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox