};
 
 struct atmel_nand_controller {
-       struct nand_hw_control base;
+       struct nand_controller base;
        const struct atmel_nand_controller_caps *caps;
        struct device *dev;
        struct regmap *smc;
 };
 
 static inline struct atmel_nand_controller *
-to_nand_controller(struct nand_hw_control *ctl)
+to_nand_controller(struct nand_controller *ctl)
 {
        return container_of(ctl, struct atmel_nand_controller, base);
 }
 };
 
 static inline struct atmel_smc_nand_controller *
-to_smc_nand_controller(struct nand_hw_control *ctl)
+to_smc_nand_controller(struct nand_controller *ctl)
 {
        return container_of(to_nand_controller(ctl),
                            struct atmel_smc_nand_controller, base);
 };
 
 static inline struct atmel_hsmc_nand_controller *
-to_hsmc_nand_controller(struct nand_hw_control *ctl)
+to_hsmc_nand_controller(struct nand_controller *ctl)
 {
        return container_of(to_nand_controller(ctl),
                            struct atmel_hsmc_nand_controller, base);
        struct device_node *np = dev->of_node;
        int ret;
 
-       nand_hw_control_init(&nc->base);
+       nand_controller_init(&nc->base);
        INIT_LIST_HEAD(&nc->chips);
        nc->dev = dev;
        nc->caps = caps;
 
 
 struct brcmnand_controller {
        struct device           *dev;
-       struct nand_hw_control  controller;
+       struct nand_controller  controller;
        void __iomem            *nand_base;
        void __iomem            *nand_fc; /* flash cache */
        void __iomem            *flash_dma_base;
 
        init_completion(&ctrl->done);
        init_completion(&ctrl->dma_done);
-       nand_hw_control_init(&ctrl->controller);
+       nand_controller_init(&ctrl->controller);
        INIT_LIST_HEAD(&ctrl->host_list);
 
        /* NAND register range */
 
        nand->ecc.strength = DOCG4_T;
        nand->options = NAND_BUSWIDTH_16 | NAND_NO_SUBPAGE_WRITE;
        nand->IO_ADDR_R = nand->IO_ADDR_W = doc->virtadr + DOC_IOSPACE_DATA;
-       nand->controller = &nand->hwcontrol;
-       nand_hw_control_init(nand->controller);
+       nand->controller = &nand->dummy_controller;
+       nand_controller_init(nand->controller);
 
        /* methods */
        nand->cmdfunc = docg4_command;
 
 /* Freescale eLBC FCM controller information */
 
 struct fsl_elbc_fcm_ctrl {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct fsl_elbc_mtd *chips[MAX_BANKS];
 
        u8 __iomem *addr;        /* Address of assigned FCM buffer        */
                }
                elbc_fcm_ctrl->counter++;
 
-               nand_hw_control_init(&elbc_fcm_ctrl->controller);
+               nand_controller_init(&elbc_fcm_ctrl->controller);
                fsl_lbc_ctrl_dev->nand = elbc_fcm_ctrl;
        } else {
                elbc_fcm_ctrl = fsl_lbc_ctrl_dev->nand;
 
 
 /* overview of the fsl ifc controller */
 struct fsl_ifc_nand_ctrl {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct fsl_ifc_mtd *chips[FSL_IFC_BANK_COUNT];
 
        void __iomem *addr;     /* Address of assigned IFC buffer       */
                ifc_nand_ctrl->addr = NULL;
                fsl_ifc_ctrl_dev->nand = ifc_nand_ctrl;
 
-               nand_hw_control_init(&ifc_nand_ctrl->controller);
+               nand_controller_init(&ifc_nand_ctrl->controller);
        } else {
                ifc_nand_ctrl = fsl_ifc_ctrl_dev->nand;
        }
 
 struct jz4780_nand_controller {
        struct device *dev;
        struct jz4780_bch *bch;
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        unsigned int num_banks;
        struct list_head chips;
        int selected;
        return container_of(mtd_to_nand(mtd), struct jz4780_nand_chip, chip);
 }
 
-static inline struct jz4780_nand_controller *to_jz4780_nand_controller(struct nand_hw_control *ctrl)
+static inline struct jz4780_nand_controller
+*to_jz4780_nand_controller(struct nand_controller *ctrl)
 {
        return container_of(ctrl, struct jz4780_nand_controller, controller);
 }
        nfc->dev = dev;
        nfc->num_banks = num_banks;
 
-       nand_hw_control_init(&nfc->controller);
+       nand_controller_init(&nfc->controller);
        INIT_LIST_HEAD(&nfc->chips);
 
        ret = jz4780_nand_init_chips(nfc, pdev);
 
  * @dma_buf:           32-bit aligned buffer for DMA transfers (NFCv1 only)
  */
 struct marvell_nfc {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct device *dev;
        void __iomem *regs;
        struct clk *core_clk;
        u8 *dma_buf;
 };
 
-static inline struct marvell_nfc *to_marvell_nfc(struct nand_hw_control *ctrl)
+static inline struct marvell_nfc *to_marvell_nfc(struct nand_controller *ctrl)
 {
        return container_of(ctrl, struct marvell_nfc, controller);
 }
                return -ENOMEM;
 
        nfc->dev = dev;
-       nand_hw_control_init(&nfc->controller);
+       nand_controller_init(&nfc->controller);
        INIT_LIST_HEAD(&nfc->chips);
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
 };
 
 struct mtk_nfc {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct mtk_ecc_config ecc_cfg;
        struct mtk_nfc_clk clk;
        struct mtk_ecc *ecc;
 
                chip->read_buf = busw ? nand_read_buf16 : nand_read_buf;
 
        if (!chip->controller) {
-               chip->controller = &chip->hwcontrol;
-               nand_hw_control_init(chip->controller);
+               chip->controller = &chip->dummy_controller;
+               nand_controller_init(chip->controller);
        }
 
        if (!chip->buf_align)
 
        void __iomem *ndfcbase;
        struct nand_chip chip;
        int chip_select;
-       struct nand_hw_control ndfc_control;
+       struct nand_controller ndfc_control;
 };
 
 static struct ndfc_controller ndfc_ctrl[NDFC_MAX_CS];
        ndfc = &ndfc_ctrl[cs];
        ndfc->chip_select = cs;
 
-       nand_hw_control_init(&ndfc->ndfc_control);
+       nand_controller_init(&ndfc->ndfc_control);
        ndfc->ofdev = ofdev;
        dev_set_drvdata(&ofdev->dev, ndfc);
 
 
 static u_char bch4_vector[] = {0x00, 0x6b, 0x31, 0xdd, 0x41, 0xbc, 0x10};
 
 /* Shared among all NAND instances to synchronize access to the ECC Engine */
-static struct nand_hw_control omap_gpmc_controller = {
+static struct nand_controller omap_gpmc_controller = {
        .lock = __SPIN_LOCK_UNLOCKED(omap_gpmc_controller.lock),
        .wq = __WAIT_QUEUE_HEAD_INITIALIZER(omap_gpmc_controller.wq),
 };
 
 #define OXNAS_NAND_MAX_CHIPS   1
 
 struct oxnas_nand_ctrl {
-       struct nand_hw_control base;
+       struct nand_controller base;
        void __iomem *io_base;
        struct clk *clk;
        struct nand_chip *chips[OXNAS_NAND_MAX_CHIPS];
        if (!oxnas)
                return -ENOMEM;
 
-       nand_hw_control_init(&oxnas->base);
+       nand_controller_init(&oxnas->base);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        oxnas->io_base = devm_ioremap_resource(&pdev->dev, res);
 
  *                             from all connected NAND devices pagesize
  */
 struct qcom_nand_controller {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct list_head host_list;
 
        struct device *dev;
        INIT_LIST_HEAD(&nandc->desc_list);
        INIT_LIST_HEAD(&nandc->host_list);
 
-       nand_hw_control_init(&nandc->controller);
+       nand_controller_init(&nandc->controller);
 
        return 0;
 }
 
  */
 struct s3c2410_nand_info {
        /* mtd info */
-       struct nand_hw_control          controller;
+       struct nand_controller          controller;
        struct s3c2410_nand_mtd         *mtds;
        struct s3c2410_platform_nand    *platform;
 
 
        platform_set_drvdata(pdev, info);
 
-       nand_hw_control_init(&info->controller);
+       nand_controller_init(&info->controller);
 
        /* get the clock source and enable it */
 
 
  *                     controller events
  */
 struct sunxi_nfc {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct device *dev;
        void __iomem *regs;
        struct clk *ahb_clk;
        struct dma_chan *dmac;
 };
 
-static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
+static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl)
 {
        return container_of(ctrl, struct sunxi_nfc, controller);
 }
                return -ENOMEM;
 
        nfc->dev = dev;
-       nand_hw_control_init(&nfc->controller);
+       nand_controller_init(&nfc->controller);
        INIT_LIST_HEAD(&nfc->chips);
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
 #define MAX_CS         4
 
 struct tango_nfc {
-       struct nand_hw_control hw;
+       struct nand_controller hw;
        void __iomem *reg_base;
        void __iomem *mem_base;
        void __iomem *pbus_base;
                return PTR_ERR(nfc->chan);
 
        platform_set_drvdata(pdev, nfc);
-       nand_hw_control_init(&nfc->hw);
+       nand_controller_init(&nfc->hw);
        nfc->freq_kHz = clk_get_rate(clk) / 1000;
 
        for_each_child_of_node(pdev->dev.of_node, np) {
 
                                HWSTATUS_RBSY_VALUE(NAND_STATUS_READY))
 
 struct tegra_nand_controller {
-       struct nand_hw_control controller;
+       struct nand_controller controller;
        struct device *dev;
        void __iomem *regs;
        int irq;
 };
 
 static inline struct tegra_nand_controller *
-                       to_tegra_ctrl(struct nand_hw_control *hw_ctrl)
+                       to_tegra_ctrl(struct nand_controller *hw_ctrl)
 {
        return container_of(hw_ctrl, struct tegra_nand_controller, controller);
 }
                return -ENOMEM;
 
        ctrl->dev = &pdev->dev;
-       nand_hw_control_init(&ctrl->controller);
+       nand_controller_init(&ctrl->controller);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        ctrl->regs = devm_ioremap_resource(&pdev->dev, res);
 
        void __iomem *base;
        unsigned char hold;     /* in gbusclock */
        unsigned char spw;      /* in gbusclock */
-       struct nand_hw_control hw_control;
+       struct nand_controller hw_control;
 };
 
 static struct platform_device *mtd_to_platdev(struct mtd_info *mtd)
        dev_info(&dev->dev, "CLK:%ldMHz HOLD:%d SPW:%d\n",
                 (gbusclk + 500000) / 1000000, hold, spw);
 
-       nand_hw_control_init(&drvdata->hw_control);
+       nand_controller_init(&drvdata->hw_control);
 
        platform_set_drvdata(dev, drvdata);
        txx9ndfmc_initialize(dev);
 
 };
 
 /**
- * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices
+ * struct nand_controller - Structure used to describe a NAND controller
+ *
  * @lock:               protection lock
  * @active:            the mtd device which holds the controller currently
  * @wq:                        wait queue to sleep on if a NAND operation is in
  *                     progress used instead of the per chip wait queue
  *                     when a hw controller is available.
  */
-struct nand_hw_control {
+struct nand_controller {
        spinlock_t lock;
        struct nand_chip *active;
        wait_queue_head_t wq;
 };
 
-static inline void nand_hw_control_init(struct nand_hw_control *nfc)
+static inline void nand_controller_init(struct nand_controller *nfc)
 {
        nfc->active = NULL;
        spin_lock_init(&nfc->lock);
  *                     setting the read-retry mode. Mostly needed for MLC NAND.
  * @ecc:               [BOARDSPECIFIC] ECC control structure
  * @buf_align:         minimum buffer alignment required by a platform
- * @hwcontrol:         platform-specific hardware control structure
+ * @dummy_controller:  dummy controller implementation for drivers that can
+ *                     only control a single chip
  * @erase:             [REPLACEABLE] erase function
  * @chip_delay:                [BOARDSPECIFIC] chip dependent delay for transferring
  *                     data from array to read regs (tR).
        flstate_t state;
 
        uint8_t *oob_poi;
-       struct nand_hw_control *controller;
+       struct nand_controller *controller;
 
        struct nand_ecc_ctrl ecc;
        unsigned long buf_align;
-       struct nand_hw_control hwcontrol;
+       struct nand_controller dummy_controller;
 
        uint8_t *bbt;
        struct nand_bbt_descr *bbt_td;