lkml.org 
[lkml]   [2012]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 105/117] drivers/rtc/rtc-pl031.c: configure correct wday for 2000-01-01
    3.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com>

    commit c0a5f4a05af588a0f9951f8d24e2564b09501918 upstream.

    The reset date of the ST Micro version of PL031 is 2000-01-01. The
    correct weekday for 2000-01-01 is saturday, but pl031 is initialized to
    sunday. This may lead to alarm malfunction, so configure the correct
    wday if RTC_DR indicates reset.

    Signed-off-by: Rajkumar Kasirajan <rajkumar.kasirajan@stericsson.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Cc: Mattias Wallin <mattias.wallin@stericsson.com>
    Cc: Alessandro Zummo <a.zummo@towertech.it>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/rtc/rtc-pl031.c | 18 ++++++++++++++++++
    1 file changed, 18 insertions(+)

    diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
    index 684ef4b..f027c06 100644
    --- a/drivers/rtc/rtc-pl031.c
    +++ b/drivers/rtc/rtc-pl031.c
    @@ -312,6 +312,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
    int ret;
    struct pl031_local *ldata;
    struct rtc_class_ops *ops = id->data;
    + unsigned long time;

    ret = amba_request_regions(adev, NULL);
    if (ret)
    @@ -343,6 +344,23 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
    writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
    ldata->base + RTC_CR);

    + /*
    + * On ST PL031 variants, the RTC reset value does not provide correct
    + * weekday for 2000-01-01. Correct the erroneous sunday to saturday.
    + */
    + if (ldata->hw_designer == AMBA_VENDOR_ST) {
    + if (readl(ldata->base + RTC_YDR) == 0x2000) {
    + time = readl(ldata->base + RTC_DR);
    + if ((time &
    + (RTC_MON_MASK | RTC_MDAY_MASK | RTC_WDAY_MASK))
    + == 0x02120000) {
    + time = time | (0x7 << RTC_WDAY_SHIFT);
    + writel(0x2000, ldata->base + RTC_YLR);
    + writel(time, ldata->base + RTC_LR);
    + }
    + }
    + }
    +
    ldata->rtc = rtc_device_register("pl031", &adev->dev, ops,
    THIS_MODULE);
    if (IS_ERR(ldata->rtc)) {



    \
     
     \ /
      Last update: 2012-05-28 06:01    [W:0.033 / U:0.700 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site