diff options
Diffstat (limited to 'drivers/clocksource/cadence_ttc_timer.c')
-rw-r--r-- | drivers/clocksource/cadence_ttc_timer.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/clocksource/cadence_ttc_timer.c b/drivers/clocksource/cadence_ttc_timer.c index 685bc60e210a..4cbe28c74631 100644 --- a/drivers/clocksource/cadence_ttc_timer.c +++ b/drivers/clocksource/cadence_ttc_timer.c | |||
@@ -51,6 +51,8 @@ | |||
51 | 51 | ||
52 | #define TTC_CNT_CNTRL_DISABLE_MASK 0x1 | 52 | #define TTC_CNT_CNTRL_DISABLE_MASK 0x1 |
53 | 53 | ||
54 | #define TTC_CLK_CNTRL_CSRC_MASK (1 << 5) /* clock source */ | ||
55 | |||
54 | /* | 56 | /* |
55 | * Setup the timers to use pre-scaling, using a fixed value for now that will | 57 | * Setup the timers to use pre-scaling, using a fixed value for now that will |
56 | * work across most input frequency, but it may need to be more dynamic | 58 | * work across most input frequency, but it may need to be more dynamic |
@@ -396,8 +398,9 @@ static void __init ttc_timer_init(struct device_node *timer) | |||
396 | { | 398 | { |
397 | unsigned int irq; | 399 | unsigned int irq; |
398 | void __iomem *timer_baseaddr; | 400 | void __iomem *timer_baseaddr; |
399 | struct clk *clk; | 401 | struct clk *clk_cs, *clk_ce; |
400 | static int initialized; | 402 | static int initialized; |
403 | int clksel; | ||
401 | 404 | ||
402 | if (initialized) | 405 | if (initialized) |
403 | return; | 406 | return; |
@@ -421,14 +424,24 @@ static void __init ttc_timer_init(struct device_node *timer) | |||
421 | BUG(); | 424 | BUG(); |
422 | } | 425 | } |
423 | 426 | ||
424 | clk = of_clk_get_by_name(timer, "cpu_1x"); | 427 | clksel = __raw_readl(timer_baseaddr + TTC_CLK_CNTRL_OFFSET); |
425 | if (IS_ERR(clk)) { | 428 | clksel = !!(clksel & TTC_CLK_CNTRL_CSRC_MASK); |
429 | clk_cs = of_clk_get(timer, clksel); | ||
430 | if (IS_ERR(clk_cs)) { | ||
431 | pr_err("ERROR: timer input clock not found\n"); | ||
432 | BUG(); | ||
433 | } | ||
434 | |||
435 | clksel = __raw_readl(timer_baseaddr + 4 + TTC_CLK_CNTRL_OFFSET); | ||
436 | clksel = !!(clksel & TTC_CLK_CNTRL_CSRC_MASK); | ||
437 | clk_ce = of_clk_get(timer, clksel); | ||
438 | if (IS_ERR(clk_ce)) { | ||
426 | pr_err("ERROR: timer input clock not found\n"); | 439 | pr_err("ERROR: timer input clock not found\n"); |
427 | BUG(); | 440 | BUG(); |
428 | } | 441 | } |
429 | 442 | ||
430 | ttc_setup_clocksource(clk, timer_baseaddr); | 443 | ttc_setup_clocksource(clk_cs, timer_baseaddr); |
431 | ttc_setup_clockevent(clk, timer_baseaddr + 4, irq); | 444 | ttc_setup_clockevent(clk_ce, timer_baseaddr + 4, irq); |
432 | 445 | ||
433 | pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq); | 446 | pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq); |
434 | } | 447 | } |