diff options
| author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2014-06-06 10:59:04 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-17 15:21:40 -0400 |
| commit | 1153be56a10576abc3dd2a89aee59debb4dcc2b6 (patch) | |
| tree | 254b47c58a702fe8e775d79e9c047612d8ad45e4 | |
| parent | 186612342500b0af8498d7c8bc6b3ac32ac7a48e (diff) | |
[media] v4l: omap4iss: Use the devm_* managed allocators
This simplifies remove and error code paths.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
| -rw-r--r-- | drivers/staging/media/omap4iss/iss.c | 84 |
1 files changed, 8 insertions, 76 deletions
diff --git a/drivers/staging/media/omap4iss/iss.c b/drivers/staging/media/omap4iss/iss.c index 4a9e444cd622..d548371db65a 100644 --- a/drivers/staging/media/omap4iss/iss.c +++ b/drivers/staging/media/omap4iss/iss.c | |||
| @@ -1003,32 +1003,17 @@ static void iss_disable_clocks(struct iss_device *iss) | |||
| 1003 | clk_disable(iss->iss_fck); | 1003 | clk_disable(iss->iss_fck); |
| 1004 | } | 1004 | } |
| 1005 | 1005 | ||
| 1006 | static void iss_put_clocks(struct iss_device *iss) | ||
| 1007 | { | ||
| 1008 | if (iss->iss_fck) { | ||
| 1009 | clk_put(iss->iss_fck); | ||
| 1010 | iss->iss_fck = NULL; | ||
| 1011 | } | ||
| 1012 | |||
| 1013 | if (iss->iss_ctrlclk) { | ||
| 1014 | clk_put(iss->iss_ctrlclk); | ||
| 1015 | iss->iss_ctrlclk = NULL; | ||
| 1016 | } | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | static int iss_get_clocks(struct iss_device *iss) | 1006 | static int iss_get_clocks(struct iss_device *iss) |
| 1020 | { | 1007 | { |
| 1021 | iss->iss_fck = clk_get(iss->dev, "iss_fck"); | 1008 | iss->iss_fck = devm_clk_get(iss->dev, "iss_fck"); |
| 1022 | if (IS_ERR(iss->iss_fck)) { | 1009 | if (IS_ERR(iss->iss_fck)) { |
| 1023 | dev_err(iss->dev, "Unable to get iss_fck clock info\n"); | 1010 | dev_err(iss->dev, "Unable to get iss_fck clock info\n"); |
| 1024 | iss_put_clocks(iss); | ||
| 1025 | return PTR_ERR(iss->iss_fck); | 1011 | return PTR_ERR(iss->iss_fck); |
| 1026 | } | 1012 | } |
| 1027 | 1013 | ||
| 1028 | iss->iss_ctrlclk = clk_get(iss->dev, "iss_ctrlclk"); | 1014 | iss->iss_ctrlclk = devm_clk_get(iss->dev, "iss_ctrlclk"); |
| 1029 | if (IS_ERR(iss->iss_ctrlclk)) { | 1015 | if (IS_ERR(iss->iss_ctrlclk)) { |
| 1030 | dev_err(iss->dev, "Unable to get iss_ctrlclk clock info\n"); | 1016 | dev_err(iss->dev, "Unable to get iss_ctrlclk clock info\n"); |
| 1031 | iss_put_clocks(iss); | ||
| 1032 | return PTR_ERR(iss->iss_ctrlclk); | 1017 | return PTR_ERR(iss->iss_ctrlclk); |
| 1033 | } | 1018 | } |
| 1034 | 1019 | ||
| @@ -1104,29 +1089,11 @@ static int iss_map_mem_resource(struct platform_device *pdev, | |||
| 1104 | { | 1089 | { |
| 1105 | struct resource *mem; | 1090 | struct resource *mem; |
| 1106 | 1091 | ||
| 1107 | /* request the mem region for the camera registers */ | ||
| 1108 | |||
| 1109 | mem = platform_get_resource(pdev, IORESOURCE_MEM, res); | 1092 | mem = platform_get_resource(pdev, IORESOURCE_MEM, res); |
| 1110 | if (!mem) { | ||
| 1111 | dev_err(iss->dev, "no mem resource?\n"); | ||
| 1112 | return -ENODEV; | ||
| 1113 | } | ||
| 1114 | |||
| 1115 | if (!request_mem_region(mem->start, resource_size(mem), pdev->name)) { | ||
| 1116 | dev_err(iss->dev, | ||
| 1117 | "cannot reserve camera register I/O region\n"); | ||
| 1118 | return -ENODEV; | ||
| 1119 | } | ||
| 1120 | iss->res[res] = mem; | ||
| 1121 | 1093 | ||
| 1122 | /* map the region */ | 1094 | iss->regs[res] = devm_ioremap_resource(iss->dev, mem); |
| 1123 | iss->regs[res] = ioremap_nocache(mem->start, resource_size(mem)); | ||
| 1124 | if (!iss->regs[res]) { | ||
| 1125 | dev_err(iss->dev, "cannot map camera register I/O region\n"); | ||
| 1126 | return -ENODEV; | ||
| 1127 | } | ||
| 1128 | 1095 | ||
| 1129 | return 0; | 1096 | return PTR_ERR_OR_ZERO(iss->regs[res]); |
| 1130 | } | 1097 | } |
| 1131 | 1098 | ||
| 1132 | static void iss_unregister_entities(struct iss_device *iss) | 1099 | static void iss_unregister_entities(struct iss_device *iss) |
| @@ -1389,7 +1356,7 @@ static int iss_probe(struct platform_device *pdev) | |||
| 1389 | if (pdata == NULL) | 1356 | if (pdata == NULL) |
| 1390 | return -EINVAL; | 1357 | return -EINVAL; |
| 1391 | 1358 | ||
| 1392 | iss = kzalloc(sizeof(*iss), GFP_KERNEL); | 1359 | iss = devm_kzalloc(&pdev->dev, sizeof(*iss), GFP_KERNEL); |
| 1393 | if (!iss) { | 1360 | if (!iss) { |
| 1394 | dev_err(&pdev->dev, "Could not allocate memory\n"); | 1361 | dev_err(&pdev->dev, "Could not allocate memory\n"); |
| 1395 | return -ENOMEM; | 1362 | return -ENOMEM; |
| @@ -1456,7 +1423,8 @@ static int iss_probe(struct platform_device *pdev) | |||
| 1456 | goto error_iss; | 1423 | goto error_iss; |
| 1457 | } | 1424 | } |
| 1458 | 1425 | ||
| 1459 | if (request_irq(iss->irq_num, iss_isr, IRQF_SHARED, "OMAP4 ISS", iss)) { | 1426 | if (devm_request_irq(iss->dev, iss->irq_num, iss_isr, IRQF_SHARED, |
| 1427 | "OMAP4 ISS", iss)) { | ||
| 1460 | dev_err(iss->dev, "Unable to request IRQ\n"); | 1428 | dev_err(iss->dev, "Unable to request IRQ\n"); |
| 1461 | ret = -EINVAL; | 1429 | ret = -EINVAL; |
| 1462 | goto error_iss; | 1430 | goto error_iss; |
| @@ -1465,7 +1433,7 @@ static int iss_probe(struct platform_device *pdev) | |||
| 1465 | /* Entities */ | 1433 | /* Entities */ |
| 1466 | ret = iss_initialize_modules(iss); | 1434 | ret = iss_initialize_modules(iss); |
| 1467 | if (ret < 0) | 1435 | if (ret < 0) |
| 1468 | goto error_irq; | 1436 | goto error_iss; |
| 1469 | 1437 | ||
| 1470 | ret = iss_register_entities(iss); | 1438 | ret = iss_register_entities(iss); |
| 1471 | if (ret < 0) | 1439 | if (ret < 0) |
| @@ -1477,29 +1445,12 @@ static int iss_probe(struct platform_device *pdev) | |||
| 1477 | 1445 | ||
| 1478 | error_modules: | 1446 | error_modules: |
| 1479 | iss_cleanup_modules(iss); | 1447 | iss_cleanup_modules(iss); |
| 1480 | error_irq: | ||
| 1481 | free_irq(iss->irq_num, iss); | ||
| 1482 | error_iss: | 1448 | error_iss: |
| 1483 | omap4iss_put(iss); | 1449 | omap4iss_put(iss); |
| 1484 | error: | 1450 | error: |
| 1485 | iss_put_clocks(iss); | ||
| 1486 | |||
| 1487 | for (i = 0; i < OMAP4_ISS_MEM_LAST; i++) { | ||
| 1488 | if (iss->regs[i]) { | ||
| 1489 | iounmap(iss->regs[i]); | ||
| 1490 | iss->regs[i] = NULL; | ||
| 1491 | } | ||
| 1492 | |||
| 1493 | if (iss->res[i]) { | ||
| 1494 | release_mem_region(iss->res[i]->start, | ||
| 1495 | resource_size(iss->res[i])); | ||
| 1496 | iss->res[i] = NULL; | ||
| 1497 | } | ||
| 1498 | } | ||
| 1499 | platform_set_drvdata(pdev, NULL); | 1451 | platform_set_drvdata(pdev, NULL); |
| 1500 | 1452 | ||
| 1501 | mutex_destroy(&iss->iss_mutex); | 1453 | mutex_destroy(&iss->iss_mutex); |
| 1502 | kfree(iss); | ||
| 1503 | 1454 | ||
| 1504 | return ret; | 1455 | return ret; |
| 1505 | } | 1456 | } |
| @@ -1507,29 +1458,10 @@ error: | |||
| 1507 | static int iss_remove(struct platform_device *pdev) | 1458 | static int iss_remove(struct platform_device *pdev) |
| 1508 | { | 1459 | { |
| 1509 | struct iss_device *iss = platform_get_drvdata(pdev); | 1460 | struct iss_device *iss = platform_get_drvdata(pdev); |
| 1510 | unsigned int i; | ||
| 1511 | 1461 | ||
| 1512 | iss_unregister_entities(iss); | 1462 | iss_unregister_entities(iss); |
| 1513 | iss_cleanup_modules(iss); | 1463 | iss_cleanup_modules(iss); |
| 1514 | 1464 | ||
| 1515 | free_irq(iss->irq_num, iss); | ||
| 1516 | iss_put_clocks(iss); | ||
| 1517 | |||
| 1518 | for (i = 0; i < OMAP4_ISS_MEM_LAST; i++) { | ||
| 1519 | if (iss->regs[i]) { | ||
| 1520 | iounmap(iss->regs[i]); | ||
| 1521 | iss->regs[i] = NULL; | ||
| 1522 | } | ||
| 1523 | |||
| 1524 | if (iss->res[i]) { | ||
| 1525 | release_mem_region(iss->res[i]->start, | ||
| 1526 | resource_size(iss->res[i])); | ||
| 1527 | iss->res[i] = NULL; | ||
| 1528 | } | ||
| 1529 | } | ||
| 1530 | |||
| 1531 | kfree(iss); | ||
| 1532 | |||
| 1533 | return 0; | 1465 | return 0; |
| 1534 | } | 1466 | } |
| 1535 | 1467 | ||
