From patchwork Thu Jun 11 15:51:42 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shin-ichiro KAWASAKI X-Patchwork-Id: 29604 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n5BFqJx4032736 for ; Thu, 11 Jun 2009 15:52:19 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757894AbZFKPvh (ORCPT ); Thu, 11 Jun 2009 11:51:37 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753654AbZFKPvh (ORCPT ); Thu, 11 Jun 2009 11:51:37 -0400 Received: from vsmtp02.dti.ne.jp ([202.216.231.137]:47386 "EHLO vsmtp02.dti.ne.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757894AbZFKPvg (ORCPT ); Thu, 11 Jun 2009 11:51:36 -0400 Received: from [192.168.1.20] (PPPa1541.e11.eacc.dti.ne.jp [124.255.92.24]) by vsmtp02.dti.ne.jp (3.11v) with ESMTP AUTH id n5BFpZZg029060; Fri, 12 Jun 2009 00:51:35 +0900 (JST) Message-ID: <4A31280E.3020601@juno.dti.ne.jp> Date: Fri, 12 Jun 2009 00:51:42 +0900 From: Shin-ichiro KAWASAKI User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) MIME-Version: 1.0 To: Paul Mundt , Magnus Damm , Shin-ichiro KAWASAKI , linux-sh@vger.kernel.org Subject: Re: [PATCH] clocksource: SuperH TMU Timer driver References: <20090501065100.8800.99808.sendpatchset@rx1.opensource.se> <4A213434.4030800@juno.dti.ne.jp> <20090601105747.GA32746@linux-sh.org> <4A24583B.2070604@juno.dti.ne.jp> In-Reply-To: <4A24583B.2070604@juno.dti.ne.jp> Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org Shin-ichiro KAWASAKI wrote: > Paul Mundt wrote: >> On Mon, Jun 01, 2009 at 07:50:40PM +0900, Magnus Damm wrote: >>> 2009/5/30 Shin-ichiro KAWASAKI : >>>> I made some investigation, and found that the warnings are printed >>>> after zero value is set to TCOR. ?I checked SH7785 hardware manual, >>>> but could not find any description what happens when zero value set >>>> to TCOR. >>> Thanks for investigating. I read a few SH manuals before converting >>> the old driver, but I couldn't find any description of zero value. >>> Same as you. >>> >>> The idea with zero value TCOR comes from the old driver. It may be >>> there for some historical reason, or it may just be plain wrong. I've >>> sometimes seen interrupt bursts with the old tmu driver which may be >>> related. >>> >> It was mostly there just because it worked and seemed like a reasonable >> thing to do, and because no one had any better ideas on what to do in >> that situation. But yes, technically the behaviour is undefined, and so >> finding something slightly more precise is a good idea. > > Thank you for your explanations, Magnus, Paul! > It has got clearer for me. > > I guess there are two solutions. > > i) Add one-shot timer feature to qemu-sh's TMU emulation. > (Even though this feature is not documented.) > ii) Modify sh-linux TMU driver not to set zero value to TCOR. > (A status will be added to sh_tmu_priv.) > > I'll consider on both of them, but that will take a week or so. > Any help from others will be appreciated. Here's the patch which suggests TMU driver modification. It does, - Sets maximum value 0xffffffff to TCOR instead of zero. Then after one shot interrupt, next count down runs for a while (around seconds?) - Stops the timer in the one shot interrupt handler. Then next count down does not reach to zero. This patch assumes that while TMU counting down from 0xffffffff, the interrupt handler finishes the task to stop the timer. I confirmed that the timer warnings from qemu-sh disappear with this patch. No test is done with real hardware. I'm not familiar with linux clock framework. Any comments are welcome. Regards, Shin-ichiro KAWASAKI --- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index d6ea439..7bb0bd3 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c @@ -158,7 +158,7 @@ static void sh_tmu_set_next(struct sh_tmu_priv *p, unsigned long delta, if (periodic) sh_tmu_write(p, TCOR, delta); else - sh_tmu_write(p, TCOR, 0); + sh_tmu_write(p, TCOR, 0xffffffff); sh_tmu_write(p, TCNT, delta); @@ -171,9 +171,10 @@ static irqreturn_t sh_tmu_interrupt(int irq, void *dev_id) struct sh_tmu_priv *p = dev_id; /* disable or acknowledge interrupt */ - if (p->ced.mode == CLOCK_EVT_MODE_ONESHOT) + if (p->ced.mode == CLOCK_EVT_MODE_ONESHOT) { + sh_tmu_start_stop_ch(p, 0); sh_tmu_write(p, TCR, 0x0000); - else + } else sh_tmu_write(p, TCR, 0x0020); /* notify clockevent layer */