OSDN Git Service

ASoC: wm8962: Do not access WM8962_GPIO_BASE
authorFabio Estevam <festevam@gmail.com>
Fri, 17 Jul 2020 13:59:59 +0000 (10:59 -0300)
committerMark Brown <broonie@kernel.org>
Thu, 30 Jul 2020 21:54:38 +0000 (22:54 +0100)
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>
Acked-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20200717135959.19212-1-festevam@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm8962.c

index 25c9600..317916c 100644 (file)
@@ -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:
@@ -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:
@@ -3438,7 +3437,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: