[alsa-devel] [PATCH V2] ASoC: amd: dma driver changes for BT I2S controller instance

Deucher, Alexander Alexander.Deucher at amd.com
Mon Mar 19 15:40:59 CET 2018


> -----Original Message-----
> From: Vijendar Mukunda [mailto:Vijendar.Mukunda at amd.com]
> Sent: Monday, March 19, 2018 2:41 AM
> To: broonie at kernel.org; alsa-devel at alsa-project.org
> Cc: lgirdwood at gmail.com; tiwai at suse.de; Deucher, Alexander
> <Alexander.Deucher at amd.com>; Mukunda, Vijendar
> <Vijendar.Mukunda at amd.com>; Agrawal, Akshu
> <Akshu.Agrawal at amd.com>
> Subject: [PATCH V2] ASoC: amd: dma driver changes for BT I2S controller
> instance
> 
> With in ACP, There are three I2S controllers can be configured/enabled ( I2S
> SP, I2S MICSP, I2S BT).
> Default enabled I2S controller instance is I2S SP.
> This patch provides required changes to support I2S BT controller Instance.
> 
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda at amd.com>
> Signed-off-by: Akshu Agrawal <akshu.agrawal at amd.com>
> ---
>  sound/soc/amd/acp-pcm-dma.c | 106
> +++++++++++++++++++++++++++++++++++---------
>  sound/soc/amd/acp.h         |  10 +++++
>  2 files changed, 94 insertions(+), 22 deletions(-)
> 
> diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-
> dma.c index 540088d..a61c4e0 100644
> --- a/sound/soc/amd/acp-pcm-dma.c
> +++ b/sound/soc/amd/acp-pcm-dma.c
> @@ -697,6 +697,7 @@ static int acp_dma_open(struct snd_pcm_substream
> *substream)
>  	struct snd_soc_pcm_runtime *prtd = substream->private_data;
>  	struct snd_soc_component *component =
> snd_soc_rtdcom_lookup(prtd, DRV_NAME);
>  	struct audio_drv_data *intr_data = dev_get_drvdata(component-
> >dev);
> +	struct dw_i2s_dev *dev = snd_soc_dai_get_drvdata(prtd->cpu_dai);
>  	struct audio_substream_data *adata =
>  		kzalloc(sizeof(struct audio_substream_data), GFP_KERNEL);
>  	if (adata == NULL)
> @@ -710,7 +711,21 @@ static int acp_dma_open(struct snd_pcm_substream
> *substream)
>  		default:
>  			runtime->hw = acp_pcm_hardware_playback;
>  		}
> +		adata->i2s_play_instance = dev->i2s_instance;
> +		if (adata->i2s_play_instance == I2S_SP_INSTANCE)
> +			adata->i2ssp_renderbytescount = 0;
> +		else if (adata->i2s_play_instance == I2S_BT_INSTANCE)
> +			adata->i2sbt_renderbytescount = 0;
> +		else
> +			return -EINVAL;
>  	} else {
> +		adata->i2s_capture_instance = dev->i2s_instance;
> +		if (adata->i2s_capture_instance == I2S_SP_INSTANCE)
> +			adata->i2ssp_capturebytescount = 0;
> +		else if (adata->i2s_capture_instance == I2S_BT_INSTANCE)
> +			adata->i2sbt_capturebytescount = 0;
> +		else
> +			return -EINVAL;
>  		switch (intr_data->asic_type) {
>  		case CHIP_STONEY:
>  			runtime->hw = acp_st_pcm_hardware_capture; @@
> -736,11 +751,20 @@ static int acp_dma_open(struct snd_pcm_substream
> *substream)
>  	 * This enablement is not required for another stream, if current
>  	 * stream is not closed
>  	*/
> -	if (!intr_data->play_i2ssp_stream && !intr_data-
> >capture_i2ssp_stream)
> +	if (!intr_data->play_i2ssp_stream && !intr_data-
> >capture_i2ssp_stream &&
> +		!intr_data->play_i2sbt_stream &&
> +		!intr_data->capture_i2sbt_stream)
>  		acp_reg_write(1, adata->acp_mmio,
> mmACP_EXTERNAL_INTR_ENB);
> 
>  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> -		intr_data->play_i2ssp_stream = substream;
> +		switch (adata->i2s_play_instance) {
> +		case I2S_BT_INSTANCE:
> +			intr_data->play_i2sbt_stream = substream;
> +			break;
> +		case I2S_SP_INSTANCE:
> +		default:
> +			intr_data->play_i2ssp_stream = substream;
> +		}
>  		/* For Stoney, Memory gating is disabled,i.e SRAM Banks
>  		 * won't be turned off. The default state for SRAM banks is
> ON.
>  		 * Setting SRAM bank state code skipped for STONEY
> platform.
> @@ -751,7 +775,14 @@ static int acp_dma_open(struct snd_pcm_substream
> *substream)
>  							bank, true);
>  		}
>  	} else {
> -		intr_data->capture_i2ssp_stream = substream;
> +		switch (adata->i2s_capture_instance) {
> +		case I2S_BT_INSTANCE:
> +			intr_data->capture_i2sbt_stream = substream;
> +			break;
> +		case I2S_SP_INSTANCE:
> +		default:
> +			intr_data->capture_i2ssp_stream = substream;
> +		}
>  		if (intr_data->asic_type != CHIP_STONEY) {
>  			for (bank = 5; bank <= 8; bank++)
>  				acp_set_sram_bank_state(intr_data-
> >acp_mmio,
> @@ -1010,34 +1041,49 @@ static int acp_dma_close(struct
> snd_pcm_substream *substream)
>  	struct snd_soc_component *component =
> snd_soc_rtdcom_lookup(prtd, DRV_NAME);
>  	struct audio_drv_data *adata = dev_get_drvdata(component->dev);
> 
> -	kfree(rtd);
> -
>  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> -		adata->play_i2ssp_stream = NULL;
> -		/* For Stoney, Memory gating is disabled,i.e SRAM Banks
> -		 * won't be turned off. The default state for SRAM banks is
> ON.
> -		 * Setting SRAM bank state code skipped for STONEY
> platform.
> -		 * added condition checks for Carrizo platform only
> -		 */
> -		if (adata->asic_type != CHIP_STONEY) {
> -			for (bank = 1; bank <= 4; bank++)
> -				acp_set_sram_bank_state(adata-
> >acp_mmio, bank,
> -				false);
> +		switch (rtd->i2s_play_instance) {
> +		case I2S_BT_INSTANCE:
> +			adata->play_i2sbt_stream = NULL;
> +			break;
> +		case I2S_SP_INSTANCE:
> +		default:
> +			adata->play_i2ssp_stream = NULL;
> +			/* For Stoney, Memory gating is disabled,i.e SRAM
> Banks
> +			 * won't be turned off. The default state for SRAM
> banks
> +			 * is ON.Setting SRAM bank state code skipped for
> STONEY
> +			 * platform.Added condition checks for Carrizo
> platform
> +			 * only.
> +			 */
> +			if (adata->asic_type != CHIP_STONEY) {
> +				for (bank = 1; bank <= 4; bank++)
> +					acp_set_sram_bank_state(adata-
> >acp_mmio,
> +							bank, false);
> +			}
>  		}
>  	} else  {
> -		adata->capture_i2ssp_stream = NULL;
> -		if (adata->asic_type != CHIP_STONEY) {
> -			for (bank = 5; bank <= 8; bank++)
> -				acp_set_sram_bank_state(adata-
> >acp_mmio, bank,
> -						     false);
> +		switch (rtd->i2s_capture_instance) {
> +		case I2S_BT_INSTANCE:
> +			adata->capture_i2sbt_stream = NULL;
> +			break;
> +		case I2S_SP_INSTANCE:
> +		default:
> +			adata->capture_i2ssp_stream = NULL;
> +			if (adata->asic_type != CHIP_STONEY) {
> +				for (bank = 5; bank <= 8; bank++)
> +					acp_set_sram_bank_state(adata-
> >acp_mmio,
> +							bank, false);
> +			}
>  		}
>  	}
> 
>  	/* Disable ACP irq, when the current stream is being closed and
>  	 * another stream is also not active.
> -	*/
> -	if (!adata->play_i2ssp_stream && !adata->capture_i2ssp_stream)
> +	 */
> +	if (!adata->play_i2ssp_stream && !adata->capture_i2ssp_stream &&
> +		!adata->play_i2sbt_stream && !adata-
> >capture_i2sbt_stream)
>  		acp_reg_write(0, adata->acp_mmio,
> mmACP_EXTERNAL_INTR_ENB);
> +	kfree(rtd);
> 
>  	return 0;
>  }
> @@ -1089,6 +1135,8 @@ static int acp_audio_probe(struct platform_device
> *pdev)
> 
>  	audio_drv_data->play_i2ssp_stream = NULL;
>  	audio_drv_data->capture_i2ssp_stream = NULL;
> +	audio_drv_data->play_i2sbt_stream = NULL;
> +	audio_drv_data->capture_i2sbt_stream = NULL;
> 
>  	audio_drv_data->asic_type =  *pdata;
> 
> @@ -1177,6 +1225,20 @@ static int acp_pcm_resume(struct device *dev)
>  			adata->capture_i2ssp_stream->runtime-
> >private_data,
>  			adata->asic_type);
>  	}
> +	if (adata->asic_type != CHIP_CARRIZO) {
> +		if (adata->play_i2sbt_stream &&
> +			adata->play_i2sbt_stream->runtime) {
> +			config_acp_dma(adata->acp_mmio,
> +				adata->play_i2sbt_stream->runtime-
> >private_data,
> +				adata->asic_type);
> +		}
> +		if (adata->capture_i2sbt_stream &&
> +			adata->capture_i2sbt_stream->runtime) {
> +			config_acp_dma(adata->acp_mmio,
> +				adata->capture_i2sbt_stream->runtime-
> >private_data,
> +				adata->asic_type);
> +		}
> +	}
>  	acp_reg_write(1, adata->acp_mmio,
> mmACP_EXTERNAL_INTR_ENB);
>  	return 0;
>  }
> diff --git a/sound/soc/amd/acp.h b/sound/soc/amd/acp.h index
> ba01510..8bc78cc 100644
> --- a/sound/soc/amd/acp.h
> +++ b/sound/soc/amd/acp.h
> @@ -4,6 +4,8 @@
> 
>  #include "include/acp_2_2_d.h"
>  #include "include/acp_2_2_sh_mask.h"
> +#include <sound/designware_i2s.h>
> +#include "../dwc/local.h"
> 
>  #define ACP_PAGE_SIZE_4K_ENABLE			0x02
> 
> @@ -72,6 +74,8 @@
>  #define mmACP_I2S_16BIT_RESOLUTION_EN       0x5209
>  #define ACP_I2S_MIC_16BIT_RESOLUTION_EN 0x01
>  #define ACP_I2S_SP_16BIT_RESOLUTION_EN	0x02
> +#define I2S_SP_INSTANCE 1
> +#define I2S_BT_INSTANCE 2

Please add the defines for I2S_SP_INSTANCE and I2S_BT_INSTANCE to the dws platform data header so you don't have to define them locally here.
With that fixed, the patch is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

>  enum acp_dma_priority_level {
>  	/* 0x0 Specifies the DMA channel is given normal priority */
>  	ACP_DMA_PRIORITY_LEVEL_NORMAL = 0x0,
> @@ -88,12 +92,18 @@ struct audio_substream_data {
>  	uint64_t size;
>  	u64 i2ssp_renderbytescount;
>  	u64 i2ssp_capturebytescount;
> +	u64 i2sbt_renderbytescount;
> +	u64 i2sbt_capturebytescount;
>  	void __iomem *acp_mmio;
> +	u16 i2s_play_instance;
> +	u16 i2s_capture_instance;
>  };
> 
>  struct audio_drv_data {
>  	struct snd_pcm_substream *play_i2ssp_stream;
>  	struct snd_pcm_substream *capture_i2ssp_stream;
> +	struct snd_pcm_substream *play_i2sbt_stream;
> +	struct snd_pcm_substream *capture_i2sbt_stream;
>  	void __iomem *acp_mmio;
>  	u32 asic_type;
>  };
> --
> 2.7.4



More information about the Alsa-devel mailing list