32
32
#define PCM3008_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
33
33
SNDRV_PCM_RATE_48000)
35
struct snd_soc_dai pcm3008_dai = {
36
.name = "PCM3008 HiFi",
35
static struct snd_soc_dai_driver pcm3008_dai = {
36
.name = "pcm3008-hifi",
38
38
.stream_name = "PCM3008 Playback",
59
58
gpio_free(setup->pdda_pin);
62
static int pcm3008_soc_probe(struct platform_device *pdev)
61
static int pcm3008_soc_probe(struct snd_soc_codec *codec)
64
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
65
struct snd_soc_codec *codec;
66
struct pcm3008_setup_data *setup = socdev->codec_data;
63
struct pcm3008_setup_data *setup = codec->dev->platform_data;
69
66
printk(KERN_INFO "PCM3008 SoC Audio Codec %s\n", PCM3008_VERSION);
71
socdev->card->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
72
if (!socdev->card->codec)
75
codec = socdev->card->codec;
76
mutex_init(&codec->mutex);
78
codec->name = "PCM3008";
79
codec->owner = THIS_MODULE;
80
codec->dai = &pcm3008_dai;
84
INIT_LIST_HEAD(&codec->dapm_widgets);
85
INIT_LIST_HEAD(&codec->dapm_paths);
88
ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
90
printk(KERN_ERR "pcm3008: failed to create pcms\n");
94
68
/* DEM1 DEM0 DE-EMPHASIS_MODE
95
69
* Low Low De-emphasis 44.1 kHz ON
96
70
* Low High De-emphasis OFF
132
106
pcm3008_gpio_free(setup);
134
kfree(socdev->card->codec);
139
static int pcm3008_soc_remove(struct platform_device *pdev)
111
static int pcm3008_soc_remove(struct snd_soc_codec *codec)
141
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
142
struct snd_soc_codec *codec = socdev->card->codec;
143
struct pcm3008_setup_data *setup = socdev->codec_data;
113
struct pcm3008_setup_data *setup = codec->dev->platform_data;
148
115
pcm3008_gpio_free(setup);
149
snd_soc_free_pcms(socdev);
150
kfree(socdev->card->codec);
156
static int pcm3008_soc_suspend(struct platform_device *pdev, pm_message_t msg)
120
static int pcm3008_soc_suspend(struct snd_soc_codec *codec, pm_message_t msg)
158
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
159
struct pcm3008_setup_data *setup = socdev->codec_data;
122
struct pcm3008_setup_data *setup = codec->dev->platform_data;
161
124
gpio_set_value(setup->pdad_pin, 0);
162
125
gpio_set_value(setup->pdda_pin, 0);
167
static int pcm3008_soc_resume(struct platform_device *pdev)
130
static int pcm3008_soc_resume(struct snd_soc_codec *codec)
169
struct snd_soc_device *socdev = platform_get_drvdata(pdev);
170
struct pcm3008_setup_data *setup = socdev->codec_data;
132
struct pcm3008_setup_data *setup = codec->dev->platform_data;
172
134
gpio_set_value(setup->pdad_pin, 1);
173
135
gpio_set_value(setup->pdda_pin, 1);
179
141
#define pcm3008_soc_resume NULL
182
struct snd_soc_codec_device soc_codec_dev_pcm3008 = {
144
static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
183
145
.probe = pcm3008_soc_probe,
184
146
.remove = pcm3008_soc_remove,
185
147
.suspend = pcm3008_soc_suspend,
186
148
.resume = pcm3008_soc_resume,
188
EXPORT_SYMBOL_GPL(soc_codec_dev_pcm3008);
190
static int __init pcm3008_init(void)
192
return snd_soc_register_dai(&pcm3008_dai);
194
module_init(pcm3008_init);
151
static int __devinit pcm3008_codec_probe(struct platform_device *pdev)
153
return snd_soc_register_codec(&pdev->dev,
154
&soc_codec_dev_pcm3008, &pcm3008_dai, 1);
157
static int __devexit pcm3008_codec_remove(struct platform_device *pdev)
159
snd_soc_unregister_codec(&pdev->dev);
163
MODULE_ALIAS("platform:pcm3008-codec");
165
static struct platform_driver pcm3008_codec_driver = {
166
.probe = pcm3008_codec_probe,
167
.remove = __devexit_p(pcm3008_codec_remove),
169
.name = "pcm3008-codec",
170
.owner = THIS_MODULE,
174
static int __init pcm3008_modinit(void)
176
return platform_driver_register(&pcm3008_codec_driver);
178
module_init(pcm3008_modinit);
196
180
static void __exit pcm3008_exit(void)
198
snd_soc_unregister_dai(&pcm3008_dai);
182
platform_driver_unregister(&pcm3008_codec_driver);
200
184
module_exit(pcm3008_exit);