misc: Update read() and write() methods to return bytes xfered
authorSimon Glass <sjg@chromium.org>
Tue, 6 Nov 2018 22:21:39 +0000 (15:21 -0700)
committerSimon Glass <sjg@chromium.org>
Wed, 21 Nov 2018 02:14:22 +0000 (19:14 -0700)
At present these functions return 0 on success. For some devices we want
to know how many bytes were transferred. It seems useful to adjust the API
to be more like the POSIX read() and write() functions.

Update these two methods, a test and all users.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Patrick Delaunay <patrick.delaunay@st.com>
arch/arm/mach-stm32mp/cpu.c
drivers/clk/clk_vexpress_osc.c
drivers/misc/altera_sysid.c
drivers/misc/misc_sandbox.c
drivers/misc/rockchip-efuse.c
drivers/misc/stm32mp_fuse.c
include/misc.h
test/dm/misc.c

index 0e01f8e613852f446f56d55bb44a4986a6a56f90..b8933587adb37eb951abd97fcd68db3142892b96 100644 (file)
@@ -306,7 +306,7 @@ static int setup_mac_address(void)
 
        ret = misc_read(dev, BSEC_OTP_MAC * 4 + STM32_BSEC_OTP_OFFSET,
                        otp, sizeof(otp));
-       if (ret)
+       if (ret < 0)
                return ret;
 
        for (i = 0; i < 6; i++)
@@ -344,7 +344,7 @@ static int setup_serial_number(void)
 
        ret = misc_read(dev, BSEC_OTP_SERIAL * 4 + STM32_BSEC_OTP_OFFSET,
                        otp, sizeof(otp));
-       if (ret)
+       if (ret < 0)
                return ret;
 
        sprintf(serial_string, "%08x%08x%08x", otp[0], otp[1], otp[2]);
index 7fef4b2e3126ba0882e6cbbc8f76e65e2eca3a48..c692a6d0b89992698e5ccc98cadfa14913753111 100644 (file)
@@ -29,7 +29,7 @@ static ulong vexpress_osc_clk_get_rate(struct clk *clk)
 
        data = CLK_FUNCTION | priv->osc;
        err = misc_read(vexpress_cfg, 0, &data, sizeof(data));
-       if (err)
+       if (err < 0)
                return err;
 
        return data;
@@ -53,7 +53,7 @@ static ulong vexpress_osc_clk_set_rate(struct clk *clk, ulong rate)
        buffer[0] = CLK_FUNCTION | priv->osc;
        buffer[1] = rate;
        err = misc_write(vexpress_cfg, 0, buffer, 2 * sizeof(u32));
-       if (err)
+       if (err < 0)
                return err;
 
        return rate;
index 883b2a35e0793221ef628512ff99652f5e05fa9b..eff33f7343d17c735812fda6355fe5e89ec211e6 100644 (file)
@@ -35,7 +35,7 @@ void display_sysid(void)
        if (ret)
                return;
        ret = misc_read(dev, 0, &sysid, sizeof(sysid));
-       if (ret)
+       if (ret < 0)
                return;
 
        stamp = sysid[1];
index e4164f76fba5ffb3cf02cda99e9967bd300b602b..f7c5b2e25fa03510f73425c5f675c9c4c8cdb1c2 100644 (file)
@@ -20,7 +20,7 @@ int misc_sandbox_read(struct udevice *dev, int offset, void *buf, int size)
 
        memcpy(buf, priv->mem + offset, size);
 
-       return 0;
+       return size;
 }
 
 int misc_sandbox_write(struct udevice *dev, int offset, const void *buf,
@@ -30,7 +30,7 @@ int misc_sandbox_write(struct udevice *dev, int offset, const void *buf,
 
        memcpy(priv->mem + offset, buf, size);
 
-       return 0;
+       return size;
 }
 
 int misc_sandbox_ioctl(struct udevice *dev, unsigned long request, void *buf)
index 8a213c9e270c8070203a53863f1353794565e35a..2520c6a38edb3581a1490fdb8096e7dc56f16bcc 100644 (file)
@@ -65,7 +65,7 @@ static int dump_efuses(cmd_tbl_t *cmdtp, int flag,
        }
 
        ret = misc_read(dev, 0, &fuses, sizeof(fuses));
-       if (ret) {
+       if (ret < 0) {
                printf("%s: misc_read failed\n", __func__);
                return 0;
        }
index 2d661351a17cc70dbf764130d609d5978551cacd..33943a231b1008e935f741e7de9e35cd88d03f4f 100644 (file)
@@ -29,6 +29,9 @@ int fuse_read(u32 bank, u32 word, u32 *val)
                        return ret;
                ret = misc_read(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
                                val, 4);
+               if (ret < 0)
+                       return ret;
+               ret = 0;
                break;
 
        default:
@@ -54,6 +57,9 @@ int fuse_prog(u32 bank, u32 word, u32 val)
                        return ret;
                ret = misc_write(dev, word * 4 + STM32_BSEC_OTP_OFFSET,
                                 &val, 4);
+               if (ret < 0)
+                       return ret;
+               ret = 0;
                break;
 
        default:
@@ -78,6 +84,9 @@ int fuse_sense(u32 bank, u32 word, u32 *val)
                if (ret)
                        return ret;
                ret = misc_read(dev, word * 4 + STM32_BSEC_OTP_OFFSET, val, 4);
+               if (ret < 0)
+                       return ret;
+               ret = 0;
                break;
 
        default:
@@ -103,6 +112,9 @@ int fuse_override(u32 bank, u32 word, u32 val)
                        return ret;
                ret = misc_write(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
                                 &val, 4);
+               if (ret < 0)
+                       return ret;
+               ret = 0;
                break;
 
        default:
index 50515852b25e9d83829f317c52ebd46a2d410968..12d1325ee26e4f5ca65f51d2c2012a478e61496c 100644 (file)
@@ -13,7 +13,7 @@
  * @buf: pointer to data buffer
  * @size: data size in bytes to read the device
  *
- * Return: 0 if OK, -ve on error
+ * Return: number of bytes read if OK (may be 0 if EOF), -ve on error
  */
 int misc_read(struct udevice *dev, int offset, void *buf, int size);
 
@@ -24,7 +24,7 @@ int misc_read(struct udevice *dev, int offset, void *buf, int size);
  * @buf: pointer to data buffer
  * @size: data size in bytes to write the device
  *
- * Return: 0 if OK, -ve on error
+ * Return: number of bytes written if OK (may be < @size), -ve on error
  */
 int misc_write(struct udevice *dev, int offset, void *buf, int size);
 
@@ -90,7 +90,7 @@ struct misc_ops {
         * @buf: pointer to data buffer
         * @size: data size in bytes to read the device
         *
-        * Return: 0 if OK, -ve on error
+        * Return: number of bytes read if OK (may be 0 if EOF), -ve on error
         */
        int (*read)(struct udevice *dev, int offset, void *buf, int size);
 
@@ -101,7 +101,7 @@ struct misc_ops {
         * @buf: pointer to data buffer
         * @size: data size in bytes to write the device
         *
-        * Return: 0 if OK, -ve on error
+        * Return: number of bytes written if OK (may be < @size), -ve on error
         */
        int (*write)(struct udevice *dev, int offset, const void *buf,
                     int size);
index 61279665ef25d84cc962f92db94f25f00c1bf4ec..4d4232adf1e7ceed98bb57a202c120819b73e678 100644 (file)
@@ -21,9 +21,9 @@ static int dm_test_misc(struct unit_test_state *uts)
        ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "misc-test", &dev));
 
        /* Read / write tests */
-       ut_assertok(misc_write(dev, 0, "TEST", 4));
-       ut_assertok(misc_write(dev, 4, "WRITE", 5));
-       ut_assertok(misc_read(dev, 0, buf, 9));
+       ut_asserteq(4, misc_write(dev, 0, "TEST", 4));
+       ut_asserteq(5, misc_write(dev, 4, "WRITE", 5));
+       ut_asserteq(9, misc_read(dev, 0, buf, 9));
 
        ut_assertok(memcmp(buf, "TESTWRITE", 9));