152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/*
252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * Micro Crystal RV-3029C2 rtc class driver
352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher *
452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * Author: Gregory Hermant <gregory.hermant@calao-systems.com>
552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher *
652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * based on previously existing rtc class drivers
752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher *
852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * This program is free software; you can redistribute it and/or modify
952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * it under the terms of the GNU General Public License version 2 as
1052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * published by the Free Software Foundation.
1152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher *
1252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * NOTE: Currently this driver only supports the bare minimum for read
1352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * and write the RTC and alarms. The extra features provided by this chip
1452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher * (trickle charger, eeprom, T° compensation) are unavailable.
1552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher */
1652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
1752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#include <linux/module.h>
1852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#include <linux/i2c.h>
1952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#include <linux/bcd.h>
2052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#include <linux/rtc.h>
2152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
2252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* Register map */
2352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* control section */
2452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_ONOFF_CTRL		0x00
2552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_IRQ_CTRL		0x01
2652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_IRQ_CTRL_AIE		(1 << 0)
2752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_IRQ_FLAGS		0x02
2852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_IRQ_FLAGS_AF		(1 << 0)
2952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS			0x03
3052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS_VLOW1		(1 << 2)
3152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS_VLOW2		(1 << 3)
3252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS_SR		(1 << 4)
3352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS_PON		(1 << 5)
3452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_STATUS_EEBUSY		(1 << 7)
3552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_RST_CTRL		0x04
3652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_CONTROL_SECTION_LEN	0x05
3752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
3852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* watch section */
3952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_SEC			0x08
4052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_MINUTES		0x09
4152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_HOURS		0x0A
4252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_REG_HR_12_24		(1<<6)  /* 24h/12h mode */
4352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_REG_HR_PM		(1<<5)  /* PM/AM bit in 12h mode */
4452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_DATE			0x0B
4552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_DAYS			0x0C
4652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_MONTHS		0x0D
4752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_W_YEARS		0x0E
4852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_WATCH_SECTION_LEN	0x07
4952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
5052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* alarm section */
5152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_SC			0x10
5252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_MN			0x11
5352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_HR			0x12
5452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_DT			0x13
5552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_DW			0x14
5652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_MO			0x15
5752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_A_YR			0x16
5852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_ALARM_SECTION_LEN	0x07
5952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
6052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* timer section */
6152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TIMER_LOW		0x18
6252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TIMER_HIGH		0x19
6352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
6452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* temperature section */
6552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TEMP_PAGE		0x20
6652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
6752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* eeprom data section */
6852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_E2P_EEDATA1		0x28
6952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_E2P_EEDATA2		0x29
7052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
7152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* eeprom control section */
7252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_CONTROL_E2P_EECTRL	0x30
7352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TRICKLE_1K		(1<<0)  /*  1K resistance */
7452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TRICKLE_5K		(1<<1)  /*  5K resistance */
7552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TRICKLE_20K		(1<<2)  /* 20K resistance */
7652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_TRICKLE_80K		(1<<3)  /* 80K resistance */
7752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_CONTROL_E2P_XTALOFFSET	0x31
7852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_CONTROL_E2P_QCOEF	0x32
7952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_CONTROL_E2P_TURNOVER	0x33
8052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
8152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher/* user ram section */
8252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_USR1_RAM_PAGE		0x38
8352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_USR1_SECTION_LEN	0x04
8452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_USR2_RAM_PAGE		0x3C
8552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher#define RV3029C2_USR2_SECTION_LEN	0x04
8652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
8752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
8852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_read_regs(struct i2c_client *client, u8 reg, u8 *buf,
8952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	unsigned len)
9052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
9152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
9252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
9352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if ((reg > RV3029C2_USR1_RAM_PAGE + 7) ||
9452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		(reg + len > RV3029C2_USR1_RAM_PAGE + 8))
9552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EINVAL;
9652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
9752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = i2c_smbus_read_i2c_block_data(client, reg, len, buf);
9852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0)
9952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
10052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < len)
10152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
10252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
10352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
10452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
10552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
10652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_write_regs(struct i2c_client *client, u8 reg, u8 const buf[],
10752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			unsigned len)
10852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
10952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if ((reg > RV3029C2_USR1_RAM_PAGE + 7) ||
11052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		(reg + len > RV3029C2_USR1_RAM_PAGE + 8))
11152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EINVAL;
11252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
11352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return i2c_smbus_write_i2c_block_data(client, reg, len, buf);
11452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
11552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
11652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
11752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_get_sr(struct i2c_client *client, u8 *buf)
11852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
11952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret = rv3029c2_i2c_read_regs(client, RV3029C2_STATUS, buf, 1);
12052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
12152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0)
12252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
12352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
12452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
12552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
12652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
12752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
12852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_set_sr(struct i2c_client *client, u8 val)
12952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
13052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 buf[1];
13152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int sr;
13252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
13352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	buf[0] = val;
13452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	sr = rv3029c2_i2c_write_regs(client, RV3029C2_STATUS, buf, 1);
13552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	dev_dbg(&client->dev, "status = 0x%.2x (%d)\n", buf[0], buf[0]);
13652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (sr < 0)
13752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
13852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
13952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
14052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
14152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
14252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
14352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
14452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 buf[1];
14552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
14652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 regs[RV3029C2_WATCH_SECTION_LEN] = { 0, };
14752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
14852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_get_sr(client, buf);
14952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
15052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
15152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
15252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
15352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
15452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_read_regs(client, RV3029C2_W_SEC , regs,
15552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					RV3029C2_WATCH_SECTION_LEN);
15652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
15752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading RTC section failed\n",
15852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			__func__);
15952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
16052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
16152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
16252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_sec = bcd2bin(regs[RV3029C2_W_SEC-RV3029C2_W_SEC]);
16352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_min = bcd2bin(regs[RV3029C2_W_MINUTES-RV3029C2_W_SEC]);
16452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
16552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	/* HR field has a more complex interpretation */
16652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	{
16752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		const u8 _hr = regs[RV3029C2_W_HOURS-RV3029C2_W_SEC];
16852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		if (_hr & RV3029C2_REG_HR_12_24) {
16952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			/* 12h format */
17052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			tm->tm_hour = bcd2bin(_hr & 0x1f);
17152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			if (_hr & RV3029C2_REG_HR_PM)	/* PM flag set */
17252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher				tm->tm_hour += 12;
17352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		} else /* 24h format */
17452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			tm->tm_hour = bcd2bin(_hr & 0x3f);
17552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
17652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
17752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_mday = bcd2bin(regs[RV3029C2_W_DATE-RV3029C2_W_SEC]);
17852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_mon = bcd2bin(regs[RV3029C2_W_MONTHS-RV3029C2_W_SEC]) - 1;
17952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_year = bcd2bin(regs[RV3029C2_W_YEARS-RV3029C2_W_SEC]) + 100;
18052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_wday = bcd2bin(regs[RV3029C2_W_DAYS-RV3029C2_W_SEC]) - 1;
18152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
18252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
18352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
18452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
18552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int rv3029c2_rtc_read_time(struct device *dev, struct rtc_time *tm)
18652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
18752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return rv3029c2_i2c_read_time(to_i2c_client(dev), tm);
18852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
18952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
19052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
19152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm)
19252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
19352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	struct rtc_time *const tm = &alarm->time;
19452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
19552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 regs[8];
19652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
19752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_get_sr(client, regs);
19852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
19952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
20052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
20152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
20252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
20352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_read_regs(client, RV3029C2_A_SC, regs,
20452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					RV3029C2_ALARM_SECTION_LEN);
20552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
20652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
20752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading alarm section failed\n",
20852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			__func__);
20952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
21052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
21152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
21252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_sec = bcd2bin(regs[RV3029C2_A_SC-RV3029C2_A_SC] & 0x7f);
21352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_min = bcd2bin(regs[RV3029C2_A_MN-RV3029C2_A_SC] & 0x7f);
21452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_hour = bcd2bin(regs[RV3029C2_A_HR-RV3029C2_A_SC] & 0x3f);
21552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_mday = bcd2bin(regs[RV3029C2_A_DT-RV3029C2_A_SC] & 0x3f);
21652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_mon = bcd2bin(regs[RV3029C2_A_MO-RV3029C2_A_SC] & 0x1f) - 1;
21752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_year = bcd2bin(regs[RV3029C2_A_YR-RV3029C2_A_SC] & 0x7f) + 100;
21852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	tm->tm_wday = bcd2bin(regs[RV3029C2_A_DW-RV3029C2_A_SC] & 0x07) - 1;
21952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
22052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
22152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
22252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
22352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
22452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
22552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
22652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return rv3029c2_i2c_read_alarm(to_i2c_client(dev), alarm);
22752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
22852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
22952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int rv3029c2_rtc_i2c_alarm_set_irq(struct i2c_client *client,
23052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					int enable)
23152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
23252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
23352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 buf[1];
23452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
23552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	/* enable AIE irq */
23652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_read_regs(client, RV3029C2_IRQ_CTRL,	buf, 1);
23752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
23852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "can't read INT reg\n");
23952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
24052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
24152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (enable)
24252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		buf[0] |= RV3029C2_IRQ_CTRL_AIE;
24352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	else
24452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		buf[0] &= ~RV3029C2_IRQ_CTRL_AIE;
24552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
24652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_write_regs(client, RV3029C2_IRQ_CTRL, buf, 1);
24752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
24852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "can't set INT reg\n");
24952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
25052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
25152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
25252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
25352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
25452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
25552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int rv3029c2_rtc_i2c_set_alarm(struct i2c_client *client,
25652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					struct rtc_wkalrm *alarm)
25752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
25852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	struct rtc_time *const tm = &alarm->time;
25952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
26052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 regs[8];
26152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
26252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	/*
26352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * The clock has an 8 bit wide bcd-coded register (they never learn)
26452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * for the year. tm_year is an offset from 1900 and we are interested
26552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * in the 2000-2099 range, so any value less than 100 is invalid.
26652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	*/
26752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (tm->tm_year < 100)
26852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EINVAL;
26952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
27052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_get_sr(client, regs);
27152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
27252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
27352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EIO;
27452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
27552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_SC-RV3029C2_A_SC] = bin2bcd(tm->tm_sec & 0x7f);
27652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_MN-RV3029C2_A_SC] = bin2bcd(tm->tm_min & 0x7f);
27752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_HR-RV3029C2_A_SC] = bin2bcd(tm->tm_hour & 0x3f);
27852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_DT-RV3029C2_A_SC] = bin2bcd(tm->tm_mday & 0x3f);
27952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_MO-RV3029C2_A_SC] = bin2bcd((tm->tm_mon & 0x1f) - 1);
28052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_DW-RV3029C2_A_SC] = bin2bcd((tm->tm_wday & 7) - 1);
28152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_A_YR-RV3029C2_A_SC] = bin2bcd((tm->tm_year & 0x7f) - 100);
28252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
28352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_write_regs(client, RV3029C2_A_SC, regs,
28452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					RV3029C2_ALARM_SECTION_LEN);
28552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0)
28652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
28752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
28852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (alarm->enabled) {
28952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		u8 buf[1];
29052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
29152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		/* clear AF flag */
29252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		ret = rv3029c2_i2c_read_regs(client, RV3029C2_IRQ_FLAGS,
29352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher						buf, 1);
29452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		if (ret < 0) {
29552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			dev_err(&client->dev, "can't read alarm flag\n");
29652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			return ret;
29752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		}
29852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		buf[0] &= ~RV3029C2_IRQ_FLAGS_AF;
29952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		ret = rv3029c2_i2c_write_regs(client, RV3029C2_IRQ_FLAGS,
30052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher						buf, 1);
30152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		if (ret < 0) {
30252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			dev_err(&client->dev, "can't set alarm flag\n");
30352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			return ret;
30452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		}
30552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		/* enable AIE irq */
30652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		ret = rv3029c2_rtc_i2c_alarm_set_irq(client, 1);
30752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		if (ret)
30852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			return ret;
30952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
31052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_dbg(&client->dev, "alarm IRQ armed\n");
31152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	} else {
31252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		/* disable AIE irq */
31329ecd78c0fd6ee05f2c6b07b23823a6ae43c13ffAxel Lin		ret = rv3029c2_rtc_i2c_alarm_set_irq(client, 0);
31452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		if (ret)
31552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher			return ret;
31652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
31752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_dbg(&client->dev, "alarm IRQ disabled\n");
31852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
31952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
32052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
32152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
32252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
32352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int rv3029c2_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
32452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
32552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return rv3029c2_rtc_i2c_set_alarm(to_i2c_client(dev), alarm);
32652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
32752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
32852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int
32952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherrv3029c2_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm)
33052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
33152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 regs[8];
33252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int ret;
33352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
33452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	/*
33552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * The clock has an 8 bit wide bcd-coded register (they never learn)
33652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * for the year. tm_year is an offset from 1900 and we are interested
33752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	 * in the 2000-2099 range, so any value less than 100 is invalid.
33852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	*/
33952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (tm->tm_year < 100)
34052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -EINVAL;
34152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
34252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_SEC-RV3029C2_W_SEC] = bin2bcd(tm->tm_sec);
34352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_MINUTES-RV3029C2_W_SEC] = bin2bcd(tm->tm_min);
34452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_HOURS-RV3029C2_W_SEC] = bin2bcd(tm->tm_hour);
34552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_DATE-RV3029C2_W_SEC] = bin2bcd(tm->tm_mday);
34652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_MONTHS-RV3029C2_W_SEC] = bin2bcd(tm->tm_mon+1);
34752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_DAYS-RV3029C2_W_SEC] = bin2bcd((tm->tm_wday & 7)+1);
34852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	regs[RV3029C2_W_YEARS-RV3029C2_W_SEC] = bin2bcd(tm->tm_year - 100);
34952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
35052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_write_regs(client, RV3029C2_W_SEC, regs,
35152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher					RV3029C2_WATCH_SECTION_LEN);
35252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0)
35352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
35452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
35552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_get_sr(client, regs);
35652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
35752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
35852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
35952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
36052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	/* clear PON bit */
36152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	ret = rv3029c2_i2c_set_sr(client, (regs[0] & ~RV3029C2_STATUS_PON));
36252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (ret < 0) {
36352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
36452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return ret;
36552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	}
36652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
36752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
36852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
36952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
37052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic int rv3029c2_rtc_set_time(struct device *dev, struct rtc_time *tm)
37152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
37252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return rv3029c2_i2c_set_time(to_i2c_client(dev), tm);
37352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
37452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
37552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic const struct rtc_class_ops rv3029c2_rtc_ops = {
37652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.read_time	= rv3029c2_rtc_read_time,
37752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.set_time	= rv3029c2_rtc_set_time,
37852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.read_alarm	= rv3029c2_rtc_read_alarm,
37952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.set_alarm	= rv3029c2_rtc_set_alarm,
38052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher};
38152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
38252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic struct i2c_device_id rv3029c2_id[] = {
38352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	{ "rv3029c2", 0 },
38452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	{ }
38552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher};
38652365230eed7e291bbb2a015465cac48bcb3928fHeiko SchocherMODULE_DEVICE_TABLE(i2c, rv3029c2_id);
38752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
3885a167f4543e45d45c5672a5cd6cb8ba5ddf4f3eaGreg Kroah-Hartmanstatic int rv3029c2_probe(struct i2c_client *client,
3895a167f4543e45d45c5672a5cd6cb8ba5ddf4f3eaGreg Kroah-Hartman			  const struct i2c_device_id *id)
39052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher{
39152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	struct rtc_device *rtc;
39252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	int rc = 0;
39352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	u8 buf[1];
39452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
39552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL))
39652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return -ENODEV;
39752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
39867ab2440b40610b3b91068844640df6d3de3464fGregory Hermant	rc = rv3029c2_i2c_get_sr(client, buf);
39967ab2440b40610b3b91068844640df6d3de3464fGregory Hermant	if (rc < 0) {
40067ab2440b40610b3b91068844640df6d3de3464fGregory Hermant		dev_err(&client->dev, "reading status failed\n");
40167ab2440b40610b3b91068844640df6d3de3464fGregory Hermant		return rc;
40267ab2440b40610b3b91068844640df6d3de3464fGregory Hermant	}
40367ab2440b40610b3b91068844640df6d3de3464fGregory Hermant
4043d7068c9d505baffc140f23465c5f998c2237b73Jingoo Han	rtc = devm_rtc_device_register(&client->dev, client->name,
4053d7068c9d505baffc140f23465c5f998c2237b73Jingoo Han					&rv3029c2_rtc_ops, THIS_MODULE);
40652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
40752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	if (IS_ERR(rtc))
40852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		return PTR_ERR(rtc);
40952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
41052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	i2c_set_clientdata(client, rtc);
41152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
41252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	return 0;
41352365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher}
41452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
41552365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocherstatic struct i2c_driver rv3029c2_driver = {
41652365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.driver = {
41752365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher		.name = "rtc-rv3029c2",
41852365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	},
41952365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.probe = rv3029c2_probe,
42052365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher	.id_table = rv3029c2_id,
42152365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher};
42252365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
4230abc920116303e81702a38429a1b61a896e02b37Axel Linmodule_i2c_driver(rv3029c2_driver);
42452365230eed7e291bbb2a015465cac48bcb3928fHeiko Schocher
42552365230eed7e291bbb2a015465cac48bcb3928fHeiko SchocherMODULE_AUTHOR("Gregory Hermant <gregory.hermant@calao-systems.com>");
42652365230eed7e291bbb2a015465cac48bcb3928fHeiko SchocherMODULE_DESCRIPTION("Micro Crystal RV3029C2 RTC driver");
42752365230eed7e291bbb2a015465cac48bcb3928fHeiko SchocherMODULE_LICENSE("GPL");
428