*/
        timeout_ms = jiffies + msecs_to_jiffies(timeout_ms) + 1;
        do {
-               ret = nand_read_data_op(chip, &status, sizeof(status), true);
+               ret = nand_read_data_op(chip, &status, sizeof(status), true,
+                                       false);
                if (ret)
                        break;
 
                        u8 status;
 
                        ret = nand_read_data_op(chip, &status, sizeof(status),
-                                               true);
+                                               true, false);
                        if (ret)
                                return;
 
  * @buf: buffer used to store the data
  * @len: length of the buffer
  * @force_8bit: force 8-bit bus access
+ * @check_only: do not actually run the command, only checks if the
+ *              controller driver supports it
  *
  * This function does a raw data read on the bus. Usually used after launching
  * another NAND operation like nand_read_page_op().
  * Returns 0 on success, a negative error code otherwise.
  */
 int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len,
-                     bool force_8bit)
+                     bool force_8bit, bool check_only)
 {
        if (!len || !buf)
                return -EINVAL;
 
                instrs[0].ctx.data.force_8bit = force_8bit;
 
+               if (check_only)
+                       return nand_check_op(chip, &op);
+
                return nand_exec_op(chip, &op);
        }
 
+       if (check_only)
+               return 0;
+
        if (force_8bit) {
                u8 *p = buf;
                unsigned int i;
 
        if (oob_required) {
                ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize,
-                                       false);
+                                       false, false);
                if (ret)
                        return ret;
        }
                return ret;
 
        for (steps = chip->ecc.steps; steps > 0; steps--) {
-               ret = nand_read_data_op(chip, buf, eccsize, false);
+               ret = nand_read_data_op(chip, buf, eccsize, false, false);
                if (ret)
                        return ret;
 
 
                if (chip->ecc.prepad) {
                        ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
-                                               false);
+                                               false, false);
                        if (ret)
                                return ret;
 
                        oob += chip->ecc.prepad;
                }
 
-               ret = nand_read_data_op(chip, oob, eccbytes, false);
+               ret = nand_read_data_op(chip, oob, eccbytes, false, false);
                if (ret)
                        return ret;
 
 
                if (chip->ecc.postpad) {
                        ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
-                                               false);
+                                               false, false);
                        if (ret)
                                return ret;
 
 
        size = mtd->oobsize - (oob - chip->oob_poi);
        if (size) {
-               ret = nand_read_data_op(chip, oob, size, false);
+               ret = nand_read_data_op(chip, oob, size, false, false);
                if (ret)
                        return ret;
        }
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
                chip->ecc.hwctl(chip, NAND_ECC_READ);
 
-               ret = nand_read_data_op(chip, p, eccsize, false);
+               ret = nand_read_data_op(chip, p, eccsize, false, false);
                if (ret)
                        return ret;
 
                chip->ecc.calculate(chip, p, &ecc_calc[i]);
        }
 
-       ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false);
+       ret = nand_read_data_op(chip, chip->oob_poi, mtd->oobsize, false,
+                               false);
        if (ret)
                return ret;
 
 
                chip->ecc.hwctl(chip, NAND_ECC_READ);
 
-               ret = nand_read_data_op(chip, p, eccsize, false);
+               ret = nand_read_data_op(chip, p, eccsize, false, false);
                if (ret)
                        return ret;
 
 
                chip->ecc.hwctl(chip, NAND_ECC_READ);
 
-               ret = nand_read_data_op(chip, p, eccsize, false);
+               ret = nand_read_data_op(chip, p, eccsize, false, false);
                if (ret)
                        return ret;
 
                if (chip->ecc.prepad) {
                        ret = nand_read_data_op(chip, oob, chip->ecc.prepad,
-                                               false);
+                                               false, false);
                        if (ret)
                                return ret;
 
 
                chip->ecc.hwctl(chip, NAND_ECC_READSYN);
 
-               ret = nand_read_data_op(chip, oob, eccbytes, false);
+               ret = nand_read_data_op(chip, oob, eccbytes, false, false);
                if (ret)
                        return ret;
 
 
                if (chip->ecc.postpad) {
                        ret = nand_read_data_op(chip, oob, chip->ecc.postpad,
-                                               false);
+                                               false, false);
                        if (ret)
                                return ret;
 
        /* Calculate remaining oob bytes */
        i = mtd->oobsize - (oob - chip->oob_poi);
        if (i) {
-               ret = nand_read_data_op(chip, oob, i, false);
+               ret = nand_read_data_op(chip, oob, i, false, false);
                if (ret)
                        return ret;
        }
                        sndrnd = 1;
                toread = min_t(int, length, chunk);
 
-               ret = nand_read_data_op(chip, bufpoi, toread, false);
+               ret = nand_read_data_op(chip, bufpoi, toread, false, false);
                if (ret)
                        return ret;
 
                length -= toread;
        }
        if (length > 0) {
-               ret = nand_read_data_op(chip, bufpoi, length, false);
+               ret = nand_read_data_op(chip, bufpoi, length, false, false);
                if (ret)
                        return ret;
        }