mtd: return error code from mtd_unpoint
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Fri, 3 Feb 2012 11:20:43 +0000 (13:20 +0200)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 26 Mar 2012 23:27:19 +0000 (00:27 +0100)
The 'mtd_unpoint()' API function should be able to return an error code because
it may fail if you specify incorrect offset. This patch changes this MTD API
function and amends all the drivers correspondingly.

Also return '-EOPNOTSUPP' from 'mtd_unpoint()' when the '->unpoint()' method is
undefined. We do not really need this currently, but this just makes
sense to be consistent with 'mtd_point()'.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/devices/mtdram.c
drivers/mtd/devices/phram.c
drivers/mtd/devices/pmc551.c
drivers/mtd/devices/slram.c
drivers/mtd/lpddr/lpddr_cmds.c
drivers/mtd/mtdpart.c
include/linux/mtd/mtd.h
include/linux/mtd/pmc551.h

index 152accf4bf858aae662c6ed5ba538593ee869b13..4d04551cffd70fe5d1d81285bde77838590ae492 100644 (file)
@@ -87,7 +87,7 @@ static int cfi_intelext_partition_fixup(struct mtd_info *, struct cfi_private **
 
 static int cfi_intelext_point (struct mtd_info *mtd, loff_t from, size_t len,
                     size_t *retlen, void **virt, resource_size_t *phys);
-static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
+static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
 
 static int chip_ready (struct map_info *map, struct flchip *chip, unsigned long adr, int mode);
 static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr, int mode);
@@ -1369,12 +1369,12 @@ static int cfi_intelext_point(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;
 }
 
-static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
        struct map_info *map = mtd->priv;
        struct cfi_private *cfi = map->fldrv_priv;
        unsigned long ofs;
-       int chipnum;
+       int chipnum, err = 0;
 
        /* Now unlock the chip(s) POINT state */
 
@@ -1382,7 +1382,7 @@ static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
        chipnum = (from >> cfi->chipshift);
        ofs = from - (chipnum <<  cfi->chipshift);
 
-       while (len) {
+       while (len && !err) {
                unsigned long thislen;
                struct flchip *chip;
 
@@ -1400,8 +1400,10 @@ static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
                        chip->ref_point_counter--;
                        if(chip->ref_point_counter == 0)
                                chip->state = FL_READY;
-               } else
-                       printk(KERN_ERR "%s: Warning: unpoint called on non pointed region\n", map->name); /* Should this give an error? */
+               } else {
+                       printk(KERN_ERR "%s: Error: unpoint called on non pointed region\n", map->name);
+                       err = -EINVAL;
+               }
 
                put_chip(map, chip, chip->start);
                mutex_unlock(&chip->mutex);
@@ -1410,6 +1412,8 @@ static void cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
                ofs = 0;
                chipnum++;
        }
+
+       return err;
 }
 
 static inline int do_read_onechip(struct map_info *map, struct flchip *chip, loff_t adr, size_t len, u_char *buf)
index 91030cfb03b3d05d901905d8279b396a7bf3a51b..e1f017bf0777d83eb393c6e6bd83004c02be7277 100644 (file)
@@ -60,8 +60,9 @@ static int ram_point(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;
 }
 
-static void ram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int ram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
+       return 0;
 }
 
 /*
index eff2b69864f5153484b52729478c44cc7386f7f8..38035551a7d2cdba02702b0b177fdd7b0bcefbe5 100644 (file)
@@ -70,8 +70,9 @@ static int phram_point(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;
 }
 
-static void phram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int phram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
+       return 0;
 }
 
 static int phram_read(struct mtd_info *mtd, loff_t from, size_t len,
index 67d22e1cbc0ed8af85ae2793195a384b3bcbf8a7..933127ecebe5d5bda056ffaec53e5944062c5f79 100644 (file)
@@ -206,11 +206,12 @@ static int pmc551_point(struct mtd_info *mtd, loff_t from, size_t len,
        return 0;
 }
 
-static void pmc551_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int pmc551_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
 #ifdef CONFIG_MTD_PMC551_DEBUG
        printk(KERN_DEBUG "pmc551_unpoint()\n");
 #endif
+       return 0;
 }
 
 static int pmc551_read(struct mtd_info *mtd, loff_t from, size_t len,
index cbeb19522bbce6e9b524e245c04ec413a8b4e209..9431ffc761c282c9d28253d187284a825f76c1da 100644 (file)
@@ -76,7 +76,7 @@ static slram_mtd_list_t *slram_mtdlist = NULL;
 static int slram_erase(struct mtd_info *, struct erase_info *);
 static int slram_point(struct mtd_info *, loff_t, size_t, size_t *, void **,
                resource_size_t *);
-static void slram_unpoint(struct mtd_info *, loff_t, size_t);
+static int slram_unpoint(struct mtd_info *, loff_t, size_t);
 static int slram_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);
 static int slram_write(struct mtd_info *, loff_t, size_t, size_t *, const u_char *);
 
@@ -119,8 +119,9 @@ static int slram_point(struct mtd_info *mtd, loff_t from, size_t len,
        return(0);
 }
 
-static void slram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int slram_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
+       return 0;
 }
 
 static int slram_read(struct mtd_info *mtd, loff_t from, size_t len,
index fd19d3b1ee906b7451fe1627b0fcd589822e69af..de960b1d395af73dbbb560c219051056fe590735 100644 (file)
@@ -40,7 +40,7 @@ static int lpddr_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
 static int lpddr_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
 static int lpddr_point(struct mtd_info *mtd, loff_t adr, size_t len,
                        size_t *retlen, void **mtdbuf, resource_size_t *phys);
-static void lpddr_unpoint(struct mtd_info *mtd, loff_t adr, size_t len);
+static int lpddr_unpoint(struct mtd_info *mtd, loff_t adr, size_t len);
 static int get_chip(struct map_info *map, struct flchip *chip, int mode);
 static int chip_ready(struct map_info *map, struct flchip *chip, int mode);
 static void put_chip(struct map_info *map, struct flchip *chip);
@@ -575,11 +575,11 @@ static int lpddr_point(struct mtd_info *mtd, loff_t adr, size_t len,
        return 0;
 }
 
-static void lpddr_unpoint (struct mtd_info *mtd, loff_t adr, size_t len)
+static int lpddr_unpoint (struct mtd_info *mtd, loff_t adr, size_t len)
 {
        struct map_info *map = mtd->priv;
        struct lpddr_private *lpddr = map->fldrv_priv;
-       int chipnum = adr >> lpddr->chipshift;
+       int chipnum = adr >> lpddr->chipshift, err = 0;
        unsigned long ofs;
 
        /* ofs: offset within the first chip that the first read should start */
@@ -603,9 +603,11 @@ static void lpddr_unpoint (struct mtd_info *mtd, loff_t adr, size_t len)
                        chip->ref_point_counter--;
                        if (chip->ref_point_counter == 0)
                                chip->state = FL_READY;
-               } else
+               } else {
                        printk(KERN_WARNING "%s: Warning: unpoint called on non"
                                        "pointed region\n", map->name);
+                       err = -EINVAL;
+               }
 
                put_chip(map, chip);
                mutex_unlock(&chip->mutex);
@@ -614,6 +616,8 @@ static void lpddr_unpoint (struct mtd_info *mtd, loff_t adr, size_t len)
                ofs = 0;
                chipnum++;
        }
+
+       return err;
 }
 
 static int lpddr_write_buffers(struct mtd_info *mtd, loff_t to, size_t len,
index 4f01079e357f8a53bdb83dce0de6486df6837ecd..da8a0b28316c8c7d06a69eff73b6929641f99efa 100644 (file)
@@ -92,11 +92,11 @@ static int part_point(struct mtd_info *mtd, loff_t from, size_t len,
                         virt, phys);
 }
 
-static void part_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static int part_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
        struct mtd_part *part = PART(mtd);
 
-       mtd_unpoint(part->master, from + part->offset, len);
+       return mtd_unpoint(part->master, from + part->offset, len);
 }
 
 static unsigned long part_get_unmapped_area(struct mtd_info *mtd,
index e2e545616b2a58f505f964ab695880c44242f523..8c243117c0872eaa011f59d9cf03d9594a81a71e 100644 (file)
@@ -177,7 +177,7 @@ struct mtd_info {
        int (*_erase) (struct mtd_info *mtd, struct erase_info *instr);
        int (*_point) (struct mtd_info *mtd, loff_t from, size_t len,
                       size_t *retlen, void **virt, resource_size_t *phys);
-       void (*_unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
+       int (*_unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
        unsigned long (*_get_unmapped_area) (struct mtd_info *mtd,
                                             unsigned long len,
                                             unsigned long offset,
@@ -265,8 +265,10 @@ static inline int mtd_point(struct mtd_info *mtd, loff_t from, size_t len,
 }
 
 /* We probably shouldn't allow XIP if the unpoint isn't a NULL */
-static inline void mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
+static inline int mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
 {
+       if (!mtd->_point)
+               return -EOPNOTSUPP;
        return mtd->_unpoint(mtd, from, len);
 }
 
index 27ad40aed19f34faa11b0dcca3f9251290382413..da8b98d1b3304ff3e39d3ee13c8b824d08b9da7a 100644 (file)
@@ -34,7 +34,6 @@ struct mypriv {
  * Function Prototypes
  */
 static int pmc551_erase(struct mtd_info *, struct erase_info *);
-static void pmc551_unpoint(struct mtd_info *, loff_t, size_t);
 static int pmc551_point(struct mtd_info *mtd, loff_t from, size_t len,
                size_t *retlen, void **virt, resource_size_t *phys);
 static int pmc551_read(struct mtd_info *, loff_t, size_t, size_t *, u_char *);