aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/omap2.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/nand/omap2.c')
-rw-r--r--drivers/mtd/nand/omap2.c42
1 files changed, 8 insertions, 34 deletions
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index 090ab87086b5..7545568fce47 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -17,10 +17,11 @@
17#include <linux/mtd/nand.h> 17#include <linux/mtd/nand.h>
18#include <linux/mtd/partitions.h> 18#include <linux/mtd/partitions.h>
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/slab.h>
20 21
21#include <mach/dma.h> 22#include <plat/dma.h>
22#include <mach/gpmc.h> 23#include <plat/gpmc.h>
23#include <mach/nand.h> 24#include <plat/nand.h>
24 25
25#define GPMC_IRQ_STATUS 0x18 26#define GPMC_IRQ_STATUS 0x18
26#define GPMC_ECC_CONFIG 0x1F4 27#define GPMC_ECC_CONFIG 0x1F4
@@ -30,12 +31,8 @@
30 31
31#define DRIVER_NAME "omap2-nand" 32#define DRIVER_NAME "omap2-nand"
32 33
33/* size (4 KiB) for IO mapping */
34#define NAND_IO_SIZE SZ_4K
35
36#define NAND_WP_OFF 0 34#define NAND_WP_OFF 0
37#define NAND_WP_BIT 0x00000010 35#define NAND_WP_BIT 0x00000010
38#define WR_RD_PIN_MONITORING 0x00600000
39 36
40#define GPMC_BUF_FULL 0x00000001 37#define GPMC_BUF_FULL 0x00000001
41#define GPMC_BUF_EMPTY 0x00000000 38#define GPMC_BUF_EMPTY 0x00000000
@@ -882,8 +879,6 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
882 struct omap_nand_info *info; 879 struct omap_nand_info *info;
883 struct omap_nand_platform_data *pdata; 880 struct omap_nand_platform_data *pdata;
884 int err; 881 int err;
885 unsigned long val;
886
887 882
888 pdata = pdev->dev.platform_data; 883 pdata = pdev->dev.platform_data;
889 if (pdata == NULL) { 884 if (pdata == NULL) {
@@ -905,28 +900,14 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
905 info->gpmc_cs = pdata->cs; 900 info->gpmc_cs = pdata->cs;
906 info->gpmc_baseaddr = pdata->gpmc_baseaddr; 901 info->gpmc_baseaddr = pdata->gpmc_baseaddr;
907 info->gpmc_cs_baseaddr = pdata->gpmc_cs_baseaddr; 902 info->gpmc_cs_baseaddr = pdata->gpmc_cs_baseaddr;
903 info->phys_base = pdata->phys_base;
908 904
909 info->mtd.priv = &info->nand; 905 info->mtd.priv = &info->nand;
910 info->mtd.name = dev_name(&pdev->dev); 906 info->mtd.name = dev_name(&pdev->dev);
911 info->mtd.owner = THIS_MODULE; 907 info->mtd.owner = THIS_MODULE;
912 908
913 err = gpmc_cs_request(info->gpmc_cs, NAND_IO_SIZE, &info->phys_base); 909 info->nand.options |= pdata->devsize ? NAND_BUSWIDTH_16 : 0;
914 if (err < 0) { 910 info->nand.options |= NAND_SKIP_BBTSCAN;
915 dev_err(&pdev->dev, "Cannot request GPMC CS\n");
916 goto out_free_info;
917 }
918
919 /* Enable RD PIN Monitoring Reg */
920 if (pdata->dev_ready) {
921 val = gpmc_cs_read_reg(info->gpmc_cs, GPMC_CS_CONFIG1);
922 val |= WR_RD_PIN_MONITORING;
923 gpmc_cs_write_reg(info->gpmc_cs, GPMC_CS_CONFIG1, val);
924 }
925
926 val = gpmc_cs_read_reg(info->gpmc_cs, GPMC_CS_CONFIG7);
927 val &= ~(0xf << 8);
928 val |= (0xc & 0xf) << 8;
929 gpmc_cs_write_reg(info->gpmc_cs, GPMC_CS_CONFIG7, val);
930 911
931 /* NAND write protect off */ 912 /* NAND write protect off */
932 omap_nand_wp(&info->mtd, NAND_WP_OFF); 913 omap_nand_wp(&info->mtd, NAND_WP_OFF);
@@ -934,7 +915,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
934 if (!request_mem_region(info->phys_base, NAND_IO_SIZE, 915 if (!request_mem_region(info->phys_base, NAND_IO_SIZE,
935 pdev->dev.driver->name)) { 916 pdev->dev.driver->name)) {
936 err = -EBUSY; 917 err = -EBUSY;
937 goto out_free_cs; 918 goto out_free_info;
938 } 919 }
939 920
940 info->nand.IO_ADDR_R = ioremap(info->phys_base, NAND_IO_SIZE); 921 info->nand.IO_ADDR_R = ioremap(info->phys_base, NAND_IO_SIZE);
@@ -963,11 +944,6 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
963 info->nand.chip_delay = 50; 944 info->nand.chip_delay = 50;
964 } 945 }
965 946
966 info->nand.options |= NAND_SKIP_BBTSCAN;
967 if ((gpmc_cs_read_reg(info->gpmc_cs, GPMC_CS_CONFIG1) & 0x3000)
968 == 0x1000)
969 info->nand.options |= NAND_BUSWIDTH_16;
970
971 if (use_prefetch) { 947 if (use_prefetch) {
972 /* copy the virtual address of nand base for fifo access */ 948 /* copy the virtual address of nand base for fifo access */
973 info->nand_pref_fifo_add = info->nand.IO_ADDR_R; 949 info->nand_pref_fifo_add = info->nand.IO_ADDR_R;
@@ -1043,8 +1019,6 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
1043 1019
1044out_release_mem_region: 1020out_release_mem_region:
1045 release_mem_region(info->phys_base, NAND_IO_SIZE); 1021 release_mem_region(info->phys_base, NAND_IO_SIZE);
1046out_free_cs:
1047 gpmc_cs_free(info->gpmc_cs);
1048out_free_info: 1022out_free_info:
1049 kfree(info); 1023 kfree(info);
1050 1024