linux-mips
[Top] [All Lists]

Re: [rtc-linux] [PATCH V1] MIPS: Add RTC support for loongson1B

To: Wolfram Sang <w.sang@pengutronix.de>
Subject: Re: [rtc-linux] [PATCH V1] MIPS: Add RTC support for loongson1B
From: zhao zhang <zhzhl555@gmail.com>
Date: Mon, 28 Nov 2011 13:06:33 +0800
Cc: rtc-linux@googlegroups.com, a.zummo@towertech.it, linux-mips@linux-mips.org, linux-kernel@vger.kernel.org, ralf@linux-mips.org, keguang.zhang@gmail.com, wuzhangjin@gmail.com, r0bertz@gentoo.org, zhzhl555@gmail.com
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=7YKhc0UVSsOfdOiTL8lX03c+St5kuCsz8sxFiZNYKoE=; b=nzMf/Z30ETJC/Xs7sQkMkjPdG0nKUD3VO7kA9YwaOe9mfeoYm04JylFwqVZFsRGM30 ffdvtoQ+wf21L7sGSgp8FexTkQR7/Rs+7x1syXh6b/RV83W6ejcLuRfBpUswcAt8k8u2 gmsPGur1qa/Bh9EyYkmu64ftoO0+KD+/LzCUY=
In-reply-to: <20111127091803.GD5263@pengutronix.de>
References: <1322189527-4761-1-git-send-email-zhzhl555@gmail.com> <20111127091803.GD5263@pengutronix.de>
Sender: linux-mips-bounce@linux-mips.org
1:  Here is a  polling checking for TOY write status bit. if hardware done,
the bit will be cleared. so if hardware has problem, the while loop will be
infinite, it can never break out.  Does i really need to add timeout checking
code although have checked in probe code.

2:  Just set the default value, the real return value will be set in the following
code. Line 154, err information will be put into dev_err-block.

3: The minor, accept.

4: Because in probe, we can not assume the hardware is OK,
so add a counter( v = 0x100000) to avoid infinite loop.

5: a): Since i have checked the RTC timing was OK, and  toytrim write status was
OK again, so i can sure, the next writing will be OK.
    b): Just following the  Documentation/timers/timers-howto.txt.
    c): i can make sure.

6: agree.


在 2011年11月27日 下午5:18,Wolfram Sang <w.sang@pengutronix.de>写道:
On Fri, Nov 25, 2011 at 10:52:07AM +0800, zhzhl555@gmail.com wrote:

> +     writel(t, SYS_TOYWRITE1);
> +     while (readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TS)
> +             usleep_range(1000, 3000);
> +     __asm__ volatile ("sync");

Timeout?

> +
> +static int __devinit ls1x_rtc_probe(struct platform_device *pdev)
> +{
> +     struct rtc_device *rtcdev;
> +     unsigned long v;
> +     int ret;
> +
> +     v = readl(SYS_COUNTER_CNTRL);
> +     if (!(v & RTC_CNTR_OK)) {
> +             dev_err(&pdev->dev, "rtc counters not working\n");
> +             ret = -ENODEV;
> +             goto err;
> +     }
> +     ret = -ETIMEDOUT;

Why not putting this line to the corresponding dev_err-block?

> +     /*set to 1 HZ if needed*/

Minor: Spaces around comment-markers, here and in other places

/* Comment */

> +     if (readl(SYS_TOYTRIM) != 32767) {
> +             v = 0x100000;
> +             while ((readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TTS) && --v)
> +                     usleep_range(1000, 3000);

Timeout?

> +
> +             if (!v) {
> +                     dev_err(&pdev->dev, "time out\n");
> +                     goto err;
> +             }
> +             writel(32767, SYS_TOYTRIM);
> +             __asm__ volatile("sync");
> +     }
> +     /*this loop coundn't be endless*/
> +     while (readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_TTS)
> +             usleep_range(1000, 3000);

Timeout again. First, the comment does not help. Why are you sure the loop
could not be endless? And: Does it really need to be a usleep_range() instead
of a simple msleep()? And to make sure: There is no interrupt signalling the
status changed?

> +
> +     rtcdev = rtc_device_register("ls1x-rtc", &pdev->dev,
> +                                     &ls1x_rtc_ops , THIS_MODULE);
> +     if (IS_ERR(rtcdev)) {
> +             ret = PTR_ERR(rtcdev);
> +             goto err;
> +     }
> +
> +     platform_set_drvdata(pdev, rtcdev);
> +     return 0;
> +err:
> +     return ret;
> +}
> +

...

> +static int __init ls1x_rtc_init(void)
> +{
> +     return platform_driver_probe(&ls1x_rtc_driver, ls1x_rtc_probe);
> +}
> +
> +static void __exit ls1x_rtc_exit(void)
> +{
> +     platform_driver_unregister(&ls1x_rtc_driver);
> +}
> +
> +
> +module_init(ls1x_rtc_init);
> +module_exit(ls1x_rtc_exit);

Please use the new module_platform_driver()-macro.

Thanks,

  Wolfram

--
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

<Prev in Thread] Current Thread [Next in Thread>