aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-ds1374.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-ds1374.c')
-rw-r--r--drivers/rtc/rtc-ds1374.c35
1 files changed, 10 insertions, 25 deletions
diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c
index fef76868aae0..94366e12f40f 100644
--- a/drivers/rtc/rtc-ds1374.c
+++ b/drivers/rtc/rtc-ds1374.c
@@ -347,7 +347,7 @@ static int ds1374_probe(struct i2c_client *client,
347 struct ds1374 *ds1374; 347 struct ds1374 *ds1374;
348 int ret; 348 int ret;
349 349
350 ds1374 = kzalloc(sizeof(struct ds1374), GFP_KERNEL); 350 ds1374 = devm_kzalloc(&client->dev, sizeof(struct ds1374), GFP_KERNEL);
351 if (!ds1374) 351 if (!ds1374)
352 return -ENOMEM; 352 return -ENOMEM;
353 353
@@ -359,36 +359,27 @@ static int ds1374_probe(struct i2c_client *client,
359 359
360 ret = ds1374_check_rtc_status(client); 360 ret = ds1374_check_rtc_status(client);
361 if (ret) 361 if (ret)
362 goto out_free; 362 return ret;
363 363
364 if (client->irq > 0) { 364 if (client->irq > 0) {
365 ret = request_irq(client->irq, ds1374_irq, 0, 365 ret = devm_request_irq(&client->dev, client->irq, ds1374_irq, 0,
366 "ds1374", client); 366 "ds1374", client);
367 if (ret) { 367 if (ret) {
368 dev_err(&client->dev, "unable to request IRQ\n"); 368 dev_err(&client->dev, "unable to request IRQ\n");
369 goto out_free; 369 return ret;
370 } 370 }
371 371
372 device_set_wakeup_capable(&client->dev, 1); 372 device_set_wakeup_capable(&client->dev, 1);
373 } 373 }
374 374
375 ds1374->rtc = rtc_device_register(client->name, &client->dev, 375 ds1374->rtc = devm_rtc_device_register(&client->dev, client->name,
376 &ds1374_rtc_ops, THIS_MODULE); 376 &ds1374_rtc_ops, THIS_MODULE);
377 if (IS_ERR(ds1374->rtc)) { 377 if (IS_ERR(ds1374->rtc)) {
378 ret = PTR_ERR(ds1374->rtc);
379 dev_err(&client->dev, "unable to register the class device\n"); 378 dev_err(&client->dev, "unable to register the class device\n");
380 goto out_irq; 379 return PTR_ERR(ds1374->rtc);
381 } 380 }
382 381
383 return 0; 382 return 0;
384
385out_irq:
386 if (client->irq > 0)
387 free_irq(client->irq, client);
388
389out_free:
390 kfree(ds1374);
391 return ret;
392} 383}
393 384
394static int ds1374_remove(struct i2c_client *client) 385static int ds1374_remove(struct i2c_client *client)
@@ -400,16 +391,14 @@ static int ds1374_remove(struct i2c_client *client)
400 ds1374->exiting = 1; 391 ds1374->exiting = 1;
401 mutex_unlock(&ds1374->mutex); 392 mutex_unlock(&ds1374->mutex);
402 393
403 free_irq(client->irq, client); 394 devm_free_irq(&client->dev, client->irq, client);
404 cancel_work_sync(&ds1374->work); 395 cancel_work_sync(&ds1374->work);
405 } 396 }
406 397
407 rtc_device_unregister(ds1374->rtc);
408 kfree(ds1374);
409 return 0; 398 return 0;
410} 399}
411 400
412#ifdef CONFIG_PM 401#ifdef CONFIG_PM_SLEEP
413static int ds1374_suspend(struct device *dev) 402static int ds1374_suspend(struct device *dev)
414{ 403{
415 struct i2c_client *client = to_i2c_client(dev); 404 struct i2c_client *client = to_i2c_client(dev);
@@ -427,19 +416,15 @@ static int ds1374_resume(struct device *dev)
427 disable_irq_wake(client->irq); 416 disable_irq_wake(client->irq);
428 return 0; 417 return 0;
429} 418}
419#endif
430 420
431static SIMPLE_DEV_PM_OPS(ds1374_pm, ds1374_suspend, ds1374_resume); 421static SIMPLE_DEV_PM_OPS(ds1374_pm, ds1374_suspend, ds1374_resume);
432 422
433#define DS1374_PM (&ds1374_pm)
434#else
435#define DS1374_PM NULL
436#endif
437
438static struct i2c_driver ds1374_driver = { 423static struct i2c_driver ds1374_driver = {
439 .driver = { 424 .driver = {
440 .name = "rtc-ds1374", 425 .name = "rtc-ds1374",
441 .owner = THIS_MODULE, 426 .owner = THIS_MODULE,
442 .pm = DS1374_PM, 427 .pm = &ds1374_pm,
443 }, 428 },
444 .probe = ds1374_probe, 429 .probe = ds1374_probe,
445 .remove = ds1374_remove, 430 .remove = ds1374_remove,