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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? patch_via.c

?? linux 內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Universal Interface for Intel High Definition Audio Codec * * HD audio interface patch for VIA VT1708 codec * * Copyright (c) 2006 Lydia Wang <lydiawang@viatech.com> *                    Takashi Iwai <tiwai@suse.de> * *  This driver is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This driver is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA *//* * * * * * * * * * * * * * Release History * * * * * * * * * * * * * * * * *//*                                                                           *//* 2006-03-03  Lydia Wang  Create the basic patch to support VT1708 codec    *//* 2006-03-14  Lydia Wang  Modify hard code for some pin widget nid          *//* 2006-08-02  Lydia Wang  Add support to VT1709 codec                       *//* 2006-09-08  Lydia Wang  Fix internal loopback recording source select bug *//*                                                                           *//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */#include <sound/driver.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/slab.h>#include <sound/core.h>#include "hda_codec.h"#include "hda_local.h"/* amp values */#define AMP_VAL_IDX_SHIFT	19#define AMP_VAL_IDX_MASK	(0x0f<<19)#define NUM_CONTROL_ALLOC	32#define NUM_VERB_ALLOC		32/* Pin Widget NID */#define VT1708_HP_NID		0x13#define VT1708_DIGOUT_NID	0x14#define VT1708_DIGIN_NID	0x16#define VT1709_HP_DAC_NID	0x28#define VT1709_DIGOUT_NID	0x13#define VT1709_DIGIN_NID	0x17#define IS_VT1708_VENDORID(x)		((x) >= 0x11061708 && (x) <= 0x1106170b)#define IS_VT1709_10CH_VENDORID(x)	((x) >= 0x1106e710 && (x) <= 0x1106e713)#define IS_VT1709_6CH_VENDORID(x)	((x) >= 0x1106e714 && (x) <= 0x1106e717)enum {	VIA_CTL_WIDGET_VOL,	VIA_CTL_WIDGET_MUTE,};enum {	AUTO_SEQ_FRONT,	AUTO_SEQ_SURROUND,	AUTO_SEQ_CENLFE,	AUTO_SEQ_SIDE};static struct snd_kcontrol_new vt1708_control_templates[] = {	HDA_CODEC_VOLUME(NULL, 0, 0, 0),	HDA_CODEC_MUTE(NULL, 0, 0, 0),};struct via_spec {	/* codec parameterization */	struct snd_kcontrol_new *mixers[3];	unsigned int num_mixers;	struct hda_verb *init_verbs;	char *stream_name_analog;	struct hda_pcm_stream *stream_analog_playback;	struct hda_pcm_stream *stream_analog_capture;	char *stream_name_digital;	struct hda_pcm_stream *stream_digital_playback;	struct hda_pcm_stream *stream_digital_capture;	/* playback */	struct hda_multi_out multiout;	/* capture */	unsigned int num_adc_nids;	hda_nid_t *adc_nids;	hda_nid_t dig_in_nid;	/* capture source */	const struct hda_input_mux *input_mux;	unsigned int cur_mux[3];	/* PCM information */	struct hda_pcm pcm_rec[2];	/* dynamic controls, init_verbs and input_mux */	struct auto_pin_cfg autocfg;	unsigned int num_kctl_alloc, num_kctl_used;	struct snd_kcontrol_new *kctl_alloc;	struct hda_input_mux private_imux;	hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];#ifdef CONFIG_SND_HDA_POWER_SAVE	struct hda_loopback_check loopback;#endif};static hda_nid_t vt1708_adc_nids[2] = {	/* ADC1-2 */	0x15, 0x27};static hda_nid_t vt1709_adc_nids[3] = {	/* ADC1-2 */	0x14, 0x15, 0x16};/* add dynamic controls */static int via_add_control(struct via_spec *spec, int type, const char *name,			   unsigned long val){	struct snd_kcontrol_new *knew;	if (spec->num_kctl_used >= spec->num_kctl_alloc) {		int num = spec->num_kctl_alloc + NUM_CONTROL_ALLOC;		/* array + terminator */		knew = kcalloc(num + 1, sizeof(*knew), GFP_KERNEL);		if (!knew)			return -ENOMEM;		if (spec->kctl_alloc) {			memcpy(knew, spec->kctl_alloc,			       sizeof(*knew) * spec->num_kctl_alloc);			kfree(spec->kctl_alloc);		}		spec->kctl_alloc = knew;		spec->num_kctl_alloc = num;	}	knew = &spec->kctl_alloc[spec->num_kctl_used];	*knew = vt1708_control_templates[type];	knew->name = kstrdup(name, GFP_KERNEL);	if (!knew->name)		return -ENOMEM;	knew->private_value = val;	spec->num_kctl_used++;	return 0;}/* create input playback/capture controls for the given pin */static int via_new_analog_input(struct via_spec *spec, hda_nid_t pin,				const char *ctlname, int idx, int mix_nid){	char name[32];	int err;	sprintf(name, "%s Playback Volume", ctlname);	err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name,			      HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));	if (err < 0)		return err;	sprintf(name, "%s Playback Switch", ctlname);	err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name,			      HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));	if (err < 0)		return err;	return 0;}static void via_auto_set_output_and_unmute(struct hda_codec *codec,					   hda_nid_t nid, int pin_type,					   int dac_idx){	/* set as output */	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,			    pin_type);	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,			    AMP_OUT_UNMUTE);}static void via_auto_init_multi_out(struct hda_codec *codec){	struct via_spec *spec = codec->spec;	int i;	for (i = 0; i <= AUTO_SEQ_SIDE; i++) {		hda_nid_t nid = spec->autocfg.line_out_pins[i];		if (nid)			via_auto_set_output_and_unmute(codec, nid, PIN_OUT, i);	}}static void via_auto_init_hp_out(struct hda_codec *codec){	struct via_spec *spec = codec->spec;	hda_nid_t pin;	pin = spec->autocfg.hp_pins[0];	if (pin) /* connect to front */		via_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);}static void via_auto_init_analog_input(struct hda_codec *codec){	struct via_spec *spec = codec->spec;	int i;	for (i = 0; i < AUTO_PIN_LAST; i++) {		hda_nid_t nid = spec->autocfg.input_pins[i];		snd_hda_codec_write(codec, nid, 0,				    AC_VERB_SET_PIN_WIDGET_CONTROL,				    (i <= AUTO_PIN_FRONT_MIC ?				     PIN_VREF50 : PIN_IN));	}}/* * input MUX handling */static int via_mux_enum_info(struct snd_kcontrol *kcontrol,			     struct snd_ctl_elem_info *uinfo){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct via_spec *spec = codec->spec;	return snd_hda_input_mux_info(spec->input_mux, uinfo);}static int via_mux_enum_get(struct snd_kcontrol *kcontrol,			    struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct via_spec *spec = codec->spec;	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];	return 0;}static int via_mux_enum_put(struct snd_kcontrol *kcontrol,			    struct snd_ctl_elem_value *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct via_spec *spec = codec->spec;	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);	unsigned int vendor_id = codec->vendor_id;	/* AIW0  lydia 060801 add for correct sw0 input select */	if (IS_VT1708_VENDORID(vendor_id) && (adc_idx == 0))		return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,					     0x18, &spec->cur_mux[adc_idx]);	else if ((IS_VT1709_10CH_VENDORID(vendor_id) ||		  IS_VT1709_6CH_VENDORID(vendor_id)) && (adc_idx == 0) )		return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,					     0x19, &spec->cur_mux[adc_idx]);	else		return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,					     spec->adc_nids[adc_idx],					     &spec->cur_mux[adc_idx]);}/* capture mixer elements */static struct snd_kcontrol_new vt1708_capture_mixer[] = {	HDA_CODEC_VOLUME("Capture Volume", 0x15, 0x0, HDA_INPUT),	HDA_CODEC_MUTE("Capture Switch", 0x15, 0x0, HDA_INPUT),	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x27, 0x0, HDA_INPUT),	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x27, 0x0, HDA_INPUT),	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		/* The multiple "Capture Source" controls confuse alsamixer		 * So call somewhat different..		 * FIXME: the controls appear in the "playback" view!		 */		/* .name = "Capture Source", */		.name = "Input Source",		.count = 1,		.info = via_mux_enum_info,		.get = via_mux_enum_get,		.put = via_mux_enum_put,	},	{ } /* end */};/* * generic initialization of ADC, input mixers and output mixers */static struct hda_verb vt1708_volume_init_verbs[] = {	/*	 * Unmute ADC0-1 and set the default input to mic-in	 */	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	{0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},	/* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback	 * mixer widget	 */	/* Amp Indices: CD = 1, Mic1 = 2, Line = 3, Mic2 = 4 */	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, /* master */	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},	/*	 * Set up output mixers (0x19 - 0x1b)	 */	/* set vol=0 to output mixers */	{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	{0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},		/* Setup default input to PW4 */	{0x20, AC_VERB_SET_CONNECT_SEL, 0x1},	/* Set mic as default input of sw0 */	{0x18, AC_VERB_SET_CONNECT_SEL, 0x2},	/* PW9 Output enable */	{0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},};static int via_playback_pcm_open(struct hda_pcm_stream *hinfo,				 struct hda_codec *codec,				 struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream);}static int via_playback_pcm_prepare(struct hda_pcm_stream *hinfo,				    struct hda_codec *codec,				    unsigned int stream_tag,				    unsigned int format,				    struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,						stream_tag, format, substream);}static int via_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,				    struct hda_codec *codec,				    struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);}/* * Digital out */static int via_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,				     struct hda_codec *codec,				     struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_dig_open(codec, &spec->multiout);}static int via_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,				      struct hda_codec *codec,				      struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_dig_close(codec, &spec->multiout);}static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,					struct hda_codec *codec,					unsigned int stream_tag,					unsigned int format,					struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,					     stream_tag, format, substream);}/* * Analog capture */static int via_capture_pcm_prepare(struct hda_pcm_stream *hinfo,				   struct hda_codec *codec,				   unsigned int stream_tag,				   unsigned int format,				   struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],				   stream_tag, 0, format);	return 0;}static int via_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,				   struct hda_codec *codec,				   struct snd_pcm_substream *substream){	struct via_spec *spec = codec->spec;	snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number],				   0, 0, 0);	return 0;}static struct hda_pcm_stream vt1708_pcm_analog_playback = {	.substreams = 1,	.channels_min = 2,	.channels_max = 8,	.nid = 0x10, /* NID to query formats and rates */	.ops = {		.open = via_playback_pcm_open,		.prepare = via_playback_pcm_prepare,		.cleanup = via_playback_pcm_cleanup	},};static struct hda_pcm_stream vt1708_pcm_analog_capture = {	.substreams = 2,	.channels_min = 2,	.channels_max = 2,	.nid = 0x15, /* NID to query formats and rates */	.ops = {		.prepare = via_capture_pcm_prepare,		.cleanup = via_capture_pcm_cleanup	},};static struct hda_pcm_stream vt1708_pcm_digital_playback = {	.substreams = 1,	.channels_min = 2,	.channels_max = 2,	/* NID is set in via_build_pcms */	.ops = {		.open = via_dig_playback_pcm_open,		.close = via_dig_playback_pcm_close,		.prepare = via_dig_playback_pcm_prepare	},};static struct hda_pcm_stream vt1708_pcm_digital_capture = {	.substreams = 1,	.channels_min = 2,	.channels_max = 2,};static int via_build_controls(struct hda_codec *codec){	struct via_spec *spec = codec->spec;	int err;	int i;	for (i = 0; i < spec->num_mixers; i++) {		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);		if (err < 0)			return err;	}	if (spec->multiout.dig_out_nid) {		err = snd_hda_create_spdif_out_ctls(codec,						    spec->multiout.dig_out_nid);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩亚洲综合| 一道本成人在线| 国产亚洲一区字幕| 国产91综合一区在线观看| 国产亚洲一区二区三区| 色综合久久天天| 喷水一区二区三区| 国产精品动漫网站| 日韩一区二区三区av| 懂色av中文字幕一区二区三区| 亚洲最大成人网4388xx| 精品日韩一区二区| 日本精品免费观看高清观看| 国产一区二区三区不卡在线观看 | 国内一区二区视频| 精品88久久久久88久久久| 97精品电影院| 美女视频黄 久久| 一区二区高清视频在线观看| 久久久美女毛片| 欧美日韩精品一区二区天天拍小说| 国产精品91一区二区| 性做久久久久久| 国产精品电影一区二区三区| 日韩欧美中文一区| 91久久一区二区| 成人h动漫精品一区二区| 欧美aa在线视频| 亚洲最大的成人av| 中文字幕一区二区三区乱码在线| 日韩免费观看高清完整版| 91麻豆国产精品久久| 喷白浆一区二区| 日韩伦理免费电影| 久久久777精品电影网影网| 欧美一级淫片007| 欧美日韩国产a| 欧洲一区在线电影| a亚洲天堂av| 风间由美中文字幕在线看视频国产欧美 | 亚洲影院在线观看| 国产日产精品1区| 欧美疯狂性受xxxxx喷水图片| 国产成人精品亚洲日本在线桃色 | 久久er99热精品一区二区| 亚欧色一区w666天堂| 玖玖九九国产精品| 免费成人美女在线观看| 日韩电影在线一区| 亚洲国产日韩一级| 亚洲午夜久久久久久久久电影院| 综合婷婷亚洲小说| 亚洲日本在线a| 亚洲手机成人高清视频| 成人欧美一区二区三区黑人麻豆| 国产精品色婷婷| 欧美国产精品专区| 国产精品欧美久久久久一区二区| 久久久久久久综合狠狠综合| 日韩欧美电影一区| 日韩三级免费观看| 欧美tk丨vk视频| 欧美成人精精品一区二区频| 欧美www视频| 久久久国产一区二区三区四区小说| 日韩精品一区二区三区视频播放 | 国产精品久久久久久久久免费桃花 | 夜夜精品浪潮av一区二区三区| 亚洲视频你懂的| 亚洲综合一区二区| 五月天中文字幕一区二区| 污片在线观看一区二区| 亚洲小少妇裸体bbw| 视频一区二区不卡| 久久国产精品一区二区| 国产综合成人久久大片91| 国产91丝袜在线播放0| 成人av在线影院| 色一情一伦一子一伦一区| 欧美日韩国产欧美日美国产精品| 欧美一区二区视频在线观看2020 | 亚洲永久精品国产| 青青草97国产精品免费观看 | 欧美亚洲综合色| 正在播放亚洲一区| 555夜色666亚洲国产免| 精品久久久久久无| 亚洲欧美日韩在线不卡| 日韩高清在线一区| 国产成人精品一区二| 日本韩国欧美一区| 日韩午夜激情电影| 最新久久zyz资源站| 日韩不卡一二三区| 成人动漫精品一区二区| 欧美日韩一区二区三区不卡| 久久亚洲精华国产精华液 | 成人黄色小视频| 在线播放一区二区三区| 91精品免费观看| 国产精品女同一区二区三区| 亚洲影院久久精品| 国产精品一区三区| 欧美三级资源在线| 国产亚洲欧美日韩俺去了| 亚洲一区二区三区在线| 国产一区二区三区在线观看免费视频 | 色婷婷久久久久swag精品| 91黄色免费版| 久久众筹精品私拍模特| 亚洲国产乱码最新视频| 国产成人在线看| 欧美日韩激情一区二区| 国产精品久久久久久亚洲伦 | 日韩精品在线一区二区| 亚洲同性同志一二三专区| 蜜桃一区二区三区四区| 91在线观看下载| 国产日韩欧美不卡在线| 青草国产精品久久久久久| 91丨九色丨蝌蚪丨老版| 欧美精品日韩一本| 久久精品这里都是精品| 日本不卡一二三| 91久久精品一区二区二区| 国产精品美女久久久久av爽李琼 | 色综合久久中文综合久久97| 91精品国产福利在线观看| 成人免费视频在线观看| 国产麻豆午夜三级精品| 制服丝袜中文字幕亚洲| 一级做a爱片久久| 欧美伊人久久大香线蕉综合69| 亚洲午夜av在线| 亚洲色图欧洲色图婷婷| 成人黄色av网站在线| 国产精品国产成人国产三级| 91亚洲永久精品| 亚洲人成电影网站色mp4| 日本乱码高清不卡字幕| 亚洲自拍偷拍图区| 91麻豆精品国产91久久久资源速度 | 国产乱子轮精品视频| 久久网站最新地址| 成熟亚洲日本毛茸茸凸凹| 国产女人18水真多18精品一级做| 国产高清成人在线| 国产精品久久久久影院| 91丨九色丨国产丨porny| 亚洲激情五月婷婷| 91精品国产综合久久久久久久久久| 蜜臀av性久久久久av蜜臀妖精| 欧美成人精品1314www| 国产91在线|亚洲| 一区二区三区.www| 欧美日本精品一区二区三区| 久久99精品久久久久久国产越南 | 午夜精品在线视频一区| 91精品国产综合久久福利| 久久av资源站| 国产日韩成人精品| 欧美主播一区二区三区美女| 秋霞成人午夜伦在线观看| 久久精品一区八戒影视| av在线播放不卡| 91麻豆蜜桃一区二区三区| 视频一区欧美日韩| 中文字幕不卡的av| 欧美在线观看禁18| 国产一区二区三区精品视频| 亚洲欧美色综合| 欧美电视剧在线观看完整版| 91在线一区二区| 麻豆成人免费电影| 中文字幕在线观看一区| 7777精品伊人久久久大香线蕉超级流畅 | 久久久综合九色合综国产精品| 91网站在线播放| 玖玖九九国产精品| 亚洲美女一区二区三区| 日韩精品一区二区三区视频| 91麻豆高清视频| 精品在线播放免费| 一区二区高清免费观看影视大全| 欧美精品一区二区蜜臀亚洲| 91香蕉国产在线观看软件| 激情综合网天天干| 亚洲国产精品精华液网站| 国产视频一区二区在线| 欧美一区二区三区影视| 99re视频精品| 久久er精品视频| 亚洲成a人v欧美综合天堂| 国产精品美女视频| 欧美精品一区二区精品网| 在线观看视频91| 北条麻妃一区二区三区| 蜜臀av一区二区| 亚洲国产成人精品视频| 亚洲婷婷在线视频|