Patchwork driver/rtc/rtc-s3c: Fix driver clock enable/disable balance issues

login
register
mail settings
Submitter jhbird.choi@samsung.com
Date Nov. 8, 2011, 10:14 a.m.
Message ID <1320747253-9281-1-git-send-email-jhbird.choi@samsung.com>
Download mbox | patch
Permalink /patch/124315/
State New
Headers show

Comments

jhbird.choi@samsung.com - Nov. 8, 2011, 10:14 a.m.
From: Jonghwan Choi <jhbird.choi@samsung.com>

If an error occurs after clock is enabled, it can become unbalanced.

Signed-off-by: Jonghwan Choi <jhbird.choi@samsung.com>
---
 drivers/rtc/rtc-s3c.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Kukjin Kim - Nov. 21, 2011, 10:50 a.m.
jhbird.choi@samsung.com wrote:
> 
> From: Jonghwan Choi <jhbird.choi@samsung.com>
> 
> If an error occurs after clock is enabled, it can become unbalanced.
> 
> Signed-off-by: Jonghwan Choi <jhbird.choi@samsung.com>

Cc: stable@kernel.org
Acked-by: Kukjin Kim <kgene.kim@samsung.com>

(Cc'ed Andrew Morton)

Hi Andrew,

If you're ok with this, could you please pick this up in your tree?

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

> ---
>  drivers/rtc/rtc-s3c.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
> index 7639ab9..5b979d9 100644
> --- a/drivers/rtc/rtc-s3c.c
> +++ b/drivers/rtc/rtc-s3c.c
> @@ -202,7 +202,6 @@ static int s3c_rtc_settime(struct device *dev, struct
rtc_time
> *tm)
>  	void __iomem *base = s3c_rtc_base;
>  	int year = tm->tm_year - 100;
> 
> -	clk_enable(rtc_clk);
>  	pr_debug("set time %04d.%02d.%02d %02d:%02d:%02d\n",
>  		 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
>  		 tm->tm_hour, tm->tm_min, tm->tm_sec);
> @@ -214,6 +213,7 @@ static int s3c_rtc_settime(struct device *dev, struct
rtc_time
> *tm)
>  		return -EINVAL;
>  	}
> 
> +	clk_enable(rtc_clk);
>  	writeb(bin2bcd(tm->tm_sec),  base + S3C2410_RTCSEC);
>  	writeb(bin2bcd(tm->tm_min),  base + S3C2410_RTCMIN);
>  	writeb(bin2bcd(tm->tm_hour), base + S3C2410_RTCHOUR);
> --
> 1.7.1

Patch

diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c
index 7639ab9..5b979d9 100644
--- a/drivers/rtc/rtc-s3c.c
+++ b/drivers/rtc/rtc-s3c.c
@@ -202,7 +202,6 @@  static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
 	void __iomem *base = s3c_rtc_base;
 	int year = tm->tm_year - 100;
 
-	clk_enable(rtc_clk);
 	pr_debug("set time %04d.%02d.%02d %02d:%02d:%02d\n",
 		 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday,
 		 tm->tm_hour, tm->tm_min, tm->tm_sec);
@@ -214,6 +213,7 @@  static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
 		return -EINVAL;
 	}
 
+	clk_enable(rtc_clk);
 	writeb(bin2bcd(tm->tm_sec),  base + S3C2410_RTCSEC);
 	writeb(bin2bcd(tm->tm_min),  base + S3C2410_RTCMIN);
 	writeb(bin2bcd(tm->tm_hour), base + S3C2410_RTCHOUR);