mtd: plat_nand: request memory resource before doing ioremap

Add a request_mem_region() before doing the ioremap().  Also, use the
resource_size macro instead of doing the end - start + 1 calc by hand.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
H Hartley Sweeten 2009-10-19 19:45:29 -04:00 committed by David Woodhouse
parent 5da6bbe2f9
commit 2d098a7253

View file

@ -34,7 +34,12 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
{ {
struct platform_nand_data *pdata = pdev->dev.platform_data; struct platform_nand_data *pdata = pdev->dev.platform_data;
struct plat_nand_data *data; struct plat_nand_data *data;
int res = 0; struct resource *res;
int err = 0;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENXIO;
/* Allocate memory for the device structure (and zero it) */ /* Allocate memory for the device structure (and zero it) */
data = kzalloc(sizeof(struct plat_nand_data), GFP_KERNEL); data = kzalloc(sizeof(struct plat_nand_data), GFP_KERNEL);
@ -43,12 +48,18 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
} }
data->io_base = ioremap(pdev->resource[0].start, if (!request_mem_region(res->start, resource_size(res),
pdev->resource[0].end - pdev->resource[0].start + 1); dev_name(&pdev->dev))) {
dev_err(&pdev->dev, "request_mem_region failed\n");
err = -EBUSY;
goto out_free;
}
data->io_base = ioremap(res->start, resource_size(res));
if (data->io_base == NULL) { if (data->io_base == NULL) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
kfree(data); err = -EIO;
return -EIO; goto out_release_io;
} }
data->chip.priv = &data; data->chip.priv = &data;
@ -74,24 +85,24 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
/* Handle any platform specific setup */ /* Handle any platform specific setup */
if (pdata->ctrl.probe) { if (pdata->ctrl.probe) {
res = pdata->ctrl.probe(pdev); err = pdata->ctrl.probe(pdev);
if (res) if (err)
goto out; goto out;
} }
/* Scan to find existance of the device */ /* Scan to find existance of the device */
if (nand_scan(&data->mtd, 1)) { if (nand_scan(&data->mtd, 1)) {
res = -ENXIO; err = -ENXIO;
goto out; goto out;
} }
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
if (pdata->chip.part_probe_types) { if (pdata->chip.part_probe_types) {
res = parse_mtd_partitions(&data->mtd, err = parse_mtd_partitions(&data->mtd,
pdata->chip.part_probe_types, pdata->chip.part_probe_types,
&data->parts, 0); &data->parts, 0);
if (res > 0) { if (err > 0) {
add_mtd_partitions(&data->mtd, data->parts, res); add_mtd_partitions(&data->mtd, data->parts, err);
return 0; return 0;
} }
} }
@ -99,14 +110,14 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
pdata->chip.set_parts(data->mtd.size, &pdata->chip); pdata->chip.set_parts(data->mtd.size, &pdata->chip);
if (pdata->chip.partitions) { if (pdata->chip.partitions) {
data->parts = pdata->chip.partitions; data->parts = pdata->chip.partitions;
res = add_mtd_partitions(&data->mtd, data->parts, err = add_mtd_partitions(&data->mtd, data->parts,
pdata->chip.nr_partitions); pdata->chip.nr_partitions);
} else } else
#endif #endif
res = add_mtd_device(&data->mtd); err = add_mtd_device(&data->mtd);
if (!res) if (!err)
return res; return err;
nand_release(&data->mtd); nand_release(&data->mtd);
out: out:
@ -114,8 +125,11 @@ out:
pdata->ctrl.remove(pdev); pdata->ctrl.remove(pdev);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
iounmap(data->io_base); iounmap(data->io_base);
out_release_io:
release_mem_region(res->start, resource_size(res));
out_free:
kfree(data); kfree(data);
return res; return err;
} }
/* /*
@ -125,6 +139,9 @@ static int __devexit plat_nand_remove(struct platform_device *pdev)
{ {
struct plat_nand_data *data = platform_get_drvdata(pdev); struct plat_nand_data *data = platform_get_drvdata(pdev);
struct platform_nand_data *pdata = pdev->dev.platform_data; struct platform_nand_data *pdata = pdev->dev.platform_data;
struct resource *res;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
nand_release(&data->mtd); nand_release(&data->mtd);
#ifdef CONFIG_MTD_PARTITIONS #ifdef CONFIG_MTD_PARTITIONS
@ -134,6 +151,7 @@ static int __devexit plat_nand_remove(struct platform_device *pdev)
if (pdata->ctrl.remove) if (pdata->ctrl.remove)
pdata->ctrl.remove(pdev); pdata->ctrl.remove(pdev);
iounmap(data->io_base); iounmap(data->io_base);
release_mem_region(res->start, resource_size(res));
kfree(data); kfree(data);
return 0; return 0;