aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/chips/m41t00.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/chips/m41t00.c')
-rw-r--r--drivers/i2c/chips/m41t00.c49
1 files changed, 21 insertions, 28 deletions
diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c
index 99ab4ec34390..eb2be3e4416c 100644
--- a/drivers/i2c/chips/m41t00.c
+++ b/drivers/i2c/chips/m41t00.c
@@ -1,6 +1,4 @@
1/* 1/*
2 * drivers/i2c/chips/m41t00.c
3 *
4 * I2C client/driver for the ST M41T00 Real-Time Clock chip. 2 * I2C client/driver for the ST M41T00 Real-Time Clock chip.
5 * 3 *
6 * Author: Mark A. Greer <mgreer@mvista.com> 4 * Author: Mark A. Greer <mgreer@mvista.com>
@@ -13,9 +11,6 @@
13/* 11/*
14 * This i2c client/driver wedges between the drivers/char/genrtc.c RTC 12 * This i2c client/driver wedges between the drivers/char/genrtc.c RTC
15 * interface and the SMBus interface of the i2c subsystem. 13 * interface and the SMBus interface of the i2c subsystem.
16 * It would be more efficient to use i2c msgs/i2c_transfer directly but, as
17 * recommened in .../Documentation/i2c/writing-clients section
18 * "Sending and receiving", using SMBus level communication is preferred.
19 */ 14 */
20 15
21#include <linux/kernel.h> 16#include <linux/kernel.h>
@@ -41,17 +36,17 @@ static unsigned short ignore[] = { I2C_CLIENT_END };
41static unsigned short normal_addr[] = { 0x68, I2C_CLIENT_END }; 36static unsigned short normal_addr[] = { 0x68, I2C_CLIENT_END };
42 37
43static struct i2c_client_address_data addr_data = { 38static struct i2c_client_address_data addr_data = {
44 .normal_i2c = normal_addr, 39 .normal_i2c = normal_addr,
45 .probe = ignore, 40 .probe = ignore,
46 .ignore = ignore, 41 .ignore = ignore,
47}; 42};
48 43
49ulong 44ulong
50m41t00_get_rtc_time(void) 45m41t00_get_rtc_time(void)
51{ 46{
52 s32 sec, min, hour, day, mon, year; 47 s32 sec, min, hour, day, mon, year;
53 s32 sec1, min1, hour1, day1, mon1, year1; 48 s32 sec1, min1, hour1, day1, mon1, year1;
54 ulong limit = 10; 49 ulong limit = 10;
55 50
56 sec = min = hour = day = mon = year = 0; 51 sec = min = hour = day = mon = year = 0;
57 sec1 = min1 = hour1 = day1 = mon1 = year1 = 0; 52 sec1 = min1 = hour1 = day1 = mon1 = year1 = 0;
@@ -97,12 +92,12 @@ m41t00_get_rtc_time(void)
97 mon &= 0x1f; 92 mon &= 0x1f;
98 year &= 0xff; 93 year &= 0xff;
99 94
100 BCD_TO_BIN(sec); 95 sec = BCD2BIN(sec);
101 BCD_TO_BIN(min); 96 min = BCD2BIN(min);
102 BCD_TO_BIN(hour); 97 hour = BCD2BIN(hour);
103 BCD_TO_BIN(day); 98 day = BCD2BIN(day);
104 BCD_TO_BIN(mon); 99 mon = BCD2BIN(mon);
105 BCD_TO_BIN(year); 100 year = BCD2BIN(year);
106 101
107 year += 1900; 102 year += 1900;
108 if (year < 1970) 103 if (year < 1970)
@@ -115,17 +110,17 @@ static void
115m41t00_set(void *arg) 110m41t00_set(void *arg)
116{ 111{
117 struct rtc_time tm; 112 struct rtc_time tm;
118 ulong nowtime = *(ulong *)arg; 113 ulong nowtime = *(ulong *)arg;
119 114
120 to_tm(nowtime, &tm); 115 to_tm(nowtime, &tm);
121 tm.tm_year = (tm.tm_year - 1900) % 100; 116 tm.tm_year = (tm.tm_year - 1900) % 100;
122 117
123 BIN_TO_BCD(tm.tm_sec); 118 tm.tm_sec = BIN2BCD(tm.tm_sec);
124 BIN_TO_BCD(tm.tm_min); 119 tm.tm_min = BIN2BCD(tm.tm_min);
125 BIN_TO_BCD(tm.tm_hour); 120 tm.tm_hour = BIN2BCD(tm.tm_hour);
126 BIN_TO_BCD(tm.tm_mon); 121 tm.tm_mon = BIN2BCD(tm.tm_mon);
127 BIN_TO_BCD(tm.tm_mday); 122 tm.tm_mday = BIN2BCD(tm.tm_mday);
128 BIN_TO_BCD(tm.tm_year); 123 tm.tm_year = BIN2BCD(tm.tm_year);
129 124
130 mutex_lock(&m41t00_mutex); 125 mutex_lock(&m41t00_mutex);
131 if ((i2c_smbus_write_byte_data(save_client, 0, tm.tm_sec & 0x7f) < 0) 126 if ((i2c_smbus_write_byte_data(save_client, 0, tm.tm_sec & 0x7f) < 0)
@@ -143,7 +138,6 @@ m41t00_set(void *arg)
143 dev_warn(&save_client->dev,"m41t00: can't write to rtc chip\n"); 138 dev_warn(&save_client->dev,"m41t00: can't write to rtc chip\n");
144 139
145 mutex_unlock(&m41t00_mutex); 140 mutex_unlock(&m41t00_mutex);
146 return;
147} 141}
148 142
149static ulong new_time; 143static ulong new_time;
@@ -180,7 +174,7 @@ m41t00_probe(struct i2c_adapter *adap, int addr, int kind)
180 if (!client) 174 if (!client)
181 return -ENOMEM; 175 return -ENOMEM;
182 176
183 strncpy(client->name, M41T00_DRV_NAME, I2C_NAME_SIZE); 177 strlcpy(client->name, M41T00_DRV_NAME, I2C_NAME_SIZE);
184 client->addr = addr; 178 client->addr = addr;
185 client->adapter = adap; 179 client->adapter = adap;
186 client->driver = &m41t00_driver; 180 client->driver = &m41t00_driver;
@@ -204,7 +198,7 @@ m41t00_attach(struct i2c_adapter *adap)
204static int 198static int
205m41t00_detach(struct i2c_client *client) 199m41t00_detach(struct i2c_client *client)
206{ 200{
207 int rc; 201 int rc;
208 202
209 if ((rc = i2c_detach_client(client)) == 0) { 203 if ((rc = i2c_detach_client(client)) == 0) {
210 kfree(client); 204 kfree(client);
@@ -232,7 +226,6 @@ static void __exit
232m41t00_exit(void) 226m41t00_exit(void)
233{ 227{
234 i2c_del_driver(&m41t00_driver); 228 i2c_del_driver(&m41t00_driver);
235 return;
236} 229}
237 230
238module_init(m41t00_init); 231module_init(m41t00_init);