rtc/hctosys: only claim the RTC provided the system time if it did
Without this patch /sys/class/rtc/$CONFIG_RTC_HCTOSYS_DEVICE/hctosys contains a 1 (meaning "This rtc was used to initialize the system clock") even if reading the time at bootup failed. Moreover change error handling in rtc_hctosys() to use goto and so reduce the indention level. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Cc: Paul Gortmaker <p_gortmaker@yahoo.com> Acked-by: Alessandro Zummo <a.zummo@towertech.it> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									019b4d123a
								
							
						
					
					
						commit
						d0ab4a4d50
					
				| @ -22,48 +22,57 @@ | ||||
|  * the best guess is to add 0.5s. | ||||
|  */ | ||||
| 
 | ||||
| int rtc_hctosys_ret = -ENODEV; | ||||
| 
 | ||||
| static int __init rtc_hctosys(void) | ||||
| { | ||||
| 	int err; | ||||
| 	int err = -ENODEV; | ||||
| 	struct rtc_time tm; | ||||
| 	struct timespec tv = { | ||||
| 		.tv_nsec = NSEC_PER_SEC >> 1, | ||||
| 	}; | ||||
| 	struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE); | ||||
| 
 | ||||
| 	if (rtc == NULL) { | ||||
| 		printk("%s: unable to open rtc device (%s)\n", | ||||
| 		pr_err("%s: unable to open rtc device (%s)\n", | ||||
| 			__FILE__, CONFIG_RTC_HCTOSYS_DEVICE); | ||||
| 		return -ENODEV; | ||||
| 		goto err_open; | ||||
| 	} | ||||
| 
 | ||||
| 	err = rtc_read_time(rtc, &tm); | ||||
| 	if (err == 0) { | ||||
| 		err = rtc_valid_tm(&tm); | ||||
| 		if (err == 0) { | ||||
| 			struct timespec tv; | ||||
| 
 | ||||
| 			tv.tv_nsec = NSEC_PER_SEC >> 1; | ||||
| 
 | ||||
| 			rtc_tm_to_time(&tm, &tv.tv_sec); | ||||
| 
 | ||||
| 			do_settimeofday(&tv); | ||||
| 
 | ||||
| 			dev_info(rtc->dev.parent, | ||||
| 				"setting system clock to " | ||||
| 				"%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n", | ||||
| 				tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | ||||
| 				tm.tm_hour, tm.tm_min, tm.tm_sec, | ||||
| 				(unsigned int) tv.tv_sec); | ||||
| 		} | ||||
| 		else | ||||
| 			dev_err(rtc->dev.parent, | ||||
| 				"hctosys: invalid date/time\n"); | ||||
| 	} | ||||
| 	else | ||||
| 	if (err) { | ||||
| 		dev_err(rtc->dev.parent, | ||||
| 			"hctosys: unable to read the hardware clock\n"); | ||||
| 		goto err_read; | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	err = rtc_valid_tm(&tm); | ||||
| 	if (err) { | ||||
| 		dev_err(rtc->dev.parent, | ||||
| 			"hctosys: invalid date/time\n"); | ||||
| 		goto err_invalid; | ||||
| 	} | ||||
| 
 | ||||
| 	rtc_tm_to_time(&tm, &tv.tv_sec); | ||||
| 
 | ||||
| 	do_settimeofday(&tv); | ||||
| 
 | ||||
| 	dev_info(rtc->dev.parent, | ||||
| 		"setting system clock to " | ||||
| 		"%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n", | ||||
| 		tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, | ||||
| 		tm.tm_hour, tm.tm_min, tm.tm_sec, | ||||
| 		(unsigned int) tv.tv_sec); | ||||
| 
 | ||||
| err_invalid: | ||||
| err_read: | ||||
| 	rtc_class_close(rtc); | ||||
| 
 | ||||
| 	return 0; | ||||
| err_open: | ||||
| 	rtc_hctosys_ret = err; | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| late_initcall(rtc_hctosys); | ||||
|  | ||||
| @ -107,8 +107,9 @@ rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, | ||||
| 		char *buf) | ||||
| { | ||||
| #ifdef CONFIG_RTC_HCTOSYS_DEVICE | ||||
| 	if (strcmp(dev_name(&to_rtc_device(dev)->dev), | ||||
| 		   CONFIG_RTC_HCTOSYS_DEVICE) == 0) | ||||
| 	if (rtc_hctosys_ret == 0 && | ||||
| 			strcmp(dev_name(&to_rtc_device(dev)->dev), | ||||
| 				CONFIG_RTC_HCTOSYS_DEVICE) == 0) | ||||
| 		return sprintf(buf, "1\n"); | ||||
| 	else | ||||
| #endif | ||||
|  | ||||
| @ -238,6 +238,12 @@ static inline bool is_leap_year(unsigned int year) | ||||
| 	return (!(year % 4) && (year % 100)) || !(year % 400); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_RTC_HCTOSYS | ||||
| extern int rtc_hctosys_ret; | ||||
| #else | ||||
| #define rtc_hctosys_ret -ENODEV | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __KERNEL__ */ | ||||
| 
 | ||||
| #endif /* _LINUX_RTC_H_ */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user