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