rtc: Ramtron FM3130 RTC support

Ramtron FM3130 is a chip with two separate devices inside, RTC clock and
FRAM. This driver provides only RTC functionality.

This chip is met in lots of custom boards with AT91SAMXXXX CPU I work
with, is cheap and in no way better or worse than any other RTC on market.
While it is mostly met on much smaller devices, I think it is great to
have it supported in Linux.

Signed-off-by: Sergey Lapin <slapin@ossfans.org>
Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Sergey Lapin and committed by Linus Torvalds c6d8f400 e6d2bb2b

+514 -1
+11
drivers/rtc/Kconfig
··· 256 256 This driver can also be built as a module. If so the module 257 257 will be called rtc-s35390a. 258 258 259 + config RTC_DRV_FM3130 260 + tristate "Ramtron FM3130" 261 + help 262 + If you say Y here you will get support for the 263 + Ramtron FM3130 RTC chips. 264 + Ramtron FM3130 is a chip with two separate devices inside, 265 + RTC clock and FRAM. This driver provides only RTC functionality. 266 + 267 + This driver can also be built as a module. If so the module 268 + will be called rtc-fm3130. 269 + 259 270 endif # I2C 260 271 261 272 comment "SPI RTC drivers"
+2 -1
drivers/rtc/Makefile
··· 31 31 obj-$(CONFIG_RTC_DRV_DS1672) += rtc-ds1672.o 32 32 obj-$(CONFIG_RTC_DRV_DS1742) += rtc-ds1742.o 33 33 obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o 34 + obj-$(CONFIG_RTC_DRV_FM3130) += rtc-fm3130.o 34 35 obj-$(CONFIG_RTC_DRV_ISL1208) += rtc-isl1208.o 35 36 obj-$(CONFIG_RTC_DRV_M41T80) += rtc-m41t80.o 36 37 obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o ··· 42 41 obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o 43 42 obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o 44 43 obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o 44 + obj-$(CONFIG_RTC_DRV_PPC) += rtc-ppc.o 45 45 obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o 46 46 obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o 47 47 obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o ··· 56 54 obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o 57 55 obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o 58 56 obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o 59 - obj-$(CONFIG_RTC_DRV_PPC) += rtc-ppc.o
+501
drivers/rtc/rtc-fm3130.c
··· 1 + /* 2 + * rtc-fm3130.c - RTC driver for Ramtron FM3130 I2C chip. 3 + * 4 + * Copyright (C) 2008 Sergey Lapin 5 + * Based on ds1307 driver by James Chapman and David Brownell 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License version 2 as 9 + * published by the Free Software Foundation. 10 + */ 11 + 12 + #include <linux/module.h> 13 + #include <linux/i2c.h> 14 + #include <linux/rtc.h> 15 + #include <linux/bcd.h> 16 + 17 + #define FM3130_RTC_CONTROL (0x0) 18 + #define FM3130_CAL_CONTROL (0x1) 19 + #define FM3130_RTC_SECONDS (0x2) 20 + #define FM3130_RTC_MINUTES (0x3) 21 + #define FM3130_RTC_HOURS (0x4) 22 + #define FM3130_RTC_DAY (0x5) 23 + #define FM3130_RTC_DATE (0x6) 24 + #define FM3130_RTC_MONTHS (0x7) 25 + #define FM3130_RTC_YEARS (0x8) 26 + 27 + #define FM3130_ALARM_SECONDS (0x9) 28 + #define FM3130_ALARM_MINUTES (0xa) 29 + #define FM3130_ALARM_HOURS (0xb) 30 + #define FM3130_ALARM_DATE (0xc) 31 + #define FM3130_ALARM_MONTHS (0xd) 32 + #define FM3130_ALARM_WP_CONTROL (0xe) 33 + 34 + #define FM3130_CAL_CONTROL_BIT_nOSCEN (1 << 7) /* Osciallator enabled */ 35 + #define FM3130_RTC_CONTROL_BIT_LB (1 << 7) /* Low battery */ 36 + #define FM3130_RTC_CONTROL_BIT_AF (1 << 6) /* Alarm flag */ 37 + #define FM3130_RTC_CONTROL_BIT_CF (1 << 5) /* Century overflow */ 38 + #define FM3130_RTC_CONTROL_BIT_POR (1 << 4) /* Power on reset */ 39 + #define FM3130_RTC_CONTROL_BIT_AEN (1 << 3) /* Alarm enable */ 40 + #define FM3130_RTC_CONTROL_BIT_CAL (1 << 2) /* Calibration mode */ 41 + #define FM3130_RTC_CONTROL_BIT_WRITE (1 << 1) /* W=1 -> write mode W=0 normal */ 42 + #define FM3130_RTC_CONTROL_BIT_READ (1 << 0) /* R=1 -> read mode R=0 normal */ 43 + 44 + #define FM3130_CLOCK_REGS 7 45 + #define FM3130_ALARM_REGS 5 46 + 47 + struct fm3130 { 48 + u8 reg_addr_time; 49 + u8 reg_addr_alarm; 50 + u8 regs[15]; 51 + struct i2c_msg msg[4]; 52 + struct i2c_client *client; 53 + struct rtc_device *rtc; 54 + int data_valid; 55 + int alarm; 56 + }; 57 + static const struct i2c_device_id fm3130_id[] = { 58 + { "fm3130-rtc", 0 }, 59 + { } 60 + }; 61 + MODULE_DEVICE_TABLE(i2c, fm3130_id); 62 + 63 + #define FM3130_MODE_NORMAL 0 64 + #define FM3130_MODE_WRITE 1 65 + #define FM3130_MODE_READ 2 66 + 67 + static void fm3130_rtc_mode(struct device *dev, int mode) 68 + { 69 + struct fm3130 *fm3130 = dev_get_drvdata(dev); 70 + 71 + fm3130->regs[FM3130_RTC_CONTROL] = 72 + i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL); 73 + switch (mode) { 74 + case FM3130_MODE_NORMAL: 75 + fm3130->regs[FM3130_RTC_CONTROL] &= 76 + ~(FM3130_RTC_CONTROL_BIT_WRITE | 77 + FM3130_RTC_CONTROL_BIT_READ); 78 + break; 79 + case FM3130_MODE_WRITE: 80 + fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_WRITE; 81 + break; 82 + case FM3130_MODE_READ: 83 + fm3130->regs[FM3130_RTC_CONTROL] |= FM3130_RTC_CONTROL_BIT_READ; 84 + break; 85 + default: 86 + dev_dbg(dev, "invalid mode %d\n", mode); 87 + break; 88 + } 89 + /* Checking for alarm */ 90 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { 91 + fm3130->alarm = 1; 92 + fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; 93 + } 94 + i2c_smbus_write_byte_data(fm3130->client, 95 + FM3130_RTC_CONTROL, fm3130->regs[FM3130_RTC_CONTROL]); 96 + } 97 + 98 + static int fm3130_get_time(struct device *dev, struct rtc_time *t) 99 + { 100 + struct fm3130 *fm3130 = dev_get_drvdata(dev); 101 + int tmp; 102 + 103 + if (!fm3130->data_valid) { 104 + /* We have invalid data in RTC, probably due 105 + to battery faults or other problems. Return EIO 106 + for now, it will allow us to set data later insted 107 + of error during probing which disables device */ 108 + return -EIO; 109 + } 110 + fm3130_rtc_mode(dev, FM3130_MODE_READ); 111 + 112 + /* read the RTC date and time registers all at once */ 113 + tmp = i2c_transfer(to_i2c_adapter(fm3130->client->dev.parent), 114 + fm3130->msg, 2); 115 + if (tmp != 2) { 116 + dev_err(dev, "%s error %d\n", "read", tmp); 117 + return -EIO; 118 + } 119 + 120 + fm3130_rtc_mode(dev, FM3130_MODE_NORMAL); 121 + 122 + dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x %02x" 123 + "%02x %02x %02x %02x %02x %02x %02x\n", 124 + "read", 125 + fm3130->regs[0], fm3130->regs[1], 126 + fm3130->regs[2], fm3130->regs[3], 127 + fm3130->regs[4], fm3130->regs[5], 128 + fm3130->regs[6], fm3130->regs[7], 129 + fm3130->regs[8], fm3130->regs[9], 130 + fm3130->regs[0xa], fm3130->regs[0xb], 131 + fm3130->regs[0xc], fm3130->regs[0xd], 132 + fm3130->regs[0xe]); 133 + 134 + t->tm_sec = BCD2BIN(fm3130->regs[FM3130_RTC_SECONDS] & 0x7f); 135 + t->tm_min = BCD2BIN(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f); 136 + tmp = fm3130->regs[FM3130_RTC_HOURS] & 0x3f; 137 + t->tm_hour = BCD2BIN(tmp); 138 + t->tm_wday = BCD2BIN(fm3130->regs[FM3130_RTC_DAY] & 0x07) - 1; 139 + t->tm_mday = BCD2BIN(fm3130->regs[FM3130_RTC_DATE] & 0x3f); 140 + tmp = fm3130->regs[FM3130_RTC_MONTHS] & 0x1f; 141 + t->tm_mon = BCD2BIN(tmp) - 1; 142 + 143 + /* assume 20YY not 19YY, and ignore CF bit */ 144 + t->tm_year = BCD2BIN(fm3130->regs[FM3130_RTC_YEARS]) + 100; 145 + 146 + dev_dbg(dev, "%s secs=%d, mins=%d, " 147 + "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 148 + "read", t->tm_sec, t->tm_min, 149 + t->tm_hour, t->tm_mday, 150 + t->tm_mon, t->tm_year, t->tm_wday); 151 + 152 + /* initial clock setting can be undefined */ 153 + return rtc_valid_tm(t); 154 + } 155 + 156 + 157 + static int fm3130_set_time(struct device *dev, struct rtc_time *t) 158 + { 159 + struct fm3130 *fm3130 = dev_get_drvdata(dev); 160 + int tmp, i; 161 + u8 *buf = fm3130->regs; 162 + 163 + dev_dbg(dev, "%s secs=%d, mins=%d, " 164 + "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 165 + "write", t->tm_sec, t->tm_min, 166 + t->tm_hour, t->tm_mday, 167 + t->tm_mon, t->tm_year, t->tm_wday); 168 + 169 + /* first register addr */ 170 + buf[FM3130_RTC_SECONDS] = BIN2BCD(t->tm_sec); 171 + buf[FM3130_RTC_MINUTES] = BIN2BCD(t->tm_min); 172 + buf[FM3130_RTC_HOURS] = BIN2BCD(t->tm_hour); 173 + buf[FM3130_RTC_DAY] = BIN2BCD(t->tm_wday + 1); 174 + buf[FM3130_RTC_DATE] = BIN2BCD(t->tm_mday); 175 + buf[FM3130_RTC_MONTHS] = BIN2BCD(t->tm_mon + 1); 176 + 177 + /* assume 20YY not 19YY */ 178 + tmp = t->tm_year - 100; 179 + buf[FM3130_RTC_YEARS] = BIN2BCD(tmp); 180 + 181 + dev_dbg(dev, "%s: %02x %02x %02x %02x %02x %02x %02x" 182 + "%02x %02x %02x %02x %02x %02x %02x %02x\n", 183 + "write", buf[0], buf[1], buf[2], buf[3], 184 + buf[4], buf[5], buf[6], buf[7], 185 + buf[8], buf[9], buf[0xa], buf[0xb], 186 + buf[0xc], buf[0xd], buf[0xe]); 187 + 188 + fm3130_rtc_mode(dev, FM3130_MODE_WRITE); 189 + 190 + /* Writing time registers, we don't support multibyte transfers */ 191 + for (i = 0; i < FM3130_CLOCK_REGS; i++) { 192 + i2c_smbus_write_byte_data(fm3130->client, 193 + FM3130_RTC_SECONDS + i, 194 + fm3130->regs[FM3130_RTC_SECONDS + i]); 195 + } 196 + 197 + fm3130_rtc_mode(dev, FM3130_MODE_NORMAL); 198 + 199 + /* We assume here that data are valid once written */ 200 + if (!fm3130->data_valid) 201 + fm3130->data_valid = 1; 202 + return 0; 203 + } 204 + 205 + static int fm3130_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 206 + { 207 + struct fm3130 *fm3130 = dev_get_drvdata(dev); 208 + int tmp; 209 + struct rtc_time *tm = &alrm->time; 210 + /* read the RTC alarm registers all at once */ 211 + tmp = i2c_transfer(to_i2c_adapter(fm3130->client->dev.parent), 212 + &fm3130->msg[2], 2); 213 + if (tmp != 2) { 214 + dev_err(dev, "%s error %d\n", "read", tmp); 215 + return -EIO; 216 + } 217 + dev_dbg(dev, "alarm read %02x %02x %02x %02x %02x\n", 218 + fm3130->regs[FM3130_ALARM_SECONDS], 219 + fm3130->regs[FM3130_ALARM_MINUTES], 220 + fm3130->regs[FM3130_ALARM_HOURS], 221 + fm3130->regs[FM3130_ALARM_DATE], 222 + fm3130->regs[FM3130_ALARM_MONTHS]); 223 + 224 + 225 + tm->tm_sec = BCD2BIN(fm3130->regs[FM3130_ALARM_SECONDS] & 0x7F); 226 + tm->tm_min = BCD2BIN(fm3130->regs[FM3130_ALARM_MINUTES] & 0x7F); 227 + tm->tm_hour = BCD2BIN(fm3130->regs[FM3130_ALARM_HOURS] & 0x3F); 228 + tm->tm_mday = BCD2BIN(fm3130->regs[FM3130_ALARM_DATE] & 0x3F); 229 + tm->tm_mon = BCD2BIN(fm3130->regs[FM3130_ALARM_MONTHS] & 0x1F); 230 + if (tm->tm_mon > 0) 231 + tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */ 232 + dev_dbg(dev, "%s secs=%d, mins=%d, " 233 + "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 234 + "read alarm", tm->tm_sec, tm->tm_min, 235 + tm->tm_hour, tm->tm_mday, 236 + tm->tm_mon, tm->tm_year, tm->tm_wday); 237 + 238 + return 0; 239 + } 240 + 241 + static int fm3130_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 242 + { 243 + struct fm3130 *fm3130 = dev_get_drvdata(dev); 244 + struct rtc_time *tm = &alrm->time; 245 + int i; 246 + 247 + dev_dbg(dev, "%s secs=%d, mins=%d, " 248 + "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n", 249 + "write alarm", tm->tm_sec, tm->tm_min, 250 + tm->tm_hour, tm->tm_mday, 251 + tm->tm_mon, tm->tm_year, tm->tm_wday); 252 + 253 + if (tm->tm_sec != -1) 254 + fm3130->regs[FM3130_ALARM_SECONDS] = 255 + BIN2BCD(tm->tm_sec) | 0x80; 256 + 257 + if (tm->tm_min != -1) 258 + fm3130->regs[FM3130_ALARM_MINUTES] = 259 + BIN2BCD(tm->tm_min) | 0x80; 260 + 261 + if (tm->tm_hour != -1) 262 + fm3130->regs[FM3130_ALARM_HOURS] = 263 + BIN2BCD(tm->tm_hour) | 0x80; 264 + 265 + if (tm->tm_mday != -1) 266 + fm3130->regs[FM3130_ALARM_DATE] = 267 + BIN2BCD(tm->tm_mday) | 0x80; 268 + 269 + if (tm->tm_mon != -1) 270 + fm3130->regs[FM3130_ALARM_MONTHS] = 271 + BIN2BCD(tm->tm_mon + 1) | 0x80; 272 + 273 + dev_dbg(dev, "alarm write %02x %02x %02x %02x %02x\n", 274 + fm3130->regs[FM3130_ALARM_SECONDS], 275 + fm3130->regs[FM3130_ALARM_MINUTES], 276 + fm3130->regs[FM3130_ALARM_HOURS], 277 + fm3130->regs[FM3130_ALARM_DATE], 278 + fm3130->regs[FM3130_ALARM_MONTHS]); 279 + /* Writing time registers, we don't support multibyte transfers */ 280 + for (i = 0; i < FM3130_ALARM_REGS; i++) { 281 + i2c_smbus_write_byte_data(fm3130->client, 282 + FM3130_ALARM_SECONDS + i, 283 + fm3130->regs[FM3130_ALARM_SECONDS + i]); 284 + } 285 + fm3130->regs[FM3130_RTC_CONTROL] = 286 + i2c_smbus_read_byte_data(fm3130->client, FM3130_RTC_CONTROL); 287 + /* Checking for alarm */ 288 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { 289 + fm3130->alarm = 1; 290 + fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; 291 + } 292 + if (alrm->enabled) { 293 + i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL, 294 + (fm3130->regs[FM3130_RTC_CONTROL] & 295 + ~(FM3130_RTC_CONTROL_BIT_CAL)) | 296 + FM3130_RTC_CONTROL_BIT_AEN); 297 + } else { 298 + i2c_smbus_write_byte_data(fm3130->client, FM3130_RTC_CONTROL, 299 + fm3130->regs[FM3130_RTC_CONTROL] & 300 + ~(FM3130_RTC_CONTROL_BIT_AEN)); 301 + } 302 + return 0; 303 + } 304 + 305 + static const struct rtc_class_ops fm3130_rtc_ops = { 306 + .read_time = fm3130_get_time, 307 + .set_time = fm3130_set_time, 308 + .read_alarm = fm3130_read_alarm, 309 + .set_alarm = fm3130_set_alarm, 310 + }; 311 + 312 + static struct i2c_driver fm3130_driver; 313 + 314 + static int __devinit fm3130_probe(struct i2c_client *client, 315 + const struct i2c_device_id *id) 316 + { 317 + struct fm3130 *fm3130; 318 + int err = -ENODEV; 319 + int tmp; 320 + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); 321 + 322 + if (!i2c_check_functionality(adapter, 323 + I2C_FUNC_I2C | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) 324 + return -EIO; 325 + 326 + fm3130 = kzalloc(sizeof(struct fm3130), GFP_KERNEL); 327 + 328 + if (!fm3130) 329 + return -ENOMEM; 330 + 331 + fm3130->client = client; 332 + i2c_set_clientdata(client, fm3130); 333 + fm3130->reg_addr_time = FM3130_RTC_SECONDS; 334 + fm3130->reg_addr_alarm = FM3130_ALARM_SECONDS; 335 + 336 + /* Messages to read time */ 337 + fm3130->msg[0].addr = client->addr; 338 + fm3130->msg[0].flags = 0; 339 + fm3130->msg[0].len = 1; 340 + fm3130->msg[0].buf = &fm3130->reg_addr_time; 341 + 342 + fm3130->msg[1].addr = client->addr; 343 + fm3130->msg[1].flags = I2C_M_RD; 344 + fm3130->msg[1].len = FM3130_CLOCK_REGS; 345 + fm3130->msg[1].buf = &fm3130->regs[FM3130_RTC_SECONDS]; 346 + 347 + /* Messages to read alarm */ 348 + fm3130->msg[2].addr = client->addr; 349 + fm3130->msg[2].flags = 0; 350 + fm3130->msg[2].len = 1; 351 + fm3130->msg[2].buf = &fm3130->reg_addr_alarm; 352 + 353 + fm3130->msg[3].addr = client->addr; 354 + fm3130->msg[3].flags = I2C_M_RD; 355 + fm3130->msg[3].len = FM3130_ALARM_REGS; 356 + fm3130->msg[3].buf = &fm3130->regs[FM3130_ALARM_SECONDS]; 357 + 358 + fm3130->data_valid = 0; 359 + 360 + tmp = i2c_transfer(adapter, fm3130->msg, 4); 361 + if (tmp != 4) { 362 + pr_debug("read error %d\n", tmp); 363 + err = -EIO; 364 + goto exit_free; 365 + } 366 + 367 + fm3130->regs[FM3130_RTC_CONTROL] = 368 + i2c_smbus_read_byte_data(client, FM3130_RTC_CONTROL); 369 + fm3130->regs[FM3130_CAL_CONTROL] = 370 + i2c_smbus_read_byte_data(client, FM3130_CAL_CONTROL); 371 + 372 + /* Checking for alarm */ 373 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_AF) { 374 + fm3130->alarm = 1; 375 + fm3130->regs[FM3130_RTC_CONTROL] &= ~FM3130_RTC_CONTROL_BIT_AF; 376 + } 377 + 378 + /* Disabling calibration mode */ 379 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_CAL) 380 + i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, 381 + fm3130->regs[FM3130_RTC_CONTROL] & 382 + ~(FM3130_RTC_CONTROL_BIT_CAL)); 383 + dev_warn(&client->dev, "Disabling calibration mode!\n"); 384 + 385 + /* Disabling read and write modes */ 386 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_WRITE || 387 + fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_READ) 388 + i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, 389 + fm3130->regs[FM3130_RTC_CONTROL] & 390 + ~(FM3130_RTC_CONTROL_BIT_READ | 391 + FM3130_RTC_CONTROL_BIT_WRITE)); 392 + dev_warn(&client->dev, "Disabling READ or WRITE mode!\n"); 393 + 394 + /* oscillator off? turn it on, so clock can tick. */ 395 + if (fm3130->regs[FM3130_CAL_CONTROL] & FM3130_CAL_CONTROL_BIT_nOSCEN) 396 + i2c_smbus_write_byte_data(client, FM3130_CAL_CONTROL, 397 + fm3130->regs[FM3130_CAL_CONTROL] & 398 + ~(FM3130_CAL_CONTROL_BIT_nOSCEN)); 399 + 400 + /* oscillator fault? clear flag, and warn */ 401 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_LB) 402 + dev_warn(&client->dev, "Low battery!\n"); 403 + 404 + /* oscillator fault? clear flag, and warn */ 405 + if (fm3130->regs[FM3130_RTC_CONTROL] & FM3130_RTC_CONTROL_BIT_POR) { 406 + i2c_smbus_write_byte_data(client, FM3130_RTC_CONTROL, 407 + fm3130->regs[FM3130_RTC_CONTROL] & 408 + ~FM3130_RTC_CONTROL_BIT_POR); 409 + dev_warn(&client->dev, "SET TIME!\n"); 410 + } 411 + /* ACS is controlled by alarm */ 412 + i2c_smbus_write_byte_data(client, FM3130_ALARM_WP_CONTROL, 0x80); 413 + 414 + /* TODO */ 415 + /* TODO need to sanity check alarm */ 416 + tmp = fm3130->regs[FM3130_RTC_SECONDS]; 417 + tmp = BCD2BIN(tmp & 0x7f); 418 + if (tmp > 60) 419 + goto exit_bad; 420 + tmp = BCD2BIN(fm3130->regs[FM3130_RTC_MINUTES] & 0x7f); 421 + if (tmp > 60) 422 + goto exit_bad; 423 + 424 + tmp = BCD2BIN(fm3130->regs[FM3130_RTC_DATE] & 0x3f); 425 + if (tmp == 0 || tmp > 31) 426 + goto exit_bad; 427 + 428 + tmp = BCD2BIN(fm3130->regs[FM3130_RTC_MONTHS] & 0x1f); 429 + if (tmp == 0 || tmp > 12) 430 + goto exit_bad; 431 + 432 + tmp = fm3130->regs[FM3130_RTC_HOURS]; 433 + 434 + fm3130->data_valid = 1; 435 + 436 + exit_bad: 437 + if (!fm3130->data_valid) 438 + dev_dbg(&client->dev, 439 + "%s: %02x %02x %02x %02x %02x %02x %02x %02x" 440 + "%02x %02x %02x %02x %02x %02x %02x\n", 441 + "bogus registers", 442 + fm3130->regs[0], fm3130->regs[1], 443 + fm3130->regs[2], fm3130->regs[3], 444 + fm3130->regs[4], fm3130->regs[5], 445 + fm3130->regs[6], fm3130->regs[7], 446 + fm3130->regs[8], fm3130->regs[9], 447 + fm3130->regs[0xa], fm3130->regs[0xb], 448 + fm3130->regs[0xc], fm3130->regs[0xd], 449 + fm3130->regs[0xe]); 450 + 451 + /* We won't bail out here because we just got invalid data. 452 + Time setting from u-boot doesn't work anyway */ 453 + fm3130->rtc = rtc_device_register(client->name, &client->dev, 454 + &fm3130_rtc_ops, THIS_MODULE); 455 + if (IS_ERR(fm3130->rtc)) { 456 + err = PTR_ERR(fm3130->rtc); 457 + dev_err(&client->dev, 458 + "unable to register the class device\n"); 459 + goto exit_free; 460 + } 461 + return 0; 462 + exit_free: 463 + kfree(fm3130); 464 + return err; 465 + } 466 + 467 + static int __devexit fm3130_remove(struct i2c_client *client) 468 + { 469 + struct fm3130 *fm3130 = i2c_get_clientdata(client); 470 + 471 + rtc_device_unregister(fm3130->rtc); 472 + kfree(fm3130); 473 + return 0; 474 + } 475 + 476 + static struct i2c_driver fm3130_driver = { 477 + .driver = { 478 + .name = "rtc-fm3130", 479 + .owner = THIS_MODULE, 480 + }, 481 + .probe = fm3130_probe, 482 + .remove = __devexit_p(fm3130_remove), 483 + .id_table = fm3130_id, 484 + }; 485 + 486 + static int __init fm3130_init(void) 487 + { 488 + return i2c_add_driver(&fm3130_driver); 489 + } 490 + module_init(fm3130_init); 491 + 492 + static void __exit fm3130_exit(void) 493 + { 494 + i2c_del_driver(&fm3130_driver); 495 + } 496 + module_exit(fm3130_exit); 497 + 498 + MODULE_DESCRIPTION("RTC driver for FM3130"); 499 + MODULE_AUTHOR("Sergey Lapin <slapin@ossfans.org>"); 500 + MODULE_LICENSE("GPL"); 501 +