Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Copyright (C) 2000,2001,2004 Broadcom Corporation
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 }