diff options
Diffstat (limited to 'drivers/rtc/class.c')
| -rw-r--r-- | drivers/rtc/class.c | 20 | 
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index f77bc089eb6b..4b460c61f1d8 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c @@ -232,6 +232,7 @@ static struct rtc_device *rtc_allocate_device(void)  	rtc->pie_enabled = 0;  	set_bit(RTC_FEATURE_ALARM, rtc->features); +	set_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->features);  	return rtc;  } @@ -334,7 +335,8 @@ static void devm_rtc_unregister_device(void *data)  	 * letting any rtc_class_open() users access it again  	 */  	rtc_proc_del_device(rtc); -	cdev_device_del(&rtc->char_dev, &rtc->dev); +	if (!test_bit(RTC_NO_CDEV, &rtc->flags)) +		cdev_device_del(&rtc->char_dev, &rtc->dev);  	rtc->ops = NULL;  	mutex_unlock(&rtc->ops_lock);  } @@ -363,7 +365,9 @@ struct rtc_device *devm_rtc_allocate_device(struct device *dev)  	rtc->id = id;  	rtc->dev.parent = dev; -	dev_set_name(&rtc->dev, "rtc%d", id); +	err = dev_set_name(&rtc->dev, "rtc%d", id); +	if (err) +		return ERR_PTR(err);  	err = devm_add_action_or_reset(dev, devm_rtc_release_device, rtc);  	if (err) @@ -386,6 +390,12 @@ int __devm_rtc_register_device(struct module *owner, struct rtc_device *rtc)  	if (!rtc->ops->set_alarm)  		clear_bit(RTC_FEATURE_ALARM, rtc->features); +	if (rtc->uie_unsupported) +		clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->features); + +	if (rtc->ops->set_offset) +		set_bit(RTC_FEATURE_CORRECTION, rtc->features); +  	rtc->owner = owner;  	rtc_device_get_offset(rtc); @@ -397,12 +407,14 @@ int __devm_rtc_register_device(struct module *owner, struct rtc_device *rtc)  	rtc_dev_prepare(rtc);  	err = cdev_device_add(&rtc->char_dev, &rtc->dev); -	if (err) +	if (err) { +		set_bit(RTC_NO_CDEV, &rtc->flags);  		dev_warn(rtc->dev.parent, "failed to add char device %d:%d\n",  			 MAJOR(rtc->dev.devt), rtc->id); -	else +	} else {  		dev_dbg(rtc->dev.parent, "char device (%d:%d)\n",  			MAJOR(rtc->dev.devt), rtc->id); +	}  	rtc_proc_add_device(rtc);  |