@@ -39,7 +39,6 @@ struct s3c_rtc {
39
39
void __iomem * base ;
40
40
struct clk * rtc_clk ;
41
41
struct clk * rtc_src_clk ;
42
- bool enabled ;
43
42
44
43
struct s3c_rtc_data * data ;
45
44
@@ -67,26 +66,25 @@ struct s3c_rtc_data {
67
66
void (* disable ) (struct s3c_rtc * info );
68
67
};
69
68
70
- static void s3c_rtc_alarm_clk_enable (struct s3c_rtc * info , bool enable )
69
+ static void s3c_rtc_enable_clk (struct s3c_rtc * info )
71
70
{
72
71
unsigned long irq_flags ;
73
72
74
73
spin_lock_irqsave (& info -> alarm_clk_lock , irq_flags );
75
- if (enable ) {
76
- if (!info -> enabled ) {
77
- clk_enable (info -> rtc_clk );
78
- if (info -> data -> needs_src_clk )
79
- clk_enable (info -> rtc_src_clk );
80
- info -> enabled = true;
81
- }
82
- } else {
83
- if (info -> enabled ) {
84
- if (info -> data -> needs_src_clk )
85
- clk_disable (info -> rtc_src_clk );
86
- clk_disable (info -> rtc_clk );
87
- info -> enabled = false;
88
- }
89
- }
74
+ clk_enable (info -> rtc_clk );
75
+ if (info -> data -> needs_src_clk )
76
+ clk_enable (info -> rtc_src_clk );
77
+ spin_unlock_irqrestore (& info -> alarm_clk_lock , irq_flags );
78
+ }
79
+
80
+ static void s3c_rtc_disable_clk (struct s3c_rtc * info )
81
+ {
82
+ unsigned long irq_flags ;
83
+
84
+ spin_lock_irqsave (& info -> alarm_clk_lock , irq_flags );
85
+ if (info -> data -> needs_src_clk )
86
+ clk_disable (info -> rtc_src_clk );
87
+ clk_disable (info -> rtc_clk );
90
88
spin_unlock_irqrestore (& info -> alarm_clk_lock , irq_flags );
91
89
}
92
90
@@ -119,20 +117,16 @@ static int s3c_rtc_setaie(struct device *dev, unsigned int enabled)
119
117
120
118
dev_dbg (info -> dev , "%s: aie=%d\n" , __func__ , enabled );
121
119
122
- clk_enable (info -> rtc_clk );
123
- if (info -> data -> needs_src_clk )
124
- clk_enable (info -> rtc_src_clk );
120
+ s3c_rtc_enable_clk (info );
121
+
125
122
tmp = readb (info -> base + S3C2410_RTCALM ) & ~S3C2410_RTCALM_ALMEN ;
126
123
127
124
if (enabled )
128
125
tmp |= S3C2410_RTCALM_ALMEN ;
129
126
130
127
writeb (tmp , info -> base + S3C2410_RTCALM );
131
- if (info -> data -> needs_src_clk )
132
- clk_disable (info -> rtc_src_clk );
133
- clk_disable (info -> rtc_clk );
134
128
135
- s3c_rtc_alarm_clk_enable (info , enabled );
129
+ s3c_rtc_disable_clk (info );
136
130
137
131
return 0 ;
138
132
}
@@ -143,18 +137,12 @@ static int s3c_rtc_setfreq(struct s3c_rtc *info, int freq)
143
137
if (!is_power_of_2 (freq ))
144
138
return - EINVAL ;
145
139
146
- clk_enable (info -> rtc_clk );
147
- if (info -> data -> needs_src_clk )
148
- clk_enable (info -> rtc_src_clk );
149
140
spin_lock_irq (& info -> pie_lock );
150
141
151
142
if (info -> data -> set_freq )
152
143
info -> data -> set_freq (info , freq );
153
144
154
145
spin_unlock_irq (& info -> pie_lock );
155
- if (info -> data -> needs_src_clk )
156
- clk_disable (info -> rtc_src_clk );
157
- clk_disable (info -> rtc_clk );
158
146
159
147
return 0 ;
160
148
}
@@ -165,9 +153,7 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
165
153
struct s3c_rtc * info = dev_get_drvdata (dev );
166
154
unsigned int have_retried = 0 ;
167
155
168
- clk_enable (info -> rtc_clk );
169
- if (info -> data -> needs_src_clk )
170
- clk_enable (info -> rtc_src_clk );
156
+ s3c_rtc_enable_clk (info );
171
157
172
158
retry_get_time :
173
159
rtc_tm -> tm_min = readb (info -> base + S3C2410_RTCMIN );
@@ -194,6 +180,8 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
194
180
rtc_tm -> tm_mon = bcd2bin (rtc_tm -> tm_mon );
195
181
rtc_tm -> tm_year = bcd2bin (rtc_tm -> tm_year );
196
182
183
+ s3c_rtc_disable_clk (info );
184
+
197
185
rtc_tm -> tm_year += 100 ;
198
186
199
187
dev_dbg (dev , "read time %04d.%02d.%02d %02d:%02d:%02d\n" ,
@@ -202,10 +190,6 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
202
190
203
191
rtc_tm -> tm_mon -= 1 ;
204
192
205
- if (info -> data -> needs_src_clk )
206
- clk_disable (info -> rtc_src_clk );
207
- clk_disable (info -> rtc_clk );
208
-
209
193
return rtc_valid_tm (rtc_tm );
210
194
}
211
195
@@ -225,9 +209,7 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
225
209
return - EINVAL ;
226
210
}
227
211
228
- clk_enable (info -> rtc_clk );
229
- if (info -> data -> needs_src_clk )
230
- clk_enable (info -> rtc_src_clk );
212
+ s3c_rtc_enable_clk (info );
231
213
232
214
writeb (bin2bcd (tm -> tm_sec ), info -> base + S3C2410_RTCSEC );
233
215
writeb (bin2bcd (tm -> tm_min ), info -> base + S3C2410_RTCMIN );
@@ -236,9 +218,7 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
236
218
writeb (bin2bcd (tm -> tm_mon + 1 ), info -> base + S3C2410_RTCMON );
237
219
writeb (bin2bcd (year ), info -> base + S3C2410_RTCYEAR );
238
220
239
- if (info -> data -> needs_src_clk )
240
- clk_disable (info -> rtc_src_clk );
241
- clk_disable (info -> rtc_clk );
221
+ s3c_rtc_disable_clk (info );
242
222
243
223
return 0 ;
244
224
}
@@ -249,9 +229,7 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
249
229
struct rtc_time * alm_tm = & alrm -> time ;
250
230
unsigned int alm_en ;
251
231
252
- clk_enable (info -> rtc_clk );
253
- if (info -> data -> needs_src_clk )
254
- clk_enable (info -> rtc_src_clk );
232
+ s3c_rtc_enable_clk (info );
255
233
256
234
alm_tm -> tm_sec = readb (info -> base + S3C2410_ALMSEC );
257
235
alm_tm -> tm_min = readb (info -> base + S3C2410_ALMMIN );
@@ -262,16 +240,16 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
262
240
263
241
alm_en = readb (info -> base + S3C2410_RTCALM );
264
242
243
+ s3c_rtc_disable_clk (info );
244
+
265
245
alrm -> enabled = (alm_en & S3C2410_RTCALM_ALMEN ) ? 1 : 0 ;
266
246
267
247
dev_dbg (dev , "read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n" ,
268
248
alm_en ,
269
249
1900 + alm_tm -> tm_year , alm_tm -> tm_mon , alm_tm -> tm_mday ,
270
250
alm_tm -> tm_hour , alm_tm -> tm_min , alm_tm -> tm_sec );
271
251
272
-
273
252
/* decode the alarm enable field */
274
-
275
253
if (alm_en & S3C2410_RTCALM_SECEN )
276
254
alm_tm -> tm_sec = bcd2bin (alm_tm -> tm_sec );
277
255
else
@@ -304,10 +282,6 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
304
282
else
305
283
alm_tm -> tm_year = -1 ;
306
284
307
- if (info -> data -> needs_src_clk )
308
- clk_disable (info -> rtc_src_clk );
309
- clk_disable (info -> rtc_clk );
310
-
311
285
return 0 ;
312
286
}
313
287
@@ -317,15 +291,13 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
317
291
struct rtc_time * tm = & alrm -> time ;
318
292
unsigned int alrm_en ;
319
293
320
- clk_enable (info -> rtc_clk );
321
- if (info -> data -> needs_src_clk )
322
- clk_enable (info -> rtc_src_clk );
323
-
324
294
dev_dbg (dev , "s3c_rtc_setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n" ,
325
295
alrm -> enabled ,
326
296
1900 + tm -> tm_year , tm -> tm_mon + 1 , tm -> tm_mday ,
327
297
tm -> tm_hour , tm -> tm_min , tm -> tm_sec );
328
298
299
+ s3c_rtc_enable_clk (info );
300
+
329
301
alrm_en = readb (info -> base + S3C2410_RTCALM ) & S3C2410_RTCALM_ALMEN ;
330
302
writeb (0x00 , info -> base + S3C2410_RTCALM );
331
303
@@ -348,11 +320,9 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
348
320
349
321
writeb (alrm_en , info -> base + S3C2410_RTCALM );
350
322
351
- s3c_rtc_setaie ( dev , alrm -> enabled );
323
+ s3c_rtc_disable_clk ( info );
352
324
353
- if (info -> data -> needs_src_clk )
354
- clk_disable (info -> rtc_src_clk );
355
- clk_disable (info -> rtc_clk );
325
+ s3c_rtc_setaie (dev , alrm -> enabled );
356
326
357
327
return 0 ;
358
328
}
@@ -361,16 +331,12 @@ static int s3c_rtc_proc(struct device *dev, struct seq_file *seq)
361
331
{
362
332
struct s3c_rtc * info = dev_get_drvdata (dev );
363
333
364
- clk_enable (info -> rtc_clk );
365
- if (info -> data -> needs_src_clk )
366
- clk_enable (info -> rtc_src_clk );
334
+ s3c_rtc_enable_clk (info );
367
335
368
336
if (info -> data -> enable_tick )
369
337
info -> data -> enable_tick (info , seq );
370
338
371
- if (info -> data -> needs_src_clk )
372
- clk_disable (info -> rtc_src_clk );
373
- clk_disable (info -> rtc_clk );
339
+ s3c_rtc_disable_clk (info );
374
340
375
341
return 0 ;
376
342
}
@@ -388,10 +354,6 @@ static void s3c24xx_rtc_enable(struct s3c_rtc *info)
388
354
{
389
355
unsigned int con , tmp ;
390
356
391
- clk_enable (info -> rtc_clk );
392
- if (info -> data -> needs_src_clk )
393
- clk_enable (info -> rtc_src_clk );
394
-
395
357
con = readw (info -> base + S3C2410_RTCCON );
396
358
/* re-enable the device, and check it is ok */
397
359
if ((con & S3C2410_RTCCON_RTCEN ) == 0 ) {
@@ -417,49 +379,29 @@ static void s3c24xx_rtc_enable(struct s3c_rtc *info)
417
379
writew (tmp & ~S3C2410_RTCCON_CLKRST ,
418
380
info -> base + S3C2410_RTCCON );
419
381
}
420
-
421
- if (info -> data -> needs_src_clk )
422
- clk_disable (info -> rtc_src_clk );
423
- clk_disable (info -> rtc_clk );
424
382
}
425
383
426
384
static void s3c24xx_rtc_disable (struct s3c_rtc * info )
427
385
{
428
386
unsigned int con ;
429
387
430
- clk_enable (info -> rtc_clk );
431
- if (info -> data -> needs_src_clk )
432
- clk_enable (info -> rtc_src_clk );
433
-
434
388
con = readw (info -> base + S3C2410_RTCCON );
435
389
con &= ~S3C2410_RTCCON_RTCEN ;
436
390
writew (con , info -> base + S3C2410_RTCCON );
437
391
438
392
con = readb (info -> base + S3C2410_TICNT );
439
393
con &= ~S3C2410_TICNT_ENABLE ;
440
394
writeb (con , info -> base + S3C2410_TICNT );
441
-
442
- if (info -> data -> needs_src_clk )
443
- clk_disable (info -> rtc_src_clk );
444
- clk_disable (info -> rtc_clk );
445
395
}
446
396
447
397
static void s3c6410_rtc_disable (struct s3c_rtc * info )
448
398
{
449
399
unsigned int con ;
450
400
451
- clk_enable (info -> rtc_clk );
452
- if (info -> data -> needs_src_clk )
453
- clk_enable (info -> rtc_src_clk );
454
-
455
401
con = readw (info -> base + S3C2410_RTCCON );
456
402
con &= ~S3C64XX_RTCCON_TICEN ;
457
403
con &= ~S3C2410_RTCCON_RTCEN ;
458
404
writew (con , info -> base + S3C2410_RTCCON );
459
-
460
- if (info -> data -> needs_src_clk )
461
- clk_disable (info -> rtc_src_clk );
462
- clk_disable (info -> rtc_clk );
463
405
}
464
406
465
407
static int s3c_rtc_remove (struct platform_device * pdev )
@@ -598,15 +540,16 @@ static int s3c_rtc_probe(struct platform_device *pdev)
598
540
599
541
s3c_rtc_setfreq (info , 1 );
600
542
601
- if (info -> data -> needs_src_clk )
602
- clk_disable (info -> rtc_src_clk );
603
- clk_disable (info -> rtc_clk );
543
+ s3c_rtc_disable_clk (info );
604
544
605
545
return 0 ;
606
546
607
547
err_nortc :
608
548
if (info -> data -> disable )
609
549
info -> data -> disable (info );
550
+
551
+ if (info -> data -> needs_src_clk )
552
+ clk_disable_unprepare (info -> rtc_src_clk );
610
553
clk_disable_unprepare (info -> rtc_clk );
611
554
612
555
return ret ;
@@ -618,9 +561,7 @@ static int s3c_rtc_suspend(struct device *dev)
618
561
{
619
562
struct s3c_rtc * info = dev_get_drvdata (dev );
620
563
621
- clk_enable (info -> rtc_clk );
622
- if (info -> data -> needs_src_clk )
623
- clk_enable (info -> rtc_src_clk );
564
+ s3c_rtc_enable_clk (info );
624
565
625
566
/* save TICNT for anyone using periodic interrupts */
626
567
if (info -> data -> save_tick_cnt )
@@ -636,66 +577,40 @@ static int s3c_rtc_suspend(struct device *dev)
636
577
dev_err (dev , "enable_irq_wake failed\n" );
637
578
}
638
579
639
- if (info -> data -> needs_src_clk )
640
- clk_disable (info -> rtc_src_clk );
641
- clk_disable (info -> rtc_clk );
642
-
643
580
return 0 ;
644
581
}
645
582
646
583
static int s3c_rtc_resume (struct device * dev )
647
584
{
648
585
struct s3c_rtc * info = dev_get_drvdata (dev );
649
586
650
- clk_enable (info -> rtc_clk );
651
- if (info -> data -> needs_src_clk )
652
- clk_enable (info -> rtc_src_clk );
653
-
654
587
if (info -> data -> enable )
655
588
info -> data -> enable (info );
656
589
657
590
if (info -> data -> restore_tick_cnt )
658
591
info -> data -> restore_tick_cnt (info );
659
592
593
+ s3c_rtc_disable_clk (info );
594
+
660
595
if (device_may_wakeup (dev ) && info -> wake_en ) {
661
596
disable_irq_wake (info -> irq_alarm );
662
597
info -> wake_en = false;
663
598
}
664
599
665
- if (info -> data -> needs_src_clk )
666
- clk_disable (info -> rtc_src_clk );
667
- clk_disable (info -> rtc_clk );
668
-
669
600
return 0 ;
670
601
}
671
602
#endif
672
603
static SIMPLE_DEV_PM_OPS (s3c_rtc_pm_ops , s3c_rtc_suspend , s3c_rtc_resume ) ;
673
604
674
605
static void s3c24xx_rtc_irq (struct s3c_rtc * info , int mask )
675
606
{
676
- clk_enable (info -> rtc_clk );
677
- if (info -> data -> needs_src_clk )
678
- clk_enable (info -> rtc_src_clk );
679
607
rtc_update_irq (info -> rtc , 1 , RTC_AF | RTC_IRQF );
680
- if (info -> data -> needs_src_clk )
681
- clk_disable (info -> rtc_src_clk );
682
- clk_disable (info -> rtc_clk );
683
-
684
- s3c_rtc_alarm_clk_enable (info , false);
685
608
}
686
609
687
610
static void s3c6410_rtc_irq (struct s3c_rtc * info , int mask )
688
611
{
689
- clk_enable (info -> rtc_clk );
690
- if (info -> data -> needs_src_clk )
691
- clk_enable (info -> rtc_src_clk );
692
612
rtc_update_irq (info -> rtc , 1 , RTC_AF | RTC_IRQF );
693
613
writeb (mask , info -> base + S3C2410_INTP );
694
- if (info -> data -> needs_src_clk )
695
- clk_disable (info -> rtc_src_clk );
696
- clk_disable (info -> rtc_clk );
697
-
698
- s3c_rtc_alarm_clk_enable (info , false);
699
614
}
700
615
701
616
static void s3c2410_rtc_setfreq (struct s3c_rtc * info , int freq )
0 commit comments