Re: [PATCH] rtc-cmos: Support of century field

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sylvain Chouleur <sylvain.chouleur@xxxxxxxxx> writes:

> If century field is supported by the RTC CMOS device, then we should use
> it and do not consider years greater that 169 as an error.
>
> For information, the year field of the rtc_time structure contains the
> value to add to 1970 to obtain the current year.
> This was a hack to be able to support years from 1970 to 2069.
> This patch remains compatible with this implementation.
>
> Signed-off-by: Sylvain Chouleur <sylvain.chouleur@xxxxxxxxx>
> ---
>  include/asm-generic/rtc.h | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
>
> diff --git a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h
> index fa86f240c874..4e3b6558331e 100644
> --- a/include/asm-generic/rtc.h
> +++ b/include/asm-generic/rtc.h
> @@ -16,6 +16,9 @@
>  #include <linux/rtc.h>
>  #include <linux/bcd.h>
>  #include <linux/delay.h>
> +#ifdef CONFIG_ACPI
> +#include <linux/acpi.h>
> +#endif
>  
>  #define RTC_PIE 0x40		/* periodic interrupt enable */
>  #define RTC_AIE 0x20		/* alarm interrupt enable */
> @@ -46,6 +49,7 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time)
>  {
>  	unsigned char ctrl;
>  	unsigned long flags;
> +	unsigned char century = 0;
>  
>  #ifdef CONFIG_MACH_DECSTATION
>  	unsigned int real_year;
> @@ -79,6 +83,11 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time)
>  #ifdef CONFIG_MACH_DECSTATION
>  	real_year = CMOS_READ(RTC_DEC_YEAR);
>  #endif
> +#ifdef CONFIG_ACPI
> +	if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
> +	    acpi_gbl_FADT.century)
> +		century = CMOS_READ(acpi_gbl_FADT.century);
> +#endif
>  	ctrl = CMOS_READ(RTC_CONTROL);
>  	spin_unlock_irqrestore(&rtc_lock, flags);
>  
> @@ -90,12 +99,16 @@ static inline unsigned int __get_rtc_time(struct rtc_time *time)
>  		time->tm_mday = bcd2bin(time->tm_mday);
>  		time->tm_mon = bcd2bin(time->tm_mon);
>  		time->tm_year = bcd2bin(time->tm_year);
> +		century = bcd2bin(century);
>  	}
>  
>  #ifdef CONFIG_MACH_DECSTATION
>  	time->tm_year += real_year - 72;
>  #endif
>  
> +	if (century)
> +		time->tm_year += (century - 19) * 100;
> +
>  	/*
>  	 * Account for differences between how the RTC uses the values
>  	 * and how they are defined in a struct rtc_time;
> @@ -122,6 +135,7 @@ static inline int __set_rtc_time(struct rtc_time *time)
>  #ifdef CONFIG_MACH_DECSTATION
>  	unsigned int real_yrs, leap_yr;
>  #endif
> +	unsigned char century = 0;
>  
>  	yrs = time->tm_year;
>  	mon = time->tm_mon + 1;   /* tm_mon starts at zero */
> @@ -150,6 +164,15 @@ static inline int __set_rtc_time(struct rtc_time *time)
>  		yrs = 73;
>  	}
>  #endif
> +
> +#ifdef CONFIG_ACPI
> +	if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
> +	    acpi_gbl_FADT.century) {
> +		century = (yrs + 1900) / 100;
> +		yrs %= 100;
> +	}
> +#endif
> +
>  	/* These limits and adjustments are independent of
>  	 * whether the chip is in binary mode or not.
>  	 */
> @@ -169,6 +192,7 @@ static inline int __set_rtc_time(struct rtc_time *time)
>  		day = bin2bcd(day);
>  		mon = bin2bcd(mon);
>  		yrs = bin2bcd(yrs);
> +		century = bin2bcd(century);
>  	}
>  
>  	save_control = CMOS_READ(RTC_CONTROL);
> @@ -185,6 +209,11 @@ static inline int __set_rtc_time(struct rtc_time *time)
>  	CMOS_WRITE(hrs, RTC_HOURS);
>  	CMOS_WRITE(min, RTC_MINUTES);
>  	CMOS_WRITE(sec, RTC_SECONDS);
> +#ifdef CONFIG_ACPI
> +	if (acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID &&
> +	    acpi_gbl_FADT.century)
> +		CMOS_WRITE(century, acpi_gbl_FADT.century);
> +#endif
>  
>  	CMOS_WRITE(save_control, RTC_CONTROL);
>  	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
> -- 
> 1.9.1

Any thought about this patch?

Thanks
--
Sylvain
--
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux