19
19
/* For type1, set SYSC_OMAP2_CLOCKACTIVITY for fck off on idle, l4 clock on */
20
20
#define DMTIMER_TYPE1_ENABLE ((1 << 9) | (SYSC_IDLE_SMART << 3) | \
21
21
SYSC_OMAP2_ENAWAKEUP | SYSC_OMAP2_AUTOIDLE)
22
-
22
+ #define DMTIMER_TYPE1_DISABLE (SYSC_OMAP2_SOFTRESET | SYSC_OMAP2_AUTOIDLE)
23
23
#define DMTIMER_TYPE2_ENABLE (SYSC_IDLE_SMART_WKUP << 2)
24
24
#define DMTIMER_RESET_WAIT 100000
25
25
@@ -44,6 +44,8 @@ struct dmtimer_systimer {
44
44
u8 ctrl ;
45
45
u8 wakeup ;
46
46
u8 ifctrl ;
47
+ struct clk * fck ;
48
+ struct clk * ick ;
47
49
unsigned long rate ;
48
50
};
49
51
@@ -298,16 +300,20 @@ static void __init dmtimer_systimer_select_best(void)
298
300
}
299
301
300
302
/* Interface clocks are only available on some SoCs variants */
301
- static int __init dmtimer_systimer_init_clock (struct device_node * np ,
303
+ static int __init dmtimer_systimer_init_clock (struct dmtimer_systimer * t ,
304
+ struct device_node * np ,
302
305
const char * name ,
303
306
unsigned long * rate )
304
307
{
305
308
struct clk * clock ;
306
309
unsigned long r ;
310
+ bool is_ick = false;
307
311
int error ;
308
312
313
+ is_ick = !strncmp (name , "ick" , 3 );
314
+
309
315
clock = of_clk_get_by_name (np , name );
310
- if ((PTR_ERR (clock ) == - EINVAL ) && ! strncmp ( name , "ick" , 3 ) )
316
+ if ((PTR_ERR (clock ) == - EINVAL ) && is_ick )
311
317
return 0 ;
312
318
else if (IS_ERR (clock ))
313
319
return PTR_ERR (clock );
@@ -320,6 +326,11 @@ static int __init dmtimer_systimer_init_clock(struct device_node *np,
320
326
if (!r )
321
327
return - ENODEV ;
322
328
329
+ if (is_ick )
330
+ t -> ick = clock ;
331
+ else
332
+ t -> fck = clock ;
333
+
323
334
* rate = r ;
324
335
325
336
return 0 ;
@@ -339,7 +350,10 @@ static void dmtimer_systimer_enable(struct dmtimer_systimer *t)
339
350
340
351
static void dmtimer_systimer_disable (struct dmtimer_systimer * t )
341
352
{
342
- writel_relaxed (0 , t -> base + t -> sysc );
353
+ if (!dmtimer_systimer_revision1 (t ))
354
+ return ;
355
+
356
+ writel_relaxed (DMTIMER_TYPE1_DISABLE , t -> base + t -> sysc );
343
357
}
344
358
345
359
static int __init dmtimer_systimer_setup (struct device_node * np ,
@@ -366,13 +380,13 @@ static int __init dmtimer_systimer_setup(struct device_node *np,
366
380
pr_err ("%s: clock source init failed: %i\n" , __func__ , error );
367
381
368
382
/* For ti-sysc, we have timer clocks at the parent module level */
369
- error = dmtimer_systimer_init_clock (np -> parent , "fck" , & rate );
383
+ error = dmtimer_systimer_init_clock (t , np -> parent , "fck" , & rate );
370
384
if (error )
371
385
goto err_unmap ;
372
386
373
387
t -> rate = rate ;
374
388
375
- error = dmtimer_systimer_init_clock (np -> parent , "ick" , & rate );
389
+ error = dmtimer_systimer_init_clock (t , np -> parent , "ick" , & rate );
376
390
if (error )
377
391
goto err_unmap ;
378
392
@@ -496,12 +510,18 @@ static void omap_clockevent_idle(struct clock_event_device *evt)
496
510
struct dmtimer_systimer * t = & clkevt -> t ;
497
511
498
512
dmtimer_systimer_disable (t );
513
+ clk_disable (t -> fck );
499
514
}
500
515
501
516
static void omap_clockevent_unidle (struct clock_event_device * evt )
502
517
{
503
518
struct dmtimer_clockevent * clkevt = to_dmtimer_clockevent (evt );
504
519
struct dmtimer_systimer * t = & clkevt -> t ;
520
+ int error ;
521
+
522
+ error = clk_enable (t -> fck );
523
+ if (error )
524
+ pr_err ("could not enable timer fck on resume: %i\n" , error );
505
525
506
526
dmtimer_systimer_enable (t );
507
527
writel_relaxed (OMAP_TIMER_INT_OVERFLOW , t -> base + t -> irq_ena );
@@ -570,8 +590,8 @@ static int __init dmtimer_clockevent_init(struct device_node *np)
570
590
3 , /* Timer internal resynch latency */
571
591
0xffffffff );
572
592
573
- if (of_device_is_compatible ( np , "ti,am33xx" ) ||
574
- of_device_is_compatible ( np , "ti,am43" )) {
593
+ if (of_machine_is_compatible ( "ti,am33xx" ) ||
594
+ of_machine_is_compatible ( "ti,am43" )) {
575
595
dev -> suspend = omap_clockevent_idle ;
576
596
dev -> resume = omap_clockevent_unidle ;
577
597
}
@@ -616,12 +636,18 @@ static void dmtimer_clocksource_suspend(struct clocksource *cs)
616
636
617
637
clksrc -> loadval = readl_relaxed (t -> base + t -> counter );
618
638
dmtimer_systimer_disable (t );
639
+ clk_disable (t -> fck );
619
640
}
620
641
621
642
static void dmtimer_clocksource_resume (struct clocksource * cs )
622
643
{
623
644
struct dmtimer_clocksource * clksrc = to_dmtimer_clocksource (cs );
624
645
struct dmtimer_systimer * t = & clksrc -> t ;
646
+ int error ;
647
+
648
+ error = clk_enable (t -> fck );
649
+ if (error )
650
+ pr_err ("could not enable timer fck on resume: %i\n" , error );
625
651
626
652
dmtimer_systimer_enable (t );
627
653
writel_relaxed (clksrc -> loadval , t -> base + t -> counter );
@@ -653,8 +679,8 @@ static int __init dmtimer_clocksource_init(struct device_node *np)
653
679
dev -> mask = CLOCKSOURCE_MASK (32 );
654
680
dev -> flags = CLOCK_SOURCE_IS_CONTINUOUS ;
655
681
656
- if ( of_device_is_compatible ( np , "ti,am33xx" ) ||
657
- of_device_is_compatible ( np , "ti,am43" )) {
682
+ /* Unlike for clockevent, legacy code sets suspend only for am4 */
683
+ if ( of_machine_is_compatible ( "ti,am43" )) {
658
684
dev -> suspend = dmtimer_clocksource_suspend ;
659
685
dev -> resume = dmtimer_clocksource_resume ;
660
686
}
0 commit comments