diff options
author | Cho KyongHo <pullip.cho@samsung.com> | 2014-05-12 02:14:54 -0400 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2014-05-13 13:12:54 -0400 |
commit | 46c16d1e4c11ffa0481b1dd6841e0bcabcf278e7 (patch) | |
tree | fb66666d1dbccfad38e4b402652db49de7d16a23 /drivers/iommu/exynos-iommu.c | |
parent | e5cf63c3025c2cb7e1db78658827f6ab2a7a039f (diff) |
iommu/exynos: Use managed device helper functions
This patch uses managed device helper functions in the probe().
Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
Signed-off-by: Shaik Ameer Basha <shaik.ameer@samsung.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/exynos-iommu.c')
-rw-r--r-- | drivers/iommu/exynos-iommu.c | 68 |
1 files changed, 25 insertions, 43 deletions
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index be7a7b9c2d59..c86e3745e98f 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c | |||
@@ -343,8 +343,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data) | |||
343 | 343 | ||
344 | __raw_writel(CTRL_DISABLE, data->sfrbase + REG_MMU_CTRL); | 344 | __raw_writel(CTRL_DISABLE, data->sfrbase + REG_MMU_CTRL); |
345 | 345 | ||
346 | if (!IS_ERR(data->clk)) | 346 | clk_disable(data->clk); |
347 | clk_disable(data->clk); | ||
348 | 347 | ||
349 | disabled = true; | 348 | disabled = true; |
350 | data->pgtable = 0; | 349 | data->pgtable = 0; |
@@ -387,8 +386,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data, | |||
387 | goto finish; | 386 | goto finish; |
388 | } | 387 | } |
389 | 388 | ||
390 | if (!IS_ERR(data->clk)) | 389 | clk_enable(data->clk); |
391 | clk_enable(data->clk); | ||
392 | 390 | ||
393 | data->pgtable = pgtable; | 391 | data->pgtable = pgtable; |
394 | 392 | ||
@@ -499,49 +497,43 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev) | |||
499 | 497 | ||
500 | static int exynos_sysmmu_probe(struct platform_device *pdev) | 498 | static int exynos_sysmmu_probe(struct platform_device *pdev) |
501 | { | 499 | { |
502 | int ret; | 500 | int irq, ret; |
503 | struct device *dev = &pdev->dev; | 501 | struct device *dev = &pdev->dev; |
504 | struct sysmmu_drvdata *data; | 502 | struct sysmmu_drvdata *data; |
505 | struct resource *res; | 503 | struct resource *res; |
506 | 504 | ||
507 | data = kzalloc(sizeof(*data), GFP_KERNEL); | 505 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
508 | if (!data) { | 506 | if (!data) |
509 | dev_dbg(dev, "Not enough memory\n"); | 507 | return -ENOMEM; |
510 | ret = -ENOMEM; | ||
511 | goto err_alloc; | ||
512 | } | ||
513 | 508 | ||
514 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 509 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
515 | if (!res) { | 510 | data->sfrbase = devm_ioremap_resource(dev, res); |
516 | dev_dbg(dev, "Unable to find IOMEM region\n"); | 511 | if (IS_ERR(data->sfrbase)) |
517 | ret = -ENOENT; | 512 | return PTR_ERR(data->sfrbase); |
518 | goto err_init; | ||
519 | } | ||
520 | 513 | ||
521 | data->sfrbase = ioremap(res->start, resource_size(res)); | 514 | irq = platform_get_irq(pdev, 0); |
522 | if (!data->sfrbase) { | 515 | if (irq <= 0) { |
523 | dev_dbg(dev, "Unable to map IOMEM @ PA:%#x\n", res->start); | ||
524 | ret = -ENOENT; | ||
525 | goto err_res; | ||
526 | } | ||
527 | |||
528 | ret = platform_get_irq(pdev, 0); | ||
529 | if (ret <= 0) { | ||
530 | dev_dbg(dev, "Unable to find IRQ resource\n"); | 516 | dev_dbg(dev, "Unable to find IRQ resource\n"); |
531 | goto err_irq; | 517 | return irq; |
532 | } | 518 | } |
533 | 519 | ||
534 | ret = request_irq(ret, exynos_sysmmu_irq, 0, | 520 | ret = devm_request_irq(dev, irq, exynos_sysmmu_irq, 0, |
535 | dev_name(dev), data); | 521 | dev_name(dev), data); |
536 | if (ret) { | 522 | if (ret) { |
537 | dev_dbg(dev, "Unabled to register interrupt handler\n"); | 523 | dev_err(dev, "Unabled to register handler of irq %d\n", irq); |
538 | goto err_irq; | 524 | return ret; |
539 | } | 525 | } |
540 | 526 | ||
541 | if (dev_get_platdata(dev)) { | 527 | data->clk = devm_clk_get(dev, "sysmmu"); |
542 | data->clk = clk_get(dev, "sysmmu"); | 528 | if (IS_ERR(data->clk)) { |
543 | if (IS_ERR(data->clk)) | 529 | dev_err(dev, "Failed to get clock!\n"); |
544 | dev_dbg(dev, "No clock descriptor registered\n"); | 530 | return PTR_ERR(data->clk); |
531 | } else { | ||
532 | ret = clk_prepare(data->clk); | ||
533 | if (ret) { | ||
534 | dev_err(dev, "Failed to prepare clk\n"); | ||
535 | return ret; | ||
536 | } | ||
545 | } | 537 | } |
546 | 538 | ||
547 | data->sysmmu = dev; | 539 | data->sysmmu = dev; |
@@ -554,17 +546,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) | |||
554 | 546 | ||
555 | pm_runtime_enable(dev); | 547 | pm_runtime_enable(dev); |
556 | 548 | ||
557 | dev_dbg(dev, "Initialized\n"); | ||
558 | return 0; | 549 | return 0; |
559 | err_irq: | ||
560 | free_irq(platform_get_irq(pdev, 0), data); | ||
561 | err_res: | ||
562 | iounmap(data->sfrbase); | ||
563 | err_init: | ||
564 | kfree(data); | ||
565 | err_alloc: | ||
566 | dev_err(dev, "Failed to initialize\n"); | ||
567 | return ret; | ||
568 | } | 550 | } |
569 | 551 | ||
570 | static struct platform_driver exynos_sysmmu_driver = { | 552 | static struct platform_driver exynos_sysmmu_driver = { |