diff options
author | Sonic Zhang <sonic.zhang@analog.com> | 2014-06-03 01:02:06 -0400 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2014-06-03 04:28:19 -0400 |
commit | 0709dc9711ae6d0559818c31b533a441564dad9b (patch) | |
tree | abf964719f87c1574ff94d6d678b04152f49330d /drivers/i2c/busses | |
parent | eae45e5dd229d5c6f0aed9789a5d1e84f7ea6100 (diff) |
i2c: bfin: turn to Resource-managed API in probe function
No need to free managed resources any more.
Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/busses')
-rw-r--r-- | drivers/i2c/busses/i2c-bfin-twi.c | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c index e6d5162b6379..3e271e7558d3 100644 --- a/drivers/i2c/busses/i2c-bfin-twi.c +++ b/drivers/i2c/busses/i2c-bfin-twi.c | |||
@@ -620,35 +620,27 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
620 | int rc; | 620 | int rc; |
621 | unsigned int clkhilow; | 621 | unsigned int clkhilow; |
622 | 622 | ||
623 | iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL); | 623 | iface = devm_kzalloc(&pdev->dev, sizeof(struct bfin_twi_iface), |
624 | GFP_KERNEL); | ||
624 | if (!iface) { | 625 | if (!iface) { |
625 | dev_err(&pdev->dev, "Cannot allocate memory\n"); | 626 | dev_err(&pdev->dev, "Cannot allocate memory\n"); |
626 | rc = -ENOMEM; | 627 | return -ENOMEM; |
627 | goto out_error_nomem; | ||
628 | } | 628 | } |
629 | 629 | ||
630 | spin_lock_init(&(iface->lock)); | 630 | spin_lock_init(&(iface->lock)); |
631 | 631 | ||
632 | /* Find and map our resources */ | 632 | /* Find and map our resources */ |
633 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 633 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
634 | if (res == NULL) { | 634 | iface->regs_base = devm_ioremap_resource(&pdev->dev, res); |
635 | dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n"); | 635 | if (IS_ERR(iface->regs_base)) { |
636 | rc = -ENOENT; | ||
637 | goto out_error_get_res; | ||
638 | } | ||
639 | |||
640 | iface->regs_base = ioremap(res->start, resource_size(res)); | ||
641 | if (iface->regs_base == NULL) { | ||
642 | dev_err(&pdev->dev, "Cannot map IO\n"); | 636 | dev_err(&pdev->dev, "Cannot map IO\n"); |
643 | rc = -ENXIO; | 637 | return PTR_ERR(iface->regs_base); |
644 | goto out_error_ioremap; | ||
645 | } | 638 | } |
646 | 639 | ||
647 | iface->irq = platform_get_irq(pdev, 0); | 640 | iface->irq = platform_get_irq(pdev, 0); |
648 | if (iface->irq < 0) { | 641 | if (iface->irq < 0) { |
649 | dev_err(&pdev->dev, "No IRQ specified\n"); | 642 | dev_err(&pdev->dev, "No IRQ specified\n"); |
650 | rc = -ENOENT; | 643 | return -ENOENT; |
651 | goto out_error_no_irq; | ||
652 | } | 644 | } |
653 | 645 | ||
654 | p_adap = &iface->adap; | 646 | p_adap = &iface->adap; |
@@ -666,15 +658,15 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
666 | "i2c-bfin-twi"); | 658 | "i2c-bfin-twi"); |
667 | if (rc) { | 659 | if (rc) { |
668 | dev_err(&pdev->dev, "Can't setup pin mux!\n"); | 660 | dev_err(&pdev->dev, "Can't setup pin mux!\n"); |
669 | goto out_error_pin_mux; | 661 | return -EBUSY; |
670 | } | 662 | } |
671 | 663 | ||
672 | rc = request_irq(iface->irq, bfin_twi_interrupt_entry, | 664 | rc = devm_request_irq(&pdev->dev, iface->irq, bfin_twi_interrupt_entry, |
673 | 0, pdev->name, iface); | 665 | 0, pdev->name, iface); |
674 | if (rc) { | 666 | if (rc) { |
675 | dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq); | 667 | dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq); |
676 | rc = -ENODEV; | 668 | rc = -ENODEV; |
677 | goto out_error_req_irq; | 669 | goto out_error; |
678 | } | 670 | } |
679 | 671 | ||
680 | /* Set TWI internal clock as 10MHz */ | 672 | /* Set TWI internal clock as 10MHz */ |
@@ -695,7 +687,7 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
695 | rc = i2c_add_numbered_adapter(p_adap); | 687 | rc = i2c_add_numbered_adapter(p_adap); |
696 | if (rc < 0) { | 688 | if (rc < 0) { |
697 | dev_err(&pdev->dev, "Can't add i2c adapter!\n"); | 689 | dev_err(&pdev->dev, "Can't add i2c adapter!\n"); |
698 | goto out_error_add_adapter; | 690 | goto out_error; |
699 | } | 691 | } |
700 | 692 | ||
701 | platform_set_drvdata(pdev, iface); | 693 | platform_set_drvdata(pdev, iface); |
@@ -705,17 +697,8 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
705 | 697 | ||
706 | return 0; | 698 | return 0; |
707 | 699 | ||
708 | out_error_add_adapter: | 700 | out_error: |
709 | free_irq(iface->irq, iface); | ||
710 | out_error_req_irq: | ||
711 | out_error_no_irq: | ||
712 | peripheral_free_list(dev_get_platdata(&pdev->dev)); | 701 | peripheral_free_list(dev_get_platdata(&pdev->dev)); |
713 | out_error_pin_mux: | ||
714 | iounmap(iface->regs_base); | ||
715 | out_error_ioremap: | ||
716 | out_error_get_res: | ||
717 | kfree(iface); | ||
718 | out_error_nomem: | ||
719 | return rc; | 702 | return rc; |
720 | } | 703 | } |
721 | 704 | ||
@@ -724,10 +707,7 @@ static int i2c_bfin_twi_remove(struct platform_device *pdev) | |||
724 | struct bfin_twi_iface *iface = platform_get_drvdata(pdev); | 707 | struct bfin_twi_iface *iface = platform_get_drvdata(pdev); |
725 | 708 | ||
726 | i2c_del_adapter(&(iface->adap)); | 709 | i2c_del_adapter(&(iface->adap)); |
727 | free_irq(iface->irq, iface); | ||
728 | peripheral_free_list(dev_get_platdata(&pdev->dev)); | 710 | peripheral_free_list(dev_get_platdata(&pdev->dev)); |
729 | iounmap(iface->regs_base); | ||
730 | kfree(iface); | ||
731 | 711 | ||
732 | return 0; | 712 | return 0; |
733 | } | 713 | } |