提交 a602f0f2 编写于 作者: U Uwe Kleine-König

arm/{pxa,sa1100,nomadik}: Don't disable irqs in set_next_event and set_mode

These functions are called with irqs already off.  This commit removes
the calls to raw_local_irq_save and raw_local_irq_restore on platforms
that don't have to use a shared interrupt for their timekeeping.
Signed-off-by: NUwe Kleine-König <u.kleine-koenig@pengutronix.de>
上级 501d7038
...@@ -76,14 +76,12 @@ pxa_ost0_interrupt(int irq, void *dev_id) ...@@ -76,14 +76,12 @@ pxa_ost0_interrupt(int irq, void *dev_id)
static int static int
pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev)
{ {
unsigned long flags, next, oscr; unsigned long next, oscr;
raw_local_irq_save(flags);
OIER |= OIER_E0; OIER |= OIER_E0;
next = OSCR + delta; next = OSCR + delta;
OSMR0 = next; OSMR0 = next;
oscr = OSCR; oscr = OSCR;
raw_local_irq_restore(flags);
return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0;
} }
...@@ -91,23 +89,17 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev) ...@@ -91,23 +89,17 @@ pxa_osmr0_set_next_event(unsigned long delta, struct clock_event_device *dev)
static void static void
pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev) pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev)
{ {
unsigned long irqflags;
switch (mode) { switch (mode) {
case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT:
raw_local_irq_save(irqflags);
OIER &= ~OIER_E0; OIER &= ~OIER_E0;
OSSR = OSSR_M0; OSSR = OSSR_M0;
raw_local_irq_restore(irqflags);
break; break;
case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN:
/* initializing, released, or preparing for suspend */ /* initializing, released, or preparing for suspend */
raw_local_irq_save(irqflags);
OIER &= ~OIER_E0; OIER &= ~OIER_E0;
OSSR = OSSR_M0; OSSR = OSSR_M0;
raw_local_irq_restore(irqflags);
break; break;
case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME:
......
...@@ -35,14 +35,12 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id) ...@@ -35,14 +35,12 @@ static irqreturn_t sa1100_ost0_interrupt(int irq, void *dev_id)
static int static int
sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c)
{ {
unsigned long flags, next, oscr; unsigned long next, oscr;
raw_local_irq_save(flags);
OIER |= OIER_E0; OIER |= OIER_E0;
next = OSCR + delta; next = OSCR + delta;
OSMR0 = next; OSMR0 = next;
oscr = OSCR; oscr = OSCR;
raw_local_irq_restore(flags);
return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0; return (signed)(next - oscr) <= MIN_OSCR_DELTA ? -ETIME : 0;
} }
...@@ -50,16 +48,12 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c) ...@@ -50,16 +48,12 @@ sa1100_osmr0_set_next_event(unsigned long delta, struct clock_event_device *c)
static void static void
sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c) sa1100_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *c)
{ {
unsigned long flags;
switch (mode) { switch (mode) {
case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT:
case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN:
raw_local_irq_save(flags);
OIER &= ~OIER_E0; OIER &= ~OIER_E0;
OSSR = OSSR_M0; OSSR = OSSR_M0;
raw_local_irq_restore(flags);
break; break;
case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME:
......
...@@ -49,24 +49,17 @@ static struct clocksource nmdk_clksrc = { ...@@ -49,24 +49,17 @@ static struct clocksource nmdk_clksrc = {
static void nmdk_clkevt_mode(enum clock_event_mode mode, static void nmdk_clkevt_mode(enum clock_event_mode mode,
struct clock_event_device *dev) struct clock_event_device *dev)
{ {
unsigned long flags;
switch (mode) { switch (mode) {
case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_PERIODIC:
/* enable interrupts -- and count current value? */ /* count current value? */
raw_local_irq_save(flags);
writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC);
raw_local_irq_restore(flags);
break; break;
case CLOCK_EVT_MODE_ONESHOT: case CLOCK_EVT_MODE_ONESHOT:
BUG(); /* Not supported, yet */ BUG(); /* Not supported, yet */
/* FALLTHROUGH */ /* FALLTHROUGH */
case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN:
case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED:
/* disable irq */
raw_local_irq_save(flags);
writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC); writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC);
raw_local_irq_restore(flags);
break; break;
case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME:
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册