aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/ac97/ac97_codec.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2005-04-07 09:53:20 -0400
committerJaroslav Kysela <perex@suse.cz>2005-05-29 03:58:28 -0400
commit5f0dccf8500b0cc2ff247f626bc249bc184fd184 (patch)
treeef8402fe29a0d5559ead12085cf1c927fa72670f /sound/pci/ac97/ac97_codec.c
parent55911694bf5edf15328dc6558fa3f432d52015ee (diff)
[ALSA] Add CM9780 support, fix CM9761 SPDIF
AC97 Codec - Added CM9780 patch - Fix the SPDIF support on CM9761/CM9780 - Allow the generic enum callback to pass any number (not power of 2) as the value mask Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/ac97/ac97_codec.c')
-rw-r--r--sound/pci/ac97/ac97_codec.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
index 4ece2053bb13..61549b1eb59a 100644
--- a/sound/pci/ac97/ac97_codec.c
+++ b/sound/pci/ac97/ac97_codec.c
@@ -120,6 +120,7 @@ static const ac97_codec_id_t snd_ac97_codec_ids[] = {
120{ 0x414c4770, 0xfffffff0, "ALC203", NULL, NULL }, 120{ 0x414c4770, 0xfffffff0, "ALC203", NULL, NULL },
121{ 0x434d4941, 0xffffffff, "CMI9738", patch_cm9738, NULL }, 121{ 0x434d4941, 0xffffffff, "CMI9738", patch_cm9738, NULL },
122{ 0x434d4961, 0xffffffff, "CMI9739", patch_cm9739, NULL }, 122{ 0x434d4961, 0xffffffff, "CMI9739", patch_cm9739, NULL },
123{ 0x434d4969, 0xffffffff, "CMI9780", patch_cm9780, NULL },
123{ 0x434d4978, 0xffffffff, "CMI9761", patch_cm9761, NULL }, 124{ 0x434d4978, 0xffffffff, "CMI9761", patch_cm9761, NULL },
124{ 0x434d4982, 0xffffffff, "CMI9761", patch_cm9761, NULL }, 125{ 0x434d4982, 0xffffffff, "CMI9761", patch_cm9761, NULL },
125{ 0x434d4983, 0xffffffff, "CMI9761", patch_cm9761, NULL }, 126{ 0x434d4983, 0xffffffff, "CMI9761", patch_cm9761, NULL },
@@ -462,12 +463,14 @@ int snd_ac97_get_enum_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * u
462{ 463{
463 ac97_t *ac97 = snd_kcontrol_chip(kcontrol); 464 ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
464 struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value; 465 struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
465 unsigned short val; 466 unsigned short val, bitmask;
466 467
468 for (bitmask = 1; bitmask > e->mask; bitmask <<= 1)
469 ;
467 val = snd_ac97_read_cache(ac97, e->reg); 470 val = snd_ac97_read_cache(ac97, e->reg);
468 ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (e->mask - 1); 471 ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
469 if (e->shift_l != e->shift_r) 472 if (e->shift_l != e->shift_r)
470 ucontrol->value.enumerated.item[1] = (val >> e->shift_r) & (e->mask - 1); 473 ucontrol->value.enumerated.item[1] = (val >> e->shift_r) & (bitmask - 1);
471 474
472 return 0; 475 return 0;
473} 476}
@@ -477,17 +480,19 @@ int snd_ac97_put_enum_double(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * u
477 ac97_t *ac97 = snd_kcontrol_chip(kcontrol); 480 ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
478 struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value; 481 struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
479 unsigned short val; 482 unsigned short val;
480 unsigned short mask; 483 unsigned short mask, bitmask;
481 484
485 for (bitmask = 1; bitmask > e->mask; bitmask <<= 1)
486 ;
482 if (ucontrol->value.enumerated.item[0] > e->mask - 1) 487 if (ucontrol->value.enumerated.item[0] > e->mask - 1)
483 return -EINVAL; 488 return -EINVAL;
484 val = ucontrol->value.enumerated.item[0] << e->shift_l; 489 val = ucontrol->value.enumerated.item[0] << e->shift_l;
485 mask = (e->mask - 1) << e->shift_l; 490 mask = (bitmask - 1) << e->shift_l;
486 if (e->shift_l != e->shift_r) { 491 if (e->shift_l != e->shift_r) {
487 if (ucontrol->value.enumerated.item[1] > e->mask - 1) 492 if (ucontrol->value.enumerated.item[1] > e->mask - 1)
488 return -EINVAL; 493 return -EINVAL;
489 val |= ucontrol->value.enumerated.item[1] << e->shift_r; 494 val |= ucontrol->value.enumerated.item[1] << e->shift_r;
490 mask |= (e->mask - 1) << e->shift_r; 495 mask |= (bitmask - 1) << e->shift_r;
491 } 496 }
492 return snd_ac97_update_bits(ac97, e->reg, mask, val); 497 return snd_ac97_update_bits(ac97, e->reg, mask, val);
493} 498}