OMAP-GPMC related cleanup for common zImage
Subsystems (8)
v2 cover OMAP-GPMC related cleanup for common zImage
Hi,
This version(v2) of gpmc related cleanup for common zImage compared to initial version, resolves build error upon selecting BCH CONFIG option. Also a trivial patch on gpmc header removal from nand driver has been squashed with patch that removes nand driver dependency on gpmc header file.
This series cleans up omap-gpmc related code so that omap can be a part of common zImage.
This series moves gpmc.h from plat-omap/include/plat to mach-omap2 so that header file is local.
Patches 1-4 qualifies as -rc material.
Patch 1 is an already posted one, has been pulled into this series.
Patches 5-6 removes necessity of cpu.h from onenand driver based on Tony's suggestion.
Patches 7 & 8 cleans up the already moved platform data header files to contain only platform data. Also gpmc-nand information is moved to nand platform data header.
Patches 9-13 makes nand driver independent of gpmc header file
And the final patch localizes gpmc header.
This has been tested on omap3evm.
This series is available
@ git://gitorious.org/x0148406-public/linux-kernel.git gpmc-czimage-v2
and is based on
linux-next (next-20121005)
and is dependent on
http://marc.info/?l=linux-omap&m=134945131602622&w=2Regards
Afzal
Afzal Mohammed (14):
ARM: OMAP2+: gpmc: annotate exit sections properly
mtd: onenand: omap: cleanup gpmc dependency
mtd: nand: omap: free region as per resource size
mtd: nand: omap: read nand using register address
ARM: OMAP2+: onenand: connected soc info in pdata
mtd: onenand: omap: use pdata info instead of cpu_is
ARM: OMAP2+: onenand: header cleanup
ARM: OMAP2+: nand: header cleanup
mtd: nand: omap: bring in gpmc nand macros
ARM: OMAP2+: nand: bch capability check
ARM: OMAP2+: gpmc: nand register helper bch update
mtd: nand: omap: handle gpmc bch[48]
ARM: OMAP2+: gpmc: remove exported nand functions
ARM: OMAP2+: gpmc: localize gpmc header
arch/arm/mach-omap2/board-2430sdp.c | 2 +- arch/arm/mach-omap2/board-3430sdp.c | 2 +- arch/arm/mach-omap2/board-apollon.c | 2 +- arch/arm/mach-omap2/board-cm-t35.c | 5 +- arch/arm/mach-omap2/board-cm-t3517.c | 5 +- arch/arm/mach-omap2/board-devkit8000.c | 2 +- arch/arm/mach-omap2/board-flash.c | 7 +- arch/arm/mach-omap2/board-flash.h | 2 +- arch/arm/mach-omap2/board-h4.c | 2 +- arch/arm/mach-omap2/board-igep0020.c | 3 +- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-n8x0.c | 1 + arch/arm/mach-omap2/board-omap3beagle.c | 2 +- arch/arm/mach-omap2/board-omap3logic.c | 2 +- arch/arm/mach-omap2/board-omap3pandora.c | 3 +- arch/arm/mach-omap2/board-omap3stalker.c | 2 +- arch/arm/mach-omap2/board-omap3touchbook.c | 2 +- arch/arm/mach-omap2/board-overo.c | 2 +- arch/arm/mach-omap2/board-rm680.c | 3 +- arch/arm/mach-omap2/board-rx51-peripherals.c | 3 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/board-zoom-debugboard.c | 2 +- arch/arm/mach-omap2/common-board-devices.c | 1 - arch/arm/mach-omap2/gpmc-nand.c | 81 +++-- arch/arm/mach-omap2/gpmc-nand.h | 27 ++ arch/arm/mach-omap2/gpmc-onenand.c | 9 +- arch/arm/mach-omap2/gpmc-onenand.h | 24 ++ arch/arm/mach-omap2/gpmc-smc91x.c | 2 +- arch/arm/mach-omap2/gpmc-smsc911x.c | 2 +- arch/arm/mach-omap2/gpmc.c | 459 ++---------------------- arch/arm/mach-omap2/gpmc.h | 154 ++++++++ arch/arm/mach-omap2/pm34xx.c | 2 +- arch/arm/mach-omap2/usb-tusb6010.c | 2 +- arch/arm/plat-omap/include/plat/gpmc.h | 209 ----------- drivers/mtd/nand/omap2.c | 125 +++++-- drivers/mtd/onenand/omap2.c | 9 +- include/linux/platform_data/mtd-nand-omap2.h | 46 ++- include/linux/platform_data/mtd-onenand-omap2.h | 20 +- 38 files changed, 472 insertions(+), 758 deletions(-) create mode 100644 arch/arm/mach-omap2/gpmc-nand.h create mode 100644 arch/arm/mach-omap2/gpmc-onenand.h create mode 100644 arch/arm/mach-omap2/gpmc.h delete mode 100644 arch/arm/plat-omap/include/plat/gpmc.h
Signature · 1 line
1.7.12
PATCH v2 1/14 ARM: OMAP2+: gpmc: annotate exit sections properly
compiler complained,gpmc_remove' referenced in section .data' of arch/arm/mach-omap2/built-in.o: defined in discarded section `.exit.text' of arch/arm/mach-omap2/built-in.o
Annotate gpmc_remove function and dependents with __devexit.
--- arch/arm/mach-omap2/gpmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/gpmc.c +2 -2
@@ -886,7 +886,7 @@ static int gpmc_setup_irq(void)return request_irq (gpmc_irq, gpmc_handle_irq,0 ,"gpmc" ,NULL ); } -static __exit int gpmc_free_irq(void) +static __devexit int gpmc_free_irq(void) {int i;
@@ -992,7 +992,7 @@ static __devinit int gpmc_probe(struct platform_device *pdev)return 0 ; } -static __exit int gpmc_remove(struct platform_device *pdev) +static __devexit int gpmc_remove(struct platform_device *pdev) {gpmc_free_irq ();gpmc_mem_exit ();
Signature · 1 line
1.7.12
PATCH v2 2/14 mtd: onenand: omap: cleanup gpmc dependency
In reply to Afzal Mohammedrequesting, freeing gpmc cs is now handled fully
by gpmc, remove left out gpmc dependency as well
as unnecessary include of gpmc.h
--- drivers/mtd/onenand/omap2.c | 2 -- 1 file changed, 2 deletions(-)
drivers/mtd/onenand/omap2.c +0 -2
@@ -38,7 +38,6 @@#include <linux/regulator/consumer.h> #include <asm/mach/flash.h> -#include <plat/gpmc.h> #include <linux/platform_data/mtd-onenand-omap2.h> #include <asm/gpio.h>
@@ -803,7 +802,6 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev) }iounmap (c->onenand.base);release_mem_region (c->phys_base, c->mem_size); -gpmc_cs_free (c->gpmc_cs);kfree (c);return 0 ;
Signature · 1 line
1.7.12
PATCH v2 3/14 mtd: nand: omap: free region as per resource size
In reply to Afzal Mohammedmemory as is now obtained via resource, upon freeing use resource size. This also helps get rid of one macro.
--- drivers/mtd/nand/omap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/omap2.c +1 -1
@@ -1513,7 +1513,7 @@ static int omap_nand_remove(struct platform_device *pdev)/* Release NAND device, its internal structures and partitions */ nand_release (&info->mtd);iounmap (info->nand.IO_ADDR_R); -release_mem_region (info->phys_base,NAND_IO_SIZE ); +release_mem_region (info->phys_base, info->mem_size);kfree (info);return 0 ; }
Signature · 1 line
1.7.12
PATCH v2 4/14 mtd: nand: omap: read nand using register address
In reply to Afzal MohammedNow that gpmc-nand registers are available in driver, use it to read nand data.
"65b97cf mtd: nand: omap2: handle nand on gpmc" modified all other instances. After initial versions of that patch, a new change added reading nand data using gpmc exposed function. In the final version this change was not taken care.
--- drivers/mtd/nand/omap2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/omap2.c +1 -1
@@ -996,7 +996,7 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)cond_resched (); } - status =gpmc_nand_read (info->gpmc_cs,GPMC_NAND_DATA ); + status =readb (info->reg.gpmc_nand_data);return status; }
Signature · 1 line
1.7.12
PATCH v2 5/14 ARM: OMAP2+: onenand: connected soc info in pdata
In reply to Afzal Mohammedonenand driver needs to know whether soc is falling under 34xx family to properly handle onenand. But driver is not supposed to do cpu_is_* check, hence educate platform data with this information. Driver can make use of it to avoid cpu_is_* check.
--- arch/arm/mach-omap2/gpmc-onenand.c | 5 +++++ include/linux/platform_data/mtd-onenand-omap2.h | 1 + 2 files changed, 6 insertions(+)
arch/arm/mach-omap2/gpmc-onenand.c +5 -0
@@ -409,6 +409,11 @@ void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data) gpmc_onenand_data->flags |=ONENAND_SYNC_READ ; } +if (cpu_is_omap34xx ()) + gpmc_onenand_data->flags |=ONENAND_IN_OMAP34XX ; +else + gpmc_onenand_data->flags &= ~ONENAND_IN_OMAP34XX ; + err =gpmc_cs_request (gpmc_onenand_data->cs,ONENAND_IO_SIZE , (unsigned long *)&gpmc_onenand_resource.start);if (err <0 ) {
include/linux/platform_data/mtd-onenand-omap2.h +1 -0
@@ -14,6 +14,7 @@#define ONENAND_SYNC_READ (1 << 0)#define ONENAND_SYNC_READWRITE (1 << 1) +#define ONENAND_IN_OMAP34XX (1 << 2)struct omap_onenand_platform_data {int cs;
Signature · 1 line
1.7.12
PATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
In reply to Afzal Mohammedplatform data now contains a field to indicate whether soc belongs to omap34xx family, use it instead of cpu_is_* check.
This helps in removing dependency of platform specific header file - cpu.h
--- drivers/mtd/onenand/omap2.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/mtd/onenand/omap2.c +4 -3
@@ -42,7 +42,6 @@#include <asm/gpio.h> #include <plat/dma.h> -#include <plat/cpu.h> #define DRIVER_NAME "omap2-onenand"
@@ -62,6 +61,7 @@ struct omap2_onenand {int freq;int (*setup)(void __iomem *base,int *freq_ptr);struct regulator *regulator; +u8 flags; };static void omap2_onenand_dma_cb (int lch,u16 ch_status,void *data)
@@ -154,7 +154,7 @@ static int omap2_onenand_wait(struct mtd_info *mtd, int state)if (!(syscfg &ONENAND_SYS_CFG1_IOBE )) { syscfg |=ONENAND_SYS_CFG1_IOBE ;write_reg (c, syscfg,ONENAND_REG_SYS_CFG1 ); -if (cpu_is_omap34xx ()) +if (c->flags &ONENAND_IN_OMAP34XX )/* Add a delay to let GPIO settle */ syscfg =read_reg (c,ONENAND_REG_SYS_CFG1 ); }
@@ -638,6 +638,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)init_completion (&c->irq_done);init_completion (&c->dma_done); + c->flags = pdata->flags; c->gpmc_cs = pdata->cs; c->gpio_irq = pdata->gpio_irq; c->dma_channel = pdata->dma_channel;
@@ -728,7 +729,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) this = &c->onenand;if (c->dma_channel >=0 ) { this->wait = omap2_onenand_wait; -if (cpu_is_omap34xx ()) { +if (c->flags &ONENAND_IN_OMAP34XX ) { this->read_bufferram = omap3_onenand_read_bufferram; this->write_bufferram = omap3_onenand_write_bufferram; }else {
Signature · 1 line
1.7.12
PATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
Hi Afzal
Quoted 8 lines · Afzal Mohammed
platform data now contains a field to indicate whether soc belongs to omap34xx family, use it instead of cpu_is_* check.
This helps in removing dependency of platform specific header file -
cpu.hSigned-off-by Afzal Mohammed <[email protected]>
This one breaks an N800 multi-OMAP build here:
LD init/built-in.odrivers/built-in.o: In function `omap2_onenand_probe':/home/paul/linux-bisect/drivers/mtd/onenand/omap2.c:788: undefined reference to omap3_onenand_read_bufferram' /home/paul/linux-bisect/drivers/mtd/onenand/omap2.c:788: undefined reference to omap3_onenand_write_bufferram'
make: *** [vmlinux] Error 1
A fix is below.
- Paul
--- drivers/mtd/onenand/omap2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/mtd/onenand/omap2.c +12 -6
@@ -445,13 +445,19 @@ out_copy:#else -int omap3_onenand_read_bufferram (struct mtd_info *mtd,int area, -unsigned char *buffer,int offset, -size_t count); +static int omap3_onenand_read_bufferram (struct mtd_info *mtd,int area, +unsigned char *buffer,int offset, +size_t count) +{ +return -ENOSYS ; +} -int omap3_onenand_write_bufferram (struct mtd_info *mtd,int area, -const unsigned char *buffer, -int offset,size_t count); +static int omap3_onenand_write_bufferram (struct mtd_info *mtd,int area, +const unsigned char *buffer, +int offset,size_t count) +{ +return -ENOSYS ; +}#endif
Signature · 1 line
1.7.10.4
PATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
Quoted 6 lines · Paul Walmsley
Quoted 4 lines · Afzal Mohammed
platform data now contains a field to indicate whether soc belongs to omap34xx family, use it instead of cpu_is_* check.
Quoted 6 lines
Quoted 4 lines
This helps in removing dependency of platform specific header file -
cpu.hSigned-off-by Afzal Mohammed <[email protected]>This one breaks an N800 multi-OMAP build here:
It also breaks an OMAP3+4 config:
drivers/built-in.o: In function `omap2_onenand_probe':/home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:742:
undefined reference to `omap2_onenand_read_bufferram' /home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:743:
undefined reference to `omap2_onenand_write_bufferram' /home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:742:
undefined reference to `omap2_onenand_read_bufferram' /home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:743:
undefined reference to `omap2_onenand_write_bufferram'
Fix below.
- Paul
--- drivers/mtd/onenand/omap2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/mtd/onenand/omap2.c +12 -6
@@ -555,13 +555,19 @@ static int omap2_onenand_write_bufferram(struct mtd_info *mtd, int area,#else -int omap2_onenand_read_bufferram (struct mtd_info *mtd,int area, -unsigned char *buffer,int offset, -size_t count); +static int omap2_onenand_read_bufferram (struct mtd_info *mtd,int area, +unsigned char *buffer,int offset, +size_t count) +{ +return -ENOSYS ; +} -int omap2_onenand_write_bufferram (struct mtd_info *mtd,int area, -const unsigned char *buffer, -int offset,size_t count); +static int omap2_onenand_write_bufferram (struct mtd_info *mtd,int area, +const unsigned char *buffer, +int offset,size_t count) +{ +return -ENOSYS ; +}#endif
Signature · 1 line
1.7.10.4
Tony Lindgren
maintainerPATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
Quoted 27 lines · Paul Walmsley
Quoted 6 lines · Paul Walmsley
Quoted 4 lines · Afzal Mohammed
platform data now contains a field to indicate whether soc belongs to omap34xx family, use it instead of cpu_is_* check.
Quoted 6 lines
Quoted 4 lines
This helps in removing dependency of platform specific header file -
cpu.hSigned-off-by Afzal Mohammed <[email protected]>This one breaks an N800 multi-OMAP build here:
It also breaks an OMAP3+4 config:
drivers/built-in.o: In function `omap2_onenand_probe':/home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:742:
undefined reference to `omap2_onenand_read_bufferram'/home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:743:
undefined reference to `omap2_onenand_write_bufferram'/home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:742:
undefined reference to `omap2_onenand_read_bufferram'/home/paul/test_build/temp/test_cleanup_prcm_8634155e_with_fixes/20121025214236/linux/drivers/mtd/onenand/omap2.c:743:
undefined reference to `omap2_onenand_write_bufferram'
Quoted 1 line
Fix below.
Thanks, I'd like to pull this fix in too along with the others.
Regards,
Tony
Quoted 35 lines
drivers/mtd/onenand/omap2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)drivers/mtd/onenand/omap2.c +12
-6@@ -555,13 +555,19 @@ static int omap2_onenand_write_bufferram(struct mtd_info *mtd, int area,#else -int omap2_onenand_read_bufferram (struct mtd_info *mtd,int area, -unsigned char *buffer,int offset, -size_t count); +static int omap2_onenand_read_bufferram (struct mtd_info *mtd,int area, +unsigned char *buffer,int offset, +size_t count) +{ +return -ENOSYS ; +} -int omap2_onenand_write_bufferram (struct mtd_info *mtd,int area, -const unsigned char *buffer, -int offset,size_t count); +static int omap2_onenand_write_bufferram (struct mtd_info *mtd,int area, +const unsigned char *buffer, +int offset,size_t count) +{ +return -ENOSYS ; +}#endif Signature · 1 line
1.7.10.4
PATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
Quoted 7 lines · Tony Lindgren
Quoted 3 lines · Paul Walmsley
It also breaks an OMAP3+4 config:
Fix below.
Thanks, I'd like to pull this fix in too along with the others.
Thanks Paul and Tony for taking care of this issue.
I am sorry about the issue and had been on vacation last week.
Regards
Afzal
Tony Lindgren
maintainerPATCH v2 6/14 mtd: onenand: omap: use pdata info instead of cpu_is
In reply to Paul WalmsleyQuoted 23 lines · Paul Walmsley
Hi Afzal
Quoted 8 lines · Afzal Mohammed
platform data now contains a field to indicate whether soc belongs to omap34xx family, use it instead of cpu_is_* check.
This helps in removing dependency of platform specific header file -
cpu.hSigned-off-by Afzal Mohammed <[email protected]>This one breaks an N800 multi-OMAP build here:
LD
init/built-in.odrivers/built-in.o: In function `omap2_onenand_probe':/home/paul/linux-bisect/drivers/mtd/onenand/omap2.c:788: undefined reference toomap3_onenand_read_bufferram' /home/paul/linux-bisect/drivers/mtd/onenand/omap2.c:788: undefined reference toomap3_onenand_write_bufferram'
make: *** [vmlinux] Error 1
Quoted 1 line
A fix is below.
If you can add this too into your fixes branch on top of omap-for-v3.8/cleanup-headers that would be nice.
Regards,
Tony
Quoted 37 lines
--- drivers/mtd/onenand/omap2.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)drivers/mtd/onenand/omap2.c +12
-6@@ -445,13 +445,19 @@ out_copy:#else -int omap3_onenand_read_bufferram (struct mtd_info *mtd,int area, -unsigned char *buffer,int offset, -size_t count); +static int omap3_onenand_read_bufferram (struct mtd_info *mtd,int area, +unsigned char *buffer,int offset, +size_t count) +{ +return -ENOSYS ; +} -int omap3_onenand_write_bufferram (struct mtd_info *mtd,int area, -const unsigned char *buffer, -int offset,size_t count); +static int omap3_onenand_write_bufferram (struct mtd_info *mtd,int area, +const unsigned char *buffer, +int offset,size_t count) +{ +return -ENOSYS ; +}#endif Signature · 1 line
1.7.10.4
PATCH v2 7/14 ARM: OMAP2+: onenand: header cleanup
In reply to Afzal MohammedFor common arm zImage existing onenand header file in platform specific location was moved to generic platform data location, but it contained more than platform data, remove it. New local header has been created for exposing functions.
--- arch/arm/mach-omap2/board-flash.c | 1 + arch/arm/mach-omap2/board-igep0020.c | 1 + arch/arm/mach-omap2/board-n8x0.c | 1 + arch/arm/mach-omap2/board-rm680.c | 1 + arch/arm/mach-omap2/board-rx51-peripherals.c | 1 + arch/arm/mach-omap2/gpmc-onenand.c | 1 + arch/arm/mach-omap2/gpmc-onenand.h | 24 ++++++++++++++++++++++++ include/linux/platform_data/mtd-onenand-omap2.h | 19 +++---------------- 8 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 arch/arm/mach-omap2/gpmc-onenand.h
arch/arm/mach-omap2/board-flash.c +1 -0
@@ -25,6 +25,7 @@#include "common.h" #include "board-flash.h" +#include "gpmc-onenand.h" #define REG_FPGA_REV 0x10#define REG_FPGA_DIP_SWITCH_INPUT2 0x60
arch/arm/mach-omap2/board-igep0020.c +1 -0
@@ -43,6 +43,7 @@#include "common-board-devices.h" #include "board-flash.h" #include "control.h" +#include "gpmc-onenand.h" #define IGEP2_SMSC911X_CS 5#define IGEP2_SMSC911X_GPIO 176
arch/arm/mach-omap2/board-n8x0.c +1 -0
@@ -32,6 +32,7 @@#include <plat/mmc.h> #include "mux.h" +#include "gpmc-onenand.h" #define TUSB6010_ASYNC_CS 1#define TUSB6010_SYNC_CS 4
arch/arm/mach-omap2/board-rm680.c +1 -0
@@ -33,6 +33,7 @@#include "hsmmc.h" #include "sdram-nokia.h" #include "common-board-devices.h" +#include "gpmc-onenand.h" static struct regulator_consumer_supply rm680_vemmc_consumers[] = {REGULATOR_SUPPLY ("vmmc" ,"omap_hsmmc.1" ),
arch/arm/mach-omap2/board-rx51-peripherals.c +1 -0
@@ -54,6 +54,7 @@#include "mux.h" #include "hsmmc.h" #include "common-board-devices.h" +#include "gpmc-onenand.h" #define SYSTEM_REV_B_USES_VAUX3 0x1699#define SYSTEM_REV_S_USES_VAUX3 0x8
arch/arm/mach-omap2/gpmc-onenand.c +1 -0
@@ -23,6 +23,7 @@#include <plat/gpmc.h> #include "soc.h" +#include "gpmc-onenand.h" #define ONENAND_IO_SIZE SZ_128K
arch/arm/mach-omap2/gpmc-onenand.h new file +24 -0
@@ -0,0 +1,24 @@ +/* +* arch/arm/mach-omap2/gpmc-onenand.h +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +*/ + +#ifndef __OMAP2_GPMC_ONENAND_H +#define __OMAP2_GPMC_ONENAND_H + +#include <linux/platform_data/mtd-onenand-omap2.h> + +#if IS_ENABLED (CONFIG_MTD_ONENAND_OMAP2 ) +extern void gpmc_onenand_init (struct omap_onenand_platform_data *d); +#else +#define board_onenand_data NULL +static inline void gpmc_onenand_init (struct omap_onenand_platform_data *d) +{ +} +#endif + +#endif
include/linux/platform_data/mtd-onenand-omap2.h +3 -16
@@ -9,6 +9,9 @@* published by the Free Software Foundation. */ +#ifndef __MTD_ONENAND_OMAP2_H +#define __MTD_ONENAND_OMAP2_H +#include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h>
@@ -27,20 +30,4 @@ struct omap_onenand_platform_data {u8 regulator_can_sleep; u8 skip_initial_unlocking; }; - -#define ONENAND_MAX_PARTITIONS 8 - -#if defined(CONFIG_MTD_ONENAND_OMAP2 ) || \ - defined(CONFIG_MTD_ONENAND_OMAP2_MODULE ) - -extern void gpmc_onenand_init (struct omap_onenand_platform_data *d); - -#else - -#define board_onenand_data NULL - -static inline void gpmc_onenand_init (struct omap_onenand_platform_data *d) -{ -} -#endif
Signature · 1 line
1.7.12
PATCH v2 8/14 ARM: OMAP2+: nand: header cleanup
In reply to Afzal MohammedFor common arm zImage existing nand header file in platform specific location was moved to generic platform data location, but it contained more than platform data, remove it. New local header has been created for exposing functions.
Also move gpmc-nand platform data to platform header meant for nand from gpmc header file
--- arch/arm/mach-omap2/board-cm-t35.c | 3 +- arch/arm/mach-omap2/board-cm-t3517.c | 3 +- arch/arm/mach-omap2/board-flash.c | 4 +-- arch/arm/mach-omap2/board-omap3pandora.c | 3 +- arch/arm/mach-omap2/common-board-devices.c | 1 - arch/arm/mach-omap2/gpmc-nand.c | 54 +++++++++++++++------------- arch/arm/mach-omap2/gpmc-nand.h | 27 ++++++++++++++ arch/arm/mach-omap2/gpmc.c | 2 ++ arch/arm/plat-omap/include/plat/gpmc.h | 28 ++------------- include/linux/platform_data/mtd-nand-omap2.h | 41 ++++++++++++++------- 10 files changed, 98 insertions(+), 68 deletions(-) create mode 100644 arch/arm/mach-omap2/gpmc-nand.h
arch/arm/mach-omap2/board-cm-t35.c +2 -1
@@ -53,6 +53,7 @@#include "sdram-micron-mt46h32m32lf-6.h" #include "hsmmc.h" #include "common-board-devices.h" +#include "gpmc-nand.h" #define CM_T35_GPIO_PENDOWN 57#define SB_T35_USB_HUB_RESET_GPIO 167
@@ -181,7 +182,7 @@ static struct omap_nand_platform_data cm_t35_nand_data = {static void __init cm_t35_init_nand (void ) { -if (gpmc_nand_init (&cm_t35_nand_data) <0 ) +if (gpmc_nand_init (&cm_t35_nand_data,NULL ) <0 )pr_err ("CM-T35: Unable to register NAND device\n" ); }#else
arch/arm/mach-omap2/board-cm-t3517.c +2 -1
@@ -49,6 +49,7 @@#include "control.h" #include "common-board-devices.h" #include "am35xx-emac.h" +#include "gpmc-nand.h" #if defined(CONFIG_LEDS_GPIO ) || defined(CONFIG_LEDS_GPIO_MODULE ) static struct gpio_led cm_t3517_leds[] = {
@@ -240,7 +241,7 @@ static struct omap_nand_platform_data cm_t3517_nand_data = {static void __init cm_t3517_init_nand (void ) { -if (gpmc_nand_init (&cm_t3517_nand_data) <0 ) +if (gpmc_nand_init (&cm_t3517_nand_data,NULL ) <0 )pr_err ("CM-T3517: NAND initialization failed\n" ); }#else
arch/arm/mach-omap2/board-flash.c +2 -2
@@ -26,6 +26,7 @@#include "common.h" #include "board-flash.h" #include "gpmc-onenand.h" +#include "gpmc-nand.h" #define REG_FPGA_REV 0x10#define REG_FPGA_DIP_SWITCH_INPUT2 0x60
@@ -139,10 +140,9 @@ __init board_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs, board_nand_data.parts = nand_parts; board_nand_data.nr_parts = nr_parts; board_nand_data.devsize = nand_type; - board_nand_data.gpmc_t = gpmc_t; board_nand_data.ecc_opt =OMAP_ECC_HAMMING_CODE_DEFAULT ; - gpmc_nand_init(&board_nand_data); + gpmc_nand_init(&board_nand_data, gpmc_t); }#endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */
arch/arm/mach-omap2/board-omap3pandora.c +2 -1
@@ -50,6 +50,7 @@#include "sdram-micron-mt46h32m32lf-6.h" #include "hsmmc.h" #include "common-board-devices.h" +#include "gpmc-nand.h" #define PANDORA_WIFI_IRQ_GPIO 21#define PANDORA_WIFI_NRESET_GPIO 23
@@ -602,7 +603,7 @@ static void __init omap3pandora_init(void)omap_ads7846_init (1 ,OMAP3_PANDORA_TS_GPIO ,0 ,NULL );usbhs_init (&usbhs_bdata);usb_musb_init (NULL ); -gpmc_nand_init (&pandora_nand_data); +gpmc_nand_init (&pandora_nand_data,NULL );/* Ensure SDRC pins are mux'd for self-refresh */ omap_mux_init_signal ("sdrc_cke0" ,OMAP_PIN_OUTPUT );
arch/arm/mach-omap2/common-board-devices.c +0 -1
@@ -25,7 +25,6 @@#include <linux/spi/ads7846.h> #include <linux/platform_data/spi-omap2-mcspi.h> -#include <linux/platform_data/mtd-nand-omap2.h> #include "common.h" #include "common-board-devices.h"
arch/arm/mach-omap2/gpmc-nand.c +30 -24
91 lines not on this page · raw message
arch/arm/mach-omap2/gpmc-nand.h new file +27 -0
@@ -0,0 +1,27 @@ +/* +* arch/arm/mach-omap2/gpmc-nand.h +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +*/ + +#ifndef __OMAP2_GPMC_NAND_H +#define __OMAP2_GPMC_NAND_H + +#include <plat/gpmc.h> +#include <linux/platform_data/mtd-nand-omap2.h> + +#if IS_ENABLED (CONFIG_MTD_NAND_OMAP2 ) +extern int gpmc_nand_init (struct omap_nand_platform_data *d, +struct gpmc_timings *gpmc_t); +#else +static inline int gpmc_nand_init (struct omap_nand_platform_data *d, +struct gpmc_timings *gpmc_t) +{ +return 0 ; +} +#endif + +#endif
arch/arm/mach-omap2/gpmc.c +2 -0
@@ -26,6 +26,8 @@#include <linux/interrupt.h> #include <linux/platform_device.h> +#include <linux/platform_data/mtd-nand-omap2.h> +#include <asm/mach-types.h> #include <plat/gpmc.h>
arch/arm/plat-omap/include/plat/gpmc.h +2 -26
@@ -11,6 +11,8 @@#ifndef __OMAP2_GPMC_H#define __OMAP2_GPMC_H +#include <linux/platform_data/mtd-nand-omap2.h> +/* Maximum Number of Chip Selects */ #define GPMC_CS_NUM 8
@@ -86,16 +88,6 @@#define PREFETCH_FIFOTHRESHOLD_MAX 0x40#define PREFETCH_FIFOTHRESHOLD (val) ((val) << 8) -enum omap_ecc { -/* 1-bit ecc: stored at end of spare area */ -OMAP_ECC_HAMMING_CODE_DEFAULT =0 ,/* Default, s/w method */ -OMAP_ECC_HAMMING_CODE_HW ,/* gpmc to detect the error */ -/* 1-bit ecc: stored@beginning of spare area as romcode */ -OMAP_ECC_HAMMING_CODE_HW_ROMCODE ,/* gpmc method & romcode layout */ -OMAP_ECC_BCH4_CODE_HW ,/* 4-bit BCH ecc code */ -OMAP_ECC_BCH8_CODE_HW ,/* 8-bit BCH ecc code */ -}; -/* bool type time settings */ struct gpmc_bool_timings {bool cycle2cyclediffcsen;
@@ -152,22 +144,6 @@ struct gpmc_timings {struct gpmc_bool_timings bool_timings; }; -struct gpmc_nand_regs { -void __iomem *gpmc_status; -void __iomem *gpmc_nand_command; -void __iomem *gpmc_nand_address; -void __iomem *gpmc_nand_data; -void __iomem *gpmc_prefetch_config1; -void __iomem *gpmc_prefetch_config2; -void __iomem *gpmc_prefetch_control; -void __iomem *gpmc_prefetch_status; -void __iomem *gpmc_ecc_config; -void __iomem *gpmc_ecc_control; -void __iomem *gpmc_ecc_size_config; -void __iomem *gpmc_ecc1_result; -void __iomem *gpmc_bch_result0; -}; -extern void gpmc_update_nand_reg (struct gpmc_nand_regs *reg,int cs);extern int gpmc_get_client_irq (unsigned irq_config);
include/linux/platform_data/mtd-nand-omap2.h +29 -12
60 lines not on this page · raw message
Signature · 1 line
1.7.12
PATCH v2 9/14 mtd: nand: omap: bring in gpmc nand macros
In reply to Afzal MohammedBring onto driver the macros defined in gpmc.h that are not necessary outside driver, helps in removing inclusion of gpmc.h too. Also remove GPMC prefix on those macros to make clear it's independence with gpmc header.
--- drivers/mtd/nand/omap2.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
drivers/mtd/nand/omap2.c +13 -8
@@ -110,6 +110,11 @@#define ECC1RESULTSIZE 0x1#define ECCCLEAR 0x100#define ECC1 0x1 +#define PREFETCH_FIFOTHRESHOLD_MAX 0x40 +#define PREFETCH_FIFOTHRESHOLD (val) ((val) << 8) +#define PREFETCH_STATUS_COUNT (val) (val & 0x00003fff) +#define PREFETCH_STATUS_FIFO_CNT (val) ((val >> 24) & 0x7F) +#define STATUS_BUFF_EMPTY 0x00000001/* oob info generated runtime depending on ecc algorithm and layout selected */ static struct nand_ecclayout omap_oobinfo;
@@ -269,7 +274,7 @@ static void omap_write_buf8(struct mtd_info *mtd, const u_char *buf, int len)/* wait until buffer is available for write */ do { status =readl (info->reg.gpmc_status) & -GPMC_STATUS_BUFF_EMPTY ; +STATUS_BUFF_EMPTY ; }while (!status); } }
@@ -307,7 +312,7 @@ static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len)/* wait until buffer is available for write */ do { status =readl (info->reg.gpmc_status) & -GPMC_STATUS_BUFF_EMPTY ; +STATUS_BUFF_EMPTY ; }while (!status); } }
@@ -348,7 +353,7 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len) }else { do { r_count = readl(info->reg.gpmc_prefetch_status); - r_count = GPMC_PREFETCH_STATUS_FIFO_CNT(r_count); + r_count = PREFETCH_STATUS_FIFO_CNT(r_count); r_count = r_count >> 2; ioread32_rep(info->nand.IO_ADDR_R, p, r_count); p += r_count;
@@ -395,7 +400,7 @@ static void omap_write_buf_pref(struct mtd_info *mtd, }else {while (len) { w_count =readl (info->reg.gpmc_prefetch_status); - w_count =GPMC_PREFETCH_STATUS_FIFO_CNT (w_count); + w_count =PREFETCH_STATUS_FIFO_CNT (w_count); w_count = w_count >>1 ;for (i =0 ; (i < w_count) && len; i++, len -=2 )iowrite16 (*p++, info->nand.IO_ADDR_W);
@@ -407,7 +412,7 @@ static void omap_write_buf_pref(struct mtd_info *mtd,do {cpu_relax (); val =readl (info->reg.gpmc_prefetch_status); - val =GPMC_PREFETCH_STATUS_COUNT (val); + val =PREFETCH_STATUS_COUNT (val); }while (val && (tim++ < limit));/* disable and stop the PFPW engine */
@@ -493,7 +498,7 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,do {cpu_relax (); val =readl (info->reg.gpmc_prefetch_status); - val =GPMC_PREFETCH_STATUS_COUNT (val); + val =PREFETCH_STATUS_COUNT (val); }while (val && (tim++ < limit));/* disable and stop the PFPW engine */
@@ -556,7 +561,7 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev)u32 bytes; bytes =readl (info->reg.gpmc_prefetch_status); - bytes =GPMC_PREFETCH_STATUS_FIFO_CNT (bytes); + bytes =PREFETCH_STATUS_FIFO_CNT (bytes); bytes = bytes &0xFFFC ;/* io in multiple of 4 bytes */ if (info->iomode ==OMAP_NAND_IO_WRITE ) {/* checks for write io */ if (this_irq == info->gpmc_irq_count)
@@ -682,7 +687,7 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd, limit = (loops_per_jiffy *msecs_to_jiffies (OMAP_NAND_TIMEOUT_MS ));do { val =readl (info->reg.gpmc_prefetch_status); - val =GPMC_PREFETCH_STATUS_COUNT (val); + val =PREFETCH_STATUS_COUNT (val);cpu_relax (); }while (val && (tim++ < limit));
Signature · 1 line
1.7.12
PATCH v2 10/14 ARM: OMAP2+: nand: bch capability check
In reply to Afzal MohammedCapability of bch schemes could be discovered using soc revision checks. If soc revision indicates that selected ecc scheme is not supported bail out.
--- arch/arm/mach-omap2/gpmc-nand.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
arch/arm/mach-omap2/gpmc-nand.c +24 -0
@@ -90,6 +90,27 @@ static int omap2_nand_gpmc_retime(return 0 ; } +static bool __init gpmc_hwecc_bch_capable (enum omap_ecc ecc_opt) +{ +/* support only OMAP3 class */ +if (!cpu_is_omap34xx ()) { +pr_err ("BCH ecc is not supported on this CPU\n" ); +return 0 ; + } + +/* +* For now, assume 4-bit mode is only supported on OMAP3630 ES1.x, x>=1. +* Other chips may be added if confirmed to work. +*/ +if ((ecc_opt ==OMAP_ECC_BCH4_CODE_HW ) && + (!cpu_is_omap3630 () || (GET_OMAP_REVISION () ==0 ))) { +pr_err ("BCH 4-bit mode is not supported on this CPU\n" ); +return 0 ; + } + +return 1 ; +} +int __init gpmc_nand_init (struct omap_nand_platform_data *gpmc_nand_data,struct gpmc_timings *gpmc_t) {
@@ -128,6 +149,9 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data,gpmc_update_nand_reg (&gpmc_nand_data->reg, gpmc_nand_data->cs); +if (!gpmc_hwecc_bch_capable (gpmc_nand_data->ecc_opt)) +return -EINVAL ; + err =platform_device_register (&gpmc_nand_device);if (err <0 ) {dev_err (dev,"Unable to register NAND device\n" );
Signature · 1 line
1.7.12
PATCH v2 11/14 ARM: OMAP2+: gpmc: nand register helper bch update
In reply to Afzal MohammedUpdate helper function that provides gpmc-nand register details for nand driver with bch register information. Using this nand driver can be made self sufficient to handle remaining gpmc-nand operations by itself instead of relying on gpmc exported nand functions.
--- arch/arm/mach-omap2/gpmc.c | 18 +++++++++++++++++- include/linux/platform_data/mtd-nand-omap2.h | 7 ++++++- 2 files changed, 23 insertions(+), 2 deletions(-)
arch/arm/mach-omap2/gpmc.c +17 -1
@@ -61,6 +61,9 @@#define GPMC_ECC_SIZE_CONFIG 0x1fc#define GPMC_ECC1_RESULT 0x200#define GPMC_ECC_BCH_RESULT_0 0x240/* not available on OMAP2 */ +#define GPMC_ECC_BCH_RESULT_1 0x244/* not available on OMAP2 */ +#define GPMC_ECC_BCH_RESULT_2 0x248/* not available on OMAP2 */ +#define GPMC_ECC_BCH_RESULT_3 0x24c/* not available on OMAP2 */ /* GPMC ECC control settings */ #define GPMC_ECC_CTRL_ECCCLEAR 0x100
@@ -84,6 +87,7 @@#define GPMC_CS0_OFFSET 0x60#define GPMC_CS_SIZE 0x30 +#define GPMC_BCH_SIZE 0x10#define GPMC_MEM_START 0x00000000#define GPMC_MEM_END 0x3FFFFFFF
@@ -779,6 +783,8 @@ EXPORT_SYMBOL(gpmc_prefetch_reset);void gpmc_update_nand_reg (struct gpmc_nand_regs *reg,int cs) { +int i; + reg->gpmc_status = gpmc_base +GPMC_STATUS ; reg->gpmc_nand_command = gpmc_base +GPMC_CS0_OFFSET +GPMC_CS_NAND_COMMAND +GPMC_CS_SIZE * cs;
@@ -794,7 +800,17 @@ void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) reg->gpmc_ecc_control = gpmc_base +GPMC_ECC_CONTROL ; reg->gpmc_ecc_size_config = gpmc_base +GPMC_ECC_SIZE_CONFIG ; reg->gpmc_ecc1_result = gpmc_base +GPMC_ECC1_RESULT ; - reg->gpmc_bch_result0 = gpmc_base +GPMC_ECC_BCH_RESULT_0 ; + +for (i =0 ; i <GPMC_BCH_NUM_REMAINDER ; i++) { + reg->gpmc_bch_result0[i] = gpmc_base +GPMC_ECC_BCH_RESULT_0 + +GPMC_BCH_SIZE * i; + reg->gpmc_bch_result1[i] = gpmc_base +GPMC_ECC_BCH_RESULT_1 + +GPMC_BCH_SIZE * i; + reg->gpmc_bch_result2[i] = gpmc_base +GPMC_ECC_BCH_RESULT_2 + +GPMC_BCH_SIZE * i; + reg->gpmc_bch_result3[i] = gpmc_base +GPMC_ECC_BCH_RESULT_3 + +GPMC_BCH_SIZE * i; + } }int gpmc_get_client_irq (unsigned irq_config)
include/linux/platform_data/mtd-nand-omap2.h +6 -1
@@ -13,6 +13,8 @@#include <linux/mtd/partitions.h> +#define GPMC_BCH_NUM_REMAINDER 8 +enum nand_io {NAND_OMAP_PREFETCH_POLLED =0 ,/* prefetch polled mode, default */ NAND_OMAP_POLLED ,/* polled mode, without prefetch */
@@ -43,7 +45,10 @@ struct gpmc_nand_regs {void __iomem *gpmc_ecc_control;void __iomem *gpmc_ecc_size_config;void __iomem *gpmc_ecc1_result; -void __iomem *gpmc_bch_result0; +void __iomem *gpmc_bch_result0[GPMC_BCH_NUM_REMAINDER ]; +void __iomem *gpmc_bch_result1[GPMC_BCH_NUM_REMAINDER ]; +void __iomem *gpmc_bch_result2[GPMC_BCH_NUM_REMAINDER ]; +void __iomem *gpmc_bch_result3[GPMC_BCH_NUM_REMAINDER ]; };struct omap_nand_platform_data {
Signature · 1 line
1.7.12
PATCH v2 12/14 mtd: nand: omap: handle gpmc bch[48]
In reply to Afzal Mohammedgpmc-nand bch registers are now available in driver, make use of it to handle bch[48] instead of relying on gpmc exported functions.
And so nand driver no longer needs gpmc header, remove it.
--- drivers/mtd/nand/omap2.c | 100 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 11 deletions(-)
drivers/mtd/nand/omap2.c +89 -11
@@ -28,7 +28,6 @@#endif #include <plat/dma.h> -#include <plat/gpmc.h> #include <linux/platform_data/mtd-nand-omap2.h> #define DRIVER_NAME "omap2-nand"
@@ -106,6 +105,7 @@#define CS_MASK 0x7#define ENABLE_PREFETCH (0x1 << 7)#define DMA_MPU_MODE_SHIFT 2 +#define ECCSIZE0_SHIFT 12#define ECCSIZE1_SHIFT 22#define ECC1RESULTSIZE 0x1#define ECCCLEAR 0x100
@@ -1034,19 +1034,45 @@ static int omap_dev_ready(struct mtd_info *mtd)static void omap3_enable_hwecc_bch (struct mtd_info *mtd,int mode) {int nerrors; -unsigned int dev_width; +unsigned int dev_width, nsectors; struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, mtd);struct nand_chip *chip = mtd->priv; +u32 val; nerrors = (info->nand.ecc.bytes ==13 ) ?8 :4 ; dev_width = (chip->options &NAND_BUSWIDTH_16 ) ?1 :0 ; + nsectors =1 ;/* * Program GPMC to perform correction on one 512-byte sector at a time. * Using 4 sectors at a time (i.e. ecc.size = 2048) is also possible and * gives a slight (5%) performance gain (but requires additional code). */ - (void )gpmc_enable_hwecc_bch (info->gpmc_cs, mode, dev_width,1 , nerrors); + +writel (ECC1 , info->reg.gpmc_ecc_control); + +/* +* When using BCH, sector size is hardcoded to 512 bytes. +* Here we are using wrapping mode 6 both for reading and writing, with: +* size0 = 0 (no additional protected byte in spare area) +* size1 = 32 (skip 32 nibbles = 16 bytes per sector in spare area) +*/ + val = (32 <<ECCSIZE1_SHIFT ) | (0 <<ECCSIZE0_SHIFT ); +writel (val, info->reg.gpmc_ecc_size_config); + +/* BCH configuration */ + val = ((1 <<16 ) |/* enable BCH */ + (((nerrors ==8 ) ?1 :0 ) <<12 ) |/* 8 or 4 bits */ + (0x06 <<8 ) |/* wrap mode = 6 */ + (dev_width <<7 ) |/* bus width */ + (((nsectors-1 ) &0x7 ) <<4 ) |/* number of sectors */ + (info->gpmc_cs <<1 ) |/* ECC CS */ + (0x1 ));/* enable ECC */ + +writel (val, info->reg.gpmc_ecc_config); + +/* clear ecc and enable bits */ +writel (ECCCLEAR |ECC1 , info->reg.gpmc_ecc_control); }/**
@@ -1060,7 +1086,32 @@ static int omap3_calculate_ecc_bch4(struct mtd_info *mtd, const u_char *dat, { struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, mtd); -return gpmc_calculate_ecc_bch4 (info->gpmc_cs, dat, ecc_code); +unsigned long nsectors, val1, val2; +int i; + + nsectors = ((readl (info->reg.gpmc_ecc_config) >>4 ) &0x7 ) +1 ; + +for (i =0 ; i < nsectors; i++) { + +/* Read hw-computed remainder */ + val1 =readl (info->reg.gpmc_bch_result0[i]); + val2 =readl (info->reg.gpmc_bch_result1[i]); + +/* +* Add constant polynomial to remainder, in order to get an ecc +* sequence of 0xFFs for a buffer filled with 0xFFs; and +* left-justify the resulting polynomial. +*/ + *ecc_code++ =0x28 ^ ((val2 >>12 ) &0xFF ); + *ecc_code++ =0x13 ^ ((val2 >>4 ) &0xFF ); + *ecc_code++ =0xcc ^ (((val2 &0xF ) <<4 )|((val1 >>28 ) &0xF )); + *ecc_code++ =0x39 ^ ((val1 >>20 ) &0xFF ); + *ecc_code++ =0x96 ^ ((val1 >>12 ) &0xFF ); + *ecc_code++ =0xac ^ ((val1 >>4 ) &0xFF ); + *ecc_code++ =0x7f ^ ((val1 &0xF ) <<4 ); + } + +return 0 ; }/**
@@ -1074,7 +1125,39 @@ static int omap3_calculate_ecc_bch8(struct mtd_info *mtd, const u_char *dat, { struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, mtd); -return gpmc_calculate_ecc_bch8 (info->gpmc_cs, dat, ecc_code); +unsigned long nsectors, val1, val2, val3, val4; +int i; + + nsectors = ((readl (info->reg.gpmc_ecc_config) >>4 ) &0x7 ) +1 ; + +for (i =0 ; i < nsectors; i++) { + +/* Read hw-computed remainder */ + val1 =readl (info->reg.gpmc_bch_result0[i]); + val2 =readl (info->reg.gpmc_bch_result1[i]); + val3 =readl (info->reg.gpmc_bch_result2[i]); + val4 =readl (info->reg.gpmc_bch_result3[i]); + +/* +* Add constant polynomial to remainder, in order to get an ecc +* sequence of 0xFFs for a buffer filled with 0xFFs. +*/ + *ecc_code++ =0xef ^ (val4 &0xFF ); + *ecc_code++ =0x51 ^ ((val3 >>24 ) &0xFF ); + *ecc_code++ =0x2e ^ ((val3 >>16 ) &0xFF ); + *ecc_code++ =0x09 ^ ((val3 >>8 ) &0xFF ); + *ecc_code++ =0xed ^ (val3 &0xFF ); + *ecc_code++ =0x93 ^ ((val2 >>24 ) &0xFF ); + *ecc_code++ =0x9a ^ ((val2 >>16 ) &0xFF ); + *ecc_code++ =0xc2 ^ ((val2 >>8 ) &0xFF ); + *ecc_code++ =0x97 ^ (val2 &0xFF ); + *ecc_code++ =0x79 ^ ((val1 >>24 ) &0xFF ); + *ecc_code++ =0xe5 ^ ((val1 >>16 ) &0xFF ); + *ecc_code++ =0x24 ^ ((val1 >>8 ) &0xFF ); + *ecc_code++ =0xb5 ^ (val1 &0xFF ); + } + +return 0 ; }/**
@@ -1130,7 +1213,7 @@ static void omap3_free_bch(struct mtd_info *mtd)*/ static int omap3_init_bch (struct mtd_info *mtd,int ecc_opt) { -int ret, max_errors; +int max_errors; struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, mtd);#ifdef CONFIG_MTD_NAND_OMAP_BCH8
@@ -1147,11 +1230,6 @@ static int omap3_init_bch(struct mtd_info *mtd, int ecc_opt) goto fail; } -/* initialize GPMC BCH engine */ - ret =gpmc_init_hwecc_bch (info->gpmc_cs,1 , max_errors); -if (ret) - goto fail; -/* software bch library is only used to detect and locate errors */ info->bch =init_bch (13 , max_errors,0x201b /* hw polynomial */ );if (!info->bch)
Signature · 1 line
1.7.12
PATCH v2 13/14 ARM: OMAP2+: gpmc: remove exported nand functions
In reply to Afzal Mohammednand driver handles gpmc-nand block fully, hence no more users for these exported nand functions, remove it.
--- arch/arm/mach-omap2/gpmc.c | 432 --------------------------------- arch/arm/plat-omap/include/plat/gpmc.h | 31 --- 2 files changed, 463 deletions(-)
arch/arm/mach-omap2/gpmc.c +0 -432
@@ -150,7 +150,6 @@ static struct resource gpmc_mem_root;static struct resource gpmc_cs_mem[GPMC_CS_NUM ];static DEFINE_SPINLOCK (gpmc_mem_lock);static unsigned int gpmc_cs_map;/* flag for cs which are initialized */ -static int gpmc_ecc_used = -EINVAL ;/* cs using ecc engine */ static struct device *gpmc_dev;static int gpmc_irq;static resource_size_t phys_base, mem_size;
@@ -171,22 +170,6 @@ static u32 gpmc_read_reg(int idx)return __raw_readl (gpmc_base + idx); } -static void gpmc_cs_write_byte (int cs,int idx,u8 val) -{ -void __iomem *reg_addr; - - reg_addr = gpmc_base +GPMC_CS0_OFFSET + (cs *GPMC_CS_SIZE ) + idx; -__raw_writeb (val, reg_addr); -} - -static u8 gpmc_cs_read_byte (int cs,int idx) -{ -void __iomem *reg_addr; - - reg_addr = gpmc_base +GPMC_CS0_OFFSET + (cs *GPMC_CS_SIZE ) + idx; -return __raw_readb (reg_addr); -} -void gpmc_cs_write_reg (int cs,int idx,u32 val) {void __iomem *reg_addr;
@@ -563,44 +546,6 @@ void gpmc_cs_free(int cs)EXPORT_SYMBOL (gpmc_cs_free);/** -* gpmc_read_status - read access request to get the different gpmc status -* @cmd: command type -* @return status -*/ -int gpmc_read_status (int cmd) -{ -int status = -EINVAL ; -u32 regval =0 ; - -switch (cmd) { -case GPMC_GET_IRQ_STATUS : - status =gpmc_read_reg (GPMC_IRQSTATUS ); -break ; - -case GPMC_PREFETCH_FIFO_CNT : - regval =gpmc_read_reg (GPMC_PREFETCH_STATUS ); - status =GPMC_PREFETCH_STATUS_FIFO_CNT (regval); -break ; - -case GPMC_PREFETCH_COUNT : - regval =gpmc_read_reg (GPMC_PREFETCH_STATUS ); - status =GPMC_PREFETCH_STATUS_COUNT (regval); -break ; - -case GPMC_STATUS_BUFFER : - regval =gpmc_read_reg (GPMC_STATUS ); -/* 1 : buffer is available to write */ - status = regval &GPMC_STATUS_BUFF_EMPTY ; -break ; - -default : -printk (KERN_ERR "gpmc_read_status: Not supported\n" ); - } -return status; -} -EXPORT_SYMBOL (gpmc_read_status); - -/** * gpmc_cs_configure - write request to configure gpmc * @cs: chip select number * @cmd: command type
@@ -668,119 +613,6 @@ int gpmc_cs_configure(int cs, int cmd, int wval) }EXPORT_SYMBOL (gpmc_cs_configure); -/** -* gpmc_nand_read - nand specific read access request -* @cs: chip select number -* @cmd: command type -*/ -int gpmc_nand_read (int cs,int cmd) -{ -int rval = -EINVAL ; - -switch (cmd) { -case GPMC_NAND_DATA : - rval =gpmc_cs_read_byte (cs,GPMC_CS_NAND_DATA ); -break ; - -default : -printk (KERN_ERR "gpmc_read_nand_ctrl: Not supported\n" ); - } -return rval; -} -EXPORT_SYMBOL (gpmc_nand_read); - -/** -* gpmc_nand_write - nand specific write request -* @cs: chip select number -* @cmd: command type -* @wval: value to write -*/ -int gpmc_nand_write (int cs,int cmd,int wval) -{ -int err =0 ; - -switch (cmd) { -case GPMC_NAND_COMMAND : -gpmc_cs_write_byte (cs,GPMC_CS_NAND_COMMAND , wval); -break ; - -case GPMC_NAND_ADDRESS : -gpmc_cs_write_byte (cs,GPMC_CS_NAND_ADDRESS , wval); -break ; - -case GPMC_NAND_DATA : -gpmc_cs_write_byte (cs,GPMC_CS_NAND_DATA , wval); - -default : -printk (KERN_ERR "gpmc_write_nand_ctrl: Not supported\n" ); - err = -EINVAL ; - } -return err; -} -EXPORT_SYMBOL (gpmc_nand_write); - - - -/** -* gpmc_prefetch_enable - configures and starts prefetch transfer -* @cs: cs (chip select) number -* @fifo_th: fifo threshold to be used for read/ write -* @dma_mode: dma mode enable (1) or disable (0) -* @u32_count: number of bytes to be transferred -* @is_write: prefetch read(0) or write post(1) mode -*/ -int gpmc_prefetch_enable (int cs,int fifo_th,int dma_mode, -unsigned int u32_count,int is_write) -{ - -if (fifo_th >PREFETCH_FIFOTHRESHOLD_MAX ) { -pr_err ("gpmc: fifo threshold is not supported\n" ); -return -1 ; - }else if (!(gpmc_read_reg (GPMC_PREFETCH_CONTROL ))) { -/* Set the amount of bytes to be prefetched */ -gpmc_write_reg (GPMC_PREFETCH_CONFIG2 , u32_count); - -/* Set dma/mpu mode, the prefetch read / post write and -* enable the engine. Set which cs is has requested for. -*/ -gpmc_write_reg (GPMC_PREFETCH_CONFIG1 , ((cs <<CS_NUM_SHIFT ) | -PREFETCH_FIFOTHRESHOLD (fifo_th) | -ENABLE_PREFETCH | - (dma_mode <<DMA_MPU_MODE ) | - (0x1 & is_write))); - -/* Start the prefetch engine */ -gpmc_write_reg (GPMC_PREFETCH_CONTROL ,0x1 ); - }else { -return -EBUSY ; - } - -return 0 ; -} -EXPORT_SYMBOL (gpmc_prefetch_enable); - -/** -* gpmc_prefetch_reset - disables and stops the prefetch engine -*/ -int gpmc_prefetch_reset (int cs) -{ -u32 config1; - -/* check if the same module/cs is trying to reset */ - config1 =gpmc_read_reg (GPMC_PREFETCH_CONFIG1 ); -if (((config1 >>CS_NUM_SHIFT ) &0x7 ) != cs) -return -EINVAL ; - -/* Stop the PFPW engine */ -gpmc_write_reg (GPMC_PREFETCH_CONTROL ,0x0 ); - -/* Reset/disable the PFPW engine */ -gpmc_write_reg (GPMC_PREFETCH_CONFIG1 ,0x0 ); - -return 0 ; -} -EXPORT_SYMBOL (gpmc_prefetch_reset); -void gpmc_update_nand_reg (struct gpmc_nand_regs *reg,int cs) {int i;
@@ -1145,267 +977,3 @@ void omap3_gpmc_restore_context(void) } }#endif /* CONFIG_ARCH_OMAP3 */ - -/** -* gpmc_enable_hwecc - enable hardware ecc functionality -* @cs: chip select number -* @mode: read/write mode -* @dev_width: device bus width(1 for x16, 0 for x8) -* @ecc_size: bytes for which ECC will be generated -*/ -int gpmc_enable_hwecc (int cs,int mode,int dev_width,int ecc_size) -{ -unsigned int val; - -/* check if ecc module is in used */ -if (gpmc_ecc_used != -EINVAL ) -return -EINVAL ; - - gpmc_ecc_used = cs; - -/* clear ecc and enable bits */ -gpmc_write_reg (GPMC_ECC_CONTROL , -GPMC_ECC_CTRL_ECCCLEAR | -GPMC_ECC_CTRL_ECCREG1 ); - -/* program ecc and result sizes */ - val = ((((ecc_size >>1 ) -1 ) <<22 ) | (0x0000000F )); -gpmc_write_reg (GPMC_ECC_SIZE_CONFIG , val); - -switch (mode) { -case GPMC_ECC_READ : -case GPMC_ECC_WRITE : -gpmc_write_reg (GPMC_ECC_CONTROL , -GPMC_ECC_CTRL_ECCCLEAR | -GPMC_ECC_CTRL_ECCREG1 ); -break ; -case GPMC_ECC_READSYN : -gpmc_write_reg (GPMC_ECC_CONTROL , -GPMC_ECC_CTRL_ECCCLEAR | -GPMC_ECC_CTRL_ECCDISABLE ); -break ; -default : -printk (KERN_INFO "Error: Unrecognized Mode[%d]!\n" , mode); -break ; - } - -/* (ECC 16 or 8 bit col) | ( CS ) | ECC Enable */ - val = (dev_width <<7 ) | (cs <<1 ) | (0x1 ); -gpmc_write_reg (GPMC_ECC_CONFIG , val); -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_enable_hwecc); - -/** -* gpmc_calculate_ecc - generate non-inverted ecc bytes -* @cs: chip select number -* @dat: data pointer over which ecc is computed -* @ecc_code: ecc code buffer -* -* Using non-inverted ECC is considered ugly since writing a blank -* page (padding) will clear the ECC bytes. This is not a problem as long -* no one is trying to write data on the seemingly unused page. Reading -* an erased page will produce an ECC mismatch between generated and read -* ECC bytes that has to be dealt with separately. -*/ -int gpmc_calculate_ecc (int cs,const u_char *dat,u_char *ecc_code) -{ -unsigned int val =0x0 ; - -if (gpmc_ecc_used != cs) -return -EINVAL ; - -/* read ecc result */ - val =gpmc_read_reg (GPMC_ECC1_RESULT ); - *ecc_code++ = val;/* P128e, ..., P1e */ - *ecc_code++ = val >>16 ;/* P128o, ..., P1o */ -/* P2048o, P1024o, P512o, P256o, P2048e, P1024e, P512e, P256e */ - *ecc_code++ = ((val >>8 ) &0x0f ) | ((val >>20 ) &0xf0 ); - - gpmc_ecc_used = -EINVAL ; -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_calculate_ecc); - -#ifdef CONFIG_ARCH_OMAP3 - -/** -* gpmc_init_hwecc_bch - initialize hardware BCH ecc functionality -* @cs: chip select number -* @nsectors: how many 512-byte sectors to process -* @nerrors: how many errors to correct per sector (4 or 8) -* -* This function must be executed before any call to gpmc_enable_hwecc_bch. -*/ -int gpmc_init_hwecc_bch (int cs,int nsectors,int nerrors) -{ -/* check if ecc module is in use */ -if (gpmc_ecc_used != -EINVAL ) -return -EINVAL ; - -/* support only OMAP3 class */ -if (!cpu_is_omap34xx ()) { -printk (KERN_ERR "BCH ecc is not supported on this CPU\n" ); -return -EINVAL ; - } - -/* -* For now, assume 4-bit mode is only supported on OMAP3630 ES1.x, x>=1. -* Other chips may be added if confirmed to work. -*/ -if ((nerrors ==4 ) && - (!cpu_is_omap3630 () || (GET_OMAP_REVISION () ==0 ))) { -printk (KERN_ERR "BCH 4-bit mode is not supported on this CPU\n" ); -return -EINVAL ; - } - -/* sanity check */ -if (nsectors >8 ) { -printk (KERN_ERR "BCH cannot process %d sectors (max is 8)\n" , - nsectors); -return -EINVAL ; - } - -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_init_hwecc_bch); - -/** -* gpmc_enable_hwecc_bch - enable hardware BCH ecc functionality -* @cs: chip select number -* @mode: read/write mode -* @dev_width: device bus width(1 for x16, 0 for x8) -* @nsectors: how many 512-byte sectors to process -* @nerrors: how many errors to correct per sector (4 or 8) -*/ -int gpmc_enable_hwecc_bch (int cs,int mode,int dev_width,int nsectors, -int nerrors) -{ -unsigned int val; - -/* check if ecc module is in use */ -if (gpmc_ecc_used != -EINVAL ) -return -EINVAL ; - - gpmc_ecc_used = cs; - -/* clear ecc and enable bits */ -gpmc_write_reg (GPMC_ECC_CONTROL ,0x1 ); - -/* -* When using BCH, sector size is hardcoded to 512 bytes. -* Here we are using wrapping mode 6 both for reading and writing, with: -* size0 = 0 (no additional protected byte in spare area) -* size1 = 32 (skip 32 nibbles = 16 bytes per sector in spare area) -*/ -gpmc_write_reg (GPMC_ECC_SIZE_CONFIG , (32 <<22 ) | (0 <<12 )); - -/* BCH configuration */ - val = ((1 <<16 ) |/* enable BCH */ - (((nerrors ==8 ) ?1 :0 ) <<12 ) |/* 8 or 4 bits */ - (0x06 <<8 ) |/* wrap mode = 6 */ - (dev_width <<7 ) |/* bus width */ - (((nsectors-1 ) &0x7 ) <<4 ) |/* number of sectors */ - (cs <<1 ) |/* ECC CS */ - (0x1 ));/* enable ECC */ - -gpmc_write_reg (GPMC_ECC_CONFIG , val); -gpmc_write_reg (GPMC_ECC_CONTROL ,0x101 ); -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_enable_hwecc_bch); - -/** -* gpmc_calculate_ecc_bch4 - Generate 7 ecc bytes per sector of 512 data bytes -* @cs: chip select number -* @dat: The pointer to data on which ecc is computed -* @ecc: The ecc output buffer -*/ -int gpmc_calculate_ecc_bch4 (int cs,const u_char *dat,u_char *ecc) -{ -int i; -unsigned long nsectors, reg, val1, val2; - -if (gpmc_ecc_used != cs) -return -EINVAL ; - - nsectors = ((gpmc_read_reg (GPMC_ECC_CONFIG ) >>4 ) &0x7 ) +1 ; - -for (i =0 ; i < nsectors; i++) { - - reg =GPMC_ECC_BCH_RESULT_0 +16 *i; - -/* Read hw-computed remainder */ - val1 =gpmc_read_reg (reg +0 ); - val2 =gpmc_read_reg (reg +4 ); - -/* -* Add constant polynomial to remainder, in order to get an ecc -* sequence of 0xFFs for a buffer filled with 0xFFs; and -* left-justify the resulting polynomial. -*/ - *ecc++ =0x28 ^ ((val2 >>12 ) &0xFF ); - *ecc++ =0x13 ^ ((val2 >>4 ) &0xFF ); - *ecc++ =0xcc ^ (((val2 &0xF ) <<4 )|((val1 >>28 ) &0xF )); - *ecc++ =0x39 ^ ((val1 >>20 ) &0xFF ); - *ecc++ =0x96 ^ ((val1 >>12 ) &0xFF ); - *ecc++ =0xac ^ ((val1 >>4 ) &0xFF ); - *ecc++ =0x7f ^ ((val1 &0xF ) <<4 ); - } - - gpmc_ecc_used = -EINVAL ; -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_calculate_ecc_bch4); - -/** -* gpmc_calculate_ecc_bch8 - Generate 13 ecc bytes per block of 512 data bytes -* @cs: chip select number -* @dat: The pointer to data on which ecc is computed -* @ecc: The ecc output buffer -*/ -int gpmc_calculate_ecc_bch8 (int cs,const u_char *dat,u_char *ecc) -{ -int i; -unsigned long nsectors, reg, val1, val2, val3, val4; - -if (gpmc_ecc_used != cs) -return -EINVAL ; - - nsectors = ((gpmc_read_reg (GPMC_ECC_CONFIG ) >>4 ) &0x7 ) +1 ; - -for (i =0 ; i < nsectors; i++) { - - reg =GPMC_ECC_BCH_RESULT_0 +16 *i; - -/* Read hw-computed remainder */ - val1 =gpmc_read_reg (reg +0 ); - val2 =gpmc_read_reg (reg +4 ); - val3 =gpmc_read_reg (reg +8 ); - val4 =gpmc_read_reg (reg +12 ); - -/* -* Add constant polynomial to remainder, in order to get an ecc -* sequence of 0xFFs for a buffer filled with 0xFFs. -*/ - *ecc++ =0xef ^ (val4 &0xFF ); - *ecc++ =0x51 ^ ((val3 >>24 ) &0xFF ); - *ecc++ =0x2e ^ ((val3 >>16 ) &0xFF ); - *ecc++ =0x09 ^ ((val3 >>8 ) &0xFF ); - *ecc++ =0xed ^ (val3 &0xFF ); - *ecc++ =0x93 ^ ((val2 >>24 ) &0xFF ); - *ecc++ =0x9a ^ ((val2 >>16 ) &0xFF ); - *ecc++ =0xc2 ^ ((val2 >>8 ) &0xFF ); - *ecc++ =0x97 ^ (val2 &0xFF ); - *ecc++ =0x79 ^ ((val1 >>24 ) &0xFF ); - *ecc++ =0xe5 ^ ((val1 >>16 ) &0xFF ); - *ecc++ =0x24 ^ ((val1 >>8 ) &0xFF ); - *ecc++ =0xb5 ^ (val1 &0xFF ); - } - - gpmc_ecc_used = -EINVAL ; -return 0 ; -} -EXPORT_SYMBOL_GPL (gpmc_calculate_ecc_bch8); - -#endif /* CONFIG_ARCH_OMAP3 */
arch/arm/plat-omap/include/plat/gpmc.h +0 -31
@@ -34,15 +34,6 @@#define GPMC_SET_IRQ_STATUS 0x00000004#define GPMC_CONFIG_WP 0x00000005 -#define GPMC_GET_IRQ_STATUS 0x00000006 -#define GPMC_PREFETCH_FIFO_CNT 0x00000007/* bytes available in FIFO for r/w */ -#define GPMC_PREFETCH_COUNT 0x00000008/* remaining bytes to be read/write*/ -#define GPMC_STATUS_BUFFER 0x00000009/* 1: buffer is available to write */ - -#define GPMC_NAND_COMMAND 0x0000000a -#define GPMC_NAND_ADDRESS 0x0000000b -#define GPMC_NAND_DATA 0x0000000c -#define GPMC_ENABLE_IRQ 0x0000000d/* ECC commands */
@@ -78,15 +69,10 @@#define GPMC_DEVICETYPE_NOR 0#define GPMC_DEVICETYPE_NAND 2#define GPMC_CONFIG_WRITEPROTECT 0x00000010 -#define GPMC_STATUS_BUFF_EMPTY 0x00000001#define WR_RD_PIN_MONITORING 0x00600000 -#define GPMC_PREFETCH_STATUS_FIFO_CNT (val) ((val >> 24) & 0x7F) -#define GPMC_PREFETCH_STATUS_COUNT (val) (val & 0x00003fff)#define GPMC_IRQ_FIFOEVENTENABLE 0x01#define GPMC_IRQ_COUNT_EVENT 0x02 -#define PREFETCH_FIFOTHRESHOLD_MAX 0x40 -#define PREFETCH_FIFOTHRESHOLD (val) ((val) << 8)/* bool type time settings */ struct gpmc_bool_timings {
@@ -161,25 +147,8 @@ extern int gpmc_cs_request(int cs, unsigned long size, unsigned long *base);extern void gpmc_cs_free (int cs);extern int gpmc_cs_set_reserved (int cs,int reserved);extern int gpmc_cs_reserved (int cs); -extern int gpmc_prefetch_enable (int cs,int fifo_th,int dma_mode, -unsigned int u32_count,int is_write); -extern int gpmc_prefetch_reset (int cs);extern void omap3_gpmc_save_context (void );extern void omap3_gpmc_restore_context (void ); -extern int gpmc_read_status (int cmd);extern int gpmc_cs_configure (int cs,int cmd,int wval); -extern int gpmc_nand_read (int cs,int cmd); -extern int gpmc_nand_write (int cs,int cmd,int wval); - -int gpmc_enable_hwecc (int cs,int mode,int dev_width,int ecc_size); -int gpmc_calculate_ecc (int cs,const u_char *dat,u_char *ecc_code); - -#ifdef CONFIG_ARCH_OMAP3 -int gpmc_init_hwecc_bch (int cs,int nsectors,int nerrors); -int gpmc_enable_hwecc_bch (int cs,int mode,int dev_width,int nsectors, -int nerrors); -int gpmc_calculate_ecc_bch4 (int cs,const u_char *dat,u_char *ecc); -int gpmc_calculate_ecc_bch8 (int cs,const u_char *dat,u_char *ecc); -#endif /* CONFIG_ARCH_OMAP3 */ #endif
Signature · 1 line
1.7.12
PATCH v2 14/14 ARM: OMAP2+: gpmc: localize gpmc header
In reply to Afzal MohammedRequirement of gpmc header outside of mach-omap2 has been cutoff, move gpmc header file in plat-omap folder to local mach-omap2 folder
Objective - common zImage participation of omap
--- arch/arm/mach-omap2/board-2430sdp.c | 2 +- arch/arm/mach-omap2/board-3430sdp.c | 2 +- arch/arm/mach-omap2/board-apollon.c | 2 +- arch/arm/mach-omap2/board-cm-t35.c | 2 +- arch/arm/mach-omap2/board-cm-t3517.c | 2 +- arch/arm/mach-omap2/board-devkit8000.c | 2 +- arch/arm/mach-omap2/board-flash.c | 2 +- arch/arm/mach-omap2/board-flash.h | 2 +- arch/arm/mach-omap2/board-h4.c | 2 +- arch/arm/mach-omap2/board-igep0020.c | 2 +- arch/arm/mach-omap2/board-ldp.c | 2 +- arch/arm/mach-omap2/board-omap3beagle.c | 2 +- arch/arm/mach-omap2/board-omap3logic.c | 2 +- arch/arm/mach-omap2/board-omap3stalker.c | 2 +- arch/arm/mach-omap2/board-omap3touchbook.c | 2 +- arch/arm/mach-omap2/board-overo.c | 2 +- arch/arm/mach-omap2/board-rm680.c | 2 +- arch/arm/mach-omap2/board-rx51-peripherals.c | 2 +- arch/arm/mach-omap2/board-rx51.c | 2 +- arch/arm/mach-omap2/board-zoom-debugboard.c | 2 +- arch/arm/mach-omap2/gpmc-nand.c | 3 +- arch/arm/mach-omap2/gpmc-nand.h | 2 +- arch/arm/mach-omap2/gpmc-onenand.c | 3 +- arch/arm/mach-omap2/gpmc-smc91x.c | 2 +- arch/arm/mach-omap2/gpmc-smsc911x.c | 2 +- arch/arm/mach-omap2/gpmc.c | 3 +- arch/arm/mach-omap2/gpmc.h | 154 +++++++++++++++++++++++++++ arch/arm/mach-omap2/pm34xx.c | 2 +- arch/arm/mach-omap2/usb-tusb6010.c | 2 +- arch/arm/plat-omap/include/plat/gpmc.h | 154 --------------------------- 30 files changed, 182 insertions(+), 185 deletions(-) create mode 100644 arch/arm/mach-omap2/gpmc.h delete mode 100644 arch/arm/plat-omap/include/plat/gpmc.h
arch/arm/mach-omap2/board-2430sdp.c +1 -1
@@ -34,7 +34,7 @@#include <asm/mach/map.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/usb.h> #include "gpmc-smc91x.h"
arch/arm/mach-omap2/board-3430sdp.c +1 -1
@@ -33,7 +33,7 @@#include <plat/usb.h> #include "common.h" #include <plat/dma.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <video/omapdss.h> #include <video/omap-panel-tfp410.h>
arch/arm/mach-omap2/board-apollon.c +1 -1
@@ -35,7 +35,7 @@#include <plat/led.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <video/omapdss.h> #include <video/omap-panel-generic-dpi.h>
arch/arm/mach-omap2/board-cm-t35.c +1 -1
@@ -40,7 +40,7 @@#include "common.h" #include <linux/platform_data/mtd-nand-omap2.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/usb.h> #include <video/omapdss.h> #include <video/omap-panel-generic-dpi.h>
arch/arm/mach-omap2/board-cm-t3517.c +1 -1
@@ -41,7 +41,7 @@#include "common.h" #include <plat/usb.h> #include <linux/platform_data/mtd-nand-omap2.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "am35xx.h"
arch/arm/mach-omap2/board-devkit8000.c +1 -1
@@ -39,7 +39,7 @@#include <asm/mach/flash.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #include <plat/usb.h> #include <video/omapdss.h>
arch/arm/mach-omap2/board-flash.c +1 -1
@@ -18,7 +18,7 @@#include <linux/io.h> #include <plat/cpu.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #include <linux/platform_data/mtd-onenand-omap2.h> #include <plat/tc.h>
arch/arm/mach-omap2/board-flash.h +1 -1
@@ -12,7 +12,7 @@*/ #include <linux/mtd/mtd.h> #include <linux/mtd/partitions.h> -#include <plat/gpmc.h> +#include "gpmc.h" #define PDC_NOR 1#define PDC_NAND 2
arch/arm/mach-omap2/board-h4.c +1 -1
@@ -33,7 +33,6 @@#include <plat/menelaus.h> #include <plat/dma.h> -#include <plat/gpmc.h> #include "debug-devices.h" #include <video/omapdss.h>
@@ -42,6 +41,7 @@#include "common.h" #include "mux.h" #include "control.h" +#include "gpmc.h" #define H4_FLASH_CS 0#define H4_SMC91X_CS 1
arch/arm/mach-omap2/board-igep0020.c +1 -1
@@ -30,7 +30,7 @@#include <asm/mach/arch.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/usb.h> #include <video/omapdss.h>
arch/arm/mach-omap2/board-ldp.c +1 -1
@@ -35,7 +35,7 @@#include <asm/mach/map.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <mach/board-zoom.h> #include <plat/usb.h> #include "gpmc-smsc911x.h"
arch/arm/mach-omap2/board-omap3beagle.c +1 -1
@@ -41,7 +41,7 @@#include "common.h" #include <video/omapdss.h> #include <video/omap-panel-tfp410.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #include <plat/usb.h> #include <plat/omap_device.h>
arch/arm/mach-omap2/board-omap3logic.c +1 -1
@@ -35,7 +35,7 @@#include <asm/mach/map.h> #include "gpmc-smsc911x.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/sdrc.h> #include <plat/usb.h>
arch/arm/mach-omap2/board-omap3stalker.c +1 -1
@@ -40,7 +40,7 @@#include <asm/mach/flash.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #include <plat/usb.h> #include <video/omapdss.h>
arch/arm/mach-omap2/board-omap3touchbook.c +1 -1
@@ -44,7 +44,7 @@#include <asm/system_info.h> #include "common.h" -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #include <plat/usb.h>
arch/arm/mach-omap2/board-overo.c +1 -1
@@ -49,7 +49,7 @@#include <video/omapdss.h> #include <video/omap-panel-generic-dpi.h> #include <video/omap-panel-tfp410.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/usb.h> #include "mux.h"
arch/arm/mach-omap2/board-rm680.c +1 -1
@@ -25,7 +25,7 @@#include <plat/i2c.h> #include <plat/mmc.h> #include <plat/usb.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "common.h" #include <plat/serial.h>
arch/arm/mach-omap2/board-rx51-peripherals.c +1 -1
@@ -32,7 +32,7 @@#include "common.h" #include <plat/dma.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/omap-pm.h> #include "gpmc-smc91x.h"
arch/arm/mach-omap2/board-rx51.c +1 -1
@@ -25,7 +25,7 @@#include "common.h" #include <plat/dma.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/usb.h> #include "mux.h"
arch/arm/mach-omap2/board-zoom-debugboard.c +1 -1
@@ -17,7 +17,7 @@#include <linux/regulator/fixed.h> #include <linux/regulator/machine.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "gpmc-smsc911x.h" #include <mach/board-zoom.h>
arch/arm/mach-omap2/gpmc-nand.c +1 -2
@@ -17,8 +17,7 @@#include <asm/mach/flash.h> -#include <plat/gpmc.h> - +#include "gpmc.h" #include "soc.h" #include "gpmc-nand.h"
arch/arm/mach-omap2/gpmc-nand.h +1 -1
@@ -10,7 +10,7 @@#ifndef __OMAP2_GPMC_NAND_H#define __OMAP2_GPMC_NAND_H -#include <plat/gpmc.h> +#include "gpmc.h" #include <linux/platform_data/mtd-nand-omap2.h> #if IS_ENABLED (CONFIG_MTD_NAND_OMAP2 )
arch/arm/mach-omap2/gpmc-onenand.c +1 -2
@@ -20,8 +20,7 @@#include <asm/mach/flash.h> -#include <plat/gpmc.h> - +#include "gpmc.h" #include "soc.h" #include "gpmc-onenand.h"
arch/arm/mach-omap2/gpmc-smc91x.c +1 -1
@@ -17,7 +17,7 @@#include <linux/io.h> #include <linux/smc91x.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "gpmc-smc91x.h" #include "soc.h"
arch/arm/mach-omap2/gpmc-smsc911x.c +1 -1
@@ -20,7 +20,7 @@#include <linux/io.h> #include <linux/smsc911x.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "gpmc-smsc911x.h" static struct resource gpmc_smsc911x_resources[] = {
arch/arm/mach-omap2/gpmc.c +1 -2
@@ -29,15 +29,14 @@#include <linux/platform_data/mtd-nand-omap2.h> #include <asm/mach-types.h> -#include <plat/gpmc.h> #include <plat/cpu.h> -#include <plat/gpmc.h> #include <plat/sdrc.h> #include <plat/omap_device.h> #include "soc.h" #include "common.h" +#include "gpmc.h" #define DEVICE_NAME "omap-gpmc"
arch/arm/mach-omap2/gpmc.h new file +154 -0
154 lines not on this page · raw message
arch/arm/mach-omap2/pm34xx.c +1 -1
@@ -40,7 +40,7 @@#include "powerdomain.h" #include <plat/sdrc.h> #include <plat/prcm.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include <plat/dma.h> #include "common.h"
arch/arm/mach-omap2/usb-tusb6010.c +1 -1
@@ -18,7 +18,7 @@#include <linux/usb/musb.h> -#include <plat/gpmc.h> +#include "gpmc.h" #include "mux.h"
arch/arm/plat-omap/include/plat/gpmc.h deleted +0 -154
154 lines not on this page · raw message
Signature · 1 line
1.7.12
v2 cover OMAP-GPMC related cleanup for common zImage
In reply to Afzal MohammedHi Ivan,
Quoted 6 lines · Afzal
This series cleans up omap-gpmc related code so that omap can be a part of common zImage.
This series moves
gpmc.hfrom plat-omap/include/plat to mach-omap2 so that header file is local.
Quoted 7 lines
Patches 7 & 8 cleans up the already moved platform data header files to contain only platform data. Also gpmc-nand information is moved to nand platform data header.
Patches 9-13 makes nand driver independent of gpmc header file
And the final patch localizes gpmc header.
BCH[48] support that you have added on OMAP using gpmc exported symbols has been changed such that nand driver now takes care of BCH support without relying on gpmc exported symbols.
This is more or less a cut & paste of your implementation, which was necessitated now due to common ARM zImage cleanup w.r.t header files.
Please verify that BCH[48] works as earlier with this series.
Regards
Afzal
Quoted 6 lines
This series is available
@ git://gitorious.org/x0148406-public/linux-kernel.git gpmc-czimage-v2 and is based on linux-next (next-20121005) and is dependent on http://marc.info/?l=linux-omap&m=134945131602622&w=2
v2 cover OMAP-GPMC related cleanup for common zImage
Quoted 18 lines · Afzal
Hi Ivan,
Quoted 6 lines · Afzal
This series cleans up omap-gpmc related code so that omap can be a part of common zImage.
This series moves
gpmc.hfrom plat-omap/include/plat to mach-omap2 so that header file is local.Quoted 7 lines
Patches 7 & 8 cleans up the already moved platform data header files to contain only platform data. Also gpmc-nand information is moved to nand platform data header.
Patches 9-13 makes nand driver independent of gpmc header file
And the final patch localizes gpmc header.
Quoted 8 lines
BCH[48] support that you have added on OMAP using gpmc exported symbols has been changed such that nand driver now takes care of BCH support without relying on gpmc exported symbols.
This is more or less a cut & paste of your implementation, which was necessitated now due to common ARM zImage cleanup w.r.t header files.
Please verify that BCH[48] works as earlier with this series.
Hi Afzal,
I ran several mtd regression tests on a Beagle Board on your gpmc-czimage-v2 tag. All BCH error correcting tests passed successfully.
I occasionally had weird read errors though, especially when reading blank pages:
the omap driver returned 512-byte sectors containing something like:
30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff 30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff 30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff 30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff 30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff 30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
instead of:
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
I was able to reproduce the problem also on l2-mtd tip, albeit less often. The problem seems to occur quite randomly, it may be a hardware issue on my board...
Anyway, the ECC handling part looks OK to me.
Best regards,
--
Ivan
v2 cover OMAP-GPMC related cleanup for common zImage
Quoted 7 lines · Ivan Djelic
Quoted 1 line · Afzal
Please verify that BCH[48] works as earlier with this series.
I ran several mtd regression tests on a Beagle Board on your gpmc-czimage-v2 tag. All BCH error correcting tests passed successfully.
Quoted 8 lines
I occasionally had weird read errors though, especially when reading blank pages:
the omap driver returned 512-byte sectors containing something like:I was able to reproduce the problem also on l2-mtd tip, albeit less often. The problem seems to occur quite randomly, it may be a hardware issue on my board...
Anyway, the ECC handling part looks OK to me.
Thanks Ivan
Regards
Afzal
Tony Lindgren
maintainerv2 cover OMAP-GPMC related cleanup for common zImage
In reply to Ivan DjelicQuoted 43 lines · Ivan Djelic
I ran several mtd regression tests on a Beagle Board on your gpmc-czimage-v2 tag. All BCH error correcting tests passed successfully.
I occasionally had weird read errors though, especially when reading blank pages:
the omap driver returned 512-byte sectors containing something like:
30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ff30ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffinstead of:
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Quoted 3 lines
I was able to reproduce the problem also on l2-mtd tip, albeit less often. The problem seems to occur quite randomly, it may be a hardware issue on my board...
Things like this typically happen in the GPMC timings are not correct. Maybe add #define DEBUG to top of gpmc.c and compare the timings before and after Afzal's patches?
Quoted 1 line
Anyway, the ECC handling part looks OK to me.
Regards,
Tony
v2 cover OMAP-GPMC related cleanup for common zImage
Hi Ivan,
Quoted 8 lines · Tony Lindgren
Quoted 5 lines · Ivan Djelic
I ran several mtd regression tests on a Beagle Board on your gpmc-czimage-v2 tag. All BCH error correcting tests passed successfully.
I occasionally had weird read errors though, especially when reading blank pages:
the omap driver returned 512-byte sectors containing something like:
Quoted 7 lines
Quoted 3 lines
I was able to reproduce the problem also on l2-mtd tip, albeit less often. The problem seems to occur quite randomly, it may be a hardware issue on my board...
Things like this typically happen in the GPMC timings are not correct. Maybe add #define DEBUG to top of
gpmc.cand compare the timings before and after Afzal's patches?
Latest series for gpmc related cleanup for common zImage removed dependency on minor timing cleanups (this series was dependent on on another series that did minor timing cleanups).
A pull request for the new series on gpmc cleanup for common zImage that does not contain timing related changes and without dependency on timing related changes has been sent to Tony (forwarded to you now). He has pulled those changes onto l-o in "omap-for-v3.8/cleanup-headers-gpmc"
As there are no changes w.r.t timing's in the new series, behaviour should be same as without.
Quoted 1 line
Quoted 1 line
Anyway, the ECC handling part looks OK to me.
Regards
Afzal