Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 816a6d14 authored by Tokunori Ikegami's avatar Tokunori Ikegami Committed by Vignesh Raghavendra
Browse files

mtd: cfi_cmdset_0002: Split write-to-buffer-reset sequence



Just refactor to split the sequence from do_write_buffer().

Cc: Fabio Bettoni <fbettoni@gmail.com>
Co: Hauke Mehrtens <hauke@hauke-m.de>
Cc: Chris Packham <chris.packham@alliedtelesis.co.nz>
Cc: Joakim Tjernlund <Joakim.Tjernlund@infinera.com>
Cc: linux-mtd@lists.infradead.org
Signed-off-by: default avatarTokunori Ikegami <ikegami.t@gmail.com>
Signed-off-by: default avatarVignesh Raghavendra <vigneshr@ti.com>
parent 228c05c2
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -1919,6 +1919,27 @@ static int cfi_amdstd_write_words(struct mtd_info *mtd, loff_t to, size_t len,
	return 0;
}

static void __xipram do_write_buffer_reset(struct map_info *map,
					   struct flchip *chip,
					   struct cfi_private *cfi)
{
	/*
	 * Recovery from write-buffer programming failures requires
	 * the write-to-buffer-reset sequence.  Since the last part
	 * of the sequence also works as a normal reset, we can run
	 * the same commands regardless of why we are here.
	 * See e.g.
	 * http://www.spansion.com/Support/Application%20Notes/MirrorBit_Write_Buffer_Prog_Page_Buffer_Read_AN.pdf
	 */
	cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
			 cfi->device_type, NULL);
	cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
			 cfi->device_type, NULL);
	cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi,
			 cfi->device_type, NULL);

	/* FIXME - should have reset delay before continuing */
}

/*
 * FIXME: interleaved mode not tested, and probably not supported!
@@ -2026,23 +2047,8 @@ static int __xipram do_write_buffer(struct map_info *map, struct flchip *chip,
	}

	if (ret) {
		/*
		 * Recovery from write-buffer programming failures requires
		 * the write-to-buffer-reset sequence.  Since the last part
		 * of the sequence also works as a normal reset, we can run
		 * the same commands regardless of why we are here.
		 * See e.g.
		 * http://www.spansion.com/Support/Application%20Notes/MirrorBit_Write_Buffer_Prog_Page_Buffer_Read_AN.pdf
		 */
		cfi_check_err_status(map, chip, adr);
		cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
				 cfi->device_type, NULL);
		cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
				 cfi->device_type, NULL);
		cfi_send_gen_cmd(0xF0, cfi->addr_unlock1, chip->start, map, cfi,
				 cfi->device_type, NULL);
		/* FIXME - should have reset delay before continuing */

		do_write_buffer_reset(map, chip, cfi);
		pr_err("MTD %s(): software timeout, address:0x%.8lx.\n",
		       __func__, adr);
	}