1*4bb3f43cSMark Brown /* 2*4bb3f43cSMark Brown * Driver for the 1250-EV1 audio I/O module 3*4bb3f43cSMark Brown * 4*4bb3f43cSMark Brown * Copyright 2011 Wolfson Microelectronics plc 5*4bb3f43cSMark Brown * 6*4bb3f43cSMark Brown * This program is free software; you can redistribute it and/or modify it 7*4bb3f43cSMark Brown * under the terms of the GNU General Public License as published by the 8*4bb3f43cSMark Brown * Free Software Foundation; either version 2 of the License, or (at your 9*4bb3f43cSMark Brown * option) any later version. 10*4bb3f43cSMark Brown * 11*4bb3f43cSMark Brown */ 12*4bb3f43cSMark Brown 13*4bb3f43cSMark Brown #include <linux/init.h> 14*4bb3f43cSMark Brown #include <linux/module.h> 15*4bb3f43cSMark Brown #include <linux/i2c.h> 16*4bb3f43cSMark Brown 17*4bb3f43cSMark Brown #include <sound/soc.h> 18*4bb3f43cSMark Brown #include <sound/soc-dapm.h> 19*4bb3f43cSMark Brown 20*4bb3f43cSMark Brown static const struct snd_soc_dapm_widget wm1250_ev1_dapm_widgets[] = { 21*4bb3f43cSMark Brown SND_SOC_DAPM_ADC("ADC", "wm1250-ev1 Capture", SND_SOC_NOPM, 0, 0), 22*4bb3f43cSMark Brown SND_SOC_DAPM_DAC("DAC", "wm1250-ev1 Playback", SND_SOC_NOPM, 0, 0), 23*4bb3f43cSMark Brown 24*4bb3f43cSMark Brown SND_SOC_DAPM_INPUT("WM1250 Input"), 25*4bb3f43cSMark Brown SND_SOC_DAPM_INPUT("WM1250 Output"), 26*4bb3f43cSMark Brown }; 27*4bb3f43cSMark Brown 28*4bb3f43cSMark Brown static const struct snd_soc_dapm_route wm1250_ev1_dapm_routes[] = { 29*4bb3f43cSMark Brown { "ADC", NULL, "WM1250 Input" }, 30*4bb3f43cSMark Brown { "WM1250 Output", NULL, "DAC" }, 31*4bb3f43cSMark Brown }; 32*4bb3f43cSMark Brown 33*4bb3f43cSMark Brown static struct snd_soc_dai_driver wm1250_ev1_dai = { 34*4bb3f43cSMark Brown .name = "wm1250-ev1", 35*4bb3f43cSMark Brown .playback = { 36*4bb3f43cSMark Brown .stream_name = "Playback", 37*4bb3f43cSMark Brown .channels_min = 1, 38*4bb3f43cSMark Brown .channels_max = 1, 39*4bb3f43cSMark Brown .rates = SNDRV_PCM_RATE_8000, 40*4bb3f43cSMark Brown .formats = SNDRV_PCM_FMTBIT_S16_LE, 41*4bb3f43cSMark Brown }, 42*4bb3f43cSMark Brown .capture = { 43*4bb3f43cSMark Brown .stream_name = "Capture", 44*4bb3f43cSMark Brown .channels_min = 1, 45*4bb3f43cSMark Brown .channels_max = 1, 46*4bb3f43cSMark Brown .rates = SNDRV_PCM_RATE_8000, 47*4bb3f43cSMark Brown .formats = SNDRV_PCM_FMTBIT_S16_LE, 48*4bb3f43cSMark Brown }, 49*4bb3f43cSMark Brown }; 50*4bb3f43cSMark Brown 51*4bb3f43cSMark Brown static struct snd_soc_codec_driver soc_codec_dev_wm1250_ev1 = { 52*4bb3f43cSMark Brown .dapm_widgets = wm1250_ev1_dapm_widgets, 53*4bb3f43cSMark Brown .num_dapm_widgets = ARRAY_SIZE(wm1250_ev1_dapm_widgets), 54*4bb3f43cSMark Brown .dapm_routes = wm1250_ev1_dapm_routes, 55*4bb3f43cSMark Brown .num_dapm_routes = ARRAY_SIZE(wm1250_ev1_dapm_routes), 56*4bb3f43cSMark Brown }; 57*4bb3f43cSMark Brown 58*4bb3f43cSMark Brown static int __devinit wm1250_ev1_probe(struct i2c_client *i2c, 59*4bb3f43cSMark Brown const struct i2c_device_id *id) 60*4bb3f43cSMark Brown { 61*4bb3f43cSMark Brown return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm1250_ev1, 62*4bb3f43cSMark Brown &wm1250_ev1_dai, 1); 63*4bb3f43cSMark Brown } 64*4bb3f43cSMark Brown 65*4bb3f43cSMark Brown static int __devexit wm1250_ev1_remove(struct i2c_client *i2c) 66*4bb3f43cSMark Brown { 67*4bb3f43cSMark Brown snd_soc_unregister_codec(&i2c->dev); 68*4bb3f43cSMark Brown 69*4bb3f43cSMark Brown return 0; 70*4bb3f43cSMark Brown } 71*4bb3f43cSMark Brown 72*4bb3f43cSMark Brown static const struct i2c_device_id wm1250_ev1_i2c_id[] = { 73*4bb3f43cSMark Brown { "wm1250-ev1", 0 }, 74*4bb3f43cSMark Brown { } 75*4bb3f43cSMark Brown }; 76*4bb3f43cSMark Brown MODULE_DEVICE_TABLE(i2c, wm1250_ev1__id); 77*4bb3f43cSMark Brown 78*4bb3f43cSMark Brown static struct i2c_driver wm1250_ev1_i2c_driver = { 79*4bb3f43cSMark Brown .driver = { 80*4bb3f43cSMark Brown .name = "wm1250-ev1", 81*4bb3f43cSMark Brown .owner = THIS_MODULE, 82*4bb3f43cSMark Brown }, 83*4bb3f43cSMark Brown .probe = wm1250_ev1_probe, 84*4bb3f43cSMark Brown .remove = __devexit_p(wm1250_ev1_remove), 85*4bb3f43cSMark Brown .id_table = wm1250_ev1_i2c_id, 86*4bb3f43cSMark Brown }; 87*4bb3f43cSMark Brown 88*4bb3f43cSMark Brown static int __init wm1250_ev1_modinit(void) 89*4bb3f43cSMark Brown { 90*4bb3f43cSMark Brown int ret = 0; 91*4bb3f43cSMark Brown 92*4bb3f43cSMark Brown ret = i2c_add_driver(&wm1250_ev1_i2c_driver); 93*4bb3f43cSMark Brown if (ret != 0) 94*4bb3f43cSMark Brown pr_err("Failed to register WM1250-EV1 I2C driver: %d\n", ret); 95*4bb3f43cSMark Brown 96*4bb3f43cSMark Brown return ret; 97*4bb3f43cSMark Brown } 98*4bb3f43cSMark Brown module_init(wm1250_ev1_modinit); 99*4bb3f43cSMark Brown 100*4bb3f43cSMark Brown static void __exit wm1250_ev1_exit(void) 101*4bb3f43cSMark Brown { 102*4bb3f43cSMark Brown i2c_del_driver(&wm1250_ev1_i2c_driver); 103*4bb3f43cSMark Brown } 104*4bb3f43cSMark Brown module_exit(wm1250_ev1_exit); 105*4bb3f43cSMark Brown 106*4bb3f43cSMark Brown MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 107*4bb3f43cSMark Brown MODULE_DESCRIPTION("WM1250-EV1 audio I/O module driver"); 108*4bb3f43cSMark Brown MODULE_LICENSE("GPL"); 109