linux/sound
Benjamin Rood f86f58e359
ASoC: sgtl5000: set DAP_AVC_CTRL register to correct default value on probe
According to the SGTL5000 datasheet [1], the DAP_AVC_CTRL register has
the following bit field definitions:

| BITS  | FIELD       | RW | RESET | DEFINITION                        |
| 15    | RSVD        | RO | 0x0   | Reserved                          |
| 14    | RSVD        | RW | 0x1   | Reserved                          |
| 13:12 | MAX_GAIN    | RW | 0x1   | Max Gain of AVC in expander mode  |
| 11:10 | RSVD        | RO | 0x0   | Reserved                          |
| 9:8   | LBI_RESP    | RW | 0x1   | Integrator Response               |
| 7:6   | RSVD        | RO | 0x0   | Reserved                          |
| 5     | HARD_LMT_EN | RW | 0x0   | Enable hard limiter mode          |
| 4:1   | RSVD        | RO | 0x0   | Reserved                          |
| 0     | EN          | RW | 0x0   | Enable/Disable AVC                |

The original default value written to the DAP_AVC_CTRL register during
sgtl5000_i2c_probe() was 0x0510.  This would incorrectly write values to
bits 4 and 10, which are defined as RESERVED.  It would also not set
bits 12 and 14 to their correct RESET values of 0x1, and instead set
them to 0x0.  While the DAP_AVC module is effectively disabled because
the EN bit is 0, this default value is still writing invalid values to
registers that are marked as read-only and RESERVED as well as not
setting bits 12 and 14 to their correct default values as defined by the
datasheet.

The correct value that should be written to the DAP_AVC_CTRL register is
0x5100, which configures the register bits to the default values defined
by the datasheet, and prevents any writes to bits defined as
'read-only'.  Generally speaking, it is best practice to NOT attempt to
write values to registers/bits defined as RESERVED, as it generally
produces unwanted/undefined behavior, or errors.

Also, all credit for this patch should go to my colleague Dan MacDonald
<dmacdonald@curbellmedical.com> for finding this error in the first
place.

[1] https://www.nxp.com/docs/en/data-sheet/SGTL5000.pdf

Signed-off-by: Benjamin Rood <benjaminjrood@gmail.com>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
Link: https://lore.kernel.org/r/20210219183308.GA2117@ubuntu-dev
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-03-10 12:50:50 +00:00
..
ac97 ALSA: ac97: Constify static struct attribute_group 2021-01-31 09:49:58 +01:00
aoa ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
arm ARM updates for 5.12-rc1: 2021-02-22 14:27:07 -08:00
atmel ALSA: atmel: ac97: clarify operator precedence 2020-09-03 09:27:34 +02:00
core ASoC: Updates for v5.12 2021-02-17 21:16:27 +01:00
drivers ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
firewire ALSA: fireface: fix to parse sync status register of latter protocol 2021-02-08 15:58:36 +01:00
hda ALSA/ASoC/SOF/SoundWire: fix Kconfig issues 2021-03-02 18:30:07 +01:00
i2c ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
isa isa: Make the remove callback for isa drivers return void 2021-01-26 07:51:48 +01:00
mips ALSA: n64: Fix return value check in n64audio_probe() 2021-02-25 10:29:13 +01:00
oss ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
parisc
pci ALSA: hda/realtek: Apply dual codec quirks for MSI Godlike X570 board 2021-03-03 15:25:03 +01:00
pcmcia
ppc ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
sh
soc ASoC: sgtl5000: set DAP_AVC_CTRL register to correct default value on probe 2021-03-10 12:50:50 +00:00
sparc ALSA: sparc: dbri: fix repeated word 'the' 2020-10-17 09:58:35 +02:00
spi
synth
usb ALSA: usb-audio: Fix Pioneer DJM devices URB_CONTROL request direction to set samplerate 2021-03-01 15:44:53 +01:00
x86 ALSA: x86: Simplify with dma_set_mask_and_coherent() 2021-01-15 11:17:19 +01:00
xen ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
ac97_bus.c
Kconfig
last.c
Makefile
sound_core.c