> +static irqreturn_t i2s_irq_handler(int irq, void *dev_id) > +{ > + struct i2s_dev_data *vg_i2s_data; > + u16 irq_flag; > + u32 val; > + > + vg_i2s_data = dev_id; > + if (!vg_i2s_data) > + return IRQ_NONE; > + > + irq_flag = 0; > + val = acp_readl(vg_i2s_data->acp5x_base + ACP_EXTERNAL_INTR_STAT); > + if ((val & BIT(HS_TX_THRESHOLD)) && vg_i2s_data->play_stream) { > + acp_writel(BIT(HS_TX_THRESHOLD), vg_i2s_data->acp5x_base + > + ACP_EXTERNAL_INTR_STAT); > + snd_pcm_period_elapsed(vg_i2s_data->play_stream); > + irq_flag = 1; > + } > + if ((val & BIT(I2S_TX_THRESHOLD)) && > + vg_i2s_data->i2ssp_play_stream) { use single line? > + acp_writel(BIT(I2S_TX_THRESHOLD), > + vg_i2s_data->acp5x_base + ACP_EXTERNAL_INTR_STAT); > + snd_pcm_period_elapsed(vg_i2s_data->i2ssp_play_stream); > + irq_flag = 1; > + } > + > + if ((val & BIT(HS_RX_THRESHOLD)) && vg_i2s_data->capture_stream) { > + acp_writel(BIT(HS_RX_THRESHOLD), vg_i2s_data->acp5x_base + > + ACP_EXTERNAL_INTR_STAT); > + snd_pcm_period_elapsed(vg_i2s_data->capture_stream); > + irq_flag = 1; > + } > + if ((val & BIT(I2S_RX_THRESHOLD)) && > + vg_i2s_data->i2ssp_capture_stream) { use single line? > + acp_writel(BIT(I2S_RX_THRESHOLD), > + vg_i2s_data->acp5x_base + ACP_EXTERNAL_INTR_STAT); > + snd_pcm_period_elapsed(vg_i2s_data->i2ssp_capture_stream); > + irq_flag = 1; > + } > + > + if (irq_flag) > + return IRQ_HANDLED; > + else > + return IRQ_NONE; > +} > + > static int acp5x_audio_probe(struct platform_device *pdev) > { > struct resource *res; > struct i2s_dev_data *adata; > + unsigned int irqflags; > int status; > > if (!pdev->dev.platform_data) { > @@ -47,6 +94,14 @@ static int acp5x_audio_probe(struct platform_device *pdev) > resource_size(res)); > if (!adata->acp5x_base) > return -ENOMEM; > + > + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > + if (!res) { > + dev_err(&pdev->dev, "IORESOURCE_IRQ FAILED\n"); > + return -ENODEV; > + } > + > + adata->i2s_irq = res->start; > dev_set_drvdata(&pdev->dev, adata); > status = devm_snd_soc_register_component(&pdev->dev, > &acp5x_i2s_component, > @@ -55,6 +110,12 @@ static int acp5x_audio_probe(struct platform_device *pdev) > dev_err(&pdev->dev, "Fail to register acp i2s component\n"); > return -ENODEV; > } > + status = devm_request_irq(&pdev->dev, adata->i2s_irq, i2s_irq_handler, > + irqflags, "ACP5x_I2S_IRQ", adata); > + if (status) { > + dev_err(&pdev->dev, "ACP5x I2S IRQ request failed\n"); > + return -ENODEV; > + } return status? > return 0; > } > > diff --git a/sound/soc/amd/vangogh/acp5x.h b/sound/soc/amd/vangogh/acp5x.h > index d2853738eb17..18df2b5a4283 100644 > --- a/sound/soc/amd/vangogh/acp5x.h > +++ b/sound/soc/amd/vangogh/acp5x.h > @@ -31,9 +31,18 @@ > #define ACP5x_HS_TDM_REG_END 0x1242824 > #define I2S_MODE 0x00 > #define ACP5x_I2S_MODE 0x00 > +#define I2S_RX_THRESHOLD 27 > +#define I2S_TX_THRESHOLD 28 > +#define HS_TX_THRESHOLD 24 > +#define HS_RX_THRESHOLD 23 > > struct i2s_dev_data { > + unsigned int i2s_irq; > void __iomem *acp5x_base; > + struct snd_pcm_substream *play_stream; > + struct snd_pcm_substream *capture_stream; > + struct snd_pcm_substream *i2ssp_play_stream; > + struct snd_pcm_substream *i2ssp_capture_stream; > }; > > /* common header file uses exact offset rather than relative >