Merge branch 'for-3.8' of git://linux-nfs.org/~bfields/linux
[deliverable/linux.git] / drivers / mtd / maps / sa1100-flash.c
index cbc3b7867910ac421488c9531fbd3799875ea41b..f694417cf7e694bc3e7f04edef6484ef03449e13 100644 (file)
@@ -36,10 +36,22 @@ struct sa_info {
        struct sa_subdev_info   subdev[0];
 };
 
+static DEFINE_SPINLOCK(sa1100_vpp_lock);
+static int sa1100_vpp_refcnt;
 static void sa1100_set_vpp(struct map_info *map, int on)
 {
        struct sa_subdev_info *subdev = container_of(map, struct sa_subdev_info, map);
-       subdev->plat->set_vpp(on);
+       unsigned long flags;
+
+       spin_lock_irqsave(&sa1100_vpp_lock, flags);
+       if (on) {
+               if (++sa1100_vpp_refcnt == 1)   /* first nested 'on' */
+                       subdev->plat->set_vpp(1);
+       } else {
+               if (--sa1100_vpp_refcnt == 0)   /* last nested 'off' */
+                       subdev->plat->set_vpp(0);
+       }
+       spin_unlock_irqrestore(&sa1100_vpp_lock, flags);
 }
 
 static void sa1100_destroy_subdev(struct sa_subdev_info *subdev)
@@ -137,8 +149,8 @@ static void sa1100_destroy(struct sa_info *info, struct flash_platform_data *pla
                plat->exit();
 }
 
-static struct sa_info *__devinit
-sa1100_setup_mtd(struct platform_device *pdev, struct flash_platform_data *plat)
+static struct sa_info *sa1100_setup_mtd(struct platform_device *pdev,
+                                       struct flash_platform_data *plat)
 {
        struct sa_info *info;
        int nr, size, i, ret = 0;
@@ -234,7 +246,7 @@ sa1100_setup_mtd(struct platform_device *pdev, struct flash_platform_data *plat)
 
 static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };
 
-static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
+static int sa1100_mtd_probe(struct platform_device *pdev)
 {
        struct flash_platform_data *plat = pdev->dev.platform_data;
        struct sa_info *info;
@@ -252,8 +264,8 @@ static int __devinit sa1100_mtd_probe(struct platform_device *pdev)
        /*
         * Partition selection stuff.
         */
-       mtd_device_parse_register(info->mtd, part_probes, 0,
-                       plat->parts, plat->nr_parts);
+       mtd_device_parse_register(info->mtd, part_probes, NULL, plat->parts,
+                                 plat->nr_parts);
 
        platform_set_drvdata(pdev, info);
        err = 0;
This page took 0.024247 seconds and 5 git commands to generate.