xref: /openbmc/linux/drivers/rtc/rtc-max6900.c (revision 2a4e2b8780c6df42b19c053243dada7fa4d311ee)
1aa5bd7e9SDale Farnsworth /*
2aa5bd7e9SDale Farnsworth  * rtc class driver for the Maxim MAX6900 chip
3aa5bd7e9SDale Farnsworth  *
4aa5bd7e9SDale Farnsworth  * Author: Dale Farnsworth <dale@farnsworth.org>
5aa5bd7e9SDale Farnsworth  *
6aa5bd7e9SDale Farnsworth  * based on previously existing rtc class drivers
7aa5bd7e9SDale Farnsworth  *
8aa5bd7e9SDale Farnsworth  * 2007 (c) MontaVista, Software, Inc.  This file is licensed under
9aa5bd7e9SDale Farnsworth  * the terms of the GNU General Public License version 2.  This program
10aa5bd7e9SDale Farnsworth  * is licensed "as is" without any warranty of any kind, whether express
11aa5bd7e9SDale Farnsworth  * or implied.
12aa5bd7e9SDale Farnsworth  */
13aa5bd7e9SDale Farnsworth 
14aa5bd7e9SDale Farnsworth #include <linux/module.h>
15aa5bd7e9SDale Farnsworth #include <linux/i2c.h>
16aa5bd7e9SDale Farnsworth #include <linux/bcd.h>
17aa5bd7e9SDale Farnsworth #include <linux/rtc.h>
18aa5bd7e9SDale Farnsworth #include <linux/delay.h>
19aa5bd7e9SDale Farnsworth 
20aa5bd7e9SDale Farnsworth #define DRV_NAME "max6900"
21aa5bd7e9SDale Farnsworth #define DRV_VERSION "0.1"
22aa5bd7e9SDale Farnsworth 
23aa5bd7e9SDale Farnsworth /*
24aa5bd7e9SDale Farnsworth  * register indices
25aa5bd7e9SDale Farnsworth  */
26aa5bd7e9SDale Farnsworth #define MAX6900_REG_SC			0	/* seconds	00-59 */
27aa5bd7e9SDale Farnsworth #define MAX6900_REG_MN			1	/* minutes	00-59 */
28aa5bd7e9SDale Farnsworth #define MAX6900_REG_HR			2	/* hours	00-23 */
29aa5bd7e9SDale Farnsworth #define MAX6900_REG_DT			3	/* day of month	00-31 */
30aa5bd7e9SDale Farnsworth #define MAX6900_REG_MO			4	/* month	01-12 */
31aa5bd7e9SDale Farnsworth #define MAX6900_REG_DW			5	/* day of week	 1-7  */
32aa5bd7e9SDale Farnsworth #define MAX6900_REG_YR			6	/* year		00-99 */
33aa5bd7e9SDale Farnsworth #define MAX6900_REG_CT			7	/* control */
348a2601f6SDale Farnsworth 						/* register 8 is undocumented */
358a2601f6SDale Farnsworth #define MAX6900_REG_CENTURY		9	/* century */
368a2601f6SDale Farnsworth #define MAX6900_REG_LEN			10
378a2601f6SDale Farnsworth 
388a2601f6SDale Farnsworth #define MAX6900_BURST_LEN		8	/* can burst r/w first 8 regs */
39aa5bd7e9SDale Farnsworth 
40aa5bd7e9SDale Farnsworth #define MAX6900_REG_CT_WP		(1 << 7)	/* Write Protect */
41aa5bd7e9SDale Farnsworth 
428a2601f6SDale Farnsworth 
43aa5bd7e9SDale Farnsworth /*
44aa5bd7e9SDale Farnsworth  * register read/write commands
45aa5bd7e9SDale Farnsworth  */
46aa5bd7e9SDale Farnsworth #define MAX6900_REG_CONTROL_WRITE	0x8e
478a2601f6SDale Farnsworth #define MAX6900_REG_CENTURY_WRITE	0x92
488a2601f6SDale Farnsworth #define MAX6900_REG_CENTURY_READ	0x93
49aa5bd7e9SDale Farnsworth #define MAX6900_REG_RESERVED_READ	0x96
508a2601f6SDale Farnsworth #define MAX6900_REG_BURST_WRITE		0xbe
518a2601f6SDale Farnsworth #define MAX6900_REG_BURST_READ		0xbf
52aa5bd7e9SDale Farnsworth 
53aa5bd7e9SDale Farnsworth #define MAX6900_IDLE_TIME_AFTER_WRITE	3	/* specification says 2.5 mS */
54aa5bd7e9SDale Farnsworth 
55aa5bd7e9SDale Farnsworth #define MAX6900_I2C_ADDR		0xa0
56aa5bd7e9SDale Farnsworth 
57922539a0SJean Delvare static const unsigned short normal_i2c[] = {
58aa5bd7e9SDale Farnsworth 	MAX6900_I2C_ADDR >> 1,
59aa5bd7e9SDale Farnsworth 	I2C_CLIENT_END
60aa5bd7e9SDale Farnsworth };
61aa5bd7e9SDale Farnsworth 
62aa5bd7e9SDale Farnsworth I2C_CLIENT_INSMOD;			/* defines addr_data */
63aa5bd7e9SDale Farnsworth 
64aa5bd7e9SDale Farnsworth static int max6900_probe(struct i2c_adapter *adapter, int addr, int kind);
65aa5bd7e9SDale Farnsworth 
66aa5bd7e9SDale Farnsworth static int max6900_i2c_read_regs(struct i2c_client *client, u8 *buf)
67aa5bd7e9SDale Farnsworth {
688a2601f6SDale Farnsworth 	u8 reg_burst_read[1] = { MAX6900_REG_BURST_READ };
698a2601f6SDale Farnsworth 	u8 reg_century_read[1] = { MAX6900_REG_CENTURY_READ };
708a2601f6SDale Farnsworth 	struct i2c_msg msgs[4] = {
71aa5bd7e9SDale Farnsworth 		{
72aa5bd7e9SDale Farnsworth 			.addr	= client->addr,
73aa5bd7e9SDale Farnsworth 			.flags	= 0, /* write */
748a2601f6SDale Farnsworth 			.len	= sizeof(reg_burst_read),
758a2601f6SDale Farnsworth 			.buf	= reg_burst_read
76aa5bd7e9SDale Farnsworth 		},
77aa5bd7e9SDale Farnsworth 		{
78aa5bd7e9SDale Farnsworth 			.addr	= client->addr,
79aa5bd7e9SDale Farnsworth 			.flags	= I2C_M_RD,
808a2601f6SDale Farnsworth 			.len	= MAX6900_BURST_LEN,
81aa5bd7e9SDale Farnsworth 			.buf	= buf
828a2601f6SDale Farnsworth 		},
838a2601f6SDale Farnsworth 		{
848a2601f6SDale Farnsworth 			.addr	= client->addr,
858a2601f6SDale Farnsworth 			.flags	= 0, /* write */
868a2601f6SDale Farnsworth 			.len	= sizeof(reg_century_read),
878a2601f6SDale Farnsworth 			.buf	= reg_century_read
888a2601f6SDale Farnsworth 		},
898a2601f6SDale Farnsworth 		{
908a2601f6SDale Farnsworth 			.addr	= client->addr,
918a2601f6SDale Farnsworth 			.flags	= I2C_M_RD,
928a2601f6SDale Farnsworth 			.len	= sizeof(buf[MAX6900_REG_CENTURY]),
938a2601f6SDale Farnsworth 			.buf	= &buf[MAX6900_REG_CENTURY]
94aa5bd7e9SDale Farnsworth 		}
95aa5bd7e9SDale Farnsworth 	};
96aa5bd7e9SDale Farnsworth 	int rc;
97aa5bd7e9SDale Farnsworth 
98aa5bd7e9SDale Farnsworth 	rc = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
99aa5bd7e9SDale Farnsworth 	if (rc != ARRAY_SIZE(msgs)) {
100aa5bd7e9SDale Farnsworth 		dev_err(&client->dev, "%s: register read failed\n",
101*2a4e2b87SHarvey Harrison 			__func__);
102aa5bd7e9SDale Farnsworth 		return -EIO;
103aa5bd7e9SDale Farnsworth 	}
104aa5bd7e9SDale Farnsworth 	return 0;
105aa5bd7e9SDale Farnsworth }
106aa5bd7e9SDale Farnsworth 
107aa5bd7e9SDale Farnsworth static int max6900_i2c_write_regs(struct i2c_client *client, u8 const *buf)
108aa5bd7e9SDale Farnsworth {
1098a2601f6SDale Farnsworth 	u8 i2c_century_buf[1 + 1] = { MAX6900_REG_CENTURY_WRITE };
1108a2601f6SDale Farnsworth 	struct i2c_msg century_msgs[1] = {
111aa5bd7e9SDale Farnsworth 		{
112aa5bd7e9SDale Farnsworth 			.addr	= client->addr,
113aa5bd7e9SDale Farnsworth 			.flags	= 0, /* write */
1148a2601f6SDale Farnsworth 			.len	= sizeof(i2c_century_buf),
1158a2601f6SDale Farnsworth 			.buf	= i2c_century_buf
1168a2601f6SDale Farnsworth 		}
1178a2601f6SDale Farnsworth 	};
1188a2601f6SDale Farnsworth 	u8 i2c_burst_buf[MAX6900_BURST_LEN + 1] = { MAX6900_REG_BURST_WRITE };
1198a2601f6SDale Farnsworth 	struct i2c_msg burst_msgs[1] = {
1208a2601f6SDale Farnsworth 		{
1218a2601f6SDale Farnsworth 			.addr	= client->addr,
1228a2601f6SDale Farnsworth 			.flags	= 0, /* write */
1238a2601f6SDale Farnsworth 			.len	= sizeof(i2c_burst_buf),
1248a2601f6SDale Farnsworth 			.buf	= i2c_burst_buf
125aa5bd7e9SDale Farnsworth 		}
126aa5bd7e9SDale Farnsworth 	};
127aa5bd7e9SDale Farnsworth 	int rc;
128aa5bd7e9SDale Farnsworth 
1298a2601f6SDale Farnsworth 	/*
1308a2601f6SDale Farnsworth 	 * We have to make separate calls to i2c_transfer because of
1318a2601f6SDale Farnsworth 	 * the need to delay after each write to the chip.  Also,
1328a2601f6SDale Farnsworth 	 * we write the century byte first, since we set the write-protect
1338a2601f6SDale Farnsworth 	 * bit as part of the burst write.
1348a2601f6SDale Farnsworth 	 */
1358a2601f6SDale Farnsworth 	i2c_century_buf[1] = buf[MAX6900_REG_CENTURY];
1368a2601f6SDale Farnsworth 	rc = i2c_transfer(client->adapter, century_msgs,
1378a2601f6SDale Farnsworth 			  ARRAY_SIZE(century_msgs));
1388a2601f6SDale Farnsworth 	if (rc != ARRAY_SIZE(century_msgs))
1398a2601f6SDale Farnsworth 		goto write_failed;
1408a2601f6SDale Farnsworth 	msleep(MAX6900_IDLE_TIME_AFTER_WRITE);
141aa5bd7e9SDale Farnsworth 
1428a2601f6SDale Farnsworth 	memcpy(&i2c_burst_buf[1], buf, MAX6900_BURST_LEN);
1438a2601f6SDale Farnsworth 
1448a2601f6SDale Farnsworth 	rc = i2c_transfer(client->adapter, burst_msgs, ARRAY_SIZE(burst_msgs));
1458a2601f6SDale Farnsworth 	if (rc != ARRAY_SIZE(burst_msgs))
1468a2601f6SDale Farnsworth 		goto write_failed;
1478a2601f6SDale Farnsworth 	msleep(MAX6900_IDLE_TIME_AFTER_WRITE);
1488a2601f6SDale Farnsworth 
1498a2601f6SDale Farnsworth 	return 0;
1508a2601f6SDale Farnsworth 
1518a2601f6SDale Farnsworth write_failed:
152aa5bd7e9SDale Farnsworth 	dev_err(&client->dev, "%s: register write failed\n",
153*2a4e2b87SHarvey Harrison 		__func__);
154aa5bd7e9SDale Farnsworth 	return -EIO;
155aa5bd7e9SDale Farnsworth }
156aa5bd7e9SDale Farnsworth 
157aa5bd7e9SDale Farnsworth static int max6900_i2c_validate_client(struct i2c_client *client)
158aa5bd7e9SDale Farnsworth {
159aa5bd7e9SDale Farnsworth 	u8 regs[MAX6900_REG_LEN];
1608a2601f6SDale Farnsworth 	u8 zero_mask[] = {
161aa5bd7e9SDale Farnsworth 		0x80,	/* seconds */
162aa5bd7e9SDale Farnsworth 		0x80,	/* minutes */
163aa5bd7e9SDale Farnsworth 		0x40,	/* hours */
164aa5bd7e9SDale Farnsworth 		0xc0,	/* day of month */
165aa5bd7e9SDale Farnsworth 		0xe0,	/* month */
166aa5bd7e9SDale Farnsworth 		0xf8,	/* day of week */
167aa5bd7e9SDale Farnsworth 		0x00,	/* year */
168aa5bd7e9SDale Farnsworth 		0x7f,	/* control */
169aa5bd7e9SDale Farnsworth 	};
170aa5bd7e9SDale Farnsworth 	int i;
171aa5bd7e9SDale Farnsworth 	int rc;
172aa5bd7e9SDale Farnsworth 	int reserved;
173aa5bd7e9SDale Farnsworth 
174aa5bd7e9SDale Farnsworth 	reserved = i2c_smbus_read_byte_data(client, MAX6900_REG_RESERVED_READ);
175aa5bd7e9SDale Farnsworth 	if (reserved != 0x07)
176aa5bd7e9SDale Farnsworth 		return -ENODEV;
177aa5bd7e9SDale Farnsworth 
178aa5bd7e9SDale Farnsworth 	rc = max6900_i2c_read_regs(client, regs);
179aa5bd7e9SDale Farnsworth 	if (rc < 0)
180aa5bd7e9SDale Farnsworth 		return rc;
181aa5bd7e9SDale Farnsworth 
1828a2601f6SDale Farnsworth 	for (i = 0; i < ARRAY_SIZE(zero_mask); ++i) {
183aa5bd7e9SDale Farnsworth 		if (regs[i] & zero_mask[i])
184aa5bd7e9SDale Farnsworth 			return -ENODEV;
185aa5bd7e9SDale Farnsworth 	}
186aa5bd7e9SDale Farnsworth 
187aa5bd7e9SDale Farnsworth 	return 0;
188aa5bd7e9SDale Farnsworth }
189aa5bd7e9SDale Farnsworth 
190aa5bd7e9SDale Farnsworth static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
191aa5bd7e9SDale Farnsworth {
192aa5bd7e9SDale Farnsworth 	int rc;
193aa5bd7e9SDale Farnsworth 	u8 regs[MAX6900_REG_LEN];
194aa5bd7e9SDale Farnsworth 
195aa5bd7e9SDale Farnsworth 	rc = max6900_i2c_read_regs(client, regs);
196aa5bd7e9SDale Farnsworth 	if (rc < 0)
197aa5bd7e9SDale Farnsworth 		return rc;
198aa5bd7e9SDale Farnsworth 
199aa5bd7e9SDale Farnsworth 	tm->tm_sec = BCD2BIN(regs[MAX6900_REG_SC]);
200aa5bd7e9SDale Farnsworth 	tm->tm_min = BCD2BIN(regs[MAX6900_REG_MN]);
201aa5bd7e9SDale Farnsworth 	tm->tm_hour = BCD2BIN(regs[MAX6900_REG_HR] & 0x3f);
202aa5bd7e9SDale Farnsworth 	tm->tm_mday = BCD2BIN(regs[MAX6900_REG_DT]);
203aa5bd7e9SDale Farnsworth 	tm->tm_mon = BCD2BIN(regs[MAX6900_REG_MO]) - 1;
2048a2601f6SDale Farnsworth 	tm->tm_year = BCD2BIN(regs[MAX6900_REG_YR]) +
2058a2601f6SDale Farnsworth 		      BCD2BIN(regs[MAX6900_REG_CENTURY]) * 100 - 1900;
206aa5bd7e9SDale Farnsworth 	tm->tm_wday = BCD2BIN(regs[MAX6900_REG_DW]);
207aa5bd7e9SDale Farnsworth 
208aa5bd7e9SDale Farnsworth 	return 0;
209aa5bd7e9SDale Farnsworth }
210aa5bd7e9SDale Farnsworth 
211aa5bd7e9SDale Farnsworth static int max6900_i2c_clear_write_protect(struct i2c_client *client)
212aa5bd7e9SDale Farnsworth {
213aa5bd7e9SDale Farnsworth 	int rc;
214aa5bd7e9SDale Farnsworth 	rc = i2c_smbus_write_byte_data (client, MAX6900_REG_CONTROL_WRITE, 0);
215aa5bd7e9SDale Farnsworth 	if (rc < 0) {
216aa5bd7e9SDale Farnsworth 		dev_err(&client->dev, "%s: control register write failed\n",
217*2a4e2b87SHarvey Harrison 			__func__);
218aa5bd7e9SDale Farnsworth 		return -EIO;
219aa5bd7e9SDale Farnsworth 	}
220aa5bd7e9SDale Farnsworth 	return 0;
221aa5bd7e9SDale Farnsworth }
222aa5bd7e9SDale Farnsworth 
223aa5bd7e9SDale Farnsworth static int max6900_i2c_set_time(struct i2c_client *client,
224aa5bd7e9SDale Farnsworth 				struct rtc_time const *tm)
225aa5bd7e9SDale Farnsworth {
226aa5bd7e9SDale Farnsworth 	u8 regs[MAX6900_REG_LEN];
227aa5bd7e9SDale Farnsworth 	int rc;
228aa5bd7e9SDale Farnsworth 
229aa5bd7e9SDale Farnsworth 	rc = max6900_i2c_clear_write_protect(client);
230aa5bd7e9SDale Farnsworth 	if (rc < 0)
231aa5bd7e9SDale Farnsworth 		return rc;
232aa5bd7e9SDale Farnsworth 
233aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_SC] = BIN2BCD(tm->tm_sec);
234aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_MN] = BIN2BCD(tm->tm_min);
235aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_HR] = BIN2BCD(tm->tm_hour);
236aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_DT] = BIN2BCD(tm->tm_mday);
237aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_MO] = BIN2BCD(tm->tm_mon + 1);
238aa5bd7e9SDale Farnsworth 	regs[MAX6900_REG_DW] = BIN2BCD(tm->tm_wday);
2398a2601f6SDale Farnsworth 	regs[MAX6900_REG_YR] = BIN2BCD(tm->tm_year % 100);
2408a2601f6SDale Farnsworth 	regs[MAX6900_REG_CENTURY] = BIN2BCD((tm->tm_year + 1900) / 100);
2418a2601f6SDale Farnsworth 	/* set write protect */
2428a2601f6SDale Farnsworth 	regs[MAX6900_REG_CT] = MAX6900_REG_CT_WP;
243aa5bd7e9SDale Farnsworth 
244aa5bd7e9SDale Farnsworth 	rc = max6900_i2c_write_regs(client, regs);
245aa5bd7e9SDale Farnsworth 	if (rc < 0)
246aa5bd7e9SDale Farnsworth 		return rc;
247aa5bd7e9SDale Farnsworth 
248aa5bd7e9SDale Farnsworth 	return 0;
249aa5bd7e9SDale Farnsworth }
250aa5bd7e9SDale Farnsworth 
251aa5bd7e9SDale Farnsworth static int max6900_rtc_read_time(struct device *dev, struct rtc_time *tm)
252aa5bd7e9SDale Farnsworth {
253aa5bd7e9SDale Farnsworth 	return max6900_i2c_read_time(to_i2c_client(dev), tm);
254aa5bd7e9SDale Farnsworth }
255aa5bd7e9SDale Farnsworth 
256aa5bd7e9SDale Farnsworth static int max6900_rtc_set_time(struct device *dev, struct rtc_time *tm)
257aa5bd7e9SDale Farnsworth {
258aa5bd7e9SDale Farnsworth 	return max6900_i2c_set_time(to_i2c_client(dev), tm);
259aa5bd7e9SDale Farnsworth }
260aa5bd7e9SDale Farnsworth 
261aa5bd7e9SDale Farnsworth static int max6900_attach_adapter(struct i2c_adapter *adapter)
262aa5bd7e9SDale Farnsworth {
263aa5bd7e9SDale Farnsworth 	return i2c_probe(adapter, &addr_data, max6900_probe);
264aa5bd7e9SDale Farnsworth }
265aa5bd7e9SDale Farnsworth 
266aa5bd7e9SDale Farnsworth static int max6900_detach_client(struct i2c_client *client)
267aa5bd7e9SDale Farnsworth {
268aa5bd7e9SDale Farnsworth 	struct rtc_device *const rtc = i2c_get_clientdata(client);
269aa5bd7e9SDale Farnsworth 
270aa5bd7e9SDale Farnsworth 	if (rtc)
271aa5bd7e9SDale Farnsworth 		rtc_device_unregister(rtc);
272aa5bd7e9SDale Farnsworth 
273aa5bd7e9SDale Farnsworth 	return i2c_detach_client(client);
274aa5bd7e9SDale Farnsworth }
275aa5bd7e9SDale Farnsworth 
276aa5bd7e9SDale Farnsworth static struct i2c_driver max6900_driver = {
277aa5bd7e9SDale Farnsworth 	.driver		= {
278aa5bd7e9SDale Farnsworth 		.name	= DRV_NAME,
279aa5bd7e9SDale Farnsworth 	},
280aa5bd7e9SDale Farnsworth 	.id		= I2C_DRIVERID_MAX6900,
281aa5bd7e9SDale Farnsworth 	.attach_adapter = max6900_attach_adapter,
282aa5bd7e9SDale Farnsworth 	.detach_client	= max6900_detach_client,
283aa5bd7e9SDale Farnsworth };
284aa5bd7e9SDale Farnsworth 
285aa5bd7e9SDale Farnsworth static const struct rtc_class_ops max6900_rtc_ops = {
286aa5bd7e9SDale Farnsworth 	.read_time	= max6900_rtc_read_time,
287aa5bd7e9SDale Farnsworth 	.set_time	= max6900_rtc_set_time,
288aa5bd7e9SDale Farnsworth };
289aa5bd7e9SDale Farnsworth 
290aa5bd7e9SDale Farnsworth static int max6900_probe(struct i2c_adapter *adapter, int addr, int kind)
291aa5bd7e9SDale Farnsworth {
292aa5bd7e9SDale Farnsworth 	int rc = 0;
293aa5bd7e9SDale Farnsworth 	struct i2c_client *client = NULL;
294aa5bd7e9SDale Farnsworth 	struct rtc_device *rtc = NULL;
295aa5bd7e9SDale Farnsworth 
296aa5bd7e9SDale Farnsworth 	if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
297aa5bd7e9SDale Farnsworth 		rc = -ENODEV;
298aa5bd7e9SDale Farnsworth 		goto failout;
299aa5bd7e9SDale Farnsworth 	}
300aa5bd7e9SDale Farnsworth 
301aa5bd7e9SDale Farnsworth 	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
302aa5bd7e9SDale Farnsworth 	if (client == NULL) {
303aa5bd7e9SDale Farnsworth 		rc = -ENOMEM;
304aa5bd7e9SDale Farnsworth 		goto failout;
305aa5bd7e9SDale Farnsworth 	}
306aa5bd7e9SDale Farnsworth 
307aa5bd7e9SDale Farnsworth 	client->addr = addr;
308aa5bd7e9SDale Farnsworth 	client->adapter = adapter;
309aa5bd7e9SDale Farnsworth 	client->driver = &max6900_driver;
310aa5bd7e9SDale Farnsworth 	strlcpy(client->name, DRV_NAME, I2C_NAME_SIZE);
311aa5bd7e9SDale Farnsworth 
312aa5bd7e9SDale Farnsworth 	if (kind < 0) {
313aa5bd7e9SDale Farnsworth 		rc = max6900_i2c_validate_client(client);
314aa5bd7e9SDale Farnsworth 		if (rc < 0)
315aa5bd7e9SDale Farnsworth 			goto failout;
316aa5bd7e9SDale Farnsworth 	}
317aa5bd7e9SDale Farnsworth 
318aa5bd7e9SDale Farnsworth 	rc = i2c_attach_client(client);
319aa5bd7e9SDale Farnsworth 	if (rc < 0)
320aa5bd7e9SDale Farnsworth 		goto failout;
321aa5bd7e9SDale Farnsworth 
322aa5bd7e9SDale Farnsworth 	dev_info(&client->dev,
323aa5bd7e9SDale Farnsworth 		 "chip found, driver version " DRV_VERSION "\n");
324aa5bd7e9SDale Farnsworth 
325aa5bd7e9SDale Farnsworth 	rtc = rtc_device_register(max6900_driver.driver.name,
326aa5bd7e9SDale Farnsworth 				  &client->dev,
327aa5bd7e9SDale Farnsworth 				  &max6900_rtc_ops, THIS_MODULE);
328aa5bd7e9SDale Farnsworth 	if (IS_ERR(rtc)) {
329aa5bd7e9SDale Farnsworth 		rc = PTR_ERR(rtc);
330aa5bd7e9SDale Farnsworth 		goto failout_detach;
331aa5bd7e9SDale Farnsworth 	}
332aa5bd7e9SDale Farnsworth 
333aa5bd7e9SDale Farnsworth 	i2c_set_clientdata(client, rtc);
334aa5bd7e9SDale Farnsworth 
335aa5bd7e9SDale Farnsworth 	return 0;
336aa5bd7e9SDale Farnsworth 
337aa5bd7e9SDale Farnsworth failout_detach:
338aa5bd7e9SDale Farnsworth 	i2c_detach_client(client);
339aa5bd7e9SDale Farnsworth failout:
340aa5bd7e9SDale Farnsworth 	kfree(client);
341aa5bd7e9SDale Farnsworth 	return rc;
342aa5bd7e9SDale Farnsworth }
343aa5bd7e9SDale Farnsworth 
344aa5bd7e9SDale Farnsworth static int __init max6900_init(void)
345aa5bd7e9SDale Farnsworth {
346aa5bd7e9SDale Farnsworth 	return i2c_add_driver(&max6900_driver);
347aa5bd7e9SDale Farnsworth }
348aa5bd7e9SDale Farnsworth 
349aa5bd7e9SDale Farnsworth static void __exit max6900_exit(void)
350aa5bd7e9SDale Farnsworth {
351aa5bd7e9SDale Farnsworth 	i2c_del_driver(&max6900_driver);
352aa5bd7e9SDale Farnsworth }
353aa5bd7e9SDale Farnsworth 
354aa5bd7e9SDale Farnsworth MODULE_DESCRIPTION("Maxim MAX6900 RTC driver");
355aa5bd7e9SDale Farnsworth MODULE_LICENSE("GPL");
356aa5bd7e9SDale Farnsworth MODULE_VERSION(DRV_VERSION);
357aa5bd7e9SDale Farnsworth 
358aa5bd7e9SDale Farnsworth module_init(max6900_init);
359aa5bd7e9SDale Farnsworth module_exit(max6900_exit);
360