diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/Kconfig | 8 | ||||
| -rw-r--r-- | drivers/rtc/hctosys.c | 4 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ds1307.c | 93 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ds1553.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ds1742.c | 5 | ||||
| -rw-r--r-- | drivers/rtc/rtc-m48t59.c | 3 | ||||
| -rw-r--r-- | drivers/rtc/rtc-stk17ta8.c | 2 | 
7 files changed, 108 insertions, 9 deletions
| diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index cbde770eb121..e5cdc0294aaa 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -36,7 +36,9 @@ config RTC_HCTOSYS_DEVICE | |||
| 36 | help | 36 | help | 
| 37 | The RTC device that will be used to (re)initialize the system | 37 | The RTC device that will be used to (re)initialize the system | 
| 38 | clock, usually rtc0. Initialization is done when the system | 38 | clock, usually rtc0. Initialization is done when the system | 
| 39 | starts up, and when it resumes from a low power state. | 39 | starts up, and when it resumes from a low power state. This | 
| 40 | device should record time in UTC, since the kernel won't do | ||
| 41 | timezone correction. | ||
| 40 | 42 | ||
| 41 | The driver for this RTC device must be loaded before late_initcall | 43 | The driver for this RTC device must be loaded before late_initcall | 
| 42 | functions run, so it must usually be statically linked. | 44 | functions run, so it must usually be statically linked. | 
| @@ -133,8 +135,8 @@ config RTC_DRV_DS1307 | |||
| 133 | 135 | ||
| 134 | The first seven registers on these chips hold an RTC, and other | 136 | The first seven registers on these chips hold an RTC, and other | 
| 135 | registers may add features such as NVRAM, a trickle charger for | 137 | registers may add features such as NVRAM, a trickle charger for | 
| 136 | the RTC/NVRAM backup power, and alarms. This driver may not | 138 | the RTC/NVRAM backup power, and alarms. NVRAM is visible in | 
| 137 | expose all those available chip features. | 139 | sysfs, but other chip features may not be available. | 
| 138 | 140 | ||
| 139 | This driver can also be built as a module. If so, the module | 141 | This driver can also be built as a module. If so, the module | 
| 140 | will be called rtc-ds1307. | 142 | will be called rtc-ds1307. | 
| diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c index 178527252c6a..33c0e98243ee 100644 --- a/drivers/rtc/hctosys.c +++ b/drivers/rtc/hctosys.c | |||
| @@ -47,8 +47,8 @@ static int __init rtc_hctosys(void) | |||
| 47 | do_settimeofday(&tv); | 47 | do_settimeofday(&tv); | 
| 48 | 48 | ||
| 49 | dev_info(rtc->dev.parent, | 49 | dev_info(rtc->dev.parent, | 
| 50 | "setting the system clock to " | 50 | "setting system clock to " | 
| 51 | "%d-%02d-%02d %02d:%02d:%02d (%u)\n", | 51 | "%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n", | 
| 52 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | 52 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | 
| 53 | tm.tm_hour, tm.tm_min, tm.tm_sec, | 53 | tm.tm_hour, tm.tm_min, tm.tm_sec, | 
| 54 | (unsigned int) tv.tv_sec); | 54 | (unsigned int) tv.tv_sec); | 
| diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index db6f3f0d8982..bc1c7fe94ad3 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
| @@ -89,6 +89,7 @@ enum ds_type { | |||
| 89 | 89 | ||
| 90 | struct ds1307 { | 90 | struct ds1307 { | 
| 91 | u8 reg_addr; | 91 | u8 reg_addr; | 
| 92 | bool has_nvram; | ||
| 92 | u8 regs[8]; | 93 | u8 regs[8]; | 
| 93 | enum ds_type type; | 94 | enum ds_type type; | 
| 94 | struct i2c_msg msg[2]; | 95 | struct i2c_msg msg[2]; | 
| @@ -242,6 +243,87 @@ static const struct rtc_class_ops ds13xx_rtc_ops = { | |||
| 242 | .set_time = ds1307_set_time, | 243 | .set_time = ds1307_set_time, | 
| 243 | }; | 244 | }; | 
| 244 | 245 | ||
| 246 | /*----------------------------------------------------------------------*/ | ||
| 247 | |||
| 248 | #define NVRAM_SIZE 56 | ||
| 249 | |||
| 250 | static ssize_t | ||
| 251 | ds1307_nvram_read(struct kobject *kobj, struct bin_attribute *attr, | ||
| 252 | char *buf, loff_t off, size_t count) | ||
| 253 | { | ||
| 254 | struct i2c_client *client; | ||
| 255 | struct ds1307 *ds1307; | ||
| 256 | struct i2c_msg msg[2]; | ||
| 257 | int result; | ||
| 258 | |||
| 259 | client = to_i2c_client(container_of(kobj, struct device, kobj)); | ||
| 260 | ds1307 = i2c_get_clientdata(client); | ||
| 261 | |||
| 262 | if (unlikely(off >= NVRAM_SIZE)) | ||
| 263 | return 0; | ||
| 264 | if ((off + count) > NVRAM_SIZE) | ||
| 265 | count = NVRAM_SIZE - off; | ||
| 266 | if (unlikely(!count)) | ||
| 267 | return count; | ||
| 268 | |||
| 269 | msg[0].addr = client->addr; | ||
| 270 | msg[0].flags = 0; | ||
| 271 | msg[0].len = 1; | ||
| 272 | msg[0].buf = buf; | ||
| 273 | |||
| 274 | buf[0] = 8 + off; | ||
| 275 | |||
| 276 | msg[1].addr = client->addr; | ||
| 277 | msg[1].flags = I2C_M_RD; | ||
| 278 | msg[1].len = count; | ||
| 279 | msg[1].buf = buf; | ||
| 280 | |||
| 281 | result = i2c_transfer(to_i2c_adapter(client->dev.parent), msg, 2); | ||
| 282 | if (result != 2) { | ||
| 283 | dev_err(&client->dev, "%s error %d\n", "nvram read", result); | ||
| 284 | return -EIO; | ||
| 285 | } | ||
| 286 | return count; | ||
| 287 | } | ||
| 288 | |||
| 289 | static ssize_t | ||
| 290 | ds1307_nvram_write(struct kobject *kobj, struct bin_attribute *attr, | ||
| 291 | char *buf, loff_t off, size_t count) | ||
| 292 | { | ||
| 293 | struct i2c_client *client; | ||
| 294 | u8 buffer[NVRAM_SIZE + 1]; | ||
| 295 | int ret; | ||
| 296 | |||
| 297 | client = to_i2c_client(container_of(kobj, struct device, kobj)); | ||
| 298 | |||
| 299 | if (unlikely(off >= NVRAM_SIZE)) | ||
| 300 | return -EFBIG; | ||
| 301 | if ((off + count) > NVRAM_SIZE) | ||
| 302 | count = NVRAM_SIZE - off; | ||
| 303 | if (unlikely(!count)) | ||
| 304 | return count; | ||
| 305 | |||
| 306 | buffer[0] = 8 + off; | ||
| 307 | memcpy(buffer + 1, buf, count); | ||
| 308 | |||
| 309 | ret = i2c_master_send(client, buffer, count + 1); | ||
| 310 | return (ret < 0) ? ret : (ret - 1); | ||
| 311 | } | ||
| 312 | |||
| 313 | static struct bin_attribute nvram = { | ||
| 314 | .attr = { | ||
| 315 | .name = "nvram", | ||
| 316 | .mode = S_IRUGO | S_IWUSR, | ||
| 317 | .owner = THIS_MODULE, | ||
| 318 | }, | ||
| 319 | |||
| 320 | .read = ds1307_nvram_read, | ||
| 321 | .write = ds1307_nvram_write, | ||
| 322 | .size = NVRAM_SIZE, | ||
| 323 | }; | ||
| 324 | |||
| 325 | /*----------------------------------------------------------------------*/ | ||
| 326 | |||
| 245 | static struct i2c_driver ds1307_driver; | 327 | static struct i2c_driver ds1307_driver; | 
| 246 | 328 | ||
| 247 | static int __devinit ds1307_probe(struct i2c_client *client) | 329 | static int __devinit ds1307_probe(struct i2c_client *client) | 
| @@ -413,6 +495,14 @@ read_rtc: | |||
| 413 | goto exit_free; | 495 | goto exit_free; | 
| 414 | } | 496 | } | 
| 415 | 497 | ||
| 498 | if (chip->nvram56) { | ||
| 499 | err = sysfs_create_bin_file(&client->dev.kobj, &nvram); | ||
| 500 | if (err == 0) { | ||
| 501 | ds1307->has_nvram = true; | ||
| 502 | dev_info(&client->dev, "56 bytes nvram\n"); | ||
| 503 | } | ||
| 504 | } | ||
| 505 | |||
| 416 | return 0; | 506 | return 0; | 
| 417 | 507 | ||
| 418 | exit_bad: | 508 | exit_bad: | 
| @@ -432,6 +522,9 @@ static int __devexit ds1307_remove(struct i2c_client *client) | |||
| 432 | { | 522 | { | 
| 433 | struct ds1307 *ds1307 = i2c_get_clientdata(client); | 523 | struct ds1307 *ds1307 = i2c_get_clientdata(client); | 
| 434 | 524 | ||
| 525 | if (ds1307->has_nvram) | ||
| 526 | sysfs_remove_bin_file(&client->dev.kobj, &nvram); | ||
| 527 | |||
| 435 | rtc_device_unregister(ds1307->rtc); | 528 | rtc_device_unregister(ds1307->rtc); | 
| 436 | kfree(ds1307); | 529 | kfree(ds1307); | 
| 437 | return 0; | 530 | return 0; | 
| diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index bb53c09bad16..d9e848dcd450 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c | |||
| @@ -291,7 +291,7 @@ static ssize_t ds1553_nvram_write(struct kobject *kobj, | |||
| 291 | static struct bin_attribute ds1553_nvram_attr = { | 291 | static struct bin_attribute ds1553_nvram_attr = { | 
| 292 | .attr = { | 292 | .attr = { | 
| 293 | .name = "nvram", | 293 | .name = "nvram", | 
| 294 | .mode = S_IRUGO | S_IWUGO, | 294 | .mode = S_IRUGO | S_IWUSR, | 
| 295 | }, | 295 | }, | 
| 296 | .size = RTC_OFFSET, | 296 | .size = RTC_OFFSET, | 
| 297 | .read = ds1553_nvram_read, | 297 | .read = ds1553_nvram_read, | 
| diff --git a/drivers/rtc/rtc-ds1742.c b/drivers/rtc/rtc-ds1742.c index c535b78698e2..2e73f0b183b2 100644 --- a/drivers/rtc/rtc-ds1742.c +++ b/drivers/rtc/rtc-ds1742.c | |||
| @@ -160,10 +160,13 @@ static ssize_t ds1742_nvram_write(struct kobject *kobj, | |||
| 160 | static struct bin_attribute ds1742_nvram_attr = { | 160 | static struct bin_attribute ds1742_nvram_attr = { | 
| 161 | .attr = { | 161 | .attr = { | 
| 162 | .name = "nvram", | 162 | .name = "nvram", | 
| 163 | .mode = S_IRUGO | S_IWUGO, | 163 | .mode = S_IRUGO | S_IWUSR, | 
| 164 | }, | 164 | }, | 
| 165 | .read = ds1742_nvram_read, | 165 | .read = ds1742_nvram_read, | 
| 166 | .write = ds1742_nvram_write, | 166 | .write = ds1742_nvram_write, | 
| 167 | /* REVISIT: size in sysfs won't match actual size... if it's | ||
| 168 | * not a constant, each RTC should have its own attribute. | ||
| 169 | */ | ||
| 167 | }; | 170 | }; | 
| 168 | 171 | ||
| 169 | static int __devinit ds1742_rtc_probe(struct platform_device *pdev) | 172 | static int __devinit ds1742_rtc_probe(struct platform_device *pdev) | 
| diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index 2bad1637330a..cd0bbc0e8038 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
| @@ -353,11 +353,12 @@ static ssize_t m48t59_nvram_write(struct kobject *kobj, | |||
| 353 | static struct bin_attribute m48t59_nvram_attr = { | 353 | static struct bin_attribute m48t59_nvram_attr = { | 
| 354 | .attr = { | 354 | .attr = { | 
| 355 | .name = "nvram", | 355 | .name = "nvram", | 
| 356 | .mode = S_IRUGO | S_IWUGO, | 356 | .mode = S_IRUGO | S_IWUSR, | 
| 357 | .owner = THIS_MODULE, | 357 | .owner = THIS_MODULE, | 
| 358 | }, | 358 | }, | 
| 359 | .read = m48t59_nvram_read, | 359 | .read = m48t59_nvram_read, | 
| 360 | .write = m48t59_nvram_write, | 360 | .write = m48t59_nvram_write, | 
| 361 | .size = M48T59_NVRAM_SIZE, | ||
| 361 | }; | 362 | }; | 
| 362 | 363 | ||
| 363 | static int __devinit m48t59_rtc_probe(struct platform_device *pdev) | 364 | static int __devinit m48t59_rtc_probe(struct platform_device *pdev) | 
| diff --git a/drivers/rtc/rtc-stk17ta8.c b/drivers/rtc/rtc-stk17ta8.c index 8288b6b2bf2b..a265da7c6ff8 100644 --- a/drivers/rtc/rtc-stk17ta8.c +++ b/drivers/rtc/rtc-stk17ta8.c | |||
| @@ -291,7 +291,7 @@ static ssize_t stk17ta8_nvram_write(struct kobject *kobj, | |||
| 291 | static struct bin_attribute stk17ta8_nvram_attr = { | 291 | static struct bin_attribute stk17ta8_nvram_attr = { | 
| 292 | .attr = { | 292 | .attr = { | 
| 293 | .name = "nvram", | 293 | .name = "nvram", | 
| 294 | .mode = S_IRUGO | S_IWUGO, | 294 | .mode = S_IRUGO | S_IWUSR, | 
| 295 | .owner = THIS_MODULE, | 295 | .owner = THIS_MODULE, | 
| 296 | }, | 296 | }, | 
| 297 | .size = RTC_OFFSET, | 297 | .size = RTC_OFFSET, | 
