diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2014-10-30 16:01:09 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-10-31 13:34:00 -0400 |
commit | 5efe89d9525f24f607079307d2d9510e30ba8590 (patch) | |
tree | 1d83e09474a4c44a37adf54c9fcae91609ee739f /sound | |
parent | c1359ca303ee5125827c0d2a65f0c86d491dc993 (diff) |
ASoC: wm9713: Move driver state struct allocation to driver probe
Resources for the device should be allocated in the device driver probe
callback, rather than in the ASoC CODEC probe callback.
E.g. one advantage is that we can use device managed allocations.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/wm9713.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index ba8c276b9dcf..27047839172d 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c | |||
@@ -1191,17 +1191,11 @@ static int wm9713_soc_resume(struct snd_soc_codec *codec) | |||
1191 | 1191 | ||
1192 | static int wm9713_soc_probe(struct snd_soc_codec *codec) | 1192 | static int wm9713_soc_probe(struct snd_soc_codec *codec) |
1193 | { | 1193 | { |
1194 | struct wm9713_priv *wm9713; | ||
1195 | int ret = 0, reg; | 1194 | int ret = 0, reg; |
1196 | 1195 | ||
1197 | wm9713 = kzalloc(sizeof(struct wm9713_priv), GFP_KERNEL); | ||
1198 | if (wm9713 == NULL) | ||
1199 | return -ENOMEM; | ||
1200 | snd_soc_codec_set_drvdata(codec, wm9713); | ||
1201 | |||
1202 | ret = snd_soc_new_ac97_codec(codec, soc_ac97_ops, 0); | 1196 | ret = snd_soc_new_ac97_codec(codec, soc_ac97_ops, 0); |
1203 | if (ret < 0) | 1197 | if (ret < 0) |
1204 | goto codec_err; | 1198 | return ret; |
1205 | 1199 | ||
1206 | /* do a cold reset for the controller and then try | 1200 | /* do a cold reset for the controller and then try |
1207 | * a warm reset followed by an optional cold reset for codec */ | 1201 | * a warm reset followed by an optional cold reset for codec */ |
@@ -1220,16 +1214,12 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
1220 | 1214 | ||
1221 | reset_err: | 1215 | reset_err: |
1222 | snd_soc_free_ac97_codec(codec); | 1216 | snd_soc_free_ac97_codec(codec); |
1223 | codec_err: | ||
1224 | kfree(wm9713); | ||
1225 | return ret; | 1217 | return ret; |
1226 | } | 1218 | } |
1227 | 1219 | ||
1228 | static int wm9713_soc_remove(struct snd_soc_codec *codec) | 1220 | static int wm9713_soc_remove(struct snd_soc_codec *codec) |
1229 | { | 1221 | { |
1230 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); | ||
1231 | snd_soc_free_ac97_codec(codec); | 1222 | snd_soc_free_ac97_codec(codec); |
1232 | kfree(wm9713); | ||
1233 | return 0; | 1223 | return 0; |
1234 | } | 1224 | } |
1235 | 1225 | ||
@@ -1256,6 +1246,14 @@ static struct snd_soc_codec_driver soc_codec_dev_wm9713 = { | |||
1256 | 1246 | ||
1257 | static int wm9713_probe(struct platform_device *pdev) | 1247 | static int wm9713_probe(struct platform_device *pdev) |
1258 | { | 1248 | { |
1249 | struct wm9713_priv *wm9713; | ||
1250 | |||
1251 | wm9713 = devm_kzalloc(&pdev->dev, sizeof(*wm9713), GFP_KERNEL); | ||
1252 | if (wm9713 == NULL) | ||
1253 | return -ENOMEM; | ||
1254 | |||
1255 | platform_set_drvdata(pdev, wm9713); | ||
1256 | |||
1259 | return snd_soc_register_codec(&pdev->dev, | 1257 | return snd_soc_register_codec(&pdev->dev, |
1260 | &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai)); | 1258 | &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai)); |
1261 | } | 1259 | } |