41 |
|
|
42 |
/* save the data */ |
/* save the data */ |
43 |
if (ak->type == SND_AK4524 || ak->type == SND_AK4528) { |
if (ak->type == SND_AK4524 || ak->type == SND_AK4528) { |
44 |
if ((reg != 0x04 && reg != 0x05) || (reg & 0x80) == 0) |
if ((reg != 0x04 && reg != 0x05) || (val & 0x80) == 0) |
45 |
ak->images[chip][reg] = val; |
snd_akm4xxx_set(ak, chip, reg, val); |
46 |
else |
else |
47 |
ak->ipga_gain[chip][reg-4] = val; |
snd_akm4xxx_set_ipga(ak, chip, reg, val); |
48 |
} else { |
} else { |
49 |
/* AK4529, or else */ |
/* AK4529, or else */ |
50 |
ak->images[chip][reg] = val; |
snd_akm4xxx_set(ak, chip, reg, val); |
51 |
} |
} |
52 |
ak->ops.unlock(ak, chip); |
ak->ops.unlock(ak, chip); |
53 |
} |
} |
72 |
continue; |
continue; |
73 |
/* DAC volumes */ |
/* DAC volumes */ |
74 |
for (reg = 0x04; reg < (ak->type == SND_AK4528 ? 0x06 : 0x08); reg++) |
for (reg = 0x04; reg < (ak->type == SND_AK4528 ? 0x06 : 0x08); reg++) |
75 |
snd_akm4xxx_write(ak, chip, reg, ak->images[chip][reg]); |
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg)); |
76 |
if (ak->type == SND_AK4528) |
if (ak->type == SND_AK4528) |
77 |
continue; |
continue; |
78 |
/* IPGA */ |
/* IPGA */ |
79 |
for (reg = 0x04; reg < 0x06; reg++) |
for (reg = 0x04; reg < 0x06; reg++) |
80 |
snd_akm4xxx_write(ak, chip, reg, ak->ipga_gain[chip][reg-4]); |
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get_ipga(ak, chip, reg)); |
81 |
} |
} |
82 |
break; |
break; |
83 |
case SND_AK4529: |
case SND_AK4529: |
89 |
return; |
return; |
90 |
for (reg = 0x00; reg < 0x0a; reg++) |
for (reg = 0x00; reg < 0x0a; reg++) |
91 |
if (reg != 0x01) |
if (reg != 0x01) |
92 |
snd_akm4xxx_write(ak, 0, reg, ak->images[0][reg]); |
snd_akm4xxx_write(ak, 0, reg, snd_akm4xxx_get(ak, 0, reg)); |
93 |
break; |
break; |
94 |
case SND_AK4381: |
case SND_AK4381: |
95 |
for (chip = 0; chip < ak->num_dacs/2; chip++) { |
for (chip = 0; chip < ak->num_dacs/2; chip++) { |
97 |
if (state) |
if (state) |
98 |
continue; |
continue; |
99 |
for (reg = 0x01; reg < 0x05; reg++) |
for (reg = 0x01; reg < 0x05; reg++) |
100 |
snd_akm4xxx_write(ak, chip, reg, ak->images[chip][reg]); |
snd_akm4xxx_write(ak, chip, reg, snd_akm4xxx_get(ak, chip, reg)); |
101 |
} |
} |
102 |
break; |
break; |
103 |
} |
} |
240 |
int addr = AK_GET_ADDR(kcontrol->private_value); |
int addr = AK_GET_ADDR(kcontrol->private_value); |
241 |
int invert = AK_GET_INVERT(kcontrol->private_value); |
int invert = AK_GET_INVERT(kcontrol->private_value); |
242 |
unsigned int mask = AK_GET_MASK(kcontrol->private_value); |
unsigned int mask = AK_GET_MASK(kcontrol->private_value); |
243 |
unsigned char val = ak->images[chip][addr]; |
unsigned char val = snd_akm4xxx_get(ak, chip, addr); |
244 |
|
|
245 |
ucontrol->value.integer.value[0] = invert ? mask - val : val; |
ucontrol->value.integer.value[0] = invert ? mask - val : val; |
246 |
return 0; |
return 0; |
258 |
|
|
259 |
if (invert) |
if (invert) |
260 |
nval = mask - nval; |
nval = mask - nval; |
261 |
change = ak->images[chip][addr] != nval; |
change = snd_akm4xxx_get(ak, chip, addr) != nval; |
262 |
if (change) |
if (change) |
263 |
snd_akm4xxx_write(ak, chip, addr, nval); |
snd_akm4xxx_write(ak, chip, addr, nval); |
264 |
return change; |
return change; |
278 |
akm4xxx_t *ak = _snd_kcontrol_chip(kcontrol); |
akm4xxx_t *ak = _snd_kcontrol_chip(kcontrol); |
279 |
int chip = AK_GET_CHIP(kcontrol->private_value); |
int chip = AK_GET_CHIP(kcontrol->private_value); |
280 |
int addr = AK_GET_ADDR(kcontrol->private_value); |
int addr = AK_GET_ADDR(kcontrol->private_value); |
281 |
ucontrol->value.integer.value[0] = ak->ipga_gain[chip][addr-4] & 0x7f; |
ucontrol->value.integer.value[0] = snd_akm4xxx_get_ipga(ak, chip, addr) & 0x7f; |
282 |
return 0; |
return 0; |
283 |
} |
} |
284 |
|
|
288 |
int chip = AK_GET_CHIP(kcontrol->private_value); |
int chip = AK_GET_CHIP(kcontrol->private_value); |
289 |
int addr = AK_GET_ADDR(kcontrol->private_value); |
int addr = AK_GET_ADDR(kcontrol->private_value); |
290 |
unsigned char nval = (ucontrol->value.integer.value[0] % 37) | 0x80; |
unsigned char nval = (ucontrol->value.integer.value[0] % 37) | 0x80; |
291 |
int change = ak->ipga_gain[chip][addr] != nval; |
int change = snd_akm4xxx_get_ipga(ak, chip, addr) != nval; |
292 |
if (change) |
if (change) |
293 |
snd_akm4xxx_write(ak, chip, addr, nval); |
snd_akm4xxx_write(ak, chip, addr, nval); |
294 |
return change; |
return change; |
314 |
int chip = AK_GET_CHIP(kcontrol->private_value); |
int chip = AK_GET_CHIP(kcontrol->private_value); |
315 |
int addr = AK_GET_ADDR(kcontrol->private_value); |
int addr = AK_GET_ADDR(kcontrol->private_value); |
316 |
int shift = AK_GET_SHIFT(kcontrol->private_value); |
int shift = AK_GET_SHIFT(kcontrol->private_value); |
317 |
ucontrol->value.enumerated.item[0] = (ak->images[chip][addr] >> shift) & 3; |
ucontrol->value.enumerated.item[0] = (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3; |
318 |
return 0; |
return 0; |
319 |
} |
} |
320 |
|
|
327 |
unsigned char nval = ucontrol->value.enumerated.item[0] & 3; |
unsigned char nval = ucontrol->value.enumerated.item[0] & 3; |
328 |
int change; |
int change; |
329 |
|
|
330 |
nval = (nval << shift) | (ak->images[chip][addr] & ~(3 << shift)); |
nval = (nval << shift) | (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift)); |
331 |
change = ak->images[chip][addr] != nval; |
change = snd_akm4xxx_get(ak, chip, addr) != nval; |
332 |
if (change) |
if (change) |
333 |
snd_akm4xxx_write(ak, chip, addr, nval); |
snd_akm4xxx_write(ak, chip, addr, nval); |
334 |
return change; |
return change; |