* [PATCH] MTD: NAND: pxa3xx_nand: allow building as module @ 2009-01-19 11:27 Mike Rapoport 2009-01-19 11:40 ` Ben Dooks 0 siblings, 1 reply; 13+ messages in thread From: Mike Rapoport @ 2009-01-19 11:27 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, Mike Rapoport Signed-off-by: Mike Rapoport <mike@compulab.co.il> --- drivers/mtd/nand/Kconfig | 2 +- drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 8b12e6e..d3966d0 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE endchoice config MTD_NAND_PXA3xx - bool "Support for NAND flash devices on PXA3xx" + tristate "Support for NAND flash devices on PXA3xx" depends on MTD_NAND && PXA3xx help This enables the driver for the NAND flash device found on diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index cc55cbc..628ba08 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -123,6 +123,7 @@ struct pxa3xx_nand_info { struct clk *clk; void __iomem *mmio_base; + struct resource *res; unsigned int buf_start; unsigned int buf_count; @@ -1079,6 +1080,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) this = &info->nand_chip; mtd->priv = info; + mtd->owner = THIS_MODULE; info->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(info->clk)) { @@ -1125,6 +1127,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) goto fail_put_clk; } + info->res = r; info->mmio_base = ioremap(r->start, r->end - r->start + 1); if (info->mmio_base == NULL) { dev_err(&pdev->dev, "ioremap() failed\n"); @@ -1199,6 +1202,13 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) info->data_buff, info->data_buff_phys); } else kfree(info->data_buff); + + iounmap(info->mmio_base); + release_mem_region(info->res->start, info->res->end - info->res->start + 1); + + clk_disable(info->clk); + clk_put(info->clk); + kfree(mtd); return 0; } -- 1.5.6.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-19 11:27 [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport @ 2009-01-19 11:40 ` Ben Dooks 2009-01-20 3:16 ` Eric Miao 0 siblings, 1 reply; 13+ messages in thread From: Ben Dooks @ 2009-01-19 11:40 UTC (permalink / raw) To: Mike Rapoport; +Cc: linux-mtd, eric.miao, linux-arm-kernel On Mon, Jan 19, 2009 at 01:27:11PM +0200, Mike Rapoport wrote: > > Signed-off-by: Mike Rapoport <mike@compulab.co.il> > --- > drivers/mtd/nand/Kconfig | 2 +- > drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ > 2 files changed, 11 insertions(+), 1 deletions(-) > > diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig > index 8b12e6e..d3966d0 100644 > --- a/drivers/mtd/nand/Kconfig > +++ b/drivers/mtd/nand/Kconfig > @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE > endchoice > > config MTD_NAND_PXA3xx > - bool "Support for NAND flash devices on PXA3xx" > + tristate "Support for NAND flash devices on PXA3xx" > depends on MTD_NAND && PXA3xx > help > This enables the driver for the NAND flash device found on > diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c > index cc55cbc..628ba08 100644 > --- a/drivers/mtd/nand/pxa3xx_nand.c > +++ b/drivers/mtd/nand/pxa3xx_nand.c > @@ -123,6 +123,7 @@ struct pxa3xx_nand_info { > > struct clk *clk; > void __iomem *mmio_base; > + struct resource *res; > > unsigned int buf_start; > unsigned int buf_count; > @@ -1079,6 +1080,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) > > this = &info->nand_chip; > mtd->priv = info; > + mtd->owner = THIS_MODULE; > > info->clk = clk_get(&pdev->dev, NULL); > if (IS_ERR(info->clk)) { > @@ -1125,6 +1127,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) > goto fail_put_clk; > } > > + info->res = r; > info->mmio_base = ioremap(r->start, r->end - r->start + 1); > if (info->mmio_base == NULL) { > dev_err(&pdev->dev, "ioremap() failed\n"); > @@ -1199,6 +1202,13 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) > info->data_buff, info->data_buff_phys); > } else > kfree(info->data_buff); > + > + iounmap(info->mmio_base); > + release_mem_region(info->res->start, info->res->end - info->res->start + 1); resource_size() is probably better for the second argument. -- Ben Q: What's a light-year? A: One-third less calories than a regular year. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-19 11:40 ` Ben Dooks @ 2009-01-20 3:16 ` Eric Miao 2009-01-20 7:21 ` Mike Rapoport 2009-01-20 7:33 ` Mike Rapoport 0 siblings, 2 replies; 13+ messages in thread From: Eric Miao @ 2009-01-20 3:16 UTC (permalink / raw) To: Ben Dooks; +Cc: linux-mtd, eric.miao, linux-arm-kernel, Mike Rapoport On Mon, Jan 19, 2009 at 7:40 PM, Ben Dooks <ben-linux@fluff.org> wrote: > On Mon, Jan 19, 2009 at 01:27:11PM +0200, Mike Rapoport wrote: >> >> Signed-off-by: Mike Rapoport <mike@compulab.co.il> >> --- >> drivers/mtd/nand/Kconfig | 2 +- >> drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ >> 2 files changed, 11 insertions(+), 1 deletions(-) >> >> diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig >> index 8b12e6e..d3966d0 100644 >> --- a/drivers/mtd/nand/Kconfig >> +++ b/drivers/mtd/nand/Kconfig >> @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE >> endchoice >> >> config MTD_NAND_PXA3xx >> - bool "Support for NAND flash devices on PXA3xx" >> + tristate "Support for NAND flash devices on PXA3xx" >> depends on MTD_NAND && PXA3xx >> help >> This enables the driver for the NAND flash device found on >> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c >> index cc55cbc..628ba08 100644 >> --- a/drivers/mtd/nand/pxa3xx_nand.c >> +++ b/drivers/mtd/nand/pxa3xx_nand.c >> @@ -123,6 +123,7 @@ struct pxa3xx_nand_info { >> >> struct clk *clk; >> void __iomem *mmio_base; >> + struct resource *res; >> >> unsigned int buf_start; >> unsigned int buf_count; >> @@ -1079,6 +1080,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) >> >> this = &info->nand_chip; >> mtd->priv = info; >> + mtd->owner = THIS_MODULE; >> >> info->clk = clk_get(&pdev->dev, NULL); >> if (IS_ERR(info->clk)) { >> @@ -1125,6 +1127,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) >> goto fail_put_clk; >> } >> >> + info->res = r; >> info->mmio_base = ioremap(r->start, r->end - r->start + 1); >> if (info->mmio_base == NULL) { >> dev_err(&pdev->dev, "ioremap() failed\n"); >> @@ -1199,6 +1202,13 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) >> info->data_buff, info->data_buff_phys); >> } else >> kfree(info->data_buff); >> + >> + iounmap(info->mmio_base); >> + release_mem_region(info->res->start, info->res->end - info->res->start + 1); > > resource_size() is probably better for the second argument. > And maybe we don't even need to introduce the 'info->res', which is always valid by platform_get_resource() again in _remove(). ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-20 3:16 ` Eric Miao @ 2009-01-20 7:21 ` Mike Rapoport 2009-01-20 7:33 ` Mike Rapoport 1 sibling, 0 replies; 13+ messages in thread From: Mike Rapoport @ 2009-01-20 7:21 UTC (permalink / raw) To: Eric Miao; +Cc: eric.miao, linux-mtd, linux-arm-kernel, Ben Dooks Eric Miao wrote: > On Mon, Jan 19, 2009 at 7:40 PM, Ben Dooks <ben-linux@fluff.org> wrote: >> On Mon, Jan 19, 2009 at 01:27:11PM +0200, Mike Rapoport wrote: >>> Signed-off-by: Mike Rapoport <mike@compulab.co.il> >>> --- >>> drivers/mtd/nand/Kconfig | 2 +- >>> drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ >>> 2 files changed, 11 insertions(+), 1 deletions(-) >>> >>> diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig >>> index 8b12e6e..d3966d0 100644 >>> --- a/drivers/mtd/nand/Kconfig >>> +++ b/drivers/mtd/nand/Kconfig >>> @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE >>> endchoice >>> >>> config MTD_NAND_PXA3xx >>> - bool "Support for NAND flash devices on PXA3xx" >>> + tristate "Support for NAND flash devices on PXA3xx" >>> depends on MTD_NAND && PXA3xx >>> help >>> This enables the driver for the NAND flash device found on >>> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c >>> index cc55cbc..628ba08 100644 >>> --- a/drivers/mtd/nand/pxa3xx_nand.c >>> +++ b/drivers/mtd/nand/pxa3xx_nand.c >>> @@ -123,6 +123,7 @@ struct pxa3xx_nand_info { >>> >>> struct clk *clk; >>> void __iomem *mmio_base; >>> + struct resource *res; >>> >>> unsigned int buf_start; >>> unsigned int buf_count; >>> @@ -1079,6 +1080,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) >>> >>> this = &info->nand_chip; >>> mtd->priv = info; >>> + mtd->owner = THIS_MODULE; >>> >>> info->clk = clk_get(&pdev->dev, NULL); >>> if (IS_ERR(info->clk)) { >>> @@ -1125,6 +1127,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) >>> goto fail_put_clk; >>> } >>> >>> + info->res = r; >>> info->mmio_base = ioremap(r->start, r->end - r->start + 1); >>> if (info->mmio_base == NULL) { >>> dev_err(&pdev->dev, "ioremap() failed\n"); >>> @@ -1199,6 +1202,13 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) >>> info->data_buff, info->data_buff_phys); >>> } else >>> kfree(info->data_buff); >>> + >>> + iounmap(info->mmio_base); >>> + release_mem_region(info->res->start, info->res->end - info->res->start + 1); >> resource_size() is probably better for the second argument. >> > > And maybe we don't even need to introduce the 'info->res', which is > always valid by platform_get_resource() again in _remove(). Ok. > ______________________________________________________ > Linux MTD discussion mailing list > http://lists.infradead.org/mailman/listinfo/linux-mtd/ > -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-20 3:16 ` Eric Miao 2009-01-20 7:21 ` Mike Rapoport @ 2009-01-20 7:33 ` Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Mike Rapoport 1 sibling, 1 reply; 13+ messages in thread From: Mike Rapoport @ 2009-01-20 7:33 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, ben-linux This is updated version together with a patch that allows platform to keep NAND flash controller settings defined by the bootloader. -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' 2009-01-20 7:33 ` Mike Rapoport @ 2009-01-20 7:33 ` Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Eric Miao 0 siblings, 2 replies; 13+ messages in thread From: Mike Rapoport @ 2009-01-20 7:33 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, ben-linux, Mike Rapoport Signed-off-by: Mike Rapoport <mike@compulab.co.il> --- drivers/mtd/nand/pxa3xx_nand.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index cc55cbc..ffa960b 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -1118,14 +1118,14 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) goto fail_put_clk; } - r = request_mem_region(r->start, r->end - r->start + 1, pdev->name); + r = request_mem_region(r->start, resource_size(r), pdev->name); if (r == NULL) { dev_err(&pdev->dev, "failed to request memory resource\n"); ret = -EBUSY; goto fail_put_clk; } - info->mmio_base = ioremap(r->start, r->end - r->start + 1); + info->mmio_base = ioremap(r->start, resource_size(r)); if (info->mmio_base == NULL) { dev_err(&pdev->dev, "ioremap() failed\n"); ret = -ENODEV; @@ -1174,7 +1174,7 @@ fail_free_buf: fail_free_io: iounmap(info->mmio_base); fail_free_res: - release_mem_region(r->start, r->end - r->start + 1); + release_mem_region(r->start, resource_size(r)); fail_put_clk: clk_disable(info->clk); clk_put(info->clk); -- 1.5.6.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Mike Rapoport @ 2009-01-20 7:33 ` Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Eric Miao 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Eric Miao 1 sibling, 2 replies; 13+ messages in thread From: Mike Rapoport @ 2009-01-20 7:33 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, ben-linux, Mike Rapoport Signed-off-by: Mike Rapoport <mike@compulab.co.il> --- drivers/mtd/nand/Kconfig | 2 +- drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 8b12e6e..d3966d0 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE endchoice config MTD_NAND_PXA3xx - bool "Support for NAND flash devices on PXA3xx" + tristate "Support for NAND flash devices on PXA3xx" depends on MTD_NAND && PXA3xx help This enables the driver for the NAND flash device found on diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index ffa960b..ead4a7a 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -1079,6 +1079,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) this = &info->nand_chip; mtd->priv = info; + mtd->owner = THIS_MODULE; info->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(info->clk)) { @@ -1187,6 +1188,7 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) { struct mtd_info *mtd = platform_get_drvdata(pdev); struct pxa3xx_nand_info *info = mtd->priv; + struct resource *r; platform_set_drvdata(pdev, NULL); @@ -1199,6 +1201,14 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) info->data_buff, info->data_buff_phys); } else kfree(info->data_buff); + + iounmap(info->mmio_base); + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(r->start, resource_size(r)); + + clk_disable(info->clk); + clk_put(info->clk); + kfree(mtd); return 0; } -- 1.5.6.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport @ 2009-01-20 7:33 ` Mike Rapoport 2009-01-22 7:06 ` Mike Rapoport 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Eric Miao 1 sibling, 1 reply; 13+ messages in thread From: Mike Rapoport @ 2009-01-20 7:33 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, ben-linux, Mike Rapoport Signed-off-by: Mike Rapoport <mike@compulab.co.il> --- arch/arm/mach-pxa/include/mach/pxa3xx_nand.h | 3 + drivers/mtd/nand/pxa3xx_nand.c | 103 +++++++++++++++++++++++++- 2 files changed, 105 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h index eb35fca..3478eae 100644 --- a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h +++ b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h @@ -49,6 +49,9 @@ struct pxa3xx_nand_platform_data { */ int enable_arbiter; + /* allow platform code to keep OBM/bootloader defined NFC config */ + int keep_config; + const struct mtd_partition *parts; unsigned int nr_parts; diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index ead4a7a..2857a6a 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -171,7 +171,13 @@ static int use_dma = 1; module_param(use_dma, bool, 0444); MODULE_PARM_DESC(use_dma, "enable DMA for data transfering to/from NAND HW"); -#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN +/* + * Default NAND flash controller configuration setup by the + * bootloader. This configuration is used only when pdata->keep_config is set + */ +static struct pxa3xx_nand_timing default_timing; +static struct pxa3xx_nand_flash default_flash; + static struct pxa3xx_nand_cmdset smallpage_cmdset = { .read1 = 0x0000, .read2 = 0x0050, @@ -198,6 +204,7 @@ static struct pxa3xx_nand_cmdset largepage_cmdset = { .lock_status = 0x007A, }; +#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN static struct pxa3xx_nand_timing samsung512MbX16_timing = { .tCH = 10, .tCS = 0, @@ -297,9 +304,23 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = { #define NDTR1_tWHR(c) (min((c), 15) << 4) #define NDTR1_tAR(c) (min((c), 15) << 0) +#define tCH_NDTR0(r) (((r) >> 19) & 0x7) +#define tCS_NDTR0(r) (((r) >> 16) & 0x7) +#define tWH_NDTR0(r) (((r) >> 11) & 0x7) +#define tWP_NDTR0(r) (((r) >> 8) & 0x7) +#define tRH_NDTR0(r) (((r) >> 3) & 0x7) +#define tRP_NDTR0(r) (((r) >> 0) & 0x7) + +#define tR_NDTR1(r) (((r) >> 16) & 0xffff) +#define tWHR_NDTR1(r) (((r) >> 4) & 0xf) +#define tAR_NDTR1(r) (((r) >> 0) & 0xf) + /* convert nano-seconds to nand flash controller clock cycles */ #define ns2cycle(ns, clk) (int)(((ns) * (clk / 1000000) / 1000) - 1) +/* convert nand flash controller clock cycles to nano-seconds */ +#define cycle2ns(c, clk) ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000)) + static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info, const struct pxa3xx_nand_timing *t) { @@ -921,6 +942,82 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info, return 0; } +static void pxa3xx_nand_detect_timing(struct pxa3xx_nand_info *info, + struct pxa3xx_nand_timing *t) +{ + unsigned long nand_clk = clk_get_rate(info->clk); + uint32_t ndtr0 = nand_readl(info, NDTR0CS0); + uint32_t ndtr1 = nand_readl(info, NDTR1CS0); + + t->tCH = cycle2ns(tCH_NDTR0(ndtr0), nand_clk); + t->tCS = cycle2ns(tCS_NDTR0(ndtr0), nand_clk); + t->tWH = cycle2ns(tWH_NDTR0(ndtr0), nand_clk); + t->tWP = cycle2ns(tWP_NDTR0(ndtr0), nand_clk); + t->tRH = cycle2ns(tRH_NDTR0(ndtr0), nand_clk); + t->tRP = cycle2ns(tRP_NDTR0(ndtr0), nand_clk); + + t->tR = cycle2ns(tR_NDTR1(ndtr1), nand_clk); + t->tWHR = cycle2ns(tWHR_NDTR1(ndtr1), nand_clk); + t->tAR = cycle2ns(tAR_NDTR1(ndtr1), nand_clk); +} + +static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info) +{ + uint32_t ndcr = nand_readl(info, NDCR); + struct nand_flash_dev *type = NULL; + uint32_t id = -1; + int i; + + default_flash.page_per_block = ndcr & NDCR_PG_PER_BLK ? 64 : 32; + default_flash.page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512; + default_flash.flash_width = ndcr & NDCR_DWIDTH_M ? 16 : 8; + default_flash.dfc_width = ndcr & NDCR_DWIDTH_C ? 16 : 8; + + if (default_flash.page_size == 2048) + default_flash.cmdset = &largepage_cmdset; + else + default_flash.cmdset = &smallpage_cmdset; + + /* set info fields needed to __readid */ + info->flash_info = &default_flash; + info->read_id_bytes = (default_flash.page_size == 2048) ? 4 : 2; + info->reg_ndcr = ndcr; + + if (__readid(info, &id)) + return -ENODEV; + + /* Lookup the flash id */ + id = (id >> 8) & 0xff; /* device id is byte 2 */ + for (i = 0; nand_flash_ids[i].name != NULL; i++) { + if (id == nand_flash_ids[i].id) { + type = &nand_flash_ids[i]; + break; + } + } + + if (!type) + return -ENODEV; + + /* fill the missing flash information */ + i = __ffs(default_flash.page_per_block * default_flash.page_size); + default_flash.num_blocks = type->chipsize << (20 - i); + + info->oob_size = (default_flash.page_size == 2048) ? 64 : 16; + + /* calculate addressing information */ + info->col_addr_cycles = (default_flash.page_size == 2048) ? 2 : 1; + + if (default_flash.num_blocks * default_flash.page_per_block > 65536) + info->row_addr_cycles = 3; + else + info->row_addr_cycles = 2; + + pxa3xx_nand_detect_timing(info, &default_timing); + default_flash.timing = &default_timing; + + return 0; +} + static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, const struct pxa3xx_nand_platform_data *pdata) { @@ -928,6 +1025,10 @@ static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, uint32_t id = -1; int i; + if (pdata->keep_config) + if (pxa3xx_nand_detect_config(info) == 0) + return 0; + for (i = 0; i<pdata->num_flash; ++i) { f = pdata->flash + i; -- 1.5.6.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport @ 2009-01-22 7:06 ` Mike Rapoport 2009-01-22 8:03 ` Eric Miao 0 siblings, 1 reply; 13+ messages in thread From: Mike Rapoport @ 2009-01-22 7:06 UTC (permalink / raw) To: eric.miao; +Cc: linux-mtd, linux-arm-kernel, ben-linux Eric, Any comments? Mike Rapoport wrote: > Signed-off-by: Mike Rapoport <mike@compulab.co.il> > --- > arch/arm/mach-pxa/include/mach/pxa3xx_nand.h | 3 + > drivers/mtd/nand/pxa3xx_nand.c | 103 +++++++++++++++++++++++++- > 2 files changed, 105 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h > index eb35fca..3478eae 100644 > --- a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h > +++ b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h > @@ -49,6 +49,9 @@ struct pxa3xx_nand_platform_data { > */ > int enable_arbiter; > > + /* allow platform code to keep OBM/bootloader defined NFC config */ > + int keep_config; > + > const struct mtd_partition *parts; > unsigned int nr_parts; > > diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c > index ead4a7a..2857a6a 100644 > --- a/drivers/mtd/nand/pxa3xx_nand.c > +++ b/drivers/mtd/nand/pxa3xx_nand.c > @@ -171,7 +171,13 @@ static int use_dma = 1; > module_param(use_dma, bool, 0444); > MODULE_PARM_DESC(use_dma, "enable DMA for data transfering to/from NAND HW"); > > -#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN > +/* > + * Default NAND flash controller configuration setup by the > + * bootloader. This configuration is used only when pdata->keep_config is set > + */ > +static struct pxa3xx_nand_timing default_timing; > +static struct pxa3xx_nand_flash default_flash; > + > static struct pxa3xx_nand_cmdset smallpage_cmdset = { > .read1 = 0x0000, > .read2 = 0x0050, > @@ -198,6 +204,7 @@ static struct pxa3xx_nand_cmdset largepage_cmdset = { > .lock_status = 0x007A, > }; > > +#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN > static struct pxa3xx_nand_timing samsung512MbX16_timing = { > .tCH = 10, > .tCS = 0, > @@ -297,9 +304,23 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = { > #define NDTR1_tWHR(c) (min((c), 15) << 4) > #define NDTR1_tAR(c) (min((c), 15) << 0) > > +#define tCH_NDTR0(r) (((r) >> 19) & 0x7) > +#define tCS_NDTR0(r) (((r) >> 16) & 0x7) > +#define tWH_NDTR0(r) (((r) >> 11) & 0x7) > +#define tWP_NDTR0(r) (((r) >> 8) & 0x7) > +#define tRH_NDTR0(r) (((r) >> 3) & 0x7) > +#define tRP_NDTR0(r) (((r) >> 0) & 0x7) > + > +#define tR_NDTR1(r) (((r) >> 16) & 0xffff) > +#define tWHR_NDTR1(r) (((r) >> 4) & 0xf) > +#define tAR_NDTR1(r) (((r) >> 0) & 0xf) > + > /* convert nano-seconds to nand flash controller clock cycles */ > #define ns2cycle(ns, clk) (int)(((ns) * (clk / 1000000) / 1000) - 1) > > +/* convert nand flash controller clock cycles to nano-seconds */ > +#define cycle2ns(c, clk) ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000)) > + > static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info, > const struct pxa3xx_nand_timing *t) > { > @@ -921,6 +942,82 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info, > return 0; > } > > +static void pxa3xx_nand_detect_timing(struct pxa3xx_nand_info *info, > + struct pxa3xx_nand_timing *t) > +{ > + unsigned long nand_clk = clk_get_rate(info->clk); > + uint32_t ndtr0 = nand_readl(info, NDTR0CS0); > + uint32_t ndtr1 = nand_readl(info, NDTR1CS0); > + > + t->tCH = cycle2ns(tCH_NDTR0(ndtr0), nand_clk); > + t->tCS = cycle2ns(tCS_NDTR0(ndtr0), nand_clk); > + t->tWH = cycle2ns(tWH_NDTR0(ndtr0), nand_clk); > + t->tWP = cycle2ns(tWP_NDTR0(ndtr0), nand_clk); > + t->tRH = cycle2ns(tRH_NDTR0(ndtr0), nand_clk); > + t->tRP = cycle2ns(tRP_NDTR0(ndtr0), nand_clk); > + > + t->tR = cycle2ns(tR_NDTR1(ndtr1), nand_clk); > + t->tWHR = cycle2ns(tWHR_NDTR1(ndtr1), nand_clk); > + t->tAR = cycle2ns(tAR_NDTR1(ndtr1), nand_clk); > +} > + > +static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info) > +{ > + uint32_t ndcr = nand_readl(info, NDCR); > + struct nand_flash_dev *type = NULL; > + uint32_t id = -1; > + int i; > + > + default_flash.page_per_block = ndcr & NDCR_PG_PER_BLK ? 64 : 32; > + default_flash.page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512; > + default_flash.flash_width = ndcr & NDCR_DWIDTH_M ? 16 : 8; > + default_flash.dfc_width = ndcr & NDCR_DWIDTH_C ? 16 : 8; > + > + if (default_flash.page_size == 2048) > + default_flash.cmdset = &largepage_cmdset; > + else > + default_flash.cmdset = &smallpage_cmdset; > + > + /* set info fields needed to __readid */ > + info->flash_info = &default_flash; > + info->read_id_bytes = (default_flash.page_size == 2048) ? 4 : 2; > + info->reg_ndcr = ndcr; > + > + if (__readid(info, &id)) > + return -ENODEV; > + > + /* Lookup the flash id */ > + id = (id >> 8) & 0xff; /* device id is byte 2 */ > + for (i = 0; nand_flash_ids[i].name != NULL; i++) { > + if (id == nand_flash_ids[i].id) { > + type = &nand_flash_ids[i]; > + break; > + } > + } > + > + if (!type) > + return -ENODEV; > + > + /* fill the missing flash information */ > + i = __ffs(default_flash.page_per_block * default_flash.page_size); > + default_flash.num_blocks = type->chipsize << (20 - i); > + > + info->oob_size = (default_flash.page_size == 2048) ? 64 : 16; > + > + /* calculate addressing information */ > + info->col_addr_cycles = (default_flash.page_size == 2048) ? 2 : 1; > + > + if (default_flash.num_blocks * default_flash.page_per_block > 65536) > + info->row_addr_cycles = 3; > + else > + info->row_addr_cycles = 2; > + > + pxa3xx_nand_detect_timing(info, &default_timing); > + default_flash.timing = &default_timing; > + > + return 0; > +} > + > static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, > const struct pxa3xx_nand_platform_data *pdata) > { > @@ -928,6 +1025,10 @@ static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, > uint32_t id = -1; > int i; > > + if (pdata->keep_config) > + if (pxa3xx_nand_detect_config(info) == 0) > + return 0; > + > for (i = 0; i<pdata->num_flash; ++i) { > f = pdata->flash + i; > -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader 2009-01-22 7:06 ` Mike Rapoport @ 2009-01-22 8:03 ` Eric Miao 0 siblings, 0 replies; 13+ messages in thread From: Eric Miao @ 2009-01-22 8:03 UTC (permalink / raw) To: Mike Rapoport; +Cc: linux-mtd, eric.miao, linux-arm-kernel, ben-linux On Thu, Jan 22, 2009 at 3:06 PM, Mike Rapoport <mike@compulab.co.il> wrote: > Eric, > Any comments? Yes, I'm OK with this. Acked-by: Eric Miao <eric.miao@marvell.com> > > Mike Rapoport wrote: >> Signed-off-by: Mike Rapoport <mike@compulab.co.il> >> --- >> arch/arm/mach-pxa/include/mach/pxa3xx_nand.h | 3 + >> drivers/mtd/nand/pxa3xx_nand.c | 103 +++++++++++++++++++++++++- >> 2 files changed, 105 insertions(+), 1 deletions(-) >> >> diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h >> index eb35fca..3478eae 100644 >> --- a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h >> +++ b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h >> @@ -49,6 +49,9 @@ struct pxa3xx_nand_platform_data { >> */ >> int enable_arbiter; >> >> + /* allow platform code to keep OBM/bootloader defined NFC config */ >> + int keep_config; >> + >> const struct mtd_partition *parts; >> unsigned int nr_parts; >> >> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c >> index ead4a7a..2857a6a 100644 >> --- a/drivers/mtd/nand/pxa3xx_nand.c >> +++ b/drivers/mtd/nand/pxa3xx_nand.c >> @@ -171,7 +171,13 @@ static int use_dma = 1; >> module_param(use_dma, bool, 0444); >> MODULE_PARM_DESC(use_dma, "enable DMA for data transfering to/from NAND HW"); >> >> -#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN >> +/* >> + * Default NAND flash controller configuration setup by the >> + * bootloader. This configuration is used only when pdata->keep_config is set >> + */ >> +static struct pxa3xx_nand_timing default_timing; >> +static struct pxa3xx_nand_flash default_flash; >> + >> static struct pxa3xx_nand_cmdset smallpage_cmdset = { >> .read1 = 0x0000, >> .read2 = 0x0050, >> @@ -198,6 +204,7 @@ static struct pxa3xx_nand_cmdset largepage_cmdset = { >> .lock_status = 0x007A, >> }; >> >> +#ifdef CONFIG_MTD_NAND_PXA3xx_BUILTIN >> static struct pxa3xx_nand_timing samsung512MbX16_timing = { >> .tCH = 10, >> .tCS = 0, >> @@ -297,9 +304,23 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = { >> #define NDTR1_tWHR(c) (min((c), 15) << 4) >> #define NDTR1_tAR(c) (min((c), 15) << 0) >> >> +#define tCH_NDTR0(r) (((r) >> 19) & 0x7) >> +#define tCS_NDTR0(r) (((r) >> 16) & 0x7) >> +#define tWH_NDTR0(r) (((r) >> 11) & 0x7) >> +#define tWP_NDTR0(r) (((r) >> 8) & 0x7) >> +#define tRH_NDTR0(r) (((r) >> 3) & 0x7) >> +#define tRP_NDTR0(r) (((r) >> 0) & 0x7) >> + >> +#define tR_NDTR1(r) (((r) >> 16) & 0xffff) >> +#define tWHR_NDTR1(r) (((r) >> 4) & 0xf) >> +#define tAR_NDTR1(r) (((r) >> 0) & 0xf) >> + >> /* convert nano-seconds to nand flash controller clock cycles */ >> #define ns2cycle(ns, clk) (int)(((ns) * (clk / 1000000) / 1000) - 1) >> >> +/* convert nand flash controller clock cycles to nano-seconds */ >> +#define cycle2ns(c, clk) ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000)) >> + >> static void pxa3xx_nand_set_timing(struct pxa3xx_nand_info *info, >> const struct pxa3xx_nand_timing *t) >> { >> @@ -921,6 +942,82 @@ static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info, >> return 0; >> } >> >> +static void pxa3xx_nand_detect_timing(struct pxa3xx_nand_info *info, >> + struct pxa3xx_nand_timing *t) >> +{ >> + unsigned long nand_clk = clk_get_rate(info->clk); >> + uint32_t ndtr0 = nand_readl(info, NDTR0CS0); >> + uint32_t ndtr1 = nand_readl(info, NDTR1CS0); >> + >> + t->tCH = cycle2ns(tCH_NDTR0(ndtr0), nand_clk); >> + t->tCS = cycle2ns(tCS_NDTR0(ndtr0), nand_clk); >> + t->tWH = cycle2ns(tWH_NDTR0(ndtr0), nand_clk); >> + t->tWP = cycle2ns(tWP_NDTR0(ndtr0), nand_clk); >> + t->tRH = cycle2ns(tRH_NDTR0(ndtr0), nand_clk); >> + t->tRP = cycle2ns(tRP_NDTR0(ndtr0), nand_clk); >> + >> + t->tR = cycle2ns(tR_NDTR1(ndtr1), nand_clk); >> + t->tWHR = cycle2ns(tWHR_NDTR1(ndtr1), nand_clk); >> + t->tAR = cycle2ns(tAR_NDTR1(ndtr1), nand_clk); >> +} >> + >> +static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info) >> +{ >> + uint32_t ndcr = nand_readl(info, NDCR); >> + struct nand_flash_dev *type = NULL; >> + uint32_t id = -1; >> + int i; >> + >> + default_flash.page_per_block = ndcr & NDCR_PG_PER_BLK ? 64 : 32; >> + default_flash.page_size = ndcr & NDCR_PAGE_SZ ? 2048 : 512; >> + default_flash.flash_width = ndcr & NDCR_DWIDTH_M ? 16 : 8; >> + default_flash.dfc_width = ndcr & NDCR_DWIDTH_C ? 16 : 8; >> + >> + if (default_flash.page_size == 2048) >> + default_flash.cmdset = &largepage_cmdset; >> + else >> + default_flash.cmdset = &smallpage_cmdset; >> + >> + /* set info fields needed to __readid */ >> + info->flash_info = &default_flash; >> + info->read_id_bytes = (default_flash.page_size == 2048) ? 4 : 2; >> + info->reg_ndcr = ndcr; >> + >> + if (__readid(info, &id)) >> + return -ENODEV; >> + >> + /* Lookup the flash id */ >> + id = (id >> 8) & 0xff; /* device id is byte 2 */ >> + for (i = 0; nand_flash_ids[i].name != NULL; i++) { >> + if (id == nand_flash_ids[i].id) { >> + type = &nand_flash_ids[i]; >> + break; >> + } >> + } >> + >> + if (!type) >> + return -ENODEV; >> + >> + /* fill the missing flash information */ >> + i = __ffs(default_flash.page_per_block * default_flash.page_size); >> + default_flash.num_blocks = type->chipsize << (20 - i); >> + >> + info->oob_size = (default_flash.page_size == 2048) ? 64 : 16; >> + >> + /* calculate addressing information */ >> + info->col_addr_cycles = (default_flash.page_size == 2048) ? 2 : 1; >> + >> + if (default_flash.num_blocks * default_flash.page_per_block > 65536) >> + info->row_addr_cycles = 3; >> + else >> + info->row_addr_cycles = 2; >> + >> + pxa3xx_nand_detect_timing(info, &default_timing); >> + default_flash.timing = &default_timing; >> + >> + return 0; >> +} >> + >> static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, >> const struct pxa3xx_nand_platform_data *pdata) >> { >> @@ -928,6 +1025,10 @@ static int pxa3xx_nand_detect_flash(struct pxa3xx_nand_info *info, >> uint32_t id = -1; >> int i; >> >> + if (pdata->keep_config) >> + if (pxa3xx_nand_detect_config(info) == 0) >> + return 0; >> + >> for (i = 0; i<pdata->num_flash; ++i) { >> f = pdata->flash + i; >> > > -- > Sincerely yours, > Mike. > > > ------------------------------------------------------------------- > List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel > FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php > Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php > -- Cheers - eric ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport @ 2009-01-20 9:01 ` Eric Miao 1 sibling, 0 replies; 13+ messages in thread From: Eric Miao @ 2009-01-20 9:01 UTC (permalink / raw) To: Mike Rapoport; +Cc: linux-mtd, eric.miao, linux-arm-kernel, ben-linux On Tue, Jan 20, 2009 at 3:33 PM, Mike Rapoport <mike@compulab.co.il> wrote: > > Signed-off-by: Mike Rapoport <mike@compulab.co.il> Looks OK. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport @ 2009-01-20 9:01 ` Eric Miao 1 sibling, 0 replies; 13+ messages in thread From: Eric Miao @ 2009-01-20 9:01 UTC (permalink / raw) To: Mike Rapoport; +Cc: linux-mtd, eric.miao, linux-arm-kernel, ben-linux On Tue, Jan 20, 2009 at 3:33 PM, Mike Rapoport <mike@compulab.co.il> wrote: > > Signed-off-by: Mike Rapoport <mike@compulab.co.il> OK > --- > drivers/mtd/nand/pxa3xx_nand.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c > index cc55cbc..ffa960b 100644 > --- a/drivers/mtd/nand/pxa3xx_nand.c > +++ b/drivers/mtd/nand/pxa3xx_nand.c > @@ -1118,14 +1118,14 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) > goto fail_put_clk; > } > > - r = request_mem_region(r->start, r->end - r->start + 1, pdev->name); > + r = request_mem_region(r->start, resource_size(r), pdev->name); > if (r == NULL) { > dev_err(&pdev->dev, "failed to request memory resource\n"); > ret = -EBUSY; > goto fail_put_clk; > } > > - info->mmio_base = ioremap(r->start, r->end - r->start + 1); > + info->mmio_base = ioremap(r->start, resource_size(r)); > if (info->mmio_base == NULL) { > dev_err(&pdev->dev, "ioremap() failed\n"); > ret = -ENODEV; > @@ -1174,7 +1174,7 @@ fail_free_buf: > fail_free_io: > iounmap(info->mmio_base); > fail_free_res: > - release_mem_region(r->start, r->end - r->start + 1); > + release_mem_region(r->start, resource_size(r)); > fail_put_clk: > clk_disable(info->clk); > clk_put(info->clk); > -- > 1.5.6.4 > > > ------------------------------------------------------------------- > List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel > FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php > Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php > -- Cheers - eric ^ permalink raw reply [flat|nested] 13+ messages in thread
* pxa3xx_nand improvements @ 2009-02-17 11:54 Mike Rapoport 2009-02-17 11:54 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport 0 siblings, 1 reply; 13+ messages in thread From: Mike Rapoport @ 2009-02-17 11:54 UTC (permalink / raw) To: dwmw2; +Cc: eric.miao, linux-mtd David, Can you please merge the pxa3xx_nand patches? ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH] MTD: NAND: pxa3xx_nand: allow building as module 2009-02-17 11:54 pxa3xx_nand improvements Mike Rapoport @ 2009-02-17 11:54 ` Mike Rapoport 0 siblings, 0 replies; 13+ messages in thread From: Mike Rapoport @ 2009-02-17 11:54 UTC (permalink / raw) To: dwmw2; +Cc: eric.miao, linux-mtd Signed-off-by: Mike Rapoport <mike@compulab.co.il> --- drivers/mtd/nand/Kconfig | 2 +- drivers/mtd/nand/pxa3xx_nand.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 8b12e6e..d3966d0 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig @@ -334,7 +334,7 @@ config MTD_NAND_ATMEL_ECC_NONE endchoice config MTD_NAND_PXA3xx - bool "Support for NAND flash devices on PXA3xx" + tristate "Support for NAND flash devices on PXA3xx" depends on MTD_NAND && PXA3xx help This enables the driver for the NAND flash device found on diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index ffa960b..ead4a7a 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c @@ -1079,6 +1079,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) this = &info->nand_chip; mtd->priv = info; + mtd->owner = THIS_MODULE; info->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(info->clk)) { @@ -1187,6 +1188,7 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) { struct mtd_info *mtd = platform_get_drvdata(pdev); struct pxa3xx_nand_info *info = mtd->priv; + struct resource *r; platform_set_drvdata(pdev, NULL); @@ -1199,6 +1201,14 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) info->data_buff, info->data_buff_phys); } else kfree(info->data_buff); + + iounmap(info->mmio_base); + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(r->start, resource_size(r)); + + clk_disable(info->clk); + clk_put(info->clk); + kfree(mtd); return 0; } -- 1.5.6.4 ^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-02-17 11:55 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-01-19 11:27 [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport 2009-01-19 11:40 ` Ben Dooks 2009-01-20 3:16 ` Eric Miao 2009-01-20 7:21 ` Mike Rapoport 2009-01-20 7:33 ` Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport 2009-01-20 7:33 ` [PATCH] MTD: NAND: pxa3xx_nand: add ability to keep controller settings defined by OBM/bootloader Mike Rapoport 2009-01-22 7:06 ` Mike Rapoport 2009-01-22 8:03 ` Eric Miao 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Eric Miao 2009-01-20 9:01 ` [PATCH] MTD: NAND: pxa3xx_nand: use resource_size instead of 'r->end - r->start + 1' Eric Miao -- strict thread matches above, loose matches on Subject: below -- 2009-02-17 11:54 pxa3xx_nand improvements Mike Rapoport 2009-02-17 11:54 ` [PATCH] MTD: NAND: pxa3xx_nand: allow building as module Mike Rapoport
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.