diff options
Diffstat (limited to 'drivers/rtc/rtc-isl1208.c')
-rw-r--r-- | drivers/rtc/rtc-isl1208.c | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index c016ad81767a..c3c549d511b9 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
@@ -144,11 +144,7 @@ isl1208_i2c_validate_client(struct i2c_client *client) | |||
144 | static int | 144 | static int |
145 | isl1208_i2c_get_sr(struct i2c_client *client) | 145 | isl1208_i2c_get_sr(struct i2c_client *client) |
146 | { | 146 | { |
147 | int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR); | 147 | return i2c_smbus_read_byte_data(client, ISL1208_REG_SR); |
148 | if (sr < 0) | ||
149 | return -EIO; | ||
150 | |||
151 | return sr; | ||
152 | } | 148 | } |
153 | 149 | ||
154 | static int | 150 | static int |
@@ -647,10 +643,11 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
647 | "chip found, driver version " DRV_VERSION "\n"); | 643 | "chip found, driver version " DRV_VERSION "\n"); |
648 | 644 | ||
649 | if (client->irq > 0) { | 645 | if (client->irq > 0) { |
650 | rc = request_threaded_irq(client->irq, NULL, | 646 | rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, |
651 | isl1208_rtc_interrupt, | 647 | isl1208_rtc_interrupt, |
652 | IRQF_SHARED, | 648 | IRQF_SHARED, |
653 | isl1208_driver.driver.name, client); | 649 | isl1208_driver.driver.name, |
650 | client); | ||
654 | if (!rc) { | 651 | if (!rc) { |
655 | device_init_wakeup(&client->dev, 1); | 652 | device_init_wakeup(&client->dev, 1); |
656 | enable_irq_wake(client->irq); | 653 | enable_irq_wake(client->irq); |
@@ -662,20 +659,18 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
662 | } | 659 | } |
663 | } | 660 | } |
664 | 661 | ||
665 | rtc = rtc_device_register(isl1208_driver.driver.name, | 662 | rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, |
666 | &client->dev, &isl1208_rtc_ops, | 663 | &isl1208_rtc_ops, |
667 | THIS_MODULE); | 664 | THIS_MODULE); |
668 | if (IS_ERR(rtc)) { | 665 | if (IS_ERR(rtc)) |
669 | rc = PTR_ERR(rtc); | 666 | return PTR_ERR(rtc); |
670 | goto exit_free_irq; | ||
671 | } | ||
672 | 667 | ||
673 | i2c_set_clientdata(client, rtc); | 668 | i2c_set_clientdata(client, rtc); |
674 | 669 | ||
675 | rc = isl1208_i2c_get_sr(client); | 670 | rc = isl1208_i2c_get_sr(client); |
676 | if (rc < 0) { | 671 | if (rc < 0) { |
677 | dev_err(&client->dev, "reading status failed\n"); | 672 | dev_err(&client->dev, "reading status failed\n"); |
678 | goto exit_unregister; | 673 | return rc; |
679 | } | 674 | } |
680 | 675 | ||
681 | if (rc & ISL1208_REG_SR_RTCF) | 676 | if (rc & ISL1208_REG_SR_RTCF) |
@@ -684,28 +679,15 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
684 | 679 | ||
685 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 680 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
686 | if (rc) | 681 | if (rc) |
687 | goto exit_unregister; | 682 | return rc; |
688 | 683 | ||
689 | return 0; | 684 | return 0; |
690 | |||
691 | exit_unregister: | ||
692 | rtc_device_unregister(rtc); | ||
693 | exit_free_irq: | ||
694 | if (client->irq) | ||
695 | free_irq(client->irq, client); | ||
696 | |||
697 | return rc; | ||
698 | } | 685 | } |
699 | 686 | ||
700 | static int | 687 | static int |
701 | isl1208_remove(struct i2c_client *client) | 688 | isl1208_remove(struct i2c_client *client) |
702 | { | 689 | { |
703 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
704 | |||
705 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 690 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
706 | rtc_device_unregister(rtc); | ||
707 | if (client->irq) | ||
708 | free_irq(client->irq, client); | ||
709 | 691 | ||
710 | return 0; | 692 | return 0; |
711 | } | 693 | } |