Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtc: ds3232: convert to use regmap

This is preparation for merging rtc-ds3232 i2c driver and rtc-ds3234
spi driver.

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Cc: Dennis Aberilla <denzzzhome@yahoo.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>

authored by

Akinobu Mita and committed by
Alexandre Belloni
370927c4 832315b0

+113 -103
+113 -103
drivers/rtc/rtc-ds3232.c
··· 9 9 * Free Software Foundation; either version 2 of the License, or (at your 10 10 * option) any later version. 11 11 */ 12 - /* 13 - * It would be more efficient to use i2c msgs/i2c_transfer directly but, as 14 - * recommened in .../Documentation/i2c/writing-clients section 15 - * "Sending and receiving", using SMBus level communication is preferred. 16 - */ 17 12 18 13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 19 14 ··· 20 25 #include <linux/bcd.h> 21 26 #include <linux/workqueue.h> 22 27 #include <linux/slab.h> 28 + #include <linux/regmap.h> 23 29 24 30 #define DS3232_REG_SECONDS 0x00 25 31 #define DS3232_REG_MINUTES 0x01 ··· 46 50 # define DS3232_REG_SR_A1F 0x01 47 51 48 52 struct ds3232 { 49 - struct i2c_client *client; 53 + struct device *dev; 54 + struct regmap *regmap; 55 + int irq; 50 56 struct rtc_device *rtc; 51 57 struct work_struct work; 52 58 ··· 61 63 int exiting; 62 64 }; 63 65 64 - static struct i2c_driver ds3232_driver; 65 - 66 - static int ds3232_check_rtc_status(struct i2c_client *client) 66 + static int ds3232_check_rtc_status(struct device *dev) 67 67 { 68 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 68 69 int ret = 0; 69 70 int control, stat; 70 71 71 - stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR); 72 - if (stat < 0) 73 - return stat; 72 + ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat); 73 + if (ret) 74 + return ret; 74 75 75 76 if (stat & DS3232_REG_SR_OSF) 76 - dev_warn(&client->dev, 77 + dev_warn(dev, 77 78 "oscillator discontinuity flagged, " 78 79 "time unreliable\n"); 79 80 80 81 stat &= ~(DS3232_REG_SR_OSF | DS3232_REG_SR_A1F | DS3232_REG_SR_A2F); 81 82 82 - ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat); 83 - if (ret < 0) 83 + ret = regmap_write(ds3232->regmap, DS3232_REG_SR, stat); 84 + if (ret) 84 85 return ret; 85 86 86 87 /* If the alarm is pending, clear it before requesting ··· 87 90 * before everything is initialized. 88 91 */ 89 92 90 - control = i2c_smbus_read_byte_data(client, DS3232_REG_CR); 91 - if (control < 0) 92 - return control; 93 + ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control); 94 + if (ret) 95 + return ret; 93 96 94 97 control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE); 95 98 control |= DS3232_REG_CR_INTCN; 96 99 97 - return i2c_smbus_write_byte_data(client, DS3232_REG_CR, control); 100 + return regmap_write(ds3232->regmap, DS3232_REG_CR, control); 98 101 } 99 102 100 103 static int ds3232_read_time(struct device *dev, struct rtc_time *time) 101 104 { 102 - struct i2c_client *client = to_i2c_client(dev); 105 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 103 106 int ret; 104 107 u8 buf[7]; 105 108 unsigned int year, month, day, hour, minute, second; 106 109 unsigned int week, twelve_hr, am_pm; 107 110 unsigned int century, add_century = 0; 108 111 109 - ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_SECONDS, 7, buf); 110 - 111 - if (ret < 0) 112 + ret = regmap_bulk_read(ds3232->regmap, DS3232_REG_SECONDS, buf, 7); 113 + if (ret) 112 114 return ret; 113 - if (ret < 7) 114 - return -EIO; 115 115 116 116 second = buf[0]; 117 117 minute = buf[1]; ··· 153 159 154 160 static int ds3232_set_time(struct device *dev, struct rtc_time *time) 155 161 { 156 - struct i2c_client *client = to_i2c_client(dev); 162 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 157 163 u8 buf[7]; 158 164 159 165 /* Extract time from rtc_time and load into ds3232*/ ··· 173 179 buf[6] = bin2bcd(time->tm_year); 174 180 } 175 181 176 - return i2c_smbus_write_i2c_block_data(client, 177 - DS3232_REG_SECONDS, 7, buf); 182 + return regmap_bulk_write(ds3232->regmap, DS3232_REG_SECONDS, buf, 7); 178 183 } 179 184 180 185 /* ··· 183 190 */ 184 191 static int ds3232_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) 185 192 { 186 - struct i2c_client *client = to_i2c_client(dev); 187 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 193 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 188 194 int control, stat; 189 195 int ret; 190 196 u8 buf[4]; 191 197 192 198 mutex_lock(&ds3232->mutex); 193 199 194 - ret = i2c_smbus_read_byte_data(client, DS3232_REG_SR); 195 - if (ret < 0) 200 + ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat); 201 + if (ret) 196 202 goto out; 197 - stat = ret; 198 - ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR); 199 - if (ret < 0) 203 + ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control); 204 + if (ret) 200 205 goto out; 201 - control = ret; 202 - ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf); 203 - if (ret < 0) 206 + ret = regmap_bulk_read(ds3232->regmap, DS3232_REG_ALARM1, buf, 4); 207 + if (ret) 204 208 goto out; 205 209 206 210 alarm->time.tm_sec = bcd2bin(buf[0] & 0x7F); ··· 226 236 */ 227 237 static int ds3232_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) 228 238 { 229 - struct i2c_client *client = to_i2c_client(dev); 230 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 239 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 231 240 int control, stat; 232 241 int ret; 233 242 u8 buf[4]; 234 243 235 - if (client->irq <= 0) 244 + if (ds3232->irq <= 0) 236 245 return -EINVAL; 237 246 238 247 mutex_lock(&ds3232->mutex); ··· 242 253 buf[3] = bin2bcd(alarm->time.tm_mday); 243 254 244 255 /* clear alarm interrupt enable bit */ 245 - ret = i2c_smbus_read_byte_data(client, DS3232_REG_CR); 246 - if (ret < 0) 256 + ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control); 257 + if (ret) 247 258 goto out; 248 - control = ret; 249 259 control &= ~(DS3232_REG_CR_A1IE | DS3232_REG_CR_A2IE); 250 - ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control); 251 - if (ret < 0) 260 + ret = regmap_write(ds3232->regmap, DS3232_REG_CR, control); 261 + if (ret) 252 262 goto out; 253 263 254 264 /* clear any pending alarm flag */ 255 - ret = i2c_smbus_read_byte_data(client, DS3232_REG_SR); 256 - if (ret < 0) 265 + ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat); 266 + if (ret) 257 267 goto out; 258 - stat = ret; 259 268 stat &= ~(DS3232_REG_SR_A1F | DS3232_REG_SR_A2F); 260 - ret = i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat); 261 - if (ret < 0) 269 + ret = regmap_write(ds3232->regmap, DS3232_REG_SR, stat); 270 + if (ret) 262 271 goto out; 263 272 264 - ret = i2c_smbus_write_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf); 273 + ret = regmap_bulk_write(ds3232->regmap, DS3232_REG_ALARM1, buf, 4); 265 274 266 275 if (alarm->enabled) { 267 276 control |= DS3232_REG_CR_A1IE; 268 - ret = i2c_smbus_write_byte_data(client, DS3232_REG_CR, control); 277 + ret = regmap_write(ds3232->regmap, DS3232_REG_CR, control); 269 278 } 270 279 out: 271 280 mutex_unlock(&ds3232->mutex); 272 281 return ret; 273 282 } 274 283 275 - static void ds3232_update_alarm(struct i2c_client *client) 284 + static void ds3232_update_alarm(struct device *dev) 276 285 { 277 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 286 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 278 287 int control; 279 288 int ret; 280 289 u8 buf[4]; 281 290 282 291 mutex_lock(&ds3232->mutex); 283 292 284 - ret = i2c_smbus_read_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf); 285 - if (ret < 0) 293 + ret = regmap_bulk_read(ds3232->regmap, DS3232_REG_ALARM1, buf, 4); 294 + if (ret) 286 295 goto unlock; 287 296 288 297 buf[0] = bcd2bin(buf[0]) < 0 || (ds3232->rtc->irq_data & RTC_UF) ? ··· 292 305 buf[3] = bcd2bin(buf[3]) < 0 || (ds3232->rtc->irq_data & RTC_UF) ? 293 306 0x80 : buf[3]; 294 307 295 - ret = i2c_smbus_write_i2c_block_data(client, DS3232_REG_ALARM1, 4, buf); 296 - if (ret < 0) 308 + ret = regmap_bulk_write(ds3232->regmap, DS3232_REG_ALARM1, buf, 4); 309 + if (ret) 297 310 goto unlock; 298 311 299 - control = i2c_smbus_read_byte_data(client, DS3232_REG_CR); 300 - if (control < 0) 312 + ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control); 313 + if (ret) 301 314 goto unlock; 302 315 303 316 if (ds3232->rtc->irq_data & (RTC_AF | RTC_UF)) ··· 306 319 else 307 320 /* disable alarm1 interrupt */ 308 321 control &= ~(DS3232_REG_CR_A1IE); 309 - i2c_smbus_write_byte_data(client, DS3232_REG_CR, control); 322 + regmap_write(ds3232->regmap, DS3232_REG_CR, control); 310 323 311 324 unlock: 312 325 mutex_unlock(&ds3232->mutex); ··· 314 327 315 328 static int ds3232_alarm_irq_enable(struct device *dev, unsigned int enabled) 316 329 { 317 - struct i2c_client *client = to_i2c_client(dev); 318 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 330 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 319 331 320 - if (client->irq <= 0) 332 + if (ds3232->irq <= 0) 321 333 return -EINVAL; 322 334 323 335 if (enabled) ··· 324 338 else 325 339 ds3232->rtc->irq_data &= ~RTC_AF; 326 340 327 - ds3232_update_alarm(client); 341 + ds3232_update_alarm(dev); 328 342 return 0; 329 343 } 330 344 331 345 static irqreturn_t ds3232_irq(int irq, void *dev_id) 332 346 { 333 - struct i2c_client *client = dev_id; 334 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 347 + struct device *dev = dev_id; 348 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 335 349 336 350 disable_irq_nosync(irq); 337 351 ··· 349 363 static void ds3232_work(struct work_struct *work) 350 364 { 351 365 struct ds3232 *ds3232 = container_of(work, struct ds3232, work); 352 - struct i2c_client *client = ds3232->client; 366 + int ret; 353 367 int stat, control; 354 368 355 369 mutex_lock(&ds3232->mutex); 356 370 357 - stat = i2c_smbus_read_byte_data(client, DS3232_REG_SR); 358 - if (stat < 0) 371 + ret = regmap_read(ds3232->regmap, DS3232_REG_SR, &stat); 372 + if (ret) 359 373 goto unlock; 360 374 361 375 if (stat & DS3232_REG_SR_A1F) { 362 - control = i2c_smbus_read_byte_data(client, DS3232_REG_CR); 363 - if (control < 0) { 376 + ret = regmap_read(ds3232->regmap, DS3232_REG_CR, &control); 377 + if (ret) { 364 378 pr_warn("Read Control Register error - Disable IRQ%d\n", 365 - client->irq); 379 + ds3232->irq); 366 380 } else { 367 381 /* disable alarm1 interrupt */ 368 382 control &= ~(DS3232_REG_CR_A1IE); 369 - i2c_smbus_write_byte_data(client, DS3232_REG_CR, 370 - control); 383 + regmap_write(ds3232->regmap, DS3232_REG_CR, control); 371 384 372 385 /* clear the alarm pend flag */ 373 386 stat &= ~DS3232_REG_SR_A1F; 374 - i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat); 387 + regmap_write(ds3232->regmap, DS3232_REG_SR, stat); 375 388 376 389 rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF); 377 390 378 391 if (!ds3232->exiting) 379 - enable_irq(client->irq); 392 + enable_irq(ds3232->irq); 380 393 } 381 394 } 382 395 ··· 391 406 .alarm_irq_enable = ds3232_alarm_irq_enable, 392 407 }; 393 408 394 - static int ds3232_probe(struct i2c_client *client, 395 - const struct i2c_device_id *id) 409 + static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq, 410 + const char *name) 396 411 { 397 412 struct ds3232 *ds3232; 398 413 int ret; 399 414 400 - ds3232 = devm_kzalloc(&client->dev, sizeof(struct ds3232), GFP_KERNEL); 415 + ds3232 = devm_kzalloc(dev, sizeof(*ds3232), GFP_KERNEL); 401 416 if (!ds3232) 402 417 return -ENOMEM; 403 418 404 - ds3232->client = client; 405 - i2c_set_clientdata(client, ds3232); 419 + ds3232->regmap = regmap; 420 + ds3232->irq = irq; 421 + ds3232->dev = dev; 422 + dev_set_drvdata(dev, ds3232); 406 423 407 424 INIT_WORK(&ds3232->work, ds3232_work); 408 425 mutex_init(&ds3232->mutex); 409 426 410 - ret = ds3232_check_rtc_status(client); 427 + ret = ds3232_check_rtc_status(dev); 411 428 if (ret) 412 429 return ret; 413 430 414 - if (client->irq > 0) { 415 - ret = devm_request_irq(&client->dev, client->irq, ds3232_irq, 416 - IRQF_SHARED, "ds3232", client); 431 + if (ds3232->irq > 0) { 432 + ret = devm_request_irq(dev, ds3232->irq, ds3232_irq, 433 + IRQF_SHARED, name, dev); 417 434 if (ret) { 418 - dev_err(&client->dev, "unable to request IRQ\n"); 419 - } 420 - device_init_wakeup(&client->dev, 1); 435 + ds3232->irq = 0; 436 + dev_err(dev, "unable to request IRQ\n"); 437 + } else 438 + device_init_wakeup(dev, 1); 421 439 } 422 - ds3232->rtc = devm_rtc_device_register(&client->dev, client->name, 423 - &ds3232_rtc_ops, THIS_MODULE); 440 + ds3232->rtc = devm_rtc_device_register(dev, name, &ds3232_rtc_ops, 441 + THIS_MODULE); 442 + 424 443 return PTR_ERR_OR_ZERO(ds3232->rtc); 425 444 } 426 445 427 - static int ds3232_remove(struct i2c_client *client) 446 + static int ds3232_remove(struct device *dev) 428 447 { 429 - struct ds3232 *ds3232 = i2c_get_clientdata(client); 448 + struct ds3232 *ds3232 = dev_get_drvdata(dev); 430 449 431 - if (client->irq > 0) { 450 + if (ds3232->irq > 0) { 432 451 mutex_lock(&ds3232->mutex); 433 452 ds3232->exiting = 1; 434 453 mutex_unlock(&ds3232->mutex); 435 454 436 - devm_free_irq(&client->dev, client->irq, client); 455 + devm_free_irq(dev, ds3232->irq, dev); 437 456 cancel_work_sync(&ds3232->work); 438 457 } 439 458 ··· 448 459 static int ds3232_suspend(struct device *dev) 449 460 { 450 461 struct ds3232 *ds3232 = dev_get_drvdata(dev); 451 - struct i2c_client *client = to_i2c_client(dev); 452 462 453 463 if (device_can_wakeup(dev)) { 454 464 ds3232->suspended = true; 455 - if (irq_set_irq_wake(client->irq, 1)) { 465 + if (irq_set_irq_wake(ds3232->irq, 1)) { 456 466 dev_warn_once(dev, "Cannot set wakeup source\n"); 457 467 ds3232->suspended = false; 458 468 } ··· 463 475 static int ds3232_resume(struct device *dev) 464 476 { 465 477 struct ds3232 *ds3232 = dev_get_drvdata(dev); 466 - struct i2c_client *client = to_i2c_client(dev); 467 478 468 479 if (ds3232->suspended) { 469 480 ds3232->suspended = false; ··· 470 483 /* Clear the hardware alarm pend flag */ 471 484 schedule_work(&ds3232->work); 472 485 473 - irq_set_irq_wake(client->irq, 0); 486 + irq_set_irq_wake(ds3232->irq, 0); 474 487 } 475 488 476 489 return 0; ··· 480 493 static const struct dev_pm_ops ds3232_pm_ops = { 481 494 SET_SYSTEM_SLEEP_PM_OPS(ds3232_suspend, ds3232_resume) 482 495 }; 496 + 497 + static int ds3232_i2c_probe(struct i2c_client *client, 498 + const struct i2c_device_id *id) 499 + { 500 + struct regmap *regmap; 501 + static const struct regmap_config config = { 502 + .reg_bits = 8, 503 + .val_bits = 8, 504 + }; 505 + 506 + regmap = devm_regmap_init_i2c(client, &config); 507 + if (IS_ERR(regmap)) { 508 + dev_err(&client->dev, "%s: regmap allocation failed: %ld\n", 509 + __func__, PTR_ERR(regmap)); 510 + return PTR_ERR(regmap); 511 + } 512 + 513 + return ds3232_probe(&client->dev, regmap, client->irq, client->name); 514 + } 515 + 516 + static int ds3232_i2c_remove(struct i2c_client *client) 517 + { 518 + return ds3232_remove(&client->dev); 519 + } 483 520 484 521 static const struct i2c_device_id ds3232_id[] = { 485 522 { "ds3232", 0 }, ··· 516 505 .name = "rtc-ds3232", 517 506 .pm = &ds3232_pm_ops, 518 507 }, 519 - .probe = ds3232_probe, 520 - .remove = ds3232_remove, 508 + .probe = ds3232_i2c_probe, 509 + .remove = ds3232_i2c_remove, 521 510 .id_table = ds3232_id, 522 511 }; 523 - 524 512 module_i2c_driver(ds3232_driver); 525 513 526 514 MODULE_AUTHOR("Srikanth Srinivasan <srikanth.srinivasan@freescale.com>");