mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
ALSA: i2c: ak4xxx-adda: implement AK4529 reset handling
Delta 410 uses snd_akm4xxx_reset() both around DFS changes and from its PM callbacks, but the AK4529 case in this helper is still left unimplemented and never drives the codec reset path. The AK4529 datasheet documents register 09h.RSTN as an internal timing reset. Clearing RSTN powers down the ADC and DAC blocks, but does not reinitialize the register map. That matches the existing ak4xxx helper model, which already keeps the desired codec state in the software register cache. Implement AK4529 reset handling by clearing 09h.RSTN on state == 1, then replaying the cached register image and setting RSTN back to 1 on state == 0. This restores cached Delta 410 mixer state after resume and gives the AK4529 DFS-change path a real codec reset sequence. Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> Link: https://patch.msgid.link/20260407-ak4529-reset-handling-v1-1-b971c18b1a32@gmail.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
6f800c3397
commit
66f6f54328
|
|
@ -53,6 +53,31 @@ static void ak4524_reset(struct snd_akm4xxx *ak, int state)
|
|||
}
|
||||
}
|
||||
|
||||
/* reset procedure for AK4529 */
|
||||
static void ak4529_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
static const unsigned char regs[] = {
|
||||
0x0a, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
|
||||
0x06, 0x07, 0x0b, 0x0c, 0x08,
|
||||
};
|
||||
unsigned int i;
|
||||
unsigned char reg;
|
||||
|
||||
if (state) {
|
||||
snd_akm4xxx_write(ak, 0, 0x09,
|
||||
snd_akm4xxx_get(ak, 0, 0x09) & ~0x01);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
||||
reg = regs[i];
|
||||
snd_akm4xxx_write(ak, 0, reg,
|
||||
snd_akm4xxx_get(ak, 0, reg));
|
||||
}
|
||||
snd_akm4xxx_write(ak, 0, 0x09,
|
||||
snd_akm4xxx_get(ak, 0, 0x09) | 0x01);
|
||||
}
|
||||
|
||||
/* reset procedure for AK4355 and AK4358 */
|
||||
static void ak435X_reset(struct snd_akm4xxx *ak, int state)
|
||||
{
|
||||
|
|
@ -99,7 +124,7 @@ void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
|
|||
ak4524_reset(ak, state);
|
||||
break;
|
||||
case SND_AK4529:
|
||||
/* FIXME: needed for ak4529? */
|
||||
ak4529_reset(ak, state);
|
||||
break;
|
||||
case SND_AK4355:
|
||||
ak435X_reset(ak, state);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user