[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, ®_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, ®_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