2019-05-27 09:55:06 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2007-11-01 04:57:55 +03:00
/*
* Copyright ( C ) 2000 , 2001 , 2004 Broadcom Corporation
*/
# include <linux/clocksource.h>
2015-03-07 21:30:26 +03:00
# include <linux/sched_clock.h>
2007-11-01 04:57:55 +03:00
# include <asm/addrspace.h>
# include <asm/io.h>
# include <asm/time.h>
# include <asm/sibyte/bcm1480_regs.h>
# include <asm/sibyte/sb1250_regs.h>
# include <asm/sibyte/bcm1480_int.h>
# include <asm/sibyte/bcm1480_scd.h>
# include <asm/sibyte/sb1250.h>
2016-12-21 22:32:01 +03:00
static u64 bcm1480_hpt_read ( struct clocksource * cs )
2007-11-01 04:57:55 +03:00
{
2016-12-21 22:32:01 +03:00
return ( u64 ) __raw_readq ( IOADDR ( A_SCD_ZBBUS_CYCLE_COUNT ) ) ;
2007-11-01 04:57:55 +03:00
}
struct clocksource bcm1480_clocksource = {
. name = " zbbus-cycles " ,
2013-01-22 15:59:30 +04:00
. rating = 200 ,
2007-11-01 04:57:55 +03:00
. read = bcm1480_hpt_read ,
. mask = CLOCKSOURCE_MASK ( 64 ) ,
. flags = CLOCK_SOURCE_IS_CONTINUOUS ,
} ;
2015-03-07 21:30:26 +03:00
static u64 notrace sb1480_read_sched_clock ( void )
{
return __raw_readq ( IOADDR ( A_SCD_ZBBUS_CYCLE_COUNT ) ) ;
}
2007-11-01 04:57:55 +03:00
void __init sb1480_clocksource_init ( void )
{
struct clocksource * cs = & bcm1480_clocksource ;
unsigned int plldiv ;
unsigned long zbbus ;
plldiv = G_BCM1480_SYS_PLL_DIV ( __raw_readq ( IOADDR ( A_SCD_SYSTEM_CFG ) ) ) ;
zbbus = ( ( plldiv > > 1 ) * 50000000 ) + ( ( plldiv & 1 ) * 25000000 ) ;
2010-04-27 07:23:11 +04:00
clocksource_register_hz ( cs , zbbus ) ;
2015-03-07 21:30:26 +03:00
sched_clock_register ( sb1480_read_sched_clock , 64 , zbbus ) ;
2007-11-01 04:57:55 +03:00
}