Skip to content

Commit 24e1455

Browse files
chanwoochoitorvalds
authored andcommitted
drivers/rtc/rtc-s3c.c: delete duplicate clock control
The current functions in s3c-rtc driver execute clk_enable/disable() to control clocks and some functions execute s3c_rtc_alarm_clk_enable() unnecessarily. So this patch deletes the duplicate clock control and spilts s3c_rtc_alarm_clk_enable() out as s3c_rtc_enable_clk()/s3c_rtc_disable_clk() to improve readability. Signed-off-by: Chanwoo Choi <[email protected]> Cc: Alessandro Zummo <[email protected]> Cc: Kukjin Kim <[email protected]> Cc: Inki Dae <[email protected]> Cc: Kyungmin Park <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent aed98b9 commit 24e1455

File tree

1 file changed

+39
-124
lines changed

1 file changed

+39
-124
lines changed

drivers/rtc/rtc-s3c.c

Lines changed: 39 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ struct s3c_rtc {
3939
void __iomem *base;
4040
struct clk *rtc_clk;
4141
struct clk *rtc_src_clk;
42-
bool enabled;
4342

4443
struct s3c_rtc_data *data;
4544

@@ -67,26 +66,25 @@ struct s3c_rtc_data {
6766
void (*disable) (struct s3c_rtc *info);
6867
};
6968

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)
7170
{
7271
unsigned long irq_flags;
7372

7473
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);
9088
spin_unlock_irqrestore(&info->alarm_clk_lock, irq_flags);
9189
}
9290

@@ -119,20 +117,16 @@ static int s3c_rtc_setaie(struct device *dev, unsigned int enabled)
119117

120118
dev_dbg(info->dev, "%s: aie=%d\n", __func__, enabled);
121119

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+
125122
tmp = readb(info->base + S3C2410_RTCALM) & ~S3C2410_RTCALM_ALMEN;
126123

127124
if (enabled)
128125
tmp |= S3C2410_RTCALM_ALMEN;
129126

130127
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);
134128

135-
s3c_rtc_alarm_clk_enable(info, enabled);
129+
s3c_rtc_disable_clk(info);
136130

137131
return 0;
138132
}
@@ -143,18 +137,12 @@ static int s3c_rtc_setfreq(struct s3c_rtc *info, int freq)
143137
if (!is_power_of_2(freq))
144138
return -EINVAL;
145139

146-
clk_enable(info->rtc_clk);
147-
if (info->data->needs_src_clk)
148-
clk_enable(info->rtc_src_clk);
149140
spin_lock_irq(&info->pie_lock);
150141

151142
if (info->data->set_freq)
152143
info->data->set_freq(info, freq);
153144

154145
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);
158146

159147
return 0;
160148
}
@@ -165,9 +153,7 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
165153
struct s3c_rtc *info = dev_get_drvdata(dev);
166154
unsigned int have_retried = 0;
167155

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);
171157

172158
retry_get_time:
173159
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)
194180
rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon);
195181
rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year);
196182

183+
s3c_rtc_disable_clk(info);
184+
197185
rtc_tm->tm_year += 100;
198186

199187
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)
202190

203191
rtc_tm->tm_mon -= 1;
204192

205-
if (info->data->needs_src_clk)
206-
clk_disable(info->rtc_src_clk);
207-
clk_disable(info->rtc_clk);
208-
209193
return rtc_valid_tm(rtc_tm);
210194
}
211195

@@ -225,9 +209,7 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm)
225209
return -EINVAL;
226210
}
227211

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);
231213

232214
writeb(bin2bcd(tm->tm_sec), info->base + S3C2410_RTCSEC);
233215
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)
236218
writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_RTCMON);
237219
writeb(bin2bcd(year), info->base + S3C2410_RTCYEAR);
238220

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);
242222

243223
return 0;
244224
}
@@ -249,9 +229,7 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
249229
struct rtc_time *alm_tm = &alrm->time;
250230
unsigned int alm_en;
251231

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);
255233

256234
alm_tm->tm_sec = readb(info->base + S3C2410_ALMSEC);
257235
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)
262240

263241
alm_en = readb(info->base + S3C2410_RTCALM);
264242

243+
s3c_rtc_disable_clk(info);
244+
265245
alrm->enabled = (alm_en & S3C2410_RTCALM_ALMEN) ? 1 : 0;
266246

267247
dev_dbg(dev, "read alarm %d, %04d.%02d.%02d %02d:%02d:%02d\n",
268248
alm_en,
269249
1900 + alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday,
270250
alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
271251

272-
273252
/* decode the alarm enable field */
274-
275253
if (alm_en & S3C2410_RTCALM_SECEN)
276254
alm_tm->tm_sec = bcd2bin(alm_tm->tm_sec);
277255
else
@@ -304,10 +282,6 @@ static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
304282
else
305283
alm_tm->tm_year = -1;
306284

307-
if (info->data->needs_src_clk)
308-
clk_disable(info->rtc_src_clk);
309-
clk_disable(info->rtc_clk);
310-
311285
return 0;
312286
}
313287

@@ -317,15 +291,13 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
317291
struct rtc_time *tm = &alrm->time;
318292
unsigned int alrm_en;
319293

320-
clk_enable(info->rtc_clk);
321-
if (info->data->needs_src_clk)
322-
clk_enable(info->rtc_src_clk);
323-
324294
dev_dbg(dev, "s3c_rtc_setalarm: %d, %04d.%02d.%02d %02d:%02d:%02d\n",
325295
alrm->enabled,
326296
1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
327297
tm->tm_hour, tm->tm_min, tm->tm_sec);
328298

299+
s3c_rtc_enable_clk(info);
300+
329301
alrm_en = readb(info->base + S3C2410_RTCALM) & S3C2410_RTCALM_ALMEN;
330302
writeb(0x00, info->base + S3C2410_RTCALM);
331303

@@ -348,11 +320,9 @@ static int s3c_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
348320

349321
writeb(alrm_en, info->base + S3C2410_RTCALM);
350322

351-
s3c_rtc_setaie(dev, alrm->enabled);
323+
s3c_rtc_disable_clk(info);
352324

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);
356326

357327
return 0;
358328
}
@@ -361,16 +331,12 @@ static int s3c_rtc_proc(struct device *dev, struct seq_file *seq)
361331
{
362332
struct s3c_rtc *info = dev_get_drvdata(dev);
363333

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);
367335

368336
if (info->data->enable_tick)
369337
info->data->enable_tick(info, seq);
370338

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);
374340

375341
return 0;
376342
}
@@ -388,10 +354,6 @@ static void s3c24xx_rtc_enable(struct s3c_rtc *info)
388354
{
389355
unsigned int con, tmp;
390356

391-
clk_enable(info->rtc_clk);
392-
if (info->data->needs_src_clk)
393-
clk_enable(info->rtc_src_clk);
394-
395357
con = readw(info->base + S3C2410_RTCCON);
396358
/* re-enable the device, and check it is ok */
397359
if ((con & S3C2410_RTCCON_RTCEN) == 0) {
@@ -417,49 +379,29 @@ static void s3c24xx_rtc_enable(struct s3c_rtc *info)
417379
writew(tmp & ~S3C2410_RTCCON_CLKRST,
418380
info->base + S3C2410_RTCCON);
419381
}
420-
421-
if (info->data->needs_src_clk)
422-
clk_disable(info->rtc_src_clk);
423-
clk_disable(info->rtc_clk);
424382
}
425383

426384
static void s3c24xx_rtc_disable(struct s3c_rtc *info)
427385
{
428386
unsigned int con;
429387

430-
clk_enable(info->rtc_clk);
431-
if (info->data->needs_src_clk)
432-
clk_enable(info->rtc_src_clk);
433-
434388
con = readw(info->base + S3C2410_RTCCON);
435389
con &= ~S3C2410_RTCCON_RTCEN;
436390
writew(con, info->base + S3C2410_RTCCON);
437391

438392
con = readb(info->base + S3C2410_TICNT);
439393
con &= ~S3C2410_TICNT_ENABLE;
440394
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);
445395
}
446396

447397
static void s3c6410_rtc_disable(struct s3c_rtc *info)
448398
{
449399
unsigned int con;
450400

451-
clk_enable(info->rtc_clk);
452-
if (info->data->needs_src_clk)
453-
clk_enable(info->rtc_src_clk);
454-
455401
con = readw(info->base + S3C2410_RTCCON);
456402
con &= ~S3C64XX_RTCCON_TICEN;
457403
con &= ~S3C2410_RTCCON_RTCEN;
458404
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);
463405
}
464406

465407
static int s3c_rtc_remove(struct platform_device *pdev)
@@ -598,15 +540,16 @@ static int s3c_rtc_probe(struct platform_device *pdev)
598540

599541
s3c_rtc_setfreq(info, 1);
600542

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);
604544

605545
return 0;
606546

607547
err_nortc:
608548
if (info->data->disable)
609549
info->data->disable(info);
550+
551+
if (info->data->needs_src_clk)
552+
clk_disable_unprepare(info->rtc_src_clk);
610553
clk_disable_unprepare(info->rtc_clk);
611554

612555
return ret;
@@ -618,9 +561,7 @@ static int s3c_rtc_suspend(struct device *dev)
618561
{
619562
struct s3c_rtc *info = dev_get_drvdata(dev);
620563

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);
624565

625566
/* save TICNT for anyone using periodic interrupts */
626567
if (info->data->save_tick_cnt)
@@ -636,66 +577,40 @@ static int s3c_rtc_suspend(struct device *dev)
636577
dev_err(dev, "enable_irq_wake failed\n");
637578
}
638579

639-
if (info->data->needs_src_clk)
640-
clk_disable(info->rtc_src_clk);
641-
clk_disable(info->rtc_clk);
642-
643580
return 0;
644581
}
645582

646583
static int s3c_rtc_resume(struct device *dev)
647584
{
648585
struct s3c_rtc *info = dev_get_drvdata(dev);
649586

650-
clk_enable(info->rtc_clk);
651-
if (info->data->needs_src_clk)
652-
clk_enable(info->rtc_src_clk);
653-
654587
if (info->data->enable)
655588
info->data->enable(info);
656589

657590
if (info->data->restore_tick_cnt)
658591
info->data->restore_tick_cnt(info);
659592

593+
s3c_rtc_disable_clk(info);
594+
660595
if (device_may_wakeup(dev) && info->wake_en) {
661596
disable_irq_wake(info->irq_alarm);
662597
info->wake_en = false;
663598
}
664599

665-
if (info->data->needs_src_clk)
666-
clk_disable(info->rtc_src_clk);
667-
clk_disable(info->rtc_clk);
668-
669600
return 0;
670601
}
671602
#endif
672603
static SIMPLE_DEV_PM_OPS(s3c_rtc_pm_ops, s3c_rtc_suspend, s3c_rtc_resume);
673604

674605
static void s3c24xx_rtc_irq(struct s3c_rtc *info, int mask)
675606
{
676-
clk_enable(info->rtc_clk);
677-
if (info->data->needs_src_clk)
678-
clk_enable(info->rtc_src_clk);
679607
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);
685608
}
686609

687610
static void s3c6410_rtc_irq(struct s3c_rtc *info, int mask)
688611
{
689-
clk_enable(info->rtc_clk);
690-
if (info->data->needs_src_clk)
691-
clk_enable(info->rtc_src_clk);
692612
rtc_update_irq(info->rtc, 1, RTC_AF | RTC_IRQF);
693613
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);
699614
}
700615

701616
static void s3c2410_rtc_setfreq(struct s3c_rtc *info, int freq)

0 commit comments

Comments
 (0)