OK, the situation is 0x01 is to control GPIO0: 1. if I write (codec,0x01,0,AC_VERB_SET_GPIO_MASK,1) only; the result is speaker not work.
2. if I write (codec,0x01,0,AC_VERB_SET_GPIO_DIRECTION,1) only; the result is speaker not work.
3. If I write step 1 & 2 together, speaker works when I reboot.
4. Then If I plugged in the headphone, the headphone doesn't work. It only works when I write (codec,0x0F,0,AC_VERB_SET_PIN_WIDGET_CONTROL,PIN_HP).
5. From step 3 & 4, it's similar for cases that I reboot with headphone plugged in. That is, if I remove headphone, speaker doesn't work automatically. If I write (codec,0x0F,0,AC_VERB_SET_PIN_WIDGET_CONTROL,PIN_OUT), the auto-detection function works well can switch speaker/headphone automatically.
I don't know why it's this case, and from alsa document, it seems only enable GPIO0 will work but actually not.
On 2012年02月15日 17:58, Takashi Iwai wrote:
At Wed, 15 Feb 2012 17:45:37 +0800, joey.jiaojg wrote:
I have tried to enable each one of them separately, and the speaker doesn't work.
Sorry, it's not clear what you meant. Each of what separately? And what does GPIO do exactly?
I have to use these 3 write_cache to make switch and auto-detect work smoothly.
We need to know the reason why these must be needed.
Takashi
On 2012年02月15日 17:40, Takashi Iwai wrote:
At Wed, 15 Feb 2012 17:31:44 +0800, joey.jiaojg wrote:
Here is the diff file.
Thanks.
+/* toggle speaker-output according to the hp-jack state */ +static void alc260_b1900_automute(struct hda_codec *codec) +{
unsigned int present;
- present = snd_hda_jack_detect(codec, 0x0f);
- if (present) {
snd_hda_codec_write_cache(codec, 0x01, 0,
AC_VERB_SET_GPIO_MASK, 0);
snd_hda_codec_write_cache(codec, 0x01, 0,
AC_VERB_SET_GPIO_DIRECTION,
0);
What actually this GPIO bit does on your device? To mute/unmute the speaker?
If so, doesn't the speaker toggle work with just changing the pin-control of the corresponding pin?
Takashi