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

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

?? patch_cmedia.c

?? 一個Linux下的軟貓驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * Universal Interface for Intel High Definition Audio Codec * * HD audio interface patch for C-Media CMI9880 * * Copyright (c) 2004 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 */#include <sound/driver.h>#include <linux/init.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/pci.h>#include <sound/core.h>#include "hda_codec.h"#include "hda_local.h"#define NUM_PINS	11/* board config type */enum {	CMI_MINIMAL,	/* back 3-jack */	CMI_MIN_FP,	/* back 3-jack + front-panel 2-jack */	CMI_FULL,	/* back 6-jack + front-panel 2-jack */	CMI_FULL_DIG,	/* back 6-jack + front-panel 2-jack + digital I/O */	CMI_ALLOUT,	/* back 5-jack + front-panel 2-jack + digital out */	CMI_AUTO,	/* let driver guess it */};struct cmi_spec {	int board_config;	unsigned int surr_switch: 1;	/* switchable line,mic */	unsigned int no_line_in: 1;	/* no line-in (5-jack) */	unsigned int front_panel: 1;	/* has front-panel 2-jack */	/* playback */	struct hda_multi_out multiout;	hda_nid_t dac_nids[4];		/* NID for each DAC */	int num_dacs;	/* capture */	hda_nid_t *adc_nids;	hda_nid_t dig_in_nid;	/* capture source */	const struct hda_input_mux *input_mux;	unsigned int cur_mux[2];	/* channel mode */	unsigned int num_ch_modes;	unsigned int cur_ch_mode;	const struct cmi_channel_mode *channel_modes;	struct hda_pcm pcm_rec[2];	/* PCM information */	/* pin deafault configuration */	hda_nid_t pin_nid[NUM_PINS];	unsigned int def_conf[NUM_PINS];	unsigned int pin_def_confs;	/* multichannel pins */	hda_nid_t multich_pin[4];	/* max 8-channel */	struct hda_verb multi_init[9];	/* 2 verbs for each pin + terminator */};/* amp values */#define AMP_IN_MUTE(idx)	(0x7080 | ((idx)<<8))#define AMP_IN_UNMUTE(idx)	(0x7000 | ((idx)<<8))#define AMP_OUT_MUTE	0xb080#define AMP_OUT_UNMUTE	0xb000#define AMP_OUT_ZERO	0xb000/* pinctl values */#define PIN_IN		0x20#define PIN_VREF80	0x24#define PIN_VREF50	0x21#define PIN_OUT		0x40#define PIN_HP		0xc0/* * input MUX */static int cmi_mux_enum_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_spec *spec = codec->spec;	return snd_hda_input_mux_info(spec->input_mux, uinfo);}static int cmi_mux_enum_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_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 cmi_mux_enum_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_spec *spec = codec->spec;	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);	return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,				     spec->adc_nids[adc_idx], &spec->cur_mux[adc_idx]);}/* * shared line-in, mic for surrounds *//* 3-stack / 2 channel */static struct hda_verb cmi9880_ch2_init[] = {	/* set line-in PIN for input */	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* set mic PIN for input, also enable vref */	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* route front PCM (DAC1) to HP */	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },	{}};/* 3-stack / 6 channel */static struct hda_verb cmi9880_ch6_init[] = {	/* set line-in PIN for output */	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* set mic PIN for output */	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* route front PCM (DAC1) to HP */	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },	{}};/* 3-stack+front / 8 channel */static struct hda_verb cmi9880_ch8_init[] = {	/* set line-in PIN for output */	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* set mic PIN for output */	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },	/* route rear-surround PCM (DAC4) to HP */	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x03 },	{}};struct cmi_channel_mode {	unsigned int channels;	const struct hda_verb *sequence;};static struct cmi_channel_mode cmi9880_channel_modes[3] = {	{ 2, cmi9880_ch2_init },	{ 6, cmi9880_ch6_init },	{ 8, cmi9880_ch8_init },};static int cmi_ch_mode_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_spec *spec = codec->spec;	snd_assert(spec->channel_modes, return -EINVAL);	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;	uinfo->count = 1;	uinfo->value.enumerated.items = spec->num_ch_modes;	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;	sprintf(uinfo->value.enumerated.name, "%dch",		spec->channel_modes[uinfo->value.enumerated.item].channels);	return 0;}static int cmi_ch_mode_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_spec *spec = codec->spec;	ucontrol->value.enumerated.item[0] = spec->cur_ch_mode;	return 0;}static int cmi_ch_mode_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol){	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);	struct cmi_spec *spec = codec->spec;	snd_assert(spec->channel_modes, return -EINVAL);	if (ucontrol->value.enumerated.item[0] >= spec->num_ch_modes)		ucontrol->value.enumerated.item[0] = spec->num_ch_modes;	if (ucontrol->value.enumerated.item[0] == spec->cur_ch_mode &&	    ! codec->in_resume)		return 0;	spec->cur_ch_mode = ucontrol->value.enumerated.item[0];	snd_hda_sequence_write(codec, spec->channel_modes[spec->cur_ch_mode].sequence);	spec->multiout.max_channels = spec->channel_modes[spec->cur_ch_mode].channels;	return 1;}/* */static snd_kcontrol_new_t cmi9880_basic_mixer[] = {	/* CMI9880 has no playback volumes! */	HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), /* front */	HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),	HDA_CODEC_MUTE("Side Playback Switch", 0x06, 0x0, HDA_OUTPUT),	{		.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 = 2,		.info = cmi_mux_enum_info,		.get = cmi_mux_enum_get,		.put = cmi_mux_enum_put,	},	HDA_CODEC_VOLUME("Capture Volume", 0x08, 0, HDA_INPUT),	HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0, HDA_INPUT),	HDA_CODEC_MUTE("Capture Switch", 0x08, 0, HDA_INPUT),	HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0, HDA_INPUT),	HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x23, 0, HDA_OUTPUT),	HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x23, 0, HDA_OUTPUT),	{ } /* end */};/* * shared I/O pins */static snd_kcontrol_new_t cmi9880_ch_mode_mixer[] = {	{		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,		.name = "Channel Mode",		.info = cmi_ch_mode_info,		.get = cmi_ch_mode_get,		.put = cmi_ch_mode_put,	},	{ } /* end */};/* AUD-in selections: * 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x1f 0x20 */static struct hda_input_mux cmi9880_basic_mux = {	.num_items = 4,	.items = {		{ "Front Mic", 0x5 },		{ "Rear Mic", 0x2 },		{ "Line", 0x1 },		{ "CD", 0x7 },	}};static struct hda_input_mux cmi9880_no_line_mux = {	.num_items = 3,	.items = {		{ "Front Mic", 0x5 },		{ "Rear Mic", 0x2 },		{ "CD", 0x7 },	}};/* front, rear, clfe, rear_surr */static hda_nid_t cmi9880_dac_nids[4] = {	0x03, 0x04, 0x05, 0x06};/* ADC0, ADC1 */static hda_nid_t cmi9880_adc_nids[2] = {	0x08, 0x09};#define CMI_DIG_OUT_NID	0x07#define CMI_DIG_IN_NID	0x0a/* */static struct hda_verb cmi9880_basic_init[] = {	/* port-D for line out (rear panel) */	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* port-E for HP out (front panel) */	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* route front PCM to HP */	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },	/* port-A for surround (rear panel) */	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* port-G for CLFE (rear panel) */	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x02 },	/* port-H for side (rear panel) */	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x01 },	/* port-C for line-in (rear panel) */	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* port-B for mic-in (rear panel) with vref */	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* port-F for mic-in (front panel) with vref */	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* CD-in */	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* route front mic to ADC1/2 */	{ 0x08, AC_VERB_SET_CONNECT_SEL, 0x05 },	{ 0x09, AC_VERB_SET_CONNECT_SEL, 0x05 },	{} /* terminator */};static struct hda_verb cmi9880_allout_init[] = {	/* port-D for line out (rear panel) */	{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* port-E for HP out (front panel) */	{ 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* route front PCM to HP */	{ 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },	/* port-A for side (rear panel) */	{ 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* port-G for CLFE (rear panel) */	{ 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	{ 0x1f, AC_VERB_SET_CONNECT_SEL, 0x02 },	/* port-H for side (rear panel) */	{ 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	{ 0x20, AC_VERB_SET_CONNECT_SEL, 0x01 },	/* port-C for surround (rear panel) */	{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },	/* port-B for mic-in (rear panel) with vref */	{ 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* port-F for mic-in (front panel) with vref */	{ 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },	/* CD-in */	{ 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },	/* route front mic to ADC1/2 */	{ 0x08, AC_VERB_SET_CONNECT_SEL, 0x05 },	{ 0x09, AC_VERB_SET_CONNECT_SEL, 0x05 },	{} /* terminator */};/* */static int cmi9880_build_controls(struct hda_codec *codec){	struct cmi_spec *spec = codec->spec;	int err;	err = snd_hda_add_new_ctls(codec, cmi9880_basic_mixer);	if (err < 0)		return err;	if (spec->surr_switch) {		err = snd_hda_add_new_ctls(codec, cmi9880_ch_mode_mixer);		if (err < 0)			return err;	}	if (spec->multiout.dig_out_nid) {		err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid);		if (err < 0)			return err;	}	if (spec->dig_in_nid) {		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);		if (err < 0)			return err;	}	return 0;}/* fill in the multi_dac_nids table, which will decide   which audio widget to use for each channel */static int cmi9880_fill_multi_dac_nids(struct hda_codec *codec, const struct auto_pin_cfg *cfg){	struct cmi_spec *spec = codec->spec;	hda_nid_t nid;	int assigned[4];	int i, j;	/* clear the table, only one c-media dac assumed here */	memset(spec->dac_nids, 0, sizeof(spec->dac_nids));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久久久久久久久久院品网| 毛片av中文字幕一区二区| 精品影院一区二区久久久| 日韩精品一区在线| 国产伦精一区二区三区| 欧美国产亚洲另类动漫| av激情综合网| 亚洲一区二区在线观看视频| 欧美一级在线观看| 国产美女娇喘av呻吟久久| 国产精品色一区二区三区| 91成人免费在线视频| 日韩福利电影在线| 中文字幕免费观看一区| 在线中文字幕不卡| 激情图区综合网| 国产精品成人网| 51午夜精品国产| 国产精品一区二区三区网站| 成人免费在线播放视频| 在线不卡免费欧美| 国产成人亚洲精品狼色在线| 一个色妞综合视频在线观看| 日韩欧美在线123| 91猫先生在线| 久久精品国产在热久久| 136国产福利精品导航| 欧美精品高清视频| 国产乱子轮精品视频| 亚洲国产精品一区二区www在线| 精品国产麻豆免费人成网站| 95精品视频在线| 美女视频网站久久| 亚洲综合精品久久| 欧美极品少妇xxxxⅹ高跟鞋| 欧美久久久久免费| 99久久精品99国产精品| 激情亚洲综合在线| 性做久久久久久免费观看| 中文一区二区在线观看| 日韩欧美一级在线播放| 色狠狠一区二区| 顶级嫩模精品视频在线看| 日韩高清一级片| 伊人性伊人情综合网| 亚洲精品一区二区三区蜜桃下载 | 欧美综合一区二区三区| 蓝色福利精品导航| 亚洲一区二区在线免费观看视频| 国产精品沙发午睡系列990531| 日韩一区二区在线观看视频 | 亚洲激情图片一区| 国产拍揄自揄精品视频麻豆| 日韩免费电影一区| 欧美疯狂性受xxxxx喷水图片| 99久久伊人网影院| 国产凹凸在线观看一区二区| 蜜臀av一区二区| 天涯成人国产亚洲精品一区av| 中文字幕亚洲欧美在线不卡| 久久久久国产精品麻豆ai换脸| 欧美一卡二卡在线观看| 欧美精品丝袜久久久中文字幕| 一本久道中文字幕精品亚洲嫩| 国产**成人网毛片九色| 国产福利一区二区三区视频| 精品在线免费观看| 久久电影网电视剧免费观看| 日韩va欧美va亚洲va久久| 首页亚洲欧美制服丝腿| 午夜在线成人av| 午夜精品福利一区二区蜜股av| 亚洲自拍偷拍九九九| 夜夜嗨av一区二区三区网页| 一区二区三区四区不卡在线| 亚洲色欲色欲www| 亚洲欧美日韩国产手机在线| 亚洲色图清纯唯美| 亚洲精品欧美在线| 亚洲成av人片www| 丝袜美腿高跟呻吟高潮一区| 日韩精品视频网站| 青娱乐精品视频| 美脚の诱脚舐め脚责91 | 在线观看一区不卡| 欧美自拍丝袜亚洲| 欧美群妇大交群的观看方式| 欧美高清精品3d| 欧美va日韩va| 日本一区二区三区视频视频| 中文字幕一区二区视频| 亚洲综合另类小说| 日韩黄色片在线观看| 久久97超碰色| 国产91在线观看丝袜| 97精品国产露脸对白| 色狠狠色噜噜噜综合网| 91精品国产全国免费观看| 亚洲精品一线二线三线无人区| 亚洲国产成人在线| 亚洲综合丁香婷婷六月香| 奇米色一区二区| 成人性视频网站| 在线免费观看日本一区| 日韩欧美一级二级三级久久久| 国产色综合一区| 一区二区三区视频在线观看| 青青草97国产精品免费观看无弹窗版| 激情五月激情综合网| 一本大道久久a久久综合婷婷| 欧美精品在线一区二区| 国产视频一区在线观看 | 日韩高清不卡一区| 国产不卡在线视频| 欧美日韩综合一区| 久久久亚洲综合| 亚洲福利电影网| 国产精品1区二区.| 精品视频在线免费观看| 久久久电影一区二区三区| 亚洲综合色网站| 福利一区二区在线| 717成人午夜免费福利电影| 国产欧美久久久精品影院| 亚洲mv大片欧洲mv大片精品| 国产成人午夜99999| 欧美日韩亚洲另类| 亚洲国产成人自拍| 久久精品国产在热久久| 欧美又粗又大又爽| 欧美极品少妇xxxxⅹ高跟鞋| 日韩av一二三| 色综合久久综合网欧美综合网 | 人人超碰91尤物精品国产| 99vv1com这只有精品| 欧美不卡一区二区三区| 亚洲自拍偷拍九九九| 波多野结衣91| 久久精品人人做人人爽人人| 婷婷综合在线观看| 色婷婷精品久久二区二区蜜臀av | 成人99免费视频| 精品国精品国产尤物美女| 亚洲成人午夜电影| 91免费观看视频| 国产精品美女www爽爽爽| 国内久久婷婷综合| 欧美一区二区三区的| 亚洲午夜在线视频| 欧美亚洲禁片免费| 亚洲精品午夜久久久| 成人国产精品免费网站| 国产免费久久精品| 国产麻豆精品在线观看| 欧美第一区第二区| 蜜桃视频在线观看一区| 69av一区二区三区| 午夜精品久久久久久久99樱桃| 色噜噜狠狠成人中文综合| 亚洲美女免费在线| 成人国产精品免费观看动漫| 国产亚洲一区二区三区| 国产精品一区一区三区| 欧美精品一区二区三区蜜桃| 精品一区二区免费在线观看| 日韩精品综合一本久道在线视频| 日本在线观看不卡视频| 欧美一区二区在线观看| 奇米影视在线99精品| 日韩欧美高清在线| 韩日av一区二区| 久久久久久久国产精品影院| 国产精品66部| 中文字幕一区二区在线播放| 99vv1com这只有精品| 亚洲一区二区视频| 欧美日韩国产综合视频在线观看| 午夜久久久久久电影| 欧美成人综合网站| 国产黄色精品视频| 亚洲丝袜自拍清纯另类| 在线观看欧美精品| 日本不卡一二三区黄网| 精品国产免费一区二区三区四区| 国产激情精品久久久第一区二区| 中文字幕色av一区二区三区| 在线看日本不卡| 日韩va欧美va亚洲va久久| 久久午夜国产精品| www.66久久| 日韩成人一区二区三区在线观看| 久久亚洲精品国产精品紫薇| av中文字幕亚洲| 午夜激情一区二区三区| 久久蜜臀中文字幕| 日本乱码高清不卡字幕| 蜜桃久久久久久久| 国产精品伦一区二区三级视频| 在线免费观看一区| 国产麻豆精品theporn|