if (WARN_ON(cs > chip->numchips))
                return;
 
+       chip->cur_cs = cs;
        chip->select_chip(chip, cs);
 }
 EXPORT_SYMBOL_GPL(nand_select_target);
 void nand_deselect_target(struct nand_chip *chip)
 {
        chip->select_chip(chip, -1);
+       chip->cur_cs = -1;
 }
 EXPORT_SYMBOL_GPL(nand_deselect_target);
 
                                 PSEC_TO_NSEC(sdr->tRR_min)),
                NAND_OP_DATA_IN(len, buf, 0),
        };
-       struct nand_operation op = NAND_OPERATION(instrs);
+       struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
        int ret;
 
        /* Drop the DATA_IN instruction if len is set to 0. */
                                 PSEC_TO_NSEC(sdr->tRR_min)),
                NAND_OP_DATA_IN(len, buf, 0),
        };
-       struct nand_operation op = NAND_OPERATION(instrs);
+       struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
        int ret;
 
        /* Drop the DATA_IN instruction if len is set to 0. */
                                         PSEC_TO_NSEC(sdr->tRR_min)),
                        NAND_OP_8BIT_DATA_IN(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                /* Drop the DATA_IN instruction if len is set to 0. */
                if (!len)
                                    PSEC_TO_NSEC(sdr->tCCS_min)),
                        NAND_OP_DATA_IN(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
                int ret;
 
                ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
                NAND_OP_CMD(NAND_CMD_PAGEPROG, PSEC_TO_NSEC(sdr->tWB_max)),
                NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tPROG_max), 0),
        };
-       struct nand_operation op = NAND_OPERATION(instrs);
+       struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
        int naddrs = nand_fill_column_cycles(chip, addrs, offset_in_page);
        int ret;
        u8 status;
                                    PSEC_TO_NSEC(sdr->tWB_max)),
                        NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tPROG_max), 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                ret = nand_exec_op(chip, &op);
                if (ret)
                        NAND_OP_ADDR(2, addrs, PSEC_TO_NSEC(sdr->tCCS_min)),
                        NAND_OP_DATA_OUT(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
                int ret;
 
                ret = nand_fill_column_cycles(chip, addrs, offset_in_page);
                        NAND_OP_ADDR(1, &addr, PSEC_TO_NSEC(sdr->tADL_min)),
                        NAND_OP_8BIT_DATA_IN(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                /* Drop the DATA_IN instruction if len is set to 0. */
                if (!len)
                                    PSEC_TO_NSEC(sdr->tADL_min)),
                        NAND_OP_8BIT_DATA_IN(1, status, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                if (!status)
                        op.ninstrs--;
                struct nand_op_instr instrs[] = {
                        NAND_OP_CMD(NAND_CMD_READ0, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                return nand_exec_op(chip, &op);
        }
                                    PSEC_TO_MSEC(sdr->tWB_max)),
                        NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tBERS_max), 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                if (chip->options & NAND_ROW_ADDR_3)
                        instrs[1].ctx.addr.naddrs++;
                                              PSEC_TO_NSEC(sdr->tWB_max)),
                        NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tFEAT_max), 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                return nand_exec_op(chip, &op);
        }
                        NAND_OP_8BIT_DATA_IN(ONFI_SUBFEATURE_PARAM_LEN,
                                             data, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                return nand_exec_op(chip, &op);
        }
                        NAND_OP_WAIT_RDY(PSEC_TO_MSEC(timeout_ms),
                                         PSEC_TO_NSEC(delay_ns)),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                return nand_exec_op(chip, &op);
        }
                        NAND_OP_CMD(NAND_CMD_RESET, PSEC_TO_NSEC(sdr->tWB_max)),
                        NAND_OP_WAIT_RDY(PSEC_TO_MSEC(sdr->tRST_max), 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                return nand_exec_op(chip, &op);
        }
                struct nand_op_instr instrs[] = {
                        NAND_OP_DATA_IN(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                instrs[0].ctx.data.force_8bit = force_8bit;
 
                struct nand_op_instr instrs[] = {
                        NAND_OP_DATA_OUT(len, buf, 0),
                };
-               struct nand_operation op = NAND_OPERATION(instrs);
+               struct nand_operation op = NAND_OPERATION(chip->cur_cs, instrs);
 
                instrs[0].ctx.data.force_8bit = force_8bit;
 
        unsigned int i;
        int ret;
 
+       /* Assume all dies are deselected when we enter nand_scan_ident(). */
+       chip->cur_cs = -1;
+
        /* Enforce the right timings for reset/detection */
        onfi_fill_data_interface(chip, NAND_SDR_IFACE, 0);