diff options
Diffstat (limited to 'drivers/rtc/rtc-mv.c')
| -rw-r--r-- | drivers/rtc/rtc-mv.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-mv.c b/drivers/rtc/rtc-mv.c index d536c5962c9..6aaec2fc7c0 100644 --- a/drivers/rtc/rtc-mv.c +++ b/drivers/rtc/rtc-mv.c @@ -222,6 +222,7 @@ static int __init mv_rtc_probe(struct platform_device *pdev)  	struct resource *res;  	struct rtc_plat_data *pdata;  	u32 rtc_time; +	u32 rtc_date;  	int ret = 0;  	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); @@ -257,6 +258,17 @@ static int __init mv_rtc_probe(struct platform_device *pdev)  		}  	} +	/* +	 * A date after January 19th, 2038 does not fit on 32 bits and +	 * will confuse the kernel and userspace. Reset to a sane date +	 * (January 1st, 2013) if we're after 2038. +	 */ +	rtc_date = readl(pdata->ioaddr + RTC_DATE_REG_OFFS); +	if (bcd2bin((rtc_date >> RTC_YEAR_OFFS) & 0xff) >= 38) { +		dev_info(&pdev->dev, "invalid RTC date, resetting to January 1st, 2013\n"); +		writel(0x130101, pdata->ioaddr + RTC_DATE_REG_OFFS); +	} +  	pdata->irq = platform_get_irq(pdev, 0);  	platform_set_drvdata(pdev, pdata); @@ -307,7 +319,7 @@ static int __exit mv_rtc_remove(struct platform_device *pdev)  }  #ifdef CONFIG_OF -static struct of_device_id rtc_mv_of_match_table[] = { +static const struct of_device_id rtc_mv_of_match_table[] = {  	{ .compatible = "marvell,orion-rtc", },  	{}  };  | 
