From: Ladislav Michl Date: Thu, 19 Oct 2006 13:53:21 +0000 (+0300) Subject: [PATCH] Make omap-nand-flash driver work after MTD update X-Git-Tag: v2.6.18-omap1~1 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=a57e230cfe7f492a14a3dfc7539de33dfb3a0994;p=linux-2.6-omap-h63xx.git [PATCH] Make omap-nand-flash driver work after MTD update Make omap-nand-flash driver work after MTD update Signed-off-by: Ladislav Michl --- diff --git a/drivers/mtd/nand/omap-nand-flash.c b/drivers/mtd/nand/omap-nand-flash.c index 35a34088f99..a231e18b0d6 100644 --- a/drivers/mtd/nand/omap-nand-flash.c +++ b/drivers/mtd/nand/omap-nand-flash.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -44,21 +45,25 @@ struct omap_nand_info { /* * hardware specific access to control-lines * NOTE: boards may use different bits for these!! + * + * ctrl: + * NAND_NCE: bit 0 - don't care + * NAND_CLE: bit 1 -> bit 1 (0x0002) + * NAND_ALE: bit 2 -> bit 2 (0x0004) */ -#define MASK_CLE 0x02 -#define MASK_ALE 0x04 -static void omap_nand_hwcontrol(struct mtd_info *mtd, int cmd) + +static void omap_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) { - struct nand_chip *this = mtd->priv; - unsigned long IO_ADDR_W = (unsigned long) this->IO_ADDR_W; - - switch (cmd) { - case NAND_CTL_SETCLE: IO_ADDR_W |= MASK_CLE; break; - case NAND_CTL_CLRCLE: IO_ADDR_W &= ~MASK_CLE; break; - case NAND_CTL_SETALE: IO_ADDR_W |= MASK_ALE; break; - case NAND_CTL_CLRALE: IO_ADDR_W &= ~MASK_ALE; break; - } - this->IO_ADDR_W = (void __iomem *) IO_ADDR_W; + struct nand_chip *chip = mtd->priv; + unsigned long mask; + + if (cmd == NAND_CMD_NONE) + return; + + mask = (ctrl & NAND_CLE) ? 0x02 : 0; + if (ctrl & NAND_ALE) + mask |= 0x04; + writeb(cmd, (unsigned long)chip->IO_ADDR_W | mask); } static int omap_nand_dev_ready(struct mtd_info *mtd) @@ -76,12 +81,10 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) unsigned long size = res->end - res->start + 1; int err; - info = kmalloc(sizeof(struct omap_nand_info), GFP_KERNEL); + info = kzalloc(sizeof(struct omap_nand_info), GFP_KERNEL); if (!info) return -ENOMEM; - memset(info, 0, sizeof(struct omap_nand_info)); - if (!request_mem_region(res->start, size, pdev->dev.driver->name)) { err = -EBUSY; goto out_free_info; @@ -93,8 +96,8 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) goto out_release_mem_region; } info->nand.IO_ADDR_W = info->nand.IO_ADDR_R; - info->nand.hwcontrol = omap_nand_hwcontrol; - info->nand.eccmode = NAND_ECC_SOFT; + info->nand.cmd_ctrl = omap_nand_hwcontrol; + info->nand.ecc.mode = NAND_ECC_SOFT; info->nand.options = pdata->options; if (pdata->dev_ready) info->nand.dev_ready = omap_nand_dev_ready;