diff options
Diffstat (limited to 'drivers/rtc/rtc-max8925.c')
| -rw-r--r-- | drivers/rtc/rtc-max8925.c | 21 | 
1 files changed, 16 insertions, 5 deletions
| diff --git a/drivers/rtc/rtc-max8925.c b/drivers/rtc/rtc-max8925.c index 2d71943bc436..1459055a83aa 100644 --- a/drivers/rtc/rtc-max8925.c +++ b/drivers/rtc/rtc-max8925.c @@ -193,10 +193,17 @@ static int max8925_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)  	ret = max8925_reg_read(info->rtc, MAX8925_RTC_IRQ_MASK);  	if (ret < 0)  		goto out; -	if ((ret & ALARM0_IRQ) == 0) -		alrm->enabled = 1; -	else +	if (ret & ALARM0_IRQ) {  		alrm->enabled = 0; +	} else { +		ret = max8925_reg_read(info->rtc, MAX8925_ALARM0_CNTL); +		if (ret < 0) +			goto out; +		if (!ret) +			alrm->enabled = 0; +		else +			alrm->enabled = 1; +	}  	ret = max8925_reg_read(info->rtc, MAX8925_RTC_STATUS);  	if (ret < 0)  		goto out; @@ -204,6 +211,7 @@ static int max8925_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)  		alrm->pending = 1;  	else  		alrm->pending = 0; +	return 0;  out:  	return ret;  } @@ -220,8 +228,11 @@ static int max8925_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)  	ret = max8925_bulk_write(info->rtc, MAX8925_ALARM0_SEC, TIME_NUM, buf);  	if (ret < 0)  		goto out; -	/* only enable alarm on year/month/day/hour/min/sec */ -	ret = max8925_reg_write(info->rtc, MAX8925_ALARM0_CNTL, 0x77); +	if (alrm->enabled) +		/* only enable alarm on year/month/day/hour/min/sec */ +		ret = max8925_reg_write(info->rtc, MAX8925_ALARM0_CNTL, 0x77); +	else +		ret = max8925_reg_write(info->rtc, MAX8925_ALARM0_CNTL, 0x0);  	if (ret < 0)  		goto out;  out: | 
