diff options
author | Chao Xie <chao.xie@marvell.com> | 2013-02-21 19:45:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 20:22:28 -0500 |
commit | 0cc0c38e91392d2da769c9831739df43787d99e3 (patch) | |
tree | add267ad54c66c341418a2abe430e5f40a72c0cb /drivers/rtc/rtc-sa1100.c | |
parent | 5e0b2704a1d5c246c8282303bbc952cba17f94fc (diff) |
drivers/rtc/rtc-sa1100.c: move clock enable/disable to probe/remove
The original sa1100_rtc_open/sa1100_rtc_release will be called when the
/dev/rtc0 is opened or closed. In fact, these two functions will
enable/disable the clock. Disabling clock will make rtc not work. So
only enable/disable clock when probe/remove the device.
Signed-off-by: Chao Xie <chao.xie@marvell.com>
Acked-by: Haojian Zhuang <haojian.zhuang@gmail.com>
Cc: Leo Song <liangs@marvell.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/rtc-sa1100.c')
-rw-r--r-- | drivers/rtc/rtc-sa1100.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/rtc/rtc-sa1100.c b/drivers/rtc/rtc-sa1100.c index df9180e80e3a..5ec5036df0bc 100644 --- a/drivers/rtc/rtc-sa1100.c +++ b/drivers/rtc/rtc-sa1100.c | |||
@@ -108,9 +108,6 @@ static int sa1100_rtc_open(struct device *dev) | |||
108 | struct rtc_device *rtc = info->rtc; | 108 | struct rtc_device *rtc = info->rtc; |
109 | int ret; | 109 | int ret; |
110 | 110 | ||
111 | ret = clk_prepare_enable(info->clk); | ||
112 | if (ret) | ||
113 | goto fail_clk; | ||
114 | ret = request_irq(info->irq_1hz, sa1100_rtc_interrupt, 0, "rtc 1Hz", dev); | 111 | ret = request_irq(info->irq_1hz, sa1100_rtc_interrupt, 0, "rtc 1Hz", dev); |
115 | if (ret) { | 112 | if (ret) { |
116 | dev_err(dev, "IRQ %d already in use.\n", info->irq_1hz); | 113 | dev_err(dev, "IRQ %d already in use.\n", info->irq_1hz); |
@@ -130,7 +127,6 @@ static int sa1100_rtc_open(struct device *dev) | |||
130 | free_irq(info->irq_1hz, dev); | 127 | free_irq(info->irq_1hz, dev); |
131 | fail_ui: | 128 | fail_ui: |
132 | clk_disable_unprepare(info->clk); | 129 | clk_disable_unprepare(info->clk); |
133 | fail_clk: | ||
134 | return ret; | 130 | return ret; |
135 | } | 131 | } |
136 | 132 | ||
@@ -144,7 +140,6 @@ static void sa1100_rtc_release(struct device *dev) | |||
144 | 140 | ||
145 | free_irq(info->irq_alarm, dev); | 141 | free_irq(info->irq_alarm, dev); |
146 | free_irq(info->irq_1hz, dev); | 142 | free_irq(info->irq_1hz, dev); |
147 | clk_disable_unprepare(info->clk); | ||
148 | } | 143 | } |
149 | 144 | ||
150 | static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 145 | static int sa1100_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
@@ -253,6 +248,9 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
253 | spin_lock_init(&info->lock); | 248 | spin_lock_init(&info->lock); |
254 | platform_set_drvdata(pdev, info); | 249 | platform_set_drvdata(pdev, info); |
255 | 250 | ||
251 | ret = clk_prepare_enable(info->clk); | ||
252 | if (ret) | ||
253 | goto err_enable_clk; | ||
256 | /* | 254 | /* |
257 | * According to the manual we should be able to let RTTR be zero | 255 | * According to the manual we should be able to let RTTR be zero |
258 | * and then a default diviser for a 32.768KHz clock is used. | 256 | * and then a default diviser for a 32.768KHz clock is used. |
@@ -305,6 +303,8 @@ static int sa1100_rtc_probe(struct platform_device *pdev) | |||
305 | 303 | ||
306 | return 0; | 304 | return 0; |
307 | err_dev: | 305 | err_dev: |
306 | clk_disable_unprepare(info->clk); | ||
307 | err_enable_clk: | ||
308 | platform_set_drvdata(pdev, NULL); | 308 | platform_set_drvdata(pdev, NULL); |
309 | clk_put(info->clk); | 309 | clk_put(info->clk); |
310 | err_clk: | 310 | err_clk: |
@@ -318,6 +318,7 @@ static int sa1100_rtc_remove(struct platform_device *pdev) | |||
318 | 318 | ||
319 | if (info) { | 319 | if (info) { |
320 | rtc_device_unregister(info->rtc); | 320 | rtc_device_unregister(info->rtc); |
321 | clk_disable_unprepare(info->clk); | ||
321 | clk_put(info->clk); | 322 | clk_put(info->clk); |
322 | platform_set_drvdata(pdev, NULL); | 323 | platform_set_drvdata(pdev, NULL); |
323 | kfree(info); | 324 | kfree(info); |