|
@@ -1399,12 +1399,15 @@ static int mxcnd_probe(struct platform_device *pdev)
|
|
|
int err = 0;
|
|
|
|
|
|
/* Allocate memory for MTD device structure and private data */
|
|
|
- host = devm_kzalloc(&pdev->dev, sizeof(struct mxc_nand_host) +
|
|
|
- NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE, GFP_KERNEL);
|
|
|
+ host = devm_kzalloc(&pdev->dev, sizeof(struct mxc_nand_host),
|
|
|
+ GFP_KERNEL);
|
|
|
if (!host)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- host->data_buf = (uint8_t *)(host + 1);
|
|
|
+ /* allocate a temporary buffer for the nand_scan_ident() */
|
|
|
+ host->data_buf = devm_kzalloc(&pdev->dev, PAGE_SIZE, GFP_KERNEL);
|
|
|
+ if (!host->data_buf)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
host->dev = &pdev->dev;
|
|
|
/* structures must be linked */
|
|
@@ -1532,6 +1535,15 @@ static int mxcnd_probe(struct platform_device *pdev)
|
|
|
goto escan;
|
|
|
}
|
|
|
|
|
|
+ /* allocate the right size buffer now */
|
|
|
+ devm_kfree(&pdev->dev, (void *)host->data_buf);
|
|
|
+ host->data_buf = devm_kzalloc(&pdev->dev, mtd->writesize + mtd->oobsize,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!host->data_buf) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto escan;
|
|
|
+ }
|
|
|
+
|
|
|
/* Call preset again, with correct writesize this time */
|
|
|
host->devtype_data->preset(mtd);
|
|
|
|