亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sound_soc_codecs_wm9712.c

?? Wolfson9712和Wolfson9705的驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
	{"Line PGA", NULL, "LINEINR"},	{"Phone PGA", NULL, "PHONE"},	{"Mic PGA", NULL, "MIC1"},	{"Mic PGA", NULL, "MIC2"},	/* left capture selector */	{"Left Capture Select", "Mic", "MIC1"},	{"Left Capture Select", "Speaker Mixer", "Speaker Mixer"},	{"Left Capture Select", "Line", "LINEINL"},	{"Left Capture Select", "Headphone Mixer", "Left HP Mixer"},	{"Left Capture Select", "Phone Mixer", "Phone Mixer"},	{"Left Capture Select", "Phone", "PHONE"},	/* right capture selector */	{"Right Capture Select", "Mic", "MIC2"},	{"Right Capture Select", "Speaker Mixer", "Speaker Mixer"},	{"Right Capture Select", "Line", "LINEINR"},	{"Right Capture Select", "Headphone Mixer", "Right HP Mixer"},	{"Right Capture Select", "Phone Mixer", "Phone Mixer"},	{"Right Capture Select", "Phone", "PHONE"},	/* ALC Sidetone */	{"ALC Sidetone Mux", "Stereo", "Left Capture Select"},	{"ALC Sidetone Mux", "Stereo", "Right Capture Select"},	{"ALC Sidetone Mux", "Left", "Left Capture Select"},	{"ALC Sidetone Mux", "Right", "Right Capture Select"},	/* ADC's */	{"Left ADC", NULL, "Left Capture Select"},	{"Right ADC", NULL, "Right Capture Select"},	/* outputs */	{"MONOOUT", NULL, "Phone Mixer"},	{"HPOUTL", NULL, "Headphone PGA"},	{"Headphone PGA", NULL, "Left HP Mixer"},	{"HPOUTR", NULL, "Headphone PGA"},	{"Headphone PGA", NULL, "Right HP Mixer"},	/* mono mixer */	{"Mono Mixer", NULL, "Left HP Mixer"},	{"Mono Mixer", NULL, "Right HP Mixer"},	/* Out3 Mux */	{"Out3 Mux", "Left", "Left HP Mixer"},	{"Out3 Mux", "Mono", "Phone Mixer"},	{"Out3 Mux", "Left + Right", "Mono Mixer"},	{"Out 3 PGA", NULL, "Out3 Mux"},	{"OUT3", NULL, "Out 3 PGA"},	/* speaker Mux */	{"Speaker Mux", "Speaker Mix", "Speaker Mixer"},	{"Speaker Mux", "Headphone Mix", "Mono Mixer"},	{"Speaker PGA", NULL, "Speaker Mux"},	{"LOUT2", NULL, "Speaker PGA"},	{"ROUT2", NULL, "Speaker PGA"},};static int wm9712_add_widgets(struct snd_soc_codec *codec){	snd_soc_dapm_new_controls(codec, wm9712_dapm_widgets,				  ARRAY_SIZE(wm9712_dapm_widgets));	snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));	snd_soc_dapm_new_widgets(codec);	return 0;}static unsigned int ac97_read(struct snd_soc_codec *codec,	unsigned int reg){	u16 *cache = codec->reg_cache;	if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||		reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 ||		reg == AC97_REC_GAIN)		return soc_ac97_ops.read(codec->ac97, reg);	else {		reg = reg >> 1;		if (reg >= (ARRAY_SIZE(wm9712_reg)))			return -EIO;		return cache[reg];	}}static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,	unsigned int val){	u16 *cache = codec->reg_cache;	soc_ac97_ops.write(codec->ac97, reg, val);	reg = reg >> 1;	if (reg < (ARRAY_SIZE(wm9712_reg)))		cache[reg] = val;	return 0;}static int ac97_prepare(struct snd_pcm_substream *substream,			struct snd_soc_dai *dai){	struct snd_pcm_runtime *runtime = substream->runtime;	struct snd_soc_pcm_runtime *rtd = substream->private_data;	struct snd_soc_device *socdev = rtd->socdev;	struct snd_soc_codec *codec = socdev->card->codec;	int reg;	u16 vra;	vra = ac97_read(codec, AC97_EXTENDED_STATUS);	ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)		reg = AC97_PCM_FRONT_DAC_RATE;	else		reg = AC97_PCM_LR_ADC_RATE;	return ac97_write(codec, reg, runtime->rate);}static int ac97_aux_prepare(struct snd_pcm_substream *substream,			    struct snd_soc_dai *dai){	struct snd_pcm_runtime *runtime = substream->runtime;	struct snd_soc_pcm_runtime *rtd = substream->private_data;	struct snd_soc_device *socdev = rtd->socdev;	struct snd_soc_codec *codec = socdev->card->codec;	u16 vra, xsle;	vra = ac97_read(codec, AC97_EXTENDED_STATUS);	ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);	xsle = ac97_read(codec, AC97_PCI_SID);	ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);	if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)		return -ENODEV;	return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);}#define WM9712_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\		SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 |\		SNDRV_PCM_RATE_48000)static struct snd_soc_dai_ops wm9712_dai_ops_hifi = {	.prepare	= ac97_prepare,};static struct snd_soc_dai_ops wm9712_dai_ops_aux = {	.prepare	= ac97_aux_prepare,};struct snd_soc_dai wm9712_dai[] = {{	.name = "AC97 HiFi",	.ac97_control = 1,	.playback = {		.stream_name = "HiFi Playback",		.channels_min = 1,		.channels_max = 2,		.rates = WM9712_AC97_RATES,		.formats = SND_SOC_STD_AC97_FMTS,},	.capture = {		.stream_name = "HiFi Capture",		.channels_min = 1,		.channels_max = 2,		.rates = WM9712_AC97_RATES,		.formats = SND_SOC_STD_AC97_FMTS,},	.ops = &wm9712_dai_ops_hifi,},{	.name = "AC97 Aux",	.playback = {		.stream_name = "Aux Playback",		.channels_min = 1,		.channels_max = 1,		.rates = WM9712_AC97_RATES,		.formats = SND_SOC_STD_AC97_FMTS,},	.ops = &wm9712_dai_ops_aux,}};EXPORT_SYMBOL_GPL(wm9712_dai);static int wm9712_set_bias_level(struct snd_soc_codec *codec,				 enum snd_soc_bias_level level){	switch (level) {	case SND_SOC_BIAS_ON:	case SND_SOC_BIAS_PREPARE:		break;	case SND_SOC_BIAS_STANDBY:		ac97_write(codec, AC97_POWERDOWN, 0x0000);		break;	case SND_SOC_BIAS_OFF:		/* disable everything including AC link */		ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);		ac97_write(codec, AC97_POWERDOWN, 0xffff);		break;	}	codec->bias_level = level;	return 0;}static int wm9712_reset(struct snd_soc_codec *codec, int try_warm){	if (try_warm && soc_ac97_ops.warm_reset) {		soc_ac97_ops.warm_reset(codec->ac97);		if (ac97_read(codec, 0) == wm9712_reg[0])			return 1;	}	soc_ac97_ops.reset(codec->ac97);	if (soc_ac97_ops.warm_reset)		soc_ac97_ops.warm_reset(codec->ac97);	if (ac97_read(codec, 0) != wm9712_reg[0])		goto err;	return 0;err:	printk(KERN_ERR "WM9712 AC97 reset failed\n");	return -EIO;}static int wm9712_soc_suspend(struct platform_device *pdev,	pm_message_t state){	struct snd_soc_device *socdev = platform_get_drvdata(pdev);	struct snd_soc_codec *codec = socdev->card->codec;	wm9712_set_bias_level(codec, SND_SOC_BIAS_OFF);	return 0;}static int wm9712_soc_resume(struct platform_device *pdev){	struct snd_soc_device *socdev = platform_get_drvdata(pdev);	struct snd_soc_codec *codec = socdev->card->codec;	int i, ret;	u16 *cache = codec->reg_cache;	ret = wm9712_reset(codec, 1);	if (ret < 0) {		printk(KERN_ERR "could not reset AC97 codec\n");		return ret;	}	wm9712_set_bias_level(codec, SND_SOC_BIAS_STANDBY);	if (ret == 0) {		/* Sync reg_cache with the hardware after cold reset */		for (i = 2; i < ARRAY_SIZE(wm9712_reg) << 1; i += 2) {			if (i == AC97_INT_PAGING || i == AC97_POWERDOWN ||			    (i > 0x58 && i != 0x5c))				continue;			soc_ac97_ops.write(codec->ac97, i, cache[i>>1]);		}	}	if (codec->suspend_bias_level == SND_SOC_BIAS_ON)		wm9712_set_bias_level(codec, SND_SOC_BIAS_ON);	return ret;}static int wm9712_soc_probe(struct platform_device *pdev){	struct snd_soc_device *socdev = platform_get_drvdata(pdev);	struct snd_soc_codec *codec;	int ret = 0;	printk(KERN_INFO "WM9711/WM9712 SoC Audio Codec %s\n", WM9712_VERSION);	socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec),				      GFP_KERNEL);	if (socdev->card->codec == NULL)		return -ENOMEM;	codec = socdev->card->codec;	mutex_init(&codec->mutex);	codec->reg_cache = kmemdup(wm9712_reg, sizeof(wm9712_reg), GFP_KERNEL);	if (codec->reg_cache == NULL) {		ret = -ENOMEM;		goto cache_err;	}	codec->reg_cache_size = sizeof(wm9712_reg);	codec->reg_cache_step = 2;	codec->name = "WM9712";	codec->owner = THIS_MODULE;	codec->dai = wm9712_dai;	codec->num_dai = ARRAY_SIZE(wm9712_dai);	codec->write = ac97_write;	codec->read = ac97_read;	codec->set_bias_level = wm9712_set_bias_level;	INIT_LIST_HEAD(&codec->dapm_widgets);	INIT_LIST_HEAD(&codec->dapm_paths);	ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);	if (ret < 0) {		printk(KERN_ERR "wm9712: failed to register AC97 codec\n");		goto codec_err;	}	/* register pcms */	ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);	if (ret < 0)		goto pcm_err;	ret = wm9712_reset(codec, 0);	if (ret < 0) {		printk(KERN_ERR "Failed to reset WM9712: AC97 link error\n");		goto reset_err;	}	/* set alc mux to none */	ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);	wm9712_set_bias_level(codec, SND_SOC_BIAS_STANDBY);	snd_soc_add_controls(codec, wm9712_snd_ac97_controls,				ARRAY_SIZE(wm9712_snd_ac97_controls));	wm9712_add_widgets(codec);	ret = snd_soc_init_card(socdev);	if (ret < 0) {		printk(KERN_ERR "wm9712: failed to register card\n");		goto reset_err;	}	return 0;reset_err:	snd_soc_free_pcms(socdev);pcm_err:	snd_soc_free_ac97_codec(codec);codec_err:	kfree(codec->reg_cache);cache_err:	kfree(socdev->card->codec);	socdev->card->codec = NULL;	return ret;}static int wm9712_soc_remove(struct platform_device *pdev){	struct snd_soc_device *socdev = platform_get_drvdata(pdev);	struct snd_soc_codec *codec = socdev->card->codec;	if (codec == NULL)		return 0;	snd_soc_dapm_free(socdev);	snd_soc_free_pcms(socdev);	snd_soc_free_ac97_codec(codec);	kfree(codec->reg_cache);	kfree(codec);	return 0;}struct snd_soc_codec_device soc_codec_dev_wm9712 = {	.probe = 	wm9712_soc_probe,	.remove = 	wm9712_soc_remove,	.suspend =	wm9712_soc_suspend,	.resume =	wm9712_soc_resume,};EXPORT_SYMBOL_GPL(soc_codec_dev_wm9712);MODULE_DESCRIPTION("ASoC WM9711/WM9712 driver");MODULE_AUTHOR("Liam Girdwood");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人的天堂在线观看| 成人精品gif动图一区| 麻豆一区二区三| 高清不卡在线观看av| 精品视频免费看| 国产精品人妖ts系列视频| 日韩精品91亚洲二区在线观看| 风间由美一区二区三区在线观看 | 午夜精品爽啪视频| 一区二区三区在线播放| 国产精品成人午夜| 亚洲欧美一区二区三区极速播放| 中文av一区特黄| 综合久久给合久久狠狠狠97色| 国产精品情趣视频| 一区二区三区资源| 亚洲成精国产精品女| 男人的j进女人的j一区| 精品一区二区三区视频| 亚洲精品高清视频在线观看| 国产精品一区二区在线播放 | 风流少妇一区二区| 日韩免费电影网站| 热久久免费视频| 欧美人狂配大交3d怪物一区| 亚洲蜜臀av乱码久久精品蜜桃| 国产经典欧美精品| 2欧美一区二区三区在线观看视频| 亚洲国产精品天堂| 精品视频999| 国产剧情一区二区| 久久久亚洲精品石原莉奈| 免费在线看一区| 91精品福利在线一区二区三区| 亚洲综合偷拍欧美一区色| 色噜噜狠狠成人中文综合| 亚洲男同性视频| 在线视频欧美区| 一区二区三区波多野结衣在线观看| 99riav一区二区三区| 亚洲天堂免费看| 色综合激情五月| 亚洲伦理在线免费看| 欧美性大战xxxxx久久久| 亚洲自拍偷拍av| 欧美日韩成人综合天天影院| 午夜成人免费视频| 欧美一级生活片| 国产一区二区三区电影在线观看| 精品久久久久久久久久久久久久久 | 亚洲国产三级在线| 欧美日韩国产一级片| 强制捆绑调教一区二区| 精品国产精品网麻豆系列| 国产精品香蕉一区二区三区| 国产精品久久99| 欧美色图一区二区三区| 日本视频一区二区三区| 亚洲不卡一区二区三区| 欧美一级片在线观看| 国产精品亚洲第一区在线暖暖韩国 | 一本一本大道香蕉久在线精品| 一级做a爱片久久| 欧美大片一区二区| 成人白浆超碰人人人人| 亚洲狠狠爱一区二区三区| 日韩欧美在线网站| www.亚洲在线| 人人精品人人爱| 亚洲欧洲日产国产综合网| 欧美日韩精品专区| 国产在线精品不卡| 亚洲一区二区三区中文字幕在线| 日韩免费视频线观看| 成人av在线一区二区三区| 99在线精品一区二区三区| 91精品国产乱码久久蜜臀| 天天亚洲美女在线视频| 欧美日韩精品专区| 日韩国产欧美在线观看| 51精品秘密在线观看| 亚洲国产aⅴ成人精品无吗| 欧美在线免费观看亚洲| 亚洲成人激情社区| 91超碰这里只有精品国产| 三级亚洲高清视频| 91精品国产福利| 国产在线播精品第三| 久久久久9999亚洲精品| 成人免费av在线| 中文字幕一区av| 欧美性淫爽ww久久久久无| 亚洲mv在线观看| 日韩一区二区三区四区| 国产一二三精品| 国产精品理论在线观看| 91久久人澡人人添人人爽欧美| 亚洲一区二区四区蜜桃| 在线成人免费视频| 经典三级视频一区| 中文字幕日韩一区| 欧美精品久久99| 韩国理伦片一区二区三区在线播放 | 国产精品一区二区在线观看不卡| 石原莉奈在线亚洲二区| 一区二区三区成人在线视频| 中文字幕日本不卡| 国产精品国产成人国产三级| 欧美电影免费观看高清完整版| 欧美色精品在线视频| 欧亚洲嫩模精品一区三区| 99久久精品国产观看| 国产激情一区二区三区| 国产一区二区三区四区五区美女 | 一区二区三区精密机械公司| 国产精品麻豆欧美日韩ww| 国产欧美日本一区视频| 久久久一区二区三区| 精品久久久久av影院| 精品国产sm最大网站免费看| 欧美大片在线观看一区| 日韩美一区二区三区| 26uuu亚洲综合色| 国产欧美精品在线观看| 久久久精品免费网站| 久久久久久久久久看片| 国产女人aaa级久久久级 | aaa欧美日韩| 91视频国产观看| 色婷婷狠狠综合| 欧美日韩国产另类一区| 欧美日韩国产影片| 欧美一级理论片| 日韩你懂的在线观看| 亚洲欧美另类久久久精品| 国产区在线观看成人精品| 91精品国产综合久久精品图片 | 国产成人综合在线观看| 天堂va蜜桃一区二区三区| 国产精品久久久久久亚洲伦| 久久青草国产手机看片福利盒子 | 婷婷丁香久久五月婷婷| 蜜臀91精品一区二区三区| 国产精品系列在线观看| av在线不卡电影| 欧美日韩成人综合天天影院| 日韩欧美国产一二三区| 国产精品传媒在线| 日日摸夜夜添夜夜添国产精品 | 国内精品伊人久久久久av一坑| 国产精品亚洲人在线观看| 日本久久一区二区三区| 91麻豆精品国产91久久久使用方法| 久久影视一区二区| 亚洲精品欧美激情| 极品尤物av久久免费看| 色综合久久久网| 精品国产麻豆免费人成网站| 综合网在线视频| 久久成人免费网站| 91视频com| 精品国精品国产| 伊人婷婷欧美激情| 久久精品国产在热久久| 91视视频在线直接观看在线看网页在线看| 欧美日韩一区高清| 国产精品美女www爽爽爽| 蜜桃91丨九色丨蝌蚪91桃色| 99久久99久久免费精品蜜臀| 日韩一级黄色片| 中文字幕综合网| 国产精品99久久久久久宅男| 欧美日本一区二区三区四区 | 成人免费观看视频| 欧美一区二区大片| 亚洲最大成人综合| 国产aⅴ精品一区二区三区色成熟| 欧美综合一区二区| 最新成人av在线| 成人性视频免费网站| 精品国产乱码久久久久久图片| 亚洲尤物在线视频观看| 99久久久精品| 中文字幕+乱码+中文字幕一区| 麻豆91在线看| 欧美老肥妇做.爰bbww| 亚洲自拍偷拍麻豆| 91福利在线观看| 亚洲欧美日韩系列| av不卡一区二区三区| 国产欧美一区二区在线| 国产一区二区看久久| 日韩女优电影在线观看| 日av在线不卡| 日韩亚洲欧美中文三级| 免费观看一级欧美片| 亚洲欧洲三级电影| 波波电影院一区二区三区| 国产精品家庭影院| 99精品国产一区二区三区不卡|