aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-dev.c
diff options
context:
space:
mode:
authorLogan Gunthorpe <logang@deltatee.com>2017-03-17 14:48:21 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-03-21 01:44:33 -0400
commitd5ed9177f64fe95d9de79e6504d41612d9127e8a (patch)
tree4381e84b391db399b9e986582fc81aadf5bee6e9 /drivers/rtc/rtc-dev.c
parentdbef390d2eb0a7b0a6be21381a326d4e13953aba (diff)
rtc: utilize new cdev_device_add helper function
Mostly straightforward, but we had to remove the rtc_dev_add/del_device functions as they split up the cdev_add and the device_add. Doing this also revealed that there was likely another subtle bug: seeing cdev_add was done after device_register, the cdev probably was not ready before device_add when the uevent occurs. This would race with userspace, if it tried to use the device directly after the uevent. This is fixed just by using the new helper function. Another weird thing is this driver would, in some error cases, call cdev_add() without calling cdev_init. This patchset corrects this by avoiding calling cdev_add if the devt is not set. Signed-off-by: Logan Gunthorpe <logang@deltatee.com> Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/rtc/rtc-dev.c')
-rw-r--r--drivers/rtc/rtc-dev.c17
1 files changed, 0 insertions, 17 deletions
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c
index 6dc8f29697ab..e81a8711fea7 100644
--- a/drivers/rtc/rtc-dev.c
+++ b/drivers/rtc/rtc-dev.c
@@ -477,23 +477,6 @@ void rtc_dev_prepare(struct rtc_device *rtc)
477 477
478 cdev_init(&rtc->char_dev, &rtc_dev_fops); 478 cdev_init(&rtc->char_dev, &rtc_dev_fops);
479 rtc->char_dev.owner = rtc->owner; 479 rtc->char_dev.owner = rtc->owner;
480 rtc->char_dev.kobj.parent = &rtc->dev.kobj;
481}
482
483void rtc_dev_add_device(struct rtc_device *rtc)
484{
485 if (cdev_add(&rtc->char_dev, rtc->dev.devt, 1))
486 dev_warn(&rtc->dev, "%s: failed to add char device %d:%d\n",
487 rtc->name, MAJOR(rtc_devt), rtc->id);
488 else
489 dev_dbg(&rtc->dev, "%s: dev (%d:%d)\n", rtc->name,
490 MAJOR(rtc_devt), rtc->id);
491}
492
493void rtc_dev_del_device(struct rtc_device *rtc)
494{
495 if (rtc->dev.devt)
496 cdev_del(&rtc->char_dev);
497} 480}
498 481
499void __init rtc_dev_init(void) 482void __init rtc_dev_init(void)