diff options
author | Mark Brown <broonie@linaro.org> | 2013-07-10 11:48:24 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-07-15 06:11:03 -0400 |
commit | d7f184958e5292280c1048df951932bbfcd95f60 (patch) | |
tree | af8099eb75a0e52a1e894db29007768e3ee0ccbd /sound/soc/codecs/pcm3008.c | |
parent | b641edfbf253a67a87698df275e3a35a7deac5d4 (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.c | 87 |
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 | ||
60 | static int pcm3008_soc_probe(struct snd_soc_codec *codec) | 60 | #ifdef CONFIG_PM |
61 | static 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 | |||
71 | static 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 | |||
85 | static struct snd_soc_codec_driver soc_codec_dev_pcm3008 = { | ||
86 | .suspend = pcm3008_soc_suspend, | ||
87 | .resume = pcm3008_soc_resume, | ||
88 | }; | ||
89 | |||
90 | static 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 | ||
102 | gpio_err: | 133 | gpio_err: |
103 | pcm3008_gpio_free(setup); | 134 | pcm3008_gpio_free(setup); |
104 | |||
105 | return ret; | 135 | return ret; |
106 | } | 136 | } |
107 | 137 | ||
108 | static int pcm3008_soc_remove(struct snd_soc_codec *codec) | 138 | static 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 | ||
117 | static 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 | |||
127 | static 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 | |||
141 | static 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 | ||
148 | static 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 | ||
154 | static 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 | ||