Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: davinci: fix unwinding in probe

Unwiding from an error in davinci_mmcsd_probe was a mess. Some errors were
not handled and not all paths unwound correctly. Also using devm_ where
possible to simplify things.

Signed-off-by: David Lechner <david@lechnology.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

David Lechner and committed by
Ulf Hansson
62ac52b2 2edeb854

+40 -60
+40 -60
drivers/mmc/host/davinci_mmc.c
··· 1205 1205 struct mmc_davinci_host *host = NULL; 1206 1206 struct mmc_host *mmc = NULL; 1207 1207 struct resource *r, *mem = NULL; 1208 - int ret = 0, irq = 0; 1208 + int ret, irq; 1209 1209 size_t mem_size; 1210 1210 const struct platform_device_id *id_entry; 1211 1211 ··· 1215 1215 return -ENOENT; 1216 1216 } 1217 1217 1218 - ret = -ENODEV; 1219 1218 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1220 1219 irq = platform_get_irq(pdev, 0); 1221 1220 if (!r || irq == NO_IRQ) 1222 - goto out; 1221 + return -ENODEV; 1223 1222 1224 - ret = -EBUSY; 1225 1223 mem_size = resource_size(r); 1226 - mem = request_mem_region(r->start, mem_size, pdev->name); 1224 + mem = devm_request_mem_region(&pdev->dev, r->start, mem_size, 1225 + pdev->name); 1227 1226 if (!mem) 1228 - goto out; 1227 + return -EBUSY; 1229 1228 1230 - ret = -ENOMEM; 1231 1229 mmc = mmc_alloc_host(sizeof(struct mmc_davinci_host), &pdev->dev); 1232 1230 if (!mmc) 1233 - goto out; 1231 + return -ENOMEM; 1234 1232 1235 1233 host = mmc_priv(mmc); 1236 1234 host->mmc = mmc; /* Important */ 1237 1235 1238 1236 host->mem_res = mem; 1239 - host->base = ioremap(mem->start, mem_size); 1240 - if (!host->base) 1241 - goto out; 1237 + host->base = devm_ioremap(&pdev->dev, mem->start, mem_size); 1238 + if (!host->base) { 1239 + ret = -ENOMEM; 1240 + goto ioremap_fail; 1241 + } 1242 1242 1243 - ret = -ENXIO; 1244 - host->clk = clk_get(&pdev->dev, NULL); 1243 + host->clk = devm_clk_get(&pdev->dev, NULL); 1245 1244 if (IS_ERR(host->clk)) { 1246 1245 ret = PTR_ERR(host->clk); 1247 - goto out; 1246 + goto clk_get_fail; 1248 1247 } 1249 - clk_enable(host->clk); 1248 + ret = clk_enable(host->clk); 1249 + if (ret) 1250 + goto clk_enable_fail; 1251 + 1250 1252 host->mmc_input_clk = clk_get_rate(host->clk); 1251 1253 1252 1254 init_mmcsd_host(host); ··· 1266 1264 if (host->use_dma) { 1267 1265 ret = davinci_acquire_dma_channels(host); 1268 1266 if (ret == -EPROBE_DEFER) 1269 - goto out; 1267 + goto dma_probe_defer; 1270 1268 else if (ret) 1271 1269 host->use_dma = 0; 1272 1270 } ··· 1323 1321 1324 1322 ret = mmc_add_host(mmc); 1325 1323 if (ret < 0) 1326 - goto out; 1324 + goto mmc_add_host_fail; 1327 1325 1328 - ret = request_irq(irq, mmc_davinci_irq, 0, mmc_hostname(mmc), host); 1326 + ret = devm_request_irq(&pdev->dev, irq, mmc_davinci_irq, 0, 1327 + mmc_hostname(mmc), host); 1329 1328 if (ret) 1330 - goto out; 1329 + goto request_irq_fail; 1331 1330 1332 1331 if (host->sdio_irq >= 0) { 1333 - ret = request_irq(host->sdio_irq, mmc_davinci_sdio_irq, 0, 1334 - mmc_hostname(mmc), host); 1332 + ret = devm_request_irq(&pdev->dev, host->sdio_irq, 1333 + mmc_davinci_sdio_irq, 0, 1334 + mmc_hostname(mmc), host); 1335 1335 if (!ret) 1336 1336 mmc->caps |= MMC_CAP_SDIO_IRQ; 1337 1337 } ··· 1346 1342 1347 1343 return 0; 1348 1344 1349 - out: 1345 + request_irq_fail: 1346 + mmc_remove_host(mmc); 1347 + mmc_add_host_fail: 1350 1348 mmc_davinci_cpufreq_deregister(host); 1351 1349 cpu_freq_fail: 1352 - if (host) { 1353 - davinci_release_dma_channels(host); 1354 - 1355 - if (host->clk) { 1356 - clk_disable(host->clk); 1357 - clk_put(host->clk); 1358 - } 1359 - 1360 - if (host->base) 1361 - iounmap(host->base); 1362 - } 1363 - 1364 - if (mmc) 1365 - mmc_free_host(mmc); 1366 - 1367 - if (mem) 1368 - release_resource(mem); 1369 - 1370 - dev_dbg(&pdev->dev, "probe err %d\n", ret); 1350 + davinci_release_dma_channels(host); 1351 + dma_probe_defer: 1352 + clk_disable(host->clk); 1353 + clk_enable_fail: 1354 + clk_get_fail: 1355 + ioremap_fail: 1356 + mmc_free_host(mmc); 1371 1357 1372 1358 return ret; 1373 1359 } ··· 1366 1372 { 1367 1373 struct mmc_davinci_host *host = platform_get_drvdata(pdev); 1368 1374 1369 - if (host) { 1370 - mmc_davinci_cpufreq_deregister(host); 1371 - 1372 - mmc_remove_host(host->mmc); 1373 - free_irq(host->mmc_irq, host); 1374 - if (host->mmc->caps & MMC_CAP_SDIO_IRQ) 1375 - free_irq(host->sdio_irq, host); 1376 - 1377 - davinci_release_dma_channels(host); 1378 - 1379 - clk_disable(host->clk); 1380 - clk_put(host->clk); 1381 - 1382 - iounmap(host->base); 1383 - 1384 - release_resource(host->mem_res); 1385 - 1386 - mmc_free_host(host->mmc); 1387 - } 1375 + mmc_remove_host(host->mmc); 1376 + mmc_davinci_cpufreq_deregister(host); 1377 + davinci_release_dma_channels(host); 1378 + clk_disable(host->clk); 1379 + mmc_free_host(host->mmc); 1388 1380 1389 1381 return 0; 1390 1382 }