Update of /cvsroot/alsa/alsa-kernel/pci/ac97
In directory sc8-pr-cvs1:/tmp/cvs-serv12320/pci/ac97

Modified Files:
        ac97_codec.c 
Log Message:
More MC'97 updates (initialization works now).


Index: ac97_codec.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ac97/ac97_codec.c,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- ac97_codec.c        25 Feb 2003 16:56:24 -0000      1.74
+++ ac97_codec.c        25 Feb 2003 18:04:03 -0000      1.75
@@ -51,7 +51,7 @@
 
  */
 
-static void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97);
+static void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97, const char *prefix);
 
 typedef struct {
        unsigned int id;
@@ -135,8 +135,7 @@
 { 0x4e534300, 0xffffffff, "LM4540/43/45/46/48",        NULL,           NULL }, // 
only guess --jk
 { 0x4e534331, 0xffffffff, "LM4549",            NULL,           NULL },
 { 0x50534304, 0xffffffff, "UCB1400",           NULL,           NULL },
-{ 0x53494c22, 0xffffffff, "Si3036",            NULL,           NULL },
-{ 0x53494c23, 0xffffffff, "Si3038",            NULL,           NULL },
+{ 0x53494c20, 0xffffffe0, "Si3036/8",          NULL,           NULL },
 { 0x54524102, 0xffffffff, "TR28022",           NULL,           NULL },
 { 0x54524106, 0xffffffff, "TR28026",           NULL,           NULL },
 { 0x54524108, 0xffffffff, "TR28028",           patch_tritech_tr28028,  NULL }, // 
added by xin jin [07/09/99]
@@ -2070,7 +2069,7 @@
                snd_ac97_free(ac97);
                return -ENOMEM;
        }
-       snd_ac97_proc_init(card, ac97);
+       snd_ac97_proc_init(card, ac97, "ac97");
        if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ac97, &ops)) < 0) {
                snd_ac97_free(ac97);
                return err;
@@ -2134,7 +2133,7 @@
        int err;
        ac97_t *ac97;
        char name[64];
-       // signed long end_time;
+       signed long end_time;
        unsigned short tmp;
        static snd_device_ops_t ops = {
                .dev_free =     snd_ac97_dev_free,
@@ -2170,7 +2169,7 @@
        ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
        ac97->id |= snd_ac97_read(ac97, AC97_VENDOR_ID2);
        if (ac97->id == 0x00000000 || ac97->id == 0xffffffff) {
-               snd_printk("AC'97 %d:%d access is not valid [0x%x], removing modem 
controls.\n", ac97->num, ac97->addr, ac97->id);
+               snd_printk("MC'97 %d:%d access is not valid [0x%x], removing modem 
controls.\n", ac97->num, ac97->addr, ac97->id);
                snd_ac97_free(ac97);
                return -EIO;
        }
@@ -2200,28 +2199,42 @@
 
        /* FIXME: add powerdown control */
        if (ac97->scaps & AC97_SCAP_MODEM) {
-#if 0 /* FIXME - add modem powerup */
                /* nothing should be in powerdown mode */
-               snd_ac97_write_cache_test(ac97, AC97_POWERDOWN, 0);
-               snd_ac97_write_cache_test(ac97, AC97_RESET, 0);         /* reset to 
defaults */
+               /* note: it's important to set the rate at first */
+               tmp = AC97_MEA_GPIO;
+               if (ac97->ext_mid & AC97_MEI_LINE1) {
+                       snd_ac97_write_cache_test(ac97, AC97_LINE1_RATE, 12000);
+                       tmp |= AC97_MEA_ADC1 | AC97_MEA_DAC1;
+               }
+               if (ac97->ext_mid & AC97_MEI_LINE2) {
+                       snd_ac97_write_cache_test(ac97, AC97_LINE2_RATE, 12000);
+                       tmp |= AC97_MEA_ADC2 | AC97_MEA_DAC2;
+               }
+               if (ac97->ext_mid & AC97_MEI_HANDSET) {
+                       snd_ac97_write_cache_test(ac97, AC97_HANDSET_RATE, 12000);
+                       tmp |= AC97_MEA_HADC | AC97_MEA_HDAC;
+               }
+               snd_ac97_write_cache_test(ac97, AC97_EXTENDED_MSTATUS, 0xff00 & ~(tmp 
<< 8));
                udelay(100);
                /* nothing should be in powerdown mode */
-               snd_ac97_write_cache_test(ac97, AC97_POWERDOWN, 0);
-               snd_ac97_write_cache_test(ac97, AC97_GENERAL_PURPOSE, 0);
+               snd_ac97_write_cache_test(ac97, AC97_EXTENDED_MSTATUS, 0xff00 & ~(tmp 
<< 8));
                end_time = jiffies + (HZ / 10);
                do {
-                       if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f)
+                       if ((snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS) & tmp) == tmp)
                                goto __ready_ok;
                        set_current_state(TASK_UNINTERRUPTIBLE);
                        schedule_timeout(HZ/10);
                } while (time_after_eq(end_time, jiffies));
-               snd_printk("AC'97 %d:%d analog subsections not ready\n", ac97->num, 
ac97->addr);
-#endif
+               snd_printk("MC'97 %d:%d converters and GPIO not ready (0x%x)\n", 
ac97->num, ac97->addr, snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS));
        }
 
       __ready_ok:
        /* additional initializations */
        /* FIXME: ADD MODEM INITALIZATION */
+       if (ac97_is_modem(ac97))
+               ac97->addr = (ac97->ext_mid & AC97_MEI_ADDR_MASK) >> 
AC97_MEI_ADDR_SHIFT;
+       else
+               ac97->addr = (ac97->ext_id & AC97_EI_ADDR_MASK) >> AC97_EI_ADDR_SHIFT;
 
        if (ac97->init)
                ac97->init(ac97);
@@ -2245,7 +2258,7 @@
                snd_ac97_free(ac97);
                return -ENOMEM;
        }
-       snd_ac97_proc_init(card, ac97);
+       snd_ac97_proc_init(card, ac97, "mc97");
        if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ac97, &ops)) < 0) {
                snd_ac97_free(ac97);
                return err;
@@ -2399,9 +2412,39 @@
                        (mext & AC97_MEI_ADDR_MASK) >> AC97_MEI_ADDR_SHIFT,
                        mext & AC97_MEI_CID2 ? " CID2" : "",
                        mext & AC97_MEI_CID1 ? " CID1" : "",
-                       mext & AC97_MEI_HEADSET ? " HSET" : "",
+                       mext & AC97_MEI_HANDSET ? " HSET" : "",
                        mext & AC97_MEI_LINE2 ? " LIN2" : "",
                        mext & AC97_MEI_LINE1 ? " LIN1" : "");
+       val = snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS);
+       snd_iprintf(buffer, "Modem status     :%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+                       val & AC97_MEA_GPIO ? " GPIO" : "",
+                       val & AC97_MEA_MREF ? " MREF" : "",
+                       val & AC97_MEA_ADC1 ? " ADC1" : "",
+                       val & AC97_MEA_DAC1 ? " DAC1" : "",
+                       val & AC97_MEA_ADC2 ? " ADC2" : "",
+                       val & AC97_MEA_DAC2 ? " DAC2" : "",
+                       val & AC97_MEA_HADC ? " HADC" : "",
+                       val & AC97_MEA_HDAC ? " HDAC" : "",
+                       val & AC97_MEA_PRA ? " PRA(GPIO)" : "",
+                       val & AC97_MEA_PRB ? " PRB(res)" : "",
+                       val & AC97_MEA_PRC ? " PRC(ADC1)" : "",
+                       val & AC97_MEA_PRD ? " PRD(DAC1)" : "",
+                       val & AC97_MEA_PRE ? " PRE(ADC2)" : "",
+                       val & AC97_MEA_PRF ? " PRF(DAC2)" : "",
+                       val & AC97_MEA_PRG ? " PRG(HADC)" : "",
+                       val & AC97_MEA_PRH ? " PRH(HDAC)" : "");
+       if (mext & AC97_MEI_LINE1) {
+               val = snd_ac97_read(ac97, AC97_LINE1_RATE);
+               snd_iprintf(buffer, "Line1 rate       : %iHz\n", val);
+       }
+       if (mext & AC97_MEI_LINE2) {
+               val = snd_ac97_read(ac97, AC97_LINE2_RATE);
+               snd_iprintf(buffer, "Line2 rate       : %iHz\n", val);
+       }
+       if (mext & AC97_MEI_HANDSET) {
+               val = snd_ac97_read(ac97, AC97_HANDSET_RATE);
+               snd_iprintf(buffer, "Headset rate     : %iHz\n", val);
+       }
 }
 
 static void snd_ac97_proc_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer)
@@ -2469,21 +2512,21 @@
        }       
 }
 
-static void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97)
+static void snd_ac97_proc_init(snd_card_t * card, ac97_t * ac97, const char *prefix)
 {
        snd_info_entry_t *entry;
        char name[32];
 
        if (ac97->num)
-               sprintf(name, "ac97#%d-%d", ac97->addr, ac97->num);
+               sprintf(name, "%s#%d-%d", prefix, ac97->addr, ac97->num);
        else
-               sprintf(name, "ac97#%d", ac97->addr);
+               sprintf(name, "%s#%d", prefix, ac97->addr);
        if (! snd_card_proc_new(card, name, &entry))
                snd_info_set_text_ops(entry, ac97, snd_ac97_proc_read);
        if (ac97->num)
-               sprintf(name, "ac97#%d-%dregs", ac97->addr, ac97->num);
+               sprintf(name, "%s#%d-%dregs", prefix, ac97->addr, ac97->num);
        else
-               sprintf(name, "ac97#%dregs", ac97->addr);
+               sprintf(name, "%s#%dregs", prefix, ac97->addr);
        if (! snd_card_proc_new(card, name, &entry))
                snd_info_set_text_ops(entry, ac97, snd_ac97_proc_regs_read);
 }



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to