[U-Boot] [PATCH 1/6 V2] Sound: WM8994: Support I2S0 channel

Minkyu Kang mk7.kang at samsung.com
Wed Aug 28 03:56:44 CEST 2013


Dear Dani Krishna Mohan,

On 04/08/13 15:44, Dani Krishna Mohan wrote:
> This patch modifies the WM8994 codec to support I2S0 channel
> in codec slave mode
> 
> Signed-off-by: Dani Krishna Mohan <krishna.md at samsung.com>
> ---
> changes in V2:
> 	- None
>  drivers/sound/sound.c            |    2 +-
>  drivers/sound/wm8994.c           |   95 +++++++++++++++-----------------------
>  drivers/sound/wm8994_registers.h |   77 ++++++++++++++++--------------
>  3 files changed, 81 insertions(+), 93 deletions(-)
> 

I think, we can support both of AIF1 and AIF2.
Why don't you add AIF1 features instead of replacing.

> diff --git a/drivers/sound/sound.c b/drivers/sound/sound.c
> index 6fcc75d..47879a4 100644
> --- a/drivers/sound/sound.c
> +++ b/drivers/sound/sound.c
> @@ -130,7 +130,7 @@ static int codec_init(const void *blob, struct i2stx_info *pi2s_tx)
>  #endif
>  	if (!strcmp(codectype, "wm8994")) {
>  		/* Check the codec type and initialise the same */
> -		ret = wm8994_init(blob, WM8994_AIF2,
> +		ret = wm8994_init(blob, WM8994_AIF1,
>  			pi2s_tx->samplingrate,
>  			(pi2s_tx->samplingrate * (pi2s_tx->rfs)),
>  			pi2s_tx->bitspersample, pi2s_tx->channels);
> diff --git a/drivers/sound/wm8994.c b/drivers/sound/wm8994.c
> index 37e354c..57c8f8d 100644
> --- a/drivers/sound/wm8994.c
> +++ b/drivers/sound/wm8994.c
> @@ -477,9 +477,9 @@ static int configure_aif_clock(struct wm8994_priv *wm8994, int aif)
>  				reg1);
>  
>  	ret |= wm8994_update_bits(WM8994_CLOCKING_1,
> -			WM8994_SYSCLK_SRC | WM8994_AIF2DSPCLK_ENA_MASK |
> +			WM8994_SYSCLK_SRC | WM8994_AIF1DSPCLK_ENA_MASK |
>  			WM8994_SYSDSPCLK_ENA_MASK, WM8994_SYSCLK_SRC |
> -			WM8994_AIF2DSPCLK_ENA | WM8994_SYSDSPCLK_ENA);
> +			WM8994_AIF1DSPCLK_ENA | WM8994_SYSDSPCLK_ENA);
>  
>  	if (ret < 0) {
>  		debug("%s: codec register access error\n", __func__);
> @@ -536,7 +536,7 @@ static int wm8994_set_sysclk(struct wm8994_priv *wm8994, int aif_id,
>  					break;
>  			if (i == ARRAY_SIZE(opclk_divs)) {
>  				debug("%s frequency divisor not found\n",
> -					__func__);
> +				      __func__);
>  				return -1;
>  			}
>  			ret = wm8994_update_bits(WM8994_CLOCKING_2,
> @@ -565,28 +565,17 @@ static int wm8994_set_sysclk(struct wm8994_priv *wm8994, int aif_id,
>  }
>  
>  /*
> - * Initializes Volume for AIF2 to HP path
> + * Initializes Volume for AIF1 to HP path
>   *
>   * @returns -1 for error  and 0 Success.
>   *
>   */
> -static int wm8994_init_volume_aif2_dac1(void)
> +static int wm8994_init_volume_aif1_dac1(void)
>  {
> -	int ret;
> -
> -	/* Unmute AIF2DAC */
> -	ret = wm8994_update_bits(WM8994_AIF2_DAC_FILTERS_1,
> -			WM8994_AIF2DAC_MUTE_MASK, 0);
> -
> -
> -	ret |= wm8994_update_bits(WM8994_AIF2_DAC_LEFT_VOLUME,
> -			WM8994_AIF2DAC_VU_MASK | WM8994_AIF2DACL_VOL_MASK,
> -			WM8994_AIF2DAC_VU | 0xff);
> -
> -	ret |= wm8994_update_bits(WM8994_AIF2_DAC_RIGHT_VOLUME,
> -			WM8994_AIF2DAC_VU_MASK | WM8994_AIF2DACR_VOL_MASK,
> -			WM8994_AIF2DAC_VU | 0xff);
> +	int ret = 0;
>  
> +	/* unmute AIF1DAC1 */
> +	ret |= wm8994_i2c_write(WM8994_AIF1_DAC_FILTERS_1, 0x0000);
>  
>  	ret |= wm8994_update_bits(WM8994_DAC1_LEFT_VOLUME,
>  			WM8994_DAC1_VU_MASK | WM8994_DAC1L_VOL_MASK |
> @@ -661,12 +650,19 @@ static int wm8994_device_init(struct wm8994_priv *wm8994)
>  	ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_1,
>  				WM8994_HPOUT1R_ENA_MASK, WM8994_HPOUT1R_ENA);
>  
> -	/* Power enable for AIF2 and DAC1 */
> -	ret |= wm8994_update_bits(WM8994_POWER_MANAGEMENT_5,
> -		WM8994_AIF2DACL_ENA_MASK | WM8994_AIF2DACR_ENA_MASK |
> -		WM8994_DAC1L_ENA_MASK | WM8994_DAC1R_ENA_MASK,
> -		WM8994_AIF2DACL_ENA | WM8994_AIF2DACR_ENA | WM8994_DAC1L_ENA |
> -		WM8994_DAC1R_ENA);
> +
> +	ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_2, WM8994_TSHUT_ENA
> +			| WM8994_MIXINL_ENA | WM8994_MIXINR_ENA
> +			| WM8994_IN2L_ENA | WM8994_IN2R_ENA);
> +
> +	ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_4, WM8994_ADCL_ENA
> +				| WM8994_ADCR_ENA | WM8994_AIF1ADC1R_ENA
> +				| WM8994_AIF1ADC1L_ENA);
> +
> +	/* Power enable for AIF1 and DAC1 */
> +	ret |= wm8994_i2c_write(WM8994_POWER_MANAGEMENT_5, WM8994_AIF1DACL_ENA
> +			| WM8994_AIF1DACR_ENA | WM8994_DAC1L_ENA
> +			| WM8994_DAC1R_ENA);
>  
>  	/* Head Phone Initialisation */
>  	ret |= wm8994_update_bits(WM8994_ANALOGUE_HP_1,
> @@ -695,35 +691,20 @@ static int wm8994_device_init(struct wm8994_priv *wm8994)
>  	ret |= wm8994_update_bits(WM8994_OUTPUT_MIXER_2,
>  			WM8994_DAC1R_TO_HPOUT1R_MASK, WM8994_DAC1R_TO_HPOUT1R);
>  
> -	/* Routing AIF2 to DAC1 */
> -	ret |= wm8994_update_bits(WM8994_DAC1_LEFT_MIXER_ROUTING,
> -			WM8994_AIF2DACL_TO_DAC1L_MASK,
> -			WM8994_AIF2DACL_TO_DAC1L);
> -
> -	ret |= wm8994_update_bits(WM8994_DAC1_RIGHT_MIXER_ROUTING,
> -			WM8994_AIF2DACR_TO_DAC1R_MASK,
> -			WM8994_AIF2DACR_TO_DAC1R);
> -
> -	 /* GPIO Settings for AIF2 */
> -	 /* B CLK */
> -	ret |= wm8994_update_bits(WM8994_GPIO_3, WM8994_GPIO_DIR_MASK |
> -				WM8994_GPIO_FUNCTION_MASK ,
> -				WM8994_GPIO_DIR_OUTPUT |
> -				WM8994_GPIO_FUNCTION_I2S_CLK);
> -
> -	/* LR CLK */
> -	ret |= wm8994_update_bits(WM8994_GPIO_4, WM8994_GPIO_DIR_MASK |
> -				WM8994_GPIO_FUNCTION_MASK,
> -				WM8994_GPIO_DIR_OUTPUT |
> -				WM8994_GPIO_FUNCTION_I2S_CLK);
> -
> -	/* DATA */
> -	ret |= wm8994_update_bits(WM8994_GPIO_5, WM8994_GPIO_DIR_MASK |
> -				WM8994_GPIO_FUNCTION_MASK,
> -				WM8994_GPIO_DIR_OUTPUT |
> -				WM8994_GPIO_FUNCTION_I2S_CLK);
> -
> -	ret |= wm8994_init_volume_aif2_dac1();
> +	/* Routing AIF1 to DAC1 */
> +	ret |= wm8994_i2c_write(WM8994_DAC1_LEFT_MIXER_ROUTING,
> +			WM8994_AIF1DAC1L_TO_DAC1L);
> +
> +	ret |= wm8994_i2c_write(WM8994_DAC1_RIGHT_MIXER_ROUTING,
> +			WM8994_AIF1DAC1R_TO_DAC1R);
> +
> +	 /* GPIO Settings for AIF1 */
> +
> +	ret |=  wm8994_i2c_write(WM8994_GPIO_1, WM8994_GPIO_DIR_OUTPUT
> +				| WM8994_GPIO_FUNCTION_I2S_CLK
> +				| WM8994_GPIO_INPUT_DEBOUNCE);
> +
> +	ret |= wm8994_init_volume_aif1_dac1();
>  	if (ret < 0)
>  		goto err;
>  
> @@ -813,11 +794,11 @@ int wm8994_init(const void *blob, enum en_audio_interface aif_id,
>  	g_wm8994_i2c_dev_addr = pcodec_info->i2c_dev_addr;
>  	wm8994_i2c_init(pcodec_info->i2c_bus);
>  
> -	if (pcodec_info->codec_type == CODEC_WM_8994)
> +	if (pcodec_info->codec_type == CODEC_WM_8994) {
>  		g_wm8994_info.type = WM8994;
> -	else {
> +	} else {
>  		debug("%s: Codec id [%d] not defined\n", __func__,
> -				pcodec_info->codec_type);
> +		      pcodec_info->codec_type);
>  		return -1;

unrelated change.

>  	}
>  
> diff --git a/drivers/sound/wm8994_registers.h b/drivers/sound/wm8994_registers.h
> index 1e987c2..debb658 100644
> --- a/drivers/sound/wm8994_registers.h
> +++ b/drivers/sound/wm8994_registers.h
> @@ -13,6 +13,7 @@
>  #define WM8994_SOFTWARE_RESET                   0x00
>  #define WM8994_POWER_MANAGEMENT_1               0x01
>  #define WM8994_POWER_MANAGEMENT_2               0x02
> +#define WM8994_POWER_MANAGEMENT_4		0x04
>  #define WM8994_POWER_MANAGEMENT_5               0x05
>  #define WM8994_LEFT_OUTPUT_VOLUME               0x1C
>  #define WM8994_RIGHT_OUTPUT_VOLUME              0x1D
> @@ -38,6 +39,9 @@
>  #define WM8994_AIF2_CONTROL_2                   0x311
>  #define WM8994_AIF2_MASTER_SLAVE                0x312
>  #define WM8994_AIF2_BCLK                        0x313
> +#define WM8994_AIF1_DAC_LEFT_VOLUME             0x402
> +#define WM8994_AIF1_DAC_RIGHT_VOLUME            0x403
> +#define WM8994_AIF1_DAC_FILTERS_1               0x420
>  #define WM8994_AIF2_DAC_LEFT_VOLUME             0x502
>  #define WM8994_AIF2_DAC_RIGHT_VOLUME            0x503
>  #define WM8994_AIF2_DAC_FILTERS_1               0x520
> @@ -45,6 +49,8 @@
>  #define WM8994_DAC1_RIGHT_MIXER_ROUTING         0x602
>  #define WM8994_DAC1_LEFT_VOLUME                 0x610
>  #define WM8994_DAC1_RIGHT_VOLUME                0x611
> +#define WM8994_OVERSAMPLING	                0x620
> +#define WM8994_GPIO_1                           0x700

please use tab.

>  #define WM8994_GPIO_3                           0x702
>  #define WM8994_GPIO_4                           0x703
>  #define WM8994_GPIO_5                           0x704
> @@ -75,6 +81,8 @@
>  #define WM8994_BIAS_ENA                         0x0001
>  /* BIAS_ENA */
>  #define WM8994_BIAS_ENA_MASK                    0x0001
> +#define WM8994_BIAS_ENA_SHIFT                        0
> +#define WM8994_BIAS_ENA_WIDTH                        1
>  
>  /*
>   * R2 (0x02) - Power Management (2)
> @@ -82,21 +90,35 @@
>  /* OPCLK_ENA */
>  #define WM8994_OPCLK_ENA                        0x0800
>  
> +#define WM8994_TSHUT_ENA                        0x4000
> +#define WM8994_MIXINL_ENA                       0x0200
> +#define WM8994_MIXINR_ENA                       0x0100
> +#define WM8994_IN2L_ENA                         0x0080
> +#define WM8994_IN2R_ENA                         0x0020

please use tab.

> +
> +/*
> + * R5 (0x04) - Power Management (4)
> + */
> +#define WM8994_ADCL_ENA				0x0001
> +#define WM8994_ADCR_ENA				0x0002
> +#define WM8994_AIF1ADC1R_ENA			0x0100
> +#define WM8994_AIF1ADC1L_ENA			0x0200
> +
>  /*
>   * R5 (0x05) - Power Management (5)
>   */
> -/* AIF2DACL_ENA */
> -#define WM8994_AIF2DACL_ENA                     0x2000
> -#define WM8994_AIF2DACL_ENA_MASK                0x2000
> -/* AIF2DACR_ENA */
> -#define WM8994_AIF2DACR_ENA                     0x1000
> -#define WM8994_AIF2DACR_ENA_MASK                0x1000
>  /* DAC1L_ENA */
>  #define WM8994_DAC1L_ENA                        0x0002
>  #define WM8994_DAC1L_ENA_MASK                   0x0002
>  /* DAC1R_ENA */
>  #define WM8994_DAC1R_ENA                        0x0001
>  #define WM8994_DAC1R_ENA_MASK                   0x0001
> +/* AIF1DACL_ENA */
> +#define WM8994_AIF1DACL_ENA                     0x0200
> +#define WM8994_AIF1DACL_ENA_MASK                0x0200
> +/* AIF1DACR_ENA */
> +#define WM8994_AIF1DACR_ENA                     0x0100
> +#define WM8994_AIF1DACR_ENA_MASK                0x0100
>  
>  /*
>   * R45 (0x2D) - Output Mixer (1)
> @@ -170,14 +192,14 @@
>  /*
>   * R520 (0x208) - Clocking (1)
>   */
> -/* AIF2DSPCLK_ENA */
> -#define WM8994_AIF2DSPCLK_ENA                   0x0004
> -#define WM8994_AIF2DSPCLK_ENA_MASK              0x0004
> +/* AIF1DSPCLK_ENA */
> +#define WM8994_AIF1DSPCLK_ENA                   0x0008
> +#define WM8994_AIF1DSPCLK_ENA_MASK              0x0008

please use tab.

>  /* SYSDSPCLK_ENA */
>  #define WM8994_SYSDSPCLK_ENA                    0x0002
>  #define WM8994_SYSDSPCLK_ENA_MASK               0x0002
>  /* SYSCLK_SRC */
> -#define WM8994_SYSCLK_SRC                       0x0001
> +#define WM8994_SYSCLK_SRC                       0x0000
>  
>  /*
>   * R521 (0x209) - Clocking (2)
> @@ -228,27 +250,6 @@
>  #define WM8994_AIF1_BCLK_DIV_SHIFT                   4
>  
>  /*
> - * R1282 (0x502) - AIF2 DAC Left Volume
> - */
> -/* AIF2DAC_VU */
> -#define WM8994_AIF2DAC_VU                       0x0100
> -#define WM8994_AIF2DAC_VU_MASK                  0x0100
> -/* AIF2DACL_VOL - [7:0] */
> -#define WM8994_AIF2DACL_VOL_MASK                0x00FF
> -
> -/*
> - * R1283 (0x503) - AIF2 DAC Right Volume
> - */
> -/* AIF2DACR_VOL - [7:0] */
> -#define WM8994_AIF2DACR_VOL_MASK                0x00FF
> -
> -/*
> - * R1312 (0x520) - AIF2 DAC Filters (1)
> - */
> -/* AIF2DAC_MUTE */
> -#define WM8994_AIF2DAC_MUTE_MASK                0x0200
> -
> -/*
>   * R1537 (0x601) - DAC1 Left Mixer Routing
>   */
>  /* AIF2DACL_TO_DAC1L */
> @@ -262,6 +263,11 @@
>  #define WM8994_AIF2DACR_TO_DAC1R                0x0004
>  #define WM8994_AIF2DACR_TO_DAC1R_MASK           0x0004
>  
> +/* AIF1DAC1L_TO_DAC1L */
> +#define WM8994_AIF1DAC1L_TO_DAC1L               0x0001

please use tab.

> +
> +/* AIF1DAC1R_TO_DAC1R */
> +#define WM8994_AIF1DAC1R_TO_DAC1R               0x0001

please use tab.

>  /*
>   * R1552 (0x610) - DAC1 Left Volume
>   */
> @@ -285,11 +291,12 @@
>   *  GPIO
>   */
>  /* OUTPUT PIN */
> -#define WM8994_GPIO_DIR_OUTPUT                   0x8000
> +#define WM8994_GPIO_DIR_OUTPUT                  0x8000

please use tab.

>  /* GPIO PIN MASK */
> -#define WM8994_GPIO_DIR_MASK                     0xFFE0
> +#define WM8994_GPIO_DIR_MASK			0xFFE0
>  /* I2S CLK */
> -#define WM8994_GPIO_FUNCTION_I2S_CLK             0x0000
> +#define WM8994_GPIO_FUNCTION_I2S_CLK		0x0001
> +#define WM8994_GPIO_INPUT_DEBOUNCE		0x0100
>  /* GPn FN */
> -#define WM8994_GPIO_FUNCTION_MASK                0x001F
> +#define WM8994_GPIO_FUNCTION_MASK               0x001F

please use tab.

>  #endif
> 

Thanks,
Minkyu Kang.


More information about the U-Boot mailing list