xref: /openbmc/linux/sound/soc/codecs/wm1250-ev1.c (revision 979f486944174760400f797d509c05a018132b98)
14bb3f43cSMark Brown /*
24bb3f43cSMark Brown  * Driver for the 1250-EV1 audio I/O module
34bb3f43cSMark Brown  *
44bb3f43cSMark Brown  * Copyright 2011 Wolfson Microelectronics plc
54bb3f43cSMark Brown  *
64bb3f43cSMark Brown  *  This program is free software; you can redistribute  it and/or modify it
74bb3f43cSMark Brown  *  under  the terms of  the GNU General  Public License as published by the
84bb3f43cSMark Brown  *  Free Software Foundation;  either version 2 of the  License, or (at your
94bb3f43cSMark Brown  *  option) any later version.
104bb3f43cSMark Brown  *
114bb3f43cSMark Brown  */
124bb3f43cSMark Brown 
134bb3f43cSMark Brown #include <linux/init.h>
144bb3f43cSMark Brown #include <linux/module.h>
154bb3f43cSMark Brown #include <linux/i2c.h>
164bb3f43cSMark Brown 
174bb3f43cSMark Brown #include <sound/soc.h>
184bb3f43cSMark Brown #include <sound/soc-dapm.h>
194bb3f43cSMark Brown 
204bb3f43cSMark Brown static const struct snd_soc_dapm_widget wm1250_ev1_dapm_widgets[] = {
214bb3f43cSMark Brown SND_SOC_DAPM_ADC("ADC", "wm1250-ev1 Capture", SND_SOC_NOPM, 0, 0),
224bb3f43cSMark Brown SND_SOC_DAPM_DAC("DAC", "wm1250-ev1 Playback", SND_SOC_NOPM, 0, 0),
234bb3f43cSMark Brown 
244bb3f43cSMark Brown SND_SOC_DAPM_INPUT("WM1250 Input"),
25*979f4869SAxel Lin SND_SOC_DAPM_OUTPUT("WM1250 Output"),
264bb3f43cSMark Brown };
274bb3f43cSMark Brown 
284bb3f43cSMark Brown static const struct snd_soc_dapm_route wm1250_ev1_dapm_routes[] = {
294bb3f43cSMark Brown 	{ "ADC", NULL, "WM1250 Input" },
304bb3f43cSMark Brown 	{ "WM1250 Output", NULL, "DAC" },
314bb3f43cSMark Brown };
324bb3f43cSMark Brown 
334bb3f43cSMark Brown static struct snd_soc_dai_driver wm1250_ev1_dai = {
344bb3f43cSMark Brown 	.name = "wm1250-ev1",
354bb3f43cSMark Brown 	.playback = {
364bb3f43cSMark Brown 		.stream_name = "Playback",
374bb3f43cSMark Brown 		.channels_min = 1,
384bb3f43cSMark Brown 		.channels_max = 1,
394bb3f43cSMark Brown 		.rates = SNDRV_PCM_RATE_8000,
404bb3f43cSMark Brown 		.formats = SNDRV_PCM_FMTBIT_S16_LE,
414bb3f43cSMark Brown 	},
424bb3f43cSMark Brown 	.capture = {
434bb3f43cSMark Brown 		.stream_name = "Capture",
444bb3f43cSMark Brown 		.channels_min = 1,
454bb3f43cSMark Brown 		.channels_max = 1,
464bb3f43cSMark Brown 		.rates = SNDRV_PCM_RATE_8000,
474bb3f43cSMark Brown 		.formats = SNDRV_PCM_FMTBIT_S16_LE,
484bb3f43cSMark Brown 	},
494bb3f43cSMark Brown };
504bb3f43cSMark Brown 
514bb3f43cSMark Brown static struct snd_soc_codec_driver soc_codec_dev_wm1250_ev1 = {
524bb3f43cSMark Brown 	.dapm_widgets = wm1250_ev1_dapm_widgets,
534bb3f43cSMark Brown 	.num_dapm_widgets = ARRAY_SIZE(wm1250_ev1_dapm_widgets),
544bb3f43cSMark Brown 	.dapm_routes = wm1250_ev1_dapm_routes,
554bb3f43cSMark Brown 	.num_dapm_routes = ARRAY_SIZE(wm1250_ev1_dapm_routes),
564bb3f43cSMark Brown };
574bb3f43cSMark Brown 
584bb3f43cSMark Brown static int __devinit wm1250_ev1_probe(struct i2c_client *i2c,
594bb3f43cSMark Brown 				      const struct i2c_device_id *id)
604bb3f43cSMark Brown {
614bb3f43cSMark Brown 	return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm1250_ev1,
624bb3f43cSMark Brown 				      &wm1250_ev1_dai, 1);
634bb3f43cSMark Brown }
644bb3f43cSMark Brown 
654bb3f43cSMark Brown static int __devexit wm1250_ev1_remove(struct i2c_client *i2c)
664bb3f43cSMark Brown {
674bb3f43cSMark Brown 	snd_soc_unregister_codec(&i2c->dev);
684bb3f43cSMark Brown 
694bb3f43cSMark Brown 	return 0;
704bb3f43cSMark Brown }
714bb3f43cSMark Brown 
724bb3f43cSMark Brown static const struct i2c_device_id wm1250_ev1_i2c_id[] = {
734bb3f43cSMark Brown 	{ "wm1250-ev1", 0 },
744bb3f43cSMark Brown 	{ }
754bb3f43cSMark Brown };
76420dd718SMark Brown MODULE_DEVICE_TABLE(i2c, wm1250_ev1_i2c_id);
774bb3f43cSMark Brown 
784bb3f43cSMark Brown static struct i2c_driver wm1250_ev1_i2c_driver = {
794bb3f43cSMark Brown 	.driver = {
804bb3f43cSMark Brown 		.name = "wm1250-ev1",
814bb3f43cSMark Brown 		.owner = THIS_MODULE,
824bb3f43cSMark Brown 	},
834bb3f43cSMark Brown 	.probe =    wm1250_ev1_probe,
844bb3f43cSMark Brown 	.remove =   __devexit_p(wm1250_ev1_remove),
854bb3f43cSMark Brown 	.id_table = wm1250_ev1_i2c_id,
864bb3f43cSMark Brown };
874bb3f43cSMark Brown 
884bb3f43cSMark Brown static int __init wm1250_ev1_modinit(void)
894bb3f43cSMark Brown {
904bb3f43cSMark Brown 	int ret = 0;
914bb3f43cSMark Brown 
924bb3f43cSMark Brown 	ret = i2c_add_driver(&wm1250_ev1_i2c_driver);
934bb3f43cSMark Brown 	if (ret != 0)
944bb3f43cSMark Brown 		pr_err("Failed to register WM1250-EV1 I2C driver: %d\n", ret);
954bb3f43cSMark Brown 
964bb3f43cSMark Brown 	return ret;
974bb3f43cSMark Brown }
984bb3f43cSMark Brown module_init(wm1250_ev1_modinit);
994bb3f43cSMark Brown 
1004bb3f43cSMark Brown static void __exit wm1250_ev1_exit(void)
1014bb3f43cSMark Brown {
1024bb3f43cSMark Brown 	i2c_del_driver(&wm1250_ev1_i2c_driver);
1034bb3f43cSMark Brown }
1044bb3f43cSMark Brown module_exit(wm1250_ev1_exit);
1054bb3f43cSMark Brown 
1064bb3f43cSMark Brown MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1074bb3f43cSMark Brown MODULE_DESCRIPTION("WM1250-EV1 audio I/O module driver");
1084bb3f43cSMark Brown MODULE_LICENSE("GPL");
109