0001
0002
0003
0004
0005 #include <linux/clocksource.h>
0006 #include <linux/sched_clock.h>
0007
0008 #include <asm/addrspace.h>
0009 #include <asm/io.h>
0010 #include <asm/time.h>
0011
0012 #include <asm/sibyte/bcm1480_regs.h>
0013 #include <asm/sibyte/sb1250_regs.h>
0014 #include <asm/sibyte/bcm1480_int.h>
0015 #include <asm/sibyte/bcm1480_scd.h>
0016
0017 #include <asm/sibyte/sb1250.h>
0018
0019 static u64 bcm1480_hpt_read(struct clocksource *cs)
0020 {
0021 return (u64) __raw_readq(IOADDR(A_SCD_ZBBUS_CYCLE_COUNT));
0022 }
0023
0024 struct clocksource bcm1480_clocksource = {
0025 .name = "zbbus-cycles",
0026 .rating = 200,
0027 .read = bcm1480_hpt_read,
0028 .mask = CLOCKSOURCE_MASK(64),
0029 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
0030 };
0031
0032 static u64 notrace sb1480_read_sched_clock(void)
0033 {
0034 return __raw_readq(IOADDR(A_SCD_ZBBUS_CYCLE_COUNT));
0035 }
0036
0037 void __init sb1480_clocksource_init(void)
0038 {
0039 struct clocksource *cs = &bcm1480_clocksource;
0040 unsigned int plldiv;
0041 unsigned long zbbus;
0042
0043 plldiv = G_BCM1480_SYS_PLL_DIV(__raw_readq(IOADDR(A_SCD_SYSTEM_CFG)));
0044 zbbus = ((plldiv >> 1) * 50000000) + ((plldiv & 1) * 25000000);
0045 clocksource_register_hz(cs, zbbus);
0046
0047 sched_clock_register(sb1480_read_sched_clock, 64, zbbus);
0048 }