diff options
author | Stephen Warren <swarren@nvidia.com> | 2012-04-06 13:14:04 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-04-06 13:22:06 -0400 |
commit | 17933db2e4758b0cefdf23124087b488bce24b82 (patch) | |
tree | cb9d7ffe51117b9181ec1fad2b6c08ab0b00d1eb /sound/soc/tegra | |
parent | 7613c508dfd7880cb7e17ad5eb64b9dfb0b80292 (diff) |
ASoC: tegra: use devm_ APIs in SPDIF driver
The devm_ APIs remove the need to manually clean up allocations,
thus removing some code.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/tegra')
-rw-r--r-- | sound/soc/tegra/tegra20_spdif.c | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/sound/soc/tegra/tegra20_spdif.c b/sound/soc/tegra/tegra20_spdif.c index 00a2d33352f4..ef5d49ed5658 100644 --- a/sound/soc/tegra/tegra20_spdif.c +++ b/sound/soc/tegra/tegra20_spdif.c | |||
@@ -245,11 +245,12 @@ static __devinit int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
245 | struct resource *mem, *memregion, *dmareq; | 245 | struct resource *mem, *memregion, *dmareq; |
246 | int ret; | 246 | int ret; |
247 | 247 | ||
248 | spdif = kzalloc(sizeof(struct tegra20_spdif), GFP_KERNEL); | 248 | spdif = devm_kzalloc(&pdev->dev, sizeof(struct tegra20_spdif), |
249 | GFP_KERNEL); | ||
249 | if (!spdif) { | 250 | if (!spdif) { |
250 | dev_err(&pdev->dev, "Can't allocate tegra20_spdif\n"); | 251 | dev_err(&pdev->dev, "Can't allocate tegra20_spdif\n"); |
251 | ret = -ENOMEM; | 252 | ret = -ENOMEM; |
252 | goto exit; | 253 | goto err; |
253 | } | 254 | } |
254 | dev_set_drvdata(&pdev->dev, spdif); | 255 | dev_set_drvdata(&pdev->dev, spdif); |
255 | 256 | ||
@@ -257,7 +258,7 @@ static __devinit int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
257 | if (IS_ERR(spdif->clk_spdif_out)) { | 258 | if (IS_ERR(spdif->clk_spdif_out)) { |
258 | pr_err("Can't retrieve spdif clock\n"); | 259 | pr_err("Can't retrieve spdif clock\n"); |
259 | ret = PTR_ERR(spdif->clk_spdif_out); | 260 | ret = PTR_ERR(spdif->clk_spdif_out); |
260 | goto err_free; | 261 | goto err; |
261 | } | 262 | } |
262 | 263 | ||
263 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 264 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
@@ -274,19 +275,19 @@ static __devinit int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
274 | goto err_clk_put; | 275 | goto err_clk_put; |
275 | } | 276 | } |
276 | 277 | ||
277 | memregion = request_mem_region(mem->start, resource_size(mem), | 278 | memregion = devm_request_mem_region(&pdev->dev, mem->start, |
278 | DRV_NAME); | 279 | resource_size(mem), DRV_NAME); |
279 | if (!memregion) { | 280 | if (!memregion) { |
280 | dev_err(&pdev->dev, "Memory region already claimed\n"); | 281 | dev_err(&pdev->dev, "Memory region already claimed\n"); |
281 | ret = -EBUSY; | 282 | ret = -EBUSY; |
282 | goto err_clk_put; | 283 | goto err_clk_put; |
283 | } | 284 | } |
284 | 285 | ||
285 | spdif->regs = ioremap(mem->start, resource_size(mem)); | 286 | spdif->regs = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); |
286 | if (!spdif->regs) { | 287 | if (!spdif->regs) { |
287 | dev_err(&pdev->dev, "ioremap failed\n"); | 288 | dev_err(&pdev->dev, "ioremap failed\n"); |
288 | ret = -ENOMEM; | 289 | ret = -ENOMEM; |
289 | goto err_release; | 290 | goto err_clk_put; |
290 | } | 291 | } |
291 | 292 | ||
292 | spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT; | 293 | spdif->playback_dma_data.addr = mem->start + TEGRA20_SPDIF_DATA_OUT; |
@@ -298,7 +299,7 @@ static __devinit int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
298 | if (ret) { | 299 | if (ret) { |
299 | dev_err(&pdev->dev, "Could not register DAI: %d\n", ret); | 300 | dev_err(&pdev->dev, "Could not register DAI: %d\n", ret); |
300 | ret = -ENOMEM; | 301 | ret = -ENOMEM; |
301 | goto err_unmap; | 302 | goto err_clk_put; |
302 | } | 303 | } |
303 | 304 | ||
304 | ret = tegra_pcm_platform_register(&pdev->dev); | 305 | ret = tegra_pcm_platform_register(&pdev->dev); |
@@ -313,37 +314,23 @@ static __devinit int tegra20_spdif_platform_probe(struct platform_device *pdev) | |||
313 | 314 | ||
314 | err_unregister_dai: | 315 | err_unregister_dai: |
315 | snd_soc_unregister_dai(&pdev->dev); | 316 | snd_soc_unregister_dai(&pdev->dev); |
316 | err_unmap: | ||
317 | iounmap(spdif->regs); | ||
318 | err_release: | ||
319 | release_mem_region(mem->start, resource_size(mem)); | ||
320 | err_clk_put: | 317 | err_clk_put: |
321 | clk_put(spdif->clk_spdif_out); | 318 | clk_put(spdif->clk_spdif_out); |
322 | err_free: | 319 | err: |
323 | kfree(spdif); | ||
324 | exit: | ||
325 | return ret; | 320 | return ret; |
326 | } | 321 | } |
327 | 322 | ||
328 | static int __devexit tegra20_spdif_platform_remove(struct platform_device *pdev) | 323 | static int __devexit tegra20_spdif_platform_remove(struct platform_device *pdev) |
329 | { | 324 | { |
330 | struct tegra20_spdif *spdif = dev_get_drvdata(&pdev->dev); | 325 | struct tegra20_spdif *spdif = dev_get_drvdata(&pdev->dev); |
331 | struct resource *res; | ||
332 | 326 | ||
333 | tegra_pcm_platform_unregister(&pdev->dev); | 327 | tegra_pcm_platform_unregister(&pdev->dev); |
334 | snd_soc_unregister_dai(&pdev->dev); | 328 | snd_soc_unregister_dai(&pdev->dev); |
335 | 329 | ||
336 | tegra20_spdif_debug_remove(spdif); | 330 | tegra20_spdif_debug_remove(spdif); |
337 | 331 | ||
338 | iounmap(spdif->regs); | ||
339 | |||
340 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
341 | release_mem_region(res->start, resource_size(res)); | ||
342 | |||
343 | clk_put(spdif->clk_spdif_out); | 332 | clk_put(spdif->clk_spdif_out); |
344 | 333 | ||
345 | kfree(spdif); | ||
346 | |||
347 | return 0; | 334 | return 0; |
348 | } | 335 | } |
349 | 336 | ||