[alsa-devel] [PATCH] fix headphone settings and master volume (Conexant CX20551 0x103c30b2)

Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
With the following patch, the "Headphone" volume/switch work as intended, with no effect on other functionalities.
--- patch_conexant.c 2009-03-08 21:10:14.000000000 +0100 +++ patch_conexant.c.new 2009-03-08 21:09:51.000000000 +0100 @@ -1357,7 +1357,7 @@ {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 }, /* HP, Speaker */ {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, - {0x13, AC_VERB_SET_CONNECT_SEL,0x1}, + {0x13, AC_VERB_SET_CONNECT_SEL,0x0}, {0x1d, AC_VERB_SET_CONNECT_SEL,0x0}, /* Record selector: Mic */ {0x12, AC_VERB_SET_CONNECT_SEL,0x03},
Also, there is no "Master" control to set the volume for both speakers and headphones. The patch below adds a master volume (and a master switch) that work ok for me. By the way, with the patch the light on the mute button changes between blue and red, which is a nice plus.
--- patch_conexant.c 2009-03-08 21:11:14.000000000 +0100 +++ patch_conexant.c.new 2009-03-08 21:11:01.000000000 +0100 @@ -1293,6 +1293,15 @@ HDA_CODEC_MUTE("Speaker Playback Switch", 0x1d, 0x00, HDA_OUTPUT), HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), HDA_CODEC_MUTE("Headphone Playback Switch", 0x13, 0x00, HDA_OUTPUT), + HDA_BIND_VOL("Master Playback Volume", &cxt5047_bind_master_vol), + { + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, + .name = "Master Playback Switch", + .info = cxt_eapd_info, + .get = cxt_eapd_get, + .put = cxt5047_hp_master_sw_put, + .private_value = 0x13, + },
{} };
I am no expert of Conexant hardware and I don't know if those changes are correct for all the devices that share the same code (the 103c:30xx), but I'm confident that they are the right ones for the 103c:30b2 device.
Can someone take a look? Thanks.
Gregorio Guidi

At Sun, 8 Mar 2009 21:19:41 +0100, Gregorio Guidi wrote:
Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
Does the current driver work with model=laptop-hp option?
thanks,
Takashi

On Monday 09 March 2009 12:50:10 Takashi Iwai wrote:
At Sun, 8 Mar 2009 21:19:41 +0100,
Gregorio Guidi wrote:
Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
Does the current driver work with model=laptop-hp option?
I did try the laptop-hp option. I got only two controls: PCM and Master, PCM controlled both speakers and headphones, while Master controlled only the headphones (in fact the "Master" control for model=laptop-hp is the same as the "Headphone" control for model=laptop with the patch). There is no automute when plugging headphones.
By the way, I was incorrect: also with model=laptop (the default) "PCM" controls both speakers and headphones (PCM-2 only the speakers).
Let me know if you need info or you have something to test.
Gregorio Guidi

At Mon, 9 Mar 2009 15:49:47 +0100, Gregorio Guidi wrote:
On Monday 09 March 2009 12:50:10 Takashi Iwai wrote:
At Sun, 8 Mar 2009 21:19:41 +0100,
Gregorio Guidi wrote:
Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
Does the current driver work with model=laptop-hp option?
I did try the laptop-hp option. I got only two controls: PCM and Master, PCM controlled both speakers and headphones, while Master controlled only the headphones (in fact the "Master" control for model=laptop-hp is the same as the "Headphone" control for model=laptop with the patch). There is no automute when plugging headphones.
By the way, I was incorrect: also with model=laptop (the default) "PCM" controls both speakers and headphones (PCM-2 only the speakers).
OK.
Let me know if you need info or you have something to test.
Could you run alsa-info with --no-upload and give the generated file? The script is found at: http://www.alsa-project.org/alsa-info.sh
We can use vmaster to control these stuff nowadays without strange eapd hack for a master control.
thanks,
Takashi

On Monday 09 March 2009 16:04:56 Takashi Iwai wrote:
At Mon, 9 Mar 2009 15:49:47 +0100,
Gregorio Guidi wrote:
On Monday 09 March 2009 12:50:10 Takashi Iwai wrote:
At Sun, 8 Mar 2009 21:19:41 +0100,
Gregorio Guidi wrote:
Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
Does the current driver work with model=laptop-hp option?
I did try the laptop-hp option. I got only two controls: PCM and Master, PCM controlled both speakers and headphones, while Master controlled only the headphones (in fact the "Master" control for model=laptop-hp is the same as the "Headphone" control for model=laptop with the patch). There is no automute when plugging headphones.
By the way, I was incorrect: also with model=laptop (the default) "PCM" controls both speakers and headphones (PCM-2 only the speakers).
OK.
Let me know if you need info or you have something to test.
Could you run alsa-info with --no-upload and give the generated file? The script is found at: http://www.alsa-project.org/alsa-info.sh
We can use vmaster to control these stuff nowadays without strange eapd hack for a master control.
All right, alsa-info.txt is attached. Version running is the one in kernel 2.6.28.7 plus the two patches.
Gregorio

At Mon, 9 Mar 2009 20:19:35 +0100, Gregorio Guidi wrote:
On Monday 09 March 2009 16:04:56 Takashi Iwai wrote:
At Mon, 9 Mar 2009 15:49:47 +0100,
Gregorio Guidi wrote:
On Monday 09 March 2009 12:50:10 Takashi Iwai wrote:
At Sun, 8 Mar 2009 21:19:41 +0100,
Gregorio Guidi wrote:
Hi, I have an Intel HDA card, Conexant CX20551 (Waikiki) model, Subsystem Id: 0x103c30b2 (HP DV2000 series).
With these settings, there are 4 volume controls: "PCM-2" and "Speaker" to control speakers, "PCM" and "Headphone" to control headphones. At the moment "PCM-2", "Speaker", "PCM" work fine, but "Headphone" has no effect (also reported inside bug #3091).
Does the current driver work with model=laptop-hp option?
I did try the laptop-hp option. I got only two controls: PCM and Master, PCM controlled both speakers and headphones, while Master controlled only the headphones (in fact the "Master" control for model=laptop-hp is the same as the "Headphone" control for model=laptop with the patch). There is no automute when plugging headphones.
By the way, I was incorrect: also with model=laptop (the default) "PCM" controls both speakers and headphones (PCM-2 only the speakers).
OK.
Let me know if you need info or you have something to test.
Could you run alsa-info with --no-upload and give the generated file? The script is found at: http://www.alsa-project.org/alsa-info.sh
We can use vmaster to control these stuff nowadays without strange eapd hack for a master control.
All right, alsa-info.txt is attached. Version running is the one in kernel 2.6.28.7 plus the two patches.
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
and the snapshot tarball for external alsa-driver module build is
ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/snapshot/alsa-driver-snapshot.tar.gz
Takashi

On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there. There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
I think there is a problem with this changeset: http://git.kernel.org/?p=linux/kernel/git/tiwai/sound-2.6.git;a=commitdiff;h...
Specifically, I had to revert part of that patch to get all the functionality back. The bits I reverted are in the patch at the end of the mail.
It looks like these two lines: static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c }; ... {0x1d, AC_VERB_SET_CONNECT_SEL, 0x0}
are needed to have a working "Speaker" control, you probably know better than me what it means. I also readded the "PCM-2" lines. While not strictly necessary, if they are not there the speaker volume is stuck at a very low level and cannot be raised, as if the PCM-2 volume starts at a low value at boot. Actually, if I recall correctly the low speaker volume was a problem in early versions of the driver and the "PCM-2" controls were introduced for that reason. But obviously if there is a way to avoid the widget 0x1c and have a working "Speaker" control that would be best.
Hope this makes some sense to you.
Gregorio
--- patch_conexant.c.orig 2009-03-11 22:02:44.000000000 +0100 +++ patch_conexant.c 2009-03-11 22:03:09.000000000 +0100 @@ -1165,7 +1165,7 @@ /* Conexant 5047 specific */ #define CXT5047_SPDIF_OUT 0x11
-static hda_nid_t cxt5047_dac_nids[1] = { 0x10 }; /* 0x1c */ +static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c }; static hda_nid_t cxt5047_adc_nids[1] = { 0x12 }; static hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a };
@@ -1263,6 +1263,8 @@ HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT), + HDA_CODEC_VOLUME("PCM-2 Volume", 0x1c, 0x00, HDA_OUTPUT), + HDA_CODEC_MUTE("PCM-2 Switch", 0x1c, 0x00, HDA_OUTPUT), { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Master Playback Switch", @@ -1294,7 +1296,7 @@ /* HP, Speaker */ {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */ - {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mixer(0x19) */ + {0x1d, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */ /* Record selector: Mic */ {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE,

At Wed, 11 Mar 2009 22:22:39 +0100, Gregorio Guidi wrote:
On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there.
Thanks for testing.
There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
Hm, doesn't "Speaker" give any change if you unplug the headphone? It should change the output volume of widget 0x1d. If it's true, there can be a few reasons:
A. The real speaker output pin isn't 0x1d but another pin
B. The widget 0x1d has a problem with connection to 0x19
C. The widget 0x1d has no output amp control despite the description
I think there is a problem with this changeset: http://git.kernel.org/?p=linux/kernel/git/tiwai/sound-2.6.git;a=commitdiff;h...
Specifically, I had to revert part of that patch to get all the functionality back. The bits I reverted are in the patch at the end of the mail.
It looks like these two lines: static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c }; ... {0x1d, AC_VERB_SET_CONNECT_SEL, 0x0}
are needed to have a working "Speaker" control, you probably know better than me what it means. I also readded the "PCM-2" lines. While not strictly necessary, if they are not there the speaker volume is stuck at a very low level and cannot be raised, as if the PCM-2 volume starts at a low value at boot. Actually, if I recall correctly the low speaker volume was a problem in early versions of the driver and the "PCM-2" controls were introduced for that reason. But obviously if there is a way to avoid the widget 0x1c and have a working "Speaker" control that would be best.
With this change, still "Headphone" volume control (and "Master") doesn't work? If so, the case C above must be correct.
Also, try to figure out whether case A is right or not. You can change the amp volume or the connection of each pin widget via hda-verb (or hda_analyzer), assuming you built with hwdep enabled. See Documentation/sounds/alsa/HD-Audio.txt for details.
Anyway, it'd be also helpful if you give alsa-info output on both working and non-working cases (also with HP plugged / unplugged).
thanks,
Takashi
Hope this makes some sense to you.
Gregorio
--- patch_conexant.c.orig 2009-03-11 22:02:44.000000000 +0100 +++ patch_conexant.c 2009-03-11 22:03:09.000000000 +0100 @@ -1165,7 +1165,7 @@ /* Conexant 5047 specific */ #define CXT5047_SPDIF_OUT 0x11
-static hda_nid_t cxt5047_dac_nids[1] = { 0x10 }; /* 0x1c */ +static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c }; static hda_nid_t cxt5047_adc_nids[1] = { 0x12 }; static hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a };
@@ -1263,6 +1263,8 @@ HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT), HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT), HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT),
HDA_CODEC_VOLUME("PCM-2 Volume", 0x1c, 0x00, HDA_OUTPUT),
HDA_CODEC_MUTE("PCM-2 Switch", 0x1c, 0x00, HDA_OUTPUT), { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Master Playback Switch",
@@ -1294,7 +1296,7 @@ /* HP, Speaker */ {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */
{0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mixer(0x19) */
{0x1d, AC_VERB_SET_CONNECT_SEL, 0x0}, /* mixer(0x19) */ /* Record selector: Mic */ {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, {0x19, AC_VERB_SET_AMP_GAIN_MUTE,

On Thursday 12 March 2009 07:43:27 Takashi Iwai wrote:
At Wed, 11 Mar 2009 22:22:39 +0100,
Gregorio Guidi wrote:
On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there.
Thanks for testing.
There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
Hm, doesn't "Speaker" give any change if you unplug the headphone? It should change the output volume of widget 0x1d. If it's true, there can be a few reasons:
A. The real speaker output pin isn't 0x1d but another pin
B. The widget 0x1d has a problem with connection to 0x19
C. The widget 0x1d has no output amp control despite the description
To clarify: the speakers make sounds, but volume control and muting do not work.
Actually, now that I start to understand how these widget connections work, I see the problem is simpler: after changing the 0x1d connection (routing the speakers to 0x19) with {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, you have to update the other places where the 0x1d widget is used (see patch). This also explains the problem originally reported where Headphone didn't work (here and in bug #3091).
With just the following patch applied on top of the git tree everything works nicely (Headphone, Speaker, Master, automute all work as expected).
diff -Nur sound-2.6.git.orig/sound/pci/hda/patch_conexant.c sound-2.6.git/sound/pci/hda/patch_conexant.c --- sound-2.6.git.orig/sound/pci/hda/patch_conexant.c 2009-03-12 14:56:20.000000000 +0100 +++ sound-2.6.git/sound/pci/hda/patch_conexant.c 2009-03-12 14:29:48.000000000 +0100 @@ -1196,7 +1196,7 @@ * the headphone jack */ bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE; - snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, + snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits); bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE; snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0, @@ -1214,7 +1214,7 @@ AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; - snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, + snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits); }
@@ -1276,7 +1276,7 @@ };
static struct snd_kcontrol_new cxt5047_hp_spk_mixers[] = { - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x00, HDA_OUTPUT), + HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x01, HDA_OUTPUT), HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), {} };

At Thu, 12 Mar 2009 15:00:35 +0100, Gregorio Guidi wrote:
On Thursday 12 March 2009 07:43:27 Takashi Iwai wrote:
At Wed, 11 Mar 2009 22:22:39 +0100,
Gregorio Guidi wrote:
On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there.
Thanks for testing.
There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
Hm, doesn't "Speaker" give any change if you unplug the headphone? It should change the output volume of widget 0x1d. If it's true, there can be a few reasons:
A. The real speaker output pin isn't 0x1d but another pin
B. The widget 0x1d has a problem with connection to 0x19
C. The widget 0x1d has no output amp control despite the description
To clarify: the speakers make sounds, but volume control and muting do not work.
Actually, now that I start to understand how these widget connections work, I see the problem is simpler: after changing the 0x1d connection (routing the speakers to 0x19) with {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, you have to update the other places where the 0x1d widget is used (see patch). This also explains the problem originally reported where Headphone didn't work (here and in bug #3091).
With just the following patch applied on top of the git tree everything works nicely (Headphone, Speaker, Master, automute all work as expected).
Wow, that's a nice finding! Yes, this explains everything.
In the HD-audio specification, the amp volume selection of a pin widget is defined ambiguously. Usually, the input amp takes the index, at least for other widget types. However, the input amp for a pin widget means the recording (the "input" from the pin jack) while the output amp corresponds to the output level from the jack. So, there is an inconsistency in the definition.
Normally, the other vendors don't use the index for the pin output amp -- i.e. no index selection for output amps. But it seems that conexant codec uses it. That's why we are fooled by this for such a long time...
Anyway, the patch looks good. Could you give your sign-off?
thanks,
Takashi
diff -Nur sound-2.6.git.orig/sound/pci/hda/patch_conexant.c sound-2.6.git/sound/pci/hda/patch_conexant.c --- sound-2.6.git.orig/sound/pci/hda/patch_conexant.c 2009-03-12 14:56:20.000000000 +0100 +++ sound-2.6.git/sound/pci/hda/patch_conexant.c 2009-03-12 14:29:48.000000000 +0100 @@ -1196,7 +1196,7 @@ * the headphone jack */ bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE;
snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0,
snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits); bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE; snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0,
@@ -1214,7 +1214,7 @@ AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0;
snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0,
snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits);
}
@@ -1276,7 +1276,7 @@ };
static struct snd_kcontrol_new cxt5047_hp_spk_mixers[] = {
HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x00, HDA_OUTPUT),
HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x01, HDA_OUTPUT), HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), {}
};

On Thursday 12 March 2009 15:18:56 Takashi Iwai wrote:
At Thu, 12 Mar 2009 15:00:35 +0100,
Gregorio Guidi wrote:
On Thursday 12 March 2009 07:43:27 Takashi Iwai wrote:
At Wed, 11 Mar 2009 22:22:39 +0100,
Gregorio Guidi wrote:
On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there.
Thanks for testing.
There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
Hm, doesn't "Speaker" give any change if you unplug the headphone? It should change the output volume of widget 0x1d. If it's true, there can be a few reasons:
A. The real speaker output pin isn't 0x1d but another pin
B. The widget 0x1d has a problem with connection to 0x19
C. The widget 0x1d has no output amp control despite the description
To clarify: the speakers make sounds, but volume control and muting do not work.
Actually, now that I start to understand how these widget connections work, I see the problem is simpler: after changing the 0x1d connection (routing the speakers to 0x19) with {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, you have to update the other places where the 0x1d widget is used (see patch). This also explains the problem originally reported where Headphone didn't work (here and in bug #3091).
With just the following patch applied on top of the git tree everything works nicely (Headphone, Speaker, Master, automute all work as expected).
Wow, that's a nice finding! Yes, this explains everything.
In the HD-audio specification, the amp volume selection of a pin widget is defined ambiguously. Usually, the input amp takes the index, at least for other widget types. However, the input amp for a pin widget means the recording (the "input" from the pin jack) while the output amp corresponds to the output level from the jack. So, there is an inconsistency in the definition.
Normally, the other vendors don't use the index for the pin output amp -- i.e. no index selection for output amps. But it seems that conexant codec uses it. That's why we are fooled by this for such a long time...
Anyway, the patch looks good. Could you give your sign-off?
Sure.
Update the places where the 0x1d widget is used for Conexant 5047, fixing mismatch introduced after changing the connection.
Signed-off-by: Gregorio Guidi gregorio.guidi@gmail.com
diff -Nur sound-2.6.git.orig/sound/pci/hda/patch_conexant.c sound-2.6.git/sound/pci/hda/patch_conexant.c --- sound-2.6.git.orig/sound/pci/hda/patch_conexant.c 2009-03-12 14:56:20.000000000 +0100 +++ sound-2.6.git/sound/pci/hda/patch_conexant.c 2009-03-12 14:29:48.000000000 +0100 @@ -1196,7 +1196,7 @@ * the headphone jack */ bits = (!spec->hp_present && spec->cur_eapd) ? 0 : HDA_AMP_MUTE; - snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, + snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits); bits = spec->cur_eapd ? 0 : HDA_AMP_MUTE; snd_hda_codec_amp_stereo(codec, 0x13, HDA_OUTPUT, 0, @@ -1214,7 +1214,7 @@ AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; - snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0, + snd_hda_codec_amp_stereo(codec, 0x1d, HDA_OUTPUT, 0x01, HDA_AMP_MUTE, bits); }
@@ -1276,7 +1276,7 @@ };
static struct snd_kcontrol_new cxt5047_hp_spk_mixers[] = { - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x00, HDA_OUTPUT), + HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x01, HDA_OUTPUT), HDA_CODEC_VOLUME("Headphone Playback Volume", 0x13, 0x00, HDA_OUTPUT), {} };

At Thu, 12 Mar 2009 15:35:37 +0100, Gregorio Guidi wrote:
On Thursday 12 March 2009 15:18:56 Takashi Iwai wrote:
At Thu, 12 Mar 2009 15:00:35 +0100,
Gregorio Guidi wrote:
On Thursday 12 March 2009 07:43:27 Takashi Iwai wrote:
At Wed, 11 Mar 2009 22:22:39 +0100,
Gregorio Guidi wrote:
On Tuesday 10 March 2009 15:49:38 Takashi Iwai wrote:
At Mon, 9 Mar 2009 20:19:35 +0100,
...
Thanks, that helps for debugging.
Looking through the current patch_conexant.c, there are other messy codes there, too. So I cleaned up and fixed it on sound git tree now. Any chance to try it out? The GIT tree is found at:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
I managed to test a kernel snapshot with the latest changes, thanks for taking the time to refactor and clean up the code there.
Thanks for testing.
There are still issues, though: at the moment, the "Speaker" control does not work. Consequently, automute does not work and Master only controls headphones.
Hm, doesn't "Speaker" give any change if you unplug the headphone? It should change the output volume of widget 0x1d. If it's true, there can be a few reasons:
A. The real speaker output pin isn't 0x1d but another pin
B. The widget 0x1d has a problem with connection to 0x19
C. The widget 0x1d has no output amp control despite the description
To clarify: the speakers make sounds, but volume control and muting do not work.
Actually, now that I start to understand how these widget connections work, I see the problem is simpler: after changing the 0x1d connection (routing the speakers to 0x19) with {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, you have to update the other places where the 0x1d widget is used (see patch). This also explains the problem originally reported where Headphone didn't work (here and in bug #3091).
With just the following patch applied on top of the git tree everything works nicely (Headphone, Speaker, Master, automute all work as expected).
Wow, that's a nice finding! Yes, this explains everything.
In the HD-audio specification, the amp volume selection of a pin widget is defined ambiguously. Usually, the input amp takes the index, at least for other widget types. However, the input amp for a pin widget means the recording (the "input" from the pin jack) while the output amp corresponds to the output level from the jack. So, there is an inconsistency in the definition.
Normally, the other vendors don't use the index for the pin output amp -- i.e. no index selection for output amps. But it seems that conexant codec uses it. That's why we are fooled by this for such a long time...
Anyway, the patch looks good. Could you give your sign-off?
Sure.
Update the places where the 0x1d widget is used for Conexant 5047, fixing mismatch introduced after changing the connection.
Signed-off-by: Gregorio Guidi gregorio.guidi@gmail.com
Thanks, applied now.
Takashi
participants (2)
-
Gregorio Guidi
-
Takashi Iwai