aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/pcm3008.c
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-07-10 11:48:24 -0400
committerMark Brown <broonie@linaro.org>2013-07-15 06:11:03 -0400
commitd7f184958e5292280c1048df951932bbfcd95f60 (patch)
treeaf8099eb75a0e52a1e894db29007768e3ee0ccbd /sound/soc/codecs/pcm3008.c
parentb641edfbf253a67a87698df275e3a35a7deac5d4 (diff)
ASoC: pcm3008: Move gpio allocation to probe
This is better from a device model point of view since we don't try to do things like instantiate the card until the required resources appear. Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/codecs/pcm3008.c')
-rw-r--r--sound/soc/codecs/pcm3008.c87
1 files changed, 38 insertions, 49 deletions
diff --git a/sound/soc/codecs/pcm3008.c b/sound/soc/codecs/pcm3008.c
index 32e5a591f921..8ab1c03d26bd 100644
--- a/sound/soc/codecs/pcm3008.c
+++ b/sound/soc/codecs/pcm3008.c
@@ -57,10 +57,40 @@ static void pcm3008_gpio_free(struct pcm3008_setup_data *setup)
57 gpio_free(setup->pdda_pin); 57 gpio_free(setup->pdda_pin);
58} 58}
59 59
60static int pcm3008_soc_probe(struct snd_soc_codec *codec) 60#ifdef CONFIG_PM
61static int pcm3008_soc_suspend(struct snd_soc_codec *codec)
62{
63 struct pcm3008_setup_data *setup = codec->dev->platform_data;
64
65 gpio_set_value(setup->pdad_pin, 0);
66 gpio_set_value(setup->pdda_pin, 0);
67
68 return 0;
69}
70
71static int pcm3008_soc_resume(struct snd_soc_codec *codec)
61{ 72{
62 struct pcm3008_setup_data *setup = codec->dev->platform_data; 73 struct pcm3008_setup_data *setup = codec->dev->platform_data;
63 int ret = 0; 74
75 gpio_set_value(setup->pdad_pin, 1);
76 gpio_set_value(setup->pdda_pin, 1);
77
78 return 0;
79}
80#else
81#define pcm3008_soc_suspend NULL
82#define pcm3008_soc_resume NULL
83#endif
84
85static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
86 .suspend = pcm3008_soc_suspend,
87 .resume = pcm3008_soc_resume,
88};
89
90static int pcm3008_codec_probe(struct platform_device *pdev)
91{
92 struct pcm3008_setup_data *setup = pdev->dev.platform_data;
93 int ret;
64 94
65 /* DEM1 DEM0 DE-EMPHASIS_MODE 95 /* DEM1 DEM0 DE-EMPHASIS_MODE
66 * Low Low De-emphasis 44.1 kHz ON 96 * Low Low De-emphasis 44.1 kHz ON
@@ -97,63 +127,22 @@ static int pcm3008_soc_probe(struct snd_soc_codec *codec)
97 if (ret != 0) 127 if (ret != 0)
98 goto gpio_err; 128 goto gpio_err;
99 129
100 return ret; 130 return snd_soc_register_codec(&pdev->dev,
131 &soc_codec_dev_pcm3008, &pcm3008_dai, 1);
101 132
102gpio_err: 133gpio_err:
103 pcm3008_gpio_free(setup); 134 pcm3008_gpio_free(setup);
104
105 return ret; 135 return ret;
106} 136}
107 137
108static int pcm3008_soc_remove(struct snd_soc_codec *codec) 138static int pcm3008_codec_remove(struct platform_device *pdev)
109{
110 struct pcm3008_setup_data *setup = codec->dev->platform_data;
111
112 pcm3008_gpio_free(setup);
113 return 0;
114}
115
116#ifdef CONFIG_PM
117static int pcm3008_soc_suspend(struct snd_soc_codec *codec)
118{
119 struct pcm3008_setup_data *setup = codec->dev->platform_data;
120
121 gpio_set_value(setup->pdad_pin, 0);
122 gpio_set_value(setup->pdda_pin, 0);
123
124 return 0;
125}
126
127static int pcm3008_soc_resume(struct snd_soc_codec *codec)
128{ 139{
129 struct pcm3008_setup_data *setup = codec->dev->platform_data; 140 struct pcm3008_setup_data *setup = pdev->dev.platform_data;
130 141
131 gpio_set_value(setup->pdad_pin, 1); 142 snd_soc_unregister_codec(&pdev->dev);
132 gpio_set_value(setup->pdda_pin, 1);
133
134 return 0;
135}
136#else
137#define pcm3008_soc_suspend NULL
138#define pcm3008_soc_resume NULL
139#endif
140
141static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = {
142 .probe = pcm3008_soc_probe,
143 .remove = pcm3008_soc_remove,
144 .suspend = pcm3008_soc_suspend,
145 .resume = pcm3008_soc_resume,
146};
147 143
148static int pcm3008_codec_probe(struct platform_device *pdev) 144 pcm3008_gpio_free(setup);
149{
150 return snd_soc_register_codec(&pdev->dev,
151 &soc_codec_dev_pcm3008, &pcm3008_dai, 1);
152}
153 145
154static int pcm3008_codec_remove(struct platform_device *pdev)
155{
156 snd_soc_unregister_codec(&pdev->dev);
157 return 0; 146 return 0;
158} 147}
159 148