rtc-rs5c372.c 18.4 KB
Newer Older
1
/*
2
 * An I2C driver for Ricoh RS5C372, R2025S/D and RV5C38[67] RTCs
3 4 5
 *
 * Copyright (C) 2005 Pavel Mironchik <pmironchik@optifacio.net>
 * Copyright (C) 2006 Tower Technologies
6
 * Copyright (C) 2008 Paul Mundt
7 8 9 10 11 12 13 14 15
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/i2c.h>
#include <linux/rtc.h>
#include <linux/bcd.h>
16
#include <linux/slab.h>
17

18
#define DRV_VERSION "0.6"
19

20 21 22 23 24 25 26

/*
 * Ricoh has a family of I2C based RTCs, which differ only slightly from
 * each other.  Differences center on pinout (e.g. how many interrupts,
 * output clock, etc) and how the control registers are used.  The '372
 * is significant only because that's the one this driver first supported.
 */
27 28 29 30 31 32 33 34
#define RS5C372_REG_SECS	0
#define RS5C372_REG_MINS	1
#define RS5C372_REG_HOURS	2
#define RS5C372_REG_WDAY	3
#define RS5C372_REG_DAY		4
#define RS5C372_REG_MONTH	5
#define RS5C372_REG_YEAR	6
#define RS5C372_REG_TRIM	7
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#	define RS5C372_TRIM_XSL		0x80
#	define RS5C372_TRIM_MASK	0x7F

#define RS5C_REG_ALARM_A_MIN	8			/* or ALARM_W */
#define RS5C_REG_ALARM_A_HOURS	9
#define RS5C_REG_ALARM_A_WDAY	10

#define RS5C_REG_ALARM_B_MIN	11			/* or ALARM_D */
#define RS5C_REG_ALARM_B_HOURS	12
#define RS5C_REG_ALARM_B_WDAY	13			/* (ALARM_B only) */

#define RS5C_REG_CTRL1		14
#	define RS5C_CTRL1_AALE		(1 << 7)	/* or WALE */
#	define RS5C_CTRL1_BALE		(1 << 6)	/* or DALE */
#	define RV5C387_CTRL1_24		(1 << 5)
#	define RS5C372A_CTRL1_SL1	(1 << 5)
#	define RS5C_CTRL1_CT_MASK	(7 << 0)
#	define RS5C_CTRL1_CT0		(0 << 0)	/* no periodic irq */
#	define RS5C_CTRL1_CT4		(4 << 0)	/* 1 Hz level irq */
#define RS5C_REG_CTRL2		15
#	define RS5C372_CTRL2_24		(1 << 5)
56 57
#	define R2025_CTRL2_XST		(1 << 5)
#	define RS5C_CTRL2_XSTP		(1 << 4)	/* only if !R2025S/D */
58 59 60 61 62 63 64 65 66 67 68
#	define RS5C_CTRL2_CTFG		(1 << 2)
#	define RS5C_CTRL2_AAFG		(1 << 1)	/* or WAFG */
#	define RS5C_CTRL2_BAFG		(1 << 0)	/* or DAFG */


/* to read (style 1) or write registers starting at R */
#define RS5C_ADDR(R)		(((R) << 4) | 0)


enum rtc_type {
	rtc_undef = 0,
69
	rtc_r2025sd,
70 71 72 73 74
	rtc_rs5c372a,
	rtc_rs5c372b,
	rtc_rv5c386,
	rtc_rv5c387a,
};
75

76
static const struct i2c_device_id rs5c372_id[] = {
77
	{ "r2025sd", rtc_r2025sd },
78 79 80 81 82 83 84 85
	{ "rs5c372a", rtc_rs5c372a },
	{ "rs5c372b", rtc_rs5c372b },
	{ "rv5c386", rtc_rv5c386 },
	{ "rv5c387a", rtc_rv5c387a },
	{ }
};
MODULE_DEVICE_TABLE(i2c, rs5c372_id);

86 87 88 89 90 91 92 93 94 95 96
/* REVISIT:  this assumes that:
 *  - we're in the 21st century, so it's safe to ignore the century
 *    bit for rv5c38[67] (REG_MONTH bit 7);
 *  - we should use ALARM_A not ALARM_B (may be wrong on some boards)
 */
struct rs5c372 {
	struct i2c_client	*client;
	struct rtc_device	*rtc;
	enum rtc_type		type;
	unsigned		time24:1;
	unsigned		has_irq:1;
97
	unsigned		smbus:1;
98 99 100
	char			buf[17];
	char			*regs;
};
101

102 103 104 105 106 107 108 109 110 111 112 113 114
static int rs5c_get_regs(struct rs5c372 *rs5c)
{
	struct i2c_client	*client = rs5c->client;
	struct i2c_msg		msgs[] = {
		{ client->addr, I2C_M_RD, sizeof rs5c->buf, rs5c->buf },
	};

	/* This implements the third reading method from the datasheet, using
	 * an internal address that's reset after each transaction (by STOP)
	 * to 0x0f ... so we read extra registers, and skip the first one.
	 *
	 * The first method doesn't work with the iop3xx adapter driver, on at
	 * least 80219 chips; this works around that bug.
115 116 117 118
	 *
	 * The third method on the other hand doesn't work for the SMBus-only
	 * configurations, so we use the the first method there, stripping off
	 * the extra register in the process.
119
	 */
120 121 122 123 124 125 126 127 128 129 130 131 132 133
	if (rs5c->smbus) {
		int addr = RS5C_ADDR(RS5C372_REG_SECS);
		int size = sizeof(rs5c->buf) - 1;

		if (i2c_smbus_read_i2c_block_data(client, addr, size,
						  rs5c->buf + 1) != size) {
			dev_warn(&client->dev, "can't read registers\n");
			return -EIO;
		}
	} else {
		if ((i2c_transfer(client->adapter, msgs, 1)) != 1) {
			dev_warn(&client->dev, "can't read registers\n");
			return -EIO;
		}
134
	}
135

136 137 138 139 140 141 142
	dev_dbg(&client->dev,
		"%02x %02x %02x (%02x) %02x %02x %02x (%02x), "
		"%02x %02x %02x, %02x %02x %02x; %02x %02x\n",
		rs5c->regs[0],  rs5c->regs[1],  rs5c->regs[2],  rs5c->regs[3],
		rs5c->regs[4],  rs5c->regs[5],  rs5c->regs[6],  rs5c->regs[7],
		rs5c->regs[8],  rs5c->regs[9],  rs5c->regs[10], rs5c->regs[11],
		rs5c->regs[12], rs5c->regs[13], rs5c->regs[14], rs5c->regs[15]);
143

144 145
	return 0;
}
146

147 148 149
static unsigned rs5c_reg2hr(struct rs5c372 *rs5c, unsigned reg)
{
	unsigned	hour;
150

151
	if (rs5c->time24)
A
Adrian Bunk 已提交
152
		return bcd2bin(reg & 0x3f);
153

A
Adrian Bunk 已提交
154
	hour = bcd2bin(reg & 0x1f);
155 156 157 158 159 160 161 162
	if (hour == 12)
		hour = 0;
	if (reg & 0x20)
		hour += 12;
	return hour;
}

static unsigned rs5c_hr2reg(struct rs5c372 *rs5c, unsigned hour)
163
{
164
	if (rs5c->time24)
A
Adrian Bunk 已提交
165
		return bin2bcd(hour);
166 167

	if (hour > 12)
A
Adrian Bunk 已提交
168
		return 0x20 | bin2bcd(hour - 12);
169
	if (hour == 12)
A
Adrian Bunk 已提交
170
		return 0x20 | bin2bcd(12);
171
	if (hour == 0)
A
Adrian Bunk 已提交
172 173
		return bin2bcd(12);
	return bin2bcd(hour);
174
}
175

176 177 178 179
static int rs5c372_get_datetime(struct i2c_client *client, struct rtc_time *tm)
{
	struct rs5c372	*rs5c = i2c_get_clientdata(client);
	int		status = rs5c_get_regs(rs5c);
180

181 182
	if (status < 0)
		return status;
183

A
Adrian Bunk 已提交
184 185
	tm->tm_sec = bcd2bin(rs5c->regs[RS5C372_REG_SECS] & 0x7f);
	tm->tm_min = bcd2bin(rs5c->regs[RS5C372_REG_MINS] & 0x7f);
186
	tm->tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C372_REG_HOURS]);
187

A
Adrian Bunk 已提交
188 189
	tm->tm_wday = bcd2bin(rs5c->regs[RS5C372_REG_WDAY] & 0x07);
	tm->tm_mday = bcd2bin(rs5c->regs[RS5C372_REG_DAY] & 0x3f);
190 191

	/* tm->tm_mon is zero-based */
A
Adrian Bunk 已提交
192
	tm->tm_mon = bcd2bin(rs5c->regs[RS5C372_REG_MONTH] & 0x1f) - 1;
193 194

	/* year is 1900 + tm->tm_year */
A
Adrian Bunk 已提交
195
	tm->tm_year = bcd2bin(rs5c->regs[RS5C372_REG_YEAR]) + 100;
196 197 198

	dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
		"mday=%d, mon=%d, year=%d, wday=%d\n",
199
		__func__,
200 201 202
		tm->tm_sec, tm->tm_min, tm->tm_hour,
		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);

203 204
	/* rtc might need initialization */
	return rtc_valid_tm(tm);
205 206 207 208
}

static int rs5c372_set_datetime(struct i2c_client *client, struct rtc_time *tm)
{
209
	struct rs5c372	*rs5c = i2c_get_clientdata(client);
W
Wolfram Sang 已提交
210
	unsigned char	buf[7];
211
	int		addr;
212

213
	dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d "
214
		"mday=%d, mon=%d, year=%d, wday=%d\n",
215
		__func__,
216
		tm->tm_sec, tm->tm_min, tm->tm_hour,
217 218
		tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);

219
	addr   = RS5C_ADDR(RS5C372_REG_SECS);
A
Adrian Bunk 已提交
220 221
	buf[0] = bin2bcd(tm->tm_sec);
	buf[1] = bin2bcd(tm->tm_min);
222
	buf[2] = rs5c_hr2reg(rs5c, tm->tm_hour);
A
Adrian Bunk 已提交
223 224 225 226
	buf[3] = bin2bcd(tm->tm_wday);
	buf[4] = bin2bcd(tm->tm_mday);
	buf[5] = bin2bcd(tm->tm_mon + 1);
	buf[6] = bin2bcd(tm->tm_year - 100);
227

228
	if (i2c_smbus_write_i2c_block_data(client, addr, sizeof(buf), buf) < 0) {
229
		dev_err(&client->dev, "%s: write error\n", __func__);
230 231 232 233 234 235
		return -EIO;
	}

	return 0;
}

236 237 238 239 240 241 242 243 244
#if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
#define	NEED_TRIM
#endif

#if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)
#define	NEED_TRIM
#endif

#ifdef	NEED_TRIM
245 246
static int rs5c372_get_trim(struct i2c_client *client, int *osc, int *trim)
{
247
	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
248
	u8 tmp = rs5c372->regs[RS5C372_REG_TRIM];
249 250

	if (osc)
251
		*osc = (tmp & RS5C372_TRIM_XSL) ? 32000 : 32768;
252

253
	if (trim) {
254
		dev_dbg(&client->dev, "%s: raw trim=%x\n", __func__, tmp);
255 256 257 258 259 260 261 262 263 264 265 266 267
		tmp &= RS5C372_TRIM_MASK;
		if (tmp & 0x3e) {
			int t = tmp & 0x3f;

			if (tmp & 0x40)
				t = (~t | (s8)0xc0) + 1;
			else
				t = t - 1;

			tmp = t * 2;
		} else
			tmp = 0;
		*trim = tmp;
268
	}
269 270 271

	return 0;
}
272
#endif
273 274 275 276 277 278 279 280 281 282 283

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

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

284 285 286 287 288 289 290
#if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE)

static int
rs5c_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
{
	struct i2c_client	*client = to_i2c_client(dev);
	struct rs5c372		*rs5c = i2c_get_clientdata(client);
291 292
	unsigned char		buf;
	int			status, addr;
293

294
	buf = rs5c->regs[RS5C_REG_CTRL1];
295 296 297 298 299
	switch (cmd) {
	case RTC_UIE_OFF:
	case RTC_UIE_ON:
		/* some 327a modes use a different IRQ pin for 1Hz irqs */
		if (rs5c->type == rtc_rs5c372a
300
				&& (buf & RS5C372A_CTRL1_SL1))
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
			return -ENOIOCTLCMD;
	case RTC_AIE_OFF:
	case RTC_AIE_ON:
		/* these irq management calls only make sense for chips
		 * which are wired up to an IRQ.
		 */
		if (!rs5c->has_irq)
			return -ENOIOCTLCMD;
		break;
	default:
		return -ENOIOCTLCMD;
	}

	status = rs5c_get_regs(rs5c);
	if (status < 0)
		return status;

318
	addr = RS5C_ADDR(RS5C_REG_CTRL1);
319 320
	switch (cmd) {
	case RTC_AIE_OFF:	/* alarm off */
321
		buf &= ~RS5C_CTRL1_AALE;
322 323
		break;
	case RTC_AIE_ON:	/* alarm on */
324
		buf |= RS5C_CTRL1_AALE;
325 326
		break;
	case RTC_UIE_OFF:	/* update off */
327
		buf &= ~RS5C_CTRL1_CT_MASK;
328 329
		break;
	case RTC_UIE_ON:	/* update on */
330 331
		buf &= ~RS5C_CTRL1_CT_MASK;
		buf |= RS5C_CTRL1_CT4;
332 333
		break;
	}
334 335

	if (i2c_smbus_write_byte_data(client, addr, buf) < 0) {
336 337 338 339
		printk(KERN_WARNING "%s: can't update alarm\n",
			rs5c->rtc->name);
		status = -EIO;
	} else
340 341
		rs5c->regs[RS5C_REG_CTRL1] = buf;

342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
	return status;
}

#else
#define	rs5c_rtc_ioctl	NULL
#endif


/* NOTE:  Since RTC_WKALM_{RD,SET} were originally defined for EFI,
 * which only exposes a polled programming interface; and since
 * these calls map directly to those EFI requests; we don't demand
 * we have an IRQ for this chip when we go through this API.
 *
 * The older x86_pc derived RTC_ALM_{READ,SET} calls require irqs
 * though, managed through RTC_AIE_{ON,OFF} requests.
 */

static int rs5c_read_alarm(struct device *dev, struct rtc_wkalrm *t)
{
	struct i2c_client	*client = to_i2c_client(dev);
	struct rs5c372		*rs5c = i2c_get_clientdata(client);
	int			status;

	status = rs5c_get_regs(rs5c);
	if (status < 0)
		return status;

	/* report alarm time */
	t->time.tm_sec = 0;
A
Adrian Bunk 已提交
371
	t->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f);
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
	t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]);
	t->time.tm_mday = -1;
	t->time.tm_mon = -1;
	t->time.tm_year = -1;
	t->time.tm_wday = -1;
	t->time.tm_yday = -1;
	t->time.tm_isdst = -1;

	/* ... and status */
	t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE);
	t->pending = !!(rs5c->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_AAFG);

	return 0;
}

static int rs5c_set_alarm(struct device *dev, struct rtc_wkalrm *t)
{
	struct i2c_client	*client = to_i2c_client(dev);
	struct rs5c372		*rs5c = i2c_get_clientdata(client);
391 392
	int			status, addr, i;
	unsigned char		buf[3];
393 394 395 396 397 398 399 400 401 402 403 404 405 406

	/* only handle up to 24 hours in the future, like RTC_ALM_SET */
	if (t->time.tm_mday != -1
			|| t->time.tm_mon != -1
			|| t->time.tm_year != -1)
		return -EINVAL;

	/* REVISIT: round up tm_sec */

	/* if needed, disable irq (clears pending status) */
	status = rs5c_get_regs(rs5c);
	if (status < 0)
		return status;
	if (rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE) {
407 408 409
		addr = RS5C_ADDR(RS5C_REG_CTRL1);
		buf[0] = rs5c->regs[RS5C_REG_CTRL1] & ~RS5C_CTRL1_AALE;
		if (i2c_smbus_write_byte_data(client, addr, buf[0]) < 0) {
410 411 412
			pr_debug("%s: can't disable alarm\n", rs5c->rtc->name);
			return -EIO;
		}
413
		rs5c->regs[RS5C_REG_CTRL1] = buf[0];
414 415 416
	}

	/* set alarm */
A
Adrian Bunk 已提交
417
	buf[0] = bin2bcd(t->time.tm_min);
418 419 420 421 422 423 424 425 426
	buf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour);
	buf[2] = 0x7f;	/* any/all days */

	for (i = 0; i < sizeof(buf); i++) {
		addr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i);
		if (i2c_smbus_write_byte_data(client, addr, buf[i]) < 0) {
			pr_debug("%s: can't set alarm time\n", rs5c->rtc->name);
			return -EIO;
		}
427 428 429 430
	}

	/* ... and maybe enable its irq */
	if (t->enabled) {
431 432 433
		addr = RS5C_ADDR(RS5C_REG_CTRL1);
		buf[0] = rs5c->regs[RS5C_REG_CTRL1] | RS5C_CTRL1_AALE;
		if (i2c_smbus_write_byte_data(client, addr, buf[0]) < 0)
434 435
			printk(KERN_WARNING "%s: can't enable alarm\n",
				rs5c->rtc->name);
436
		rs5c->regs[RS5C_REG_CTRL1] = buf[0];
437 438 439 440 441 442 443
	}

	return 0;
}

#if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)

444 445 446 447
static int rs5c372_rtc_proc(struct device *dev, struct seq_file *seq)
{
	int err, osc, trim;

448 449
	err = rs5c372_get_trim(to_i2c_client(dev), &osc, &trim);
	if (err == 0) {
450 451 452
		seq_printf(seq, "crystal\t\t: %d.%03d KHz\n",
				osc / 1000, osc % 1000);
		seq_printf(seq, "trim\t\t: %d\n", trim);
453 454 455 456 457
	}

	return 0;
}

458 459 460 461
#else
#define	rs5c372_rtc_proc	NULL
#endif

462
static const struct rtc_class_ops rs5c372_rtc_ops = {
463
	.proc		= rs5c372_rtc_proc,
464
	.ioctl		= rs5c_rtc_ioctl,
465 466
	.read_time	= rs5c372_rtc_read_time,
	.set_time	= rs5c372_rtc_set_time,
467 468
	.read_alarm	= rs5c_read_alarm,
	.set_alarm	= rs5c_set_alarm,
469 470
};

471 472
#if defined(CONFIG_RTC_INTF_SYSFS) || defined(CONFIG_RTC_INTF_SYSFS_MODULE)

473 474 475
static ssize_t rs5c372_sysfs_show_trim(struct device *dev,
				struct device_attribute *attr, char *buf)
{
476
	int err, trim;
477

478 479 480
	err = rs5c372_get_trim(to_i2c_client(dev), NULL, &trim);
	if (err)
		return err;
481

482
	return sprintf(buf, "%d\n", trim);
483 484 485 486 487 488
}
static DEVICE_ATTR(trim, S_IRUGO, rs5c372_sysfs_show_trim, NULL);

static ssize_t rs5c372_sysfs_show_osc(struct device *dev,
				struct device_attribute *attr, char *buf)
{
489
	int err, osc;
490

491 492 493
	err = rs5c372_get_trim(to_i2c_client(dev), &osc, NULL);
	if (err)
		return err;
494

495
	return sprintf(buf, "%d.%03d KHz\n", osc / 1000, osc % 1000);
496 497 498
}
static DEVICE_ATTR(osc, S_IRUGO, rs5c372_sysfs_show_osc, NULL);

499
static int rs5c_sysfs_register(struct device *dev)
500
{
501 502 503 504 505 506 507 508 509 510 511 512
	int err;

	err = device_create_file(dev, &dev_attr_trim);
	if (err)
		return err;
	err = device_create_file(dev, &dev_attr_osc);
	if (err)
		device_remove_file(dev, &dev_attr_trim);

	return err;
}

513 514 515 516 517 518
static void rs5c_sysfs_unregister(struct device *dev)
{
	device_remove_file(dev, &dev_attr_trim);
	device_remove_file(dev, &dev_attr_osc);
}

519 520 521 522
#else
static int rs5c_sysfs_register(struct device *dev)
{
	return 0;
523
}
524 525 526 527 528

static void rs5c_sysfs_unregister(struct device *dev)
{
	/* nothing */
}
529 530 531
#endif	/* SYSFS */

static struct i2c_driver rs5c372_driver;
532

533 534 535 536 537
static int rs5c_oscillator_setup(struct rs5c372 *rs5c372)
{
	unsigned char buf[2];
	int addr, i, ret = 0;

538 539 540 541 542 543 544 545 546
	if (rs5c372->type == rtc_r2025sd) {
		if (!(rs5c372->regs[RS5C_REG_CTRL2] & R2025_CTRL2_XST))
			return ret;
		rs5c372->regs[RS5C_REG_CTRL2] &= ~R2025_CTRL2_XST;
	} else {
		if (!(rs5c372->regs[RS5C_REG_CTRL2] & RS5C_CTRL2_XSTP))
			return ret;
		rs5c372->regs[RS5C_REG_CTRL2] &= ~RS5C_CTRL2_XSTP;
	}
547 548 549 550 551 552 553 554 555 556 557 558

	addr   = RS5C_ADDR(RS5C_REG_CTRL1);
	buf[0] = rs5c372->regs[RS5C_REG_CTRL1];
	buf[1] = rs5c372->regs[RS5C_REG_CTRL2];

	/* use 24hr mode */
	switch (rs5c372->type) {
	case rtc_rs5c372a:
	case rtc_rs5c372b:
		buf[1] |= RS5C372_CTRL2_24;
		rs5c372->time24 = 1;
		break;
559
	case rtc_r2025sd:
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
	case rtc_rv5c386:
	case rtc_rv5c387a:
		buf[0] |= RV5C387_CTRL1_24;
		rs5c372->time24 = 1;
		break;
	default:
		/* impossible */
		break;
	}

	for (i = 0; i < sizeof(buf); i++) {
		addr = RS5C_ADDR(RS5C_REG_CTRL1 + i);
		ret = i2c_smbus_write_byte_data(rs5c372->client, addr, buf[i]);
		if (unlikely(ret < 0))
			return ret;
	}

	rs5c372->regs[RS5C_REG_CTRL1] = buf[0];
	rs5c372->regs[RS5C_REG_CTRL2] = buf[1];

	return 0;
}

583 584
static int rs5c372_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
585 586
{
	int err = 0;
587
	int smbus_mode = 0;
588
	struct rs5c372 *rs5c372;
589
	struct rtc_time tm;
590

591
	dev_dbg(&client->dev, "%s\n", __func__);
592

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C |
			I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK)) {
		/*
		 * If we don't have any master mode adapter, try breaking
		 * it down in to the barest of capabilities.
		 */
		if (i2c_check_functionality(client->adapter,
				I2C_FUNC_SMBUS_BYTE_DATA |
				I2C_FUNC_SMBUS_I2C_BLOCK))
			smbus_mode = 1;
		else {
			/* Still no good, give up */
			err = -ENODEV;
			goto exit;
		}
608 609
	}

610
	if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
611 612 613
		err = -ENOMEM;
		goto exit;
	}
614 615

	rs5c372->client = client;
616
	i2c_set_clientdata(client, rs5c372);
617
	rs5c372->type = id->driver_data;
618

619 620
	/* we read registers 0x0f then 0x00-0x0f; skip the first one */
	rs5c372->regs = &rs5c372->buf[1];
621
	rs5c372->smbus = smbus_mode;
622

623 624
	err = rs5c_get_regs(rs5c372);
	if (err < 0)
625
		goto exit_kfree;
626 627 628 629 630 631 632 633 634 635 636

	/* clock may be set for am/pm or 24 hr time */
	switch (rs5c372->type) {
	case rtc_rs5c372a:
	case rtc_rs5c372b:
		/* alarm uses ALARM_A; and nINTRA on 372a, nINTR on 372b.
		 * so does periodic irq, except some 327a modes.
		 */
		if (rs5c372->regs[RS5C_REG_CTRL2] & RS5C372_CTRL2_24)
			rs5c372->time24 = 1;
		break;
637
	case rtc_r2025sd:
638 639 640 641 642 643 644 645 646 647
	case rtc_rv5c386:
	case rtc_rv5c387a:
		if (rs5c372->regs[RS5C_REG_CTRL1] & RV5C387_CTRL1_24)
			rs5c372->time24 = 1;
		/* alarm uses ALARM_W; and nINTRB for alarm and periodic
		 * irq, on both 386 and 387
		 */
		break;
	default:
		dev_err(&client->dev, "unknown RTC type\n");
648
		goto exit_kfree;
649 650 651 652
	}

	/* if the oscillator lost power and no other software (like
	 * the bootloader) set it up, do it here.
653 654 655
	 *
	 * The R2025S/D does this a little differently than the other
	 * parts, so we special case that..
656
	 */
657 658 659 660
	err = rs5c_oscillator_setup(rs5c372);
	if (unlikely(err < 0)) {
		dev_err(&client->dev, "setup error\n");
		goto exit_kfree;
661 662 663 664 665 666 667
	}

	if (rs5c372_get_datetime(client, &tm) < 0)
		dev_warn(&client->dev, "clock needs to be set\n");

	dev_info(&client->dev, "%s found, %s, driver version " DRV_VERSION "\n",
			({ char *s; switch (rs5c372->type) {
668
			case rtc_r2025sd:	s = "r2025sd"; break;
669 670 671 672 673 674 675 676 677
			case rtc_rs5c372a:	s = "rs5c372a"; break;
			case rtc_rs5c372b:	s = "rs5c372b"; break;
			case rtc_rv5c386:	s = "rv5c386"; break;
			case rtc_rv5c387a:	s = "rv5c387a"; break;
			default:		s = "chip"; break;
			}; s;}),
			rs5c372->time24 ? "24hr" : "am/pm"
			);

678
	/* REVISIT use client->irq to register alarm irq ... */
679

680 681
	rs5c372->rtc = rtc_device_register(rs5c372_driver.driver.name,
				&client->dev, &rs5c372_rtc_ops, THIS_MODULE);
682

683 684
	if (IS_ERR(rs5c372->rtc)) {
		err = PTR_ERR(rs5c372->rtc);
685
		goto exit_kfree;
686 687
	}

688
	err = rs5c_sysfs_register(&client->dev);
689 690
	if (err)
		goto exit_devreg;
691 692 693

	return 0;

J
Jeff Garzik 已提交
694
exit_devreg:
695
	rtc_device_unregister(rs5c372->rtc);
J
Jeff Garzik 已提交
696

697
exit_kfree:
698
	kfree(rs5c372);
699 700 701 702 703

exit:
	return err;
}

704
static int rs5c372_remove(struct i2c_client *client)
705
{
706
	struct rs5c372 *rs5c372 = i2c_get_clientdata(client);
707

708 709
	rtc_device_unregister(rs5c372->rtc);
	rs5c_sysfs_unregister(&client->dev);
710
	kfree(rs5c372);
711 712 713
	return 0;
}

714 715 716 717
static struct i2c_driver rs5c372_driver = {
	.driver		= {
		.name	= "rtc-rs5c372",
	},
718 719
	.probe		= rs5c372_probe,
	.remove		= rs5c372_remove,
720
	.id_table	= rs5c372_id,
721 722
};

723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
static __init int rs5c372_init(void)
{
	return i2c_add_driver(&rs5c372_driver);
}

static __exit void rs5c372_exit(void)
{
	i2c_del_driver(&rs5c372_driver);
}

module_init(rs5c372_init);
module_exit(rs5c372_exit);

MODULE_AUTHOR(
		"Pavel Mironchik <pmironchik@optifacio.net>, "
738 739
		"Alessandro Zummo <a.zummo@towertech.it>, "
		"Paul Mundt <lethal@linux-sh.org>");
740 741 742
MODULE_DESCRIPTION("Ricoh RS5C372 RTC driver");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);