diff options
| author | Laxman Dewangan <ldewangan@nvidia.com> | 2012-06-13 06:12:39 -0400 |
|---|---|---|
| committer | Wolfram Sang <w.sang@pengutronix.de> | 2012-07-08 06:49:16 -0400 |
| commit | 9cbb6b2b92d0fdade0fe00cc00e3658b44c86676 (patch) | |
| tree | acb1cc6cf7f5a494c7c560f5eab04021374037a7 | |
| parent | c8f5af2f507d7f97a11065b98ec9f6c22aad8af0 (diff) | |
i2c: tegra: make all resource allocation through devm_*
Use the devm_* for the memory region allocation, interrupt request,
clock handler request.
By doing this, it does not require to explicitly free it and hence
saving some code.
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
| -rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 62 |
1 files changed, 17 insertions, 45 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index c4593a24331c..9f4e22cdf82c 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
| @@ -598,7 +598,6 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev) | |||
| 598 | struct tegra_i2c_dev *i2c_dev; | 598 | struct tegra_i2c_dev *i2c_dev; |
| 599 | struct tegra_i2c_platform_data *pdata = pdev->dev.platform_data; | 599 | struct tegra_i2c_platform_data *pdata = pdev->dev.platform_data; |
| 600 | struct resource *res; | 600 | struct resource *res; |
| 601 | struct resource *iomem; | ||
| 602 | struct clk *clk; | 601 | struct clk *clk; |
| 603 | struct clk *i2c_clk; | 602 | struct clk *i2c_clk; |
| 604 | const unsigned int *prop; | 603 | const unsigned int *prop; |
| @@ -611,50 +610,41 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev) | |||
| 611 | dev_err(&pdev->dev, "no mem resource\n"); | 610 | dev_err(&pdev->dev, "no mem resource\n"); |
| 612 | return -EINVAL; | 611 | return -EINVAL; |
| 613 | } | 612 | } |
| 614 | iomem = request_mem_region(res->start, resource_size(res), pdev->name); | ||
| 615 | if (!iomem) { | ||
| 616 | dev_err(&pdev->dev, "I2C region already claimed\n"); | ||
| 617 | return -EBUSY; | ||
| 618 | } | ||
| 619 | 613 | ||
| 620 | base = ioremap(iomem->start, resource_size(iomem)); | 614 | base = devm_request_and_ioremap(&pdev->dev, res); |
| 621 | if (!base) { | 615 | if (!base) { |
| 622 | dev_err(&pdev->dev, "Cannot ioremap I2C region\n"); | 616 | dev_err(&pdev->dev, "Cannot request/ioremap I2C registers\n"); |
| 623 | return -ENOMEM; | 617 | return -EADDRNOTAVAIL; |
| 624 | } | 618 | } |
| 625 | 619 | ||
| 626 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 620 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
| 627 | if (!res) { | 621 | if (!res) { |
| 628 | dev_err(&pdev->dev, "no irq resource\n"); | 622 | dev_err(&pdev->dev, "no irq resource\n"); |
| 629 | ret = -EINVAL; | 623 | return -EINVAL; |
| 630 | goto err_iounmap; | ||
| 631 | } | 624 | } |
| 632 | irq = res->start; | 625 | irq = res->start; |
| 633 | 626 | ||
| 634 | clk = clk_get(&pdev->dev, NULL); | 627 | clk = devm_clk_get(&pdev->dev, NULL); |
| 635 | if (IS_ERR(clk)) { | 628 | if (IS_ERR(clk)) { |
| 636 | dev_err(&pdev->dev, "missing controller clock"); | 629 | dev_err(&pdev->dev, "missing controller clock"); |
| 637 | ret = PTR_ERR(clk); | 630 | return PTR_ERR(clk); |
| 638 | goto err_release_region; | ||
| 639 | } | 631 | } |
| 640 | 632 | ||
| 641 | i2c_clk = clk_get(&pdev->dev, "i2c"); | 633 | i2c_clk = devm_clk_get(&pdev->dev, "i2c"); |
| 642 | if (IS_ERR(i2c_clk)) { | 634 | if (IS_ERR(i2c_clk)) { |
| 643 | dev_err(&pdev->dev, "missing bus clock"); | 635 | dev_err(&pdev->dev, "missing bus clock"); |
| 644 | ret = PTR_ERR(i2c_clk); | 636 | return PTR_ERR(i2c_clk); |
| 645 | goto err_clk_put; | ||
| 646 | } | 637 | } |
| 647 | 638 | ||
| 648 | i2c_dev = kzalloc(sizeof(struct tegra_i2c_dev), GFP_KERNEL); | 639 | i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); |
| 649 | if (!i2c_dev) { | 640 | if (!i2c_dev) { |
| 650 | ret = -ENOMEM; | 641 | dev_err(&pdev->dev, "Could not allocate struct tegra_i2c_dev"); |
| 651 | goto err_i2c_clk_put; | 642 | return -ENOMEM; |
| 652 | } | 643 | } |
| 653 | 644 | ||
| 654 | i2c_dev->base = base; | 645 | i2c_dev->base = base; |
| 655 | i2c_dev->clk = clk; | 646 | i2c_dev->clk = clk; |
| 656 | i2c_dev->i2c_clk = i2c_clk; | 647 | i2c_dev->i2c_clk = i2c_clk; |
| 657 | i2c_dev->iomem = iomem; | ||
| 658 | i2c_dev->adapter.algo = &tegra_i2c_algo; | 648 | i2c_dev->adapter.algo = &tegra_i2c_algo; |
| 659 | i2c_dev->irq = irq; | 649 | i2c_dev->irq = irq; |
| 660 | i2c_dev->cont_id = pdev->id; | 650 | i2c_dev->cont_id = pdev->id; |
| @@ -683,13 +673,14 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev) | |||
| 683 | ret = tegra_i2c_init(i2c_dev); | 673 | ret = tegra_i2c_init(i2c_dev); |
| 684 | if (ret) { | 674 | if (ret) { |
| 685 | dev_err(&pdev->dev, "Failed to initialize i2c controller"); | 675 | dev_err(&pdev->dev, "Failed to initialize i2c controller"); |
| 686 | goto err_free; | 676 | return ret; |
| 687 | } | 677 | } |
| 688 | 678 | ||
| 689 | ret = request_irq(i2c_dev->irq, tegra_i2c_isr, 0, pdev->name, i2c_dev); | 679 | ret = devm_request_irq(&pdev->dev, i2c_dev->irq, |
| 680 | tegra_i2c_isr, 0, pdev->name, i2c_dev); | ||
| 690 | if (ret) { | 681 | if (ret) { |
| 691 | dev_err(&pdev->dev, "Failed to request irq %i\n", i2c_dev->irq); | 682 | dev_err(&pdev->dev, "Failed to request irq %i\n", i2c_dev->irq); |
| 692 | goto err_free; | 683 | return ret; |
| 693 | } | 684 | } |
| 694 | 685 | ||
| 695 | clk_enable(i2c_dev->i2c_clk); | 686 | clk_enable(i2c_dev->i2c_clk); |
| @@ -707,38 +698,19 @@ static int __devinit tegra_i2c_probe(struct platform_device *pdev) | |||
| 707 | ret = i2c_add_numbered_adapter(&i2c_dev->adapter); | 698 | ret = i2c_add_numbered_adapter(&i2c_dev->adapter); |
| 708 | if (ret) { | 699 | if (ret) { |
| 709 | dev_err(&pdev->dev, "Failed to add I2C adapter\n"); | 700 | dev_err(&pdev->dev, "Failed to add I2C adapter\n"); |
| 710 | goto err_free_irq; | 701 | clk_disable(i2c_dev->i2c_clk); |
| 702 | return ret; | ||
| 711 | } | 703 | } |
| 712 | 704 | ||
| 713 | of_i2c_register_devices(&i2c_dev->adapter); | 705 | of_i2c_register_devices(&i2c_dev->adapter); |
| 714 | 706 | ||
| 715 | return 0; | 707 | return 0; |
| 716 | err_free_irq: | ||
| 717 | free_irq(i2c_dev->irq, i2c_dev); | ||
| 718 | err_free: | ||
| 719 | kfree(i2c_dev); | ||
| 720 | err_i2c_clk_put: | ||
| 721 | clk_put(i2c_clk); | ||
| 722 | err_clk_put: | ||
| 723 | clk_put(clk); | ||
| 724 | err_release_region: | ||
| 725 | release_mem_region(iomem->start, resource_size(iomem)); | ||
| 726 | err_iounmap: | ||
| 727 | iounmap(base); | ||
| 728 | return ret; | ||
| 729 | } | 708 | } |
| 730 | 709 | ||
| 731 | static int __devexit tegra_i2c_remove(struct platform_device *pdev) | 710 | static int __devexit tegra_i2c_remove(struct platform_device *pdev) |
| 732 | { | 711 | { |
| 733 | struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev); | 712 | struct tegra_i2c_dev *i2c_dev = platform_get_drvdata(pdev); |
| 734 | i2c_del_adapter(&i2c_dev->adapter); | 713 | i2c_del_adapter(&i2c_dev->adapter); |
| 735 | free_irq(i2c_dev->irq, i2c_dev); | ||
| 736 | clk_put(i2c_dev->i2c_clk); | ||
| 737 | clk_put(i2c_dev->clk); | ||
| 738 | release_mem_region(i2c_dev->iomem->start, | ||
| 739 | resource_size(i2c_dev->iomem)); | ||
| 740 | iounmap(i2c_dev->base); | ||
| 741 | kfree(i2c_dev); | ||
| 742 | return 0; | 714 | return 0; |
| 743 | } | 715 | } |
| 744 | 716 | ||
