diff options
Diffstat (limited to 'sound/pci/ice1712/ice1712.c')
| -rw-r--r-- | sound/pci/ice1712/ice1712.c | 313 | 
1 files changed, 211 insertions, 102 deletions
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index 4fc6d8bc637..d9b9e4595f1 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -47,14 +47,13 @@   */ -#include <linux/io.h>  #include <linux/delay.h>  #include <linux/interrupt.h>  #include <linux/init.h>  #include <linux/pci.h>  #include <linux/dma-mapping.h>  #include <linux/slab.h> -#include <linux/moduleparam.h> +#include <linux/module.h>  #include <linux/mutex.h>  #include <sound/core.h> @@ -84,10 +83,10 @@ MODULE_SUPPORTED_DEVICE("{"  static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */  static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */ -static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */ +static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */  static char *model[SNDRV_CARDS]; -static int omni[SNDRV_CARDS];				/* Delta44 & 66 Omni I/O support */ -static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transciever reset timeout value in msec */ +static bool omni[SNDRV_CARDS];				/* Delta44 & 66 Omni I/O support */ +static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transceiver reset timeout value in msec */  static int dxr_enable[SNDRV_CARDS];			/* DXR enable for DMX6FIRE */  module_param_array(index, int, NULL, 0444); @@ -280,7 +279,7 @@ static int snd_ice1712_digmix_route_ac97_put(struct snd_kcontrol *kcontrol, stru  	return val != nval;  } -static struct snd_kcontrol_new snd_ice1712_mixer_digmix_route_ac97 __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_mixer_digmix_route_ac97 = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Digital Mixer To AC97",  	.info = snd_ice1712_digmix_route_ac97_info, @@ -388,14 +387,14 @@ static void setup_cs8427(struct snd_ice1712 *ice, int rate)  /*   * create and initialize callbacks for cs8427 interface   */ -int __devinit snd_ice1712_init_cs8427(struct snd_ice1712 *ice, int addr) +int snd_ice1712_init_cs8427(struct snd_ice1712 *ice, int addr)  {  	int err;  	err = snd_cs8427_create(ice->i2c, addr,  		(ice->cs8427_timeout * HZ) / 1000, &ice->cs8427);  	if (err < 0) { -		snd_printk(KERN_ERR "CS8427 initialization failed\n"); +		dev_err(ice->card->dev, "CS8427 initialization failed\n");  		return err;  	}  	ice->spdif.ops.open = open_cs8427; @@ -468,7 +467,7 @@ static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id)  			u16 pbkstatus;  			struct snd_pcm_substream *substream;  			pbkstatus = inw(ICEDS(ice, INTSTAT)); -			/* printk(KERN_DEBUG "pbkstatus = 0x%x\n", pbkstatus); */ +			/* dev_dbg(ice->card->dev, "pbkstatus = 0x%x\n", pbkstatus); */  			for (idx = 0; idx < 6; idx++) {  				if ((pbkstatus & (3 << (idx * 2))) == 0)  					continue; @@ -686,9 +685,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pointer(struct snd_pcm_substream *  	if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1))  		return 0;  	ptr = runtime->buffer_size - inw(ice->ddma_port + 4); +	ptr = bytes_to_frames(substream->runtime, ptr);  	if (ptr == runtime->buffer_size)  		ptr = 0; -	return bytes_to_frames(substream->runtime, ptr); +	return ptr;  }  static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream) @@ -705,9 +705,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substrea  		addr = ICE1712_DSC_ADDR0;  	ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) -  		ice->playback_con_virt_addr[substream->number]; +	ptr = bytes_to_frames(substream->runtime, ptr);  	if (ptr == substream->runtime->buffer_size)  		ptr = 0; -	return bytes_to_frames(substream->runtime, ptr); +	return ptr;  }  static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream) @@ -718,9 +719,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *s  	if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1))  		return 0;  	ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr; +	ptr = bytes_to_frames(substream->runtime, ptr);  	if (ptr == substream->runtime->buffer_size)  		ptr = 0; -	return bytes_to_frames(substream->runtime, ptr); +	return ptr;  }  static const struct snd_pcm_hardware snd_ice1712_playback = { @@ -879,7 +881,7 @@ static struct snd_pcm_ops snd_ice1712_capture_ops = {  	.pointer =	snd_ice1712_capture_pointer,  }; -static int __devinit snd_ice1712_pcm(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm) +static int snd_ice1712_pcm(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm)  {  	struct snd_pcm *pcm;  	int err; @@ -904,12 +906,13 @@ static int __devinit snd_ice1712_pcm(struct snd_ice1712 *ice, int device, struct  	if (rpcm)  		*rpcm = pcm; -	printk(KERN_WARNING "Consumer PCM code does not work well at the moment --jk\n"); +	dev_warn(ice->card->dev, +		 "Consumer PCM code does not work well at the moment --jk\n");  	return 0;  } -static int __devinit snd_ice1712_pcm_ds(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm) +static int snd_ice1712_pcm_ds(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm)  {  	struct snd_pcm *pcm;  	int err; @@ -1048,6 +1051,8 @@ __out:  	old = inb(ICEMT(ice, RATE));  	if (!force && old == val)  		goto __out; + +	ice->cur_rate = rate;  	outb(val, ICEMT(ice, RATE));  	spin_unlock_irqrestore(&ice->reg_lock, flags); @@ -1114,9 +1119,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pro_pointer(struct snd_pcm_substre  	if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START))  		return 0;  	ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2); +	ptr = bytes_to_frames(substream->runtime, ptr);  	if (ptr == substream->runtime->buffer_size)  		ptr = 0; -	return bytes_to_frames(substream->runtime, ptr); +	return ptr;  }  static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream) @@ -1127,9 +1133,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substrea  	if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW))  		return 0;  	ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2); +	ptr = bytes_to_frames(substream->runtime, ptr);  	if (ptr == substream->runtime->buffer_size)  		ptr = 0; -	return bytes_to_frames(substream->runtime, ptr); +	return ptr;  }  static const struct snd_pcm_hardware snd_ice1712_playback_pro = { @@ -1254,7 +1261,7 @@ static struct snd_pcm_ops snd_ice1712_capture_pro_ops = {  	.pointer =	snd_ice1712_capture_pro_pointer,  }; -static int __devinit snd_ice1712_pcm_profi(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm) +static int snd_ice1712_pcm_profi(struct snd_ice1712 *ice, int device, struct snd_pcm **rpcm)  {  	struct snd_pcm *pcm;  	int err; @@ -1388,7 +1395,7 @@ static int snd_ice1712_pro_mixer_volume_put(struct snd_kcontrol *kcontrol, struc  static const DECLARE_TLV_DB_SCALE(db_scale_playback, -14400, 150, 0); -static struct snd_kcontrol_new snd_ice1712_multi_playback_ctrls[] __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_multi_playback_ctrls[] = {  	{  		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  		.name = "Multi Playback Switch", @@ -1412,7 +1419,7 @@ static struct snd_kcontrol_new snd_ice1712_multi_playback_ctrls[] __devinitdata  	},  }; -static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_switch __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_switch = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "H/W Multi Capture Switch",  	.info = snd_ice1712_pro_mixer_switch_info, @@ -1421,7 +1428,7 @@ static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_switch __devinit  	.private_value = 10,  }; -static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_switch __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_switch = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = SNDRV_CTL_NAME_IEC958("Multi ", CAPTURE, SWITCH),  	.info = snd_ice1712_pro_mixer_switch_info, @@ -1431,7 +1438,7 @@ static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_switch __devinitd  	.count = 2,  }; -static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_volume __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_volume = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.access = (SNDRV_CTL_ELEM_ACCESS_READWRITE |  		   SNDRV_CTL_ELEM_ACCESS_TLV_READ), @@ -1443,7 +1450,7 @@ static struct snd_kcontrol_new snd_ice1712_multi_capture_analog_volume __devinit  	.tlv = { .p = db_scale_playback }  }; -static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_volume __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_volume = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = SNDRV_CTL_NAME_IEC958("Multi ", CAPTURE, VOLUME),  	.info = snd_ice1712_pro_mixer_volume_info, @@ -1453,7 +1460,7 @@ static struct snd_kcontrol_new snd_ice1712_multi_capture_spdif_volume __devinitd  	.count = 2,  }; -static int __devinit snd_ice1712_build_pro_mixer(struct snd_ice1712 *ice) +static int snd_ice1712_build_pro_mixer(struct snd_ice1712 *ice)  {  	struct snd_card *card = ice->card;  	unsigned int idx; @@ -1512,7 +1519,7 @@ static void snd_ice1712_mixer_free_ac97(struct snd_ac97 *ac97)  	ice->ac97 = NULL;  } -static int __devinit snd_ice1712_ac97_mixer(struct snd_ice1712 *ice) +static int snd_ice1712_ac97_mixer(struct snd_ice1712 *ice)  {  	int err, bus_num = 0;  	struct snd_ac97_template ac97; @@ -1535,7 +1542,8 @@ static int __devinit snd_ice1712_ac97_mixer(struct snd_ice1712 *ice)  		ac97.private_free = snd_ice1712_mixer_free_ac97;  		err = snd_ac97_mixer(pbus, &ac97, &ice->ac97);  		if (err < 0) -			printk(KERN_WARNING "ice1712: cannot initialize ac97 for consumer, skipped\n"); +			dev_warn(ice->card->dev, +				 "cannot initialize ac97 for consumer, skipped\n");  		else {  			err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_mixer_digmix_route_ac97, ice));  			if (err < 0) @@ -1553,7 +1561,8 @@ static int __devinit snd_ice1712_ac97_mixer(struct snd_ice1712 *ice)  		ac97.private_free = snd_ice1712_mixer_free_ac97;  		err = snd_ac97_mixer(pbus, &ac97, &ice->ac97);  		if (err < 0) -			printk(KERN_WARNING "ice1712: cannot initialize pro ac97, skipped\n"); +			dev_warn(ice->card->dev, +				 "cannot initialize pro ac97, skipped\n");  		else  			return 0;  	} @@ -1611,7 +1620,7 @@ static void snd_ice1712_proc_read(struct snd_info_entry *entry,  	snd_iprintf(buffer, "  GPIO_DIRECTION   : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION));  } -static void __devinit snd_ice1712_proc_init(struct snd_ice1712 *ice) +static void snd_ice1712_proc_init(struct snd_ice1712 *ice)  {  	struct snd_info_entry *entry; @@ -1640,7 +1649,7 @@ static int snd_ice1712_eeprom_get(struct snd_kcontrol *kcontrol,  	return 0;  } -static struct snd_kcontrol_new snd_ice1712_eeprom __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_eeprom = {  	.iface = SNDRV_CTL_ELEM_IFACE_CARD,  	.name = "ICE1712 EEPROM",  	.access = SNDRV_CTL_ELEM_ACCESS_READ, @@ -1676,7 +1685,7 @@ static int snd_ice1712_spdif_default_put(struct snd_kcontrol *kcontrol,  	return 0;  } -static struct snd_kcontrol_new snd_ice1712_spdif_default __devinitdata = +static struct snd_kcontrol_new snd_ice1712_spdif_default =  {  	.iface =	SNDRV_CTL_ELEM_IFACE_PCM,  	.name =         SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT), @@ -1727,7 +1736,7 @@ static int snd_ice1712_spdif_maskp_get(struct snd_kcontrol *kcontrol,  	return 0;  } -static struct snd_kcontrol_new snd_ice1712_spdif_maskc __devinitdata = +static struct snd_kcontrol_new snd_ice1712_spdif_maskc =  {  	.access =	SNDRV_CTL_ELEM_ACCESS_READ,  	.iface =	SNDRV_CTL_ELEM_IFACE_PCM, @@ -1736,7 +1745,7 @@ static struct snd_kcontrol_new snd_ice1712_spdif_maskc __devinitdata =  	.get =		snd_ice1712_spdif_maskc_get,  }; -static struct snd_kcontrol_new snd_ice1712_spdif_maskp __devinitdata = +static struct snd_kcontrol_new snd_ice1712_spdif_maskp =  {  	.access =	SNDRV_CTL_ELEM_ACCESS_READ,  	.iface =	SNDRV_CTL_ELEM_IFACE_PCM, @@ -1763,7 +1772,7 @@ static int snd_ice1712_spdif_stream_put(struct snd_kcontrol *kcontrol,  	return 0;  } -static struct snd_kcontrol_new snd_ice1712_spdif_stream __devinitdata = +static struct snd_kcontrol_new snd_ice1712_spdif_stream =  {  	.access =	(SNDRV_CTL_ELEM_ACCESS_READWRITE |  			 SNDRV_CTL_ELEM_ACCESS_INACTIVE), @@ -1894,7 +1903,7 @@ static int snd_ice1712_pro_internal_clock_put(struct snd_kcontrol *kcontrol,  	return change;  } -static struct snd_kcontrol_new snd_ice1712_pro_internal_clock __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_pro_internal_clock = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Multi Track Internal Clock",  	.info = snd_ice1712_pro_internal_clock_info, @@ -1965,7 +1974,7 @@ static int snd_ice1712_pro_internal_clock_default_put(struct snd_kcontrol *kcont  	return change;  } -static struct snd_kcontrol_new snd_ice1712_pro_internal_clock_default __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_pro_internal_clock_default = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Multi Track Internal Clock Default",  	.info = snd_ice1712_pro_internal_clock_default_info, @@ -1996,7 +2005,7 @@ static int snd_ice1712_pro_rate_locking_put(struct snd_kcontrol *kcontrol,  	return change;  } -static struct snd_kcontrol_new snd_ice1712_pro_rate_locking __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_pro_rate_locking = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Multi Track Rate Locking",  	.info = snd_ice1712_pro_rate_locking_info, @@ -2027,7 +2036,7 @@ static int snd_ice1712_pro_rate_reset_put(struct snd_kcontrol *kcontrol,  	return change;  } -static struct snd_kcontrol_new snd_ice1712_pro_rate_reset __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_pro_rate_reset = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Multi Track Rate Reset",  	.info = snd_ice1712_pro_rate_reset_info, @@ -2194,7 +2203,7 @@ static int snd_ice1712_pro_route_spdif_put(struct snd_kcontrol *kcontrol,  	return change;  } -static struct snd_kcontrol_new snd_ice1712_mixer_pro_analog_route __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_mixer_pro_analog_route = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "H/W Playback Route",  	.info = snd_ice1712_pro_route_info, @@ -2202,7 +2211,7 @@ static struct snd_kcontrol_new snd_ice1712_mixer_pro_analog_route __devinitdata  	.put = snd_ice1712_pro_route_analog_put,  }; -static struct snd_kcontrol_new snd_ice1712_mixer_pro_spdif_route __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_mixer_pro_spdif_route = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, NONE) "Route",  	.info = snd_ice1712_pro_route_info, @@ -2244,7 +2253,7 @@ static int snd_ice1712_pro_volume_rate_put(struct snd_kcontrol *kcontrol,  	return change;  } -static struct snd_kcontrol_new snd_ice1712_mixer_pro_volume_rate __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_mixer_pro_volume_rate = {  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  	.name = "Multi Track Volume Rate",  	.info = snd_ice1712_pro_volume_rate_info, @@ -2277,7 +2286,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol,  	return 0;  } -static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { +static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak = {  	.iface = SNDRV_CTL_ELEM_IFACE_PCM,  	.name = "Multi Track Peak",  	.access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, @@ -2292,16 +2301,16 @@ static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = {  /*   * list of available boards   */ -static struct snd_ice1712_card_info *card_tables[] __devinitdata = { +static struct snd_ice1712_card_info *card_tables[] = {  	snd_ice1712_hoontech_cards,  	snd_ice1712_delta_cards,  	snd_ice1712_ews_cards,  	NULL,  }; -static unsigned char __devinit snd_ice1712_read_i2c(struct snd_ice1712 *ice, -						 unsigned char dev, -						 unsigned char addr) +static unsigned char snd_ice1712_read_i2c(struct snd_ice1712 *ice, +					  unsigned char dev, +					  unsigned char addr)  {  	long t = 0x10000; @@ -2311,8 +2320,8 @@ static unsigned char __devinit snd_ice1712_read_i2c(struct snd_ice1712 *ice,  	return inb(ICEREG(ice, I2C_DATA));  } -static int __devinit snd_ice1712_read_eeprom(struct snd_ice1712 *ice, -					     const char *modelname) +static int snd_ice1712_read_eeprom(struct snd_ice1712 *ice, +				   const char *modelname)  {  	int dev = 0xa0;		/* EEPROM device address */  	unsigned int i, size; @@ -2333,7 +2342,8 @@ static int __devinit snd_ice1712_read_eeprom(struct snd_ice1712 *ice,  			pci_read_config_word(ice->pci, PCI_SUBSYSTEM_ID, &device);  			ice->eeprom.subvendor = ((unsigned int)swab16(vendor) << 16) | swab16(device);  			if (ice->eeprom.subvendor == 0 || ice->eeprom.subvendor == (unsigned int)-1) { -				printk(KERN_ERR "ice1712: No valid ID is found\n"); +				dev_err(ice->card->dev, +					"No valid ID is found\n");  				return -ENXIO;  			}  		} @@ -2341,21 +2351,22 @@ static int __devinit snd_ice1712_read_eeprom(struct snd_ice1712 *ice,  	for (tbl = card_tables; *tbl; tbl++) {  		for (c = *tbl; c->subvendor; c++) {  			if (modelname && c->model && !strcmp(modelname, c->model)) { -				printk(KERN_INFO "ice1712: Using board model %s\n", c->name); +				dev_info(ice->card->dev, +					 "Using board model %s\n", c->name);  				ice->eeprom.subvendor = c->subvendor;  			} else if (c->subvendor != ice->eeprom.subvendor)  				continue;  			if (!c->eeprom_size || !c->eeprom_data)  				goto found;  			/* if the EEPROM is given by the driver, use it */ -			snd_printdd("using the defined eeprom..\n"); +			dev_dbg(ice->card->dev, "using the defined eeprom..\n");  			ice->eeprom.version = 1;  			ice->eeprom.size = c->eeprom_size + 6;  			memcpy(ice->eeprom.data, c->eeprom_data, c->eeprom_size);  			goto read_skipped;  		}  	} -	printk(KERN_WARNING "ice1712: No matching model found for ID 0x%x\n", +	dev_warn(ice->card->dev, "No matching model found for ID 0x%x\n",  	       ice->eeprom.subvendor);   found: @@ -2363,12 +2374,13 @@ static int __devinit snd_ice1712_read_eeprom(struct snd_ice1712 *ice,  	if (ice->eeprom.size < 6)  		ice->eeprom.size = 32; /* FIXME: any cards without the correct size? */  	else if (ice->eeprom.size > 32) { -		snd_printk(KERN_ERR "invalid EEPROM (size = %i)\n", ice->eeprom.size); +		dev_err(ice->card->dev, +			"invalid EEPROM (size = %i)\n", ice->eeprom.size);  		return -EIO;  	}  	ice->eeprom.version = snd_ice1712_read_i2c(ice, dev, 0x05);  	if (ice->eeprom.version != 1) { -		snd_printk(KERN_ERR "invalid EEPROM version %i\n", +		dev_err(ice->card->dev, "invalid EEPROM version %i\n",  			   ice->eeprom.version);  		/* return -EIO; */  	} @@ -2386,7 +2398,7 @@ static int __devinit snd_ice1712_read_eeprom(struct snd_ice1712 *ice, -static int __devinit snd_ice1712_chip_init(struct snd_ice1712 *ice) +static int snd_ice1712_chip_init(struct snd_ice1712 *ice)  {  	outb(ICE1712_RESET | ICE1712_NATIVE, ICEREG(ice, CONTROL));  	udelay(200); @@ -2429,11 +2441,18 @@ static int __devinit snd_ice1712_chip_init(struct snd_ice1712 *ice)  		snd_ice1712_write(ice, ICE1712_IREG_CONSUMER_POWERDOWN, 0);  	}  	snd_ice1712_set_pro_rate(ice, 48000, 1); +	/* unmask used interrupts */ +	outb(((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) == 0 ? +	      ICE1712_IRQ_MPU2 : 0) | +	     ((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_NO_CON_AC97) ? +	      ICE1712_IRQ_PBKDS | ICE1712_IRQ_CONCAP | ICE1712_IRQ_CONPBK : 0), +	     ICEREG(ice, IRQMASK)); +	outb(0x00, ICEMT(ice, IRQ));  	return 0;  } -int __devinit snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice) +int snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice)  {  	int err;  	struct snd_kcontrol *kctl; @@ -2461,7 +2480,7 @@ int __devinit snd_ice1712_spdif_build_controls(struct snd_ice1712 *ice)  } -static int __devinit snd_ice1712_build_controls(struct snd_ice1712 *ice) +static int snd_ice1712_build_controls(struct snd_ice1712 *ice)  {  	int err; @@ -2531,13 +2550,13 @@ static int snd_ice1712_dev_free(struct snd_device *device)  	return snd_ice1712_free(ice);  } -static int __devinit snd_ice1712_create(struct snd_card *card, -					struct pci_dev *pci, -					const char *modelname, -					int omni, -					int cs8427_timeout, -					int dxr_enable, -					struct snd_ice1712 **r_ice1712) +static int snd_ice1712_create(struct snd_card *card, +			      struct pci_dev *pci, +			      const char *modelname, +			      int omni, +			      int cs8427_timeout, +			      int dxr_enable, +			      struct snd_ice1712 **r_ice1712)  {  	struct snd_ice1712 *ice;  	int err; @@ -2554,7 +2573,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card,  	/* check, if we can restrict PCI DMA transfers to 28 bits */  	if (pci_set_dma_mask(pci, DMA_BIT_MASK(28)) < 0 ||  	    pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(28)) < 0) { -		snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); +		dev_err(card->dev, +			"architecture does not support 28bit PCI busmaster DMA\n");  		pci_disable_device(pci);  		return -ENXIO;  	} @@ -2590,11 +2610,14 @@ static int __devinit snd_ice1712_create(struct snd_card *card,  	ice->pci = pci;  	ice->irq = -1;  	pci_set_master(pci); +	/* disable legacy emulation */  	pci_write_config_word(ice->pci, 0x40, 0x807f);  	pci_write_config_word(ice->pci, 0x42, 0x0006);  	snd_ice1712_proc_init(ice);  	synchronize_irq(pci->irq); +	card->private_data = ice; +  	err = pci_request_regions(pci, "ICE1712");  	if (err < 0) {  		kfree(ice); @@ -2607,8 +2630,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card,  	ice->profi_port = pci_resource_start(pci, 3);  	if (request_irq(pci->irq, snd_ice1712_interrupt, IRQF_SHARED, -			"ICE1712", ice)) { -		snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); +			KBUILD_MODNAME, ice)) { +		dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);  		snd_ice1712_free(ice);  		return -EIO;  	} @@ -2624,22 +2647,12 @@ static int __devinit snd_ice1712_create(struct snd_card *card,  		return -EIO;  	} -	/* unmask used interrupts */ -	outb(((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_2xMPU401) == 0 ? -	      ICE1712_IRQ_MPU2 : 0) | -	     ((ice->eeprom.data[ICE_EEP1_CODEC] & ICE1712_CFG_NO_CON_AC97) ? -	      ICE1712_IRQ_PBKDS | ICE1712_IRQ_CONCAP | ICE1712_IRQ_CONPBK : 0), -	     ICEREG(ice, IRQMASK)); -	outb(0x00, ICEMT(ice, IRQ)); -  	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, ice, &ops);  	if (err < 0) {  		snd_ice1712_free(ice);  		return err;  	} -	snd_card_set_dev(card, &pci->dev); -  	*r_ice1712 = ice;  	return 0;  } @@ -2651,10 +2664,10 @@ static int __devinit snd_ice1712_create(struct snd_card *card,   *   */ -static struct snd_ice1712_card_info no_matched __devinitdata; +static struct snd_ice1712_card_info no_matched; -static int __devinit snd_ice1712_probe(struct pci_dev *pci, -				       const struct pci_device_id *pci_id) +static int snd_ice1712_probe(struct pci_dev *pci, +			     const struct pci_device_id *pci_id)  {  	static int dev;  	struct snd_card *card; @@ -2669,7 +2682,8 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, +			   0, &card);  	if (err < 0)  		return err; @@ -2686,6 +2700,7 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  	for (tbl = card_tables; *tbl; tbl++) {  		for (c = *tbl; c->subvendor; c++) {  			if (c->subvendor == ice->eeprom.subvendor) { +				ice->card_info = c;  				strcpy(card->shortname, c->name);  				if (c->driver) /* specific driver? */  					strcpy(card->driver, c->driver); @@ -2748,14 +2763,15 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  	if (!c->no_mpu401) {  		err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712,  			ICEREG(ice, MPU1_CTRL), -			(c->mpu401_1_info_flags | MPU401_INFO_INTEGRATED), -			ice->irq, 0, &ice->rmidi[0]); +			c->mpu401_1_info_flags | +			MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, +			-1, &ice->rmidi[0]);  		if (err < 0) {  			snd_card_free(card);  			return err;  		}  		if (c->mpu401_1_name) -			/*  Prefered name available in card_info */ +			/*  Preferred name available in card_info */  			snprintf(ice->rmidi[0]->name,  				 sizeof(ice->rmidi[0]->name),  				 "%s %d", c->mpu401_1_name, card->number); @@ -2764,15 +2780,16 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  			/*  2nd port used  */  			err = snd_mpu401_uart_new(card, 1, MPU401_HW_ICE1712,  				ICEREG(ice, MPU2_CTRL), -				(c->mpu401_2_info_flags | MPU401_INFO_INTEGRATED), -				ice->irq, 0, &ice->rmidi[1]); +				c->mpu401_2_info_flags | +				MPU401_INFO_INTEGRATED | MPU401_INFO_IRQ_HOOK, +				-1, &ice->rmidi[1]);  			if (err < 0) {  				snd_card_free(card);  				return err;  			}  			if (c->mpu401_2_name) -				/*  Prefered name available in card_info */ +				/*  Preferred name available in card_info */  				snprintf(ice->rmidi[1]->name,  					 sizeof(ice->rmidi[1]->name),  					 "%s %d", c->mpu401_2_name, @@ -2795,28 +2812,120 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  	return 0;  } -static void __devexit snd_ice1712_remove(struct pci_dev *pci) +static void snd_ice1712_remove(struct pci_dev *pci)  { -	snd_card_free(pci_get_drvdata(pci)); -	pci_set_drvdata(pci, NULL); -} +	struct snd_card *card = pci_get_drvdata(pci); +	struct snd_ice1712 *ice = card->private_data; -static struct pci_driver driver = { -	.name = "ICE1712", -	.id_table = snd_ice1712_ids, -	.probe = snd_ice1712_probe, -	.remove = __devexit_p(snd_ice1712_remove), -}; +	if (ice->card_info && ice->card_info->chip_exit) +		ice->card_info->chip_exit(ice); +	snd_card_free(card); +} -static int __init alsa_card_ice1712_init(void) +#ifdef CONFIG_PM_SLEEP +static int snd_ice1712_suspend(struct device *dev)  { -	return pci_register_driver(&driver); +	struct pci_dev *pci = to_pci_dev(dev); +	struct snd_card *card = dev_get_drvdata(dev); +	struct snd_ice1712 *ice = card->private_data; + +	if (!ice->pm_suspend_enabled) +		return 0; + +	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); + +	snd_pcm_suspend_all(ice->pcm); +	snd_pcm_suspend_all(ice->pcm_pro); +	snd_pcm_suspend_all(ice->pcm_ds); +	snd_ac97_suspend(ice->ac97); + +	spin_lock_irq(&ice->reg_lock); +	ice->pm_saved_is_spdif_master = is_spdif_master(ice); +	ice->pm_saved_spdif_ctrl = inw(ICEMT(ice, ROUTE_SPDOUT)); +	ice->pm_saved_route = inw(ICEMT(ice, ROUTE_PSDOUT03)); +	spin_unlock_irq(&ice->reg_lock); + +	if (ice->pm_suspend) +		ice->pm_suspend(ice); + +	pci_disable_device(pci); +	pci_save_state(pci); +	pci_set_power_state(pci, PCI_D3hot); +	return 0;  } -static void __exit alsa_card_ice1712_exit(void) +static int snd_ice1712_resume(struct device *dev)  { -	pci_unregister_driver(&driver); +	struct pci_dev *pci = to_pci_dev(dev); +	struct snd_card *card = dev_get_drvdata(dev); +	struct snd_ice1712 *ice = card->private_data; +	int rate; + +	if (!ice->pm_suspend_enabled) +		return 0; + +	pci_set_power_state(pci, PCI_D0); +	pci_restore_state(pci); + +	if (pci_enable_device(pci) < 0) { +		snd_card_disconnect(card); +		return -EIO; +	} + +	pci_set_master(pci); + +	if (ice->cur_rate) +		rate = ice->cur_rate; +	else +		rate = PRO_RATE_DEFAULT; + +	if (snd_ice1712_chip_init(ice) < 0) { +		snd_card_disconnect(card); +		return -EIO; +	} + +	ice->cur_rate = rate; + +	if (ice->pm_resume) +		ice->pm_resume(ice); + +	if (ice->pm_saved_is_spdif_master) { +		/* switching to external clock via SPDIF */ +		spin_lock_irq(&ice->reg_lock); +		outb(inb(ICEMT(ice, RATE)) | ICE1712_SPDIF_MASTER, +			ICEMT(ice, RATE)); +		spin_unlock_irq(&ice->reg_lock); +		snd_ice1712_set_input_clock_source(ice, 1); +	} else { +		/* internal on-card clock */ +		snd_ice1712_set_pro_rate(ice, rate, 1); +		snd_ice1712_set_input_clock_source(ice, 0); +	} + +	outw(ice->pm_saved_spdif_ctrl, ICEMT(ice, ROUTE_SPDOUT)); +	outw(ice->pm_saved_route, ICEMT(ice, ROUTE_PSDOUT03)); + +	if (ice->ac97) +		snd_ac97_resume(ice->ac97); + +	snd_power_change_state(card, SNDRV_CTL_POWER_D0); +	return 0;  } -module_init(alsa_card_ice1712_init) -module_exit(alsa_card_ice1712_exit) +static SIMPLE_DEV_PM_OPS(snd_ice1712_pm, snd_ice1712_suspend, snd_ice1712_resume); +#define SND_VT1712_PM_OPS	&snd_ice1712_pm +#else +#define SND_VT1712_PM_OPS	NULL +#endif /* CONFIG_PM_SLEEP */ + +static struct pci_driver ice1712_driver = { +	.name = KBUILD_MODNAME, +	.id_table = snd_ice1712_ids, +	.probe = snd_ice1712_probe, +	.remove = snd_ice1712_remove, +	.driver = { +		.pm = SND_VT1712_PM_OPS, +	}, +}; + +module_pci_driver(ice1712_driver);  | 
