aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorPaul Parsons <lost.distance@yahoo.com>2012-03-07 09:12:08 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-03-26 19:52:28 -0400
commit876fe76d793d03077eb61ba3afab4a383f46c554 (patch)
treefb7d98bd746ebd1c3c5919f10a998e8f2dbd9e8b /arch
parente7d9377e0440c25805dcc5b0af189a87beb69f5e (diff)
mtd: maps: physmap: Add reference counter to set_vpp()
This patch is part of a set which fixes unnecessary flash erase and write errors resulting from the MTD CFI driver turning off vpp while an erase is in progress. This patch allows physmap_set_vpp() calls to be nested by adding a reference counter. omap1_set_vpp() already used a reference counter. Since it is called from physmap_set_vpp(), omap1_set_vpp() can now be simplified. simtec_nor_vpp() already disabled hard interrupts. Since it is called from physmap_set_vpp(), simtec_nor_vpp() can now be simplified. Signed-off-by: Paul Parsons <lost.distance@yahoo.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-omap1/flash.c20
-rw-r--r--arch/arm/mach-s3c2410/nor-simtec.c3
2 files changed, 6 insertions, 17 deletions
diff --git a/arch/arm/mach-omap1/flash.c b/arch/arm/mach-omap1/flash.c
index 1749cb37dda..4665bfcd2ce 100644
--- a/arch/arm/mach-omap1/flash.c
+++ b/arch/arm/mach-omap1/flash.c
@@ -15,20 +15,12 @@
15 15
16void omap1_set_vpp(struct platform_device *pdev, int enable) 16void omap1_set_vpp(struct platform_device *pdev, int enable)
17{ 17{
18 static int count;
19 u32 l; 18 u32 l;
20 19
21 if (enable) { 20 l = omap_readl(EMIFS_CONFIG);
22 if (count++ == 0) { 21 if (enable)
23 l = omap_readl(EMIFS_CONFIG); 22 l |= OMAP_EMIFS_CONFIG_WP;
24 l |= OMAP_EMIFS_CONFIG_WP; 23 else
25 omap_writel(l, EMIFS_CONFIG); 24 l &= ~OMAP_EMIFS_CONFIG_WP;
26 } 25 omap_writel(l, EMIFS_CONFIG);
27 } else {
28 if (count && (--count == 0)) {
29 l = omap_readl(EMIFS_CONFIG);
30 l &= ~OMAP_EMIFS_CONFIG_WP;
31 omap_writel(l, EMIFS_CONFIG);
32 }
33 }
34} 26}
diff --git a/arch/arm/mach-s3c2410/nor-simtec.c b/arch/arm/mach-s3c2410/nor-simtec.c
index ad9f750f1e5..605aaccd097 100644
--- a/arch/arm/mach-s3c2410/nor-simtec.c
+++ b/arch/arm/mach-s3c2410/nor-simtec.c
@@ -35,9 +35,7 @@
35static void simtec_nor_vpp(struct platform_device *pdev, int vpp) 35static void simtec_nor_vpp(struct platform_device *pdev, int vpp)
36{ 36{
37 unsigned int val; 37 unsigned int val;
38 unsigned long flags;
39 38
40 local_irq_save(flags);
41 val = __raw_readb(BAST_VA_CTRL3); 39 val = __raw_readb(BAST_VA_CTRL3);
42 40
43 printk(KERN_DEBUG "%s(%d)\n", __func__, vpp); 41 printk(KERN_DEBUG "%s(%d)\n", __func__, vpp);
@@ -48,7 +46,6 @@ static void simtec_nor_vpp(struct platform_device *pdev, int vpp)
48 val &= ~BAST_CPLD_CTRL3_ROMWEN; 46 val &= ~BAST_CPLD_CTRL3_ROMWEN;
49 47
50 __raw_writeb(val, BAST_VA_CTRL3); 48 __raw_writeb(val, BAST_VA_CTRL3);
51 local_irq_restore(flags);
52} 49}
53 50
54static struct physmap_flash_data simtec_nor_pdata = { 51static struct physmap_flash_data simtec_nor_pdata = {