[haiku-development] Re: Headphone Jacksense support for AD1981B chipset

  • From: "Jérôme Duval" <korli@xxxxxxxxxxxxxxxx>
  • To: haiku-development@xxxxxxxxxxxxx
  • Date: Sun, 23 Sep 2007 19:51:39 +0200

Hi Hüseyin,

thanks for your patch.

2007/9/23, Hüseyin Erdemir <herdemir@xxxxxxxxx>:
>
> In previous patch you couldn't change headphone volume in AC 97 MIXER. Now 
> headphone volume is synced to Master Volume.
>
> As for my report before about sample rate conversion, just ignore it. It 
> works flawless. Sorry for the mislead.

I think your patch is not for every AD1981B chipset, only some HP
laptops. It would be better to check the subvendor/subproduct.
Could you check with the attached patch ? Please eventually fix it to
have it work with your laptop. Thanks.

Bye,
Jérôme
Index: src/add-ons/kernel/drivers/audio/ac97/auich/ac97.c
===================================================================
--- src/add-ons/kernel/drivers/audio/ac97/auich/ac97.c  (révision 22273)
+++ src/add-ons/kernel/drivers/audio/ac97/auich/ac97.c  (copie de travail)
@@ -95,12 +95,14 @@
 
 void default_init(device_config *);
 void ad1886_init(device_config *);
+void ad1981b_init(device_config *);
 
 void default_amp_enable(device_config *, bool);
 void cs4299_amp_enable(device_config *, bool);
 
 codec_ops default_ops = { default_init, default_amp_enable };
 codec_ops ad1886_ops = { ad1886_init, default_amp_enable };
+codec_ops ad1981b_ops = { ad1981b_init, default_amp_enable };
 codec_ops cs4299_ops = { default_init, cs4299_amp_enable };
 
 codec_table codecs[] = 
@@ -150,6 +152,7 @@
        { 0x41445363, 0xffffffff, &default_ops, "Analog Devices AD1886A 
SoundMAX"B_UTF8_REGISTERED },
        { 0x41445371, 0xffffffff, &default_ops, "Analog Devices AD1981A 
SoundMAX"B_UTF8_REGISTERED },
        { 0x41445372, 0xffffffff, &default_ops, "Analog Devices AD1981A 
SoundMAX"B_UTF8_REGISTERED },
+       { 0x41445374, 0xffffffff, &ad1981b_ops, "Analog Devices AD1981B 
SoundMAX"B_UTF8_REGISTERED },
        { 0x414c4320, 0xfffffff0, &default_ops, "Avance Logic (Realtek) 
ALC100/ALC100P, RL5383/RL5522" },
        { 0x414c4730, 0xffffffff, &default_ops, "Avance Logic (Realtek) ALC101" 
},
 #if 0
@@ -251,9 +254,21 @@
 void ad1886_init(device_config *config)
 {
        LOG(("ad1886_init\n"));
-       auich_codec_write(config, 0x72, 0x0010);
+       auich_codec_write(config, AC97_AD_JACKSENSE, 0x0010);
 }
 
+void ad1981b_init(device_config *config)
+{
+       LOG(("ad1981b_init\n"));
+       uint32 id = (config->subvendor_id << 16) | config->subsystem_id;
+       if (id == 0x103c0934) {
+               auich_codec_write(config, AC97_AD_JACKSENSE,
+                       auich_codec_read(config, AC97_AD_JACKSENSE) | 0x0800);
+
+               source_info[1].reg = AC97_AUX_OUT_VOLUME;
+       }
+}
+
 void default_amp_enable(device_config *config, bool yesno)
 {
        LOG(("default_amp_enable\n"));
@@ -278,7 +293,7 @@
                auich_codec_write(config, 0x68, 0);
 }
 
-const ac97_source_info source_info[] = {
+ac97_source_info source_info[] = {
        { "Recording", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO|B_MIX_RECORDMUX, 100, 
AC97_RECORD_GAIN, 0x8000, 4, 0, 1, 0, 0.0, 22.5, 1.5 },
        { "Master", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO, 101, 
AC97_MASTER_VOLUME, 0x8000, 5, 0, 1, 1,-46.5, 0.0, 1.5 },
        //{ "Bass/Treble", B_MIX_GAIN|B_MIX_STEREO, 102, AC97_MASTER_TONE, 
0x0f0f, 4, 0, 1, 1,-12.0, 10.5, 1.5 },
Index: src/add-ons/kernel/drivers/audio/ac97/auich/ac97.h
===================================================================
--- src/add-ons/kernel/drivers/audio/ac97/auich/ac97.h  (révision 22273)
+++ src/add-ons/kernel/drivers/audio/ac97/auich/ac97.h  (copie de travail)
@@ -64,6 +64,7 @@
        AC97_CENTER_LFE_VOLUME  = 0x36,
        AC97_SURROUND_VOLUME    = 0x38,
        AC97_SPDIF_CONTROL              = 0x3A,
+       AC97_AD_JACKSENSE               = 0x72,
        AC97_VENDOR_ID1                 = 0x7C,
        AC97_VENDOR_ID2                 = 0x7E
 };
@@ -101,7 +102,7 @@
        float   granularity;
 } ac97_source_info;
 
-extern const ac97_source_info source_info[];
+extern ac97_source_info source_info[];
 extern const int32 source_info_size;
 
 #endif
Index: src/add-ons/kernel/drivers/audio/ac97/auich/config.h
===================================================================
--- src/add-ons/kernel/drivers/audio/ac97/auich/config.h        (révision 
22273)
+++ src/add-ons/kernel/drivers/audio/ac97/auich/config.h        (copie de 
travail)
@@ -46,6 +46,9 @@
        void *  log_mbbar; // ich4
        area_id area_mmbar; // ich4
        area_id area_mbbar; // ich4
+
+       ushort  subvendor_id;
+       ushort  subsystem_id;
 } device_config;
 
 #define TYPE_ICH4                      0x01
Index: src/add-ons/kernel/drivers/audio/ac97/auich/auich.c
===================================================================
--- src/add-ons/kernel/drivers/audio/ac97/auich/auich.c (révision 22273)
+++ src/add-ons/kernel/drivers/audio/ac97/auich/auich.c (copie de travail)
@@ -607,6 +607,8 @@
 
        make_device_names(card);
        
+       card->config.subvendor_id = card->info.u.h0.subsystem_vendor_id;
+       card->config.subsystem_id = card->info.u.h0.subsystem_id;
        card->config.nabmbar = card->info.u.h0.base_registers[0];
        card->config.irq = card->info.u.h0.interrupt_line;
        card->config.type = 0;

Other related posts: