microblaze: timer: Use generic sched_clock implementation
Remove sched_clock from the driver and use sched_clock_register
function.
Inspired-by:
"arch_timer: Move to generic sched_clock framework"
(sha1: 65cd4f6c99
)
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
@@ -27,6 +27,7 @@ config MICROBLAZE
|
|||||||
select GENERIC_ATOMIC64
|
select GENERIC_ATOMIC64
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
|
select GENERIC_SCHED_CLOCK
|
||||||
select GENERIC_IDLE_POLL_SETUP
|
select GENERIC_IDLE_POLL_SETUP
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select CLONE_BACKWARDS3
|
select CLONE_BACKWARDS3
|
||||||
|
@@ -12,12 +12,12 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched_clock.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/clockchips.h>
|
#include <linux/clockchips.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
#include <asm/cpuinfo.h>
|
#include <asm/cpuinfo.h>
|
||||||
#include <linux/cnt32_to_63.h>
|
|
||||||
|
|
||||||
static void __iomem *timer_baseaddr;
|
static void __iomem *timer_baseaddr;
|
||||||
|
|
||||||
@@ -167,10 +167,15 @@ static __init void xilinx_clockevent_init(void)
|
|||||||
clockevents_register_device(&clockevent_xilinx_timer);
|
clockevents_register_device(&clockevent_xilinx_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 xilinx_clock_read(void)
|
||||||
|
{
|
||||||
|
return in_be32(timer_baseaddr + TCR1);
|
||||||
|
}
|
||||||
|
|
||||||
static cycle_t xilinx_read(struct clocksource *cs)
|
static cycle_t xilinx_read(struct clocksource *cs)
|
||||||
{
|
{
|
||||||
/* reading actual value of timer 1 */
|
/* reading actual value of timer 1 */
|
||||||
return (cycle_t) (in_be32(timer_baseaddr + TCR1));
|
return (cycle_t)xilinx_clock_read();
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct timecounter xilinx_tc = {
|
static struct timecounter xilinx_tc = {
|
||||||
@@ -222,12 +227,6 @@ static int __init xilinx_clocksource_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We have to protect accesses before timer initialization
|
|
||||||
* and return 0 for sched_clock function below.
|
|
||||||
*/
|
|
||||||
static int timer_initialized;
|
|
||||||
|
|
||||||
static void __init xilinx_timer_init(struct device_node *timer)
|
static void __init xilinx_timer_init(struct device_node *timer)
|
||||||
{
|
{
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
@@ -273,18 +272,8 @@ static void __init xilinx_timer_init(struct device_node *timer)
|
|||||||
#endif
|
#endif
|
||||||
xilinx_clocksource_init();
|
xilinx_clocksource_init();
|
||||||
xilinx_clockevent_init();
|
xilinx_clockevent_init();
|
||||||
timer_initialized = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long long notrace sched_clock(void)
|
sched_clock_register(xilinx_clock_read, 32, timer_clock_freq);
|
||||||
{
|
|
||||||
if (timer_initialized) {
|
|
||||||
struct clocksource *cs = &clocksource_microblaze;
|
|
||||||
|
|
||||||
cycle_t cyc = cnt32_to_63(cs->read(NULL)) & LLONG_MAX;
|
|
||||||
return clocksource_cyc2ns(cyc, cs->mult, cs->shift);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CLOCKSOURCE_OF_DECLARE(xilinx_timer, "xlnx,xps-timer-1.00.a",
|
CLOCKSOURCE_OF_DECLARE(xilinx_timer, "xlnx,xps-timer-1.00.a",
|
||||||
|
Reference in New Issue
Block a user