Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752663AbbKKOur (ORCPT ); Wed, 11 Nov 2015 09:50:47 -0500 Received: from mail1.asahi-net.or.jp ([202.224.39.197]:17139 "EHLO mail1.asahi-net.or.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752544AbbKKOum (ORCPT ); Wed, 11 Nov 2015 09:50:42 -0500 From: Yoshinori Sato To: Daniel Lezcano , Thomas Gleixner Cc: Yoshinori Sato , linux-kernel@vger.kernel.org Subject: [PATCH 3/4] h8300: clocksource: More simplify timer8_set_next Date: Wed, 11 Nov 2015 23:50:15 +0900 Message-Id: <1447253416-13892-4-git-send-email-ysato@users.sourceforge.jp> X-Mailer: git-send-email 2.6.1 In-Reply-To: <1447253416-13892-1-git-send-email-ysato@users.sourceforge.jp> References: <1447063614-4662-1-git-send-email-daniel.lezcano@linaro.org> <1447253416-13892-1-git-send-email-ysato@users.sourceforge.jp> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2631 Lines: 95 Signed-off-by: Yoshinori Sato --- drivers/clocksource/h8300_timer8.c | 48 +++++++++++--------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/drivers/clocksource/h8300_timer8.c b/drivers/clocksource/h8300_timer8.c index 187c416..d85ae9a 100644 --- a/drivers/clocksource/h8300_timer8.c +++ b/drivers/clocksource/h8300_timer8.c @@ -24,6 +24,9 @@ #define TCORB 6 #define _8TCNT 8 +#define CMIEA BIT(6) +#define CMFA BIT(6) + #define FLAG_STARTED (1 << 3) #define SCALE 64 @@ -36,57 +39,32 @@ struct timer8_priv { unsigned int tcora; }; -static unsigned long timer8_get_counter(struct timer8_priv *p) -{ - unsigned long v1, v2, v3; - int o1, o2; - - o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20; - - /* Make sure the timer value is stable. Stolen from acpi_pm.c */ - do { - o2 = o1; - v1 = ctrl_inw(p->mapbase + _8TCNT); - v2 = ctrl_inw(p->mapbase + _8TCNT); - v3 = ctrl_inw(p->mapbase + _8TCNT); - o1 = ctrl_inb(p->mapbase + _8TCSR) & 0x20; - } while (unlikely((o1 != o2) || (v1 > v2 && v1 < v3) - || (v2 > v3 && v2 < v1) || (v3 > v1 && v3 < v2))); - - v2 |= o1 << 10; - return v2; -} - static irqreturn_t timer8_interrupt(int irq, void *dev_id) { struct timer8_priv *p = dev_id; - ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~0x40, - p->mapbase + _8TCSR); - - ctrl_outw(p->tcora, p->mapbase + TCORA); - if (clockevent_state_oneshot(&p->ced)) ctrl_outw(0x0000, p->mapbase + _8TCR); p->ced.event_handler(&p->ced); + ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~CMFA, + p->mapbase + _8TCSR); return IRQ_HANDLED; } static void timer8_set_next(struct timer8_priv *p, unsigned long delta) { - unsigned long now; - if (delta >= 0x10000) pr_warn("delta out of range\n"); - now = timer8_get_counter(p); - p->tcora = delta; - ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | 0x40, p->mapbase + _8TCR); - if (delta > now) - ctrl_outw(delta, p->mapbase + TCORA); - else - ctrl_outw(now + 1, p->mapbase + TCORA); + ctrl_outb(ctrl_inb(p->mapbase + _8TCR) & ~CMIEA, + p->mapbase + _8TCR); + ctrl_outw(delta, p->mapbase + TCORA); + ctrl_outw(0x0000, p->mapbase + _8TCNT); + ctrl_outb(ctrl_inb(p->mapbase + _8TCSR) & ~CMFA, + p->mapbase + _8TCSR); + ctrl_outb(ctrl_inb(p->mapbase + _8TCR) | CMIEA, + p->mapbase + _8TCR); } static int timer8_enable(struct timer8_priv *p) -- 2.6.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/