fsl_upm: Add MxMR/MDR synchronization
authorJohn Schmoller <jschmoller@xes-inc.com>
Thu, 2 Dec 2010 17:43:10 +0000 (11:43 -0600)
committerKumar Gala <galak@kernel.crashing.org>
Mon, 13 Dec 2010 15:32:15 +0000 (09:32 -0600)
According to Freescale reference manuals (eg section "13.4.4.2
Programming the UPMs" of the P4080 Reference Manual):

"Since the result of any update to the MxMR/MDR register must be in
effect before the dummy read or write to the UPM region, a write to
MxMR/MDR should be followed immediately by a read of MxMR/MDR."

The UPM on a custom P4080-based board did not work without performing
a read of MxMR/MDR after a write.

Signed-off-by: John Schmoller <jschmoller@xes-inc.com>
Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
Acked-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
drivers/mtd/nand/fsl_upm.c

index 7cb99cbc074b7bb3c020b20e32dd86a8d32ae513..c33e2786b2e81d43bbbde2de24f26ed48f049d9e 100644 (file)
@@ -21,6 +21,7 @@
 static void fsl_upm_start_pattern(struct fsl_upm *upm, u32 pat_offset)
 {
        clrsetbits_be32(upm->mxmr, MxMR_MAD_MSK, MxMR_OP_RUNP | pat_offset);
+       (void)in_be32(upm->mxmr);
 }
 
 static void fsl_upm_end_pattern(struct fsl_upm *upm)
@@ -35,6 +36,7 @@ static void fsl_upm_run_pattern(struct fsl_upm *upm, int width,
                                void __iomem *io_addr, u32 mar)
 {
        out_be32(upm->mar, mar);
+       (void)in_be32(upm->mar);
        switch (width) {
        case 8:
                out_8(io_addr, 0x0);