1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2000, 2001 Broadcom Corporation
5 #include <linux/clocksource.h>
6 #include <linux/sched_clock.h>
8 #include <asm/addrspace.h>
12 #include <asm/sibyte/sb1250.h>
13 #include <asm/sibyte/sb1250_regs.h>
14 #include <asm/sibyte/sb1250_int.h>
15 #include <asm/sibyte/sb1250_scd.h>
17 #define SB1250_HPT_NUM 3
18 #define SB1250_HPT_VALUE M_SCD_TIMER_CNT /* max value */
21 * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over
24 static inline u64
sb1250_hpt_get_cycles(void)
29 addr
= IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM
, R_SCD_TIMER_CNT
));
30 count
= G_SCD_TIMER_CNT(__raw_readq(addr
));
32 return SB1250_HPT_VALUE
- count
;
35 static u64
sb1250_hpt_read(struct clocksource
*cs
)
37 return sb1250_hpt_get_cycles();
40 struct clocksource bcm1250_clocksource
= {
41 .name
= "bcm1250-counter-3",
43 .read
= sb1250_hpt_read
,
44 .mask
= CLOCKSOURCE_MASK(23),
45 .flags
= CLOCK_SOURCE_IS_CONTINUOUS
,
48 static u64 notrace
sb1250_read_sched_clock(void)
50 return sb1250_hpt_get_cycles();
53 void __init
sb1250_clocksource_init(void)
55 struct clocksource
*cs
= &bcm1250_clocksource
;
57 /* Setup hpt using timer #3 but do not enable irq for it */
59 IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM
,
61 __raw_writeq(SB1250_HPT_VALUE
,
62 IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM
,
64 __raw_writeq(M_SCD_TIMER_ENABLE
| M_SCD_TIMER_MODE_CONTINUOUS
,
65 IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM
,
68 clocksource_register_hz(cs
, V_SCD_TIMER_FREQ
);
70 sched_clock_register(sb1250_read_sched_clock
, 23, V_SCD_TIMER_FREQ
);