Linux Audio

Check our new training course

Loading...
v4.6
  1/*
  2 * Micro Crystal RV-3029 rtc class driver
  3 *
  4 * Author: Gregory Hermant <gregory.hermant@calao-systems.com>
  5 *         Michael Buesch <m@bues.ch>
  6 *
  7 * based on previously existing rtc class drivers
  8 *
  9 * This program is free software; you can redistribute it and/or modify
 10 * it under the terms of the GNU General Public License version 2 as
 11 * published by the Free Software Foundation.
 12 *
 
 
 
 13 */
 14
 15#include <linux/module.h>
 16#include <linux/i2c.h>
 17#include <linux/bcd.h>
 18#include <linux/rtc.h>
 19#include <linux/delay.h>
 20#include <linux/of.h>
 21#include <linux/hwmon.h>
 22#include <linux/hwmon-sysfs.h>
 23
 24
 25/* Register map */
 26/* control section */
 27#define RV3029_ONOFF_CTRL		0x00
 28#define RV3029_ONOFF_CTRL_WE		BIT(0)
 29#define RV3029_ONOFF_CTRL_TE		BIT(1)
 30#define RV3029_ONOFF_CTRL_TAR		BIT(2)
 31#define RV3029_ONOFF_CTRL_EERE		BIT(3)
 32#define RV3029_ONOFF_CTRL_SRON		BIT(4)
 33#define RV3029_ONOFF_CTRL_TD0		BIT(5)
 34#define RV3029_ONOFF_CTRL_TD1		BIT(6)
 35#define RV3029_ONOFF_CTRL_CLKINT	BIT(7)
 36#define RV3029_IRQ_CTRL			0x01
 37#define RV3029_IRQ_CTRL_AIE		BIT(0)
 38#define RV3029_IRQ_CTRL_TIE		BIT(1)
 39#define RV3029_IRQ_CTRL_V1IE		BIT(2)
 40#define RV3029_IRQ_CTRL_V2IE		BIT(3)
 41#define RV3029_IRQ_CTRL_SRIE		BIT(4)
 42#define RV3029_IRQ_FLAGS		0x02
 43#define RV3029_IRQ_FLAGS_AF		BIT(0)
 44#define RV3029_IRQ_FLAGS_TF		BIT(1)
 45#define RV3029_IRQ_FLAGS_V1IF		BIT(2)
 46#define RV3029_IRQ_FLAGS_V2IF		BIT(3)
 47#define RV3029_IRQ_FLAGS_SRF		BIT(4)
 48#define RV3029_STATUS			0x03
 49#define RV3029_STATUS_VLOW1		BIT(2)
 50#define RV3029_STATUS_VLOW2		BIT(3)
 51#define RV3029_STATUS_SR		BIT(4)
 52#define RV3029_STATUS_PON		BIT(5)
 53#define RV3029_STATUS_EEBUSY		BIT(7)
 54#define RV3029_RST_CTRL			0x04
 55#define RV3029_RST_CTRL_SYSR		BIT(4)
 56#define RV3029_CONTROL_SECTION_LEN	0x05
 57
 58/* watch section */
 59#define RV3029_W_SEC			0x08
 60#define RV3029_W_MINUTES		0x09
 61#define RV3029_W_HOURS			0x0A
 62#define RV3029_REG_HR_12_24		BIT(6) /* 24h/12h mode */
 63#define RV3029_REG_HR_PM		BIT(5) /* PM/AM bit in 12h mode */
 64#define RV3029_W_DATE			0x0B
 65#define RV3029_W_DAYS			0x0C
 66#define RV3029_W_MONTHS			0x0D
 67#define RV3029_W_YEARS			0x0E
 68#define RV3029_WATCH_SECTION_LEN	0x07
 69
 70/* alarm section */
 71#define RV3029_A_SC			0x10
 72#define RV3029_A_MN			0x11
 73#define RV3029_A_HR			0x12
 74#define RV3029_A_DT			0x13
 75#define RV3029_A_DW			0x14
 76#define RV3029_A_MO			0x15
 77#define RV3029_A_YR			0x16
 78#define RV3029_ALARM_SECTION_LEN	0x07
 79
 80/* timer section */
 81#define RV3029_TIMER_LOW		0x18
 82#define RV3029_TIMER_HIGH		0x19
 83
 84/* temperature section */
 85#define RV3029_TEMP_PAGE		0x20
 86
 87/* eeprom data section */
 88#define RV3029_E2P_EEDATA1		0x28
 89#define RV3029_E2P_EEDATA2		0x29
 90#define RV3029_E2PDATA_SECTION_LEN	0x02
 91
 92/* eeprom control section */
 93#define RV3029_CONTROL_E2P_EECTRL	0x30
 94#define RV3029_EECTRL_THP		BIT(0) /* temp scan interval */
 95#define RV3029_EECTRL_THE		BIT(1) /* thermometer enable */
 96#define RV3029_EECTRL_FD0		BIT(2) /* CLKOUT */
 97#define RV3029_EECTRL_FD1		BIT(3) /* CLKOUT */
 98#define RV3029_TRICKLE_1K		BIT(4) /* 1.5K resistance */
 99#define RV3029_TRICKLE_5K		BIT(5) /* 5K   resistance */
100#define RV3029_TRICKLE_20K		BIT(6) /* 20K  resistance */
101#define RV3029_TRICKLE_80K		BIT(7) /* 80K  resistance */
102#define RV3029_TRICKLE_MASK		(RV3029_TRICKLE_1K |\
103					 RV3029_TRICKLE_5K |\
104					 RV3029_TRICKLE_20K |\
105					 RV3029_TRICKLE_80K)
106#define RV3029_TRICKLE_SHIFT		4
107#define RV3029_CONTROL_E2P_XOFFS	0x31 /* XTAL offset */
108#define RV3029_CONTROL_E2P_XOFFS_SIGN	BIT(7) /* Sign: 1->pos, 0->neg */
109#define RV3029_CONTROL_E2P_QCOEF	0x32 /* XTAL temp drift coef */
110#define RV3029_CONTROL_E2P_TURNOVER	0x33 /* XTAL turnover temp (in *C) */
111#define RV3029_CONTROL_E2P_TOV_MASK	0x3F /* XTAL turnover temp mask */
112
113/* user ram section */
114#define RV3029_USR1_RAM_PAGE		0x38
115#define RV3029_USR1_SECTION_LEN		0x04
116#define RV3029_USR2_RAM_PAGE		0x3C
117#define RV3029_USR2_SECTION_LEN		0x04
118
119static int
120rv3029_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf,
121		     unsigned len)
122{
123	int ret;
124
125	if ((reg > RV3029_USR1_RAM_PAGE + 7) ||
126		(reg + len > RV3029_USR1_RAM_PAGE + 8))
127		return -EINVAL;
128
129	ret = i2c_smbus_read_i2c_block_data(client, reg, len, buf);
130	if (ret < 0)
131		return ret;
132	if (ret < len)
133		return -EIO;
134	return 0;
135}
136
137static int
138rv3029_i2c_write_regs(struct i2c_client *client, u8 reg, u8 const buf[],
139		      unsigned len)
140{
141	if ((reg > RV3029_USR1_RAM_PAGE + 7) ||
142		(reg + len > RV3029_USR1_RAM_PAGE + 8))
143		return -EINVAL;
144
145	return i2c_smbus_write_i2c_block_data(client, reg, len, buf);
146}
147
148static int
149rv3029_i2c_update_bits(struct i2c_client *client, u8 reg, u8 mask, u8 set)
150{
151	u8 buf;
152	int ret;
153
154	ret = rv3029_i2c_read_regs(client, reg, &buf, 1);
155	if (ret < 0)
156		return ret;
157	buf &= ~mask;
158	buf |= set & mask;
159	ret = rv3029_i2c_write_regs(client, reg, &buf, 1);
160	if (ret < 0)
161		return ret;
162
163	return 0;
164}
165
166static int
167rv3029_i2c_get_sr(struct i2c_client *client, u8 *buf)
168{
169	int ret = rv3029_i2c_read_regs(client, RV3029_STATUS, buf, 1);
170
171	if (ret < 0)
172		return -EIO;
173	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
174	return 0;
175}
176
177static int
178rv3029_i2c_set_sr(struct i2c_client *client, u8 val)
179{
180	u8 buf[1];
181	int sr;
182
183	buf[0] = val;
184	sr = rv3029_i2c_write_regs(client, RV3029_STATUS, buf, 1);
185	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
186	if (sr < 0)
187		return -EIO;
188	return 0;
189}
190
191static int rv3029_eeprom_busywait(struct i2c_client *client)
192{
193	int i, ret;
194	u8 sr;
195
196	for (i = 100; i > 0; i--) {
197		ret = rv3029_i2c_get_sr(client, &sr);
198		if (ret < 0)
199			break;
200		if (!(sr & RV3029_STATUS_EEBUSY))
201			break;
202		usleep_range(1000, 10000);
203	}
204	if (i <= 0) {
205		dev_err(&client->dev, "EEPROM busy wait timeout.\n");
206		return -ETIMEDOUT;
207	}
208
209	return ret;
210}
211
212static int rv3029_eeprom_exit(struct i2c_client *client)
213{
214	/* Re-enable eeprom refresh */
215	return rv3029_i2c_update_bits(client, RV3029_ONOFF_CTRL,
216				      RV3029_ONOFF_CTRL_EERE,
217				      RV3029_ONOFF_CTRL_EERE);
218}
219
220static int rv3029_eeprom_enter(struct i2c_client *client)
221{
222	int ret;
223	u8 sr;
224
225	/* Check whether we are in the allowed voltage range. */
226	ret = rv3029_i2c_get_sr(client, &sr);
227	if (ret < 0)
228		return ret;
229	if (sr & (RV3029_STATUS_VLOW1 | RV3029_STATUS_VLOW2)) {
230		/* We clear the bits and retry once just in case
231		 * we had a brown out in early startup.
232		 */
233		sr &= ~RV3029_STATUS_VLOW1;
234		sr &= ~RV3029_STATUS_VLOW2;
235		ret = rv3029_i2c_set_sr(client, sr);
236		if (ret < 0)
237			return ret;
238		usleep_range(1000, 10000);
239		ret = rv3029_i2c_get_sr(client, &sr);
240		if (ret < 0)
241			return ret;
242		if (sr & (RV3029_STATUS_VLOW1 | RV3029_STATUS_VLOW2)) {
243			dev_err(&client->dev,
244				"Supply voltage is too low to safely access the EEPROM.\n");
245			return -ENODEV;
246		}
247	}
248
249	/* Disable eeprom refresh. */
250	ret = rv3029_i2c_update_bits(client, RV3029_ONOFF_CTRL,
251				     RV3029_ONOFF_CTRL_EERE, 0);
252	if (ret < 0)
253		return ret;
254
255	/* Wait for any previous eeprom accesses to finish. */
256	ret = rv3029_eeprom_busywait(client);
257	if (ret < 0)
258		rv3029_eeprom_exit(client);
259
260	return ret;
261}
262
263static int rv3029_eeprom_read(struct i2c_client *client, u8 reg,
264			      u8 buf[], size_t len)
265{
266	int ret, err;
267
268	err = rv3029_eeprom_enter(client);
269	if (err < 0)
270		return err;
271
272	ret = rv3029_i2c_read_regs(client, reg, buf, len);
273
274	err = rv3029_eeprom_exit(client);
275	if (err < 0)
276		return err;
277
278	return ret;
279}
280
281static int rv3029_eeprom_write(struct i2c_client *client, u8 reg,
282			       u8 const buf[], size_t len)
283{
284	int ret, err;
285	size_t i;
286	u8 tmp;
287
288	err = rv3029_eeprom_enter(client);
289	if (err < 0)
290		return err;
291
292	for (i = 0; i < len; i++, reg++) {
293		ret = rv3029_i2c_read_regs(client, reg, &tmp, 1);
294		if (ret < 0)
295			break;
296		if (tmp != buf[i]) {
297			ret = rv3029_i2c_write_regs(client, reg, &buf[i], 1);
298			if (ret < 0)
299				break;
300		}
301		ret = rv3029_eeprom_busywait(client);
302		if (ret < 0)
303			break;
304	}
305
306	err = rv3029_eeprom_exit(client);
307	if (err < 0)
308		return err;
309
310	return ret;
311}
312
313static int rv3029_eeprom_update_bits(struct i2c_client *client,
314				     u8 reg, u8 mask, u8 set)
315{
316	u8 buf;
317	int ret;
318
319	ret = rv3029_eeprom_read(client, reg, &buf, 1);
320	if (ret < 0)
321		return ret;
322	buf &= ~mask;
323	buf |= set & mask;
324	ret = rv3029_eeprom_write(client, reg, &buf, 1);
325	if (ret < 0)
326		return ret;
327
328	return 0;
329}
330
331static int
332rv3029_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
333{
334	u8 buf[1];
335	int ret;
336	u8 regs[RV3029_WATCH_SECTION_LEN] = { 0, };
337
338	ret = rv3029_i2c_get_sr(client, buf);
339	if (ret < 0) {
340		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
341		return -EIO;
342	}
343
344	ret = rv3029_i2c_read_regs(client, RV3029_W_SEC, regs,
345				   RV3029_WATCH_SECTION_LEN);
346	if (ret < 0) {
347		dev_err(&client->dev, "%s: reading RTC section failed\n",
348			__func__);
349		return ret;
350	}
351
352	tm->tm_sec = bcd2bin(regs[RV3029_W_SEC-RV3029_W_SEC]);
353	tm->tm_min = bcd2bin(regs[RV3029_W_MINUTES-RV3029_W_SEC]);
354
355	/* HR field has a more complex interpretation */
356	{
357		const u8 _hr = regs[RV3029_W_HOURS-RV3029_W_SEC];
358
359		if (_hr & RV3029_REG_HR_12_24) {
360			/* 12h format */
361			tm->tm_hour = bcd2bin(_hr & 0x1f);
362			if (_hr & RV3029_REG_HR_PM)	/* PM flag set */
363				tm->tm_hour += 12;
364		} else /* 24h format */
365			tm->tm_hour = bcd2bin(_hr & 0x3f);
366	}
367
368	tm->tm_mday = bcd2bin(regs[RV3029_W_DATE-RV3029_W_SEC]);
369	tm->tm_mon = bcd2bin(regs[RV3029_W_MONTHS-RV3029_W_SEC]) - 1;
370	tm->tm_year = bcd2bin(regs[RV3029_W_YEARS-RV3029_W_SEC]) + 100;
371	tm->tm_wday = bcd2bin(regs[RV3029_W_DAYS-RV3029_W_SEC]) - 1;
372
373	return 0;
374}
375
376static int rv3029_rtc_read_time(struct device *dev, struct rtc_time *tm)
377{
378	return rv3029_i2c_read_time(to_i2c_client(dev), tm);
379}
380
381static int
382rv3029_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm)
383{
384	struct rtc_time *const tm = &alarm->time;
385	int ret;
386	u8 regs[8];
387
388	ret = rv3029_i2c_get_sr(client, regs);
389	if (ret < 0) {
390		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
391		return -EIO;
392	}
393
394	ret = rv3029_i2c_read_regs(client, RV3029_A_SC, regs,
395				   RV3029_ALARM_SECTION_LEN);
396
397	if (ret < 0) {
398		dev_err(&client->dev, "%s: reading alarm section failed\n",
399			__func__);
400		return ret;
401	}
402
403	tm->tm_sec = bcd2bin(regs[RV3029_A_SC-RV3029_A_SC] & 0x7f);
404	tm->tm_min = bcd2bin(regs[RV3029_A_MN-RV3029_A_SC] & 0x7f);
405	tm->tm_hour = bcd2bin(regs[RV3029_A_HR-RV3029_A_SC] & 0x3f);
406	tm->tm_mday = bcd2bin(regs[RV3029_A_DT-RV3029_A_SC] & 0x3f);
407	tm->tm_mon = bcd2bin(regs[RV3029_A_MO-RV3029_A_SC] & 0x1f) - 1;
408	tm->tm_year = bcd2bin(regs[RV3029_A_YR-RV3029_A_SC] & 0x7f) + 100;
409	tm->tm_wday = bcd2bin(regs[RV3029_A_DW-RV3029_A_SC] & 0x07) - 1;
410
411	return 0;
412}
413
414static int
415rv3029_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
416{
417	return rv3029_i2c_read_alarm(to_i2c_client(dev), alarm);
418}
419
420static int rv3029_rtc_i2c_alarm_set_irq(struct i2c_client *client,
421					int enable)
422{
423	int ret;
 
 
 
 
 
 
 
 
 
 
 
 
424
425	/* enable/disable AIE irq */
426	ret = rv3029_i2c_update_bits(client, RV3029_IRQ_CTRL,
427				     RV3029_IRQ_CTRL_AIE,
428				     (enable ? RV3029_IRQ_CTRL_AIE : 0));
429	if (ret < 0) {
430		dev_err(&client->dev, "can't update INT reg\n");
431		return ret;
432	}
433
434	return 0;
435}
436
437static int rv3029_rtc_i2c_set_alarm(struct i2c_client *client,
438				    struct rtc_wkalrm *alarm)
439{
440	struct rtc_time *const tm = &alarm->time;
441	int ret;
442	u8 regs[8];
443
444	/*
445	 * The clock has an 8 bit wide bcd-coded register (they never learn)
446	 * for the year. tm_year is an offset from 1900 and we are interested
447	 * in the 2000-2099 range, so any value less than 100 is invalid.
448	*/
449	if (tm->tm_year < 100)
450		return -EINVAL;
451
452	ret = rv3029_i2c_get_sr(client, regs);
453	if (ret < 0) {
454		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
455		return -EIO;
456	}
457	regs[RV3029_A_SC-RV3029_A_SC] = bin2bcd(tm->tm_sec & 0x7f);
458	regs[RV3029_A_MN-RV3029_A_SC] = bin2bcd(tm->tm_min & 0x7f);
459	regs[RV3029_A_HR-RV3029_A_SC] = bin2bcd(tm->tm_hour & 0x3f);
460	regs[RV3029_A_DT-RV3029_A_SC] = bin2bcd(tm->tm_mday & 0x3f);
461	regs[RV3029_A_MO-RV3029_A_SC] = bin2bcd((tm->tm_mon & 0x1f) - 1);
462	regs[RV3029_A_DW-RV3029_A_SC] = bin2bcd((tm->tm_wday & 7) - 1);
463	regs[RV3029_A_YR-RV3029_A_SC] = bin2bcd((tm->tm_year & 0x7f) - 100);
464
465	ret = rv3029_i2c_write_regs(client, RV3029_A_SC, regs,
466				    RV3029_ALARM_SECTION_LEN);
467	if (ret < 0)
468		return ret;
469
470	if (alarm->enabled) {
 
 
471		/* clear AF flag */
472		ret = rv3029_i2c_update_bits(client, RV3029_IRQ_FLAGS,
473					     RV3029_IRQ_FLAGS_AF, 0);
 
 
 
 
 
 
 
474		if (ret < 0) {
475			dev_err(&client->dev, "can't clear alarm flag\n");
476			return ret;
477		}
478		/* enable AIE irq */
479		ret = rv3029_rtc_i2c_alarm_set_irq(client, 1);
480		if (ret)
481			return ret;
482
483		dev_dbg(&client->dev, "alarm IRQ armed\n");
484	} else {
485		/* disable AIE irq */
486		ret = rv3029_rtc_i2c_alarm_set_irq(client, 0);
487		if (ret)
488			return ret;
489
490		dev_dbg(&client->dev, "alarm IRQ disabled\n");
491	}
492
493	return 0;
494}
495
496static int rv3029_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
497{
498	return rv3029_rtc_i2c_set_alarm(to_i2c_client(dev), alarm);
499}
500
501static int
502rv3029_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm)
503{
504	u8 regs[8];
505	int ret;
506
507	/*
508	 * The clock has an 8 bit wide bcd-coded register (they never learn)
509	 * for the year. tm_year is an offset from 1900 and we are interested
510	 * in the 2000-2099 range, so any value less than 100 is invalid.
511	*/
512	if (tm->tm_year < 100)
513		return -EINVAL;
514
515	regs[RV3029_W_SEC-RV3029_W_SEC] = bin2bcd(tm->tm_sec);
516	regs[RV3029_W_MINUTES-RV3029_W_SEC] = bin2bcd(tm->tm_min);
517	regs[RV3029_W_HOURS-RV3029_W_SEC] = bin2bcd(tm->tm_hour);
518	regs[RV3029_W_DATE-RV3029_W_SEC] = bin2bcd(tm->tm_mday);
519	regs[RV3029_W_MONTHS-RV3029_W_SEC] = bin2bcd(tm->tm_mon+1);
520	regs[RV3029_W_DAYS-RV3029_W_SEC] = bin2bcd((tm->tm_wday & 7)+1);
521	regs[RV3029_W_YEARS-RV3029_W_SEC] = bin2bcd(tm->tm_year - 100);
522
523	ret = rv3029_i2c_write_regs(client, RV3029_W_SEC, regs,
524				    RV3029_WATCH_SECTION_LEN);
525	if (ret < 0)
526		return ret;
527
528	ret = rv3029_i2c_get_sr(client, regs);
529	if (ret < 0) {
530		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
531		return ret;
532	}
533	/* clear PON bit */
534	ret = rv3029_i2c_set_sr(client, (regs[0] & ~RV3029_STATUS_PON));
535	if (ret < 0) {
536		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
537		return ret;
538	}
539
540	return 0;
541}
542
543static int rv3029_rtc_set_time(struct device *dev, struct rtc_time *tm)
544{
545	return rv3029_i2c_set_time(to_i2c_client(dev), tm);
546}
547
548static const struct rv3029_trickle_tab_elem {
549	u32 r;		/* resistance in ohms */
550	u8 conf;	/* trickle config bits */
551} rv3029_trickle_tab[] = {
552	{
553		.r	= 1076,
554		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
555			  RV3029_TRICKLE_20K | RV3029_TRICKLE_80K,
556	}, {
557		.r	= 1091,
558		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
559			  RV3029_TRICKLE_20K,
560	}, {
561		.r	= 1137,
562		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_5K |
563			  RV3029_TRICKLE_80K,
564	}, {
565		.r	= 1154,
566		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_5K,
567	}, {
568		.r	= 1371,
569		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_20K |
570			  RV3029_TRICKLE_80K,
571	}, {
572		.r	= 1395,
573		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_20K,
574	}, {
575		.r	= 1472,
576		.conf	= RV3029_TRICKLE_1K | RV3029_TRICKLE_80K,
577	}, {
578		.r	= 1500,
579		.conf	= RV3029_TRICKLE_1K,
580	}, {
581		.r	= 3810,
582		.conf	= RV3029_TRICKLE_5K | RV3029_TRICKLE_20K |
583			  RV3029_TRICKLE_80K,
584	}, {
585		.r	= 4000,
586		.conf	= RV3029_TRICKLE_5K | RV3029_TRICKLE_20K,
587	}, {
588		.r	= 4706,
589		.conf	= RV3029_TRICKLE_5K | RV3029_TRICKLE_80K,
590	}, {
591		.r	= 5000,
592		.conf	= RV3029_TRICKLE_5K,
593	}, {
594		.r	= 16000,
595		.conf	= RV3029_TRICKLE_20K | RV3029_TRICKLE_80K,
596	}, {
597		.r	= 20000,
598		.conf	= RV3029_TRICKLE_20K,
599	}, {
600		.r	= 80000,
601		.conf	= RV3029_TRICKLE_80K,
602	},
603};
604
605static void rv3029_trickle_config(struct i2c_client *client)
606{
607	struct device_node *of_node = client->dev.of_node;
608	const struct rv3029_trickle_tab_elem *elem;
609	int i, err;
610	u32 ohms;
611	u8 trickle_set_bits;
612
613	if (!of_node)
614		return;
615
616	/* Configure the trickle charger. */
617	err = of_property_read_u32(of_node, "trickle-resistor-ohms", &ohms);
618	if (err) {
619		/* Disable trickle charger. */
620		trickle_set_bits = 0;
621	} else {
622		/* Enable trickle charger. */
623		for (i = 0; i < ARRAY_SIZE(rv3029_trickle_tab); i++) {
624			elem = &rv3029_trickle_tab[i];
625			if (elem->r >= ohms)
626				break;
627		}
628		trickle_set_bits = elem->conf;
629		dev_info(&client->dev,
630			 "Trickle charger enabled at %d ohms resistance.\n",
631			 elem->r);
632	}
633	err = rv3029_eeprom_update_bits(client, RV3029_CONTROL_E2P_EECTRL,
634					RV3029_TRICKLE_MASK,
635					trickle_set_bits);
636	if (err < 0) {
637		dev_err(&client->dev,
638			"Failed to update trickle charger config\n");
639	}
640}
641
642#ifdef CONFIG_RTC_DRV_RV3029_HWMON
643
644static int rv3029_read_temp(struct i2c_client *client, int *temp_mC)
645{
646	int ret;
647	u8 temp;
648
649	ret = rv3029_i2c_read_regs(client, RV3029_TEMP_PAGE, &temp, 1);
650	if (ret < 0)
651		return ret;
652
653	*temp_mC = ((int)temp - 60) * 1000;
654
655	return 0;
656}
657
658static ssize_t rv3029_hwmon_show_temp(struct device *dev,
659				      struct device_attribute *attr,
660				      char *buf)
661{
662	struct i2c_client *client = dev_get_drvdata(dev);
663	int ret, temp_mC;
664
665	ret = rv3029_read_temp(client, &temp_mC);
666	if (ret < 0)
667		return ret;
668
669	return sprintf(buf, "%d\n", temp_mC);
670}
671
672static ssize_t rv3029_hwmon_set_update_interval(struct device *dev,
673						struct device_attribute *attr,
674						const char *buf,
675						size_t count)
676{
677	struct i2c_client *client = dev_get_drvdata(dev);
678	unsigned long interval_ms;
679	int ret;
680	u8 th_set_bits = 0;
681
682	ret = kstrtoul(buf, 10, &interval_ms);
683	if (ret < 0)
684		return ret;
685
686	if (interval_ms != 0) {
687		th_set_bits |= RV3029_EECTRL_THE;
688		if (interval_ms >= 16000)
689			th_set_bits |= RV3029_EECTRL_THP;
690	}
691	ret = rv3029_eeprom_update_bits(client, RV3029_CONTROL_E2P_EECTRL,
692					RV3029_EECTRL_THE | RV3029_EECTRL_THP,
693					th_set_bits);
694	if (ret < 0)
695		return ret;
696
697	return count;
698}
699
700static ssize_t rv3029_hwmon_show_update_interval(struct device *dev,
701						 struct device_attribute *attr,
702						 char *buf)
703{
704	struct i2c_client *client = dev_get_drvdata(dev);
705	int ret, interval_ms;
706	u8 eectrl;
707
708	ret = rv3029_eeprom_read(client, RV3029_CONTROL_E2P_EECTRL,
709				 &eectrl, 1);
710	if (ret < 0)
711		return ret;
712
713	if (eectrl & RV3029_EECTRL_THE) {
714		if (eectrl & RV3029_EECTRL_THP)
715			interval_ms = 16000;
716		else
717			interval_ms = 1000;
718	} else {
719		interval_ms = 0;
720	}
721
722	return sprintf(buf, "%d\n", interval_ms);
723}
724
725static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, rv3029_hwmon_show_temp,
726			  NULL, 0);
727static SENSOR_DEVICE_ATTR(update_interval, S_IWUSR | S_IRUGO,
728			  rv3029_hwmon_show_update_interval,
729			  rv3029_hwmon_set_update_interval, 0);
730
731static struct attribute *rv3029_hwmon_attrs[] = {
732	&sensor_dev_attr_temp1_input.dev_attr.attr,
733	&sensor_dev_attr_update_interval.dev_attr.attr,
734	NULL,
735};
736ATTRIBUTE_GROUPS(rv3029_hwmon);
737
738static void rv3029_hwmon_register(struct i2c_client *client)
739{
740	struct device *hwmon_dev;
741
742	hwmon_dev = devm_hwmon_device_register_with_groups(
743		&client->dev, client->name, client, rv3029_hwmon_groups);
744	if (IS_ERR(hwmon_dev)) {
745		dev_warn(&client->dev,
746			"unable to register hwmon device %ld\n",
747			PTR_ERR(hwmon_dev));
748	}
749}
750
751#else /* CONFIG_RTC_DRV_RV3029_HWMON */
752
753static void rv3029_hwmon_register(struct i2c_client *client)
754{
755}
756
757#endif /* CONFIG_RTC_DRV_RV3029_HWMON */
758
759static const struct rtc_class_ops rv3029_rtc_ops = {
760	.read_time	= rv3029_rtc_read_time,
761	.set_time	= rv3029_rtc_set_time,
762	.read_alarm	= rv3029_rtc_read_alarm,
763	.set_alarm	= rv3029_rtc_set_alarm,
764};
765
766static struct i2c_device_id rv3029_id[] = {
767	{ "rv3029", 0 },
768	{ "rv3029c2", 0 },
769	{ }
770};
771MODULE_DEVICE_TABLE(i2c, rv3029_id);
772
773static int rv3029_probe(struct i2c_client *client,
774			const struct i2c_device_id *id)
775{
776	struct rtc_device *rtc;
777	int rc = 0;
778	u8 buf[1];
779
780	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL))
781		return -ENODEV;
782
783	rc = rv3029_i2c_get_sr(client, buf);
 
 
 
 
 
 
 
 
 
784	if (rc < 0) {
785		dev_err(&client->dev, "reading status failed\n");
786		return rc;
787	}
788
789	rv3029_trickle_config(client);
790	rv3029_hwmon_register(client);
791
792	rtc = devm_rtc_device_register(&client->dev, client->name,
793				       &rv3029_rtc_ops, THIS_MODULE);
794
795	if (IS_ERR(rtc))
796		return PTR_ERR(rtc);
797
798	i2c_set_clientdata(client, rtc);
 
 
 
 
799
800	return 0;
801}
802
803static struct i2c_driver rv3029_driver = {
804	.driver = {
805		.name = "rtc-rv3029c2",
806	},
807	.probe		= rv3029_probe,
808	.id_table	= rv3029_id,
 
809};
810
811module_i2c_driver(rv3029_driver);
812
813MODULE_AUTHOR("Gregory Hermant <gregory.hermant@calao-systems.com>");
814MODULE_AUTHOR("Michael Buesch <m@bues.ch>");
815MODULE_DESCRIPTION("Micro Crystal RV3029 RTC driver");
816MODULE_LICENSE("GPL");
v3.5.6
  1/*
  2 * Micro Crystal RV-3029C2 rtc class driver
  3 *
  4 * Author: Gregory Hermant <gregory.hermant@calao-systems.com>
 
  5 *
  6 * based on previously existing rtc class drivers
  7 *
  8 * This program is free software; you can redistribute it and/or modify
  9 * it under the terms of the GNU General Public License version 2 as
 10 * published by the Free Software Foundation.
 11 *
 12 * NOTE: Currently this driver only supports the bare minimum for read
 13 * and write the RTC and alarms. The extra features provided by this chip
 14 * (trickle charger, eeprom, T° compensation) are unavailable.
 15 */
 16
 17#include <linux/module.h>
 18#include <linux/i2c.h>
 19#include <linux/bcd.h>
 20#include <linux/rtc.h>
 
 
 
 
 
 21
 22/* Register map */
 23/* control section */
 24#define RV3029C2_ONOFF_CTRL		0x00
 25#define RV3029C2_IRQ_CTRL		0x01
 26#define RV3029C2_IRQ_CTRL_AIE		(1 << 0)
 27#define RV3029C2_IRQ_FLAGS		0x02
 28#define RV3029C2_IRQ_FLAGS_AF		(1 << 0)
 29#define RV3029C2_STATUS			0x03
 30#define RV3029C2_STATUS_VLOW1		(1 << 2)
 31#define RV3029C2_STATUS_VLOW2		(1 << 3)
 32#define RV3029C2_STATUS_SR		(1 << 4)
 33#define RV3029C2_STATUS_PON		(1 << 5)
 34#define RV3029C2_STATUS_EEBUSY		(1 << 7)
 35#define RV3029C2_RST_CTRL		0x04
 36#define RV3029C2_CONTROL_SECTION_LEN	0x05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 37
 38/* watch section */
 39#define RV3029C2_W_SEC			0x08
 40#define RV3029C2_W_MINUTES		0x09
 41#define RV3029C2_W_HOURS		0x0A
 42#define RV3029C2_REG_HR_12_24		(1<<6)  /* 24h/12h mode */
 43#define RV3029C2_REG_HR_PM		(1<<5)  /* PM/AM bit in 12h mode */
 44#define RV3029C2_W_DATE			0x0B
 45#define RV3029C2_W_DAYS			0x0C
 46#define RV3029C2_W_MONTHS		0x0D
 47#define RV3029C2_W_YEARS		0x0E
 48#define RV3029C2_WATCH_SECTION_LEN	0x07
 49
 50/* alarm section */
 51#define RV3029C2_A_SC			0x10
 52#define RV3029C2_A_MN			0x11
 53#define RV3029C2_A_HR			0x12
 54#define RV3029C2_A_DT			0x13
 55#define RV3029C2_A_DW			0x14
 56#define RV3029C2_A_MO			0x15
 57#define RV3029C2_A_YR			0x16
 58#define RV3029C2_ALARM_SECTION_LEN	0x07
 59
 60/* timer section */
 61#define RV3029C2_TIMER_LOW		0x18
 62#define RV3029C2_TIMER_HIGH		0x19
 63
 64/* temperature section */
 65#define RV3029C2_TEMP_PAGE		0x20
 66
 67/* eeprom data section */
 68#define RV3029C2_E2P_EEDATA1		0x28
 69#define RV3029C2_E2P_EEDATA2		0x29
 
 70
 71/* eeprom control section */
 72#define RV3029C2_CONTROL_E2P_EECTRL	0x30
 73#define RV3029C2_TRICKLE_1K		(1<<0)  /*  1K resistance */
 74#define RV3029C2_TRICKLE_5K		(1<<1)  /*  5K resistance */
 75#define RV3029C2_TRICKLE_20K		(1<<2)  /* 20K resistance */
 76#define RV3029C2_TRICKLE_80K		(1<<3)  /* 80K resistance */
 77#define RV3029C2_CONTROL_E2P_XTALOFFSET	0x31
 78#define RV3029C2_CONTROL_E2P_QCOEF	0x32
 79#define RV3029C2_CONTROL_E2P_TURNOVER	0x33
 
 
 
 
 
 
 
 
 
 
 
 80
 81/* user ram section */
 82#define RV3029C2_USR1_RAM_PAGE		0x38
 83#define RV3029C2_USR1_SECTION_LEN	0x04
 84#define RV3029C2_USR2_RAM_PAGE		0x3C
 85#define RV3029C2_USR2_SECTION_LEN	0x04
 86
 87static int
 88rv3029c2_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf,
 89	unsigned len)
 90{
 91	int ret;
 92
 93	if ((reg > RV3029C2_USR1_RAM_PAGE + 7) ||
 94		(reg + len > RV3029C2_USR1_RAM_PAGE + 8))
 95		return -EINVAL;
 96
 97	ret = i2c_smbus_read_i2c_block_data(client, reg, len, buf);
 98	if (ret < 0)
 99		return ret;
100	if (ret < len)
101		return -EIO;
102	return 0;
103}
104
105static int
106rv3029c2_i2c_write_regs(struct i2c_client *client, u8 reg, u8 const buf[],
107			unsigned len)
108{
109	if ((reg > RV3029C2_USR1_RAM_PAGE + 7) ||
110		(reg + len > RV3029C2_USR1_RAM_PAGE + 8))
111		return -EINVAL;
112
113	return i2c_smbus_write_i2c_block_data(client, reg, len, buf);
114}
115
116static int
117rv3029c2_i2c_get_sr(struct i2c_client *client, u8 *buf)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118{
119	int ret = rv3029c2_i2c_read_regs(client, RV3029C2_STATUS, buf, 1);
120
121	if (ret < 0)
122		return -EIO;
123	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
124	return 0;
125}
126
127static int
128rv3029c2_i2c_set_sr(struct i2c_client *client, u8 val)
129{
130	u8 buf[1];
131	int sr;
132
133	buf[0] = val;
134	sr = rv3029c2_i2c_write_regs(client, RV3029C2_STATUS, buf, 1);
135	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
136	if (sr < 0)
137		return -EIO;
138	return 0;
139}
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141static int
142rv3029c2_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
143{
144	u8 buf[1];
145	int ret;
146	u8 regs[RV3029C2_WATCH_SECTION_LEN] = { 0, };
147
148	ret = rv3029c2_i2c_get_sr(client, buf);
149	if (ret < 0) {
150		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
151		return -EIO;
152	}
153
154	ret = rv3029c2_i2c_read_regs(client, RV3029C2_W_SEC , regs,
155					RV3029C2_WATCH_SECTION_LEN);
156	if (ret < 0) {
157		dev_err(&client->dev, "%s: reading RTC section failed\n",
158			__func__);
159		return ret;
160	}
161
162	tm->tm_sec = bcd2bin(regs[RV3029C2_W_SEC-RV3029C2_W_SEC]);
163	tm->tm_min = bcd2bin(regs[RV3029C2_W_MINUTES-RV3029C2_W_SEC]);
164
165	/* HR field has a more complex interpretation */
166	{
167		const u8 _hr = regs[RV3029C2_W_HOURS-RV3029C2_W_SEC];
168		if (_hr & RV3029C2_REG_HR_12_24) {
 
169			/* 12h format */
170			tm->tm_hour = bcd2bin(_hr & 0x1f);
171			if (_hr & RV3029C2_REG_HR_PM)	/* PM flag set */
172				tm->tm_hour += 12;
173		} else /* 24h format */
174			tm->tm_hour = bcd2bin(_hr & 0x3f);
175	}
176
177	tm->tm_mday = bcd2bin(regs[RV3029C2_W_DATE-RV3029C2_W_SEC]);
178	tm->tm_mon = bcd2bin(regs[RV3029C2_W_MONTHS-RV3029C2_W_SEC]) - 1;
179	tm->tm_year = bcd2bin(regs[RV3029C2_W_YEARS-RV3029C2_W_SEC]) + 100;
180	tm->tm_wday = bcd2bin(regs[RV3029C2_W_DAYS-RV3029C2_W_SEC]) - 1;
181
182	return 0;
183}
184
185static int rv3029c2_rtc_read_time(struct device *dev, struct rtc_time *tm)
186{
187	return rv3029c2_i2c_read_time(to_i2c_client(dev), tm);
188}
189
190static int
191rv3029c2_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm)
192{
193	struct rtc_time *const tm = &alarm->time;
194	int ret;
195	u8 regs[8];
196
197	ret = rv3029c2_i2c_get_sr(client, regs);
198	if (ret < 0) {
199		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
200		return -EIO;
201	}
202
203	ret = rv3029c2_i2c_read_regs(client, RV3029C2_A_SC, regs,
204					RV3029C2_ALARM_SECTION_LEN);
205
206	if (ret < 0) {
207		dev_err(&client->dev, "%s: reading alarm section failed\n",
208			__func__);
209		return ret;
210	}
211
212	tm->tm_sec = bcd2bin(regs[RV3029C2_A_SC-RV3029C2_A_SC] & 0x7f);
213	tm->tm_min = bcd2bin(regs[RV3029C2_A_MN-RV3029C2_A_SC] & 0x7f);
214	tm->tm_hour = bcd2bin(regs[RV3029C2_A_HR-RV3029C2_A_SC] & 0x3f);
215	tm->tm_mday = bcd2bin(regs[RV3029C2_A_DT-RV3029C2_A_SC] & 0x3f);
216	tm->tm_mon = bcd2bin(regs[RV3029C2_A_MO-RV3029C2_A_SC] & 0x1f) - 1;
217	tm->tm_year = bcd2bin(regs[RV3029C2_A_YR-RV3029C2_A_SC] & 0x7f) + 100;
218	tm->tm_wday = bcd2bin(regs[RV3029C2_A_DW-RV3029C2_A_SC] & 0x07) - 1;
219
220	return 0;
221}
222
223static int
224rv3029c2_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
225{
226	return rv3029c2_i2c_read_alarm(to_i2c_client(dev), alarm);
227}
228
229static int rv3029c2_rtc_i2c_alarm_set_irq(struct i2c_client *client,
230					int enable)
231{
232	int ret;
233	u8 buf[1];
234
235	/* enable AIE irq */
236	ret = rv3029c2_i2c_read_regs(client, RV3029C2_IRQ_CTRL,	buf, 1);
237	if (ret < 0) {
238		dev_err(&client->dev, "can't read INT reg\n");
239		return ret;
240	}
241	if (enable)
242		buf[0] |= RV3029C2_IRQ_CTRL_AIE;
243	else
244		buf[0] &= ~RV3029C2_IRQ_CTRL_AIE;
245
246	ret = rv3029c2_i2c_write_regs(client, RV3029C2_IRQ_CTRL, buf, 1);
 
 
 
247	if (ret < 0) {
248		dev_err(&client->dev, "can't set INT reg\n");
249		return ret;
250	}
251
252	return 0;
253}
254
255static int rv3029c2_rtc_i2c_set_alarm(struct i2c_client *client,
256					struct rtc_wkalrm *alarm)
257{
258	struct rtc_time *const tm = &alarm->time;
259	int ret;
260	u8 regs[8];
261
262	/*
263	 * The clock has an 8 bit wide bcd-coded register (they never learn)
264	 * for the year. tm_year is an offset from 1900 and we are interested
265	 * in the 2000-2099 range, so any value less than 100 is invalid.
266	*/
267	if (tm->tm_year < 100)
268		return -EINVAL;
269
270	ret = rv3029c2_i2c_get_sr(client, regs);
271	if (ret < 0) {
272		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
273		return -EIO;
274	}
275	regs[RV3029C2_A_SC-RV3029C2_A_SC] = bin2bcd(tm->tm_sec & 0x7f);
276	regs[RV3029C2_A_MN-RV3029C2_A_SC] = bin2bcd(tm->tm_min & 0x7f);
277	regs[RV3029C2_A_HR-RV3029C2_A_SC] = bin2bcd(tm->tm_hour & 0x3f);
278	regs[RV3029C2_A_DT-RV3029C2_A_SC] = bin2bcd(tm->tm_mday & 0x3f);
279	regs[RV3029C2_A_MO-RV3029C2_A_SC] = bin2bcd((tm->tm_mon & 0x1f) - 1);
280	regs[RV3029C2_A_DW-RV3029C2_A_SC] = bin2bcd((tm->tm_wday & 7) - 1);
281	regs[RV3029C2_A_YR-RV3029C2_A_SC] = bin2bcd((tm->tm_year & 0x7f) - 100);
282
283	ret = rv3029c2_i2c_write_regs(client, RV3029C2_A_SC, regs,
284					RV3029C2_ALARM_SECTION_LEN);
285	if (ret < 0)
286		return ret;
287
288	if (alarm->enabled) {
289		u8 buf[1];
290
291		/* clear AF flag */
292		ret = rv3029c2_i2c_read_regs(client, RV3029C2_IRQ_FLAGS,
293						buf, 1);
294		if (ret < 0) {
295			dev_err(&client->dev, "can't read alarm flag\n");
296			return ret;
297		}
298		buf[0] &= ~RV3029C2_IRQ_FLAGS_AF;
299		ret = rv3029c2_i2c_write_regs(client, RV3029C2_IRQ_FLAGS,
300						buf, 1);
301		if (ret < 0) {
302			dev_err(&client->dev, "can't set alarm flag\n");
303			return ret;
304		}
305		/* enable AIE irq */
306		ret = rv3029c2_rtc_i2c_alarm_set_irq(client, 1);
307		if (ret)
308			return ret;
309
310		dev_dbg(&client->dev, "alarm IRQ armed\n");
311	} else {
312		/* disable AIE irq */
313		ret = rv3029c2_rtc_i2c_alarm_set_irq(client, 1);
314		if (ret)
315			return ret;
316
317		dev_dbg(&client->dev, "alarm IRQ disabled\n");
318	}
319
320	return 0;
321}
322
323static int rv3029c2_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
324{
325	return rv3029c2_rtc_i2c_set_alarm(to_i2c_client(dev), alarm);
326}
327
328static int
329rv3029c2_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm)
330{
331	u8 regs[8];
332	int ret;
333
334	/*
335	 * The clock has an 8 bit wide bcd-coded register (they never learn)
336	 * for the year. tm_year is an offset from 1900 and we are interested
337	 * in the 2000-2099 range, so any value less than 100 is invalid.
338	*/
339	if (tm->tm_year < 100)
340		return -EINVAL;
341
342	regs[RV3029C2_W_SEC-RV3029C2_W_SEC] = bin2bcd(tm->tm_sec);
343	regs[RV3029C2_W_MINUTES-RV3029C2_W_SEC] = bin2bcd(tm->tm_min);
344	regs[RV3029C2_W_HOURS-RV3029C2_W_SEC] = bin2bcd(tm->tm_hour);
345	regs[RV3029C2_W_DATE-RV3029C2_W_SEC] = bin2bcd(tm->tm_mday);
346	regs[RV3029C2_W_MONTHS-RV3029C2_W_SEC] = bin2bcd(tm->tm_mon+1);
347	regs[RV3029C2_W_DAYS-RV3029C2_W_SEC] = bin2bcd((tm->tm_wday & 7)+1);
348	regs[RV3029C2_W_YEARS-RV3029C2_W_SEC] = bin2bcd(tm->tm_year - 100);
349
350	ret = rv3029c2_i2c_write_regs(client, RV3029C2_W_SEC, regs,
351					RV3029C2_WATCH_SECTION_LEN);
352	if (ret < 0)
353		return ret;
354
355	ret = rv3029c2_i2c_get_sr(client, regs);
356	if (ret < 0) {
357		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
358		return ret;
359	}
360	/* clear PON bit */
361	ret = rv3029c2_i2c_set_sr(client, (regs[0] & ~RV3029C2_STATUS_PON));
362	if (ret < 0) {
363		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
364		return ret;
365	}
366
367	return 0;
368}
369
370static int rv3029c2_rtc_set_time(struct device *dev, struct rtc_time *tm)
371{
372	return rv3029c2_i2c_set_time(to_i2c_client(dev), tm);
373}
374
375static const struct rtc_class_ops rv3029c2_rtc_ops = {
376	.read_time	= rv3029c2_rtc_read_time,
377	.set_time	= rv3029c2_rtc_set_time,
378	.read_alarm	= rv3029c2_rtc_read_alarm,
379	.set_alarm	= rv3029c2_rtc_set_alarm,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
380};
381
382static struct i2c_device_id rv3029c2_id[] = {
 
383	{ "rv3029c2", 0 },
384	{ }
385};
386MODULE_DEVICE_TABLE(i2c, rv3029c2_id);
387
388static int __devinit
389rv3029c2_probe(struct i2c_client *client, const struct i2c_device_id *id)
390{
391	struct rtc_device *rtc;
392	int rc = 0;
393	u8 buf[1];
394
395	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL))
396		return -ENODEV;
397
398	rtc = rtc_device_register(client->name,
399				&client->dev, &rv3029c2_rtc_ops,
400				THIS_MODULE);
401
402	if (IS_ERR(rtc))
403		return PTR_ERR(rtc);
404
405	i2c_set_clientdata(client, rtc);
406
407	rc = rv3029c2_i2c_get_sr(client, buf);
408	if (rc < 0) {
409		dev_err(&client->dev, "reading status failed\n");
410		goto exit_unregister;
411	}
412
413	return 0;
 
414
415exit_unregister:
416	rtc_device_unregister(rtc);
417
418	return rc;
419}
420
421static int __devexit rv3029c2_remove(struct i2c_client *client)
422{
423	struct rtc_device *rtc = i2c_get_clientdata(client);
424
425	rtc_device_unregister(rtc);
426
427	return 0;
428}
429
430static struct i2c_driver rv3029c2_driver = {
431	.driver = {
432		.name = "rtc-rv3029c2",
433	},
434	.probe = rv3029c2_probe,
435	.remove = __devexit_p(rv3029c2_remove),
436	.id_table = rv3029c2_id,
437};
438
439module_i2c_driver(rv3029c2_driver);
440
441MODULE_AUTHOR("Gregory Hermant <gregory.hermant@calao-systems.com>");
442MODULE_DESCRIPTION("Micro Crystal RV3029C2 RTC driver");
 
443MODULE_LICENSE("GPL");