Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'mtd/fixes-for-5.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux

Pull MTD fixes from Miquel Raynal:
"MTD changes:

- Qcom:
- Don't print error message on -EPROBE_DEFER
- Fix kernel panic on skipped partition
- Fix missing free for pparts in cleanup

- phram: Prevent divide by zero bug in phram_setup()

Raw NAND controller changes:

- ingenic: Fix missing put_device in ingenic_ecc_get

- qcom: Fix clock sequencing in qcom_nandc_probe()

- omap2: Prevent invalid configuration and build error

- gpmi: Don't leak PM reference in error path

- brcmnand: Fix incorrect sub-page ECC status"

* tag 'mtd/fixes-for-5.17-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux:
mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status
mtd: rawnand: gpmi: don't leak PM reference in error path
mtd: phram: Prevent divide by zero bug in phram_setup()
mtd: rawnand: omap2: Prevent invalid configuration and build error
mtd: parsers: qcom: Fix missing free for pparts in cleanup
mtd: parsers: qcom: Fix kernel panic on skipped partition
mtd: parsers: qcom: Don't print error message on -EPROBE_DEFER
mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe()
mtd: rawnand: ingenic: Fix missing put_device in ingenic_ecc_get

+48 -29
+8 -4
drivers/mtd/devices/phram.c
··· 264 264 } 265 265 } 266 266 267 - if (erasesize) 268 - div_u64_rem(len, (uint32_t)erasesize, &rem); 269 - 270 267 if (len == 0 || erasesize == 0 || erasesize > len 271 - || erasesize > UINT_MAX || rem) { 268 + || erasesize > UINT_MAX) { 272 269 parse_err("illegal erasesize or len\n"); 270 + ret = -EINVAL; 271 + goto error; 272 + } 273 + 274 + div_u64_rem(len, (uint32_t)erasesize, &rem); 275 + if (rem) { 276 + parse_err("len is not multiple of erasesize\n"); 273 277 ret = -EINVAL; 274 278 goto error; 275 279 }
+2 -1
drivers/mtd/nand/raw/Kconfig
··· 42 42 tristate "OMAP2, OMAP3, OMAP4 and Keystone NAND controller" 43 43 depends on ARCH_OMAP2PLUS || ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST 44 44 depends on HAS_IOMEM 45 - select OMAP_GPMC if ARCH_K3 45 + select MEMORY 46 + select OMAP_GPMC 46 47 help 47 48 Support for NAND flash on Texas Instruments OMAP2, OMAP3, OMAP4 48 49 and Keystone platforms.
+1 -1
drivers/mtd/nand/raw/brcmnand/brcmnand.c
··· 2106 2106 mtd->oobsize / trans, 2107 2107 host->hwcfg.sector_size_1k); 2108 2108 2109 - if (!ret) { 2109 + if (ret != -EBADMSG) { 2110 2110 *err_addr = brcmnand_get_uncorrecc_addr(ctrl); 2111 2111 2112 2112 if (*err_addr)
+2 -1
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
··· 2285 2285 this->hw.must_apply_timings = false; 2286 2286 ret = gpmi_nfc_apply_timings(this); 2287 2287 if (ret) 2288 - return ret; 2288 + goto out_pm; 2289 2289 } 2290 2290 2291 2291 dev_dbg(this->dev, "%s: %d instructions\n", __func__, op->ninstrs); ··· 2414 2414 2415 2415 this->bch = false; 2416 2416 2417 + out_pm: 2417 2418 pm_runtime_mark_last_busy(this->dev); 2418 2419 pm_runtime_put_autosuspend(this->dev); 2419 2420
+6 -1
drivers/mtd/nand/raw/ingenic/ingenic_ecc.c
··· 68 68 struct ingenic_ecc *ecc; 69 69 70 70 pdev = of_find_device_by_node(np); 71 - if (!pdev || !platform_get_drvdata(pdev)) 71 + if (!pdev) 72 72 return ERR_PTR(-EPROBE_DEFER); 73 + 74 + if (!platform_get_drvdata(pdev)) { 75 + put_device(&pdev->dev); 76 + return ERR_PTR(-EPROBE_DEFER); 77 + } 73 78 74 79 ecc = platform_get_drvdata(pdev); 75 80 clk_prepare_enable(ecc->clk);
+6 -8
drivers/mtd/nand/raw/qcom_nandc.c
··· 2 2 /* 3 3 * Copyright (c) 2016, The Linux Foundation. All rights reserved. 4 4 */ 5 - 6 5 #include <linux/clk.h> 7 6 #include <linux/slab.h> 8 7 #include <linux/bitops.h> ··· 3072 3073 if (dma_mapping_error(dev, nandc->base_dma)) 3073 3074 return -ENXIO; 3074 3075 3075 - ret = qcom_nandc_alloc(nandc); 3076 - if (ret) 3077 - goto err_nandc_alloc; 3078 - 3079 3076 ret = clk_prepare_enable(nandc->core_clk); 3080 3077 if (ret) 3081 3078 goto err_core_clk; ··· 3079 3084 ret = clk_prepare_enable(nandc->aon_clk); 3080 3085 if (ret) 3081 3086 goto err_aon_clk; 3087 + 3088 + ret = qcom_nandc_alloc(nandc); 3089 + if (ret) 3090 + goto err_nandc_alloc; 3082 3091 3083 3092 ret = qcom_nandc_setup(nandc); 3084 3093 if (ret) ··· 3095 3096 return 0; 3096 3097 3097 3098 err_setup: 3099 + qcom_nandc_unalloc(nandc); 3100 + err_nandc_alloc: 3098 3101 clk_disable_unprepare(nandc->aon_clk); 3099 3102 err_aon_clk: 3100 3103 clk_disable_unprepare(nandc->core_clk); 3101 3104 err_core_clk: 3102 - qcom_nandc_unalloc(nandc); 3103 - err_nandc_alloc: 3104 3105 dma_unmap_resource(dev, res->start, resource_size(res), 3105 3106 DMA_BIDIRECTIONAL, 0); 3106 - 3107 3107 return ret; 3108 3108 } 3109 3109
+23 -13
drivers/mtd/parsers/qcomsmempart.c
··· 58 58 const struct mtd_partition **pparts, 59 59 struct mtd_part_parser_data *data) 60 60 { 61 + size_t len = SMEM_FLASH_PTABLE_HDR_LEN; 62 + int ret, i, j, tmpparts, numparts = 0; 61 63 struct smem_flash_pentry *pentry; 62 64 struct smem_flash_ptable *ptable; 63 - size_t len = SMEM_FLASH_PTABLE_HDR_LEN; 64 65 struct mtd_partition *parts; 65 - int ret, i, numparts; 66 66 char *name, *c; 67 67 68 68 if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_4K_SECTORS) ··· 75 75 pr_debug("Parsing partition table info from SMEM\n"); 76 76 ptable = qcom_smem_get(SMEM_APPS, SMEM_AARM_PARTITION_TABLE, &len); 77 77 if (IS_ERR(ptable)) { 78 - pr_err("Error reading partition table header\n"); 78 + if (PTR_ERR(ptable) != -EPROBE_DEFER) 79 + pr_err("Error reading partition table header\n"); 79 80 return PTR_ERR(ptable); 80 81 } 81 82 ··· 88 87 } 89 88 90 89 /* Ensure that # of partitions is less than the max we have allocated */ 91 - numparts = le32_to_cpu(ptable->numparts); 92 - if (numparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4) { 90 + tmpparts = le32_to_cpu(ptable->numparts); 91 + if (tmpparts > SMEM_FLASH_PTABLE_MAX_PARTS_V4) { 93 92 pr_err("Partition numbers exceed the max limit\n"); 94 93 return -EINVAL; 95 94 } ··· 117 116 return PTR_ERR(ptable); 118 117 } 119 118 119 + for (i = 0; i < tmpparts; i++) { 120 + pentry = &ptable->pentry[i]; 121 + if (pentry->name[0] != '\0') 122 + numparts++; 123 + } 124 + 120 125 parts = kcalloc(numparts, sizeof(*parts), GFP_KERNEL); 121 126 if (!parts) 122 127 return -ENOMEM; 123 128 124 - for (i = 0; i < numparts; i++) { 129 + for (i = 0, j = 0; i < tmpparts; i++) { 125 130 pentry = &ptable->pentry[i]; 126 131 if (pentry->name[0] == '\0') 127 132 continue; ··· 142 135 for (c = name; *c != '\0'; c++) 143 136 *c = tolower(*c); 144 137 145 - parts[i].name = name; 146 - parts[i].offset = le32_to_cpu(pentry->offset) * mtd->erasesize; 147 - parts[i].mask_flags = pentry->attr; 148 - parts[i].size = le32_to_cpu(pentry->length) * mtd->erasesize; 138 + parts[j].name = name; 139 + parts[j].offset = le32_to_cpu(pentry->offset) * mtd->erasesize; 140 + parts[j].mask_flags = pentry->attr; 141 + parts[j].size = le32_to_cpu(pentry->length) * mtd->erasesize; 149 142 pr_debug("%d: %s offs=0x%08x size=0x%08x attr:0x%08x\n", 150 143 i, pentry->name, le32_to_cpu(pentry->offset), 151 144 le32_to_cpu(pentry->length), pentry->attr); 145 + j++; 152 146 } 153 147 154 148 pr_debug("SMEM partition table found: ver: %d len: %d\n", 155 - le32_to_cpu(ptable->version), numparts); 149 + le32_to_cpu(ptable->version), tmpparts); 156 150 *pparts = parts; 157 151 158 152 return numparts; 159 153 160 154 out_free_parts: 161 - while (--i >= 0) 162 - kfree(parts[i].name); 155 + while (--j >= 0) 156 + kfree(parts[j].name); 163 157 kfree(parts); 164 158 *pparts = NULL; 165 159 ··· 174 166 175 167 for (i = 0; i < nr_parts; i++) 176 168 kfree(pparts[i].name); 169 + 170 + kfree(pparts); 177 171 } 178 172 179 173 static const struct of_device_id qcomsmem_of_match_table[] = {