[alsa-devel] PATCH: ALSA - hda - Add support for Dell E6400 docking station
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
Regards, -- Christian Hergert
At Mon, 16 Nov 2009 15:20:32 -0800, Christian Hergert wrote:
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
The jack detection of the docking station is already there, but it seems just a missing call to toggle the power-map.
How about the patch below?
thanks,
Takashi
--- diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7f76a97..bd9a2dd 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4396,10 +4396,12 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); pin_ctl |= flag; - if (old_ctl != pin_ctl) + if (old_ctl != pin_ctl) { snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl); + stac_toggle_power_map(codec, nid, 1); + } }
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, @@ -4407,10 +4409,12 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, { unsigned int pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); - if (pin_ctl & flag) + if (pin_ctl & flag) { snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl & ~flag); + stac_toggle_power_map(codec, nid, 0); + } }
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
On Tue, Nov 17, 2009 at 1:37 AM, Takashi Iwai tiwai@suse.de wrote:
At Mon, 16 Nov 2009 15:20:32 -0800, Christian Hergert wrote:
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
The jack detection of the docking station is already there, but it seems just a missing call to toggle the power-map.
How about the patch below?
thanks,
Takashi
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7f76a97..bd9a2dd 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4396,10 +4396,12 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
pin_ctl |= flag;
- if (old_ctl != pin_ctl)
- if (old_ctl != pin_ctl) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
- stac_toggle_power_map(codec, nid, 1);
- }
}
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, @@ -4407,10 +4409,12 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, { unsigned int pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
- if (pin_ctl & flag)
- if (pin_ctl & flag) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl & ~flag);
- stac_toggle_power_map(codec, nid, 0);
- }
}
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
I tried this on top of 2.6.31.4 and, unfortunately, it did not solve the problem. I'll investigate a bit to figure out why.
-- Christian
At Tue, 17 Nov 2009 12:17:59 -0800, Christian Hergert wrote:
On Tue, Nov 17, 2009 at 1:37 AM, Takashi Iwai tiwai@suse.de wrote:
At Mon, 16 Nov 2009 15:20:32 -0800, Christian Hergert wrote:
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
The jack detection of the docking station is already there, but it seems just a missing call to toggle the power-map.
How about the patch below?
thanks,
Takashi
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7f76a97..bd9a2dd 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4396,10 +4396,12 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
pin_ctl |= flag;
- if (old_ctl != pin_ctl)
- if (old_ctl != pin_ctl) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
- stac_toggle_power_map(codec, nid, 1);
- }
}
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, @@ -4407,10 +4409,12 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, { unsigned int pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
- if (pin_ctl & flag)
- if (pin_ctl & flag) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl & ~flag);
- stac_toggle_power_map(codec, nid, 0);
- }
}
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
I tried this on top of 2.6.31.4 and, unfortunately, it did not solve the problem. I'll investigate a bit to figure out why.
Could you try 2.6.32-rc7 with the patch? (Or, you can just copy sound/pci/hda/* from 2.6.32 to 31, in this case.)
thanks,
Takashi
Hi,
On Tue, Nov 17, 2009 at 10:15 PM, Takashi Iwai tiwai@suse.de wrote:
At Tue, 17 Nov 2009 12:17:59 -0800, Christian Hergert wrote:
On Tue, Nov 17, 2009 at 1:37 AM, Takashi Iwai tiwai@suse.de wrote:
At Mon, 16 Nov 2009 15:20:32 -0800, Christian Hergert wrote:
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
The jack detection of the docking station is already there, but it seems just a missing call to toggle the power-map.
How about the patch below?
thanks,
Takashi
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7f76a97..bd9a2dd 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4396,10 +4396,12 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
pin_ctl |= flag;
- if (old_ctl != pin_ctl)
- if (old_ctl != pin_ctl) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
- stac_toggle_power_map(codec, nid, 1);
- }
}
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, @@ -4407,10 +4409,12 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, { unsigned int pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
- if (pin_ctl & flag)
- if (pin_ctl & flag) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl & ~flag);
- stac_toggle_power_map(codec, nid, 0);
- }
}
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
I tried this on top of 2.6.31.4 and, unfortunately, it did not solve the problem. I'll investigate a bit to figure out why.
Could you try 2.6.32-rc7 with the patch? (Or, you can just copy sound/pci/hda/* from 2.6.32 to 31, in this case.)
thanks,
Takashi
I tried with and without your patch on top of 2.6.32-rc7 and both seemed to work. So I guess the patch is not needed. I apologize for not trying tip before sending a patch.
-- Christian
At Wed, 18 Nov 2009 14:34:29 -0800, Christian Hergert wrote:
Hi,
On Tue, Nov 17, 2009 at 10:15 PM, Takashi Iwai tiwai@suse.de wrote:
At Tue, 17 Nov 2009 12:17:59 -0800, Christian Hergert wrote:
On Tue, Nov 17, 2009 at 1:37 AM, Takashi Iwai tiwai@suse.de wrote:
At Mon, 16 Nov 2009 15:20:32 -0800, Christian Hergert wrote:
Hi,
I made a patch to fix bug 4657[1] on the tracker. I'm fairly certain that it isn't the correct approach but would like some feedback on what that would be.
The power-mappings in patch_sigmatel.c seem to allow you to flip multiple bits. In the case of the Dell docking station, you need to enable some bits while disabling others. Therefore, instead of using the power mappings I just hacked in a quick check to work for the hardware I have on hand. If there is a proper way to fix this that I have missed, I'll be more than happy to fix the patch appropriately.
[1] https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4657
The jack detection of the docking station is already there, but it seems just a missing call to toggle the power-map.
How about the patch below?
thanks,
Takashi
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7f76a97..bd9a2dd 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4396,10 +4396,12 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
pin_ctl |= flag;
- if (old_ctl != pin_ctl)
- if (old_ctl != pin_ctl) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl);
- stac_toggle_power_map(codec, nid, 1);
- }
}
static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, @@ -4407,10 +4409,12 @@ static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid, { unsigned int pin_ctl = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
- if (pin_ctl & flag)
- if (pin_ctl & flag) {
snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, pin_ctl & ~flag);
- stac_toggle_power_map(codec, nid, 0);
- }
}
static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
I tried this on top of 2.6.31.4 and, unfortunately, it did not solve the problem. I'll investigate a bit to figure out why.
Could you try 2.6.32-rc7 with the patch? (Or, you can just copy sound/pci/hda/* from 2.6.32 to 31, in this case.)
thanks,
Takashi
I tried with and without your patch on top of 2.6.32-rc7 and both seemed to work. So I guess the patch is not needed. I apologize for not trying tip before sending a patch.
Good to hear that it works. Thanks for reporting and checking!
Takashi
participants (2)
-
Christian Hergert
-
Takashi Iwai