aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2014-06-06 10:59:04 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-17 15:21:40 -0400
commit1153be56a10576abc3dd2a89aee59debb4dcc2b6 (patch)
tree254b47c58a702fe8e775d79e9c047612d8ad45e4
parent186612342500b0af8498d7c8bc6b3ac32ac7a48e (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.c84
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
1006static 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
1019static int iss_get_clocks(struct iss_device *iss) 1006static 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
1132static void iss_unregister_entities(struct iss_device *iss) 1099static 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
1478error_modules: 1446error_modules:
1479 iss_cleanup_modules(iss); 1447 iss_cleanup_modules(iss);
1480error_irq:
1481 free_irq(iss->irq_num, iss);
1482error_iss: 1448error_iss:
1483 omap4iss_put(iss); 1449 omap4iss_put(iss);
1484error: 1450error:
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:
1507static int iss_remove(struct platform_device *pdev) 1458static 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