未验证 提交 cc0deaa2 编写于 作者: V Vijendar Mukunda 提交者: Mark Brown

ASoC: amd: add acp6x irq handler

Add ACP6x irq handler for handling irq events for ACP IP.
Add pdm irq events handling.
Whenever audio data equal to the PDM watermark level are consumed,
interrupt is generated. Acknowledge the interrupt.
Signed-off-by: NVijendar Mukunda <Vijendar.Mukunda@amd.com>
Link: https://lore.kernel.org/r/20211018112044.1705805-7-Vijendar.Mukunda@amd.comSigned-off-by: NMark Brown <broonie@kernel.org>
上级 7610174a
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define ACP_ERROR_MASK 0x20000000 #define ACP_ERROR_MASK 0x20000000
#define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF #define ACP_EXT_INTR_STAT_CLEAR_MASK 0xFFFFFFFF
#define PDM_DMA_STAT 0x10
enum acp_config { enum acp_config {
ACP_CONFIG_0 = 0, ACP_CONFIG_0 = 0,
...@@ -46,6 +47,7 @@ enum acp_config { ...@@ -46,6 +47,7 @@ enum acp_config {
}; };
struct pdm_dev_data { struct pdm_dev_data {
u32 pdm_irq;
void __iomem *acp6x_base; void __iomem *acp6x_base;
struct snd_pcm_substream *capture_stream; struct snd_pcm_substream *capture_stream;
}; };
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <sound/pcm_params.h>
#include "acp6x.h" #include "acp6x.h"
...@@ -117,6 +119,27 @@ static int acp6x_deinit(void __iomem *acp_base) ...@@ -117,6 +119,27 @@ static int acp6x_deinit(void __iomem *acp_base)
return 0; return 0;
} }
static irqreturn_t acp6x_irq_handler(int irq, void *dev_id)
{
struct acp6x_dev_data *adata;
struct pdm_dev_data *yc_pdm_data;
u32 val;
adata = dev_id;
if (!adata)
return IRQ_NONE;
val = acp6x_readl(adata->acp6x_base + ACP_EXTERNAL_INTR_STAT);
if (val & BIT(PDM_DMA_STAT)) {
yc_pdm_data = dev_get_drvdata(&adata->pdev[0]->dev);
acp6x_writel(BIT(PDM_DMA_STAT), adata->acp6x_base + ACP_EXTERNAL_INTR_STAT);
if (yc_pdm_data->capture_stream)
snd_pcm_period_elapsed(yc_pdm_data->capture_stream);
return IRQ_HANDLED;
}
return IRQ_NONE;
}
static int snd_acp6x_probe(struct pci_dev *pci, static int snd_acp6x_probe(struct pci_dev *pci,
const struct pci_device_id *pci_id) const struct pci_device_id *pci_id)
{ {
...@@ -125,7 +148,9 @@ static int snd_acp6x_probe(struct pci_dev *pci, ...@@ -125,7 +148,9 @@ static int snd_acp6x_probe(struct pci_dev *pci,
int ret, index; int ret, index;
int val = 0x00; int val = 0x00;
u32 addr; u32 addr;
unsigned int irqflags;
irqflags = IRQF_SHARED;
/* Yellow Carp device check */ /* Yellow Carp device check */
if (pci->revision != 0x60) if (pci->revision != 0x60)
return -ENODEV; return -ENODEV;
...@@ -209,6 +234,12 @@ static int snd_acp6x_probe(struct pci_dev *pci, ...@@ -209,6 +234,12 @@ static int snd_acp6x_probe(struct pci_dev *pci,
} }
break; break;
} }
ret = devm_request_irq(&pci->dev, pci->irq, acp6x_irq_handler,
irqflags, "ACP_PCI_IRQ", adata);
if (ret) {
dev_err(&pci->dev, "ACP PCI IRQ request failed\n");
goto unregister_devs;
}
return 0; return 0;
unregister_devs: unregister_devs:
for (--index; index >= 0; index--) for (--index; index >= 0; index--)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册