rk fb: extend output mutex lock in win config
[firefly-linux-kernel-4.4.55.git] / drivers / mtd / mtdblock.c
index 3326615ad66b957c57234bf3eb83699a393ff62e..2aef5dda522be57cbd6652963d4078966f7bc64e 100644 (file)
@@ -44,7 +44,7 @@ struct mtdblk_dev {
        enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state;
 };
 
-static struct mutex mtdblks_lock;
+static DEFINE_MUTEX(mtdblks_lock);
 
 /*
  * Cache stuff...
@@ -85,7 +85,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos,
        set_current_state(TASK_INTERRUPTIBLE);
        add_wait_queue(&wait_q, &wait);
 
-       ret = mtd->erase(mtd, &erase);
+       ret = mtd_erase(mtd, &erase);
        if (ret) {
                set_current_state(TASK_RUNNING);
                remove_wait_queue(&wait_q, &wait);
@@ -102,7 +102,7 @@ static int erase_write (struct mtd_info *mtd, unsigned long pos,
         * Next, write the data to flash.
         */
 
-       ret = mtd->write(mtd, pos, len, &retlen, buf);
+       ret = mtd_write(mtd, pos, len, &retlen, buf);
        if (ret)
                return ret;
        if (retlen != len)
@@ -119,7 +119,7 @@ static int write_cached_data (struct mtdblk_dev *mtdblk)
        if (mtdblk->cache_state != STATE_DIRTY)
                return 0;
 
-       DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: writing cached data for \"%s\" "
+       pr_debug("mtdblock: writing cached data for \"%s\" "
                        "at 0x%lx, size 0x%x\n", mtd->name,
                        mtdblk->cache_offset, mtdblk->cache_size);
 
@@ -148,11 +148,11 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos,
        size_t retlen;
        int ret;
 
-       DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: write on \"%s\" at 0x%lx, size 0x%x\n",
+       pr_debug("mtdblock: write on \"%s\" at 0x%lx, size 0x%x\n",
                mtd->name, pos, len);
 
        if (!sect_size)
-               return mtd->write(mtd, pos, len, &retlen, buf);
+               return mtd_write(mtd, pos, len, &retlen, buf);
 
        while (len > 0) {
                unsigned long sect_start = (pos/sect_size)*sect_size;
@@ -184,8 +184,8 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos,
                            mtdblk->cache_offset != sect_start) {
                                /* fill the cache with the current sector */
                                mtdblk->cache_state = STATE_EMPTY;
-                               ret = mtd->read(mtd, sect_start, sect_size,
-                                               &retlen, mtdblk->cache_data);
+                               ret = mtd_read(mtd, sect_start, sect_size,
+                                              &retlen, mtdblk->cache_data);
                                if (ret)
                                        return ret;
                                if (retlen != sect_size)
@@ -218,11 +218,11 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
        size_t retlen;
        int ret;
 
-       DEBUG(MTD_DEBUG_LEVEL2, "mtdblock: read on \"%s\" at 0x%lx, size 0x%x\n",
+       pr_debug("mtdblock: read on \"%s\" at 0x%lx, size 0x%x\n",
                        mtd->name, pos, len);
 
        if (!sect_size)
-               return mtd->read(mtd, pos, len, &retlen, buf);
+               return mtd_read(mtd, pos, len, &retlen, buf);
 
        while (len > 0) {
                unsigned long sect_start = (pos/sect_size)*sect_size;
@@ -241,7 +241,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
                    mtdblk->cache_offset == sect_start) {
                        memcpy (buf, mtdblk->cache_data + offset, size);
                } else {
-                       ret = mtd->read(mtd, pos, size, &retlen, buf);
+                       ret = mtd_read(mtd, pos, size, &retlen, buf);
                        if (ret)
                                return ret;
                        if (retlen != size)
@@ -283,7 +283,7 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 {
        struct mtdblk_dev *mtdblk = container_of(mbd, struct mtdblk_dev, mbd);
 
-       DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
+       pr_debug("mtdblock_open\n");
 
        mutex_lock(&mtdblks_lock);
        if (mtdblk->count) {
@@ -303,16 +303,16 @@ static int mtdblock_open(struct mtd_blktrans_dev *mbd)
 
        mutex_unlock(&mtdblks_lock);
 
-       DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
+       pr_debug("ok\n");
 
        return 0;
 }
 
-static int mtdblock_release(struct mtd_blktrans_dev *mbd)
+static void mtdblock_release(struct mtd_blktrans_dev *mbd)
 {
        struct mtdblk_dev *mtdblk = container_of(mbd, struct mtdblk_dev, mbd);
 
-       DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n");
+       pr_debug("mtdblock_release\n");
 
        mutex_lock(&mtdblks_lock);
 
@@ -321,17 +321,18 @@ static int mtdblock_release(struct mtd_blktrans_dev *mbd)
        mutex_unlock(&mtdblk->cache_mutex);
 
        if (!--mtdblk->count) {
-               /* It was the last usage. Free the cache */
-               if (mbd->mtd->sync)
-                       mbd->mtd->sync(mbd->mtd);
+               /*
+                * It was the last usage. Free the cache, but only sync if
+                * opened for writing.
+                */
+               if (mbd->file_mode & FMODE_WRITE)
+                       mtd_sync(mbd->mtd);
                vfree(mtdblk->cache_data);
        }
 
        mutex_unlock(&mtdblks_lock);
 
-       DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
-
-       return 0;
+       pr_debug("ok\n");
 }
 
 static int mtdblock_flush(struct mtd_blktrans_dev *dev)
@@ -341,9 +342,7 @@ static int mtdblock_flush(struct mtd_blktrans_dev *dev)
        mutex_lock(&mtdblk->cache_mutex);
        write_cached_data(mtdblk);
        mutex_unlock(&mtdblk->cache_mutex);
-
-       if (dev->mtd->sync)
-               dev->mtd->sync(dev->mtd);
+       mtd_sync(dev->mtd);
        return 0;
 }
 
@@ -389,8 +388,6 @@ static struct mtd_blktrans_ops mtdblock_tr = {
 
 static int __init init_mtdblock(void)
 {
-       mutex_init(&mtdblks_lock);
-
        return register_mtd_blktrans(&mtdblock_tr);
 }