|
@@ -43,14 +43,28 @@ static bool arch_timer_use_virtual = true;
|
|
|
* Architected system timer support.
|
|
|
*/
|
|
|
|
|
|
+static __always_inline
|
|
|
+void arch_timer_reg_write(int access, enum arch_timer_reg reg, u32 val,
|
|
|
+ struct clock_event_device *clk)
|
|
|
+{
|
|
|
+ arch_timer_reg_write_cp15(access, reg, val);
|
|
|
+}
|
|
|
+
|
|
|
+static __always_inline
|
|
|
+u32 arch_timer_reg_read(int access, enum arch_timer_reg reg,
|
|
|
+ struct clock_event_device *clk)
|
|
|
+{
|
|
|
+ return arch_timer_reg_read_cp15(access, reg);
|
|
|
+}
|
|
|
+
|
|
|
static __always_inline irqreturn_t timer_handler(const int access,
|
|
|
struct clock_event_device *evt)
|
|
|
{
|
|
|
unsigned long ctrl;
|
|
|
- ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL);
|
|
|
+ ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, evt);
|
|
|
if (ctrl & ARCH_TIMER_CTRL_IT_STAT) {
|
|
|
ctrl |= ARCH_TIMER_CTRL_IT_MASK;
|
|
|
- arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl);
|
|
|
+ arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, evt);
|
|
|
evt->event_handler(evt);
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -72,15 +86,16 @@ static irqreturn_t arch_timer_handler_phys(int irq, void *dev_id)
|
|
|
return timer_handler(ARCH_TIMER_PHYS_ACCESS, evt);
|
|
|
}
|
|
|
|
|
|
-static __always_inline void timer_set_mode(const int access, int mode)
|
|
|
+static __always_inline void timer_set_mode(const int access, int mode,
|
|
|
+ struct clock_event_device *clk)
|
|
|
{
|
|
|
unsigned long ctrl;
|
|
|
switch (mode) {
|
|
|
case CLOCK_EVT_MODE_UNUSED:
|
|
|
case CLOCK_EVT_MODE_SHUTDOWN:
|
|
|
- ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL);
|
|
|
+ ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk);
|
|
|
ctrl &= ~ARCH_TIMER_CTRL_ENABLE;
|
|
|
- arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl);
|
|
|
+ arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
@@ -90,36 +105,37 @@ static __always_inline void timer_set_mode(const int access, int mode)
|
|
|
static void arch_timer_set_mode_virt(enum clock_event_mode mode,
|
|
|
struct clock_event_device *clk)
|
|
|
{
|
|
|
- timer_set_mode(ARCH_TIMER_VIRT_ACCESS, mode);
|
|
|
+ timer_set_mode(ARCH_TIMER_VIRT_ACCESS, mode, clk);
|
|
|
}
|
|
|
|
|
|
static void arch_timer_set_mode_phys(enum clock_event_mode mode,
|
|
|
struct clock_event_device *clk)
|
|
|
{
|
|
|
- timer_set_mode(ARCH_TIMER_PHYS_ACCESS, mode);
|
|
|
+ timer_set_mode(ARCH_TIMER_PHYS_ACCESS, mode, clk);
|
|
|
}
|
|
|
|
|
|
-static __always_inline void set_next_event(const int access, unsigned long evt)
|
|
|
+static __always_inline void set_next_event(const int access, unsigned long evt,
|
|
|
+ struct clock_event_device *clk)
|
|
|
{
|
|
|
unsigned long ctrl;
|
|
|
- ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL);
|
|
|
+ ctrl = arch_timer_reg_read(access, ARCH_TIMER_REG_CTRL, clk);
|
|
|
ctrl |= ARCH_TIMER_CTRL_ENABLE;
|
|
|
ctrl &= ~ARCH_TIMER_CTRL_IT_MASK;
|
|
|
- arch_timer_reg_write(access, ARCH_TIMER_REG_TVAL, evt);
|
|
|
- arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl);
|
|
|
+ arch_timer_reg_write(access, ARCH_TIMER_REG_TVAL, evt, clk);
|
|
|
+ arch_timer_reg_write(access, ARCH_TIMER_REG_CTRL, ctrl, clk);
|
|
|
}
|
|
|
|
|
|
static int arch_timer_set_next_event_virt(unsigned long evt,
|
|
|
- struct clock_event_device *unused)
|
|
|
+ struct clock_event_device *clk)
|
|
|
{
|
|
|
- set_next_event(ARCH_TIMER_VIRT_ACCESS, evt);
|
|
|
+ set_next_event(ARCH_TIMER_VIRT_ACCESS, evt, clk);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
static int arch_timer_set_next_event_phys(unsigned long evt,
|
|
|
- struct clock_event_device *unused)
|
|
|
+ struct clock_event_device *clk)
|
|
|
{
|
|
|
- set_next_event(ARCH_TIMER_PHYS_ACCESS, evt);
|
|
|
+ set_next_event(ARCH_TIMER_PHYS_ACCESS, evt, clk);
|
|
|
return 0;
|
|
|
}
|
|
|
|