Commit b97f6bfd authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Fix error handling in patch_ca0132.c

In patch_ca0132.c, the error returned from chipio_write() isn't checked
always.  Also, the power-up/down sequence isn't tracked properly in some
error paths.
Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent cfd0d11e
...@@ -728,18 +728,19 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol, ...@@ -728,18 +728,19 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol,
err = chipio_read(codec, REG_CODEC_MUTE, &data); err = chipio_read(codec, REG_CODEC_MUTE, &data);
if (err < 0) if (err < 0)
return err; goto exit;
/* *valp 0 is mute, 1 is unmute */ /* *valp 0 is mute, 1 is unmute */
data = (data & 0x7f) | (*valp ? 0 : 0x80); data = (data & 0x7f) | (*valp ? 0 : 0x80);
chipio_write(codec, REG_CODEC_MUTE, data); err = chipio_write(codec, REG_CODEC_MUTE, data);
if (err < 0) if (err < 0)
return err; goto exit;
spec->curr_hp_switch = *valp; spec->curr_hp_switch = *valp;
exit:
snd_hda_power_down(codec); snd_hda_power_down(codec);
return 1; return err < 0 ? err : 1;
} }
static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol, static int ca0132_speaker_switch_get(struct snd_kcontrol *kcontrol,
...@@ -770,18 +771,19 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol, ...@@ -770,18 +771,19 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol,
err = chipio_read(codec, REG_CODEC_MUTE, &data); err = chipio_read(codec, REG_CODEC_MUTE, &data);
if (err < 0) if (err < 0)
return err; goto exit;
/* *valp 0 is mute, 1 is unmute */ /* *valp 0 is mute, 1 is unmute */
data = (data & 0xef) | (*valp ? 0 : 0x10); data = (data & 0xef) | (*valp ? 0 : 0x10);
chipio_write(codec, REG_CODEC_MUTE, data); err = chipio_write(codec, REG_CODEC_MUTE, data);
if (err < 0) if (err < 0)
return err; goto exit;
spec->curr_speaker_switch = *valp; spec->curr_speaker_switch = *valp;
exit:
snd_hda_power_down(codec); snd_hda_power_down(codec);
return 1; return err < 0 ? err : 1;
} }
static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol, static int ca0132_hp_volume_get(struct snd_kcontrol *kcontrol,
...@@ -819,25 +821,26 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol, ...@@ -819,25 +821,26 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol,
err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data); err = chipio_read(codec, REG_CODEC_HP_VOL_L, &data);
if (err < 0) if (err < 0)
return err; goto exit;
val = 31 - left_vol; val = 31 - left_vol;
data = (data & 0xe0) | val; data = (data & 0xe0) | val;
chipio_write(codec, REG_CODEC_HP_VOL_L, data); err = chipio_write(codec, REG_CODEC_HP_VOL_L, data);
if (err < 0) if (err < 0)
return err; goto exit;
val = 31 - right_vol; val = 31 - right_vol;
data = (data & 0xe0) | val; data = (data & 0xe0) | val;
chipio_write(codec, REG_CODEC_HP_VOL_R, data); err = chipio_write(codec, REG_CODEC_HP_VOL_R, data);
if (err < 0) if (err < 0)
return err; goto exit;
spec->curr_hp_volume[0] = left_vol; spec->curr_hp_volume[0] = left_vol;
spec->curr_hp_volume[1] = right_vol; spec->curr_hp_volume[1] = right_vol;
exit:
snd_hda_power_down(codec); snd_hda_power_down(codec);
return 1; return err < 0 ? err : 1;
} }
static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid) static int add_hp_switch(struct hda_codec *codec, hda_nid_t nid)
...@@ -936,6 +939,8 @@ static int ca0132_build_controls(struct hda_codec *codec) ...@@ -936,6 +939,8 @@ static int ca0132_build_controls(struct hda_codec *codec)
if (err < 0) if (err < 0)
return err; return err;
err = add_in_volume(codec, spec->dig_in, "IEC958"); err = add_in_volume(codec, spec->dig_in, "IEC958");
if (err < 0)
return err;
} }
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