summaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-isl1208.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-isl1208.c')
-rw-r--r--drivers/rtc/rtc-isl1208.c42
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)
144static int 144static int
145isl1208_i2c_get_sr(struct i2c_client *client) 145isl1208_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
154static int 150static 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
691exit_unregister:
692 rtc_device_unregister(rtc);
693exit_free_irq:
694 if (client->irq)
695 free_irq(client->irq, client);
696
697 return rc;
698} 685}
699 686
700static int 687static int
701isl1208_remove(struct i2c_client *client) 688isl1208_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}