[U-Boot] [PATCH 5/7] mtd: nand: Add+use mtd_to/from_nand and nand_get/set_controller_data

Boris Brezillon boris.brezillon at free-electrons.com
Mon Jun 6 18:02:07 CEST 2016


On Mon, 30 May 2016 13:57:56 -0500
Scott Wood <oss at buserror.net> wrote:

> These functions are part of the Linux 4.6 sync.  They are being added
> before the main sync patch in order to make it easier to address the
> issue across all NAND drivers (many/most of which do not closely track
> their Linux counterparts) separately from other merge issues.

Some drivers are still directly accessing chip->mtd. Here is a patch
fixing those places [1] (not tested).

[1] http://code.bulix.org/inu69a-100476

> 
> Signed-off-by: Scott Wood <oss at buserror.net>
> ---
>  board/esd/common/esd405ep_nand.c    |  2 +-
>  board/freescale/m5329evb/nand.c     |  2 +-
>  board/freescale/m5373evb/nand.c     |  2 +-
>  board/socrates/nand.c               |  6 ++--
>  board/xes/common/actl_nand.c        |  2 +-
>  cmd/nand.c                          |  4 +--
>  drivers/mtd/nand/am335x_spl_bch.c   |  6 ++--
>  drivers/mtd/nand/arasan_nfc.c       | 19 +++++-----
>  drivers/mtd/nand/atmel_nand.c       | 55 ++++++++++++++--------------
>  drivers/mtd/nand/davinci_nand.c     |  8 ++---
>  drivers/mtd/nand/denali.c           |  4 +--
>  drivers/mtd/nand/fsl_elbc_nand.c    | 33 +++++++++--------
>  drivers/mtd/nand/fsl_ifc_nand.c     | 43 +++++++++++-----------
>  drivers/mtd/nand/fsl_upm.c          | 22 ++++++------
>  drivers/mtd/nand/fsmc_nand.c        |  7 ++--
>  drivers/mtd/nand/kb9202_nand.c      |  2 +-
>  drivers/mtd/nand/kirkwood_nand.c    |  2 +-
>  drivers/mtd/nand/lpc32xx_nand_mlc.c |  2 --
>  drivers/mtd/nand/lpc32xx_nand_slc.c |  2 +-
>  drivers/mtd/nand/mpc5121_nfc.c      | 27 +++++++-------
>  drivers/mtd/nand/mxc_nand.c         | 51 +++++++++++++-------------
>  drivers/mtd/nand/mxs_nand.c         | 46 ++++++++++++------------
>  drivers/mtd/nand/mxs_nand_spl.c     | 11 +++---
>  drivers/mtd/nand/nand.c             |  5 ++-
>  drivers/mtd/nand/nand_base.c        | 72 ++++++++++++++++++-------------------
>  drivers/mtd/nand/nand_bbt.c         | 32 ++++++++---------
>  drivers/mtd/nand/nand_bch.c         |  4 +--
>  drivers/mtd/nand/nand_plat.c        |  4 +--
>  drivers/mtd/nand/nand_spl_simple.c  | 11 +++---
>  drivers/mtd/nand/nand_util.c        |  8 ++---
>  drivers/mtd/nand/ndfc.c             | 14 ++++----
>  drivers/mtd/nand/omap_gpmc.c        | 40 ++++++++++-----------
>  drivers/mtd/nand/pxa3xx_nand.c      | 34 ++++++++++--------
>  drivers/mtd/nand/s3c2410_nand.c     |  4 +--
>  drivers/mtd/nand/tegra_nand.c       | 29 ++++++++-------
>  drivers/mtd/nand/vf610_nfc.c        |  8 ++---
>  fs/yaffs2/yaffs_uboot_glue.c        |  2 +-
>  include/linux/mtd/nand.h            | 20 +++++++++++
>  38 files changed, 328 insertions(+), 317 deletions(-)
> 
> diff --git a/board/esd/common/esd405ep_nand.c b/board/esd/common/esd405ep_nand.c
> index f46936c..51ac10c 100644
> --- a/board/esd/common/esd405ep_nand.c
> +++ b/board/esd/common/esd405ep_nand.c
> @@ -16,7 +16,7 @@
>   */
>  static void esd405ep_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	if (ctrl & NAND_CTRL_CHANGE) {
>  		if ( ctrl & NAND_CLE )
>  			out_be32((void *)GPIO0_OR, in_be32((void *)GPIO0_OR) | CONFIG_SYS_NAND_CLE);
> diff --git a/board/freescale/m5329evb/nand.c b/board/freescale/m5329evb/nand.c
> index 8d88bc0..8849681 100644
> --- a/board/freescale/m5329evb/nand.c
> +++ b/board/freescale/m5329evb/nand.c
> @@ -24,7 +24,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  
>  static void nand_hwcontrol(struct mtd_info *mtdinfo, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	volatile u16 *nCE = (u16 *) CONFIG_SYS_LATCH_ADDR;
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
> diff --git a/board/freescale/m5373evb/nand.c b/board/freescale/m5373evb/nand.c
> index 92cef2a..a96a599 100644
> --- a/board/freescale/m5373evb/nand.c
> +++ b/board/freescale/m5373evb/nand.c
> @@ -24,7 +24,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  
>  static void nand_hwcontrol(struct mtd_info *mtdinfo, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	volatile u16 *nCE = (u16 *) CONFIG_SYS_LATCH_ADDR;
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
> diff --git a/board/socrates/nand.c b/board/socrates/nand.c
> index 15e6ea6..a67d812 100644
> --- a/board/socrates/nand.c
> +++ b/board/socrates/nand.c
> @@ -48,7 +48,7 @@ static void sc_nand_write_byte(struct mtd_info *mtd, u_char byte)
>  static void sc_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
>  {
>  	int i;
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	for (i = 0; i < len; i++) {
>  		out_be32(this->IO_ADDR_W,
> @@ -88,7 +88,7 @@ static u16 sc_nand_read_word(struct mtd_info *mtd)
>  static void sc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  {
>  	int i;
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int val;
>  
>  	val = (state & FPGA_NAND_ENABLE) | FPGA_NAND_CMD_READ;
> @@ -105,7 +105,7 @@ static void sc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>   */
>  static int sc_nand_device_ready(struct mtd_info *mtdinfo)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  
>  	if (in_be32(this->IO_ADDR_W) & FPGA_NAND_BUSY)
>  		return 0; /* busy */
> diff --git a/board/xes/common/actl_nand.c b/board/xes/common/actl_nand.c
> index bf896fe..d1f3668 100644
> --- a/board/xes/common/actl_nand.c
> +++ b/board/xes/common/actl_nand.c
> @@ -16,7 +16,7 @@
>   */
>  static void nand_addr_hwcontrol(struct mtd_info *mtd, int cmd, uint ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	ulong IO_ADDR_W;
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
> diff --git a/cmd/nand.c b/cmd/nand.c
> index f1d5a11..583a18f 100644
> --- a/cmd/nand.c
> +++ b/cmd/nand.c
> @@ -159,7 +159,7 @@ static void do_nand_status(struct mtd_info *mtd)
>  	ulong off;
>  	int last_status = -1;
>  
> -	struct nand_chip *nand_chip = mtd->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
>  	/* check the WP bit */
>  	nand_chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
>  	printf("device is %swrite protected\n",
> @@ -285,7 +285,7 @@ usage:
>  static void nand_print_and_set_info(int idx)
>  {
>  	struct mtd_info *mtd = nand_info[idx];
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	printf("Device %d: ", idx);
>  	if (chip->numchips > 1)
> diff --git a/drivers/mtd/nand/am335x_spl_bch.c b/drivers/mtd/nand/am335x_spl_bch.c
> index 2b6fcda..04d5a80 100644
> --- a/drivers/mtd/nand/am335x_spl_bch.c
> +++ b/drivers/mtd/nand/am335x_spl_bch.c
> @@ -30,7 +30,7 @@ static struct nand_chip nand_chip;
>  static int nand_command(int block, int page, uint32_t offs,
>  	u8 cmd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int page_addr = page + block * CONFIG_SYS_NAND_PAGE_COUNT;
>  	void (*hwctrl)(struct mtd_info *mtd, int cmd,
>  			unsigned int ctrl) = this->cmd_ctrl;
> @@ -100,7 +100,7 @@ static int nand_command(int block, int page, uint32_t offs,
>  
>  static int nand_is_bad_block(int block)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	nand_command(block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS,
>  		NAND_CMD_READOOB);
> @@ -121,7 +121,7 @@ static int nand_is_bad_block(int block)
>  
>  static int nand_read_page(int block, int page, void *dst)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_char ecc_calc[ECCTOTAL];
>  	u_char ecc_code[ECCTOTAL];
>  	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
> diff --git a/drivers/mtd/nand/arasan_nfc.c b/drivers/mtd/nand/arasan_nfc.c
> index 4015399..ef8ae04 100644
> --- a/drivers/mtd/nand/arasan_nfc.c
> +++ b/drivers/mtd/nand/arasan_nfc.c
> @@ -230,7 +230,7 @@ static void arasan_nand_enable_ecc(void)
>  static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd)
>  {
>  	u8 addrcycles;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	switch (curr_cmd->addr_cycles) {
>  	case NAND_ADDR_CYCL_NONE:
> @@ -264,7 +264,7 @@ static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd)
>  
>  static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 reg_val, i, pktsize, pktnum;
>  	u32 *bufptr = (u32 *)buf;
>  	u32 timeout;
> @@ -441,7 +441,7 @@ static int arasan_nand_write_page_hwecc(struct mtd_info *mtd,
>  	u32 size = mtd->writesize;
>  	u32 rdcount = 0;
>  	u8 column_addr_cycles;
> -	struct arasan_nand_info *nand = chip->priv;
> +	struct arasan_nand_info *nand = nand_get_controller_data(chip);
>  
>  	if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
>  		pktsize = ARASAN_NAND_PKTSIZE_1K;
> @@ -944,7 +944,7 @@ static void arasan_nand_read_buf(struct mtd_info *mtd, u8 *buf, int size)
>  
>  static u8 arasan_nand_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 size;
>  	u8 val;
>  	struct nand_onfi_params *p;
> @@ -976,8 +976,8 @@ static void arasan_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
>  				     int column, int page_addr)
>  {
>  	u32 i, ret = 0;
> -	struct nand_chip *chip = mtd->priv;
> -	struct arasan_nand_info *nand = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct arasan_nand_info *nand = nand_get_controller_data(chip);
>  
>  	curr_cmd = NULL;
>  	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
> @@ -1033,7 +1033,7 @@ static int arasan_nand_ecc_init(struct mtd_info *mtd)
>  {
>  	int found = -1;
>  	u32 regval, eccpos_start, i;
> -	struct nand_chip *nand_chip = mtd->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
>  
>  	nand_chip->ecc.mode = NAND_ECC_HW;
>  	nand_chip->ecc.hwctl = NULL;
> @@ -1101,9 +1101,8 @@ static int arasan_nand_init(struct nand_chip *nand_chip, int devnum)
>  	}
>  
>  	nand->nand_base = arasan_nand_base;
> -	mtd = &nand_chip->mtd;
> -	nand_chip->priv = nand;
> -	mtd->priv = nand_chip;
> +	mtd = nand_to_mtd(nand_chip);
> +	nand_set_controller_data(nand_chip, nand);
>  
>  	/* Set the driver entry points for MTD */
>  	nand_chip->cmdfunc = arasan_nand_cmd_function;
> diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
> index 9c2cb44..b1adff0 100644
> --- a/drivers/mtd/nand/atmel_nand.c
> +++ b/drivers/mtd/nand/atmel_nand.c
> @@ -160,8 +160,8 @@ static int pmecc_data_alloc(struct atmel_nand_host *host)
>  
>  static void pmecc_gen_syndrome(struct mtd_info *mtd, int sector)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	int i;
>  	uint32_t value;
>  
> @@ -177,8 +177,8 @@ static void pmecc_gen_syndrome(struct mtd_info *mtd, int sector)
>  
>  static void pmecc_substitute(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	int16_t __iomem *alpha_to = host->pmecc_alpha_to;
>  	int16_t __iomem *index_of = host->pmecc_index_of;
>  	int16_t *partial_syn = host->pmecc_partial_syn;
> @@ -227,8 +227,8 @@ static void pmecc_substitute(struct mtd_info *mtd)
>   */
>  static void pmecc_get_sigma(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  
>  	int16_t *lmu = host->pmecc_lmu;
>  	int16_t *si = host->pmecc_si;
> @@ -383,8 +383,8 @@ static void pmecc_get_sigma(struct mtd_info *mtd)
>  
>  static int pmecc_err_location(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	const int cap = host->pmecc_corr_cap;
>  	const int num = 2 * cap + 1;
>  	int sector_size = host->pmecc_sector_size;
> @@ -437,8 +437,8 @@ static int pmecc_err_location(struct mtd_info *mtd)
>  static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,
>  		int sector_num, int extra_bytes, int err_nbr)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	int i = 0;
>  	int byte_pos, bit_pos, sector_size, pos;
>  	uint32_t tmp;
> @@ -483,8 +483,8 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,
>  static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf,
>  	u8 *ecc)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	int i, err_nbr, eccbytes;
>  	uint8_t *buf_pos;
>  
> @@ -529,7 +529,7 @@ normal_check:
>  static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
>  	struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
>  {
> -	struct atmel_nand_host *host = chip->priv;
> +	struct atmel_nand_host *host = nand_get_controller_data(chip);
>  	int eccsize = chip->ecc.size;
>  	uint8_t *oob = chip->oob_poi;
>  	uint32_t *eccpos = chip->ecc.layout->eccpos;
> @@ -571,7 +571,7 @@ static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
>  		struct nand_chip *chip, const uint8_t *buf,
>  		int oob_required)
>  {
> -	struct atmel_nand_host *host = chip->priv;
> +	struct atmel_nand_host *host = nand_get_controller_data(chip);
>  	uint32_t *eccpos = chip->ecc.layout->eccpos;
>  	int i, j;
>  	int timeout = PMECC_MAX_TIMEOUT_US;
> @@ -615,8 +615,8 @@ out:
>  
>  static void atmel_pmecc_core_init(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct atmel_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);
>  	uint32_t val = 0;
>  	struct nand_ecclayout *ecc_layout;
>  
> @@ -808,7 +808,8 @@ static int atmel_pmecc_nand_init_params(struct nand_chip *nand,
>  	struct atmel_nand_host *host;
>  	int cap, sector_size;
>  
> -	host = nand->priv = &pmecc_host;
> +	host = &pmecc_host;
> +	nand_set_controller_data(nand, host);
>  
>  	nand->ecc.mode = NAND_ECC_HW;
>  	nand->ecc.calculate = NULL;
> @@ -1080,7 +1081,7 @@ static int atmel_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
>  static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,
>  		u_char *read_ecc, u_char *isnull)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
>  	unsigned int ecc_status;
>  	unsigned int ecc_word, ecc_bit;
>  
> @@ -1207,7 +1208,7 @@ int atmel_hwecc_nand_init_param(struct nand_chip *nand, struct mtd_info *mtd)
>  static void at91_nand_hwcontrol(struct mtd_info *mtd,
>  					 int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
>  		ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
> @@ -1243,7 +1244,7 @@ static struct nand_chip nand_chip;
>  
>  static int nand_command(int block, int page, uint32_t offs, u8 cmd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int page_addr = page + block * CONFIG_SYS_NAND_PAGE_COUNT;
>  	void (*hwctrl)(struct mtd_info *mtd, int cmd,
>  			unsigned int ctrl) = this->cmd_ctrl;
> @@ -1281,7 +1282,7 @@ static int nand_command(int block, int page, uint32_t offs, u8 cmd)
>  
>  static int nand_is_bad_block(int block)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	nand_command(block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS, NAND_CMD_READOOB);
>  
> @@ -1304,7 +1305,7 @@ static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS;
>  
>  static int nand_read_page(int block, int page, void *dst)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_char ecc_calc[ECCTOTAL];
>  	u_char ecc_code[ECCTOTAL];
>  	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
> @@ -1337,7 +1338,7 @@ static int nand_read_page(int block, int page, void *dst)
>  
>  int spl_nand_erase_one(int block, int page)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	void (*hwctrl)(struct mtd_info *mtd, int cmd,
>  			unsigned int ctrl) = this->cmd_ctrl;
>  	int page_addr;
> @@ -1368,7 +1369,7 @@ int spl_nand_erase_one(int block, int page)
>  #else
>  static int nand_read_page(int block, int page, void *dst)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	nand_command(block, page, 0, NAND_CMD_READ0);
>  	atmel_nand_pmecc_read_page(mtd, this, dst, 0, page);
> @@ -1407,7 +1408,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
>  
>  int at91_nand_wait_ready(struct mtd_info *mtd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	udelay(this->chip_delay);
>  
> @@ -1450,7 +1451,6 @@ void nand_init(void)
>  	mtd = &nand_chip.mtd;
>  	mtd->writesize = CONFIG_SYS_NAND_PAGE_SIZE;
>  	mtd->oobsize = CONFIG_SYS_NAND_OOBSIZE;
> -	mtd->priv = &nand_chip;
>  	nand_chip.IO_ADDR_R = (void __iomem *)CONFIG_SYS_NAND_BASE;
>  	nand_chip.IO_ADDR_W = (void __iomem *)CONFIG_SYS_NAND_BASE;
>  	board_nand_init(&nand_chip);
> @@ -1484,9 +1484,8 @@ int atmel_nand_chip_init(int devnum, ulong base_addr)
>  {
>  	int ret;
>  	struct nand_chip *nand = &nand_chip[devnum];
> -	struct mtd_info *mtd = &nand->mtd;
> +	struct mtd_info *mtd = nand_to_mtd(nand);
>  
> -	mtd->priv = nand;
>  	nand->IO_ADDR_R = nand->IO_ADDR_W = (void  __iomem *)base_addr;
>  
>  #ifdef CONFIG_NAND_ECC_BCH
> diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
> index a397074..5e0c7bf 100644
> --- a/drivers/mtd/nand/davinci_nand.c
> +++ b/drivers/mtd/nand/davinci_nand.c
> @@ -54,7 +54,7 @@
>   */
>  static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	const u32 *nand = chip->IO_ADDR_R;
>  
>  	/* Make sure that buf is 32 bit aligned */
> @@ -99,7 +99,7 @@ static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf,
>  				   int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	const u32 *nand = chip->IO_ADDR_W;
>  
>  	/* Make sure that buf is 32 bit aligned */
> @@ -144,7 +144,7 @@ static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf,
>  static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
>  		unsigned int ctrl)
>  {
> -	struct		nand_chip *this = mtd->priv;
> +	struct		nand_chip *this = mtd_to_nand(mtd);
>  	u_int32_t	IO_ADDR_W = (u_int32_t)this->IO_ADDR_W;
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
> @@ -223,7 +223,7 @@ static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
>  static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat,
>  		u_char *read_ecc, u_char *calc_ecc)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_int32_t ecc_nand = read_ecc[0] | (read_ecc[1] << 8) |
>  					  (read_ecc[2] << 16);
>  	u_int32_t ecc_calc = calc_ecc[0] | (calc_ecc[1] << 8) |
> diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
> index 13d10ae..d9bcd72 100644
> --- a/drivers/mtd/nand/denali.c
> +++ b/drivers/mtd/nand/denali.c
> @@ -48,7 +48,8 @@ static int onfi_timing_mode = NAND_DEFAULT_TIMINGS;
>   * this macro allows us to convert from an MTD structure to our own
>   * device context (denali) structure.
>   */
> -#define mtd_to_denali(m) container_of(m->priv, struct denali_nand_info, nand)
> +#define mtd_to_denali(m) \
> +	container_of(mtd_to_nand(m), struct denali_nand_info, nand)
>  
>  /*
>   * These constants are defined by the driver to enable common driver
> @@ -1179,7 +1180,6 @@ static int denali_init(struct denali_nand_info *denali)
>  
>  	denali->mtd->name = "denali-nand";
>  	denali->mtd->owner = THIS_MODULE;
> -	denali->mtd->priv = &denali->nand;
>  
>  	/* register the driver with the NAND core subsystem */
>  	denali->nand.select_chip = denali_select_chip;
> diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
> index 523aee3..aafff67 100644
> --- a/drivers/mtd/nand/fsl_elbc_nand.c
> +++ b/drivers/mtd/nand/fsl_elbc_nand.c
> @@ -154,8 +154,8 @@ static struct nand_bbt_descr bbt_mirror_descr = {
>   */
>  static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	fsl_lbc_t *lbc = ctrl->regs;
>  	int buf_num;
> @@ -194,8 +194,8 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
>   */
>  static int fsl_elbc_run_command(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	fsl_lbc_t *lbc = ctrl->regs;
>  	u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
> @@ -246,7 +246,7 @@ static int fsl_elbc_run_command(struct mtd_info *mtd)
>  
>  static void fsl_elbc_do_read(struct nand_chip *chip, int oob)
>  {
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	fsl_lbc_t *lbc = ctrl->regs;
>  
> @@ -279,8 +279,8 @@ static void fsl_elbc_do_read(struct nand_chip *chip, int oob)
>  static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
>  			     int column, int page_addr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	fsl_lbc_t *lbc = ctrl->regs;
>  
> @@ -489,8 +489,8 @@ static void fsl_elbc_select_chip(struct mtd_info *mtd, int chip)
>   */
>  static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	unsigned int bufsize = mtd->writesize + mtd->oobsize;
>  
> @@ -526,8 +526,8 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
>   */
>  static u8 fsl_elbc_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  
>  	/* If there are still bytes in the FCM, then use the next byte. */
> @@ -543,8 +543,8 @@ static u8 fsl_elbc_read_byte(struct mtd_info *mtd)
>   */
>  static void fsl_elbc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	int avail;
>  
> @@ -566,7 +566,7 @@ static void fsl_elbc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
>   */
>  static int fsl_elbc_wait(struct mtd_info *mtd, struct nand_chip *chip)
>  {
> -	struct fsl_elbc_mtd *priv = chip->priv;
> +	struct fsl_elbc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_elbc_ctrl *ctrl = priv->ctrl;
>  	fsl_lbc_t *lbc = ctrl->regs;
>  
> @@ -697,8 +697,7 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
>  	}
>  
>  	nand = &priv->chip;
> -	mtd = &nand->mtd;
> -	mtd->priv = nand;
> +	mtd = nand_to_mtd(nand);
>  
>  	elbc_ctrl->chips[priv->bank] = priv;
>  
> @@ -720,7 +719,7 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
>  	nand->bbt_options = NAND_BBT_USE_FLASH;
>  
>  	nand->controller = &elbc_ctrl->controller;
> -	nand->priv = priv;
> +	nand_set_controller_data(nand, priv);
>  
>  	nand->ecc.read_page = fsl_elbc_read_page;
>  	nand->ecc.write_page = fsl_elbc_write_page;
> diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
> index d5fd3ee..f28602e 100644
> --- a/drivers/mtd/nand/fsl_ifc_nand.c
> +++ b/drivers/mtd/nand/fsl_ifc_nand.c
> @@ -222,8 +222,8 @@ static struct nand_bbt_descr bbt_mirror_descr = {
>   */
>  static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
>  	int buf_num;
> @@ -247,8 +247,8 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
>  static int is_blank(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
>  		    unsigned int bufnum)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize * 2);
>  	u32 __iomem *main = (u32 *)addr;
>  	u8 __iomem *oob = addr + mtd->writesize;
> @@ -286,8 +286,8 @@ static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
>   */
>  static int fsl_ifc_run_command(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
>  	u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
> @@ -367,7 +367,7 @@ static void fsl_ifc_do_read(struct nand_chip *chip,
>  			    int oob,
>  			    struct mtd_info *mtd)
>  {
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
>  
> @@ -404,8 +404,8 @@ static void fsl_ifc_do_read(struct nand_chip *chip,
>  static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
>  			     int column, int page_addr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
>  
> @@ -607,8 +607,8 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
>   */
>  static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	unsigned int bufsize = mtd->writesize + mtd->oobsize;
>  
> @@ -635,8 +635,8 @@ static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
>   */
>  static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	unsigned int offset;
>  
> @@ -659,8 +659,8 @@ static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
>   */
>  static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	uint16_t data;
>  
> @@ -683,8 +683,8 @@ static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
>   */
>  static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	int avail;
>  
> @@ -706,7 +706,7 @@ static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
>   */
>  static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
>  {
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  	struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
>  	u32 nand_fsr;
> @@ -739,7 +739,7 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
>  static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
>  			     uint8_t *buf, int oob_required, int page)
>  {
> -	struct fsl_ifc_mtd *priv = chip->priv;
> +	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
>  	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
>  
>  	fsl_ifc_read_buf(mtd, buf, mtd->writesize);
> @@ -925,8 +925,7 @@ static int fsl_ifc_chip_init(int devnum, u8 *addr)
>  	}
>  
>  	nand = &priv->chip;
> -	mtd = &nand->mtd;
> -	mtd->priv = nand;
> +	mtd = nand_to_mtd(nand);
>  
>  	ifc_ctrl->chips[priv->bank] = priv;
>  
> @@ -955,7 +954,7 @@ static int fsl_ifc_chip_init(int devnum, u8 *addr)
>  	}
>  
>  	nand->controller = &ifc_ctrl->controller;
> -	nand->priv = priv;
> +	nand_set_controller_data(nand, priv);
>  
>  	nand->ecc.read_page = fsl_ifc_read_page;
>  	nand->ecc.write_page = fsl_ifc_write_page;
> diff --git a/drivers/mtd/nand/fsl_upm.c b/drivers/mtd/nand/fsl_upm.c
> index 5426c32..d2b3881 100644
> --- a/drivers/mtd/nand/fsl_upm.c
> +++ b/drivers/mtd/nand/fsl_upm.c
> @@ -64,8 +64,8 @@ static void fun_wait(struct fsl_upm_nand *fun)
>  #if CONFIG_SYS_NAND_MAX_CHIPS > 1
>  static void fun_select_chip(struct mtd_info *mtd, int chip_nr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_upm_nand *fun = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_upm_nand *fun = nand_get_controller_data(chip);
>  
>  	if (chip_nr >= 0) {
>  		fun->chip_nr = chip_nr;
> @@ -79,8 +79,8 @@ static void fun_select_chip(struct mtd_info *mtd, int chip_nr)
>  
>  static void fun_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_upm_nand *fun = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_upm_nand *fun = nand_get_controller_data(chip);
>  	void __iomem *io_addr;
>  	u32 mar;
>  
> @@ -123,7 +123,7 @@ static void fun_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  
>  static u8 upm_nand_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	return in_8(chip->IO_ADDR_R);
>  }
> @@ -131,8 +131,8 @@ static u8 upm_nand_read_byte(struct mtd_info *mtd)
>  static void upm_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
>  {
>  	int i;
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_upm_nand *fun = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_upm_nand *fun = nand_get_controller_data(chip);
>  
>  	for (i = 0; i < len; i++) {
>  		out_8(chip->IO_ADDR_W, buf[i]);
> @@ -147,7 +147,7 @@ static void upm_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
>  static void upm_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  {
>  	int i;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	for (i = 0; i < len; i++)
>  		buf[i] = in_8(chip->IO_ADDR_R);
> @@ -155,8 +155,8 @@ static void upm_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  
>  static int nand_dev_ready(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct fsl_upm_nand *fun = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct fsl_upm_nand *fun = nand_get_controller_data(chip);
>  
>  	return fun->dev_ready(fun->chip_nr);
>  }
> @@ -168,7 +168,7 @@ int fsl_upm_nand_init(struct nand_chip *chip, struct fsl_upm_nand *fun)
>  
>  	fun->last_ctrl = NAND_CLE;
>  
> -	chip->priv = fun;
> +	nand_set_controller_data(chip, fun);
>  	chip->chip_delay = fun->chip_delay;
>  	chip->ecc.mode = NAND_ECC_SOFT;
>  	chip->cmd_ctrl = fun_cmd_ctrl;
> diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
> index 0b8b56f..a1f2cba 100644
> --- a/drivers/mtd/nand/fsmc_nand.c
> +++ b/drivers/mtd/nand/fsmc_nand.c
> @@ -165,7 +165,7 @@ static int count_written_bits(uint8_t *buff, int size, int max_bits)
>  
>  static void fsmc_nand_hwcontrol(struct mtd_info *mtd, int cmd, uint ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	ulong IO_ADDR_W;
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
> @@ -410,7 +410,7 @@ int fsmc_nand_switch_ecc(uint32_t eccstrength)
>  	 * function, as it doesn't need to switch to a different ECC layout.
>  	 */
>  	mtd = nand_info[nand_curr_device];
> -	nand = mtd->priv;
> +	nand = mtd_to_nand(mtd);
>  
>  	/* Setup the ecc configurations again */
>  	if (eccstrength == 1) {
> @@ -479,8 +479,7 @@ int fsmc_nand_init(struct nand_chip *nand)
>  		(void  __iomem *)CONFIG_SYS_NAND_BASE;
>  	nand->badblockbits = 7;
>  
> -	mtd = &nand->mtd;
> -	mtd->priv = nand;
> +	mtd = nand_to_mtd(nand);
>  
>  	switch (fsmc_version) {
>  	case FSMC_VER8:
> diff --git a/drivers/mtd/nand/kb9202_nand.c b/drivers/mtd/nand/kb9202_nand.c
> index 22c5625..e978cf8 100644
> --- a/drivers/mtd/nand/kb9202_nand.c
> +++ b/drivers/mtd/nand/kb9202_nand.c
> @@ -35,7 +35,7 @@
>   */
>  static void kb9202_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	if (ctrl & NAND_CTRL_CHANGE) {
>  		ulong IO_ADDR_W = (ulong) this->IO_ADDR_W;
> diff --git a/drivers/mtd/nand/kirkwood_nand.c b/drivers/mtd/nand/kirkwood_nand.c
> index d734113..d0a68bd 100644
> --- a/drivers/mtd/nand/kirkwood_nand.c
> +++ b/drivers/mtd/nand/kirkwood_nand.c
> @@ -33,7 +33,7 @@ static u32 nand_mpp_backup[9] = { 0 };
>  static void kw_nand_hwcontrol(struct mtd_info *mtd, int cmd,
>  			      unsigned int ctrl)
>  {
> -	struct nand_chip *nc = mtd->priv;
> +	struct nand_chip *nc = mtd_to_nand(mtd);
>  	u32 offs;
>  
>  	if (cmd == NAND_CMD_NONE)
> diff --git a/drivers/mtd/nand/lpc32xx_nand_mlc.c b/drivers/mtd/nand/lpc32xx_nand_mlc.c
> index 236b0be..9475208 100644
> --- a/drivers/mtd/nand/lpc32xx_nand_mlc.c
> +++ b/drivers/mtd/nand/lpc32xx_nand_mlc.c
> @@ -542,8 +542,6 @@ void board_nand_init(void)
>  	struct mtd_info *mtd = &lpc32xx_chip.mtd;
>  	int ret;
>  
> -	mtd->priv = &lpc32xx_chip;
> -
>  	/* Set all BOARDSPECIFIC (actually core-specific) fields  */
>  
>  	lpc32xx_chip.IO_ADDR_R = &lpc32xx_nand_mlc_registers->buff;
> diff --git a/drivers/mtd/nand/lpc32xx_nand_slc.c b/drivers/mtd/nand/lpc32xx_nand_slc.c
> index 4e1be36..89b48cb 100644
> --- a/drivers/mtd/nand/lpc32xx_nand_slc.c
> +++ b/drivers/mtd/nand/lpc32xx_nand_slc.c
> @@ -291,7 +291,7 @@ static void lpc32xx_nand_dma_configure(struct nand_chip *chip,
>  static void lpc32xx_nand_xfer(struct mtd_info *mtd, const u8 *buf,
>  			      int len, int read)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 config;
>  	int ret;
>  
> diff --git a/drivers/mtd/nand/mpc5121_nfc.c b/drivers/mtd/nand/mpc5121_nfc.c
> index d836130..362d393 100644
> --- a/drivers/mtd/nand/mpc5121_nfc.c
> +++ b/drivers/mtd/nand/mpc5121_nfc.c
> @@ -117,8 +117,8 @@ static void mpc5121_nfc_done(struct mtd_info *mtd);
>  /* Read NFC register */
>  static inline u16 nfc_read(struct mtd_info *mtd, uint reg)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mpc5121_nfc_prv *prv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mpc5121_nfc_prv *prv = nand_get_controller_data(chip);
>  
>  	return in_be16(prv->regs + reg);
>  }
> @@ -126,8 +126,8 @@ static inline u16 nfc_read(struct mtd_info *mtd, uint reg)
>  /* Write NFC register */
>  static inline void nfc_write(struct mtd_info *mtd, uint reg, u16 val)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mpc5121_nfc_prv *prv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mpc5121_nfc_prv *prv = nand_get_controller_data(chip);
>  
>  	out_be16(prv->regs + reg, val);
>  }
> @@ -211,7 +211,7 @@ static void mpc5121_nfc_done(struct mtd_info *mtd)
>  /* Do address cycle(s) */
>  static void mpc5121_nfc_addr_cycle(struct mtd_info *mtd, int column, int page)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 pagemask = chip->pagemask;
>  
>  	if (column != -1) {
> @@ -283,8 +283,8 @@ static int mpc5121_nfc_dev_ready(struct mtd_info *mtd)
>  static void mpc5121_nfc_command(struct mtd_info *mtd, unsigned command,
>  				int column, int page)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mpc5121_nfc_prv *prv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mpc5121_nfc_prv *prv = nand_get_controller_data(chip);
>  
>  	prv->column = (column >= 0) ? column : 0;
>  	prv->spareonly = 0;
> @@ -357,8 +357,8 @@ static void mpc5121_nfc_command(struct mtd_info *mtd, unsigned command,
>  static void mpc5121_nfc_copy_spare(struct mtd_info *mtd, uint offset,
>  				   u8 * buffer, uint size, int wr)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mpc5121_nfc_prv *prv = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mpc5121_nfc_prv *prv = nand_get_controller_data(nand);
>  	uint o, s, sbsize, blksize;
>  
>  	/*
> @@ -410,8 +410,8 @@ static void mpc5121_nfc_copy_spare(struct mtd_info *mtd, uint offset,
>  static void mpc5121_nfc_buf_copy(struct mtd_info *mtd, u_char * buf, int len,
>  				 int wr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mpc5121_nfc_prv *prv = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mpc5121_nfc_prv *prv = nand_get_controller_data(chip);
>  	uint c = prv->column;
>  	uint l;
>  
> @@ -489,7 +489,7 @@ static u16 mpc5121_nfc_read_word(struct mtd_info *mtd)
>  static int mpc5121_nfc_read_hw_config(struct mtd_info *mtd)
>  {
>  	immap_t *im = (immap_t *)CONFIG_SYS_IMMR;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	uint rcw_pagesize = 0;
>  	uint rcw_sparesize = 0;
>  	uint rcw_width;
> @@ -568,8 +568,7 @@ int board_nand_init(struct nand_chip *chip)
>  	}
>  
>  	mtd = &chip->mtd;
> -	mtd->priv = chip;
> -	chip->priv = prv;
> +	nand_set_controller_data(chip, prv);
>  
>  	/* Read NFC configuration from Reset Config Word */
>  	retval = mpc5121_nfc_read_hw_config(mtd);
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index 5e7b9cf..f935055 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -351,8 +351,8 @@ static int mxc_nand_dev_ready(struct mtd_info *mtd)
>  
>  static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  #if defined(MXC_NFC_V1) || defined(MXC_NFC_V2_1)
>  	uint16_t tmp = readnfc(&host->regs->config1);
>  
> @@ -386,7 +386,7 @@ static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
>  				      struct nand_chip *chip,
>  				      int page)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	uint8_t *buf = chip->oob_poi;
>  	int length = mtd->oobsize;
>  	int eccpitch = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
> @@ -441,7 +441,7 @@ static int mxc_nand_read_page_raw_syndrome(struct mtd_info *mtd,
>  					   int oob_required,
>  					   int page)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	int eccsize = chip->ecc.size;
>  	int eccbytes = chip->ecc.bytes;
>  	int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
> @@ -486,7 +486,7 @@ static int mxc_nand_read_page_syndrome(struct mtd_info *mtd,
>  				       int oob_required,
>  				       int page)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	int n, eccsize = chip->ecc.size;
>  	int eccbytes = chip->ecc.bytes;
>  	int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
> @@ -550,7 +550,7 @@ static int mxc_nand_read_page_syndrome(struct mtd_info *mtd,
>  static int mxc_nand_write_oob_syndrome(struct mtd_info *mtd,
>  				       struct nand_chip *chip, int page)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	int eccpitch = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad;
>  	int length = mtd->oobsize;
>  	int i, len, status, steps = chip->ecc.steps;
> @@ -578,7 +578,7 @@ static int mxc_nand_write_page_raw_syndrome(struct mtd_info *mtd,
>  					     const uint8_t *buf,
>  					     int oob_required)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	int eccsize = chip->ecc.size;
>  	int eccbytes = chip->ecc.bytes;
>  	int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
> @@ -618,7 +618,7 @@ static int mxc_nand_write_page_syndrome(struct mtd_info *mtd,
>  					 const uint8_t *buf,
>  					 int oob_required)
>  {
> -	struct mxc_nand_host *host = chip->priv;
> +	struct mxc_nand_host *host = nand_get_controller_data(chip);
>  	int i, n, eccsize = chip->ecc.size;
>  	int eccbytes = chip->ecc.bytes;
>  	int eccpitch = eccbytes + chip->ecc.prepad + chip->ecc.postpad;
> @@ -661,8 +661,8 @@ static int mxc_nand_write_page_syndrome(struct mtd_info *mtd,
>  static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
>  				 u_char *read_ecc, u_char *calc_ecc)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  	uint32_t ecc_status = readl(&host->regs->ecc_status_result);
>  	int subpages = mtd->writesize / nand_chip->subpagesize;
>  	int pg2blk_shift = nand_chip->phys_erase_shift -
> @@ -700,8 +700,8 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
>  static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
>  				 u_char *read_ecc, u_char *calc_ecc)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  
>  	/*
>  	 * 1-Bit errors are automatically corrected in HW.  No need for
> @@ -729,8 +729,8 @@ static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
>  
>  static u_char mxc_nand_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  	uint8_t ret = 0;
>  	uint16_t col;
>  	uint16_t __iomem *main_buf =
> @@ -769,8 +769,8 @@ static u_char mxc_nand_read_byte(struct mtd_info *mtd)
>  
>  static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  	uint16_t col, ret;
>  	uint16_t __iomem *p;
>  
> @@ -821,8 +821,8 @@ static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
>  static void mxc_nand_write_buf(struct mtd_info *mtd,
>  				const u_char *buf, int len)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  	int n, col, i = 0;
>  
>  	MTDDEBUG(MTD_DEBUG_LEVEL3,
> @@ -895,8 +895,8 @@ static void mxc_nand_write_buf(struct mtd_info *mtd,
>   */
>  static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  	int n, col, i = 0;
>  
>  	MTDDEBUG(MTD_DEBUG_LEVEL3,
> @@ -955,8 +955,8 @@ static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>   */
>  static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  
>  	switch (chip) {
>  	case -1:
> @@ -982,8 +982,8 @@ static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
>  void mxc_nand_command(struct mtd_info *mtd, unsigned command,
>  				int column, int page_addr)
>  {
> -	struct nand_chip *nand_chip = mtd->priv;
> -	struct mxc_nand_host *host = nand_chip->priv;
> +	struct nand_chip *nand_chip = mtd_to_nand(mtd);
> +	struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
>  
>  	MTDDEBUG(MTD_DEBUG_LEVEL3,
>  	      "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
> @@ -1165,13 +1165,12 @@ int board_nand_init(struct nand_chip *this)
>  
>  	/* structures must be linked */
>  	mtd = &this->mtd;
> -	mtd->priv = this;
>  	host->nand = this;
>  
>  	/* 5 us command delay time */
>  	this->chip_delay = 5;
>  
> -	this->priv = host;
> +	nand_set_controller_data(this, host);
>  	this->dev_ready = mxc_nand_dev_ready;
>  	this->cmdfunc = mxc_nand_command;
>  	this->select_chip = mxc_nand_select_chip;
> diff --git a/drivers/mtd/nand/mxs_nand.c b/drivers/mtd/nand/mxs_nand.c
> index b5bbd88..7053ff2 100644
> --- a/drivers/mtd/nand/mxs_nand.c
> +++ b/drivers/mtd/nand/mxs_nand.c
> @@ -264,8 +264,8 @@ static int mxs_nand_wait_for_bch_complete(void)
>   */
>  static void mxs_nand_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_dma_desc *d;
>  	uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
>  	int ret;
> @@ -343,8 +343,8 @@ static void mxs_nand_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
>   */
>  static int mxs_nand_device_ready(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mxs_nand_info *nand_info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(chip);
>  	struct mxs_gpmi_regs *gpmi_regs =
>  		(struct mxs_gpmi_regs *)MXS_GPMI_BASE;
>  	uint32_t tmp;
> @@ -360,8 +360,8 @@ static int mxs_nand_device_ready(struct mtd_info *mtd)
>   */
>  static void mxs_nand_select_chip(struct mtd_info *mtd, int chip)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  
>  	nand_info->cur_chip = chip;
>  }
> @@ -410,8 +410,8 @@ static void mxs_nand_swap_block_mark(struct mtd_info *mtd,
>   */
>  static void mxs_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int length)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_dma_desc *d;
>  	uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
>  	int ret;
> @@ -494,8 +494,8 @@ rtn:
>  static void mxs_nand_write_buf(struct mtd_info *mtd, const uint8_t *buf,
>  				int length)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_dma_desc *d;
>  	uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
>  	int ret;
> @@ -559,7 +559,7 @@ static int mxs_nand_ecc_read_page(struct mtd_info *mtd, struct nand_chip *nand,
>  					uint8_t *buf, int oob_required,
>  					int page)
>  {
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_dma_desc *d;
>  	uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
>  	uint32_t corrected = 0, failed = 0;
> @@ -709,7 +709,7 @@ static int mxs_nand_ecc_write_page(struct mtd_info *mtd,
>  				struct nand_chip *nand, const uint8_t *buf,
>  				int oob_required)
>  {
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_dma_desc *d;
>  	uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
>  	int ret;
> @@ -775,8 +775,8 @@ rtn:
>  static int mxs_nand_hook_read_oob(struct mtd_info *mtd, loff_t from,
>  					struct mtd_oob_ops *ops)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mxs_nand_info *nand_info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(chip);
>  	int ret;
>  
>  	if (ops->mode == MTD_OPS_RAW)
> @@ -800,8 +800,8 @@ static int mxs_nand_hook_read_oob(struct mtd_info *mtd, loff_t from,
>  static int mxs_nand_hook_write_oob(struct mtd_info *mtd, loff_t to,
>  					struct mtd_oob_ops *ops)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mxs_nand_info *nand_info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(chip);
>  	int ret;
>  
>  	if (ops->mode == MTD_OPS_RAW)
> @@ -824,8 +824,8 @@ static int mxs_nand_hook_write_oob(struct mtd_info *mtd, loff_t to,
>   */
>  static int mxs_nand_hook_block_markbad(struct mtd_info *mtd, loff_t ofs)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct mxs_nand_info *nand_info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(chip);
>  	int ret;
>  
>  	nand_info->marking_block_bad = 1;
> @@ -884,7 +884,7 @@ static int mxs_nand_hook_block_markbad(struct mtd_info *mtd, loff_t ofs)
>  static int mxs_nand_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *nand,
>  				int page)
>  {
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  
>  	/*
>  	 * First, fill in the OOB buffer. If we're doing a raw read, we need to
> @@ -919,7 +919,7 @@ static int mxs_nand_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *nand,
>  static int mxs_nand_ecc_write_oob(struct mtd_info *mtd, struct nand_chip *nand,
>  					int page)
>  {
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	uint8_t block_mark = 0;
>  
>  	/*
> @@ -982,8 +982,8 @@ static int mxs_nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
>   */
>  static int mxs_nand_scan_bbt(struct mtd_info *mtd)
>  {
> -	struct nand_chip *nand = mtd->priv;
> -	struct mxs_nand_info *nand_info = nand->priv;
> +	struct nand_chip *nand = mtd_to_nand(mtd);
> +	struct mxs_nand_info *nand_info = nand_get_controller_data(nand);
>  	struct mxs_bch_regs *bch_regs = (struct mxs_bch_regs *)MXS_BCH_BASE;
>  	uint32_t tmp;
>  
> @@ -1175,7 +1175,7 @@ int board_nand_init(struct nand_chip *nand)
>  
>  	memset(&fake_ecc_layout, 0, sizeof(fake_ecc_layout));
>  
> -	nand->priv = nand_info;
> +	nand_set_controller_data(nand, nand_info);
>  	nand->options |= NAND_NO_SUBPAGE_WRITE;
>  
>  	nand->cmd_ctrl		= mxs_nand_cmd_ctrl;
> diff --git a/drivers/mtd/nand/mxs_nand_spl.c b/drivers/mtd/nand/mxs_nand_spl.c
> index 0b3a604..a8a3084 100644
> --- a/drivers/mtd/nand/mxs_nand_spl.c
> +++ b/drivers/mtd/nand/mxs_nand_spl.c
> @@ -14,7 +14,7 @@ static struct nand_chip nand_chip;
>  static void mxs_nand_command(struct mtd_info *mtd, unsigned int command,
>  			     int column, int page_addr)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 timeo, time_start;
>  
>  	/* write out the command to the device */
> @@ -51,7 +51,7 @@ static void mxs_nand_command(struct mtd_info *mtd, unsigned int command,
>  
>  static int mxs_flash_ident(struct mtd_info *mtd)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	int i;
>  	u8 mfg_id, dev_id;
>  	u8 id_data[8];
> @@ -111,7 +111,7 @@ static int mxs_flash_ident(struct mtd_info *mtd)
>  
>  static int mxs_read_page_ecc(struct mtd_info *mtd, void *buf, unsigned int page)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	int ret;
>  
>  	chip->cmdfunc(mtd, NAND_CMD_READ0, 0x0, page);
> @@ -125,7 +125,7 @@ static int mxs_read_page_ecc(struct mtd_info *mtd, void *buf, unsigned int page)
>  
>  static int is_badblock(struct mtd_info *mtd, loff_t offs, int allowbbt)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	unsigned int block = offs >> chip->phys_erase_shift;
>  	unsigned int page = offs >> chip->page_shift;
>  
> @@ -148,7 +148,6 @@ static int mxs_nand_init(void)
>  	/* init mxs nand driver */
>  	board_nand_init(&nand_chip);
>  	mtd = &nand_chip.mtd;
> -	mtd->priv = &nand_chip;
>  	/* set mtd functions */
>  	nand_chip.cmdfunc = mxs_nand_command;
>  	nand_chip.numchips = 1;
> @@ -181,7 +180,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *buf)
>  
>  	if (mxs_nand_init())
>  		return -ENODEV;
> -	chip = mtd->priv;
> +	chip = mtd_to_nand(mtd);
>  	page = offs >> chip->page_shift;
>  	nand_page_per_block = mtd->erasesize / mtd->writesize;
>  
> diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
> index ddd8249..f449316 100644
> --- a/drivers/mtd/nand/nand.c
> +++ b/drivers/mtd/nand/nand.c
> @@ -73,14 +73,13 @@ int nand_register(int devnum, struct mtd_info *mtd)
>  static void nand_init_chip(int i)
>  {
>  	struct nand_chip *nand = &nand_chip[i];
> -	struct mtd_info *mtd = &nand->mtd;
> +	struct mtd_info *mtd = nand_to_mtd(nand);
>  	ulong base_addr = base_address[i];
>  	int maxchips = CONFIG_SYS_NAND_MAX_CHIPS;
>  
>  	if (maxchips < 1)
>  		maxchips = 1;
>  
> -	mtd->priv = nand;
>  	nand->IO_ADDR_R = nand->IO_ADDR_W = (void  __iomem *)base_addr;
>  
>  	if (board_nand_init(nand))
> @@ -110,7 +109,7 @@ void nand_init(void)
>  	/*
>  	 * Select the chip in the board/cpu specific driver
>  	 */
> -	board_nand_select_device(nand_info[nand_curr_device]->priv,
> +	board_nand_select_device(mtd_to_nand(nand_info[nand_curr_device]),
>  				 nand_curr_device);
>  #endif
>  }
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index 9e8fc1f..92f581e 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -105,7 +105,7 @@ DEFINE_LED_TRIGGER(nand_led_trigger);
>  static int check_offs_len(struct mtd_info *mtd,
>  					loff_t ofs, uint64_t len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	int ret = 0;
>  
>  	/* Start address must align on block boundary */
> @@ -131,7 +131,7 @@ static int check_offs_len(struct mtd_info *mtd,
>   */
>  static void nand_release_device(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/* De-select the NAND device */
>  	chip->select_chip(mtd, -1);
> @@ -145,7 +145,7 @@ static void nand_release_device(struct mtd_info *mtd)
>   */
>  uint8_t nand_read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	return readb(chip->IO_ADDR_R);
>  }
>  
> @@ -158,7 +158,7 @@ uint8_t nand_read_byte(struct mtd_info *mtd)
>   */
>  static uint8_t nand_read_byte16(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R));
>  }
>  
> @@ -170,7 +170,7 @@ static uint8_t nand_read_byte16(struct mtd_info *mtd)
>   */
>  static u16 nand_read_word(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	return readw(chip->IO_ADDR_R);
>  }
>  
> @@ -183,7 +183,7 @@ static u16 nand_read_word(struct mtd_info *mtd)
>   */
>  static void nand_select_chip(struct mtd_info *mtd, int chipnr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	switch (chipnr) {
>  	case -1:
> @@ -206,7 +206,7 @@ static void nand_select_chip(struct mtd_info *mtd, int chipnr)
>   */
>  static void nand_write_byte(struct mtd_info *mtd, uint8_t byte)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	chip->write_buf(mtd, &byte, 1);
>  }
> @@ -220,7 +220,7 @@ static void nand_write_byte(struct mtd_info *mtd, uint8_t byte)
>   */
>  static void nand_write_byte16(struct mtd_info *mtd, uint8_t byte)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	uint16_t word = byte;
>  
>  	/*
> @@ -287,7 +287,7 @@ static void iowrite16_rep(void *addr, void *buf, int len)
>   */
>  void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	iowrite8_rep(chip->IO_ADDR_W, buf, len);
>  }
> @@ -302,7 +302,7 @@ void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
>   */
>  void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	ioread8_rep(chip->IO_ADDR_R, buf, len);
>  }
> @@ -317,7 +317,7 @@ void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>   */
>  void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u16 *p = (u16 *) buf;
>  
>  	iowrite16_rep(chip->IO_ADDR_W, p, len >> 1);
> @@ -333,7 +333,7 @@ void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
>   */
>  void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u16 *p = (u16 *) buf;
>  
>  	ioread16_rep(chip->IO_ADDR_R, p, len >> 1);
> @@ -350,7 +350,7 @@ void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
>  static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
>  {
>  	int page, chipnr, res = 0, i = 0;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u16 bad;
>  
>  	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
> @@ -410,7 +410,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
>   */
>  static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct mtd_oob_ops ops;
>  	uint8_t buf[2] = { 0, 0 };
>  	int ret = 0, res, i = 0;
> @@ -460,7 +460,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
>  */
>  static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	int res, ret = 0;
>  
>  	if (!(chip->bbt_options & NAND_BBT_NO_OOB_BBM)) {
> @@ -501,7 +501,7 @@ static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs)
>   */
>  static int nand_check_wp(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/* Broken xD cards report WP despite being writable */
>  	if (chip->options & NAND_BROKEN_XD)
> @@ -521,7 +521,7 @@ static int nand_check_wp(struct mtd_info *mtd)
>   */
>  static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	if (!chip->bbt)
>  		return 0;
> @@ -542,7 +542,7 @@ static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs)
>  static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
>  			       int allowbbt)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	if (!(chip->options & NAND_SKIP_BBTSCAN) &&
>  	    !(chip->options & NAND_BBT_SCANNED)) {
> @@ -560,7 +560,7 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
>  /* Wait for the ready pin, after a command. The timeout is caught later. */
>  void nand_wait_ready(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 timeo = (CONFIG_SYS_HZ * 20) / 1000;
>  	u32 time_start;
>  
> @@ -583,7 +583,7 @@ EXPORT_SYMBOL_GPL(nand_wait_ready);
>   */
>  static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	u32 time_start;
>  
>  	timeo = (CONFIG_SYS_HZ * timeo) / 1000;
> @@ -608,7 +608,7 @@ static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo)
>  static void nand_command(struct mtd_info *mtd, unsigned int command,
>  			 int column, int page_addr)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
>  
>  	/* Write out the command to the device */
> @@ -711,7 +711,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int command,
>  static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
>  			    int column, int page_addr)
>  {
> -	register struct nand_chip *chip = mtd->priv;
> +	register struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/* Emulate NAND_CMD_READOOB */
>  	if (command == NAND_CMD_READOOB) {
> @@ -835,7 +835,7 @@ static void panic_nand_get_device(struct nand_chip *chip,
>  static int
>  nand_get_device(struct mtd_info *mtd, int new_state)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	chip->state = new_state;
>  	return 0;
>  }
> @@ -1332,7 +1332,7 @@ static uint8_t *nand_transfer_oob(struct nand_chip *chip, uint8_t *oob,
>   */
>  static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	pr_debug("setting READ RETRY mode %d\n", retry_mode);
>  
> @@ -1357,7 +1357,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
>  			    struct mtd_oob_ops *ops)
>  {
>  	int chipnr, page, realpage, col, bytes, aligned, oob_required;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	int ret = 0;
>  	uint32_t readlen = ops->len;
>  	uint32_t oobreadlen = ops->ooblen;
> @@ -1700,7 +1700,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
>  			    struct mtd_oob_ops *ops)
>  {
>  	int page, realpage, chipnr;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct mtd_ecc_stats stats;
>  	int readlen = ops->ooblen;
>  	int len;
> @@ -2139,7 +2139,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
>  static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len,
>  			      struct mtd_oob_ops *ops)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/*
>  	 * Initialise to all 0xFF, to avoid the possibility of left over OOB
> @@ -2199,7 +2199,7 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
>  			     struct mtd_oob_ops *ops)
>  {
>  	int chipnr, realpage, page, blockmask, column;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	uint32_t writelen = ops->len;
>  
>  	uint32_t oobwritelen = ops->ooblen;
> @@ -2328,7 +2328,7 @@ err_out:
>  static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len,
>  			    size_t *retlen, const uint8_t *buf)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct mtd_oob_ops ops;
>  	int ret;
>  
> @@ -2388,7 +2388,7 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
>  			     struct mtd_oob_ops *ops)
>  {
>  	int chipnr, page, status, len;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	pr_debug("%s: to = 0x%08x, len = %i\n",
>  			 __func__, (unsigned int)to, (int)ops->ooblen);
> @@ -2513,7 +2513,7 @@ out:
>   */
>  static int single_erase(struct mtd_info *mtd, int page)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	/* Send commands to erase a block */
>  	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
>  	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
> @@ -2545,7 +2545,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
>  		    int allowbbt)
>  {
>  	int page, status, pages_per_block, ret, chipnr;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	loff_t len;
>  
>  	pr_debug("%s: start = 0x%012llx, len = %llu\n",
> @@ -2908,7 +2908,7 @@ ext_out:
>  
>  static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {retry_mode};
>  
>  	return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY,
> @@ -3616,7 +3616,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
>  		    struct nand_flash_dev *table)
>  {
>  	int i, nand_maf_id, nand_dev_id;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_flash_dev *type;
>  
>  	/* Set the default functions */
> @@ -3680,7 +3680,7 @@ EXPORT_SYMBOL(nand_scan_ident);
>   */
>  static bool nand_ecc_strength_good(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_ecc_ctrl *ecc = &chip->ecc;
>  	int corr, ds_corr;
>  
> @@ -3709,7 +3709,7 @@ static bool nand_ecc_strength_good(struct mtd_info *mtd)
>  int nand_scan_tail(struct mtd_info *mtd)
>  {
>  	int i;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_ecc_ctrl *ecc = &chip->ecc;
>  	struct nand_buffers *nbuf;
>  
> diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
> index 00f28a4..152f3bc 100644
> --- a/drivers/mtd/nand/nand_bbt.c
> +++ b/drivers/mtd/nand/nand_bbt.c
> @@ -173,7 +173,7 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
>  		struct nand_bbt_descr *td, int offs)
>  {
>  	int res, ret = 0, i, j, act = 0;
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	size_t retlen, len, totlen;
>  	loff_t from;
>  	int bits = td->options & NAND_BBT_NRBITS_MSK;
> @@ -264,7 +264,7 @@ static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
>   */
>  static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int res = 0, i;
>  
>  	if (td->options & NAND_BBT_PERCHIP) {
> @@ -389,7 +389,7 @@ static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
>  static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
>  			  struct nand_bbt_descr *td, struct nand_bbt_descr *md)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	/* Read the primary version, if available */
>  	if (td->options & NAND_BBT_VERSION) {
> @@ -455,7 +455,7 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
>  static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
>  	struct nand_bbt_descr *bd, int chip)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int i, numblocks, numpages;
>  	int startblock;
>  	loff_t from;
> @@ -524,7 +524,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
>   */
>  static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int i, chips;
>  	int startblock, block, dir;
>  	int scanlen = mtd->writesize + mtd->oobsize;
> @@ -619,7 +619,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
>  		     struct nand_bbt_descr *td, struct nand_bbt_descr *md,
>  		     int chipsel)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	struct erase_info einfo;
>  	int i, res, chip = 0;
>  	int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
> @@ -820,7 +820,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
>   */
>  static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	return create_bbt(mtd, this->buffers->databuf, bd, -1);
>  }
> @@ -839,7 +839,7 @@ static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *b
>  static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
>  {
>  	int i, chips, writeops, create, chipsel, res, res2;
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	struct nand_bbt_descr *td = this->bbt_td;
>  	struct nand_bbt_descr *md = this->bbt_md;
>  	struct nand_bbt_descr *rd, *rd2;
> @@ -963,7 +963,7 @@ static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_desc
>   */
>  static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int i, j, chips, block, nrblocks, update;
>  	uint8_t oldval;
>  
> @@ -1023,7 +1023,7 @@ static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
>   */
>  static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u32 pattern_len;
>  	u32 bits;
>  	u32 table_size;
> @@ -1075,7 +1075,7 @@ static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
>   */
>  int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int len, res = 0;
>  	uint8_t *buf;
>  	struct nand_bbt_descr *td = this->bbt_td;
> @@ -1143,7 +1143,7 @@ int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
>   */
>  static int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int len, res = 0;
>  	int chip, chipsel;
>  	uint8_t *buf;
> @@ -1277,7 +1277,7 @@ static int nand_create_badblock_pattern(struct nand_chip *this)
>   */
>  int nand_default_bbt(struct mtd_info *mtd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int ret;
>  
>  	/* Is a flash based bad block table requested? */
> @@ -1313,7 +1313,7 @@ int nand_default_bbt(struct mtd_info *mtd)
>   */
>  int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int block;
>  
>  	block = (int)(offs >> this->bbt_erase_shift);
> @@ -1328,7 +1328,7 @@ int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs)
>   */
>  int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int block, res;
>  
>  	block = (int)(offs >> this->bbt_erase_shift);
> @@ -1355,7 +1355,7 @@ int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
>   */
>  int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int block, ret = 0;
>  
>  	block = (int)(offs >> this->bbt_erase_shift);
> diff --git a/drivers/mtd/nand/nand_bch.c b/drivers/mtd/nand/nand_bch.c
> index 35d2140..d7f6ce0 100644
> --- a/drivers/mtd/nand/nand_bch.c
> +++ b/drivers/mtd/nand/nand_bch.c
> @@ -41,7 +41,7 @@ struct nand_bch_control {
>  int nand_bch_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf,
>  			   unsigned char *code)
>  {
> -	const struct nand_chip *chip = mtd->priv;
> +	const struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_bch_control *nbc = chip->ecc.priv;
>  	unsigned int i;
>  
> @@ -67,7 +67,7 @@ int nand_bch_calculate_ecc(struct mtd_info *mtd, const unsigned char *buf,
>  int nand_bch_correct_data(struct mtd_info *mtd, unsigned char *buf,
>  			  unsigned char *read_ecc, unsigned char *calc_ecc)
>  {
> -	const struct nand_chip *chip = mtd->priv;
> +	const struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_bch_control *nbc = chip->ecc.priv;
>  	unsigned int *errloc = nbc->errloc;
>  	int i, count;
> diff --git a/drivers/mtd/nand/nand_plat.c b/drivers/mtd/nand/nand_plat.c
> index 37a0206..335c3e3 100644
> --- a/drivers/mtd/nand/nand_plat.c
> +++ b/drivers/mtd/nand/nand_plat.c
> @@ -25,7 +25,7 @@
>  
>  static void plat_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	if (cmd == NAND_CMD_NONE)
>  		return;
> @@ -39,7 +39,7 @@ static void plat_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  #ifdef NAND_PLAT_DEV_READY
>  static int plat_dev_ready(struct mtd_info *mtd)
>  {
> -	return NAND_PLAT_DEV_READY((struct nand_chip *)mtd->priv);
> +	return NAND_PLAT_DEV_READY((struct nand_chip *)mtd_to_nand(mtd));
>  }
>  #else
>  # define plat_dev_ready NULL
> diff --git a/drivers/mtd/nand/nand_spl_simple.c b/drivers/mtd/nand/nand_spl_simple.c
> index bc6a09a..b023e00 100644
> --- a/drivers/mtd/nand/nand_spl_simple.c
> +++ b/drivers/mtd/nand/nand_spl_simple.c
> @@ -26,7 +26,7 @@ static struct nand_chip nand_chip;
>  static int nand_command(int block, int page, uint32_t offs,
>  	u8 cmd)
>  {
> -	struct nand_chip *this = mtd->priv();
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int page_addr = page + block * CONFIG_SYS_NAND_PAGE_COUNT;
>  
>  	while (!this->dev_ready(mtd))
> @@ -63,7 +63,7 @@ static int nand_command(int block, int page, uint32_t offs,
>  static int nand_command(int block, int page, uint32_t offs,
>  	u8 cmd)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	int page_addr = page + block * CONFIG_SYS_NAND_PAGE_COUNT;
>  	void (*hwctrl)(struct mtd_info *mtd, int cmd,
>  			unsigned int ctrl) = this->cmd_ctrl;
> @@ -114,7 +114,7 @@ static int nand_command(int block, int page, uint32_t offs,
>  
>  static int nand_is_bad_block(int block)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_char bb_data[2];
>  
>  	nand_command(block, 0, CONFIG_SYS_NAND_BAD_BLOCK_POS,
> @@ -139,7 +139,7 @@ static int nand_is_bad_block(int block)
>  #if defined(CONFIG_SYS_NAND_HW_ECC_OOBFIRST)
>  static int nand_read_page(int block, int page, uchar *dst)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_char ecc_calc[ECCTOTAL];
>  	u_char ecc_code[ECCTOTAL];
>  	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
> @@ -170,7 +170,7 @@ static int nand_read_page(int block, int page, uchar *dst)
>  #else
>  static int nand_read_page(int block, int page, void *dst)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	u_char ecc_calc[ECCTOTAL];
>  	u_char ecc_code[ECCTOTAL];
>  	u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
> @@ -250,7 +250,6 @@ void nand_init(void)
>  	 * Init board specific nand support
>  	 */
>  	mtd = &nand_chip.mtd;
> -	mtd->priv = &nand_chip;
>  	nand_chip.IO_ADDR_R = nand_chip.IO_ADDR_W =
>  		(void  __iomem *)CONFIG_SYS_NAND_BASE;
>  	board_nand_init(&nand_chip);
> diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c
> index 90bf798..9b61087 100644
> --- a/drivers/mtd/nand/nand_util.c
> +++ b/drivers/mtd/nand/nand_util.c
> @@ -59,7 +59,7 @@ int nand_erase_opts(struct mtd_info *mtd,
>  	int percent_complete = -1;
>  	const char *mtd_device = mtd->name;
>  	struct mtd_oob_ops oob_opts;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	if ((opts->offset & (mtd->erasesize - 1)) != 0) {
>  		printf("Attempt to erase non block-aligned data\n");
> @@ -217,7 +217,7 @@ int nand_lock(struct mtd_info *mtd, int tight)
>  {
>  	int ret = 0;
>  	int status;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/* select the NAND device */
>  	chip->select_chip(mtd, 0);
> @@ -267,7 +267,7 @@ int nand_get_lock_status(struct mtd_info *mtd, loff_t offset)
>  	int ret = 0;
>  	int chipnr;
>  	int page;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/* select the NAND device */
>  	chipnr = (int)(offset >> chip->chip_shift);
> @@ -314,7 +314,7 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,
>  	int chipnr;
>  	int status;
>  	int page;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	debug("nand_unlock%s: start: %08llx, length: %zd!\n",
>  		allexcept ? " (allexcept)" : "", start, length);
> diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
> index 8a68cb0..ee353c7 100644
> --- a/drivers/mtd/nand/ndfc.c
> +++ b/drivers/mtd/nand/ndfc.c
> @@ -37,7 +37,7 @@ static int ndfc_cs[NDFC_MAX_BANKS];
>  
>  static void ndfc_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  
>  	if (cmd == NAND_CMD_NONE)
> @@ -51,7 +51,7 @@ static void ndfc_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  
>  static int ndfc_dev_ready(struct mtd_info *mtdinfo)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  
>  	return (in_be32((u32 *)(base + NDFC_STAT)) & NDFC_STAT_IS_READY);
> @@ -59,7 +59,7 @@ static int ndfc_dev_ready(struct mtd_info *mtdinfo)
>  
>  static void ndfc_enable_hwecc(struct mtd_info *mtdinfo, int mode)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  	u32 ccr;
>  
> @@ -71,7 +71,7 @@ static void ndfc_enable_hwecc(struct mtd_info *mtdinfo, int mode)
>  static int ndfc_calculate_ecc(struct mtd_info *mtdinfo,
>  			      const u_char *dat, u_char *ecc_code)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  	u32 ecc;
>  	u8 *p = (u8 *)&ecc;
> @@ -96,7 +96,7 @@ static int ndfc_calculate_ecc(struct mtd_info *mtdinfo,
>   */
>  static void ndfc_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  	uint32_t *p = (uint32_t *) buf;
>  
> @@ -110,7 +110,7 @@ static void ndfc_read_buf(struct mtd_info *mtdinfo, uint8_t *buf, int len)
>   */
>  static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len)
>  {
> -	struct nand_chip *this = mtdinfo->priv;
> +	struct nand_chip *this = mtd_to_nand(mtdinfo);
>  	ulong base = (ulong) this->IO_ADDR_W & 0xffffff00;
>  	uint32_t *p = (uint32_t *) buf;
>  
> @@ -124,7 +124,7 @@ static void ndfc_write_buf(struct mtd_info *mtdinfo, const uint8_t *buf, int len
>  static uint8_t ndfc_read_byte(struct mtd_info *mtd)
>  {
>  
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  #ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
>  	return (uint8_t) readw(chip->IO_ADDR_R);
> diff --git a/drivers/mtd/nand/omap_gpmc.c b/drivers/mtd/nand/omap_gpmc.c
> index f2ee90e..cac9eea 100644
> --- a/drivers/mtd/nand/omap_gpmc.c
> +++ b/drivers/mtd/nand/omap_gpmc.c
> @@ -58,8 +58,8 @@ static struct omap_nand_info omap_nand_info[GPMC_MAX_CS];
>  static void omap_nand_hwcontrol(struct mtd_info *mtd, int32_t cmd,
>  				uint32_t ctrl)
>  {
> -	register struct nand_chip *this = mtd->priv;
> -	struct omap_nand_info *info = this->priv;
> +	register struct nand_chip *this = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(this);
>  	int cs = info->cs;
>  
>  	/*
> @@ -85,8 +85,8 @@ static void omap_nand_hwcontrol(struct mtd_info *mtd, int32_t cmd,
>  /* Check wait pin as dev ready indicator */
>  static int omap_dev_ready(struct mtd_info *mtd)
>  {
> -	register struct nand_chip *this = mtd->priv;
> -	struct omap_nand_info *info = this->priv;
> +	register struct nand_chip *this = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(this);
>  	return gpmc_cfg->status & (1 << (8 + info->ws));
>  }
>  
> @@ -177,8 +177,8 @@ static int __maybe_unused omap_correct_data(struct mtd_info *mtd, uint8_t *dat,
>  __maybe_unused
>  static void omap_enable_hwecc(struct mtd_info *mtd, int32_t mode)
>  {
> -	struct nand_chip	*nand	= mtd->priv;
> -	struct omap_nand_info	*info	= nand->priv;
> +	struct nand_chip	*nand	= mtd_to_nand(mtd);
> +	struct omap_nand_info	*info	= nand_get_controller_data(nand);
>  	unsigned int dev_width = (nand->options & NAND_BUSWIDTH_16) ? 1 : 0;
>  	unsigned int ecc_algo = 0;
>  	unsigned int bch_type = 0;
> @@ -262,8 +262,8 @@ static void omap_enable_hwecc(struct mtd_info *mtd, int32_t mode)
>  static int omap_calculate_ecc(struct mtd_info *mtd, const uint8_t *dat,
>  				uint8_t *ecc_code)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct omap_nand_info *info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(chip);
>  	uint32_t *ptr, val = 0;
>  	int8_t i = 0, j;
>  
> @@ -392,7 +392,7 @@ static int __read_prefetch_aligned(struct nand_chip *chip, uint32_t *buf, int le
>  {
>  	int ret;
>  	uint32_t cnt;
> -	struct omap_nand_info *info = chip->priv;
> +	struct omap_nand_info *info = nand_get_controller_data(chip);
>  
>  	ret = omap_prefetch_enable(PREFETCH_FIFOTHRESHOLD_MAX, len, 0, info->cs);
>  	if (ret < 0)
> @@ -417,7 +417,7 @@ static int __read_prefetch_aligned(struct nand_chip *chip, uint32_t *buf, int le
>  
>  static inline void omap_nand_read(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	if (chip->options & NAND_BUSWIDTH_16)
>  		nand_read_buf16(mtd, buf, len);
> @@ -429,7 +429,7 @@ static void omap_nand_read_prefetch(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
>  	int ret;
>  	uint32_t head, tail;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	/*
>  	 * If the destination buffer is unaligned, start with reading
> @@ -491,8 +491,8 @@ static void omap_reverse_list(u8 *list, unsigned int length)
>  static int omap_correct_data_bch(struct mtd_info *mtd, uint8_t *dat,
>  				uint8_t *read_ecc, uint8_t *calc_ecc)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct omap_nand_info *info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(chip);
>  	struct nand_ecc_ctrl *ecc = &chip->ecc;
>  	uint32_t error_count = 0, error_max;
>  	uint32_t error_loc[ELM_MAX_ERROR_COUNT];
> @@ -652,8 +652,8 @@ static int omap_correct_data_bch_sw(struct mtd_info *mtd, u_char *data,
>  	int i, count;
>  	/* cannot correct more than 8 errors */
>  	unsigned int errloc[8];
> -	struct nand_chip *chip = mtd->priv;
> -	struct omap_nand_info *info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(chip);
>  
>  	count = decode_bch(info->control, NULL, 512, read_ecc, calc_ecc,
>  							NULL, errloc);
> @@ -691,8 +691,8 @@ static int omap_correct_data_bch_sw(struct mtd_info *mtd, u_char *data,
>   */
>  static void __maybe_unused omap_free_bch(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> -	struct omap_nand_info *info = chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct omap_nand_info *info = nand_get_controller_data(chip);
>  
>  	if (info->control) {
>  		free_bch(info->control);
> @@ -710,7 +710,7 @@ static void __maybe_unused omap_free_bch(struct mtd_info *mtd)
>   */
>  static int omap_select_ecc_scheme(struct nand_chip *nand,
>  	enum omap_ecc ecc_scheme, unsigned int pagesize, unsigned int oobsize) {
> -	struct omap_nand_info	*info		= nand->priv;
> +	struct omap_nand_info	*info		= nand_get_controller_data(nand);
>  	struct nand_ecclayout	*ecclayout	= &omap_ecclayout;
>  	int eccsteps = pagesize / SECTOR_BYTES;
>  	int i;
> @@ -904,7 +904,7 @@ int __maybe_unused omap_nand_switch_ecc(uint32_t hardware, uint32_t eccstrength)
>  	}
>  
>  	mtd = nand_info[nand_curr_device];
> -	nand = mtd->priv;
> +	nand = mtd_to_nand(mtd);
>  	nand->options |= NAND_OWN_BUFFERS;
>  	nand->options &= ~NAND_SUBPAGE_READ;
>  	/* Setup the ecc configurations again */
> @@ -994,7 +994,7 @@ int board_nand_init(struct nand_chip *nand)
>  	omap_nand_info[cs].control = NULL;
>  	omap_nand_info[cs].cs = cs;
>  	omap_nand_info[cs].ws = wscfg[cs];
> -	nand->priv	= &omap_nand_info[cs];
> +	nand_set_controller_data(nand, &omap_nand_info[cs]);
>  	nand->cmd_ctrl	= omap_nand_hwcontrol;
>  	nand->options	|= NAND_NO_PADDING | NAND_CACHEPRG;
>  	nand->chip_delay = 100;
> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
> index 125dbe7..03bf046 100644
> --- a/drivers/mtd/nand/pxa3xx_nand.c
> +++ b/drivers/mtd/nand/pxa3xx_nand.c
> @@ -900,7 +900,8 @@ static int prepare_set_command(struct pxa3xx_nand_info *info, int command,
>  static void nand_cmdfunc(struct mtd_info *mtd, unsigned command,
>  			 int column, int page_addr)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	int exec_cmd;
>  
> @@ -960,7 +961,8 @@ static void nand_cmdfunc_extended(struct mtd_info *mtd,
>  				  const unsigned command,
>  				  int column, int page_addr)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	int exec_cmd, ext_cmd_type;
>  
> @@ -1091,7 +1093,7 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,
>  		struct nand_chip *chip, uint8_t *buf, int oob_required,
>  		int page)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  
>  	chip->read_buf(mtd, buf, mtd->writesize);
> @@ -1117,7 +1119,8 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,
>  
>  static uint8_t pxa3xx_nand_read_byte(struct mtd_info *mtd)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	char retval = 0xFF;
>  
> @@ -1130,7 +1133,8 @@ static uint8_t pxa3xx_nand_read_byte(struct mtd_info *mtd)
>  
>  static u16 pxa3xx_nand_read_word(struct mtd_info *mtd)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	u16 retval = 0xFFFF;
>  
> @@ -1143,7 +1147,8 @@ static u16 pxa3xx_nand_read_word(struct mtd_info *mtd)
>  
>  static void pxa3xx_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	int real_len = min_t(size_t, len, info->buf_count - info->buf_start);
>  
> @@ -1154,7 +1159,8 @@ static void pxa3xx_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  static void pxa3xx_nand_write_buf(struct mtd_info *mtd,
>  		const uint8_t *buf, int len)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	int real_len = min_t(size_t, len, info->buf_count - info->buf_start);
>  
> @@ -1169,7 +1175,8 @@ static void pxa3xx_nand_select_chip(struct mtd_info *mtd, int chip)
>  
>  static int pxa3xx_nand_waitfunc(struct mtd_info *mtd, struct nand_chip *this)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  
>  	if (info->need_wait) {
> @@ -1210,7 +1217,7 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info)
>  {
>  	struct pxa3xx_nand_host *host = info->host[info->cs];
>  	struct mtd_info *mtd = host->mtd;
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  
>  	info->reg_ndcr |= (host->col_addr_cycles == 2) ? NDCR_RA_START : 0;
>  	info->reg_ndcr |= (chip->page_shift == 6) ? NDCR_PG_PER_BLK : 0;
> @@ -1262,7 +1269,7 @@ static int pxa3xx_nand_sensing(struct pxa3xx_nand_host *host)
>  	int ret;
>  
>  	mtd = info->host[info->cs]->mtd;
> -	chip = mtd->priv;
> +	chip = mtd_to_nand(mtd);
>  
>  	/* configure default flash values */
>  	info->reg_ndcr = 0x0; /* enable all interrupts */
> @@ -1354,10 +1361,10 @@ static int pxa_ecc_init(struct pxa3xx_nand_info *info,
>  
>  static int pxa3xx_nand_scan(struct mtd_info *mtd)
>  {
> -	struct pxa3xx_nand_host *host = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct pxa3xx_nand_host *host = nand_get_controller_data(chip);
>  	struct pxa3xx_nand_info *info = host->info_data;
>  	struct pxa3xx_nand_platform_data *pdata = info->pdata;
> -	struct nand_chip *chip = mtd->priv;
>  	int ret;
>  	uint16_t ecc_strength, ecc_step;
>  
> @@ -1479,14 +1486,13 @@ static int alloc_nand_resource(struct pxa3xx_nand_info *info)
>  	for (cs = 0; cs < pdata->num_cs; cs++) {
>  		chip = (struct nand_chip *)
>  			((u8 *)&info[1] + sizeof(*host) * cs);
> -		mtd = &chip->mtd;
> +		mtd = nand_to_mtd(chip);
>  		host = (struct pxa3xx_nand_host *)chip;
>  		info->host[cs] = host;
>  		host->mtd = mtd;
>  		host->cs = cs;
>  		host->info_data = info;
>  		host->read_id_bytes = 4;
> -		mtd->priv = host;
>  		mtd->owner = THIS_MODULE;
>  
>  		chip->ecc.read_page	= pxa3xx_nand_read_page_hwecc;
> diff --git a/drivers/mtd/nand/s3c2410_nand.c b/drivers/mtd/nand/s3c2410_nand.c
> index b3a2a60..2a0da6e 100644
> --- a/drivers/mtd/nand/s3c2410_nand.c
> +++ b/drivers/mtd/nand/s3c2410_nand.c
> @@ -31,7 +31,7 @@
>  static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  {
>  	int i;
> -	struct nand_chip *this = mtd->priv;
> +	struct nand_chip *this = mtd_to_nand(mtd);
>  
>  	for (i = 0; i < len; i++)
>  		buf[i] = readb(this->IO_ADDR_R);
> @@ -40,7 +40,7 @@ static void nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
>  
>  static void s3c24x0_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct s3c24x0_nand *nand = s3c24x0_get_base_nand();
>  
>  	debug("hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);
> diff --git a/drivers/mtd/nand/tegra_nand.c b/drivers/mtd/nand/tegra_nand.c
> index b20fb1e..3eae4cb 100644
> --- a/drivers/mtd/nand/tegra_nand.c
> +++ b/drivers/mtd/nand/tegra_nand.c
> @@ -143,10 +143,10 @@ static int nand_waitfor_cmd_completion(struct nand_ctlr *reg)
>   */
>  static uint8_t read_byte(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_drv *info;
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  
>  	writel(CMD_GO | CMD_PIO | CMD_RX | CMD_CE0 | CMD_A_VALID,
>  	       &info->reg->command);
> @@ -169,8 +169,8 @@ static void read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>  {
>  	int i, s;
>  	unsigned int reg;
> -	struct nand_chip *chip = mtd->priv;
> -	struct nand_drv *info = (struct nand_drv *)chip->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
> +	struct nand_drv *info = (struct nand_drv *)nand_get_controller_data(chip);
>  
>  	for (i = 0; i < len; i += 4) {
>  		s = (len - i) > 4 ? 4 : len - i;
> @@ -194,11 +194,11 @@ static void read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
>   */
>  static int nand_dev_ready(struct mtd_info *mtd)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	int reg_val;
>  	struct nand_drv *info;
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  
>  	reg_val = readl(&info->reg->status);
>  	if (reg_val & STATUS_RBSY0)
> @@ -245,10 +245,10 @@ static void nand_clear_interrupt_status(struct nand_ctlr *reg)
>  static void nand_command(struct mtd_info *mtd, unsigned int command,
>  	int column, int page_addr)
>  {
> -	struct nand_chip *chip = mtd->priv;
> +	struct nand_chip *chip = mtd_to_nand(mtd);
>  	struct nand_drv *info;
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  
>  	/*
>  	 * Write out the command to the device.
> @@ -512,7 +512,7 @@ static int nand_rw_page(struct mtd_info *mtd, struct nand_chip *chip,
>  		return -EINVAL;
>  	}
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  	config = &info->config;
>  	if (set_bus_width_page_size(config, &reg_val))
>  		return -EINVAL;
> @@ -662,7 +662,7 @@ static int nand_write_page_hwecc(struct mtd_info *mtd,
>  	int page;
>  	struct nand_drv *info;
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  
>  	page = (readl(&info->reg->addr_reg1) >> 16) |
>  		(readl(&info->reg->addr_reg2) << 16);
> @@ -702,7 +702,7 @@ static int nand_write_page_raw(struct mtd_info *mtd,
>  	int page;
>  	struct nand_drv *info;
>  
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  	page = (readl(&info->reg->addr_reg1) >> 16) |
>  		(readl(&info->reg->addr_reg2) << 16);
>  
> @@ -734,7 +734,7 @@ static int nand_rw_oob(struct mtd_info *mtd, struct nand_chip *chip,
>  
>  	if (((int)chip->oob_poi) & 0x03)
>  		return -EINVAL;
> -	info = (struct nand_drv *)chip->priv;
> +	info = (struct nand_drv *)nand_get_controller_data(chip);
>  	if (set_bus_width_page_size(&info->config, &reg_val))
>  		return -EINVAL;
>  
> @@ -963,7 +963,7 @@ int tegra_nand_init(struct nand_chip *nand, int devnum)
>  	nand->ecc.strength = 1;
>  	nand->select_chip = nand_select_chip;
>  	nand->dev_ready  = nand_dev_ready;
> -	nand->priv = &nand_ctrl;
> +	nand_set_controller_data(nand, &nand_ctrl);
>  
>  	/* Disable subpage writes as we do not provide ecc->hwctl */
>  	nand->options |= NAND_NO_SUBPAGE_WRITE;
> @@ -976,8 +976,7 @@ int tegra_nand_init(struct nand_chip *nand, int devnum)
>  
>  	dm_gpio_set_value(&config->wp_gpio, 1);
>  
> -	our_mtd = &nand->mtd;
> -	our_mtd->priv = nand;
> +	our_mtd = nand_to_mtd(nand);
>  	ret = nand_scan_ident(our_mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL);
>  	if (ret)
>  		return ret;
> diff --git a/drivers/mtd/nand/vf610_nfc.c b/drivers/mtd/nand/vf610_nfc.c
> index 3be8b02..a4d5a62 100644
> --- a/drivers/mtd/nand/vf610_nfc.c
> +++ b/drivers/mtd/nand/vf610_nfc.c
> @@ -155,8 +155,7 @@ struct vf610_nfc {
>  	enum vf610_nfc_alt_buf alt_buf;
>  };
>  
> -#define mtd_to_nfc(_mtd) \
> -	(struct vf610_nfc *)((struct nand_chip *)_mtd->priv)->priv
> +#define mtd_to_nfc(_mtd) nand_get_controller_data(mtd_to_nand(_mtd))
>  
>  #if defined(CONFIG_SYS_NAND_VF610_NFC_45_ECC_BYTES)
>  #define ECC_HW_MODE ECC_45_BYTE
> @@ -653,9 +652,8 @@ static int vf610_nfc_nand_init(int devnum, void __iomem *addr)
>  	chip = &nfc->chip;
>  	nfc->regs = addr;
>  
> -	mtd = &chip->mtd;
> -	mtd->priv = chip;
> -	chip->priv = nfc;
> +	mtd = nand_to_mtd(chip);
> +	nand_set_controller_data(chip, nfc);
>  
>  	if (cfg.width == 16)
>  		chip->options |= NAND_BUSWIDTH_16;
> diff --git a/fs/yaffs2/yaffs_uboot_glue.c b/fs/yaffs2/yaffs_uboot_glue.c
> index 6d86871..25aa6d1 100644
> --- a/fs/yaffs2/yaffs_uboot_glue.c
> +++ b/fs/yaffs2/yaffs_uboot_glue.c
> @@ -190,7 +190,7 @@ void cmd_yaffs_devconfig(char *_mp, int flash_dev,
>  		goto err;
>  	}
>  
> -	chip =  mtd->priv;
> +	chip =  mtd_to_nand(mtd);
>  
>  	/* Check for any conflicts */
>  	yaffs_dev_rewind();
> diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
> index fe8ac9d..e1df66b 100644
> --- a/include/linux/mtd/nand.h
> +++ b/include/linux/mtd/nand.h
> @@ -740,6 +740,26 @@ struct nand_chip {
>  	void *priv;
>  };
>  
> +static inline struct nand_chip *mtd_to_nand(struct mtd_info *mtd)
> +{
> +	return container_of(mtd, struct nand_chip, mtd);
> +}
> +
> +static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip)
> +{
> +	return &chip->mtd;
> +}
> +
> +static inline void *nand_get_controller_data(struct nand_chip *chip)
> +{
> +	return chip->priv;
> +}
> +
> +static inline void nand_set_controller_data(struct nand_chip *chip, void *priv)
> +{
> +	chip->priv = priv;
> +}
> +
>  /*
>   * NAND Flash Manufacturer ID Codes
>   */



-- 
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com


More information about the U-Boot mailing list