ret = request_irq(rk_clkevt->timer.irq, rk_timer_interrupt, IRQF_TIMER,
#include <linux/clockchips.h>
#include <linux/interrupt.h>
#include <linux/sched_clock.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#define TIMER_NAME "rk_timer"
#define TIMER_LOAD_COUNT0 0x00
#define TIMER_LOAD_COUNT1 0x04
#define TIMER_CURRENT_VALUE0 0x08
#define TIMER_CURRENT_VALUE1 0x0C
#define TIMER_CONTROL_REG3288 0x10
#define TIMER_CONTROL_REG3399 0x1c
#define TIMER_INT_STATUS 0x18
#define TIMER_DISABLE 0x0
#define TIMER_MODE_FREE_RUNNING (0 << 1)
#define TIMER_MODE_USER_DEFINED_COUNT (1 << 1)
#define TIMER_INT_UNMASK (1 << 2)
struct clock_event_device ce;
static struct rk_clkevt *rk_clkevt;
static struct rk_timer *rk_clksrc;
static inline struct rk_timer *rk_timer(struct clock_event_device *ce)
return &container_of(ce, struct rk_clkevt, ce)->timer;
static inline void rk_timer_disable(struct rk_timer *timer)
writel_relaxed(TIMER_DISABLE, timer->ctrl);
static inline void rk_timer_enable(struct rk_timer *timer, u32 flags)
writel_relaxed(TIMER_ENABLE | flags, timer->ctrl);
static void rk_timer_update_counter(unsigned long cycles,
writel_relaxed(cycles, timer->base + TIMER_LOAD_COUNT0);
writel_relaxed(0, timer->base + TIMER_LOAD_COUNT1);
static void rk_timer_interrupt_clear(struct rk_timer *timer)
writel_relaxed(1, timer->base + TIMER_INT_STATUS);
static inline int rk_timer_set_next_event(unsigned long cycles,
struct clock_event_device *ce)
struct rk_timer *timer = rk_timer(ce);
rk_timer_update_counter(cycles, timer);
rk_timer_enable(timer, TIMER_MODE_USER_DEFINED_COUNT |
static int rk_timer_shutdown(struct clock_event_device *ce)