Commit 03c2d87a authored by Andreas Mohr's avatar Andreas Mohr Committed by Takashi Iwai

ALSA: ac97: replace open-coded, error-prone stuff with AC97 bit defines

Use AC97 macros (sometimes already existing, or newly added)
instead of error-prone repetition of open-coded values.
Signed-off-by: default avatarAndreas Mohr <andi@lisas.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3347b26c
...@@ -96,6 +96,10 @@ ...@@ -96,6 +96,10 @@
#define AC97_FUNC_INFO 0x68 /* Function Information */ #define AC97_FUNC_INFO 0x68 /* Function Information */
#define AC97_SENSE_INFO 0x6a /* Sense Details */ #define AC97_SENSE_INFO 0x6a /* Sense Details */
/* volume controls */
#define AC97_MUTE_MASK_MONO 0x8000
#define AC97_MUTE_MASK_STEREO 0x8080
/* slot allocation */ /* slot allocation */
#define AC97_SLOT_TAG 0 #define AC97_SLOT_TAG 0
#define AC97_SLOT_CMD_ADDR 1 #define AC97_SLOT_CMD_ADDR 1
...@@ -138,6 +142,7 @@ ...@@ -138,6 +142,7 @@
#define AC97_BC_18BIT_ADC 0x0100 /* 18-bit ADC resolution */ #define AC97_BC_18BIT_ADC 0x0100 /* 18-bit ADC resolution */
#define AC97_BC_20BIT_ADC 0x0200 /* 20-bit ADC resolution */ #define AC97_BC_20BIT_ADC 0x0200 /* 20-bit ADC resolution */
#define AC97_BC_ADC_MASK 0x0300 #define AC97_BC_ADC_MASK 0x0300
#define AC97_BC_3D_TECH_ID_MASK 0x7c00 /* Per-vendor ID of 3D enhancement */
/* general purpose */ /* general purpose */
#define AC97_GP_DRSS_MASK 0x0c00 /* double rate slot select */ #define AC97_GP_DRSS_MASK 0x0c00 /* double rate slot select */
......
...@@ -590,9 +590,9 @@ static int snd_ac97_put_volsw(struct snd_kcontrol *kcontrol, ...@@ -590,9 +590,9 @@ static int snd_ac97_put_volsw(struct snd_kcontrol *kcontrol,
snd_ac97_page_restore(ac97, page_save); snd_ac97_page_restore(ac97, page_save);
#ifdef CONFIG_SND_AC97_POWER_SAVE #ifdef CONFIG_SND_AC97_POWER_SAVE
/* check analog mixer power-down */ /* check analog mixer power-down */
if ((val_mask & 0x8000) && if ((val_mask & AC97_PD_EAPD) &&
(kcontrol->private_value & (1<<30))) { (kcontrol->private_value & (1<<30))) {
if (val & 0x8000) if (val & AC97_PD_EAPD)
ac97->power_up &= ~(1 << (reg>>1)); ac97->power_up &= ~(1 << (reg>>1));
else else
ac97->power_up |= 1 << (reg>>1); ac97->power_up |= 1 << (reg>>1);
...@@ -1035,20 +1035,20 @@ static int snd_ac97_dev_free(struct snd_device *device) ...@@ -1035,20 +1035,20 @@ static int snd_ac97_dev_free(struct snd_device *device)
static int snd_ac97_try_volume_mix(struct snd_ac97 * ac97, int reg) static int snd_ac97_try_volume_mix(struct snd_ac97 * ac97, int reg)
{ {
unsigned short val, mask = 0x8000; unsigned short val, mask = AC97_MUTE_MASK_MONO;
if (! snd_ac97_valid_reg(ac97, reg)) if (! snd_ac97_valid_reg(ac97, reg))
return 0; return 0;
switch (reg) { switch (reg) {
case AC97_MASTER_TONE: case AC97_MASTER_TONE:
return ac97->caps & 0x04 ? 1 : 0; return ac97->caps & AC97_BC_BASS_TREBLE ? 1 : 0;
case AC97_HEADPHONE: case AC97_HEADPHONE:
return ac97->caps & 0x10 ? 1 : 0; return ac97->caps & AC97_BC_HEADPHONE ? 1 : 0;
case AC97_REC_GAIN_MIC: case AC97_REC_GAIN_MIC:
return ac97->caps & 0x01 ? 1 : 0; return ac97->caps & AC97_BC_DEDICATED_MIC ? 1 : 0;
case AC97_3D_CONTROL: case AC97_3D_CONTROL:
if (ac97->caps & 0x7c00) { if (ac97->caps & AC97_BC_3D_TECH_ID_MASK) {
val = snd_ac97_read(ac97, reg); val = snd_ac97_read(ac97, reg);
/* if nonzero - fixed and we can't set it */ /* if nonzero - fixed and we can't set it */
return val == 0; return val == 0;
...@@ -1104,7 +1104,10 @@ static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned cha ...@@ -1104,7 +1104,10 @@ static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned cha
*lo_max = *hi_max = 0; *lo_max = *hi_max = 0;
for (i = 0 ; i < ARRAY_SIZE(cbit); i++) { for (i = 0 ; i < ARRAY_SIZE(cbit); i++) {
unsigned short val; unsigned short val;
snd_ac97_write(ac97, reg, 0x8080 | cbit[i] | (cbit[i] << 8)); snd_ac97_write(
ac97, reg,
AC97_MUTE_MASK_STEREO | cbit[i] | (cbit[i] << 8)
);
/* Do the read twice due to buffers on some ac97 codecs. /* Do the read twice due to buffers on some ac97 codecs.
* e.g. The STAC9704 returns exactly what you wrote to the register * e.g. The STAC9704 returns exactly what you wrote to the register
* if you read it immediately. This causes the detect routine to fail. * if you read it immediately. This causes the detect routine to fail.
...@@ -1139,14 +1142,14 @@ static void snd_ac97_change_volume_params2(struct snd_ac97 * ac97, int reg, int ...@@ -1139,14 +1142,14 @@ static void snd_ac97_change_volume_params2(struct snd_ac97 * ac97, int reg, int
unsigned short val, val1; unsigned short val, val1;
*max = 63; *max = 63;
val = 0x8080 | (0x20 << shift); val = AC97_MUTE_MASK_STEREO | (0x20 << shift);
snd_ac97_write(ac97, reg, val); snd_ac97_write(ac97, reg, val);
val1 = snd_ac97_read(ac97, reg); val1 = snd_ac97_read(ac97, reg);
if (val != val1) { if (val != val1) {
*max = 31; *max = 31;
} }
/* reset volume to zero */ /* reset volume to zero */
snd_ac97_write_cache(ac97, reg, 0x8080); snd_ac97_write_cache(ac97, reg, AC97_MUTE_MASK_STEREO);
} }
static inline int printable(unsigned int x) static inline int printable(unsigned int x)
...@@ -1183,16 +1186,16 @@ static int snd_ac97_cmute_new_stereo(struct snd_card *card, char *name, int reg, ...@@ -1183,16 +1186,16 @@ static int snd_ac97_cmute_new_stereo(struct snd_card *card, char *name, int reg,
if (! snd_ac97_valid_reg(ac97, reg)) if (! snd_ac97_valid_reg(ac97, reg))
return 0; return 0;
mute_mask = 0x8000; mute_mask = AC97_MUTE_MASK_MONO;
val = snd_ac97_read(ac97, reg); val = snd_ac97_read(ac97, reg);
if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) { if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) {
/* check whether both mute bits work */ /* check whether both mute bits work */
val1 = val | 0x8080; val1 = val | AC97_MUTE_MASK_STEREO;
snd_ac97_write(ac97, reg, val1); snd_ac97_write(ac97, reg, val1);
if (val1 == snd_ac97_read(ac97, reg)) if (val1 == snd_ac97_read(ac97, reg))
mute_mask = 0x8080; mute_mask = AC97_MUTE_MASK_STEREO;
} }
if (mute_mask == 0x8080) { if (mute_mask == AC97_MUTE_MASK_STEREO) {
struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 15, 7, 1, 1); struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 15, 7, 1, 1);
if (check_amix) if (check_amix)
tmp.private_value |= (1 << 30); tmp.private_value |= (1 << 30);
...@@ -1268,9 +1271,11 @@ static int snd_ac97_cvol_new(struct snd_card *card, char *name, int reg, unsigne ...@@ -1268,9 +1271,11 @@ static int snd_ac97_cvol_new(struct snd_card *card, char *name, int reg, unsigne
err = snd_ctl_add(card, kctl); err = snd_ctl_add(card, kctl);
if (err < 0) if (err < 0)
return err; return err;
snd_ac97_write_cache(ac97, reg, snd_ac97_write_cache(
(snd_ac97_read(ac97, reg) & 0x8080) | ac97, reg,
lo_max | (hi_max << 8)); (snd_ac97_read(ac97, reg) & AC97_MUTE_MASK_STEREO)
| lo_max | (hi_max << 8)
);
return 0; return 0;
} }
...@@ -1332,7 +1337,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) ...@@ -1332,7 +1337,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
return err; return err;
} }
ac97->regs[AC97_CENTER_LFE_MASTER] = 0x8080; ac97->regs[AC97_CENTER_LFE_MASTER] = AC97_MUTE_MASK_STEREO;
/* build center controls */ /* build center controls */
if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER)) if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER))
...@@ -1410,8 +1415,12 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) ...@@ -1410,8 +1415,12 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_pc_beep[idx], ac97))) < 0) if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_pc_beep[idx], ac97))) < 0)
return err; return err;
set_tlv_db_scale(kctl, db_scale_4bit); set_tlv_db_scale(kctl, db_scale_4bit);
snd_ac97_write_cache(ac97, AC97_PC_BEEP, snd_ac97_write_cache(
snd_ac97_read(ac97, AC97_PC_BEEP) | 0x801e); ac97,
AC97_PC_BEEP,
(snd_ac97_read(ac97, AC97_PC_BEEP)
| AC97_MUTE_MASK_MONO | 0x001e)
);
} }
/* build Phone controls */ /* build Phone controls */
...@@ -1545,7 +1554,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) ...@@ -1545,7 +1554,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
} }
/* build Simulated Stereo Enhancement control */ /* build Simulated Stereo Enhancement control */
if (ac97->caps & 0x0008) { if (ac97->caps & AC97_BC_SIM_STEREO) {
if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_STEREO_ENHANCEMENT], ac97))) < 0) if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_STEREO_ENHANCEMENT], ac97))) < 0)
return err; return err;
} }
...@@ -1557,7 +1566,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97) ...@@ -1557,7 +1566,7 @@ static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
} }
/* build Loudness control */ /* build Loudness control */
if (ac97->caps & 0x0020) { if (ac97->caps & AC97_BC_LOUDNESS) {
if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOUDNESS], ac97))) < 0) if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOUDNESS], ac97))) < 0)
return err; return err;
} }
...@@ -2542,8 +2551,8 @@ void snd_ac97_resume(struct snd_ac97 *ac97) ...@@ -2542,8 +2551,8 @@ void snd_ac97_resume(struct snd_ac97 *ac97)
schedule_timeout_uninterruptible(1); schedule_timeout_uninterruptible(1);
} while (time_after_eq(end_time, jiffies)); } while (time_after_eq(end_time, jiffies));
/* FIXME: extra delay */ /* FIXME: extra delay */
ac97->bus->ops->write(ac97, AC97_MASTER, 0x8000); ac97->bus->ops->write(ac97, AC97_MASTER, AC97_MUTE_MASK_MONO);
if (snd_ac97_read(ac97, AC97_MASTER) != 0x8000) if (snd_ac97_read(ac97, AC97_MASTER) != AC97_MUTE_MASK_MONO)
msleep(250); msleep(250);
} else { } else {
end_time = jiffies + msecs_to_jiffies(100); end_time = jiffies + msecs_to_jiffies(100);
...@@ -2747,12 +2756,12 @@ static int master_mute_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem ...@@ -2747,12 +2756,12 @@ static int master_mute_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
int rshift = (kcontrol->private_value >> 12) & 0x0f; int rshift = (kcontrol->private_value >> 12) & 0x0f;
unsigned short mask; unsigned short mask;
if (shift != rshift) if (shift != rshift)
mask = 0x8080; mask = AC97_MUTE_MASK_STEREO;
else else
mask = 0x8000; mask = AC97_MUTE_MASK_MONO;
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, snd_ac97_update_bits(ac97, AC97_POWERDOWN, AC97_PD_EAPD,
(ac97->regs[AC97_MASTER] & mask) == mask ? (ac97->regs[AC97_MASTER] & mask) == mask ?
0x8000 : 0); AC97_PD_EAPD : 0);
} }
return err; return err;
} }
...@@ -2765,7 +2774,10 @@ static int tune_mute_led(struct snd_ac97 *ac97) ...@@ -2765,7 +2774,10 @@ static int tune_mute_led(struct snd_ac97 *ac97)
return -ENOENT; return -ENOENT;
msw->put = master_mute_sw_put; msw->put = master_mute_sw_put;
snd_ac97_remove_ctl(ac97, "External Amplifier", NULL); snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, 0x8000); /* mute LED on */ snd_ac97_update_bits(
ac97, AC97_POWERDOWN,
AC97_PD_EAPD, AC97_PD_EAPD /* mute LED on */
);
ac97->scaps |= AC97_SCAP_EAPD_LED; ac97->scaps |= AC97_SCAP_EAPD_LED;
return 0; return 0;
} }
...@@ -2780,12 +2792,12 @@ static int hp_master_mute_sw_put(struct snd_kcontrol *kcontrol, ...@@ -2780,12 +2792,12 @@ static int hp_master_mute_sw_put(struct snd_kcontrol *kcontrol,
int rshift = (kcontrol->private_value >> 12) & 0x0f; int rshift = (kcontrol->private_value >> 12) & 0x0f;
unsigned short mask; unsigned short mask;
if (shift != rshift) if (shift != rshift)
mask = 0x8080; mask = AC97_MUTE_MASK_STEREO;
else else
mask = 0x8000; mask = AC97_MUTE_MASK_MONO;
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, snd_ac97_update_bits(ac97, AC97_POWERDOWN, AC97_PD_EAPD,
(ac97->regs[AC97_MASTER] & mask) == mask ? (ac97->regs[AC97_MASTER] & mask) == mask ?
0x8000 : 0); AC97_PD_EAPD : 0);
} }
return err; return err;
} }
...@@ -2801,7 +2813,10 @@ static int tune_hp_mute_led(struct snd_ac97 *ac97) ...@@ -2801,7 +2813,10 @@ static int tune_hp_mute_led(struct snd_ac97 *ac97)
snd_ac97_remove_ctl(ac97, "External Amplifier", NULL); snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch"); snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume"); snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, 0x8000); /* mute LED on */ snd_ac97_update_bits(
ac97, AC97_POWERDOWN,
AC97_PD_EAPD, AC97_PD_EAPD /* mute LED on */
);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment