diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/rtc-mc146818-lib.c | 15 | ||||
| -rw-r--r-- | drivers/rtc/rtc-mt6397.c | 39 | ||||
| -rw-r--r-- | drivers/rtc/rtc-sun6i.c | 16 | 
3 files changed, 42 insertions, 28 deletions
diff --git a/drivers/rtc/rtc-mc146818-lib.c b/drivers/rtc/rtc-mc146818-lib.c index df2829dd55ad..2ecd8752b088 100644 --- a/drivers/rtc/rtc-mc146818-lib.c +++ b/drivers/rtc/rtc-mc146818-lib.c @@ -172,20 +172,7 @@ int mc146818_set_time(struct rtc_time *time)  	save_control = CMOS_READ(RTC_CONTROL);  	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);  	save_freq_select = CMOS_READ(RTC_FREQ_SELECT); - -#ifdef CONFIG_X86 -	if ((boot_cpu_data.x86_vendor == X86_VENDOR_AMD && -	     boot_cpu_data.x86 == 0x17) || -	     boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) { -		CMOS_WRITE((save_freq_select & (~RTC_DIV_RESET2)), -			RTC_FREQ_SELECT); -		save_freq_select &= ~RTC_DIV_RESET2; -	} else -		CMOS_WRITE((save_freq_select | RTC_DIV_RESET2), -			RTC_FREQ_SELECT); -#else -	CMOS_WRITE((save_freq_select | RTC_DIV_RESET2), RTC_FREQ_SELECT); -#endif +	CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);  #ifdef CONFIG_MACH_DECSTATION  	CMOS_WRITE(real_yrs, RTC_DEC_YEAR); diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c index 5249fc99fd5f..9135e2101752 100644 --- a/drivers/rtc/rtc-mt6397.c +++ b/drivers/rtc/rtc-mt6397.c @@ -47,7 +47,7 @@ static irqreturn_t mtk_rtc_irq_handler_thread(int irq, void *data)  		irqen = irqsta & ~RTC_IRQ_EN_AL;  		mutex_lock(&rtc->lock);  		if (regmap_write(rtc->regmap, rtc->addr_base + RTC_IRQ_EN, -				 irqen) < 0) +				 irqen) == 0)  			mtk_rtc_write_trigger(rtc);  		mutex_unlock(&rtc->lock); @@ -169,12 +169,12 @@ static int mtk_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)  	alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);  	mutex_unlock(&rtc->lock); -	tm->tm_sec = data[RTC_OFFSET_SEC]; -	tm->tm_min = data[RTC_OFFSET_MIN]; -	tm->tm_hour = data[RTC_OFFSET_HOUR]; -	tm->tm_mday = data[RTC_OFFSET_DOM]; -	tm->tm_mon = data[RTC_OFFSET_MTH]; -	tm->tm_year = data[RTC_OFFSET_YEAR]; +	tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK; +	tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK; +	tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK; +	tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK; +	tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK; +	tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;  	tm->tm_year += RTC_MIN_YEAR_OFFSET;  	tm->tm_mon--; @@ -195,14 +195,25 @@ static int mtk_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)  	tm->tm_year -= RTC_MIN_YEAR_OFFSET;  	tm->tm_mon++; -	data[RTC_OFFSET_SEC] = tm->tm_sec; -	data[RTC_OFFSET_MIN] = tm->tm_min; -	data[RTC_OFFSET_HOUR] = tm->tm_hour; -	data[RTC_OFFSET_DOM] = tm->tm_mday; -	data[RTC_OFFSET_MTH] = tm->tm_mon; -	data[RTC_OFFSET_YEAR] = tm->tm_year; -  	mutex_lock(&rtc->lock); +	ret = regmap_bulk_read(rtc->regmap, rtc->addr_base + RTC_AL_SEC, +			       data, RTC_OFFSET_COUNT); +	if (ret < 0) +		goto exit; + +	data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) | +				(tm->tm_sec & RTC_AL_SEC_MASK)); +	data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) | +				(tm->tm_min & RTC_AL_MIN_MASK)); +	data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) | +				(tm->tm_hour & RTC_AL_HOU_MASK)); +	data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) | +				(tm->tm_mday & RTC_AL_DOM_MASK)); +	data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) | +				(tm->tm_mon & RTC_AL_MTH_MASK)); +	data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) | +				(tm->tm_year & RTC_AL_YEA_MASK)); +  	if (alm->enabled) {  		ret = regmap_bulk_write(rtc->regmap,  					rtc->addr_base + RTC_AL_SEC, diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c index 8dcd20b34dde..852f5f3b3592 100644 --- a/drivers/rtc/rtc-sun6i.c +++ b/drivers/rtc/rtc-sun6i.c @@ -379,6 +379,22 @@ static void __init sun50i_h6_rtc_clk_init(struct device_node *node)  CLK_OF_DECLARE_DRIVER(sun50i_h6_rtc_clk, "allwinner,sun50i-h6-rtc",  		      sun50i_h6_rtc_clk_init); +/* + * The R40 user manual is self-conflicting on whether the prescaler is + * fixed or configurable. The clock diagram shows it as fixed, but there + * is also a configurable divider in the RTC block. + */ +static const struct sun6i_rtc_clk_data sun8i_r40_rtc_data = { +	.rc_osc_rate = 16000000, +	.fixed_prescaler = 512, +}; +static void __init sun8i_r40_rtc_clk_init(struct device_node *node) +{ +	sun6i_rtc_clk_init(node, &sun8i_r40_rtc_data); +} +CLK_OF_DECLARE_DRIVER(sun8i_r40_rtc_clk, "allwinner,sun8i-r40-rtc", +		      sun8i_r40_rtc_clk_init); +  static const struct sun6i_rtc_clk_data sun8i_v3_rtc_data = {  	.rc_osc_rate = 32000,  	.has_out_clk = 1,  | 
