Skip to contentSkip to conversation

ALSA: hda ca0132 - remove unused error handling code

PATCH In review Dan Carpenter 2 participants 3 messages Feb 7, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ALSA: hda ca0132 - remove unused error handling code

We never save the return value from chipio_write() so "err" is always zero here, not less than zero.

---
The other option would be to save the return value. I don't have the hardware and I worried that there was a reason we don't save it. The current code is misleading because it looks like it's checked until you notice that the "err = " bit is missing.

sound/pci/hda/patch_ca0132.c +0 -8
index 35abe3c..92f1f0c 100644
@@ -733,8 +733,6 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol,
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0x7f) | (*valp ? 0 : 0x80);
 	chipio_write(codec, REG_CODEC_MUTE, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_hp_switch = *valp;
 
@@ -775,8 +773,6 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol,
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0xef) | (*valp ? 0 : 0x10);
 	chipio_write(codec, REG_CODEC_MUTE, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_speaker_switch = *valp;
 
@@ -824,14 +820,10 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol,
 	val = 31 - left_vol;
 	data = (data & 0xe0) | val;
 	chipio_write(codec, REG_CODEC_HP_VOL_L, data);
-	if (err < 0)
-		return err;
 
 	val = 31 - right_vol;
 	data = (data & 0xe0) | val;
 	chipio_write(codec, REG_CODEC_HP_VOL_R, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_hp_volume[0] = left_vol;
 	spec->curr_hp_volume[1] = right_vol;
#1 lore raw

At Tue, 7 Feb 2012 10:19:32 +0300,

Quoted 7 lines · Dan Carpenter

We never save the return value from chipio_write() so "err" is always zero here, not less than zero.

---
The other option would be to save the return value.

Yes, this should be a better option. chipio_write() may fail indeed.

But then your report spotted another bug. It doesn't handle snd_hda_power_up|down() correctly in the error path. It must be fixed as well.

I'll fix these all up.

Quoted 4 lines

I don't have the
hardware and I worried that there was a reason we don't save it. The current code is misleading because it looks like it's checked until you notice that the "err = " bit is missing.

thanks,

Takashi

Quoted 39 lines
sound/pci/hda/patch_ca0132.c +0 -8
index 35abe3c..92f1f0c 100644
@@ -733,8 +733,6 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol,
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0x7f) | (*valp ? 0 : 0x80);
 	chipio_write(codec, REG_CODEC_MUTE, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_hp_switch = *valp;
 
@@ -775,8 +773,6 @@ static int ca0132_speaker_switch_put(struct snd_kcontrol *kcontrol,
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0xef) | (*valp ? 0 : 0x10);
 	chipio_write(codec, REG_CODEC_MUTE, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_speaker_switch = *valp;
 
@@ -824,14 +820,10 @@ static int ca0132_hp_volume_put(struct snd_kcontrol *kcontrol,
 	val = 31 - left_vol;
 	data = (data & 0xe0) | val;
 	chipio_write(codec, REG_CODEC_HP_VOL_L, data);
-	if (err < 0)
-		return err;
 
 	val = 31 - right_vol;
 	data = (data & 0xe0) | val;
 	chipio_write(codec, REG_CODEC_HP_VOL_R, data);
-	if (err < 0)
-		return err;
 
 	spec->curr_hp_volume[0] = left_vol;
 	spec->curr_hp_volume[1] = right_vol;
#2 lore raw

At Tue, 07 Feb 2012 10:59:48 +0100,

Quoted 11 lines · Takashi Iwai

At Tue, 7 Feb 2012 10:19:32 +0300,

Quoted 7 lines · Dan Carpenter

We never save the return value from chipio_write() so "err" is always zero here, not less than zero.

---
The other option would be to save the return value.

Quoted 7 lines

Yes, this should be a better option. chipio_write() may fail indeed.

But then your report spotted another bug. It doesn't handle snd_hda_power_up|down() correctly in the error path. It must be fixed as well.

I'll fix these all up.

FWIW, below is the fix patch.

Takashi

---
From: Takashi Iwai <[email protected]>
Subject: [PATCH] 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.

---
 sound/pci/hda/patch_ca0132.c |   33 +++++++++++++++++++--------------
 1 files changed, 19 insertions(+), 14 deletions(-)
sound/pci/hda/patch_ca0132.c +19 -14
index 35abe3c..21d91d5 100644
@@ -728,18 +728,19 @@ static int ca0132_hp_switch_put(struct snd_kcontrol *kcontrol,
 
 	err = chipio_read(codec, REG_CODEC_MUTE, &data);
 	if (err < 0)
-		return err;
+		goto exit;
 
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0x7f) | (*valp ? 0 : 0x80);
-	chipio_write(codec, REG_CODEC_MUTE, data);
+	err = chipio_write(codec, REG_CODEC_MUTE, data);
 	if (err < 0)
-		return err;
+		goto exit;
 
 	spec->curr_hp_switch = *valp;
 
+ exit:
 	snd_hda_power_down(codec);
-	return 1;
+	return err < 0 ? err : 1;
 }
 
 static int ca0132_speaker_switch_get(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);
 	if (err < 0)
-		return err;
+		goto exit;
 
 	/* *valp 0 is mute, 1 is unmute */
 	data = (data & 0xef) | (*valp ? 0 : 0x10);
-	chipio_write(codec, REG_CODEC_MUTE, data);
+	err = chipio_write(codec, REG_CODEC_MUTE, data);
 	if (err < 0)
-		return err;
+		goto exit;
 
 	spec->curr_speaker_switch = *valp;
 
+ exit:
 	snd_hda_power_down(codec);
-	return 1;
+	return err < 0 ? err : 1;
 }
 
 static int ca0132_hp_volume_get(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);
 	if (err < 0)
-		return err;
+		goto exit;
 
 	val = 31 - left_vol;
 	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)
-		return err;
+		goto exit;
 
 	val = 31 - right_vol;
 	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)
-		return err;
+		goto exit;
 
 	spec->curr_hp_volume[0] = left_vol;
 	spec->curr_hp_volume[1] = right_vol;
 
+ exit:
 	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)
@@ -936,6 +939,8 @@ static int ca0132_build_controls(struct hda_codec *codec)
 		if (err < 0)
 			return err;
 		err = add_in_volume(codec, spec->dig_in, "IEC958");
+		if (err < 0)
+			return err;
 	}
 	return 0;
 }
Signature · 1 line
1.7.9.rc2