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

📄 neo1973_wm8753.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	int shift = (kcontrol->private_value >> 8) & 0x0F;	int mask = (kcontrol->private_value >> 16) & 0xFF;	ucontrol->value.integer.value[0] = (lm4857_regs[reg] >> shift) & mask;	return 0;}static int lm4857_set_reg(struct snd_kcontrol *kcontrol,	struct snd_ctl_elem_value *ucontrol){	int reg = kcontrol->private_value & 0xFF;	int shift = (kcontrol->private_value >> 8) & 0x0F;	int mask = (kcontrol->private_value >> 16) & 0xFF;	if (((lm4857_regs[reg] >> shift ) & mask) ==		ucontrol->value.integer.value[0])		return 0;	lm4857_regs[reg] &= ~ (mask << shift);	lm4857_regs[reg] |= ucontrol->value.integer.value[0] << shift;	lm4857_write_regs();	return 1;}static int lm4857_get_mode(struct snd_kcontrol *kcontrol,	struct snd_ctl_elem_value *ucontrol){	u8 value = lm4857_regs[LM4857_CTRL] & 0x0F;	if (value)		value -= 5;	ucontrol->value.integer.value[0] = value;	return 0;}static int lm4857_set_mode(struct snd_kcontrol *kcontrol,	struct snd_ctl_elem_value *ucontrol){	u8 value = ucontrol->value.integer.value[0];	if (value)		value += 5;	if ((lm4857_regs[LM4857_CTRL] & 0x0F) == value)		return 0;	lm4857_regs[LM4857_CTRL] &= 0xF0;	lm4857_regs[LM4857_CTRL] |= value;	lm4857_write_regs();	return 1;}static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {	SND_SOC_DAPM_LINE("Audio Out", NULL),	SND_SOC_DAPM_LINE("GSM Line Out", NULL),	SND_SOC_DAPM_LINE("GSM Line In", NULL),	SND_SOC_DAPM_MIC("Headset Mic", NULL),	SND_SOC_DAPM_MIC("Call Mic", NULL),};/* example machine audio_mapnections */static const char* audio_map[][3] = {	/* Connections to the lm4857 amp */	{"Audio Out", NULL, "LOUT1"},	{"Audio Out", NULL, "ROUT1"},	/* Connections to the GSM Module */	{"GSM Line Out", NULL, "MONO1"},	{"GSM Line Out", NULL, "MONO2"},	{"RXP", NULL, "GSM Line In"},	{"RXN", NULL, "GSM Line In"},	/* Connections to Headset */	{"MIC1", NULL, "Mic Bias"},	{"Mic Bias", NULL, "Headset Mic"},	/* Call Mic */	{"MIC2", NULL, "Mic Bias"},	{"MIC2N", NULL, "Mic Bias"},	{"Mic Bias", NULL, "Call Mic"},	/* Connect the ALC pins */	{"ACIN", NULL, "ACOP"},	{NULL, NULL, NULL},};static const char *lm4857_mode[] = {	"Off",	"Call Speaker",	"Stereo Speakers",	"Stereo Speakers + Headphones",	"Headphones"};static const struct soc_enum lm4857_mode_enum[] = {	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lm4857_mode), lm4857_mode),};static const char *neo_scenarios[] = {	"Off",	"GSM Handset",	"GSM Headset",	"GSM Bluetooth",	"Speakers",	"Headphones",	"Capture Handset",	"Capture Headset",	"Capture Bluetooth"};static const struct soc_enum neo_scenario_enum[] = {	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(neo_scenarios),neo_scenarios),};static const struct snd_kcontrol_new wm8753_neo1973_controls[] = {	SOC_SINGLE_EXT("Amp Left Playback Volume", LM4857_LVOL, 0, 31, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_SINGLE_EXT("Amp Right Playback Volume", LM4857_RVOL, 0, 31, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_SINGLE_EXT("Amp Mono Playback Volume", LM4857_MVOL, 0, 31, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_ENUM_EXT("Amp Mode", lm4857_mode_enum[0],		lm4857_get_mode, lm4857_set_mode),	SOC_ENUM_EXT("Neo Mode", neo_scenario_enum[0],		neo1973_get_scenario, neo1973_set_scenario),	SOC_SINGLE_EXT("Amp Spk 3D Playback Switch", LM4857_LVOL, 5, 1, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_SINGLE_EXT("Amp HP 3d Playback Switch", LM4857_RVOL, 5, 1, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_SINGLE_EXT("Amp Fast Wakeup Playback Switch", LM4857_CTRL, 5, 1, 0,		lm4857_get_reg, lm4857_set_reg),	SOC_SINGLE_EXT("Amp Earpiece 6dB Playback Switch", LM4857_CTRL, 4, 1, 0,		lm4857_get_reg, lm4857_set_reg),};/* * This is an example machine initialisation for a wm8753 connected to a * neo1973 II. It is missing logic to detect hp/mic insertions and logic * to re-route the audio in such an event. */static int neo1973_wm8753_init(struct snd_soc_codec *codec){	int i, err;	/* set up NC codec pins */	snd_soc_dapm_set_endpoint(codec, "LOUT2", 0);	snd_soc_dapm_set_endpoint(codec, "ROUT2", 0);	snd_soc_dapm_set_endpoint(codec, "OUT3",  0);	snd_soc_dapm_set_endpoint(codec, "OUT4",  0);	snd_soc_dapm_set_endpoint(codec, "LINE1", 0);	snd_soc_dapm_set_endpoint(codec, "LINE2", 0);	/* set endpoints to default mode */	set_scenario_endpoints(codec, NEO_AUDIO_OFF);	/* Add neo1973 specific widgets */	for (i = 0; i < ARRAY_SIZE(wm8753_dapm_widgets); i++)		snd_soc_dapm_new_control(codec, &wm8753_dapm_widgets[i]);	/* add neo1973 specific controls */	for (i = 0; i < ARRAY_SIZE(wm8753_neo1973_controls); i++) {		err = snd_ctl_add(codec->card,				snd_soc_cnew(&wm8753_neo1973_controls[i],				codec, NULL));		if (err < 0)			return err;	}	/* set up neo1973 specific audio path audio_mapnects */	for (i = 0; audio_map[i][0] != NULL; i++) {		snd_soc_dapm_connect_input(codec, audio_map[i][0],			audio_map[i][1], audio_map[i][2]);	}	snd_soc_dapm_sync_endpoints(codec);	return 0;}/* * BT Codec DAI */static struct snd_soc_cpu_dai bt_dai ={	.name = "Bluetooth",	.id = 0,	.type = SND_SOC_DAI_PCM,	.playback = {		.channels_min = 1,		.channels_max = 1,		.rates = SNDRV_PCM_RATE_8000,		.formats = SNDRV_PCM_FMTBIT_S16_LE,},	.capture = {		.channels_min = 1,		.channels_max = 1,		.rates = SNDRV_PCM_RATE_8000,		.formats = SNDRV_PCM_FMTBIT_S16_LE,},};static struct snd_soc_dai_link neo1973_dai[] = {{ /* Hifi Playback - for similatious use with voice below */	.name = "WM8753",	.stream_name = "WM8753 HiFi",	.cpu_dai = &s3c24xx_i2s_dai,	.codec_dai = &wm8753_dai[WM8753_DAI_HIFI],	.init = neo1973_wm8753_init,	.ops = &neo1973_hifi_ops,},{ /* Voice via BT */	.name = "Bluetooth",	.stream_name = "Voice",	.cpu_dai = &bt_dai,	.codec_dai = &wm8753_dai[WM8753_DAI_VOICE],	.ops = &neo1973_voice_ops,},};static struct snd_soc_machine neo1973 = {	.name = "neo1973",	.dai_link = neo1973_dai,	.num_links = ARRAY_SIZE(neo1973_dai),};static struct wm8753_setup_data neo1973_wm8753_setup = {	.i2c_address = 0x1a,};static struct snd_soc_device neo1973_snd_devdata = {	.machine = &neo1973,	.platform = &s3c24xx_soc_platform,	.codec_dev = &soc_codec_dev_wm8753,	.codec_data = &neo1973_wm8753_setup,};static struct i2c_client client_template;static unsigned short normal_i2c[] = { 0x7C, I2C_CLIENT_END };/* Magic definition of all other variables and things */I2C_CLIENT_INSMOD;static int lm4857_amp_probe(struct i2c_adapter *adap, int addr, int kind){	int ret;	client_template.adapter = adap;	client_template.addr = addr;	i2c = kmemdup(&client_template, sizeof(client_template), GFP_KERNEL);	if (i2c == NULL)		return -ENOMEM;	ret = i2c_attach_client(i2c);	if (ret < 0) {		printk(KERN_ERR "LM4857 failed to attach at addr %x\n", addr);		goto exit_err;	}	lm4857_write_regs();	return ret;exit_err:	kfree(i2c);	return ret;}static int lm4857_i2c_detach(struct i2c_client *client){	i2c_detach_client(client);	kfree(client);	return 0;}static int lm4857_i2c_attach(struct i2c_adapter *adap){	return i2c_probe(adap, &addr_data, lm4857_amp_probe);}/* corgi i2c codec control layer */static struct i2c_driver lm4857_i2c_driver = {	.driver = {		.name = "LM4857 I2C Amp",		.owner = THIS_MODULE,	},	.id =             I2C_DRIVERID_LM4857,	.attach_adapter = lm4857_i2c_attach,	.detach_client =  lm4857_i2c_detach,	.command =        NULL,};static struct i2c_client client_template = {	.name =   "LM4857",	.driver = &lm4857_i2c_driver,};static struct platform_device *neo1973_snd_device;static int __init neo1973_init(void){	int ret;	neo1973_snd_device = platform_device_alloc("soc-audio", -1);	if (!neo1973_snd_device)		return -ENOMEM;	platform_set_drvdata(neo1973_snd_device, &neo1973_snd_devdata);	neo1973_snd_devdata.dev = &neo1973_snd_device->dev;	ret = platform_device_add(neo1973_snd_device);	if (ret)		platform_device_put(neo1973_snd_device);	ret = i2c_add_driver(&lm4857_i2c_driver);	if (ret != 0)		printk(KERN_ERR "can't add i2c driver");	return ret;}static void __exit neo1973_exit(void){	platform_device_unregister(neo1973_snd_device);}module_init(neo1973_init);module_exit(neo1973_exit);/* Module information */MODULE_AUTHOR("Graeme Gregory, graeme.gregory@wolfsonmicro.com, www.wolfsonmicro.com");MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973");MODULE_LICENSE("GPL");

⌨️ 快捷键说明

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