These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / mtd / devices / docg3.c
index 866d319..c3a2695 100644 (file)
@@ -1620,20 +1620,30 @@ static struct device_attribute doc_sys_attrs[DOC_MAX_NBFLOORS][4] = {
 static int doc_register_sysfs(struct platform_device *pdev,
                              struct docg3_cascade *cascade)
 {
-       int ret = 0, floor, i = 0;
        struct device *dev = &pdev->dev;
+       int floor;
+       int ret;
+       int i;
 
-       for (floor = 0; !ret && floor < DOC_MAX_NBFLOORS &&
-                    cascade->floors[floor]; floor++)
-               for (i = 0; !ret && i < 4; i++)
+       for (floor = 0;
+            floor < DOC_MAX_NBFLOORS && cascade->floors[floor];
+            floor++) {
+               for (i = 0; i < 4; i++) {
                        ret = device_create_file(dev, &doc_sys_attrs[floor][i]);
-       if (!ret)
-               return 0;
+                       if (ret)
+                               goto remove_files;
+               }
+       }
+
+       return 0;
+
+remove_files:
        do {
                while (--i >= 0)
                        device_remove_file(dev, &doc_sys_attrs[floor][i]);
                i = 4;
        } while (--floor >= 0);
+
        return ret;
 }
 
@@ -1815,7 +1825,7 @@ static void doc_dbg_unregister(struct docg3 *docg3)
  * @chip_id: The chip ID of the supported chip
  * @mtd: The structure to fill
  */
-static void __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
+static int __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
 {
        struct docg3 *docg3 = mtd->priv;
        int cfg;
@@ -1828,6 +1838,8 @@ static void __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
        case DOC_CHIPID_G3:
                mtd->name = kasprintf(GFP_KERNEL, "docg3.%d",
                                      docg3->device_id);
+               if (!mtd->name)
+                       return -ENOMEM;
                docg3->max_block = 2047;
                break;
        }
@@ -1841,7 +1853,6 @@ static void __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
                mtd->erasesize /= 2;
        mtd->writebufsize = mtd->writesize = DOC_LAYOUT_PAGE_SIZE;
        mtd->oobsize = DOC_LAYOUT_OOB_SIZE;
-       mtd->owner = THIS_MODULE;
        mtd->_erase = doc_erase;
        mtd->_read = doc_read;
        mtd->_write = doc_write;
@@ -1850,6 +1861,8 @@ static void __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
        mtd->_block_isbad = doc_block_isbad;
        mtd->ecclayout = &docg3_oobinfo;
        mtd->ecc_strength = DOC_ECC_BCH_T;
+
+       return 0;
 }
 
 /**
@@ -1881,6 +1894,7 @@ doc_probe_device(struct docg3_cascade *cascade, int floor, struct device *dev)
        if (!mtd)
                goto nomem2;
        mtd->priv = docg3;
+       mtd->dev.parent = dev;
        bbt_nbpages = DIV_ROUND_UP(docg3->max_block + 1,
                                   8 * DOC_LAYOUT_PAGE_SIZE);
        docg3->bbt = kzalloc(bbt_nbpages * DOC_LAYOUT_PAGE_SIZE, GFP_KERNEL);
@@ -1900,7 +1914,7 @@ doc_probe_device(struct docg3_cascade *cascade, int floor, struct device *dev)
 
        ret = 0;
        if (chip_id != (u16)(~chip_id_inv)) {
-               goto nomem3;
+               goto nomem4;
        }
 
        switch (chip_id) {
@@ -1910,15 +1924,19 @@ doc_probe_device(struct docg3_cascade *cascade, int floor, struct device *dev)
                break;
        default:
                doc_err("Chip id %04x is not a DiskOnChip G3 chip\n", chip_id);
-               goto nomem3;
+               goto nomem4;
        }
 
-       doc_set_driver_info(chip_id, mtd);
+       ret = doc_set_driver_info(chip_id, mtd);
+       if (ret)
+               goto nomem4;
 
        doc_hamming_ecc_init(docg3, DOC_LAYOUT_OOB_PAGEINFO_SZ);
        doc_reload_bbt(docg3);
        return mtd;
 
+nomem4:
+       kfree(docg3->bbt);
 nomem3:
        kfree(mtd);
 nomem2:
@@ -2117,7 +2135,7 @@ static int docg3_release(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_OF
-static struct of_device_id docg3_dt_ids[] = {
+static const struct of_device_id docg3_dt_ids[] = {
        { .compatible = "m-systems,diskonchip-g3" },
        {}
 };