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@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)
switch (snd_soc_component_read(component, WM8962_GPIO_BASE + i) & WM8962_GP2_FN_MASK) { case WM8962_GPIO_FN_DMICCLK:continue;
-- 2.17.1