aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-m41t80.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-m41t80.c')
-rw-r--r--drivers/rtc/rtc-m41t80.c78
1 files changed, 19 insertions, 59 deletions
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c
index 2ee0d070095a..316bfaa80872 100644
--- a/drivers/rtc/rtc-m41t80.c
+++ b/drivers/rtc/rtc-m41t80.c
@@ -60,48 +60,21 @@
60 60
61#define DRV_VERSION "0.05" 61#define DRV_VERSION "0.05"
62 62
63struct m41t80_chip_info { 63static const struct i2c_device_id m41t80_id[] = {
64 const char *name; 64 { "m41t80", 0 },
65 u8 features; 65 { "m41t81", M41T80_FEATURE_HT },
66}; 66 { "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
67 67 { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
68static const struct m41t80_chip_info m41t80_chip_info_tbl[] = { 68 { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
69 { 69 { "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
70 .name = "m41t80", 70 { "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
71 .features = 0, 71 { "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL },
72 }, 72 { }
73 {
74 .name = "m41t81",
75 .features = M41T80_FEATURE_HT,
76 },
77 {
78 .name = "m41t81s",
79 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
80 },
81 {
82 .name = "m41t82",
83 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
84 },
85 {
86 .name = "m41t83",
87 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
88 },
89 {
90 .name = "m41st84",
91 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
92 },
93 {
94 .name = "m41st85",
95 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
96 },
97 {
98 .name = "m41st87",
99 .features = M41T80_FEATURE_HT | M41T80_FEATURE_BL,
100 },
101}; 73};
74MODULE_DEVICE_TABLE(i2c, m41t80_id);
102 75
103struct m41t80_data { 76struct m41t80_data {
104 const struct m41t80_chip_info *chip; 77 u8 features;
105 struct rtc_device *rtc; 78 struct rtc_device *rtc;
106}; 79};
107 80
@@ -208,7 +181,7 @@ static int m41t80_rtc_proc(struct device *dev, struct seq_file *seq)
208 struct m41t80_data *clientdata = i2c_get_clientdata(client); 181 struct m41t80_data *clientdata = i2c_get_clientdata(client);
209 u8 reg; 182 u8 reg;
210 183
211 if (clientdata->chip->features & M41T80_FEATURE_BL) { 184 if (clientdata->features & M41T80_FEATURE_BL) {
212 reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS); 185 reg = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
213 seq_printf(seq, "battery\t\t: %s\n", 186 seq_printf(seq, "battery\t\t: %s\n",
214 (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok"); 187 (reg & M41T80_FLAGS_BATT_LOW) ? "exhausted" : "ok");
@@ -759,10 +732,9 @@ static struct notifier_block wdt_notifier = {
759static int m41t80_probe(struct i2c_client *client, 732static int m41t80_probe(struct i2c_client *client,
760 const struct i2c_device_id *id) 733 const struct i2c_device_id *id)
761{ 734{
762 int i, rc = 0; 735 int rc = 0;
763 struct rtc_device *rtc = NULL; 736 struct rtc_device *rtc = NULL;
764 struct rtc_time tm; 737 struct rtc_time tm;
765 const struct m41t80_chip_info *chip;
766 struct m41t80_data *clientdata = NULL; 738 struct m41t80_data *clientdata = NULL;
767 739
768 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C 740 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C
@@ -774,19 +746,6 @@ static int m41t80_probe(struct i2c_client *client,
774 dev_info(&client->dev, 746 dev_info(&client->dev,
775 "chip found, driver version " DRV_VERSION "\n"); 747 "chip found, driver version " DRV_VERSION "\n");
776 748
777 chip = NULL;
778 for (i = 0; i < ARRAY_SIZE(m41t80_chip_info_tbl); i++) {
779 if (!strcmp(m41t80_chip_info_tbl[i].name, client->name)) {
780 chip = &m41t80_chip_info_tbl[i];
781 break;
782 }
783 }
784 if (!chip) {
785 dev_err(&client->dev, "%s is not supported\n", client->name);
786 rc = -ENODEV;
787 goto exit;
788 }
789
790 clientdata = kzalloc(sizeof(*clientdata), GFP_KERNEL); 749 clientdata = kzalloc(sizeof(*clientdata), GFP_KERNEL);
791 if (!clientdata) { 750 if (!clientdata) {
792 rc = -ENOMEM; 751 rc = -ENOMEM;
@@ -802,7 +761,7 @@ static int m41t80_probe(struct i2c_client *client,
802 } 761 }
803 762
804 clientdata->rtc = rtc; 763 clientdata->rtc = rtc;
805 clientdata->chip = chip; 764 clientdata->features = id->driver_data;
806 i2c_set_clientdata(client, clientdata); 765 i2c_set_clientdata(client, clientdata);
807 766
808 /* Make sure HT (Halt Update) bit is cleared */ 767 /* Make sure HT (Halt Update) bit is cleared */
@@ -811,7 +770,7 @@ static int m41t80_probe(struct i2c_client *client,
811 goto ht_err; 770 goto ht_err;
812 771
813 if (rc & M41T80_ALHOUR_HT) { 772 if (rc & M41T80_ALHOUR_HT) {
814 if (chip->features & M41T80_FEATURE_HT) { 773 if (clientdata->features & M41T80_FEATURE_HT) {
815 m41t80_get_datetime(client, &tm); 774 m41t80_get_datetime(client, &tm);
816 dev_info(&client->dev, "HT bit was set!\n"); 775 dev_info(&client->dev, "HT bit was set!\n");
817 dev_info(&client->dev, 776 dev_info(&client->dev,
@@ -843,7 +802,7 @@ static int m41t80_probe(struct i2c_client *client,
843 goto exit; 802 goto exit;
844 803
845#ifdef CONFIG_RTC_DRV_M41T80_WDT 804#ifdef CONFIG_RTC_DRV_M41T80_WDT
846 if (chip->features & M41T80_FEATURE_HT) { 805 if (clientdata->features & M41T80_FEATURE_HT) {
847 rc = misc_register(&wdt_dev); 806 rc = misc_register(&wdt_dev);
848 if (rc) 807 if (rc)
849 goto exit; 808 goto exit;
@@ -879,7 +838,7 @@ static int m41t80_remove(struct i2c_client *client)
879 struct rtc_device *rtc = clientdata->rtc; 838 struct rtc_device *rtc = clientdata->rtc;
880 839
881#ifdef CONFIG_RTC_DRV_M41T80_WDT 840#ifdef CONFIG_RTC_DRV_M41T80_WDT
882 if (clientdata->chip->features & M41T80_FEATURE_HT) { 841 if (clientdata->features & M41T80_FEATURE_HT) {
883 misc_deregister(&wdt_dev); 842 misc_deregister(&wdt_dev);
884 unregister_reboot_notifier(&wdt_notifier); 843 unregister_reboot_notifier(&wdt_notifier);
885 } 844 }
@@ -897,6 +856,7 @@ static struct i2c_driver m41t80_driver = {
897 }, 856 },
898 .probe = m41t80_probe, 857 .probe = m41t80_probe,
899 .remove = m41t80_remove, 858 .remove = m41t80_remove,
859 .id_table = m41t80_id,
900}; 860};
901 861
902static int __init m41t80_rtc_init(void) 862static int __init m41t80_rtc_init(void)