aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand
diff options
context:
space:
mode:
authorAfzal Mohammed <afzal@ti.com>2012-08-30 15:53:22 -0400
committerTony Lindgren <tony@atomide.com>2012-08-30 15:53:22 -0400
commit65b97cf6b8deca3ad7a3e00e8316bb89617190fb (patch)
tree36609ec30a2666d21ef29c3b59b9fd7418d480ef /drivers/mtd/nand
parentd126d0158b98469b833bcd5214bc909f164a0033 (diff)
mtd: nand: omap2: handle nand on gpmc
GPMC platform initialization has been modified to fill NAND platform data with GPMC NAND register details. As these registers are accessible in NAND driver itself, configure NAND in GPMC by itself. Modified prefetch and ecc functions are logically same as the corresponding exported symbols from GPMC code. Note: Verfying that other CS have not yet enabled for prefetch & ecc has to be incorporated. Currently this causes no issues as there are no boards that use NAND on multiple CS. With ongoing GPMC driver migration, perhaps it would be better to consider NAND connected on multiple CS as a single peripheral using multiple CS. This would make handling multiple CS issues easier. Signed-off-by: Afzal Mohammed <afzal@ti.com> Acked-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r--drivers/mtd/nand/omap2.c206
1 files changed, 161 insertions, 45 deletions
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index ac4fd756eda3..52fc089d5bcb 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -101,6 +101,16 @@
101#define P4e_s(a) (TF(a & NAND_Ecc_P4e) << 0) 101#define P4e_s(a) (TF(a & NAND_Ecc_P4e) << 0)
102#define P4o_s(a) (TF(a & NAND_Ecc_P4o) << 1) 102#define P4o_s(a) (TF(a & NAND_Ecc_P4o) << 1)
103 103
104#define PREFETCH_CONFIG1_CS_SHIFT 24
105#define ECC_CONFIG_CS_SHIFT 1
106#define CS_MASK 0x7
107#define ENABLE_PREFETCH (0x1 << 7)
108#define DMA_MPU_MODE_SHIFT 2
109#define ECCSIZE1_SHIFT 22
110#define ECC1RESULTSIZE 0x1
111#define ECCCLEAR 0x100
112#define ECC1 0x1
113
104/* oob info generated runtime depending on ecc algorithm and layout selected */ 114/* oob info generated runtime depending on ecc algorithm and layout selected */
105static struct nand_ecclayout omap_oobinfo; 115static struct nand_ecclayout omap_oobinfo;
106/* Define some generic bad / good block scan pattern which are used 116/* Define some generic bad / good block scan pattern which are used
@@ -133,6 +143,7 @@ struct omap_nand_info {
133 } iomode; 143 } iomode;
134 u_char *buf; 144 u_char *buf;
135 int buf_len; 145 int buf_len;
146 struct gpmc_nand_regs reg;
136 147
137#ifdef CONFIG_MTD_NAND_OMAP_BCH 148#ifdef CONFIG_MTD_NAND_OMAP_BCH
138 struct bch_control *bch; 149 struct bch_control *bch;
@@ -141,6 +152,63 @@ struct omap_nand_info {
141}; 152};
142 153
143/** 154/**
155 * omap_prefetch_enable - configures and starts prefetch transfer
156 * @cs: cs (chip select) number
157 * @fifo_th: fifo threshold to be used for read/ write
158 * @dma_mode: dma mode enable (1) or disable (0)
159 * @u32_count: number of bytes to be transferred
160 * @is_write: prefetch read(0) or write post(1) mode
161 */
162static int omap_prefetch_enable(int cs, int fifo_th, int dma_mode,
163 unsigned int u32_count, int is_write, struct omap_nand_info *info)
164{
165 u32 val;
166
167 if (fifo_th > PREFETCH_FIFOTHRESHOLD_MAX)
168 return -1;
169
170 if (readl(info->reg.gpmc_prefetch_control))
171 return -EBUSY;
172
173 /* Set the amount of bytes to be prefetched */
174 writel(u32_count, info->reg.gpmc_prefetch_config2);
175
176 /* Set dma/mpu mode, the prefetch read / post write and
177 * enable the engine. Set which cs is has requested for.
178 */
179 val = ((cs << PREFETCH_CONFIG1_CS_SHIFT) |
180 PREFETCH_FIFOTHRESHOLD(fifo_th) | ENABLE_PREFETCH |
181 (dma_mode << DMA_MPU_MODE_SHIFT) | (0x1 & is_write));
182 writel(val, info->reg.gpmc_prefetch_config1);
183
184 /* Start the prefetch engine */
185 writel(0x1, info->reg.gpmc_prefetch_control);
186
187 return 0;
188}
189
190/**
191 * omap_prefetch_reset - disables and stops the prefetch engine
192 */
193static int omap_prefetch_reset(int cs, struct omap_nand_info *info)
194{
195 u32 config1;
196
197 /* check if the same module/cs is trying to reset */
198 config1 = readl(info->reg.gpmc_prefetch_config1);
199 if (((config1 >> PREFETCH_CONFIG1_CS_SHIFT) & CS_MASK) != cs)
200 return -EINVAL;
201
202 /* Stop the PFPW engine */
203 writel(0x0, info->reg.gpmc_prefetch_control);
204
205 /* Reset/disable the PFPW engine */
206 writel(0x0, info->reg.gpmc_prefetch_config1);
207
208 return 0;
209}
210
211/**
144 * omap_hwcontrol - hardware specific access to control-lines 212 * omap_hwcontrol - hardware specific access to control-lines
145 * @mtd: MTD device structure 213 * @mtd: MTD device structure
146 * @cmd: command to device 214 * @cmd: command to device
@@ -158,13 +226,13 @@ static void omap_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
158 226
159 if (cmd != NAND_CMD_NONE) { 227 if (cmd != NAND_CMD_NONE) {
160 if (ctrl & NAND_CLE) 228 if (ctrl & NAND_CLE)
161 gpmc_nand_write(info->gpmc_cs, GPMC_NAND_COMMAND, cmd); 229 writeb(cmd, info->reg.gpmc_nand_command);
162 230
163 else if (ctrl & NAND_ALE) 231 else if (ctrl & NAND_ALE)
164 gpmc_nand_write(info->gpmc_cs, GPMC_NAND_ADDRESS, cmd); 232 writeb(cmd, info->reg.gpmc_nand_address);
165 233
166 else /* NAND_NCE */ 234 else /* NAND_NCE */
167 gpmc_nand_write(info->gpmc_cs, GPMC_NAND_DATA, cmd); 235 writeb(cmd, info->reg.gpmc_nand_data);
168 } 236 }
169} 237}
170 238
@@ -198,7 +266,8 @@ static void omap_write_buf8(struct mtd_info *mtd, const u_char *buf, int len)
198 iowrite8(*p++, info->nand.IO_ADDR_W); 266 iowrite8(*p++, info->nand.IO_ADDR_W);
199 /* wait until buffer is available for write */ 267 /* wait until buffer is available for write */
200 do { 268 do {
201 status = gpmc_read_status(GPMC_STATUS_BUFFER); 269 status = readl(info->reg.gpmc_status) &
270 GPMC_STATUS_BUFF_EMPTY;
202 } while (!status); 271 } while (!status);
203 } 272 }
204} 273}
@@ -235,7 +304,8 @@ static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len)
235 iowrite16(*p++, info->nand.IO_ADDR_W); 304 iowrite16(*p++, info->nand.IO_ADDR_W);
236 /* wait until buffer is available for write */ 305 /* wait until buffer is available for write */
237 do { 306 do {
238 status = gpmc_read_status(GPMC_STATUS_BUFFER); 307 status = readl(info->reg.gpmc_status) &
308 GPMC_STATUS_BUFF_EMPTY;
239 } while (!status); 309 } while (!status);
240 } 310 }
241} 311}
@@ -265,8 +335,8 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
265 } 335 }
266 336
267 /* configure and start prefetch transfer */ 337 /* configure and start prefetch transfer */
268 ret = gpmc_prefetch_enable(info->gpmc_cs, 338 ret = omap_prefetch_enable(info->gpmc_cs,
269 PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0); 339 PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0, info);
270 if (ret) { 340 if (ret) {
271 /* PFPW engine is busy, use cpu copy method */ 341 /* PFPW engine is busy, use cpu copy method */
272 if (info->nand.options & NAND_BUSWIDTH_16) 342 if (info->nand.options & NAND_BUSWIDTH_16)
@@ -275,14 +345,15 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
275 omap_read_buf8(mtd, (u_char *)p, len); 345 omap_read_buf8(mtd, (u_char *)p, len);
276 } else { 346 } else {
277 do { 347 do {
278 r_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); 348 r_count = readl(info->reg.gpmc_prefetch_status);
349 r_count = GPMC_PREFETCH_STATUS_FIFO_CNT(r_count);
279 r_count = r_count >> 2; 350 r_count = r_count >> 2;
280 ioread32_rep(info->nand.IO_ADDR_R, p, r_count); 351 ioread32_rep(info->nand.IO_ADDR_R, p, r_count);
281 p += r_count; 352 p += r_count;
282 len -= r_count << 2; 353 len -= r_count << 2;
283 } while (len); 354 } while (len);
284 /* disable and stop the PFPW engine */ 355 /* disable and stop the PFPW engine */
285 gpmc_prefetch_reset(info->gpmc_cs); 356 omap_prefetch_reset(info->gpmc_cs, info);
286 } 357 }
287} 358}
288 359
@@ -301,6 +372,7 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
301 int i = 0, ret = 0; 372 int i = 0, ret = 0;
302 u16 *p = (u16 *)buf; 373 u16 *p = (u16 *)buf;
303 unsigned long tim, limit; 374 unsigned long tim, limit;
375 u32 val;
304 376
305 /* take care of subpage writes */ 377 /* take care of subpage writes */
306 if (len % 2 != 0) { 378 if (len % 2 != 0) {
@@ -310,8 +382,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
310 } 382 }
311 383
312 /* configure and start prefetch transfer */ 384 /* configure and start prefetch transfer */
313 ret = gpmc_prefetch_enable(info->gpmc_cs, 385 ret = omap_prefetch_enable(info->gpmc_cs,
314 PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1); 386 PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1, info);
315 if (ret) { 387 if (ret) {
316 /* PFPW engine is busy, use cpu copy method */ 388 /* PFPW engine is busy, use cpu copy method */
317 if (info->nand.options & NAND_BUSWIDTH_16) 389 if (info->nand.options & NAND_BUSWIDTH_16)
@@ -320,7 +392,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
320 omap_write_buf8(mtd, (u_char *)p, len); 392 omap_write_buf8(mtd, (u_char *)p, len);
321 } else { 393 } else {
322 while (len) { 394 while (len) {
323 w_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); 395 w_count = readl(info->reg.gpmc_prefetch_status);
396 w_count = GPMC_PREFETCH_STATUS_FIFO_CNT(w_count);
324 w_count = w_count >> 1; 397 w_count = w_count >> 1;
325 for (i = 0; (i < w_count) && len; i++, len -= 2) 398 for (i = 0; (i < w_count) && len; i++, len -= 2)
326 iowrite16(*p++, info->nand.IO_ADDR_W); 399 iowrite16(*p++, info->nand.IO_ADDR_W);
@@ -329,11 +402,14 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
329 tim = 0; 402 tim = 0;
330 limit = (loops_per_jiffy * 403 limit = (loops_per_jiffy *
331 msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); 404 msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
332 while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) 405 do {
333 cpu_relax(); 406 cpu_relax();
407 val = readl(info->reg.gpmc_prefetch_status);
408 val = GPMC_PREFETCH_STATUS_COUNT(val);
409 } while (val && (tim++ < limit));
334 410
335 /* disable and stop the PFPW engine */ 411 /* disable and stop the PFPW engine */
336 gpmc_prefetch_reset(info->gpmc_cs); 412 omap_prefetch_reset(info->gpmc_cs, info);
337 } 413 }
338} 414}
339 415
@@ -365,6 +441,7 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
365 unsigned long tim, limit; 441 unsigned long tim, limit;
366 unsigned n; 442 unsigned n;
367 int ret; 443 int ret;
444 u32 val;
368 445
369 if (addr >= high_memory) { 446 if (addr >= high_memory) {
370 struct page *p1; 447 struct page *p1;
@@ -396,9 +473,9 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
396 tx->callback_param = &info->comp; 473 tx->callback_param = &info->comp;
397 dmaengine_submit(tx); 474 dmaengine_submit(tx);
398 475
399 /* configure and start prefetch transfer */ 476 /* configure and start prefetch transfer */
400 ret = gpmc_prefetch_enable(info->gpmc_cs, 477 ret = omap_prefetch_enable(info->gpmc_cs,
401 PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write); 478 PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write, info);
402 if (ret) 479 if (ret)
403 /* PFPW engine is busy, use cpu copy method */ 480 /* PFPW engine is busy, use cpu copy method */
404 goto out_copy_unmap; 481 goto out_copy_unmap;
@@ -410,11 +487,15 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
410 wait_for_completion(&info->comp); 487 wait_for_completion(&info->comp);
411 tim = 0; 488 tim = 0;
412 limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); 489 limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
413 while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) 490
491 do {
414 cpu_relax(); 492 cpu_relax();
493 val = readl(info->reg.gpmc_prefetch_status);
494 val = GPMC_PREFETCH_STATUS_COUNT(val);
495 } while (val && (tim++ < limit));
415 496
416 /* disable and stop the PFPW engine */ 497 /* disable and stop the PFPW engine */
417 gpmc_prefetch_reset(info->gpmc_cs); 498 omap_prefetch_reset(info->gpmc_cs, info);
418 499
419 dma_unmap_sg(info->dma->device->dev, &sg, 1, dir); 500 dma_unmap_sg(info->dma->device->dev, &sg, 1, dir);
420 return 0; 501 return 0;
@@ -474,7 +555,8 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev)
474 u32 irq_stat; 555 u32 irq_stat;
475 556
476 irq_stat = gpmc_read_status(GPMC_GET_IRQ_STATUS); 557 irq_stat = gpmc_read_status(GPMC_GET_IRQ_STATUS);
477 bytes = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); 558 bytes = readl(info->reg.gpmc_prefetch_status);
559 bytes = GPMC_PREFETCH_STATUS_FIFO_CNT(bytes);
478 bytes = bytes & 0xFFFC; /* io in multiple of 4 bytes */ 560 bytes = bytes & 0xFFFC; /* io in multiple of 4 bytes */
479 if (info->iomode == OMAP_NAND_IO_WRITE) { /* checks for write io */ 561 if (info->iomode == OMAP_NAND_IO_WRITE) { /* checks for write io */
480 if (irq_stat & 0x2) 562 if (irq_stat & 0x2)
@@ -534,8 +616,8 @@ static void omap_read_buf_irq_pref(struct mtd_info *mtd, u_char *buf, int len)
534 init_completion(&info->comp); 616 init_completion(&info->comp);
535 617
536 /* configure and start prefetch transfer */ 618 /* configure and start prefetch transfer */
537 ret = gpmc_prefetch_enable(info->gpmc_cs, 619 ret = omap_prefetch_enable(info->gpmc_cs,
538 PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0); 620 PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0, info);
539 if (ret) 621 if (ret)
540 /* PFPW engine is busy, use cpu copy method */ 622 /* PFPW engine is busy, use cpu copy method */
541 goto out_copy; 623 goto out_copy;
@@ -549,7 +631,7 @@ static void omap_read_buf_irq_pref(struct mtd_info *mtd, u_char *buf, int len)
549 wait_for_completion(&info->comp); 631 wait_for_completion(&info->comp);
550 632
551 /* disable and stop the PFPW engine */ 633 /* disable and stop the PFPW engine */
552 gpmc_prefetch_reset(info->gpmc_cs); 634 omap_prefetch_reset(info->gpmc_cs, info);
553 return; 635 return;
554 636
555out_copy: 637out_copy:
@@ -572,6 +654,7 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd,
572 struct omap_nand_info, mtd); 654 struct omap_nand_info, mtd);
573 int ret = 0; 655 int ret = 0;
574 unsigned long tim, limit; 656 unsigned long tim, limit;
657 u32 val;
575 658
576 if (len <= mtd->oobsize) { 659 if (len <= mtd->oobsize) {
577 omap_write_buf_pref(mtd, buf, len); 660 omap_write_buf_pref(mtd, buf, len);
@@ -583,8 +666,8 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd,
583 init_completion(&info->comp); 666 init_completion(&info->comp);
584 667
585 /* configure and start prefetch transfer : size=24 */ 668 /* configure and start prefetch transfer : size=24 */
586 ret = gpmc_prefetch_enable(info->gpmc_cs, 669 ret = omap_prefetch_enable(info->gpmc_cs,
587 (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1); 670 (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1, info);
588 if (ret) 671 if (ret)
589 /* PFPW engine is busy, use cpu copy method */ 672 /* PFPW engine is busy, use cpu copy method */
590 goto out_copy; 673 goto out_copy;
@@ -599,11 +682,14 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd,
599 /* wait for data to flushed-out before reset the prefetch */ 682 /* wait for data to flushed-out before reset the prefetch */
600 tim = 0; 683 tim = 0;
601 limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); 684 limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
602 while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) 685 do {
686 val = readl(info->reg.gpmc_prefetch_status);
687 val = GPMC_PREFETCH_STATUS_COUNT(val);
603 cpu_relax(); 688 cpu_relax();
689 } while (val && (tim++ < limit));
604 690
605 /* disable and stop the PFPW engine */ 691 /* disable and stop the PFPW engine */
606 gpmc_prefetch_reset(info->gpmc_cs); 692 omap_prefetch_reset(info->gpmc_cs, info);
607 return; 693 return;
608 694
609out_copy: 695out_copy:
@@ -843,7 +929,20 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
843{ 929{
844 struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, 930 struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
845 mtd); 931 mtd);
846 return gpmc_calculate_ecc(info->gpmc_cs, dat, ecc_code); 932 u32 val;
933
934 val = readl(info->reg.gpmc_ecc_config);
935 if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs)
936 return -EINVAL;
937
938 /* read ecc result */
939 val = readl(info->reg.gpmc_ecc1_result);
940 *ecc_code++ = val; /* P128e, ..., P1e */
941 *ecc_code++ = val >> 16; /* P128o, ..., P1o */
942 /* P2048o, P1024o, P512o, P256o, P2048e, P1024e, P512e, P256e */
943 *ecc_code++ = ((val >> 8) & 0x0f) | ((val >> 20) & 0xf0);
944
945 return 0;
847} 946}
848 947
849/** 948/**
@@ -857,8 +956,34 @@ static void omap_enable_hwecc(struct mtd_info *mtd, int mode)
857 mtd); 956 mtd);
858 struct nand_chip *chip = mtd->priv; 957 struct nand_chip *chip = mtd->priv;
859 unsigned int dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0; 958 unsigned int dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0;
959 u32 val;
860 960
861 gpmc_enable_hwecc(info->gpmc_cs, mode, dev_width, info->nand.ecc.size); 961 /* clear ecc and enable bits */
962 val = ECCCLEAR | ECC1;
963 writel(val, info->reg.gpmc_ecc_control);
964
965 /* program ecc and result sizes */
966 val = ((((info->nand.ecc.size >> 1) - 1) << ECCSIZE1_SHIFT) |
967 ECC1RESULTSIZE);
968 writel(val, info->reg.gpmc_ecc_size_config);
969
970 switch (mode) {
971 case NAND_ECC_READ:
972 case NAND_ECC_WRITE:
973 writel(ECCCLEAR | ECC1, info->reg.gpmc_ecc_control);
974 break;
975 case NAND_ECC_READSYN:
976 writel(ECCCLEAR, info->reg.gpmc_ecc_control);
977 break;
978 default:
979 dev_info(&info->pdev->dev,
980 "error: unrecognized Mode[%d]!\n", mode);
981 break;
982 }
983
984 /* (ECC 16 or 8 bit col) | ( CS ) | ECC Enable */
985 val = (dev_width << 7) | (info->gpmc_cs << 1) | (0x1);
986 writel(val, info->reg.gpmc_ecc_config);
862} 987}
863 988
864/** 989/**
@@ -886,10 +1011,9 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)
886 else 1011 else
887 timeo += (HZ * 20) / 1000; 1012 timeo += (HZ * 20) / 1000;
888 1013
889 gpmc_nand_write(info->gpmc_cs, 1014 writeb(NAND_CMD_STATUS & 0xFF, info->reg.gpmc_nand_command);
890 GPMC_NAND_COMMAND, (NAND_CMD_STATUS & 0xFF));
891 while (time_before(jiffies, timeo)) { 1015 while (time_before(jiffies, timeo)) {
892 status = gpmc_nand_read(info->gpmc_cs, GPMC_NAND_DATA); 1016 status = readb(info->reg.gpmc_nand_data);
893 if (status & NAND_STATUS_READY) 1017 if (status & NAND_STATUS_READY)
894 break; 1018 break;
895 cond_resched(); 1019 cond_resched();
@@ -909,22 +1033,13 @@ static int omap_dev_ready(struct mtd_info *mtd)
909 struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, 1033 struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
910 mtd); 1034 mtd);
911 1035
912 val = gpmc_read_status(GPMC_GET_IRQ_STATUS); 1036 val = readl(info->reg.gpmc_status);
1037
913 if ((val & 0x100) == 0x100) { 1038 if ((val & 0x100) == 0x100) {
914 /* Clear IRQ Interrupt */ 1039 return 1;
915 val |= 0x100;
916 val &= ~(0x0);
917 gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, val);
918 } else { 1040 } else {
919 unsigned int cnt = 0; 1041 return 0;
920 while (cnt++ < 0x1FF) {
921 if ((val & 0x100) == 0x100)
922 return 0;
923 val = gpmc_read_status(GPMC_GET_IRQ_STATUS);
924 }
925 } 1042 }
926
927 return 1;
928} 1043}
929 1044
930#ifdef CONFIG_MTD_NAND_OMAP_BCH 1045#ifdef CONFIG_MTD_NAND_OMAP_BCH
@@ -1175,6 +1290,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
1175 1290
1176 info->gpmc_cs = pdata->cs; 1291 info->gpmc_cs = pdata->cs;
1177 info->phys_base = pdata->phys_base; 1292 info->phys_base = pdata->phys_base;
1293 info->reg = pdata->reg;
1178 1294
1179 info->mtd.priv = &info->nand; 1295 info->mtd.priv = &info->nand;
1180 info->mtd.name = dev_name(&pdev->dev); 1296 info->mtd.name = dev_name(&pdev->dev);