mtd: rawnand: Take check_only into account
->exec_op() is passed a check_only argument that encodes when the controller should just check whether the operation is supported or not without executing it. Some controllers simply ignore this arguments, others don't but keep modifying some of the registers before returning. Let's fix all those drivers. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20200418194217.1016060-1-boris.brezillon@collabora.com
This commit is contained in:
parent
4ba246d7a3
commit
ce446b4b2d
|
@ -2223,10 +2223,12 @@ static int cadence_nand_exec_op(struct nand_chip *chip,
|
|||
const struct nand_operation *op,
|
||||
bool check_only)
|
||||
{
|
||||
if (!check_only) {
|
||||
int status = cadence_nand_select_target(chip);
|
||||
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
return nand_op_parser_exec_op(chip, &cadence_nand_op_parser, op,
|
||||
check_only);
|
||||
|
|
|
@ -608,6 +608,9 @@ static int fsmc_exec_op(struct nand_chip *chip, const struct nand_operation *op,
|
|||
unsigned int op_id;
|
||||
int i;
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
pr_debug("Executing operation [%d instructions]:\n", op->ninstrs);
|
||||
|
||||
for (op_id = 0; op_id < op->ninstrs; op_id++) {
|
||||
|
|
|
@ -2408,6 +2408,9 @@ static int gpmi_nfc_exec_op(struct nand_chip *chip,
|
|||
struct completion *completion;
|
||||
unsigned long to;
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
this->ntransfers = 0;
|
||||
for (i = 0; i < GPMI_MAX_TRANSFERS; i++)
|
||||
this->transfers[i].direction = DMA_NONE;
|
||||
|
|
|
@ -2107,6 +2107,7 @@ static int marvell_nfc_exec_op(struct nand_chip *chip,
|
|||
{
|
||||
struct marvell_nfc *nfc = to_marvell_nfc(chip->controller);
|
||||
|
||||
if (!check_only)
|
||||
marvell_nfc_select_target(chip, op->cs);
|
||||
|
||||
if (nfc->caps->is_nfcv2)
|
||||
|
|
|
@ -899,6 +899,9 @@ static int meson_nfc_exec_op(struct nand_chip *nand,
|
|||
u32 op_id, delay_idle, cmd;
|
||||
int i;
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
meson_nfc_select_chip(nand, op->cs);
|
||||
for (op_id = 0; op_id < op->ninstrs; op_id++) {
|
||||
instr = &op->instrs[op_id];
|
||||
|
|
|
@ -393,6 +393,9 @@ static int mxic_nfc_exec_op(struct nand_chip *chip,
|
|||
int ret = 0;
|
||||
unsigned int op_id;
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
mxic_nfc_cs_enable(nfc);
|
||||
init_completion(&nfc->complete);
|
||||
for (op_id = 0; op_id < op->ninstrs; op_id++) {
|
||||
|
|
|
@ -2144,6 +2144,9 @@ static int ns_exec_op(struct nand_chip *chip, const struct nand_operation *op,
|
|||
const struct nand_op_instr *instr = NULL;
|
||||
struct nandsim *ns = nand_get_controller_data(chip);
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
ns->lines.ce = 1;
|
||||
|
||||
for (op_id = 0; op_id < op->ninstrs; op_id++) {
|
||||
|
|
|
@ -1365,13 +1365,13 @@ static int stm32_fmc2_exec_op(struct nand_chip *chip,
|
|||
unsigned int op_id, i;
|
||||
int ret;
|
||||
|
||||
if (check_only)
|
||||
return 0;
|
||||
|
||||
ret = stm32_fmc2_select_chip(chip, op->cs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (check_only)
|
||||
return ret;
|
||||
|
||||
for (op_id = 0; op_id < op->ninstrs; op_id++) {
|
||||
instr = &op->instrs[op_id];
|
||||
|
||||
|
|
|
@ -1907,6 +1907,7 @@ static int sunxi_nfc_exec_op(struct nand_chip *nand,
|
|||
struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
|
||||
const struct nand_op_parser *parser;
|
||||
|
||||
if (!check_only)
|
||||
sunxi_nfc_select_chip(nand, op->cs);
|
||||
|
||||
if (sunxi_nand->sels[op->cs].rb >= 0)
|
||||
|
|
|
@ -467,7 +467,9 @@ static int tegra_nand_exec_op(struct nand_chip *chip,
|
|||
const struct nand_operation *op,
|
||||
bool check_only)
|
||||
{
|
||||
if (!check_only)
|
||||
tegra_nand_select_target(chip, op->cs);
|
||||
|
||||
return nand_op_parser_exec_op(chip, &tegra_nand_op_parser, op,
|
||||
check_only);
|
||||
}
|
||||
|
|
|
@ -502,7 +502,9 @@ static int vf610_nfc_exec_op(struct nand_chip *chip,
|
|||
const struct nand_operation *op,
|
||||
bool check_only)
|
||||
{
|
||||
if (!check_only)
|
||||
vf610_nfc_select_target(chip, op->cs);
|
||||
|
||||
return nand_op_parser_exec_op(chip, &vf610_nfc_op_parser, op,
|
||||
check_only);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue