diff options
| -rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/au1550nd.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/bf5xx_nand.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/davinci_nand.c | 6 | ||||
| -rw-r--r-- | drivers/mtd/nand/gpio.c | 231 | ||||
| -rw-r--r-- | drivers/mtd/nand/jz4740_nand.c | 4 | ||||
| -rw-r--r-- | drivers/mtd/nand/lpc32xx_mlc.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/lpc32xx_slc.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 3 | ||||
| -rw-r--r-- | drivers/mtd/nand/omap2.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/orion_nand.c | 5 | ||||
| -rw-r--r-- | drivers/mtd/nand/plat_nand.c | 4 | ||||
| -rw-r--r-- | drivers/mtd/nand/pxa3xx_nand.c | 124 | ||||
| -rw-r--r-- | drivers/mtd/nand/s3c2410.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/sh_flctl.c | 4 | ||||
| -rw-r--r-- | drivers/mtd/nand/sharpsl.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/tmio_nand.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/nand/txx9ndfmc.c | 8 | 
18 files changed, 142 insertions, 265 deletions
| diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 2d23d292943..023541d7a30 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -1502,7 +1502,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev)  		if (res)  			goto err_ecc_ioremap;  	} else { -		memcpy(&host->board, pdev->dev.platform_data, +		memcpy(&host->board, dev_get_platdata(&pdev->dev),  		       sizeof(struct atmel_nand_data));  	} diff --git a/drivers/mtd/nand/au1550nd.c b/drivers/mtd/nand/au1550nd.c index 217459d02b2..ae8dd7c4103 100644 --- a/drivers/mtd/nand/au1550nd.c +++ b/drivers/mtd/nand/au1550nd.c @@ -411,7 +411,7 @@ static int au1550nd_probe(struct platform_device *pdev)  	struct resource *r;  	int ret, cs; -	pd = pdev->dev.platform_data; +	pd = dev_get_platdata(&pdev->dev);  	if (!pd) {  		dev_err(&pdev->dev, "missing platform data\n");  		return -ENODEV; diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c index 776df3694f7..d7f7df3cd96 100644 --- a/drivers/mtd/nand/bf5xx_nand.c +++ b/drivers/mtd/nand/bf5xx_nand.c @@ -171,7 +171,7 @@ static struct bf5xx_nand_info *to_nand_info(struct platform_device *pdev)  static struct bf5xx_nand_platform *to_nand_plat(struct platform_device *pdev)  { -	return pdev->dev.platform_data; +	return dev_get_platdata(&pdev->dev);  }  /* diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index c3e15a55817..758a111a3bc 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c @@ -530,7 +530,7 @@ MODULE_DEVICE_TABLE(of, davinci_nand_of_match);  static struct davinci_nand_pdata  	*nand_davinci_get_pdata(struct platform_device *pdev)  { -	if (!pdev->dev.platform_data && pdev->dev.of_node) { +	if (!dev_get_platdata(&pdev->dev) && pdev->dev.of_node) {  		struct davinci_nand_pdata *pdata;  		const char *mode;  		u32 prop; @@ -575,13 +575,13 @@ static struct davinci_nand_pdata  			pdata->bbt_options = NAND_BBT_USE_FLASH;  	} -	return pdev->dev.platform_data; +	return dev_get_platdata(&pdev->dev);  }  #else  static struct davinci_nand_pdata  	*nand_davinci_get_pdata(struct platform_device *pdev)  { -	return pdev->dev.platform_data; +	return dev_get_platdata(&pdev->dev);  }  #endif diff --git a/drivers/mtd/nand/gpio.c b/drivers/mtd/nand/gpio.c index 89065dd83d6..e826f898241 100644 --- a/drivers/mtd/nand/gpio.c +++ b/drivers/mtd/nand/gpio.c @@ -17,6 +17,7 @@   */  #include <linux/kernel.h> +#include <linux/err.h>  #include <linux/init.h>  #include <linux/slab.h>  #include <linux/module.h> @@ -86,59 +87,11 @@ static void gpio_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)  	gpio_nand_dosync(gpiomtd);  } -static void gpio_nand_writebuf(struct mtd_info *mtd, const u_char *buf, int len) -{ -	struct nand_chip *this = mtd->priv; - -	iowrite8_rep(this->IO_ADDR_W, buf, len); -} - -static void gpio_nand_readbuf(struct mtd_info *mtd, u_char *buf, int len) -{ -	struct nand_chip *this = mtd->priv; - -	ioread8_rep(this->IO_ADDR_R, buf, len); -} - -static void gpio_nand_writebuf16(struct mtd_info *mtd, const u_char *buf, -				 int len) -{ -	struct nand_chip *this = mtd->priv; - -	if (IS_ALIGNED((unsigned long)buf, 2)) { -		iowrite16_rep(this->IO_ADDR_W, buf, len>>1); -	} else { -		int i; -		unsigned short *ptr = (unsigned short *)buf; - -		for (i = 0; i < len; i += 2, ptr++) -			writew(*ptr, this->IO_ADDR_W); -	} -} - -static void gpio_nand_readbuf16(struct mtd_info *mtd, u_char *buf, int len) -{ -	struct nand_chip *this = mtd->priv; - -	if (IS_ALIGNED((unsigned long)buf, 2)) { -		ioread16_rep(this->IO_ADDR_R, buf, len>>1); -	} else { -		int i; -		unsigned short *ptr = (unsigned short *)buf; - -		for (i = 0; i < len; i += 2, ptr++) -			*ptr = readw(this->IO_ADDR_R); -	} -} -  static int gpio_nand_devready(struct mtd_info *mtd)  {  	struct gpiomtd *gpiomtd = gpio_nand_getpriv(mtd); -	if (gpio_is_valid(gpiomtd->plat.gpio_rdy)) -		return gpio_get_value(gpiomtd->plat.gpio_rdy); - -	return 1; +	return gpio_get_value(gpiomtd->plat.gpio_rdy);  }  #ifdef CONFIG_OF @@ -153,6 +106,9 @@ static int gpio_nand_get_config_of(const struct device *dev,  {  	u32 val; +	if (!dev->of_node) +		return -ENODEV; +  	if (!of_property_read_u32(dev->of_node, "bank-width", &val)) {  		if (val == 2) {  			plat->options |= NAND_BUSWIDTH_16; @@ -211,8 +167,8 @@ static inline int gpio_nand_get_config(const struct device *dev,  	if (!ret)  		return ret; -	if (dev->platform_data) { -		memcpy(plat, dev->platform_data, sizeof(*plat)); +	if (dev_get_platdata(dev)) { +		memcpy(plat, dev_get_platdata(dev), sizeof(*plat));  		return 0;  	} @@ -230,145 +186,100 @@ gpio_nand_get_io_sync(struct platform_device *pdev)  	return platform_get_resource(pdev, IORESOURCE_MEM, 1);  } -static int gpio_nand_remove(struct platform_device *dev) +static int gpio_nand_remove(struct platform_device *pdev)  { -	struct gpiomtd *gpiomtd = platform_get_drvdata(dev); -	struct resource *res; +	struct gpiomtd *gpiomtd = platform_get_drvdata(pdev);  	nand_release(&gpiomtd->mtd_info); -	res = gpio_nand_get_io_sync(dev); -	iounmap(gpiomtd->io_sync); -	if (res) -		release_mem_region(res->start, resource_size(res)); - -	res = platform_get_resource(dev, IORESOURCE_MEM, 0); -	iounmap(gpiomtd->nand_chip.IO_ADDR_R); -	release_mem_region(res->start, resource_size(res)); -  	if (gpio_is_valid(gpiomtd->plat.gpio_nwp))  		gpio_set_value(gpiomtd->plat.gpio_nwp, 0);  	gpio_set_value(gpiomtd->plat.gpio_nce, 1); -	gpio_free(gpiomtd->plat.gpio_cle); -	gpio_free(gpiomtd->plat.gpio_ale); -	gpio_free(gpiomtd->plat.gpio_nce); -	if (gpio_is_valid(gpiomtd->plat.gpio_nwp)) -		gpio_free(gpiomtd->plat.gpio_nwp); -	if (gpio_is_valid(gpiomtd->plat.gpio_rdy)) -		gpio_free(gpiomtd->plat.gpio_rdy); -  	return 0;  } -static void __iomem *request_and_remap(struct resource *res, size_t size, -					const char *name, int *err) -{ -	void __iomem *ptr; - -	if (!request_mem_region(res->start, resource_size(res), name)) { -		*err = -EBUSY; -		return NULL; -	} - -	ptr = ioremap(res->start, size); -	if (!ptr) { -		release_mem_region(res->start, resource_size(res)); -		*err = -ENOMEM; -	} -	return ptr; -} - -static int gpio_nand_probe(struct platform_device *dev) +static int gpio_nand_probe(struct platform_device *pdev)  {  	struct gpiomtd *gpiomtd; -	struct nand_chip *this; -	struct resource *res0, *res1; +	struct nand_chip *chip; +	struct resource *res;  	struct mtd_part_parser_data ppdata = {};  	int ret = 0; -	if (!dev->dev.of_node && !dev->dev.platform_data) -		return -EINVAL; - -	res0 = platform_get_resource(dev, IORESOURCE_MEM, 0); -	if (!res0) +	if (!pdev->dev.of_node && !dev_get_platdata(&pdev->dev))  		return -EINVAL; -	gpiomtd = devm_kzalloc(&dev->dev, sizeof(*gpiomtd), GFP_KERNEL); -	if (gpiomtd == NULL) { -		dev_err(&dev->dev, "failed to create NAND MTD\n"); +	gpiomtd = devm_kzalloc(&pdev->dev, sizeof(*gpiomtd), GFP_KERNEL); +	if (!gpiomtd) { +		dev_err(&pdev->dev, "failed to create NAND MTD\n");  		return -ENOMEM;  	} -	this = &gpiomtd->nand_chip; -	this->IO_ADDR_R = request_and_remap(res0, 2, "NAND", &ret); -	if (!this->IO_ADDR_R) { -		dev_err(&dev->dev, "unable to map NAND\n"); -		goto err_map; -	} +	chip = &gpiomtd->nand_chip; -	res1 = gpio_nand_get_io_sync(dev); -	if (res1) { -		gpiomtd->io_sync = request_and_remap(res1, 4, "NAND sync", &ret); -		if (!gpiomtd->io_sync) { -			dev_err(&dev->dev, "unable to map sync NAND\n"); -			goto err_sync; -		} +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	chip->IO_ADDR_R = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(chip->IO_ADDR_R)) +		return PTR_ERR(chip->IO_ADDR_R); + +	res = gpio_nand_get_io_sync(pdev); +	if (res) { +		gpiomtd->io_sync = devm_ioremap_resource(&pdev->dev, res); +		if (IS_ERR(gpiomtd->io_sync)) +			return PTR_ERR(gpiomtd->io_sync);  	} -	ret = gpio_nand_get_config(&dev->dev, &gpiomtd->plat); +	ret = gpio_nand_get_config(&pdev->dev, &gpiomtd->plat);  	if (ret) -		goto err_nce; +		return ret; -	ret = gpio_request(gpiomtd->plat.gpio_nce, "NAND NCE"); +	ret = devm_gpio_request(&pdev->dev, gpiomtd->plat.gpio_nce, "NAND NCE");  	if (ret) -		goto err_nce; +		return ret;  	gpio_direction_output(gpiomtd->plat.gpio_nce, 1); +  	if (gpio_is_valid(gpiomtd->plat.gpio_nwp)) { -		ret = gpio_request(gpiomtd->plat.gpio_nwp, "NAND NWP"); +		ret = devm_gpio_request(&pdev->dev, gpiomtd->plat.gpio_nwp, +					"NAND NWP");  		if (ret) -			goto err_nwp; -		gpio_direction_output(gpiomtd->plat.gpio_nwp, 1); +			return ret;  	} -	ret = gpio_request(gpiomtd->plat.gpio_ale, "NAND ALE"); + +	ret = devm_gpio_request(&pdev->dev, gpiomtd->plat.gpio_ale, "NAND ALE");  	if (ret) -		goto err_ale; +		return ret;  	gpio_direction_output(gpiomtd->plat.gpio_ale, 0); -	ret = gpio_request(gpiomtd->plat.gpio_cle, "NAND CLE"); + +	ret = devm_gpio_request(&pdev->dev, gpiomtd->plat.gpio_cle, "NAND CLE");  	if (ret) -		goto err_cle; +		return ret;  	gpio_direction_output(gpiomtd->plat.gpio_cle, 0); +  	if (gpio_is_valid(gpiomtd->plat.gpio_rdy)) { -		ret = gpio_request(gpiomtd->plat.gpio_rdy, "NAND RDY"); +		ret = devm_gpio_request(&pdev->dev, gpiomtd->plat.gpio_rdy, +					"NAND RDY");  		if (ret) -			goto err_rdy; +			return ret;  		gpio_direction_input(gpiomtd->plat.gpio_rdy); +		chip->dev_ready = gpio_nand_devready;  	} +	chip->IO_ADDR_W		= chip->IO_ADDR_R; +	chip->ecc.mode		= NAND_ECC_SOFT; +	chip->options		= gpiomtd->plat.options; +	chip->chip_delay	= gpiomtd->plat.chip_delay; +	chip->cmd_ctrl		= gpio_nand_cmd_ctrl; -	this->IO_ADDR_W  = this->IO_ADDR_R; -	this->ecc.mode   = NAND_ECC_SOFT; -	this->options    = gpiomtd->plat.options; -	this->chip_delay = gpiomtd->plat.chip_delay; - -	/* install our routines */ -	this->cmd_ctrl   = gpio_nand_cmd_ctrl; -	this->dev_ready  = gpio_nand_devready; +	gpiomtd->mtd_info.priv	= chip; +	gpiomtd->mtd_info.owner	= THIS_MODULE; -	if (this->options & NAND_BUSWIDTH_16) { -		this->read_buf   = gpio_nand_readbuf16; -		this->write_buf  = gpio_nand_writebuf16; -	} else { -		this->read_buf   = gpio_nand_readbuf; -		this->write_buf  = gpio_nand_writebuf; -	} +	platform_set_drvdata(pdev, gpiomtd); -	/* set the mtd private data for the nand driver */ -	gpiomtd->mtd_info.priv = this; -	gpiomtd->mtd_info.owner = THIS_MODULE; +	if (gpio_is_valid(gpiomtd->plat.gpio_nwp)) +		gpio_direction_output(gpiomtd->plat.gpio_nwp, 1);  	if (nand_scan(&gpiomtd->mtd_info, 1)) { -		dev_err(&dev->dev, "no nand chips found?\n");  		ret = -ENXIO;  		goto err_wp;  	} @@ -377,38 +288,17 @@ static int gpio_nand_probe(struct platform_device *dev)  		gpiomtd->plat.adjust_parts(&gpiomtd->plat,  					   gpiomtd->mtd_info.size); -	ppdata.of_node = dev->dev.of_node; +	ppdata.of_node = pdev->dev.of_node;  	ret = mtd_device_parse_register(&gpiomtd->mtd_info, NULL, &ppdata,  					gpiomtd->plat.parts,  					gpiomtd->plat.num_parts); -	if (ret) -		goto err_wp; -	platform_set_drvdata(dev, gpiomtd); - -	return 0; +	if (!ret) +		return 0;  err_wp:  	if (gpio_is_valid(gpiomtd->plat.gpio_nwp))  		gpio_set_value(gpiomtd->plat.gpio_nwp, 0); -	if (gpio_is_valid(gpiomtd->plat.gpio_rdy)) -		gpio_free(gpiomtd->plat.gpio_rdy); -err_rdy: -	gpio_free(gpiomtd->plat.gpio_cle); -err_cle: -	gpio_free(gpiomtd->plat.gpio_ale); -err_ale: -	if (gpio_is_valid(gpiomtd->plat.gpio_nwp)) -		gpio_free(gpiomtd->plat.gpio_nwp); -err_nwp: -	gpio_free(gpiomtd->plat.gpio_nce); -err_nce: -	iounmap(gpiomtd->io_sync); -	if (res1) -		release_mem_region(res1->start, resource_size(res1)); -err_sync: -	iounmap(gpiomtd->nand_chip.IO_ADDR_R); -	release_mem_region(res0->start, resource_size(res0)); -err_map: +  	return ret;  } @@ -417,6 +307,7 @@ static struct platform_driver gpio_nand_driver = {  	.remove		= gpio_nand_remove,  	.driver		= {  		.name	= "gpio-nand", +		.owner	= THIS_MODULE,  		.of_match_table = of_match_ptr(gpio_nand_id_table),  	},  }; diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c index b76460eeaf2..976d5662c3b 100644 --- a/drivers/mtd/nand/jz4740_nand.c +++ b/drivers/mtd/nand/jz4740_nand.c @@ -411,7 +411,7 @@ static int jz_nand_probe(struct platform_device *pdev)  	struct jz_nand *nand;  	struct nand_chip *chip;  	struct mtd_info *mtd; -	struct jz_nand_platform_data *pdata = pdev->dev.platform_data; +	struct jz_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);  	size_t chipnr, bank_idx;  	uint8_t nand_maf_id = 0, nand_dev_id = 0; @@ -549,7 +549,7 @@ err_free:  static int jz_nand_remove(struct platform_device *pdev)  {  	struct jz_nand *nand = platform_get_drvdata(pdev); -	struct jz_nand_platform_data *pdata = pdev->dev.platform_data; +	struct jz_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);  	size_t i;  	nand_release(&nand->mtd); diff --git a/drivers/mtd/nand/lpc32xx_mlc.c b/drivers/mtd/nand/lpc32xx_mlc.c index fd1df5e13ae..a379c39dab0 100644 --- a/drivers/mtd/nand/lpc32xx_mlc.c +++ b/drivers/mtd/nand/lpc32xx_mlc.c @@ -696,7 +696,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)  	}  	lpc32xx_wp_disable(host); -	host->pdata = pdev->dev.platform_data; +	host->pdata = dev_get_platdata(&pdev->dev);  	nand_chip->priv = host;		/* link the private data structures */  	mtd->priv = nand_chip; diff --git a/drivers/mtd/nand/lpc32xx_slc.c b/drivers/mtd/nand/lpc32xx_slc.c index be94ed5abef..81cd0719f03 100644 --- a/drivers/mtd/nand/lpc32xx_slc.c +++ b/drivers/mtd/nand/lpc32xx_slc.c @@ -798,7 +798,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)  	}  	lpc32xx_wp_disable(host); -	host->pdata = pdev->dev.platform_data; +	host->pdata = dev_get_platdata(&pdev->dev);  	mtd = &host->mtd;  	chip = &host->nand_chip; diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index 07e5784e5cd..302c676c7ec 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1432,7 +1432,8 @@ static int mxcnd_probe(struct platform_device *pdev)  	err = mxcnd_probe_dt(host);  	if (err > 0) { -		struct mxc_nand_platform_data *pdata = pdev->dev.platform_data; +		struct mxc_nand_platform_data *pdata = +					dev_get_platdata(&pdev->dev);  		if (pdata) {  			host->pdata = *pdata;  			host->devtype_data = (struct mxc_nand_devtype_data *) diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c index cb40f87ee93..4ecf0e5fd48 100644 --- a/drivers/mtd/nand/omap2.c +++ b/drivers/mtd/nand/omap2.c @@ -1831,7 +1831,7 @@ static int omap_nand_probe(struct platform_device *pdev)  	struct resource			*res;  	struct mtd_part_parser_data	ppdata = {}; -	pdata = pdev->dev.platform_data; +	pdata = dev_get_platdata(&pdev->dev);  	if (pdata == NULL) {  		dev_err(&pdev->dev, "platform data missing\n");  		return -ENODEV; diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 8fbd0020861..834cb3541b8 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c @@ -130,8 +130,9 @@ static int __init orion_nand_probe(struct platform_device *pdev)  		if (!of_property_read_u32(pdev->dev.of_node,  						"chip-delay", &val))  			board->chip_delay = (u8)val; -	} else -		board = pdev->dev.platform_data; +	} else { +		board = dev_get_platdata(&pdev->dev); +	}  	mtd->priv = nc;  	mtd->owner = THIS_MODULE; diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c index c004566a9ad..08766d1ea44 100644 --- a/drivers/mtd/nand/plat_nand.c +++ b/drivers/mtd/nand/plat_nand.c @@ -30,7 +30,7 @@ static const char *part_probe_types[] = { "cmdlinepart", NULL };   */  static int plat_nand_probe(struct platform_device *pdev)  { -	struct platform_nand_data *pdata = pdev->dev.platform_data; +	struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev);  	struct mtd_part_parser_data ppdata;  	struct plat_nand_data *data;  	struct resource *res; @@ -137,7 +137,7 @@ out_free:  static int plat_nand_remove(struct platform_device *pdev)  {  	struct plat_nand_data *data = platform_get_drvdata(pdev); -	struct platform_nand_data *pdata = pdev->dev.platform_data; +	struct platform_nand_data *pdata = dev_get_platdata(&pdev->dev);  	struct resource *res;  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index dec80ca6a5c..501e380211e 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -506,6 +506,7 @@ static int prepare_command_pool(struct pxa3xx_nand_info *info, int command,  	info->buf_count		= 0;  	info->oob_size		= 0;  	info->use_ecc		= 0; +	info->use_dma		= (use_dma) ? 1 : 0;  	info->is_ready		= 0;  	info->retcode		= ERR_NONE;  	if (info->cs != 0) @@ -589,12 +590,23 @@ static int prepare_command_pool(struct pxa3xx_nand_info *info, int command,  				| addr_cycle;  		break; +	case NAND_CMD_PARAM: +		cmd = NAND_CMD_PARAM; +		info->buf_count = 256; +		info->ndcb0 |= NDCB0_CMD_TYPE(0) +				| NDCB0_ADDR_CYC(1) +				| cmd; +		info->ndcb1 = (column & 0xFF); +		info->data_size = 256; +		break; +  	case NAND_CMD_READID:  		cmd = host->cmdset->read_id;  		info->buf_count = host->read_id_bytes;  		info->ndcb0 |= NDCB0_CMD_TYPE(3)  				| NDCB0_ADDR_CYC(1)  				| cmd; +		info->ndcb1 = (column & 0xFF);  		info->data_size = 8;  		break; @@ -803,7 +815,7 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info,  				    const struct pxa3xx_nand_flash *f)  {  	struct platform_device *pdev = info->pdev; -	struct pxa3xx_nand_platform_data *pdata = pdev->dev.platform_data; +	struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);  	struct pxa3xx_nand_host *host = info->host[info->cs];  	uint32_t ndcr = 0x0; /* enable all interrupts */ @@ -912,6 +924,18 @@ static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)  	return 0;  } +static void pxa3xx_nand_free_buff(struct pxa3xx_nand_info *info) +{ +	struct platform_device *pdev = info->pdev; +	if (use_dma) { +		pxa_free_dma(info->data_dma_ch); +		dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE, +				  info->data_buff, info->data_buff_phys); +	} else { +		kfree(info->data_buff); +	} +} +  static int pxa3xx_nand_sensing(struct pxa3xx_nand_info *info)  {  	struct mtd_info *mtd; @@ -934,7 +958,7 @@ static int pxa3xx_nand_scan(struct mtd_info *mtd)  	struct pxa3xx_nand_host *host = mtd->priv;  	struct pxa3xx_nand_info *info = host->info_data;  	struct platform_device *pdev = info->pdev; -	struct pxa3xx_nand_platform_data *pdata = pdev->dev.platform_data; +	struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);  	struct nand_flash_dev pxa3xx_flash_ids[2], *def = NULL;  	const struct pxa3xx_nand_flash *f = NULL;  	struct nand_chip *chip = mtd->priv; @@ -1034,13 +1058,11 @@ static int alloc_nand_resource(struct platform_device *pdev)  	struct resource *r;  	int ret, irq, cs; -	pdata = pdev->dev.platform_data; -	info = kzalloc(sizeof(*info) + (sizeof(*mtd) + -		       sizeof(*host)) * pdata->num_cs, GFP_KERNEL); -	if (!info) { -		dev_err(&pdev->dev, "failed to allocate memory\n"); +	pdata = dev_get_platdata(&pdev->dev); +	info = devm_kzalloc(&pdev->dev, sizeof(*info) + (sizeof(*mtd) + +			    sizeof(*host)) * pdata->num_cs, GFP_KERNEL); +	if (!info)  		return -ENOMEM; -	}  	info->pdev = pdev;  	for (cs = 0; cs < pdata->num_cs; cs++) { @@ -1069,20 +1091,21 @@ static int alloc_nand_resource(struct platform_device *pdev)  	spin_lock_init(&chip->controller->lock);  	init_waitqueue_head(&chip->controller->wq); -	info->clk = clk_get(&pdev->dev, NULL); +	info->clk = devm_clk_get(&pdev->dev, NULL);  	if (IS_ERR(info->clk)) {  		dev_err(&pdev->dev, "failed to get nand clock\n"); -		ret = PTR_ERR(info->clk); -		goto fail_free_mtd; +		return PTR_ERR(info->clk);  	} -	clk_enable(info->clk); +	ret = clk_prepare_enable(info->clk); +	if (ret < 0) +		return ret;  	/*  	 * This is a dirty hack to make this driver work from devicetree  	 * bindings. It can be removed once we have a prober DMA controller  	 * framework for DT.  	 */ -	if (pdev->dev.of_node && cpu_is_pxa3xx()) { +	if (pdev->dev.of_node && of_machine_is_compatible("marvell,pxa3xx")) {  		info->drcmr_dat = 97;  		info->drcmr_cmd = 99;  	} else { @@ -1090,7 +1113,7 @@ static int alloc_nand_resource(struct platform_device *pdev)  		if (r == NULL) {  			dev_err(&pdev->dev, "no resource defined for data DMA\n");  			ret = -ENXIO; -			goto fail_put_clk; +			goto fail_disable_clk;  		}  		info->drcmr_dat = r->start; @@ -1098,7 +1121,7 @@ static int alloc_nand_resource(struct platform_device *pdev)  		if (r == NULL) {  			dev_err(&pdev->dev, "no resource defined for command DMA\n");  			ret = -ENXIO; -			goto fail_put_clk; +			goto fail_disable_clk;  		}  		info->drcmr_cmd = r->start;  	} @@ -1107,34 +1130,20 @@ static int alloc_nand_resource(struct platform_device *pdev)  	if (irq < 0) {  		dev_err(&pdev->dev, "no IRQ resource defined\n");  		ret = -ENXIO; -		goto fail_put_clk; +		goto fail_disable_clk;  	}  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (r == NULL) { -		dev_err(&pdev->dev, "no IO memory resource defined\n"); -		ret = -ENODEV; -		goto fail_put_clk; -	} - -	r = request_mem_region(r->start, resource_size(r), pdev->name); -	if (r == NULL) { -		dev_err(&pdev->dev, "failed to request memory resource\n"); -		ret = -EBUSY; -		goto fail_put_clk; -	} - -	info->mmio_base = ioremap(r->start, resource_size(r)); -	if (info->mmio_base == NULL) { -		dev_err(&pdev->dev, "ioremap() failed\n"); -		ret = -ENODEV; -		goto fail_free_res; +	info->mmio_base = devm_ioremap_resource(&pdev->dev, r); +	if (IS_ERR(info->mmio_base)) { +		ret = PTR_ERR(info->mmio_base); +		goto fail_disable_clk;  	}  	info->mmio_phys = r->start;  	ret = pxa3xx_nand_init_buff(info);  	if (ret) -		goto fail_free_io; +		goto fail_disable_clk;  	/* initialize all interrupts to be disabled */  	disable_int(info, NDSR_MASK); @@ -1152,21 +1161,9 @@ static int alloc_nand_resource(struct platform_device *pdev)  fail_free_buf:  	free_irq(irq, info); -	if (use_dma) { -		pxa_free_dma(info->data_dma_ch); -		dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE, -			info->data_buff, info->data_buff_phys); -	} else -		kfree(info->data_buff); -fail_free_io: -	iounmap(info->mmio_base); -fail_free_res: -	release_mem_region(r->start, resource_size(r)); -fail_put_clk: -	clk_disable(info->clk); -	clk_put(info->clk); -fail_free_mtd: -	kfree(info); +	pxa3xx_nand_free_buff(info); +fail_disable_clk: +	clk_disable_unprepare(info->clk);  	return ret;  } @@ -1174,35 +1171,22 @@ static int pxa3xx_nand_remove(struct platform_device *pdev)  {  	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);  	struct pxa3xx_nand_platform_data *pdata; -	struct resource *r;  	int irq, cs;  	if (!info)  		return 0; -	pdata = pdev->dev.platform_data; -	platform_set_drvdata(pdev, NULL); +	pdata = dev_get_platdata(&pdev->dev);  	irq = platform_get_irq(pdev, 0);  	if (irq >= 0)  		free_irq(irq, info); -	if (use_dma) { -		pxa_free_dma(info->data_dma_ch); -		dma_free_writecombine(&pdev->dev, MAX_BUFF_SIZE, -				info->data_buff, info->data_buff_phys); -	} else -		kfree(info->data_buff); - -	iounmap(info->mmio_base); -	r = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	release_mem_region(r->start, resource_size(r)); +	pxa3xx_nand_free_buff(info); -	clk_disable(info->clk); -	clk_put(info->clk); +	clk_disable_unprepare(info->clk);  	for (cs = 0; cs < pdata->num_cs; cs++)  		nand_release(info->host[cs]->mtd); -	kfree(info);  	return 0;  } @@ -1211,7 +1195,7 @@ static struct of_device_id pxa3xx_nand_dt_ids[] = {  	{ .compatible = "marvell,pxa3xx-nand" },  	{}  }; -MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids); +MODULE_DEVICE_TABLE(of, pxa3xx_nand_dt_ids);  static int pxa3xx_nand_probe_dt(struct platform_device *pdev)  { @@ -1255,7 +1239,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev)  	if (ret)  		return ret; -	pdata = pdev->dev.platform_data; +	pdata = dev_get_platdata(&pdev->dev);  	if (!pdata) {  		dev_err(&pdev->dev, "no platform data defined\n");  		return -ENODEV; @@ -1302,7 +1286,7 @@ static int pxa3xx_nand_suspend(struct platform_device *pdev, pm_message_t state)  	struct mtd_info *mtd;  	int cs; -	pdata = pdev->dev.platform_data; +	pdata = dev_get_platdata(&pdev->dev);  	if (info->state) {  		dev_err(&pdev->dev, "driver busy, state = %d\n", info->state);  		return -EAGAIN; @@ -1323,7 +1307,7 @@ static int pxa3xx_nand_resume(struct platform_device *pdev)  	struct mtd_info *mtd;  	int cs; -	pdata = pdev->dev.platform_data; +	pdata = dev_get_platdata(&pdev->dev);  	/* We don't want to handle interrupt without calling mtd routine */  	disable_int(info, NDCR_INT_MASK); diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c index d65afd23e17..b707d0f8247 100644 --- a/drivers/mtd/nand/s3c2410.c +++ b/drivers/mtd/nand/s3c2410.c @@ -150,7 +150,7 @@ static struct s3c2410_nand_info *to_nand_info(struct platform_device *dev)  static struct s3c2410_platform_nand *to_nand_plat(struct platform_device *dev)  { -	return dev->dev.platform_data; +	return dev_get_platdata(&dev->dev);  }  static inline int allow_clk_suspend(struct s3c2410_nand_info *info) diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c index e57e18e8c28..a3c84ebbe39 100644 --- a/drivers/mtd/nand/sh_flctl.c +++ b/drivers/mtd/nand/sh_flctl.c @@ -137,7 +137,7 @@ static void flctl_setup_dma(struct sh_flctl *flctl)  	dma_cap_mask_t mask;  	struct dma_slave_config cfg;  	struct platform_device *pdev = flctl->pdev; -	struct sh_flctl_platform_data *pdata = pdev->dev.platform_data; +	struct sh_flctl_platform_data *pdata = dev_get_platdata(&pdev->dev);  	int ret;  	if (!pdata) @@ -1131,7 +1131,7 @@ static int flctl_probe(struct platform_device *pdev)  	if (pdev->dev.of_node)  		pdata = flctl_parse_dt(&pdev->dev);  	else -		pdata = pdev->dev.platform_data; +		pdata = dev_get_platdata(&pdev->dev);  	if (!pdata) {  		dev_err(&pdev->dev, "no setup data defined\n"); diff --git a/drivers/mtd/nand/sharpsl.c b/drivers/mtd/nand/sharpsl.c index 127bc427182..26b27201520 100644 --- a/drivers/mtd/nand/sharpsl.c +++ b/drivers/mtd/nand/sharpsl.c @@ -112,7 +112,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)  	struct resource *r;  	int err = 0;  	struct sharpsl_nand *sharpsl; -	struct sharpsl_nand_platform_data *data = pdev->dev.platform_data; +	struct sharpsl_nand_platform_data *data = dev_get_platdata(&pdev->dev);  	if (!data) {  		dev_err(&pdev->dev, "no platform data!\n"); diff --git a/drivers/mtd/nand/tmio_nand.c b/drivers/mtd/nand/tmio_nand.c index 508e9e04b09..396530d87ec 100644 --- a/drivers/mtd/nand/tmio_nand.c +++ b/drivers/mtd/nand/tmio_nand.c @@ -357,7 +357,7 @@ static void tmio_hw_stop(struct platform_device *dev, struct tmio_nand *tmio)  static int tmio_probe(struct platform_device *dev)  { -	struct tmio_nand_data *data = dev->dev.platform_data; +	struct tmio_nand_data *data = dev_get_platdata(&dev->dev);  	struct resource *fcr = platform_get_resource(dev,  			IORESOURCE_MEM, 0);  	struct resource *ccr = platform_get_resource(dev, diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c index 7ed654c68b0..388b13a6d7e 100644 --- a/drivers/mtd/nand/txx9ndfmc.c +++ b/drivers/mtd/nand/txx9ndfmc.c @@ -87,7 +87,7 @@ static struct platform_device *mtd_to_platdev(struct mtd_info *mtd)  static void __iomem *ndregaddr(struct platform_device *dev, unsigned int reg)  {  	struct txx9ndfmc_drvdata *drvdata = platform_get_drvdata(dev); -	struct txx9ndfmc_platform_data *plat = dev->dev.platform_data; +	struct txx9ndfmc_platform_data *plat = dev_get_platdata(&dev->dev);  	return drvdata->base + (reg << plat->shift);  } @@ -138,7 +138,7 @@ static void txx9ndfmc_cmd_ctrl(struct mtd_info *mtd, int cmd,  	struct nand_chip *chip = mtd->priv;  	struct txx9ndfmc_priv *txx9_priv = chip->priv;  	struct platform_device *dev = txx9_priv->dev; -	struct txx9ndfmc_platform_data *plat = dev->dev.platform_data; +	struct txx9ndfmc_platform_data *plat = dev_get_platdata(&dev->dev);  	if (ctrl & NAND_CTRL_CHANGE) {  		u32 mcr = txx9ndfmc_read(dev, TXX9_NDFMCR); @@ -225,7 +225,7 @@ static void txx9ndfmc_enable_hwecc(struct mtd_info *mtd, int mode)  static void txx9ndfmc_initialize(struct platform_device *dev)  { -	struct txx9ndfmc_platform_data *plat = dev->dev.platform_data; +	struct txx9ndfmc_platform_data *plat = dev_get_platdata(&dev->dev);  	struct txx9ndfmc_drvdata *drvdata = platform_get_drvdata(dev);  	int tmout = 100; @@ -274,7 +274,7 @@ static int txx9ndfmc_nand_scan(struct mtd_info *mtd)  static int __init txx9ndfmc_probe(struct platform_device *dev)  { -	struct txx9ndfmc_platform_data *plat = dev->dev.platform_data; +	struct txx9ndfmc_platform_data *plat = dev_get_platdata(&dev->dev);  	int hold, spw;  	int i;  	struct txx9ndfmc_drvdata *drvdata; |