Update of /cvsroot/alsa/alsa-kernel/isa/ad1848
In directory sc8-pr-cvs1:/tmp/cvs-serv13654/isa/ad1848

Modified Files:
        ad1848.c ad1848_lib.c 
Log Message:
added the quirk for thinkpad 360/750/755 by Ryan Underwood <[EMAIL PROTECTED]>
- suspend/resume is implemented (only for thinkpad).
- use KERN_ERR prefix for error messages.



Index: ad1848.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/isa/ad1848/ad1848.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ad1848.c    21 Oct 2002 18:28:21 -0000      1.8
+++ ad1848.c    8 Jul 2003 10:41:05 -0000       1.9
@@ -46,6 +46,7 @@
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;    /* PnP setup */
 static int irq[SNDRV_CARDS] = SNDRV_DEFAULT_IRQ;       /* 5,7,9,11,12,15 */
 static int dma1[SNDRV_CARDS] = SNDRV_DEFAULT_DMA;      /* 0,1,3,5,6,7 */
+static int thinkpad[SNDRV_CARDS];                      /* Thinkpad special case */
 
 MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(index, "Index value for AD1848 soundcard.");
@@ -65,6 +66,9 @@
 MODULE_PARM(dma1, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(dma1, "DMA1 # for AD1848 driver.");
 MODULE_PARM_SYNTAX(dma1, SNDRV_DMA_DESC);
+MODULE_PARM(thinkpad, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(thinkpad, "Enable only for the onboard CS4248 of IBM Thinkpad 
360/750/755 series.");
+MODULE_PARM_SYNTAX(thinkpad,  SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
 static snd_card_t *snd_ad1848_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
@@ -77,15 +81,15 @@
        int err;
 
        if (port[dev] == SNDRV_AUTO_PORT) {
-               snd_printk("specify port\n");
+               snd_printk(KERN_ERR "ad1848: specify port\n");
                return -EINVAL;
        }
        if (irq[dev] == SNDRV_AUTO_IRQ) {
-               snd_printk("specify irq\n");
+               snd_printk(KERN_ERR "ad1848: specify irq\n");
                return -EINVAL;
        }
        if (dma1[dev] == SNDRV_AUTO_DMA) {
-               snd_printk("specify dma1\n");
+               snd_printk(KERN_ERR "ad1848: specify dma1\n");
                return -EINVAL;
        }
 
@@ -96,7 +100,7 @@
        if ((err = snd_ad1848_create(card, port[dev],
                                     irq[dev],
                                     dma1[dev],
-                                    AD1848_HW_DETECT,
+                                    thinkpad[dev] ? AD1848_HW_THINKPAD : 
AD1848_HW_DETECT,
                                     &chip)) < 0) {
                snd_card_free(card);
                return err;
@@ -116,6 +120,10 @@
        sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
                pcm->name, chip->port, irq[dev], dma1[dev]);
 
+       if (thinkpad[dev]) {
+               strcat(card->longname, " [Thinkpad]");
+       }
+
        if ((err = snd_card_register(card)) < 0) {
                snd_card_free(card);
                return err;
@@ -168,7 +176,8 @@
               get_id(&str,&id[nr_dev]) == 2 &&
               get_option(&str,(int *)&port[nr_dev]) == 2 &&
               get_option(&str,&irq[nr_dev]) == 2 &&
-              get_option(&str,&dma1[nr_dev]) == 2);
+              get_option(&str,&dma1[nr_dev]) == 2 &&
+              get_option(&str,&thinkpad[nr_dev]) == 2);
        nr_dev++;
        return 1;
 }

Index: ad1848_lib.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/isa/ad1848/ad1848_lib.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- ad1848_lib.c        30 May 2003 12:28:34 -0000      1.26
+++ ad1848_lib.c        8 Jul 2003 10:41:05 -0000       1.27
@@ -625,6 +625,95 @@
 
  */
 
+static void snd_ad1848_thinkpad_twiddle(ad1848_t *chip, int on) {
+
+       int tmp;
+
+       if (!chip->thinkpad_flag) return;
+
+       outb(0x1c, AD1848_THINKPAD_CTL_PORT1);
+       tmp = inb(AD1848_THINKPAD_CTL_PORT2);
+
+       switch (on) {
+               case 0:  /* turn it off */
+                       tmp &= ~AD1848_THINKPAD_CS4248_ENABLE_BIT;
+               default: /* turn it on */
+                       tmp |= AD1848_THINKPAD_CS4248_ENABLE_BIT;
+       }
+
+       outb(tmp, AD1848_THINKPAD_CTL_PORT2);
+
+}
+
+#ifdef CONFIG_PM
+static void snd_ad1848_suspend(ad1848_t *chip) {
+
+       snd_card_t *card = chip->card;
+
+       if (card->power_state == SNDRV_CTL_POWER_D3hot)
+               return;
+
+       snd_pcm_suspend_all(chip->pcm);
+       /* FIXME: save registers? */
+
+       if (chip->thinkpad_flag)
+               snd_ad1848_thinkpad_twiddle(chip, 0);
+
+       snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
+}
+
+static void snd_ad1848_resume(ad1848_t *chip) {
+
+       snd_card_t *card = chip->card;
+
+       if (card->power_state == SNDRV_CTL_POWER_D0)
+               return;
+
+       if (chip->thinkpad_flag)
+               snd_ad1848_thinkpad_twiddle(chip, 1);
+
+       /* FIXME: restore registers? */
+
+       snd_power_change_state(card, SNDRV_CTL_POWER_D0);
+}
+
+/* callback for control API */
+static int snd_ad1848_set_power_state(snd_card_t *card, unsigned int power_state)
+{
+       ad1848_t *chip = (ad1848_t *) card->power_state_private_data;
+       switch (power_state) {
+       case SNDRV_CTL_POWER_D0:
+       case SNDRV_CTL_POWER_D1:
+       case SNDRV_CTL_POWER_D2:
+               snd_ad1848_resume(chip);
+               break;
+       case SNDRV_CTL_POWER_D3hot:
+       case SNDRV_CTL_POWER_D3cold:
+               snd_ad1848_suspend(chip);
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int snd_ad1848_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data)
+{
+       ad1848_t *chip = snd_magic_cast(ad1848_t, dev->data, return 0);
+
+       switch (rqst) {
+       case PM_SUSPEND:
+               snd_ad1848_suspend(chip);
+               break;
+       case PM_RESUME:
+               snd_ad1848_resume(chip);
+               break;
+       }
+       return 0;
+}
+
+#endif /* CONFIG_PM */
+
 static int snd_ad1848_probe(ad1848_t * chip)
 {
        unsigned long flags;
@@ -799,6 +888,10 @@
 
 static int snd_ad1848_free(ad1848_t *chip)
 {
+#ifdef CONFIG_PM
+        if (chip->thinkpad_pmstate)
+                pm_unregister(chip->thinkpad_pmstate);
+#endif
        if (chip->res_port) {
                release_resource(chip->res_port);
                kfree_nocheck(chip->res_port);
@@ -869,6 +962,20 @@
                return -EBUSY;
        }
        chip->dma = dma;
+
+       if (hardware == AD1848_HW_THINKPAD) {
+               chip->thinkpad_flag = 1;
+               chip->hardware = AD1848_HW_DETECT; /* reset */
+               snd_ad1848_thinkpad_twiddle(chip, 1);
+#ifdef CONFIG_PM
+               chip->thinkpad_pmstate = pm_register(PM_ISA_DEV, 0, 
snd_ad1848_pm_callback);
+               if (chip->thinkpad_pmstate) {
+                       chip->thinkpad_pmstate->data = chip;
+                       card->set_power_state = snd_ad1848_set_power_state; /* 
callback */
+                       card->power_state_private_data = chip;
+               }
+#endif
+       }
 
        if (snd_ad1848_probe(chip) < 0) {
                snd_ad1848_free(chip);



-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100006ave/direct;at.asp_061203_01/01
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to