diff options
Diffstat (limited to 'sound/pci/intel8x0.c')
| -rw-r--r-- | sound/pci/intel8x0.c | 321 | 
1 files changed, 211 insertions, 110 deletions
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 400f9ebd243..c91860e0a28 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -32,7 +32,7 @@  #include <linux/init.h>  #include <linux/pci.h>  #include <linux/slab.h> -#include <linux/moduleparam.h> +#include <linux/module.h>  #include <sound/core.h>  #include <sound/pcm.h>  #include <sound/ac97_codec.h> @@ -42,6 +42,12 @@  #include <asm/pgtable.h>  #include <asm/cacheflush.h> +#ifdef CONFIG_KVM_GUEST +#include <linux/kvm_para.h> +#else +#define kvm_para_available() (0) +#endif +  MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");  MODULE_DESCRIPTION("Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7012; Ali 5455");  MODULE_LICENSE("GPL"); @@ -73,10 +79,11 @@ static int index = SNDRV_DEFAULT_IDX1;	/* Index 0-MAX */  static char *id = SNDRV_DEFAULT_STR1;	/* ID for this card */  static int ac97_clock;  static char *ac97_quirk; -static int buggy_semaphore; +static bool buggy_semaphore;  static int buggy_irq = -1; /* auto-check */ -static int xbox; +static bool xbox;  static int spdif_aclink = -1; +static int inside_vm = -1;  module_param(index, int, 0444);  MODULE_PARM_DESC(index, "Index value for Intel i8x0 soundcard."); @@ -88,15 +95,17 @@ module_param(ac97_quirk, charp, 0444);  MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");  module_param(buggy_semaphore, bool, 0444);  MODULE_PARM_DESC(buggy_semaphore, "Enable workaround for hardwares with problematic codec semaphores."); -module_param(buggy_irq, bool, 0444); +module_param(buggy_irq, bint, 0444);  MODULE_PARM_DESC(buggy_irq, "Enable workaround for buggy interrupts on some motherboards.");  module_param(xbox, bool, 0444);  MODULE_PARM_DESC(xbox, "Set to 1 for Xbox, if you have problems with the AC'97 codec detection.");  module_param(spdif_aclink, int, 0444);  MODULE_PARM_DESC(spdif_aclink, "S/PDIF over AC-link."); +module_param(inside_vm, bint, 0444); +MODULE_PARM_DESC(inside_vm, "KVM/Parallels optimization.");  /* just for backward compatibility */ -static int enable; +static bool enable;  module_param(enable, bool, 0444);  static int joystick;  module_param(joystick, int, 0444); @@ -400,6 +409,7 @@ struct intel8x0 {  	unsigned buggy_irq: 1;		/* workaround for buggy mobos */  	unsigned xbox: 1;		/* workaround for Xbox AC'97 detection */  	unsigned buggy_semaphore: 1;	/* workaround for buggy codec semaphore */ +	unsigned inside_vm: 1;		/* enable VM optimization */  	int spdif_idx;	/* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */  	unsigned int sdm_saved;	/* SDM reg value */ @@ -534,10 +544,11 @@ static int snd_intel8x0_codec_semaphore(struct intel8x0 *chip, unsigned int code  		udelay(10);  	} while (time--); -	/* access to some forbidden (non existant) ac97 registers will not +	/* access to some forbidden (non existent) ac97 registers will not  	 * reset the semaphore. So even if you don't get the semaphore, still  	 * continue the access. We don't need the semaphore anyway. */ -	snd_printk(KERN_ERR "codec_semaphore: semaphore is not ready [0x%x][0x%x]\n", +	dev_err(chip->card->dev, +		"codec_semaphore: semaphore is not ready [0x%x][0x%x]\n",  			igetbyte(chip, ICHREG(ACC_SEMA)), igetdword(chip, ICHREG(GLOB_STA)));  	iagetword(chip, 0);	/* clear semaphore flag */  	/* I don't care about the semaphore */ @@ -552,7 +563,9 @@ static void snd_intel8x0_codec_write(struct snd_ac97 *ac97,  	if (snd_intel8x0_codec_semaphore(chip, ac97->num) < 0) {  		if (! chip->in_ac97_init) -			snd_printk(KERN_ERR "codec_write %d: semaphore is not ready for register 0x%x\n", ac97->num, reg); +			dev_err(chip->card->dev, +				"codec_write %d: semaphore is not ready for register 0x%x\n", +				ac97->num, reg);  	}  	iaputword(chip, reg + ac97->num * 0x80, val);  } @@ -566,7 +579,9 @@ static unsigned short snd_intel8x0_codec_read(struct snd_ac97 *ac97,  	if (snd_intel8x0_codec_semaphore(chip, ac97->num) < 0) {  		if (! chip->in_ac97_init) -			snd_printk(KERN_ERR "codec_read %d: semaphore is not ready for register 0x%x\n", ac97->num, reg); +			dev_err(chip->card->dev, +				"codec_read %d: semaphore is not ready for register 0x%x\n", +				ac97->num, reg);  		res = 0xffff;  	} else {  		res = iagetword(chip, reg + ac97->num * 0x80); @@ -575,15 +590,17 @@ static unsigned short snd_intel8x0_codec_read(struct snd_ac97 *ac97,  			iputdword(chip, ICHREG(GLOB_STA), tmp &  				  ~(chip->codec_ready_bits | ICH_GSCI));  			if (! chip->in_ac97_init) -				snd_printk(KERN_ERR "codec_read %d: read timeout for register 0x%x\n", ac97->num, reg); +				dev_err(chip->card->dev, +					"codec_read %d: read timeout for register 0x%x\n", +					ac97->num, reg);  			res = 0xffff;  		}  	}  	return res;  } -static void __devinit snd_intel8x0_codec_read_test(struct intel8x0 *chip, -						   unsigned int codec) +static void snd_intel8x0_codec_read_test(struct intel8x0 *chip, +					 unsigned int codec)  {  	unsigned int tmp; @@ -609,7 +626,7 @@ static int snd_intel8x0_ali_codec_ready(struct intel8x0 *chip, int mask)  			return 0;  	}  	if (! chip->in_ac97_init) -		snd_printd(KERN_WARNING "intel8x0: AC97 codec ready timeout.\n"); +		dev_warn(chip->card->dev, "AC97 codec ready timeout.\n");  	return -EBUSY;  } @@ -621,7 +638,7 @@ static int snd_intel8x0_ali_codec_semaphore(struct intel8x0 *chip)  	while (--time && (igetdword(chip, ICHREG(ALI_CAS)) & ALI_CAS_SEM_BUSY))  		udelay(1);  	if (! time && ! chip->in_ac97_init) -		snd_printk(KERN_WARNING "ali_codec_semaphore timeout\n"); +		dev_warn(chip->card->dev, "ali_codec_semaphore timeout\n");  	return snd_intel8x0_ali_codec_ready(chip, ALI_CSPSR_CODEC_READY);  } @@ -690,7 +707,7 @@ static void snd_intel8x0_setup_periods(struct intel8x0 *chip, struct ichdev *ich  			bdbar[idx + 1] = cpu_to_le32(0x80000000 | /* interrupt on completion */  						     ichdev->fragsize >> ichdev->pos_shift);  #if 0 -			printk(KERN_DEBUG "bdbar[%i] = 0x%x [0x%x]\n", +			dev_dbg(chip->card->dev, "bdbar[%i] = 0x%x [0x%x]\n",  			       idx + 0, bdbar[idx + 0], bdbar[idx + 1]);  #endif  		} @@ -702,8 +719,8 @@ static void snd_intel8x0_setup_periods(struct intel8x0 *chip, struct ichdev *ich  	ichdev->lvi_frag = ICH_REG_LVI_MASK % ichdev->frags;  	ichdev->position = 0;  #if 0 -	printk(KERN_DEBUG "lvi_frag = %i, frags = %i, period_size = 0x%x, " -	       "period_size1 = 0x%x\n", +	dev_dbg(chip->card->dev, +		"lvi_frag = %i, frags = %i, period_size = 0x%x, period_size1 = 0x%x\n",  	       ichdev->lvi_frag, ichdev->frags, ichdev->fragsize,  	       ichdev->fragsize1);  #endif @@ -771,8 +788,8 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich  		ichdev->lvi_frag %= ichdev->frags;  		ichdev->bdbar[ichdev->lvi * 2] = cpu_to_le32(ichdev->physbuf + ichdev->lvi_frag * ichdev->fragsize1);  #if 0 -	printk(KERN_DEBUG "new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, " -	       "all = 0x%x, 0x%x\n", +	dev_dbg(chip->card->dev, +		"new: bdbar[%i] = 0x%x [0x%x], prefetch = %i, all = 0x%x, 0x%x\n",  	       ichdev->lvi * 2, ichdev->bdbar[ichdev->lvi * 2],  	       ichdev->bdbar[ichdev->lvi * 2 + 1], inb(ICH_REG_OFF_PIV + port),  	       inl(port + 4), inb(port + ICH_REG_OFF_CR)); @@ -1065,8 +1082,18 @@ static snd_pcm_uframes_t snd_intel8x0_pcm_pointer(struct snd_pcm_substream *subs  			udelay(10);  			continue;  		} -		if (civ == igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV) && -		    ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb)) +		if (civ != igetbyte(chip, ichdev->reg_offset + ICH_REG_OFF_CIV)) +			continue; + +		/* IO read operation is very expensive inside virtual machine +		 * as it is emulated. The probability that subsequent PICB read +		 * will return different result is high enough to loop till +		 * timeout here. +		 * Same CIV is strict enough condition to be sure that PICB +		 * is valid inside VM on emulated card. */ +		if (chip->inside_vm) +			break; +		if (ptr1 == igetword(chip, ichdev->reg_offset + ichdev->roff_picb))  			break;  	} while (timeout--);  	ptr = ichdev->last_pos; @@ -1487,8 +1514,8 @@ struct ich_pcm_table {  	int ac97_idx;  }; -static int __devinit snd_intel8x0_pcm1(struct intel8x0 *chip, int device, -				       struct ich_pcm_table *rec) +static int snd_intel8x0_pcm1(struct intel8x0 *chip, int device, +			     struct ich_pcm_table *rec)  {  	struct snd_pcm *pcm;  	int err; @@ -1521,10 +1548,29 @@ static int __devinit snd_intel8x0_pcm1(struct intel8x0 *chip, int device,  					      snd_dma_pci_data(chip->pci),  					      rec->prealloc_size, rec->prealloc_max_size); +	if (rec->playback_ops && +	    rec->playback_ops->open == snd_intel8x0_playback_open) { +		struct snd_pcm_chmap *chmap; +		int chs = 2; +		if (chip->multi8) +			chs = 8; +		else if (chip->multi6) +			chs = 6; +		else if (chip->multi4) +			chs = 4; +		err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, +					     snd_pcm_alt_chmaps, chs, 0, +					     &chmap); +		if (err < 0) +			return err; +		chmap->channel_mask = SND_PCM_CHMAP_MASK_2468; +		chip->ac97[0]->chmaps[SNDRV_PCM_STREAM_PLAYBACK] = chmap; +	} +  	return 0;  } -static struct ich_pcm_table intel_pcms[] __devinitdata = { +static struct ich_pcm_table intel_pcms[] = {  	{  		.playback_ops = &snd_intel8x0_playback_ops,  		.capture_ops = &snd_intel8x0_capture_ops, @@ -1561,7 +1607,7 @@ static struct ich_pcm_table intel_pcms[] __devinitdata = {  	},  }; -static struct ich_pcm_table nforce_pcms[] __devinitdata = { +static struct ich_pcm_table nforce_pcms[] = {  	{  		.playback_ops = &snd_intel8x0_playback_ops,  		.capture_ops = &snd_intel8x0_capture_ops, @@ -1584,7 +1630,7 @@ static struct ich_pcm_table nforce_pcms[] __devinitdata = {  	},  }; -static struct ich_pcm_table ali_pcms[] __devinitdata = { +static struct ich_pcm_table ali_pcms[] = {  	{  		.playback_ops = &snd_intel8x0_ali_playback_ops,  		.capture_ops = &snd_intel8x0_ali_capture_ops, @@ -1616,7 +1662,7 @@ static struct ich_pcm_table ali_pcms[] __devinitdata = {  #endif  }; -static int __devinit snd_intel8x0_pcm(struct intel8x0 *chip) +static int snd_intel8x0_pcm(struct intel8x0 *chip)  {  	int i, tblsize, device, err;  	struct ich_pcm_table *tbl, *rec; @@ -1679,7 +1725,7 @@ static void snd_intel8x0_mixer_free_ac97(struct snd_ac97 *ac97)  	chip->ac97[ac97->num] = NULL;  } -static struct ac97_pcm ac97_pcm_defs[] __devinitdata = { +static struct ac97_pcm ac97_pcm_defs[] = {  	/* front PCM */  	{  		.exclusive = 1, @@ -1749,7 +1795,7 @@ static struct ac97_pcm ac97_pcm_defs[] __devinitdata = {  	},  }; -static struct ac97_quirk ac97_quirks[] __devinitdata = { +static struct ac97_quirk ac97_quirks[] = {          {  		.subvendor = 0x0e11,  		.subdevice = 0x000e, @@ -1866,6 +1912,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {  	},  	{  		.subvendor = 0x1028, +		.subdevice = 0x0182, +		.name = "Dell Latitude D610",	/* STAC9750/51 */ +		.type = AC97_TUNE_HP_ONLY +	}, +	{ +		.subvendor = 0x1028,  		.subdevice = 0x0186,  		.name = "Dell Latitude D810", /* cf. Malone #41015 */  		.type = AC97_TUNE_HP_MUTE_LED @@ -1878,6 +1930,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {  	},  	{  		.subvendor = 0x1028, +		.subdevice = 0x0189, +		.name = "Dell Inspiron 9300", +		.type = AC97_TUNE_HP_MUTE_LED +	}, +	{ +		.subvendor = 0x1028,  		.subdevice = 0x0191,  		.name = "Dell Inspiron 8600",  		.type = AC97_TUNE_HP_ONLY @@ -2070,6 +2128,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {  	},  	{  		.subvendor = 0x161f, +		.subdevice = 0x202f, +		.name = "Gateway M520", +		.type = AC97_TUNE_INV_EAPD +	}, +	{ +		.subvendor = 0x161f,  		.subdevice = 0x203a,  		.name = "Gateway 4525GZ",		/* AD1981B */  		.type = AC97_TUNE_INV_EAPD @@ -2138,8 +2202,8 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {  	{ } /* terminator */  }; -static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, -					const char *quirk_override) +static int snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, +			      const char *quirk_override)  {  	struct snd_ac97_bus *pbus;  	struct snd_ac97_template ac97; @@ -2168,7 +2232,7 @@ static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock,  		case DEVICE_INTEL_ICH4:  			chip->spdif_idx = ICHD_SPBAR;  			break; -		}; +		}  	}  	chip->in_ac97_init = 1; @@ -2232,7 +2296,8 @@ static int __devinit snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock,  		ac97.num = i;  		if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97[i])) < 0) {  			if (err != -EACCES) -				snd_printk(KERN_ERR "Unable to initialize codec #%d\n", i); +				dev_err(chip->card->dev, +					"Unable to initialize codec #%d\n", i);  			if (i == 0)  				goto __err;  		} @@ -2384,7 +2449,7 @@ static int snd_intel8x0_ich_chip_reset(struct intel8x0 *chip)  			return 0;  		schedule_timeout_uninterruptible(1);  	} while (time_after_eq(end_time, jiffies)); -	snd_printk(KERN_ERR "AC'97 warm reset still in progress? [0x%x]\n", +	dev_err(chip->card->dev, "AC'97 warm reset still in progress? [0x%x]\n",  		   igetdword(chip, ICHREG(GLOB_CNT)));  	return -EIO;  } @@ -2426,7 +2491,8 @@ static int snd_intel8x0_ich_chip_init(struct intel8x0 *chip, int probing)  		} while (time_after_eq(end_time, jiffies));  		if (! status) {  			/* no codec is found */ -			snd_printk(KERN_ERR "codec_ready: codec is not ready [0x%x]\n", +			dev_err(chip->card->dev, +				"codec_ready: codec is not ready [0x%x]\n",  				   igetdword(chip, ICHREG(GLOB_STA)));  			return -EIO;  		} @@ -2490,7 +2556,7 @@ static int snd_intel8x0_ali_chip_init(struct intel8x0 *chip, int probing)  			goto __ok;  		schedule_timeout_uninterruptible(1);  	} -	snd_printk(KERN_ERR "AC'97 reset failed.\n"); +	dev_err(chip->card->dev, "AC'97 reset failed.\n");  	if (probing)  		return -EIO; @@ -2534,7 +2600,7 @@ static int snd_intel8x0_chip_init(struct intel8x0 *chip, int probing)          		        break;                  }                  if (timeout == 0) -                        printk(KERN_ERR "intel8x0: reset of registers failed?\n"); +			dev_err(chip->card->dev, "reset of registers failed?\n");          }  	/* initialize Buffer Descriptor Lists */  	for (i = 0; i < chip->bdbars_count; i++) @@ -2582,13 +2648,14 @@ static int snd_intel8x0_free(struct intel8x0 *chip)  	return 0;  } -#ifdef CONFIG_PM +#ifdef CONFIG_PM_SLEEP  /*   * power management   */ -static int intel8x0_suspend(struct pci_dev *pci, pm_message_t state) +static int intel8x0_suspend(struct device *dev)  { -	struct snd_card *card = pci_get_drvdata(pci); +	struct pci_dev *pci = to_pci_dev(dev); +	struct snd_card *card = dev_get_drvdata(dev);  	struct intel8x0 *chip = card->private_data;  	int i; @@ -2620,30 +2687,30 @@ static int intel8x0_suspend(struct pci_dev *pci, pm_message_t state)  	/* The call below may disable built-in speaker on some laptops  	 * after S2RAM.  So, don't touch it.  	 */ -	/* pci_set_power_state(pci, pci_choose_state(pci, state)); */ +	/* pci_set_power_state(pci, PCI_D3hot); */  	return 0;  } -static int intel8x0_resume(struct pci_dev *pci) +static int intel8x0_resume(struct device *dev)  { -	struct snd_card *card = pci_get_drvdata(pci); +	struct pci_dev *pci = to_pci_dev(dev); +	struct snd_card *card = dev_get_drvdata(dev);  	struct intel8x0 *chip = card->private_data;  	int i;  	pci_set_power_state(pci, PCI_D0);  	pci_restore_state(pci);  	if (pci_enable_device(pci) < 0) { -		printk(KERN_ERR "intel8x0: pci_enable_device failed, " -		       "disabling device\n"); +		dev_err(dev, "pci_enable_device failed, disabling device\n");  		snd_card_disconnect(card);  		return -EIO;  	}  	pci_set_master(pci);  	snd_intel8x0_chip_init(chip, 0);  	if (request_irq(pci->irq, snd_intel8x0_interrupt, -			IRQF_SHARED, card->shortname, chip)) { -		printk(KERN_ERR "intel8x0: unable to grab IRQ %d, " -		       "disabling device\n", pci->irq); +			IRQF_SHARED, KBUILD_MODNAME, chip)) { +		dev_err(dev, "unable to grab IRQ %d, disabling device\n", +			pci->irq);  		snd_card_disconnect(card);  		return -EIO;  	} @@ -2696,18 +2763,23 @@ static int intel8x0_resume(struct pci_dev *pci)  	snd_power_change_state(card, SNDRV_CTL_POWER_D0);  	return 0;  } -#endif /* CONFIG_PM */ + +static SIMPLE_DEV_PM_OPS(intel8x0_pm, intel8x0_suspend, intel8x0_resume); +#define INTEL8X0_PM_OPS	&intel8x0_pm +#else +#define INTEL8X0_PM_OPS	NULL +#endif /* CONFIG_PM_SLEEP */  #define INTEL8X0_TESTBUF_SIZE	32768	/* enough large for one shot */ -static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip) +static void intel8x0_measure_ac97_clock(struct intel8x0 *chip)  {  	struct snd_pcm_substream *subs;  	struct ichdev *ichdev;  	unsigned long port;  	unsigned long pos, pos1, t;  	int civ, timeout = 1000, attempt = 1; -	struct timespec start_time, stop_time; +	ktime_t start_time, stop_time;  	if (chip->ac97_bus->clock != 48000)  		return; /* specified in module option */ @@ -2715,7 +2787,8 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)        __again:  	subs = chip->pcm[0]->streams[0].substream;  	if (! subs || subs->dma_buffer.bytes < INTEL8X0_TESTBUF_SIZE) { -		snd_printk(KERN_WARNING "no playback buffer allocated - aborting measure ac97 clock\n"); +		dev_warn(chip->card->dev, +			 "no playback buffer allocated - aborting measure ac97 clock\n");  		return;  	}  	ichdev = &chip->ichd[ICHD_PCMOUT]; @@ -2725,7 +2798,8 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  	/* set rate */  	if (snd_ac97_set_rate(chip->ac97[0], AC97_PCM_FRONT_DAC_RATE, 48000) < 0) { -		snd_printk(KERN_ERR "cannot set ac97 rate: clock = %d\n", chip->ac97_bus->clock); +		dev_err(chip->card->dev, "cannot set ac97 rate: clock = %d\n", +			chip->ac97_bus->clock);  		return;  	}  	snd_intel8x0_setup_periods(chip, ichdev); @@ -2739,7 +2813,7 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  		iputbyte(chip, port + ICH_REG_OFF_CR, ICH_IOCE);  		iputdword(chip, ICHREG(ALI_DMACR), 1 << ichdev->ali_slot);  	} -	do_posix_clock_monotonic_gettime(&start_time); +	start_time = ktime_get();  	spin_unlock_irq(&chip->reg_lock);  	msleep(50);  	spin_lock_irq(&chip->reg_lock); @@ -2763,7 +2837,7 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  		pos += ichdev->position;  	}  	chip->in_measurement = 0; -	do_posix_clock_monotonic_gettime(&stop_time); +	stop_time = ktime_get();  	/* stop */  	if (chip->device_type == DEVICE_ALI) {  		iputdword(chip, ICHREG(ALI_DMACR), 1 << (ichdev->ali_slot + 16)); @@ -2779,7 +2853,8 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  	spin_unlock_irq(&chip->reg_lock);  	if (pos == 0) { -		snd_printk(KERN_ERR "intel8x0: measure - unreliable DMA position..\n"); +		dev_err(chip->card->dev, +			"measure - unreliable DMA position..\n");  	      __retry:  		if (attempt < 3) {  			msleep(300); @@ -2790,19 +2865,18 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  	}  	pos /= 4; -	t = stop_time.tv_sec - start_time.tv_sec; -	t *= 1000000; -	t += (stop_time.tv_nsec - start_time.tv_nsec) / 1000; -	printk(KERN_INFO "%s: measured %lu usecs (%lu samples)\n", __func__, t, pos); +	t = ktime_us_delta(stop_time, start_time); +	dev_info(chip->card->dev, +		 "%s: measured %lu usecs (%lu samples)\n", __func__, t, pos);  	if (t == 0) { -		snd_printk(KERN_ERR "intel8x0: ?? calculation error..\n"); +		dev_err(chip->card->dev, "?? calculation error..\n");  		goto __retry;  	}  	pos *= 1000;  	pos = (pos / t) * 1000 + ((pos % t) * 1000) / t;  	if (pos < 40000 || pos >= 60000) {  		/* abnormal value. hw problem? */ -		printk(KERN_INFO "intel8x0: measured clock %ld rejected\n", pos); +		dev_info(chip->card->dev, "measured clock %ld rejected\n", pos);  		goto __retry;  	} else if (pos > 40500 && pos < 41500)  		/* first exception - 41000Hz reference clock */ @@ -2814,11 +2888,11 @@ static void __devinit intel8x0_measure_ac97_clock(struct intel8x0 *chip)  		/* not 48000Hz, tuning the clock.. */  		chip->ac97_bus->clock = (chip->ac97_bus->clock * 48000) / pos;        __end: -	printk(KERN_INFO "intel8x0: clocking to %d\n", chip->ac97_bus->clock); +	dev_info(chip->card->dev, "clocking to %d\n", chip->ac97_bus->clock);  	snd_ac97_update_power(chip->ac97[0], AC97_PCM_FRONT_DAC_RATE, 0);  } -static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = { +static struct snd_pci_quirk intel8x0_clock_list[] = {  	SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),  	SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),  	SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), @@ -2827,7 +2901,7 @@ static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = {  	{ }	/* terminator */  }; -static int __devinit intel8x0_in_clock_list(struct intel8x0 *chip) +static int intel8x0_in_clock_list(struct intel8x0 *chip)  {  	struct pci_dev *pci = chip->pci;  	const struct snd_pci_quirk *wl; @@ -2835,7 +2909,7 @@ static int __devinit intel8x0_in_clock_list(struct intel8x0 *chip)  	wl = snd_pci_quirk_lookup(pci, intel8x0_clock_list);  	if (!wl)  		return 0; -	printk(KERN_INFO "intel8x0: white list rate for %04x:%04x is %i\n", +	dev_info(chip->card->dev, "white list rate for %04x:%04x is %i\n",  	       pci->subsystem_vendor, pci->subsystem_device, wl->value);  	chip->ac97_bus->clock = wl->value;  	return 1; @@ -2876,7 +2950,7 @@ static void snd_intel8x0_proc_read(struct snd_info_entry * entry,  			chip->ac97_sdin[2]);  } -static void __devinit snd_intel8x0_proc_init(struct intel8x0 * chip) +static void snd_intel8x0_proc_init(struct intel8x0 *chip)  {  	struct snd_info_entry *entry; @@ -2905,10 +2979,49 @@ static unsigned int sis_codec_bits[3] = {  	ICH_PCR, ICH_SCR, ICH_SIS_TCR  }; -static int __devinit snd_intel8x0_create(struct snd_card *card, -					 struct pci_dev *pci, -					 unsigned long device_type, -					 struct intel8x0 ** r_intel8x0) +static int snd_intel8x0_inside_vm(struct pci_dev *pci) +{ +	int result  = inside_vm; +	char *msg   = NULL; + +	/* check module parameter first (override detection) */ +	if (result >= 0) { +		msg = result ? "enable (forced) VM" : "disable (forced) VM"; +		goto fini; +	} + +	/* detect KVM and Parallels virtual environments */ +	result = kvm_para_available(); +#ifdef X86_FEATURE_HYPERVISOR +	result = result || boot_cpu_has(X86_FEATURE_HYPERVISOR); +#endif +	if (!result) +		goto fini; + +	/* check for known (emulated) devices */ +	if (pci->subsystem_vendor == 0x1af4 && +	    pci->subsystem_device == 0x1100) { +		/* KVM emulated sound, PCI SSID: 1af4:1100 */ +		msg = "enable KVM"; +	} else if (pci->subsystem_vendor == 0x1ab8) { +		/* Parallels VM emulated sound, PCI SSID: 1ab8:xxxx */ +		msg = "enable Parallels VM"; +	} else { +		msg = "disable (unknown or VT-d) VM"; +		result = 0; +	} + +fini: +	if (msg != NULL) +		dev_info(&pci->dev, "%s optimization\n", msg); + +	return result; +} + +static int snd_intel8x0_create(struct snd_card *card, +			       struct pci_dev *pci, +			       unsigned long device_type, +			       struct intel8x0 **r_intel8x0)  {  	struct intel8x0 *chip;  	int err; @@ -2972,6 +3085,8 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  	if (xbox)  		chip->xbox = 1; +	chip->inside_vm = snd_intel8x0_inside_vm(pci); +  	if (pci->vendor == PCI_VENDOR_ID_INTEL &&  	    pci->device == PCI_DEVICE_ID_INTEL_440MX)  		chip->fix_nocache = 1; /* enable workaround */ @@ -2993,7 +3108,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  	else  		chip->addr = pci_iomap(pci, 0, 0);  	if (!chip->addr) { -		snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); +		dev_err(card->dev, "AC'97 space ioremap problem\n");  		snd_intel8x0_free(chip);  		return -EIO;  	} @@ -3002,7 +3117,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  	else  		chip->bmaddr = pci_iomap(pci, 1, 0);  	if (!chip->bmaddr) { -		snd_printk(KERN_ERR "Controller space ioremap problem\n"); +		dev_err(card->dev, "Controller space ioremap problem\n");  		snd_intel8x0_free(chip);  		return -EIO;  	} @@ -3047,7 +3162,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  				chip->bdbars_count * sizeof(u32) * ICH_MAX_FRAGS * 2,  				&chip->bdbars) < 0) {  		snd_intel8x0_free(chip); -		snd_printk(KERN_ERR "intel8x0: cannot allocate buffer descriptors\n"); +		dev_err(card->dev, "cannot allocate buffer descriptors\n");  		return -ENOMEM;  	}  	/* tables must be aligned to 8 bytes here, but the kernel pages @@ -3100,8 +3215,8 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  	/* request irq after initializaing int_sta_mask, etc */  	if (request_irq(pci->irq, snd_intel8x0_interrupt, -			IRQF_SHARED, card->shortname, chip)) { -		snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); +			IRQF_SHARED, KBUILD_MODNAME, chip)) { +		dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);  		snd_intel8x0_free(chip);  		return -EBUSY;  	} @@ -3112,8 +3227,6 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  		return err;  	} -	snd_card_set_dev(card, &pci->dev); -  	*r_intel8x0 = chip;  	return 0;  } @@ -3121,7 +3234,7 @@ static int __devinit snd_intel8x0_create(struct snd_card *card,  static struct shortname_table {  	unsigned int id;  	const char *s; -} shortnames[] __devinitdata = { +} shortnames[] = {  	{ PCI_DEVICE_ID_INTEL_82801AA_5, "Intel 82801AA-ICH" },  	{ PCI_DEVICE_ID_INTEL_82801AB_5, "Intel 82901AB-ICH0" },  	{ PCI_DEVICE_ID_INTEL_82801BA_4, "Intel 82801BA-ICH2" }, @@ -3147,38 +3260,40 @@ static struct shortname_table {  	{ 0, NULL },  }; -static struct snd_pci_quirk spdif_aclink_defaults[] __devinitdata = { +static struct snd_pci_quirk spdif_aclink_defaults[] = {  	SND_PCI_QUIRK(0x147b, 0x1c1a, "ASUS KN8", 1),  	{ } /* end */  };  /* look up white/black list for SPDIF over ac-link */ -static int __devinit check_default_spdif_aclink(struct pci_dev *pci) +static int check_default_spdif_aclink(struct pci_dev *pci)  {  	const struct snd_pci_quirk *w;  	w = snd_pci_quirk_lookup(pci, spdif_aclink_defaults);  	if (w) {  		if (w->value) -			snd_printdd(KERN_INFO "intel8x0: Using SPDIF over " -				    "AC-Link for %s\n", w->name); +			dev_dbg(&pci->dev, +				"Using SPDIF over AC-Link for %s\n", +				    snd_pci_quirk_name(w));  		else -			snd_printdd(KERN_INFO "intel8x0: Using integrated " -				    "SPDIF DMA for %s\n", w->name); +			dev_dbg(&pci->dev, +				"Using integrated SPDIF DMA for %s\n", +				    snd_pci_quirk_name(w));  		return w->value;  	}  	return 0;  } -static int __devinit snd_intel8x0_probe(struct pci_dev *pci, -					const struct pci_device_id *pci_id) +static int snd_intel8x0_probe(struct pci_dev *pci, +			      const struct pci_device_id *pci_id)  {  	struct snd_card *card;  	struct intel8x0 *chip;  	int err;  	struct shortname_table *name; -	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card);  	if (err < 0)  		return err; @@ -3253,33 +3368,19 @@ static int __devinit snd_intel8x0_probe(struct pci_dev *pci,  	return 0;  } -static void __devexit snd_intel8x0_remove(struct pci_dev *pci) +static void snd_intel8x0_remove(struct pci_dev *pci)  {  	snd_card_free(pci_get_drvdata(pci)); -	pci_set_drvdata(pci, NULL);  } -static struct pci_driver driver = { -	.name = "Intel ICH", +static struct pci_driver intel8x0_driver = { +	.name = KBUILD_MODNAME,  	.id_table = snd_intel8x0_ids,  	.probe = snd_intel8x0_probe, -	.remove = __devexit_p(snd_intel8x0_remove), -#ifdef CONFIG_PM -	.suspend = intel8x0_suspend, -	.resume = intel8x0_resume, -#endif +	.remove = snd_intel8x0_remove, +	.driver = { +		.pm = INTEL8X0_PM_OPS, +	},  }; - -static int __init alsa_card_intel8x0_init(void) -{ -	return pci_register_driver(&driver); -} - -static void __exit alsa_card_intel8x0_exit(void) -{ -	pci_unregister_driver(&driver); -} - -module_init(alsa_card_intel8x0_init) -module_exit(alsa_card_intel8x0_exit) +module_pci_driver(intel8x0_driver);  | 
