⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aureon.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	ucontrol->value.integer.value[0] = aureon_get_headphone_amp(ice);	return 0;}static int aureon_hpamp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ice1712_t *ice = snd_kcontrol_chip(kcontrol);	return aureon_set_headphone_amp(ice,ucontrol->value.integer.value[0]);}/* * Deemphasis */static int aureon_deemp_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ice1712_t *ice = snd_kcontrol_chip(kcontrol);	ucontrol->value.integer.value[0] = (wm_get(ice, WM_DAC_CTRL2) & 0xf) == 0xf;	return 0;}static int aureon_deemp_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ice1712_t *ice = snd_kcontrol_chip(kcontrol);	int temp, temp2;	temp2 = temp = wm_get(ice, WM_DAC_CTRL2);	if (ucontrol->value.integer.value[0])		temp |= 0xf;	else		temp &= ~0xf;	if (temp != temp2) {		wm_put(ice, WM_DAC_CTRL2, temp);		return 1;	}	return 0;}/* * ADC Oversampling */static int aureon_oversampling_info(snd_kcontrol_t *k, snd_ctl_elem_info_t *uinfo){	static char *texts[2] = { "128x", "64x"	};	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = 2;	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);        return 0;}static int aureon_oversampling_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	ice1712_t *ice = snd_kcontrol_chip(kcontrol);	ucontrol->value.enumerated.item[0] = (wm_get(ice, WM_MASTER) & 0x8) == 0x8;	return 0;}static int aureon_oversampling_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	int temp, temp2;	ice1712_t *ice = snd_kcontrol_chip(kcontrol);	temp2 = temp = wm_get(ice, WM_MASTER);	if (ucontrol->value.enumerated.item[0])		temp |= 0x8;	else		temp &= ~0x8;	if (temp != temp2) {		wm_put(ice, WM_MASTER, temp);		return 1;	}	return 0;}/* * mixers */static snd_kcontrol_new_t aureon51_dac_control __devinitdata = {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	.name = "DAC Volume",	.count = 6,	.info = wm_dac_vol_info,	.get = wm_dac_vol_get,	.put = wm_dac_vol_put,};static snd_kcontrol_new_t aureon71_dac_control __devinitdata = {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,	.name = "DAC Volume",	.count = 8,	.info = wm_dac_vol_info,	.get = wm_dac_vol_get,	.put = wm_dac_vol_put,};static snd_kcontrol_new_t wm_controls[] __devinitdata = {	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Master Playback Switch",		.info = wm_dac_mute_info,		.get = wm_dac_mute_get,		.put = wm_dac_mute_put,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Master Playback Volume",		.info = wm_dac_vol_info,		.get = wm_dac_vol_get,		.put = wm_dac_vol_put,		.private_value = 1,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "ADC Switch",		.count = 2,		.info = wm_adc_mute_info,		.get = wm_adc_mute_get,		.put = wm_adc_mute_put,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "ADC Volume",		.count = 2,		.info = wm_adc_vol_info,		.get = wm_adc_vol_get,		.put = wm_adc_vol_put,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Capture Route",		.info = wm_adc_mux_info,		.get = wm_adc_mux_get,		.put = wm_adc_mux_put,	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Headphone Amplifier Switch",		.info = aureon_bool_info,		.get = aureon_hpamp_get,		.put = aureon_hpamp_put	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "DAC Deemphasis Switch",		.info = aureon_bool_info,		.get = aureon_deemp_get,		.put = aureon_deemp_put	},	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "ADC Oversampling",		.info = aureon_oversampling_info,		.get = aureon_oversampling_get,		.put = aureon_oversampling_put	},};static int __devinit aureon_add_controls(ice1712_t *ice){	unsigned int i;	int err;	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AUREON51_SKY)		err = snd_ctl_add(ice->card, snd_ctl_new1(&aureon51_dac_control, ice));	else		err = snd_ctl_add(ice->card, snd_ctl_new1(&aureon71_dac_control, ice));	if (err < 0)		return err;	for (i = 0; i < ARRAY_SIZE(wm_controls); i++) {		err = snd_ctl_add(ice->card, snd_ctl_new1(&wm_controls[i], ice));		if (err < 0)			return err;	}	return 0;}/* * initialize the chip */static int __devinit aureon_init(ice1712_t *ice){	static unsigned short wm_inits_aureon[] = {		/* These come first to reduce init pop noise */		0x1b, 0x000,		/* ADC Mux */		0x1c, 0x009,		/* Out Mux1 */		0x1d, 0x009,		/* Out Mux2 */		0x18, 0x000,		/* All power-up */		0x16, 0x122,		/* I2S, normal polarity, 24bit */		0x17, 0x022,		/* 256fs, slave mode */		0x00, 0,		/* DAC1 analog mute */		0x01, 0,		/* DAC2 analog mute */		0x02, 0,		/* DAC3 analog mute */		0x03, 0,		/* DAC4 analog mute */		0x04, 0,		/* DAC5 analog mute */		0x05, 0,		/* DAC6 analog mute */		0x06, 0,		/* DAC7 analog mute */		0x07, 0,		/* DAC8 analog mute */		0x08, 0x100,		/* master analog mute */		0x09, 0xff,		/* DAC1 digital full */		0x0a, 0xff,		/* DAC2 digital full */		0x0b, 0xff,		/* DAC3 digital full */		0x0c, 0xff,		/* DAC4 digital full */		0x0d, 0xff,		/* DAC5 digital full */		0x0e, 0xff,		/* DAC6 digital full */		0x0f, 0xff,		/* DAC7 digital full */		0x10, 0xff,		/* DAC8 digital full */		0x11, 0x1ff,		/* master digital full */		0x12, 0x000,		/* phase normal */		0x13, 0x090,		/* unmute DAC L/R */		0x14, 0x000,		/* all unmute */		0x15, 0x000,		/* no deemphasis, no ZFLG */		0x19, 0x000,		/* -12dB ADC/L */		0x1a, 0x000,		/* -12dB ADC/R */		(unsigned short)-1	};	static unsigned short wm_inits_prodigy[] = {		/* These come first to reduce init pop noise */		0x1b, 0x000,		/* ADC Mux */		0x1c, 0x009,		/* Out Mux1 */		0x1d, 0x009,		/* Out Mux2 */		0x18, 0x000,		/* All power-up */		0x16, 0x022,		/* I2S, normal polarity, 24bit, high-pass on */		0x17, 0x006,		/* 128fs, slave mode */		0x00, 0,		/* DAC1 analog mute */		0x01, 0,		/* DAC2 analog mute */		0x02, 0,		/* DAC3 analog mute */		0x03, 0,		/* DAC4 analog mute */		0x04, 0,		/* DAC5 analog mute */		0x05, 0,		/* DAC6 analog mute */		0x06, 0,		/* DAC7 analog mute */		0x07, 0,		/* DAC8 analog mute */		0x08, 0x100,		/* master analog mute */		0x09, 0x7f,		/* DAC1 digital full */		0x0a, 0x7f,		/* DAC2 digital full */		0x0b, 0x7f,		/* DAC3 digital full */		0x0c, 0x7f,		/* DAC4 digital full */		0x0d, 0x7f,		/* DAC5 digital full */		0x0e, 0x7f,		/* DAC6 digital full */		0x0f, 0x7f,		/* DAC7 digital full */		0x10, 0x7f,		/* DAC8 digital full */		0x11, 0x1FF,		/* master digital full */		0x12, 0x000,		/* phase normal */		0x13, 0x090,		/* unmute DAC L/R */		0x14, 0x000,		/* all unmute */		0x15, 0x000,		/* no deemphasis, no ZFLG */		0x19, 0x000,		/* -12dB ADC/L */		0x1a, 0x000,		/* -12dB ADC/R */		(unsigned short)-1	};	static unsigned short cs_inits[] = {		0x0441, /* RUN */		0x0100, /* no mute */		0x0200, /* */		0x0600, /* slave, 24bit */		(unsigned short)-1	};	unsigned int tmp;	unsigned short *p;	unsigned int cscs;	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AUREON51_SKY) {		ice->num_total_dacs = 6;		ice->num_total_adcs = 6;	} else {		/* aureon 7.1 and prodigy 7.1 */		ice->num_total_dacs = 8;		ice->num_total_adcs = 8;	}	/* to remeber the register values */	ice->akm = snd_kcalloc(sizeof(akm4xxx_t), GFP_KERNEL);	if (! ice->akm)		return -ENOMEM;	ice->akm_codecs = 1;	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)		cscs = PRODIGY_CS8415_CS;	else		cscs = AUREON_CS8415_CS;	snd_ice1712_gpio_set_dir(ice, 0xbfffff); /* fix this for the time being */	/* reset the wm codec as the SPI mode */	snd_ice1712_save_gpio_status(ice);	snd_ice1712_gpio_set_mask(ice, ~(AUREON_WM_RESET|AUREON_WM_CS|					 cscs|AUREON_HP_SEL));	tmp = snd_ice1712_gpio_read(ice);	tmp &= ~AUREON_WM_RESET;	snd_ice1712_gpio_write(ice, tmp);	udelay(1);	tmp |= AUREON_WM_CS | cscs;	snd_ice1712_gpio_write(ice, tmp);	udelay(1);	tmp |= AUREON_WM_RESET;	snd_ice1712_gpio_write(ice, tmp);	udelay(1);	/* initialize WM8770 codec */	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_PRODIGY71)		p = wm_inits_prodigy;	else		p = wm_inits_aureon;	for (; *p != (unsigned short)-1; p += 2)		wm_put(ice, p[0], p[1]);	/* initialize CS8415A codec */	for (p = cs_inits; *p != (unsigned short)-1; p++)		aureon_spi_write(ice, cscs,				 *p | 0x200000, 24);	aureon_set_headphone_amp(ice, 1);	snd_ice1712_restore_gpio_status(ice);	return 0;}/* * Aureon boards don't provide the EEPROM data except for the vendor IDs. * hence the driver needs to sets up it properly. */static unsigned char aureon51_eeprom[] __devinitdata = {	0x2a,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 3DACs */	0x80,	/* ACLINK: I2S */	0xf8,	/* I2S: vol, 96k, 24bit, 192k */	0xc3,	/* SPDIF: out-en, out-int, spdif-in */	0xff,	/* GPIO_DIR */	0xff,	/* GPIO_DIR1 */	0xbf,	/* GPIO_DIR2 */	0xff,	/* GPIO_MASK */	0xff,	/* GPIO_MASK1 */	0xff,	/* GPIO_MASK2 */	0x00,	/* GPIO_STATE */	0x00,	/* GPIO_STATE1 */	0x00,	/* GPIO_STATE2 */};static unsigned char aureon71_eeprom[] __devinitdata = {	0x2b,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */	0x80,	/* ACLINK: I2S */	0xf8,	/* I2S: vol, 96k, 24bit, 192k */	0xc3,	/* SPDIF: out-en, out-int, spdif-in */	0xff,	/* GPIO_DIR */	0xff,	/* GPIO_DIR1 */	0xbf,	/* GPIO_DIR2 */	0x00,	/* GPIO_MASK */	0x00,	/* GPIO_MASK1 */	0x00,	/* GPIO_MASK2 */	0x00,	/* GPIO_STATE */	0x00,	/* GPIO_STATE1 */	0x00,	/* GPIO_STATE2 */};static unsigned char prodigy71_eeprom[] __devinitdata = {	0x2b,	/* SYSCONF: clock 512, mpu401, spdif-in/ADC, 4DACs */	0x80,	/* ACLINK: I2S */	0xf8,	/* I2S: vol, 96k, 24bit, 192k */	0xc3,	/* SPDIF: out-en, out-int, spdif-in */	0xff,	/* GPIO_DIR */	0xff,	/* GPIO_DIR1 */	0xbf,	/* GPIO_DIR2 */	0x00,	/* GPIO_MASK */	0x00,	/* GPIO_MASK1 */	0x00,	/* GPIO_MASK2 */	0x00,	/* GPIO_STATE */	0x00,	/* GPIO_STATE1 */	0x00,	/* GPIO_STATE2 */};/* entry point */struct snd_ice1712_card_info snd_vt1724_aureon_cards[] __devinitdata = {	{		.subvendor = VT1724_SUBDEVICE_AUREON51_SKY,		.name = "Terratec Aureon 5.1-Sky",		.model = "aureon51",		.chip_init = aureon_init,		.build_controls = aureon_add_controls,		.eeprom_size = sizeof(aureon51_eeprom),		.eeprom_data = aureon51_eeprom,	},	{		.subvendor = VT1724_SUBDEVICE_AUREON71_SPACE,		.name = "Terratec Aureon 7.1-Space",		.model = "aureon71",		.chip_init = aureon_init,		.build_controls = aureon_add_controls,		.eeprom_size = sizeof(aureon71_eeprom),		.eeprom_data = aureon71_eeprom,	}, 	{ 		.subvendor = VT1724_SUBDEVICE_AUREON71_UNIVERSE, 		.name = "Terratec Aureon 7.1-Universe",		/* model not needed - identical with 7.1-Space */ 		.chip_init = aureon_init, 		.build_controls = aureon_add_controls, 		.eeprom_size = sizeof(aureon71_eeprom), 		.eeprom_data = aureon71_eeprom,	},	{		.subvendor = VT1724_SUBDEVICE_PRODIGY71,		.name = "Audiotrak Prodigy 7.1",		.model = "prodigy71",		.chip_init = aureon_init,		.build_controls = aureon_add_controls,		.eeprom_size = sizeof(prodigy71_eeprom),		.eeprom_data = prodigy71_eeprom,	},	{ } /* terminator */};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -