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@xxxxxxxxx> > --- 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 >