]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rtc: cmos: Fix return value of nvmem callbacks
authorJoy Chakraborty <joychakr@google.com>
Wed, 12 Jun 2024 08:36:35 +0000 (08:36 +0000)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 27 Jun 2024 22:21:06 +0000 (00:21 +0200)
Read/write callbacks registered with nvmem core expect 0 to be returned
on success and a negative value to be returned on failure.

cmos_nvram_read()/cmos_nvram_write() currently return the number of
bytes read or written, fix to return 0 on success and -EIO incase number
of bytes requested was not read or written.

Fixes: 8b5b7958fd1c ("rtc: cmos: use generic nvmem")
Cc: stable@vger.kernel.org
Signed-off-by: Joy Chakraborty <joychakr@google.com>
Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://lore.kernel.org/r/20240612083635.1253039-1-joychakr@google.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-cmos.c

index 7d99cd2c37a0ba87c06beb2c7dcbe0f560d26bb9..35dca2accbb8df737f0a15ba17d6e8a4b6dcd2dd 100644 (file)
@@ -643,11 +643,10 @@ static int cmos_nvram_read(void *priv, unsigned int off, void *val,
                           size_t count)
 {
        unsigned char *buf = val;
-       int     retval;
 
        off += NVRAM_OFFSET;
        spin_lock_irq(&rtc_lock);
-       for (retval = 0; count; count--, off++, retval++) {
+       for (; count; count--, off++) {
                if (off < 128)
                        *buf++ = CMOS_READ(off);
                else if (can_bank2)
@@ -657,7 +656,7 @@ static int cmos_nvram_read(void *priv, unsigned int off, void *val,
        }
        spin_unlock_irq(&rtc_lock);
 
-       return retval;
+       return count ? -EIO : 0;
 }
 
 static int cmos_nvram_write(void *priv, unsigned int off, void *val,
@@ -665,7 +664,6 @@ static int cmos_nvram_write(void *priv, unsigned int off, void *val,
 {
        struct cmos_rtc *cmos = priv;
        unsigned char   *buf = val;
-       int             retval;
 
        /* NOTE:  on at least PCs and Ataris, the boot firmware uses a
         * checksum on part of the NVRAM data.  That's currently ignored
@@ -674,7 +672,7 @@ static int cmos_nvram_write(void *priv, unsigned int off, void *val,
         */
        off += NVRAM_OFFSET;
        spin_lock_irq(&rtc_lock);
-       for (retval = 0; count; count--, off++, retval++) {
+       for (; count; count--, off++) {
                /* don't trash RTC registers */
                if (off == cmos->day_alrm
                                || off == cmos->mon_alrm
@@ -689,7 +687,7 @@ static int cmos_nvram_write(void *priv, unsigned int off, void *val,
        }
        spin_unlock_irq(&rtc_lock);
 
-       return retval;
+       return count ? -EIO : 0;
 }
 
 /*----------------------------------------------------------------*/