[PATCH] ASoC: wm8962: Do not access WM8962_GPIO_BASE

Charles Keepax ckeepax at opensource.cirrus.com
Thu Jul 23 11:11:18 CEST 2020


On Fri, Jul 17, 2020 at 10:59:59AM -0300, Fabio Estevam wrote:
> According to the WM8962 datasheet, there is no register at address 0x200.
> 
> WM8962_GPIO_BASE is just a base address for the GPIO registers and not a
> real register, so remove it from wm8962_readable_register().
> 
> Also, Register 515 (WM8962_GPIO_BASE + 3) does not exist, so skip
> its access.
> 
> This fixes the following errors:
> 
> wm8962 0-001a: ASoC: error at soc_component_read_no_lock on wm8962.0-001a: -16
> wm8962 0-001a: ASoC: error at soc_component_read_no_lock on wm8962.0-001a: -16
> 
> Signed-off-by: Fabio Estevam <festevam at gmail.com>
> ---

This doesn't quite smell right admittedly I am not 100% sure for this
chip but usually the Wolfson chips just return zero when you read a
non-existant register rather than NACKing the transaction. But even
if the chip was NACKing the transaction I would probably expect an
EIO rather than EBUSY error.

Are we sure we understand the error we are addressing here?

Thanks,
Charles

> Hi,
> 
> There is still one more soc_component_read_no_lock error left on register 48.
> 
> I can get rid of it with the below change:
> 
> --- a/sound/soc/codecs/wm8962.c
> +++ b/sound/soc/codecs/wm8962.c
> @@ -151,6 +151,7 @@ static const struct reg_default wm8962_reg[] = {
>  	{ 40, 0x0000 },   /* R40    - SPKOUTL volume */
>  	{ 41, 0x0000 },   /* R41    - SPKOUTR volume */
>  
> +	{ 48, 0x0000 },   /* R48    - Additional control(4) */
>  	{ 49, 0x0010 },   /* R49    - Class D Control 1 */
>  	{ 51, 0x0003 },   /* R51    - Class D Control 2 */
>  
> @@ -841,7 +842,6 @@ static bool wm8962_readable_register(struct device *dev, unsigned int reg)
>  	case WM8962_SPKOUTL_VOLUME:
>  	case WM8962_SPKOUTR_VOLUME:
>  	case WM8962_THERMAL_SHUTDOWN_STATUS:
> -	case WM8962_ADDITIONAL_CONTROL_4:
>  	case WM8962_CLASS_D_CONTROL_1:
>  	case WM8962_CLASS_D_CONTROL_2:
>  	case WM8962_CLOCKING_4:
> 
> I haven't submitted it yet because I don't know if this is the correct
> approach.
> 
> Please advise.
> 
> Thanks
> 
>  sound/soc/codecs/wm8962.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
> index df8cdc71357d..8159a3866cde 100644
> --- a/sound/soc/codecs/wm8962.c
> +++ b/sound/soc/codecs/wm8962.c
> @@ -956,7 +956,6 @@ static bool wm8962_readable_register(struct device *dev, unsigned int reg)
>  	case WM8962_EQ39:
>  	case WM8962_EQ40:
>  	case WM8962_EQ41:
> -	case WM8962_GPIO_BASE:
>  	case WM8962_GPIO_2:
>  	case WM8962_GPIO_3:
>  	case WM8962_GPIO_5:
> @@ -3437,7 +3436,13 @@ static int wm8962_probe(struct snd_soc_component *component)
>  	/* Save boards having to disable DMIC when not in use */
>  	dmicclk = false;
>  	dmicdat = false;
> -	for (i = 0; i < WM8962_MAX_GPIO; i++) {
> +	for (i = 1; i < WM8962_MAX_GPIO; i++) {
> +		/*
> +		 * Register 515 (WM8962_GPIO_BASE + 3) does not exist,
> +		 * so skip its access
> +		 */
> +		if (i == 3)
> +			continue;
>  		switch (snd_soc_component_read(component, WM8962_GPIO_BASE + i)
>  			& WM8962_GP2_FN_MASK) {
>  		case WM8962_GPIO_FN_DMICCLK:
> -- 
> 2.17.1
> 


More information about the Alsa-devel mailing list