/*
 * rtc class driver for the Maxim MAX6900 chip
 *
 * Author: Dale Farnsworth <dale@farnsworth.org>
 *
 * based on previously existing rtc class drivers
 *
 * 2007 (c) MontaVista, Software, Inc.  This file is licensed under
 * the terms of the GNU General Public License version 2.  This program
 * is licensed "as is" without any warranty of any kind, whether express
 * or implied.
 */

#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/bcd.h>
#include <linux/rtc.h>
#include <linux/delay.h>

#define DRV_NAME "max6900"
#define DRV_VERSION "0.1"

/*
 * register indices
 */
#define MAX6900_REG_SC			0	/* seconds	00-59 */
#define MAX6900_REG_MN			1	/* minutes	00-59 */
#define MAX6900_REG_HR			2	/* hours	00-23 */
#define MAX6900_REG_DT			3	/* day of month	00-31 */
#define MAX6900_REG_MO			4	/* month	01-12 */
#define MAX6900_REG_DW			5	/* day of week	 1-7  */
#define MAX6900_REG_YR			6	/* year		00-99 */
#define MAX6900_REG_CT			7	/* control */
						/* register 8 is undocumented */
#define MAX6900_REG_CENTURY		9	/* century */
#define MAX6900_REG_LEN			10

#define MAX6900_BURST_LEN		8	/* can burst r/w first 8 regs */

#define MAX6900_REG_CT_WP		(1 << 7)	/* Write Protect */


/*
 * register read/write commands
 */
#define MAX6900_REG_CONTROL_WRITE	0x8e
#define MAX6900_REG_CENTURY_WRITE	0x92
#define MAX6900_REG_CENTURY_READ	0x93
#define MAX6900_REG_RESERVED_READ	0x96
#define MAX6900_REG_BURST_WRITE		0xbe
#define MAX6900_REG_BURST_READ		0xbf

#define MAX6900_IDLE_TIME_AFTER_WRITE	3	/* specification says 2.5 mS */

#define MAX6900_I2C_ADDR		0xa0

static unsigned short normal_i2c[] = {
	MAX6900_I2C_ADDR >> 1,
	I2C_CLIENT_END
};

I2C_CLIENT_INSMOD;			/* defines addr_data */

static int max6900_probe(struct i2c_adapter *adapter, int addr, int kind);

static int max6900_i2c_read_regs(struct i2c_client *client, u8 *buf)
{
	u8 reg_burst_read[1] = { MAX6900_REG_BURST_READ };
	u8 reg_century_read[1] = { MAX6900_REG_CENTURY_READ };
	struct i2c_msg msgs[4] = {
		{
			.addr	= client->addr,
			.flags	= 0, /* write */
			.len	= sizeof(reg_burst_read),
			.buf	= reg_burst_read
		},
		{
			.addr	= client->addr,
			.flags	= I2C_M_RD,
			.len	= MAX6900_BURST_LEN,
			.buf	= buf
		},
		{
			.addr	= client->addr,
			.flags	= 0, /* write */
			.len	= sizeof(reg_century_read),
			.buf	= reg_century_read
		},
		{
			.addr	= client->addr,
			.flags	= I2C_M_RD,
			.len	= sizeof(buf[MAX6900_REG_CENTURY]),
			.buf	= &buf[MAX6900_REG_CENTURY]
		}
	};
	int rc;

	rc = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
	if (rc != ARRAY_SIZE(msgs)) {
		dev_err(&client->dev, "%s: register read failed\n",
			__FUNCTION__);
		return -EIO;
	}
	return 0;
}

static int max6900_i2c_write_regs(struct i2c_client *client, u8 const *buf)
{
	u8 i2c_century_buf[1 + 1] = { MAX6900_REG_CENTURY_WRITE };
	struct i2c_msg century_msgs[1] = {
		{
			.addr	= client->addr,
			.flags	= 0, /* write */
			.len	= sizeof(i2c_century_buf),
			.buf	= i2c_century_buf
		}
	};
	u8 i2c_burst_buf[MAX6900_BURST_LEN + 1] = { MAX6900_REG_BURST_WRITE };
	struct i2c_msg burst_msgs[1] = {
		{
			.addr	= client->addr,
			.flags	= 0, /* write */
			.len	= sizeof(i2c_burst_buf),
			.buf	= i2c_burst_buf
		}
	};
	int rc;

	/*
	 * We have to make separate calls to i2c_transfer because of
	 * the need to delay after each write to the chip.  Also,
	 * we write the century byte first, since we set the write-protect
	 * bit as part of the burst write.
	 */
	i2c_century_buf[1] = buf[MAX6900_REG_CENTURY];
	rc = i2c_transfer(client->adapter, century_msgs,
			  ARRAY_SIZE(century_msgs));
	if (rc != ARRAY_SIZE(century_msgs))
		goto write_failed;
	msleep(MAX6900_IDLE_TIME_AFTER_WRITE);

	memcpy(&i2c_burst_buf[1], buf, MAX6900_BURST_LEN);

	rc = i2c_transfer(client->adapter, burst_msgs, ARRAY_SIZE(burst_msgs));
	if (rc != ARRAY_SIZE(burst_msgs))
		goto write_failed;
	msleep(MAX6900_IDLE_TIME_AFTER_WRITE);

	return 0;

write_failed:
	dev_err(&client->dev, "%s: register write failed\n",
		__FUNCTION__);
	return -EIO;
}

static int max6900_i2c_validate_client(struct i2c_client *client)
{
	u8 regs[MAX6900_REG_LEN];
	u8 zero_mask[] = {
		0x80,	/* seconds */
		0x80,	/* minutes */
		0x40,	/* hours */
		0xc0,	/* day of month */
		0xe0,	/* month */
		0xf8,	/* day of week */
		0x00,	/* year */
		0x7f,	/* control */
	};
	int i;
	int rc;
	int reserved;

	reserved = i2c_smbus_read_byte_data(client, MAX6900_REG_RESERVED_READ);
	if (reserved != 0x07)
		return -ENODEV;

	rc = max6900_i2c_read_regs(client, regs);
	if (rc < 0)
		return rc;

	for (i = 0; i < ARRAY_SIZE(zero_mask); ++i) {
		if (regs[i] & zero_mask[i])
			return -ENODEV;
	}

	return 0;
}

static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
{
	int rc;
	u8 regs[MAX6900_REG_LEN];

	rc = max6900_i2c_read_regs(client, regs);
	if (rc < 0)
		return rc;

	tm->tm_sec = BCD2BIN(regs[MAX6900_REG_SC]);
	tm->tm_min = BCD2BIN(regs[MAX6900_REG_MN]);
	tm->tm_hour = BCD2BIN(regs[MAX6900_REG_HR] & 0x3f);
	tm->tm_mday = BCD2BIN(regs[MAX6900_REG_DT]);
	tm->tm_mon = BCD2BIN(regs[MAX6900_REG_MO]) - 1;
	tm->tm_year = BCD2BIN(regs[MAX6900_REG_YR]) +
		      BCD2BIN(regs[MAX6900_REG_CENTURY]) * 100 - 1900;
	tm->tm_wday = BCD2BIN(regs[MAX6900_REG_DW]);

	return 0;
}

static int max6900_i2c_clear_write_protect(struct i2c_client *client)
{
	int rc;
	rc = i2c_smbus_write_byte_data (client, MAX6900_REG_CONTROL_WRITE, 0);
	if (rc < 0) {
		dev_err(&client->dev, "%s: control register write failed\n",
			__FUNCTION__);
		return -EIO;
	}
	return 0;
}

static int max6900_i2c_set_time(struct i2c_client *client,
				struct rtc_time const *tm)
{
	u8 regs[MAX6900_REG_LEN];
	int rc;

	rc = max6900_i2c_clear_write_protect(client);
	if (rc < 0)
		return rc;

	regs[MAX6900_REG_SC] = BIN2BCD(tm->tm_sec);
	regs[MAX6900_REG_MN] = BIN2BCD(tm->tm_min);
	regs[MAX6900_REG_HR] = BIN2BCD(tm->tm_hour);
	regs[MAX6900_REG_DT] = BIN2BCD(tm->tm_mday);
	regs[MAX6900_REG_MO] = BIN2BCD(tm->tm_mon + 1);
	regs[MAX6900_REG_DW] = BIN2BCD(tm->tm_wday);
	regs[MAX6900_REG_YR] = BIN2BCD(tm->tm_year % 100);
	regs[MAX6900_REG_CENTURY] = BIN2BCD((tm->tm_year + 1900) / 100);
	/* set write protect */
	regs[MAX6900_REG_CT] = MAX6900_REG_CT_WP;

	rc = max6900_i2c_write_regs(client, regs);
	if (rc < 0)
		return rc;

	return 0;
}

static int max6900_rtc_read_time(struct device *dev, struct rtc_time *tm)
{
	return max6900_i2c_read_time(to_i2c_client(dev), tm);
}

static int max6900_rtc_set_time(struct device *dev, struct rtc_time *tm)
{
	return max6900_i2c_set_time(to_i2c_client(dev), tm);
}

static int max6900_attach_adapter(struct i2c_adapter *adapter)
{
	return i2c_probe(adapter, &addr_data, max6900_probe);
}

static int max6900_detach_client(struct i2c_client *client)
{
	struct rtc_device *const rtc = i2c_get_clientdata(client);

	if (rtc)
		rtc_device_unregister(rtc);

	return i2c_detach_client(client);
}

static struct i2c_driver max6900_driver = {
	.driver		= {
		.name	= DRV_NAME,
	},
	.id		= I2C_DRIVERID_MAX6900,
	.attach_adapter = max6900_attach_adapter,
	.detach_client	= max6900_detach_client,
};

static const struct rtc_class_ops max6900_rtc_ops = {
	.read_time	= max6900_rtc_read_time,
	.set_time	= max6900_rtc_set_time,
};

static int max6900_probe(struct i2c_adapter *adapter, int addr, int kind)
{
	int rc = 0;
	struct i2c_client *client = NULL;
	struct rtc_device *rtc = NULL;

	if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
		rc = -ENODEV;
		goto failout;
	}

	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
	if (client == NULL) {
		rc = -ENOMEM;
		goto failout;
	}

	client->addr = addr;
	client->adapter = adapter;
	client->driver = &max6900_driver;
	strlcpy(client->name, DRV_NAME, I2C_NAME_SIZE);

	if (kind < 0) {
		rc = max6900_i2c_validate_client(client);
		if (rc < 0)
			goto failout;
	}

	rc = i2c_attach_client(client);
	if (rc < 0)
		goto failout;

	dev_info(&client->dev,
		 "chip found, driver version " DRV_VERSION "\n");

	rtc = rtc_device_register(max6900_driver.driver.name,
				  &client->dev,
				  &max6900_rtc_ops, THIS_MODULE);
	if (IS_ERR(rtc)) {
		rc = PTR_ERR(rtc);
		goto failout_detach;
	}

	i2c_set_clientdata(client, rtc);

	return 0;

failout_detach:
	i2c_detach_client(client);
failout:
	kfree(client);
	return rc;
}

static int __init max6900_init(void)
{
	return i2c_add_driver(&max6900_driver);
}

static void __exit max6900_exit(void)
{
	i2c_del_driver(&max6900_driver);
}

MODULE_DESCRIPTION("Maxim MAX6900 RTC driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);

module_init(max6900_init);
module_exit(max6900_exit);
