{
        int err, i;
 
+       if (!len || len > sd->sensor->i2c_regW)
+               return -EINVAL;
+
        do {
                err = m5602_read_bridge(sd, M5602_XB_I2C_STATUS, i2c_data);
        } while ((*i2c_data & I2C_BUSY) && !err);
+       if (err < 0)
+               goto out;
 
        err = m5602_write_bridge(sd, M5602_XB_I2C_DEV_ADDR,
                                 sd->sensor->i2c_slave_id);
        if (err < 0)
                goto out;
 
-       err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x10 + len);
-       if (err < 0)
-               goto out;
+       if (sd->sensor->i2c_regW == 1) {
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, len);
+               if (err < 0)
+                       goto out;
 
-       err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
-       if (err < 0)
-               goto out;
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x08);
+               if (err < 0)
+                       goto out;
+       } else {
+               err = m5602_write_bridge(sd, M5602_XB_I2C_CTRL, 0x18 + len);
+               if (err < 0)
+                       goto out;
+       }
 
        for (i = 0; (i < len) && !err; i++) {
                err = m5602_read_bridge(sd, M5602_XB_I2C_DATA, &(i2c_data[i]));