lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 280/343] rtc: pcf2127: bugfix: read rtc disables watchdog
    Date
    From: Bruno Thomsen <bruno.thomsen@gmail.com>

    [ Upstream commit 7f43020e3bdb63d65661ed377682702f8b34d3ea ]

    The previous fix listed bulk read of registers as root cause of
    accendential disabling of watchdog, since the watchdog counter
    register (WD_VAL) was zeroed.

    Fixes: 3769a375ab83 rtc: pcf2127: bulk read only date and time registers.

    Tested with the same PCF2127 chip as Sean reveled root cause
    of WD_VAL register value zeroing was caused by reading CTRL2
    register which is one of the watchdog feature control registers.

    So the solution is to not read the first two control registers
    (CTRL1 and CTRL2) in pcf2127_rtc_read_time as they are not
    needed anyway. Size of local buf variable is kept to allow
    easy usage of register defines to improve readability of code.

    Debug trace line was updated after CTRL1 and CTRL2 are no longer
    read from the chip. Also replaced magic numbers in buf access
    with register defines.

    Signed-off-by: Bruno Thomsen <bruno.thomsen@gmail.com>
    Link: https://lore.kernel.org/r/20190822131936.18772-3-bruno.thomsen@gmail.com
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/rtc/rtc-pcf2127.c | 32 ++++++++++++--------------------
    1 file changed, 12 insertions(+), 20 deletions(-)

    diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
    index 9f1b14bf91aed..367e0f803440c 100644
    --- a/drivers/rtc/rtc-pcf2127.c
    +++ b/drivers/rtc/rtc-pcf2127.c
    @@ -52,20 +52,14 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
    struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
    unsigned char buf[10];
    int ret;
    - int i;

    - for (i = 0; i <= PCF2127_REG_CTRL3; i++) {
    - ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL1 + i,
    - (unsigned int *)(buf + i));
    - if (ret) {
    - dev_err(dev, "%s: read error\n", __func__);
    - return ret;
    - }
    - }
    -
    - ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_SC,
    - (buf + PCF2127_REG_SC),
    - ARRAY_SIZE(buf) - PCF2127_REG_SC);
    + /*
    + * Avoid reading CTRL2 register as it causes WD_VAL register
    + * value to reset to 0 which means watchdog is stopped.
    + */
    + ret = regmap_bulk_read(pcf2127->regmap, PCF2127_REG_CTRL3,
    + (buf + PCF2127_REG_CTRL3),
    + ARRAY_SIZE(buf) - PCF2127_REG_CTRL3);
    if (ret) {
    dev_err(dev, "%s: read error\n", __func__);
    return ret;
    @@ -86,14 +80,12 @@ static int pcf2127_rtc_read_time(struct device *dev, struct rtc_time *tm)
    }

    dev_dbg(dev,
    - "%s: raw data is cr1=%02x, cr2=%02x, cr3=%02x, "
    - "sec=%02x, min=%02x, hr=%02x, "
    + "%s: raw data is cr3=%02x, sec=%02x, min=%02x, hr=%02x, "
    "mday=%02x, wday=%02x, mon=%02x, year=%02x\n",
    - __func__,
    - buf[0], buf[1], buf[2],
    - buf[3], buf[4], buf[5],
    - buf[6], buf[7], buf[8], buf[9]);
    -
    + __func__, buf[PCF2127_REG_CTRL3], buf[PCF2127_REG_SC],
    + buf[PCF2127_REG_MN], buf[PCF2127_REG_HR],
    + buf[PCF2127_REG_DM], buf[PCF2127_REG_DW],
    + buf[PCF2127_REG_MO], buf[PCF2127_REG_YR]);

    tm->tm_sec = bcd2bin(buf[PCF2127_REG_SC] & 0x7F);
    tm->tm_min = bcd2bin(buf[PCF2127_REG_MN] & 0x7F);
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 11:05    [W:4.032 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site