mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 09:36:25 +00:00 
			
		
		
		
	sound: ymfpci: increase timer resolution to 96 kHz
Allow the interval timer to be programmed with its full 96 kHz precision. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
							parent
							
								
									ed680c4ad4
								
							
						
					
					
						commit
						6e2efaacb3
					
				| @ -331,6 +331,7 @@ struct snd_ymfpci { | |||||||
| 	struct snd_ac97 *ac97; | 	struct snd_ac97 *ac97; | ||||||
| 	struct snd_rawmidi *rawmidi; | 	struct snd_rawmidi *rawmidi; | ||||||
| 	struct snd_timer *timer; | 	struct snd_timer *timer; | ||||||
|  | 	unsigned int timer_ticks; | ||||||
| 
 | 
 | ||||||
| 	struct pci_dev *pci; | 	struct pci_dev *pci; | ||||||
| 	struct snd_card *card; | 	struct snd_card *card; | ||||||
|  | |||||||
| @ -834,7 +834,7 @@ static irqreturn_t snd_ymfpci_interrupt(int irq, void *dev_id) | |||||||
| 	status = snd_ymfpci_readw(chip, YDSXGR_INTFLAG); | 	status = snd_ymfpci_readw(chip, YDSXGR_INTFLAG); | ||||||
| 	if (status & 1) { | 	if (status & 1) { | ||||||
| 		if (chip->timer) | 		if (chip->timer) | ||||||
| 			snd_timer_interrupt(chip->timer, chip->timer->sticks); | 			snd_timer_interrupt(chip->timer, chip->timer_ticks); | ||||||
| 	} | 	} | ||||||
| 	snd_ymfpci_writew(chip, YDSXGR_INTFLAG, status); | 	snd_ymfpci_writew(chip, YDSXGR_INTFLAG, status); | ||||||
| 
 | 
 | ||||||
| @ -1885,8 +1885,18 @@ static int snd_ymfpci_timer_start(struct snd_timer *timer) | |||||||
| 	unsigned int count; | 	unsigned int count; | ||||||
| 
 | 
 | ||||||
| 	chip = snd_timer_chip(timer); | 	chip = snd_timer_chip(timer); | ||||||
| 	count = (timer->sticks << 1) - 1; |  | ||||||
| 	spin_lock_irqsave(&chip->reg_lock, flags); | 	spin_lock_irqsave(&chip->reg_lock, flags); | ||||||
|  | 	if (timer->sticks > 1) { | ||||||
|  | 		chip->timer_ticks = timer->sticks; | ||||||
|  | 		count = timer->sticks - 1; | ||||||
|  | 	} else { | ||||||
|  | 		/*
 | ||||||
|  | 		 * Divisor 1 is not allowed; fake it by using divisor 2 and | ||||||
|  | 		 * counting two ticks for each interrupt. | ||||||
|  | 		 */ | ||||||
|  | 		chip->timer_ticks = 2; | ||||||
|  | 		count = 2 - 1; | ||||||
|  | 	} | ||||||
| 	snd_ymfpci_writew(chip, YDSXGR_TIMERCOUNT, count); | 	snd_ymfpci_writew(chip, YDSXGR_TIMERCOUNT, count); | ||||||
| 	snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x03); | 	snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x03); | ||||||
| 	spin_unlock_irqrestore(&chip->reg_lock, flags); | 	spin_unlock_irqrestore(&chip->reg_lock, flags); | ||||||
| @ -1909,14 +1919,14 @@ static int snd_ymfpci_timer_precise_resolution(struct snd_timer *timer, | |||||||
| 					       unsigned long *num, unsigned long *den) | 					       unsigned long *num, unsigned long *den) | ||||||
| { | { | ||||||
| 	*num = 1; | 	*num = 1; | ||||||
| 	*den = 48000; | 	*den = 96000; | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct snd_timer_hardware snd_ymfpci_timer_hw = { | static struct snd_timer_hardware snd_ymfpci_timer_hw = { | ||||||
| 	.flags = SNDRV_TIMER_HW_AUTO, | 	.flags = SNDRV_TIMER_HW_AUTO, | ||||||
| 	.resolution = 20833, /* 1/fs = 20.8333...us */ | 	.resolution = 10417, /* 1 / 96 kHz = 10.41666...us */ | ||||||
| 	.ticks = 0x8000, | 	.ticks = 0x10000, | ||||||
| 	.start = snd_ymfpci_timer_start, | 	.start = snd_ymfpci_timer_start, | ||||||
| 	.stop = snd_ymfpci_timer_stop, | 	.stop = snd_ymfpci_timer_stop, | ||||||
| 	.precise_resolution = snd_ymfpci_timer_precise_resolution, | 	.precise_resolution = snd_ymfpci_timer_precise_resolution, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Clemens Ladisch
						Clemens Ladisch