1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/clk.h>
22#include <linux/slab.h>
23#include <linux/interrupt.h>
24#include <linux/module.h>
25#include <linux/mtd/partitions.h>
26#include <linux/of.h>
27#include <linux/of_device.h>
28#include <linux/of_mtd.h>
29#include "gpmi-nand.h"
30#include "bch-regs.h"
31
32
33#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME "gpmi-nand"
34#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME "bch"
35#define GPMI_NAND_BCH_INTERRUPT_RES_NAME "bch"
36
37
38static uint8_t scan_ff_pattern[] = { 0xff };
39static struct nand_bbt_descr gpmi_bbt_descr = {
40 .options = 0,
41 .offs = 0,
42 .len = 1,
43 .pattern = scan_ff_pattern
44};
45
46
47
48
49
50static struct nand_ecclayout gpmi_hw_ecclayout = {
51 .eccbytes = 0,
52 .eccpos = { 0, },
53 .oobfree = { {.offset = 0, .length = 0} }
54};
55
56static const struct gpmi_devdata gpmi_devdata_imx23 = {
57 .type = IS_MX23,
58 .bch_max_ecc_strength = 20,
59 .max_chain_delay = 16,
60};
61
62static const struct gpmi_devdata gpmi_devdata_imx28 = {
63 .type = IS_MX28,
64 .bch_max_ecc_strength = 20,
65 .max_chain_delay = 16,
66};
67
68static const struct gpmi_devdata gpmi_devdata_imx6q = {
69 .type = IS_MX6Q,
70 .bch_max_ecc_strength = 40,
71 .max_chain_delay = 12,
72};
73
74static const struct gpmi_devdata gpmi_devdata_imx6sx = {
75 .type = IS_MX6SX,
76 .bch_max_ecc_strength = 62,
77 .max_chain_delay = 12,
78};
79
80static irqreturn_t bch_irq(int irq, void *cookie)
81{
82 struct gpmi_nand_data *this = cookie;
83
84 gpmi_clear_bch(this);
85 complete(&this->bch_done);
86 return IRQ_HANDLED;
87}
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107static inline int get_ecc_strength(struct gpmi_nand_data *this)
108{
109 struct bch_geometry *geo = &this->bch_geometry;
110 struct mtd_info *mtd = &this->mtd;
111 int ecc_strength;
112
113 ecc_strength = ((mtd->oobsize - geo->metadata_size) * 8)
114 / (geo->gf_len * geo->ecc_chunk_count);
115
116
117 return round_down(ecc_strength, 2);
118}
119
120static inline bool gpmi_check_ecc(struct gpmi_nand_data *this)
121{
122 struct bch_geometry *geo = &this->bch_geometry;
123
124
125 if (GPMI_IS_MX23(this) || GPMI_IS_MX28(this)) {
126
127 if (geo->gf_len == 14)
128 return false;
129 }
130 return geo->ecc_strength <= this->devdata->bch_max_ecc_strength;
131}
132
133
134
135
136
137
138
139static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)
140{
141 struct bch_geometry *geo = &this->bch_geometry;
142 struct mtd_info *mtd = &this->mtd;
143 struct nand_chip *chip = mtd->priv;
144 struct nand_oobfree *of = gpmi_hw_ecclayout.oobfree;
145 unsigned int block_mark_bit_offset;
146
147 if (!(chip->ecc_strength_ds > 0 && chip->ecc_step_ds > 0))
148 return false;
149
150 switch (chip->ecc_step_ds) {
151 case SZ_512:
152 geo->gf_len = 13;
153 break;
154 case SZ_1K:
155 geo->gf_len = 14;
156 break;
157 default:
158 dev_err(this->dev,
159 "unsupported nand chip. ecc bits : %d, ecc size : %d\n",
160 chip->ecc_strength_ds, chip->ecc_step_ds);
161 return false;
162 }
163 geo->ecc_chunk_size = chip->ecc_step_ds;
164 geo->ecc_strength = round_up(chip->ecc_strength_ds, 2);
165 if (!gpmi_check_ecc(this))
166 return false;
167
168
169 if (geo->ecc_chunk_size < mtd->oobsize) {
170 dev_err(this->dev,
171 "unsupported nand chip. ecc size: %d, oob size : %d\n",
172 chip->ecc_step_ds, mtd->oobsize);
173 return false;
174 }
175
176
177 geo->metadata_size = 10;
178
179 geo->ecc_chunk_count = mtd->writesize / geo->ecc_chunk_size;
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229 geo->page_size = mtd->writesize + geo->metadata_size +
230 (geo->gf_len * geo->ecc_strength * geo->ecc_chunk_count) / 8;
231
232
233 if (geo->page_size < mtd->writesize + mtd->oobsize) {
234 of->offset = geo->page_size - mtd->writesize;
235 of->length = mtd->oobsize - of->offset;
236 }
237
238 geo->payload_size = mtd->writesize;
239
240 geo->auxiliary_status_offset = ALIGN(geo->metadata_size, 4);
241 geo->auxiliary_size = ALIGN(geo->metadata_size, 4)
242 + ALIGN(geo->ecc_chunk_count, 4);
243
244 if (!this->swap_block_mark)
245 return true;
246
247
248 block_mark_bit_offset = mtd->writesize * 8 -
249 (geo->ecc_strength * geo->gf_len * (geo->ecc_chunk_count - 1)
250 + geo->metadata_size * 8);
251
252 geo->block_mark_byte_offset = block_mark_bit_offset / 8;
253 geo->block_mark_bit_offset = block_mark_bit_offset % 8;
254 return true;
255}
256
257static int legacy_set_geometry(struct gpmi_nand_data *this)
258{
259 struct bch_geometry *geo = &this->bch_geometry;
260 struct mtd_info *mtd = &this->mtd;
261 unsigned int metadata_size;
262 unsigned int status_size;
263 unsigned int block_mark_bit_offset;
264
265
266
267
268
269
270 geo->metadata_size = 10;
271
272
273 geo->gf_len = 13;
274
275
276 geo->ecc_chunk_size = 512;
277 while (geo->ecc_chunk_size < mtd->oobsize) {
278 geo->ecc_chunk_size *= 2;
279 geo->gf_len = 14;
280 }
281
282 geo->ecc_chunk_count = mtd->writesize / geo->ecc_chunk_size;
283
284
285 geo->ecc_strength = get_ecc_strength(this);
286 if (!gpmi_check_ecc(this)) {
287 dev_err(this->dev,
288 "required ecc strength of the NAND chip: %d is not supported by the GPMI controller (%d)\n",
289 geo->ecc_strength,
290 this->devdata->bch_max_ecc_strength);
291 return -EINVAL;
292 }
293
294 geo->page_size = mtd->writesize + mtd->oobsize;
295 geo->payload_size = mtd->writesize;
296
297
298
299
300
301
302
303 metadata_size = ALIGN(geo->metadata_size, 4);
304 status_size = ALIGN(geo->ecc_chunk_count, 4);
305
306 geo->auxiliary_size = metadata_size + status_size;
307 geo->auxiliary_status_offset = metadata_size;
308
309 if (!this->swap_block_mark)
310 return 0;
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358 block_mark_bit_offset = mtd->writesize * 8 -
359 (geo->ecc_strength * geo->gf_len * (geo->ecc_chunk_count - 1)
360 + geo->metadata_size * 8);
361
362 geo->block_mark_byte_offset = block_mark_bit_offset / 8;
363 geo->block_mark_bit_offset = block_mark_bit_offset % 8;
364 return 0;
365}
366
367int common_nfc_set_geometry(struct gpmi_nand_data *this)
368{
369 if (of_property_read_bool(this->dev->of_node, "fsl,use-minimum-ecc")
370 && set_geometry_by_ecc_info(this))
371 return 0;
372 return legacy_set_geometry(this);
373}
374
375struct dma_chan *get_dma_chan(struct gpmi_nand_data *this)
376{
377
378 return this->dma_chans[0];
379}
380
381
382void prepare_data_dma(struct gpmi_nand_data *this, enum dma_data_direction dr)
383{
384 struct scatterlist *sgl = &this->data_sgl;
385 int ret;
386
387
388 if (virt_addr_valid(this->upper_buf) &&
389 !object_is_on_stack(this->upper_buf)) {
390 sg_init_one(sgl, this->upper_buf, this->upper_len);
391 ret = dma_map_sg(this->dev, sgl, 1, dr);
392 if (ret == 0)
393 goto map_fail;
394
395 this->direct_dma_map_ok = true;
396 return;
397 }
398
399map_fail:
400
401 sg_init_one(sgl, this->data_buffer_dma, this->upper_len);
402
403 if (dr == DMA_TO_DEVICE)
404 memcpy(this->data_buffer_dma, this->upper_buf, this->upper_len);
405
406 dma_map_sg(this->dev, sgl, 1, dr);
407
408 this->direct_dma_map_ok = false;
409}
410
411
412static void dma_irq_callback(void *param)
413{
414 struct gpmi_nand_data *this = param;
415 struct completion *dma_c = &this->dma_done;
416
417 switch (this->dma_type) {
418 case DMA_FOR_COMMAND:
419 dma_unmap_sg(this->dev, &this->cmd_sgl, 1, DMA_TO_DEVICE);
420 break;
421
422 case DMA_FOR_READ_DATA:
423 dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE);
424 if (this->direct_dma_map_ok == false)
425 memcpy(this->upper_buf, this->data_buffer_dma,
426 this->upper_len);
427 break;
428
429 case DMA_FOR_WRITE_DATA:
430 dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_TO_DEVICE);
431 break;
432
433 case DMA_FOR_READ_ECC_PAGE:
434 case DMA_FOR_WRITE_ECC_PAGE:
435
436 break;
437
438 default:
439 dev_err(this->dev, "in wrong DMA operation.\n");
440 }
441
442 complete(dma_c);
443}
444
445int start_dma_without_bch_irq(struct gpmi_nand_data *this,
446 struct dma_async_tx_descriptor *desc)
447{
448 struct completion *dma_c = &this->dma_done;
449 int err;
450
451 init_completion(dma_c);
452
453 desc->callback = dma_irq_callback;
454 desc->callback_param = this;
455 dmaengine_submit(desc);
456 dma_async_issue_pending(get_dma_chan(this));
457
458
459 err = wait_for_completion_timeout(dma_c, msecs_to_jiffies(1000));
460 if (!err) {
461 dev_err(this->dev, "DMA timeout, last DMA :%d\n",
462 this->last_dma_type);
463 gpmi_dump_info(this);
464 return -ETIMEDOUT;
465 }
466 return 0;
467}
468
469
470
471
472
473
474
475
476int start_dma_with_bch_irq(struct gpmi_nand_data *this,
477 struct dma_async_tx_descriptor *desc)
478{
479 struct completion *bch_c = &this->bch_done;
480 int err;
481
482
483 init_completion(bch_c);
484
485
486 start_dma_without_bch_irq(this, desc);
487
488
489 err = wait_for_completion_timeout(bch_c, msecs_to_jiffies(1000));
490 if (!err) {
491 dev_err(this->dev, "BCH timeout, last DMA :%d\n",
492 this->last_dma_type);
493 gpmi_dump_info(this);
494 return -ETIMEDOUT;
495 }
496 return 0;
497}
498
499static int acquire_register_block(struct gpmi_nand_data *this,
500 const char *res_name)
501{
502 struct platform_device *pdev = this->pdev;
503 struct resources *res = &this->resources;
504 struct resource *r;
505 void __iomem *p;
506
507 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
508 p = devm_ioremap_resource(&pdev->dev, r);
509 if (IS_ERR(p))
510 return PTR_ERR(p);
511
512 if (!strcmp(res_name, GPMI_NAND_GPMI_REGS_ADDR_RES_NAME))
513 res->gpmi_regs = p;
514 else if (!strcmp(res_name, GPMI_NAND_BCH_REGS_ADDR_RES_NAME))
515 res->bch_regs = p;
516 else
517 dev_err(this->dev, "unknown resource name : %s\n", res_name);
518
519 return 0;
520}
521
522static int acquire_bch_irq(struct gpmi_nand_data *this, irq_handler_t irq_h)
523{
524 struct platform_device *pdev = this->pdev;
525 const char *res_name = GPMI_NAND_BCH_INTERRUPT_RES_NAME;
526 struct resource *r;
527 int err;
528
529 r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
530 if (!r) {
531 dev_err(this->dev, "Can't get resource for %s\n", res_name);
532 return -ENODEV;
533 }
534
535 err = devm_request_irq(this->dev, r->start, irq_h, 0, res_name, this);
536 if (err)
537 dev_err(this->dev, "error requesting BCH IRQ\n");
538
539 return err;
540}
541
542static void release_dma_channels(struct gpmi_nand_data *this)
543{
544 unsigned int i;
545 for (i = 0; i < DMA_CHANS; i++)
546 if (this->dma_chans[i]) {
547 dma_release_channel(this->dma_chans[i]);
548 this->dma_chans[i] = NULL;
549 }
550}
551
552static int acquire_dma_channels(struct gpmi_nand_data *this)
553{
554 struct platform_device *pdev = this->pdev;
555 struct dma_chan *dma_chan;
556
557
558 dma_chan = dma_request_slave_channel(&pdev->dev, "rx-tx");
559 if (!dma_chan) {
560 dev_err(this->dev, "Failed to request DMA channel.\n");
561 goto acquire_err;
562 }
563
564 this->dma_chans[0] = dma_chan;
565 return 0;
566
567acquire_err:
568 release_dma_channels(this);
569 return -EINVAL;
570}
571
572static char *extra_clks_for_mx6q[GPMI_CLK_MAX] = {
573 "gpmi_apb", "gpmi_bch", "gpmi_bch_apb", "per1_bch",
574};
575
576static int gpmi_get_clks(struct gpmi_nand_data *this)
577{
578 struct resources *r = &this->resources;
579 char **extra_clks = NULL;
580 struct clk *clk;
581 int err, i;
582
583
584 r->clock[0] = devm_clk_get(this->dev, "gpmi_io");
585 if (IS_ERR(r->clock[0])) {
586 err = PTR_ERR(r->clock[0]);
587 goto err_clock;
588 }
589
590
591 if (GPMI_IS_MX6(this))
592 extra_clks = extra_clks_for_mx6q;
593 if (!extra_clks)
594 return 0;
595
596 for (i = 1; i < GPMI_CLK_MAX; i++) {
597 if (extra_clks[i - 1] == NULL)
598 break;
599
600 clk = devm_clk_get(this->dev, extra_clks[i - 1]);
601 if (IS_ERR(clk)) {
602 err = PTR_ERR(clk);
603 goto err_clock;
604 }
605
606 r->clock[i] = clk;
607 }
608
609 if (GPMI_IS_MX6(this))
610
611
612
613
614
615
616 clk_set_rate(r->clock[0], 22000000);
617
618 return 0;
619
620err_clock:
621 dev_dbg(this->dev, "failed in finding the clocks.\n");
622 return err;
623}
624
625static int acquire_resources(struct gpmi_nand_data *this)
626{
627 int ret;
628
629 ret = acquire_register_block(this, GPMI_NAND_GPMI_REGS_ADDR_RES_NAME);
630 if (ret)
631 goto exit_regs;
632
633 ret = acquire_register_block(this, GPMI_NAND_BCH_REGS_ADDR_RES_NAME);
634 if (ret)
635 goto exit_regs;
636
637 ret = acquire_bch_irq(this, bch_irq);
638 if (ret)
639 goto exit_regs;
640
641 ret = acquire_dma_channels(this);
642 if (ret)
643 goto exit_regs;
644
645 ret = gpmi_get_clks(this);
646 if (ret)
647 goto exit_clock;
648 return 0;
649
650exit_clock:
651 release_dma_channels(this);
652exit_regs:
653 return ret;
654}
655
656static void release_resources(struct gpmi_nand_data *this)
657{
658 release_dma_channels(this);
659}
660
661static int init_hardware(struct gpmi_nand_data *this)
662{
663 int ret;
664
665
666
667
668
669
670 struct nand_timing safe_timing = {
671 .data_setup_in_ns = 80,
672 .data_hold_in_ns = 60,
673 .address_setup_in_ns = 25,
674 .gpmi_sample_delay_in_ns = 6,
675 .tREA_in_ns = -1,
676 .tRLOH_in_ns = -1,
677 .tRHOH_in_ns = -1,
678 };
679
680
681 ret = gpmi_init(this);
682 if (ret)
683 return ret;
684
685 this->timing = safe_timing;
686 return 0;
687}
688
689static int read_page_prepare(struct gpmi_nand_data *this,
690 void *destination, unsigned length,
691 void *alt_virt, dma_addr_t alt_phys, unsigned alt_size,
692 void **use_virt, dma_addr_t *use_phys)
693{
694 struct device *dev = this->dev;
695
696 if (virt_addr_valid(destination)) {
697 dma_addr_t dest_phys;
698
699 dest_phys = dma_map_single(dev, destination,
700 length, DMA_FROM_DEVICE);
701 if (dma_mapping_error(dev, dest_phys)) {
702 if (alt_size < length) {
703 dev_err(dev, "Alternate buffer is too small\n");
704 return -ENOMEM;
705 }
706 goto map_failed;
707 }
708 *use_virt = destination;
709 *use_phys = dest_phys;
710 this->direct_dma_map_ok = true;
711 return 0;
712 }
713
714map_failed:
715 *use_virt = alt_virt;
716 *use_phys = alt_phys;
717 this->direct_dma_map_ok = false;
718 return 0;
719}
720
721static inline void read_page_end(struct gpmi_nand_data *this,
722 void *destination, unsigned length,
723 void *alt_virt, dma_addr_t alt_phys, unsigned alt_size,
724 void *used_virt, dma_addr_t used_phys)
725{
726 if (this->direct_dma_map_ok)
727 dma_unmap_single(this->dev, used_phys, length, DMA_FROM_DEVICE);
728}
729
730static inline void read_page_swap_end(struct gpmi_nand_data *this,
731 void *destination, unsigned length,
732 void *alt_virt, dma_addr_t alt_phys, unsigned alt_size,
733 void *used_virt, dma_addr_t used_phys)
734{
735 if (!this->direct_dma_map_ok)
736 memcpy(destination, alt_virt, length);
737}
738
739static int send_page_prepare(struct gpmi_nand_data *this,
740 const void *source, unsigned length,
741 void *alt_virt, dma_addr_t alt_phys, unsigned alt_size,
742 const void **use_virt, dma_addr_t *use_phys)
743{
744 struct device *dev = this->dev;
745
746 if (virt_addr_valid(source)) {
747 dma_addr_t source_phys;
748
749 source_phys = dma_map_single(dev, (void *)source, length,
750 DMA_TO_DEVICE);
751 if (dma_mapping_error(dev, source_phys)) {
752 if (alt_size < length) {
753 dev_err(dev, "Alternate buffer is too small\n");
754 return -ENOMEM;
755 }
756 goto map_failed;
757 }
758 *use_virt = source;
759 *use_phys = source_phys;
760 return 0;
761 }
762map_failed:
763
764
765
766
767 memcpy(alt_virt, source, length);
768
769 *use_virt = alt_virt;
770 *use_phys = alt_phys;
771 return 0;
772}
773
774static void send_page_end(struct gpmi_nand_data *this,
775 const void *source, unsigned length,
776 void *alt_virt, dma_addr_t alt_phys, unsigned alt_size,
777 const void *used_virt, dma_addr_t used_phys)
778{
779 struct device *dev = this->dev;
780 if (used_virt == source)
781 dma_unmap_single(dev, used_phys, length, DMA_TO_DEVICE);
782}
783
784static void gpmi_free_dma_buffer(struct gpmi_nand_data *this)
785{
786 struct device *dev = this->dev;
787
788 if (this->page_buffer_virt && virt_addr_valid(this->page_buffer_virt))
789 dma_free_coherent(dev, this->page_buffer_size,
790 this->page_buffer_virt,
791 this->page_buffer_phys);
792 kfree(this->cmd_buffer);
793 kfree(this->data_buffer_dma);
794
795 this->cmd_buffer = NULL;
796 this->data_buffer_dma = NULL;
797 this->page_buffer_virt = NULL;
798 this->page_buffer_size = 0;
799}
800
801
802static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this)
803{
804 struct bch_geometry *geo = &this->bch_geometry;
805 struct device *dev = this->dev;
806 struct mtd_info *mtd = &this->mtd;
807
808
809 this->cmd_buffer = kzalloc(PAGE_SIZE, GFP_DMA | GFP_KERNEL);
810 if (this->cmd_buffer == NULL)
811 goto error_alloc;
812
813
814
815
816
817
818
819
820
821 this->data_buffer_dma = kzalloc(mtd->writesize ?: PAGE_SIZE,
822 GFP_DMA | GFP_KERNEL);
823 if (this->data_buffer_dma == NULL)
824 goto error_alloc;
825
826
827
828
829
830
831
832
833
834 this->page_buffer_size = geo->payload_size + geo->auxiliary_size;
835 this->page_buffer_virt = dma_alloc_coherent(dev, this->page_buffer_size,
836 &this->page_buffer_phys, GFP_DMA);
837 if (!this->page_buffer_virt)
838 goto error_alloc;
839
840
841
842 this->payload_virt = this->page_buffer_virt;
843 this->payload_phys = this->page_buffer_phys;
844 this->auxiliary_virt = this->payload_virt + geo->payload_size;
845 this->auxiliary_phys = this->payload_phys + geo->payload_size;
846 return 0;
847
848error_alloc:
849 gpmi_free_dma_buffer(this);
850 return -ENOMEM;
851}
852
853static void gpmi_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
854{
855 struct nand_chip *chip = mtd->priv;
856 struct gpmi_nand_data *this = chip->priv;
857 int ret;
858
859
860
861
862
863
864
865
866
867
868
869
870 if ((ctrl & (NAND_ALE | NAND_CLE))) {
871 if (data != NAND_CMD_NONE)
872 this->cmd_buffer[this->command_length++] = data;
873 return;
874 }
875
876 if (!this->command_length)
877 return;
878
879 ret = gpmi_send_command(this);
880 if (ret)
881 dev_err(this->dev, "Chip: %u, Error %d\n",
882 this->current_chip, ret);
883
884 this->command_length = 0;
885}
886
887static int gpmi_dev_ready(struct mtd_info *mtd)
888{
889 struct nand_chip *chip = mtd->priv;
890 struct gpmi_nand_data *this = chip->priv;
891
892 return gpmi_is_ready(this, this->current_chip);
893}
894
895static void gpmi_select_chip(struct mtd_info *mtd, int chipnr)
896{
897 struct nand_chip *chip = mtd->priv;
898 struct gpmi_nand_data *this = chip->priv;
899
900 if ((this->current_chip < 0) && (chipnr >= 0))
901 gpmi_begin(this);
902 else if ((this->current_chip >= 0) && (chipnr < 0))
903 gpmi_end(this);
904
905 this->current_chip = chipnr;
906}
907
908static void gpmi_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
909{
910 struct nand_chip *chip = mtd->priv;
911 struct gpmi_nand_data *this = chip->priv;
912
913 dev_dbg(this->dev, "len is %d\n", len);
914 this->upper_buf = buf;
915 this->upper_len = len;
916
917 gpmi_read_data(this);
918}
919
920static void gpmi_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
921{
922 struct nand_chip *chip = mtd->priv;
923 struct gpmi_nand_data *this = chip->priv;
924
925 dev_dbg(this->dev, "len is %d\n", len);
926 this->upper_buf = (uint8_t *)buf;
927 this->upper_len = len;
928
929 gpmi_send_data(this);
930}
931
932static uint8_t gpmi_read_byte(struct mtd_info *mtd)
933{
934 struct nand_chip *chip = mtd->priv;
935 struct gpmi_nand_data *this = chip->priv;
936 uint8_t *buf = this->data_buffer_dma;
937
938 gpmi_read_buf(mtd, buf, 1);
939 return buf[0];
940}
941
942
943
944
945
946
947static void block_mark_swapping(struct gpmi_nand_data *this,
948 void *payload, void *auxiliary)
949{
950 struct bch_geometry *nfc_geo = &this->bch_geometry;
951 unsigned char *p;
952 unsigned char *a;
953 unsigned int bit;
954 unsigned char mask;
955 unsigned char from_data;
956 unsigned char from_oob;
957
958 if (!this->swap_block_mark)
959 return;
960
961
962
963
964
965 bit = nfc_geo->block_mark_bit_offset;
966 p = payload + nfc_geo->block_mark_byte_offset;
967 a = auxiliary;
968
969
970
971
972
973
974
975 from_data = (p[0] >> bit) | (p[1] << (8 - bit));
976
977
978 from_oob = a[0];
979
980
981 a[0] = from_data;
982
983 mask = (0x1 << bit) - 1;
984 p[0] = (p[0] & mask) | (from_oob << bit);
985
986 mask = ~0 << bit;
987 p[1] = (p[1] & mask) | (from_oob >> (8 - bit));
988}
989
990static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
991 uint8_t *buf, int oob_required, int page)
992{
993 struct gpmi_nand_data *this = chip->priv;
994 struct bch_geometry *nfc_geo = &this->bch_geometry;
995 void *payload_virt;
996 dma_addr_t payload_phys;
997 void *auxiliary_virt;
998 dma_addr_t auxiliary_phys;
999 unsigned int i;
1000 unsigned char *status;
1001 unsigned int max_bitflips = 0;
1002 int ret;
1003
1004 dev_dbg(this->dev, "page number is : %d\n", page);
1005 ret = read_page_prepare(this, buf, nfc_geo->payload_size,
1006 this->payload_virt, this->payload_phys,
1007 nfc_geo->payload_size,
1008 &payload_virt, &payload_phys);
1009 if (ret) {
1010 dev_err(this->dev, "Inadequate DMA buffer\n");
1011 ret = -ENOMEM;
1012 return ret;
1013 }
1014 auxiliary_virt = this->auxiliary_virt;
1015 auxiliary_phys = this->auxiliary_phys;
1016
1017
1018 ret = gpmi_read_page(this, payload_phys, auxiliary_phys);
1019 read_page_end(this, buf, nfc_geo->payload_size,
1020 this->payload_virt, this->payload_phys,
1021 nfc_geo->payload_size,
1022 payload_virt, payload_phys);
1023 if (ret) {
1024 dev_err(this->dev, "Error in ECC-based read: %d\n", ret);
1025 return ret;
1026 }
1027
1028
1029 block_mark_swapping(this, payload_virt, auxiliary_virt);
1030
1031
1032 status = auxiliary_virt + nfc_geo->auxiliary_status_offset;
1033
1034 for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) {
1035 if ((*status == STATUS_GOOD) || (*status == STATUS_ERASED))
1036 continue;
1037
1038 if (*status == STATUS_UNCORRECTABLE) {
1039 mtd->ecc_stats.failed++;
1040 continue;
1041 }
1042 mtd->ecc_stats.corrected += *status;
1043 max_bitflips = max_t(unsigned int, max_bitflips, *status);
1044 }
1045
1046 if (oob_required) {
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057 memset(chip->oob_poi, ~0, mtd->oobsize);
1058 chip->oob_poi[0] = ((uint8_t *) auxiliary_virt)[0];
1059 }
1060
1061 read_page_swap_end(this, buf, nfc_geo->payload_size,
1062 this->payload_virt, this->payload_phys,
1063 nfc_geo->payload_size,
1064 payload_virt, payload_phys);
1065
1066 return max_bitflips;
1067}
1068
1069
1070static int gpmi_ecc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
1071 uint32_t offs, uint32_t len, uint8_t *buf, int page)
1072{
1073 struct gpmi_nand_data *this = chip->priv;
1074 void __iomem *bch_regs = this->resources.bch_regs;
1075 struct bch_geometry old_geo = this->bch_geometry;
1076 struct bch_geometry *geo = &this->bch_geometry;
1077 int size = chip->ecc.size;
1078 int meta, n, page_size;
1079 u32 r1_old, r2_old, r1_new, r2_new;
1080 unsigned int max_bitflips;
1081 int first, last, marker_pos;
1082 int ecc_parity_size;
1083 int col = 0;
1084 int old_swap_block_mark = this->swap_block_mark;
1085
1086
1087 ecc_parity_size = geo->gf_len * geo->ecc_strength / 8;
1088
1089
1090 first = offs / size;
1091 last = (offs + len - 1) / size;
1092
1093 if (this->swap_block_mark) {
1094
1095
1096
1097
1098
1099
1100
1101 marker_pos = geo->block_mark_byte_offset / size;
1102 if (last >= marker_pos && first <= marker_pos) {
1103 dev_dbg(this->dev,
1104 "page:%d, first:%d, last:%d, marker at:%d\n",
1105 page, first, last, marker_pos);
1106 return gpmi_ecc_read_page(mtd, chip, buf, 0, page);
1107 }
1108 }
1109
1110 meta = geo->metadata_size;
1111 if (first) {
1112 col = meta + (size + ecc_parity_size) * first;
1113 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, col, -1);
1114
1115 meta = 0;
1116 buf = buf + first * size;
1117 }
1118
1119
1120 r1_old = r1_new = readl(bch_regs + HW_BCH_FLASH0LAYOUT0);
1121 r2_old = r2_new = readl(bch_regs + HW_BCH_FLASH0LAYOUT1);
1122
1123
1124 n = last - first + 1;
1125 page_size = meta + (size + ecc_parity_size) * n;
1126
1127 r1_new &= ~(BM_BCH_FLASH0LAYOUT0_NBLOCKS |
1128 BM_BCH_FLASH0LAYOUT0_META_SIZE);
1129 r1_new |= BF_BCH_FLASH0LAYOUT0_NBLOCKS(n - 1)
1130 | BF_BCH_FLASH0LAYOUT0_META_SIZE(meta);
1131 writel(r1_new, bch_regs + HW_BCH_FLASH0LAYOUT0);
1132
1133 r2_new &= ~BM_BCH_FLASH0LAYOUT1_PAGE_SIZE;
1134 r2_new |= BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size);
1135 writel(r2_new, bch_regs + HW_BCH_FLASH0LAYOUT1);
1136
1137 geo->ecc_chunk_count = n;
1138 geo->payload_size = n * size;
1139 geo->page_size = page_size;
1140 geo->auxiliary_status_offset = ALIGN(meta, 4);
1141
1142 dev_dbg(this->dev, "page:%d(%d:%d)%d, chunk:(%d:%d), BCH PG size:%d\n",
1143 page, offs, len, col, first, n, page_size);
1144
1145
1146 this->swap_block_mark = false;
1147 max_bitflips = gpmi_ecc_read_page(mtd, chip, buf, 0, page);
1148
1149
1150 writel(r1_old, bch_regs + HW_BCH_FLASH0LAYOUT0);
1151 writel(r2_old, bch_regs + HW_BCH_FLASH0LAYOUT1);
1152 this->bch_geometry = old_geo;
1153 this->swap_block_mark = old_swap_block_mark;
1154
1155 return max_bitflips;
1156}
1157
1158static int gpmi_ecc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
1159 const uint8_t *buf, int oob_required)
1160{
1161 struct gpmi_nand_data *this = chip->priv;
1162 struct bch_geometry *nfc_geo = &this->bch_geometry;
1163 const void *payload_virt;
1164 dma_addr_t payload_phys;
1165 const void *auxiliary_virt;
1166 dma_addr_t auxiliary_phys;
1167 int ret;
1168
1169 dev_dbg(this->dev, "ecc write page.\n");
1170 if (this->swap_block_mark) {
1171
1172
1173
1174
1175
1176 memcpy(this->payload_virt, buf, mtd->writesize);
1177 payload_virt = this->payload_virt;
1178 payload_phys = this->payload_phys;
1179
1180 memcpy(this->auxiliary_virt, chip->oob_poi,
1181 nfc_geo->auxiliary_size);
1182 auxiliary_virt = this->auxiliary_virt;
1183 auxiliary_phys = this->auxiliary_phys;
1184
1185
1186 block_mark_swapping(this,
1187 (void *)payload_virt, (void *)auxiliary_virt);
1188 } else {
1189
1190
1191
1192
1193 ret = send_page_prepare(this,
1194 buf, mtd->writesize,
1195 this->payload_virt, this->payload_phys,
1196 nfc_geo->payload_size,
1197 &payload_virt, &payload_phys);
1198 if (ret) {
1199 dev_err(this->dev, "Inadequate payload DMA buffer\n");
1200 return 0;
1201 }
1202
1203 ret = send_page_prepare(this,
1204 chip->oob_poi, mtd->oobsize,
1205 this->auxiliary_virt, this->auxiliary_phys,
1206 nfc_geo->auxiliary_size,
1207 &auxiliary_virt, &auxiliary_phys);
1208 if (ret) {
1209 dev_err(this->dev, "Inadequate auxiliary DMA buffer\n");
1210 goto exit_auxiliary;
1211 }
1212 }
1213
1214
1215 ret = gpmi_send_page(this, payload_phys, auxiliary_phys);
1216 if (ret)
1217 dev_err(this->dev, "Error in ECC-based write: %d\n", ret);
1218
1219 if (!this->swap_block_mark) {
1220 send_page_end(this, chip->oob_poi, mtd->oobsize,
1221 this->auxiliary_virt, this->auxiliary_phys,
1222 nfc_geo->auxiliary_size,
1223 auxiliary_virt, auxiliary_phys);
1224exit_auxiliary:
1225 send_page_end(this, buf, mtd->writesize,
1226 this->payload_virt, this->payload_phys,
1227 nfc_geo->payload_size,
1228 payload_virt, payload_phys);
1229 }
1230
1231 return 0;
1232}
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302static int gpmi_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
1303 int page)
1304{
1305 struct gpmi_nand_data *this = chip->priv;
1306
1307 dev_dbg(this->dev, "page number is %d\n", page);
1308
1309 memset(chip->oob_poi, ~0, mtd->oobsize);
1310
1311
1312 chip->cmdfunc(mtd, NAND_CMD_READ0, mtd->writesize, page);
1313 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
1314
1315
1316
1317
1318
1319
1320 if (GPMI_IS_MX23(this)) {
1321
1322 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1323 chip->oob_poi[0] = chip->read_byte(mtd);
1324 }
1325
1326 return 0;
1327}
1328
1329static int
1330gpmi_ecc_write_oob(struct mtd_info *mtd, struct nand_chip *chip, int page)
1331{
1332 struct nand_oobfree *of = mtd->ecclayout->oobfree;
1333 int status = 0;
1334
1335
1336 if (!of->length)
1337 return -EPERM;
1338
1339 if (!nand_is_slc(chip))
1340 return -EPERM;
1341
1342 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize + of->offset, page);
1343 chip->write_buf(mtd, chip->oob_poi + of->offset, of->length);
1344 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
1345
1346 status = chip->waitfunc(mtd, chip);
1347 return status & NAND_STATUS_FAIL ? -EIO : 0;
1348}
1349
1350static int gpmi_block_markbad(struct mtd_info *mtd, loff_t ofs)
1351{
1352 struct nand_chip *chip = mtd->priv;
1353 struct gpmi_nand_data *this = chip->priv;
1354 int ret = 0;
1355 uint8_t *block_mark;
1356 int column, page, status, chipnr;
1357
1358 chipnr = (int)(ofs >> chip->chip_shift);
1359 chip->select_chip(mtd, chipnr);
1360
1361 column = !GPMI_IS_MX23(this) ? mtd->writesize : 0;
1362
1363
1364 block_mark = this->data_buffer_dma;
1365 block_mark[0] = 0;
1366
1367
1368 page = (int)(ofs >> chip->page_shift);
1369
1370 chip->cmdfunc(mtd, NAND_CMD_SEQIN, column, page);
1371 chip->write_buf(mtd, block_mark, 1);
1372 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
1373
1374 status = chip->waitfunc(mtd, chip);
1375 if (status & NAND_STATUS_FAIL)
1376 ret = -EIO;
1377
1378 chip->select_chip(mtd, -1);
1379
1380 return ret;
1381}
1382
1383static int nand_boot_set_geometry(struct gpmi_nand_data *this)
1384{
1385 struct boot_rom_geometry *geometry = &this->rom_geometry;
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395 geometry->stride_size_in_pages = 64;
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405 geometry->search_area_stride_exponent = 2;
1406 return 0;
1407}
1408
1409static const char *fingerprint = "STMP";
1410static int mx23_check_transcription_stamp(struct gpmi_nand_data *this)
1411{
1412 struct boot_rom_geometry *rom_geo = &this->rom_geometry;
1413 struct device *dev = this->dev;
1414 struct mtd_info *mtd = &this->mtd;
1415 struct nand_chip *chip = &this->nand;
1416 unsigned int search_area_size_in_strides;
1417 unsigned int stride;
1418 unsigned int page;
1419 uint8_t *buffer = chip->buffers->databuf;
1420 int saved_chip_number;
1421 int found_an_ncb_fingerprint = false;
1422
1423
1424 search_area_size_in_strides = 1 << rom_geo->search_area_stride_exponent;
1425
1426 saved_chip_number = this->current_chip;
1427 chip->select_chip(mtd, 0);
1428
1429
1430
1431
1432 dev_dbg(dev, "Scanning for an NCB fingerprint...\n");
1433
1434 for (stride = 0; stride < search_area_size_in_strides; stride++) {
1435
1436 page = stride * rom_geo->stride_size_in_pages;
1437
1438 dev_dbg(dev, "Looking for a fingerprint in page 0x%x\n", page);
1439
1440
1441
1442
1443
1444 chip->cmdfunc(mtd, NAND_CMD_READ0, 12, page);
1445 chip->read_buf(mtd, buffer, strlen(fingerprint));
1446
1447
1448 if (!memcmp(buffer, fingerprint, strlen(fingerprint))) {
1449 found_an_ncb_fingerprint = true;
1450 break;
1451 }
1452
1453 }
1454
1455 chip->select_chip(mtd, saved_chip_number);
1456
1457 if (found_an_ncb_fingerprint)
1458 dev_dbg(dev, "\tFound a fingerprint\n");
1459 else
1460 dev_dbg(dev, "\tNo fingerprint found\n");
1461 return found_an_ncb_fingerprint;
1462}
1463
1464
1465static int mx23_write_transcription_stamp(struct gpmi_nand_data *this)
1466{
1467 struct device *dev = this->dev;
1468 struct boot_rom_geometry *rom_geo = &this->rom_geometry;
1469 struct mtd_info *mtd = &this->mtd;
1470 struct nand_chip *chip = &this->nand;
1471 unsigned int block_size_in_pages;
1472 unsigned int search_area_size_in_strides;
1473 unsigned int search_area_size_in_pages;
1474 unsigned int search_area_size_in_blocks;
1475 unsigned int block;
1476 unsigned int stride;
1477 unsigned int page;
1478 uint8_t *buffer = chip->buffers->databuf;
1479 int saved_chip_number;
1480 int status;
1481
1482
1483 block_size_in_pages = mtd->erasesize / mtd->writesize;
1484 search_area_size_in_strides = 1 << rom_geo->search_area_stride_exponent;
1485 search_area_size_in_pages = search_area_size_in_strides *
1486 rom_geo->stride_size_in_pages;
1487 search_area_size_in_blocks =
1488 (search_area_size_in_pages + (block_size_in_pages - 1)) /
1489 block_size_in_pages;
1490
1491 dev_dbg(dev, "Search Area Geometry :\n");
1492 dev_dbg(dev, "\tin Blocks : %u\n", search_area_size_in_blocks);
1493 dev_dbg(dev, "\tin Strides: %u\n", search_area_size_in_strides);
1494 dev_dbg(dev, "\tin Pages : %u\n", search_area_size_in_pages);
1495
1496
1497 saved_chip_number = this->current_chip;
1498 chip->select_chip(mtd, 0);
1499
1500
1501 dev_dbg(dev, "Erasing the search area...\n");
1502
1503 for (block = 0; block < search_area_size_in_blocks; block++) {
1504
1505 page = block * block_size_in_pages;
1506
1507
1508 dev_dbg(dev, "\tErasing block 0x%x\n", block);
1509 chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
1510 chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
1511
1512
1513 status = chip->waitfunc(mtd, chip);
1514 if (status & NAND_STATUS_FAIL)
1515 dev_err(dev, "[%s] Erase failed.\n", __func__);
1516 }
1517
1518
1519 memset(buffer, ~0, mtd->writesize);
1520 memcpy(buffer + 12, fingerprint, strlen(fingerprint));
1521
1522
1523 dev_dbg(dev, "Writing NCB fingerprints...\n");
1524 for (stride = 0; stride < search_area_size_in_strides; stride++) {
1525
1526 page = stride * rom_geo->stride_size_in_pages;
1527
1528
1529 dev_dbg(dev, "Writing an NCB fingerprint in page 0x%x\n", page);
1530 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
1531 chip->ecc.write_page_raw(mtd, chip, buffer, 0);
1532 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
1533
1534
1535 status = chip->waitfunc(mtd, chip);
1536 if (status & NAND_STATUS_FAIL)
1537 dev_err(dev, "[%s] Write failed.\n", __func__);
1538 }
1539
1540
1541 chip->select_chip(mtd, saved_chip_number);
1542 return 0;
1543}
1544
1545static int mx23_boot_init(struct gpmi_nand_data *this)
1546{
1547 struct device *dev = this->dev;
1548 struct nand_chip *chip = &this->nand;
1549 struct mtd_info *mtd = &this->mtd;
1550 unsigned int block_count;
1551 unsigned int block;
1552 int chipnr;
1553 int page;
1554 loff_t byte;
1555 uint8_t block_mark;
1556 int ret = 0;
1557
1558
1559
1560
1561
1562
1563
1564 if (mx23_check_transcription_stamp(this))
1565 return 0;
1566
1567
1568
1569
1570
1571 dev_dbg(dev, "Transcribing bad block marks...\n");
1572
1573
1574 block_count = chip->chipsize >> chip->phys_erase_shift;
1575
1576
1577
1578
1579
1580 for (block = 0; block < block_count; block++) {
1581
1582
1583
1584
1585 chipnr = block >> (chip->chip_shift - chip->phys_erase_shift);
1586 page = block << (chip->phys_erase_shift - chip->page_shift);
1587 byte = block << chip->phys_erase_shift;
1588
1589
1590 chip->select_chip(mtd, chipnr);
1591 chip->cmdfunc(mtd, NAND_CMD_READ0, mtd->writesize, page);
1592 block_mark = chip->read_byte(mtd);
1593 chip->select_chip(mtd, -1);
1594
1595
1596
1597
1598
1599
1600 if (block_mark != 0xff) {
1601 dev_dbg(dev, "Transcribing mark in block %u\n", block);
1602 ret = chip->block_markbad(mtd, byte);
1603 if (ret)
1604 dev_err(dev,
1605 "Failed to mark block bad with ret %d\n",
1606 ret);
1607 }
1608 }
1609
1610
1611 mx23_write_transcription_stamp(this);
1612 return 0;
1613}
1614
1615static int nand_boot_init(struct gpmi_nand_data *this)
1616{
1617 nand_boot_set_geometry(this);
1618
1619
1620 if (GPMI_IS_MX23(this))
1621 return mx23_boot_init(this);
1622 return 0;
1623}
1624
1625static int gpmi_set_geometry(struct gpmi_nand_data *this)
1626{
1627 int ret;
1628
1629
1630 gpmi_free_dma_buffer(this);
1631
1632
1633 ret = bch_set_geometry(this);
1634 if (ret) {
1635 dev_err(this->dev, "Error setting BCH geometry : %d\n", ret);
1636 return ret;
1637 }
1638
1639
1640 return gpmi_alloc_dma_buffer(this);
1641}
1642
1643static void gpmi_nand_exit(struct gpmi_nand_data *this)
1644{
1645 nand_release(&this->mtd);
1646 gpmi_free_dma_buffer(this);
1647}
1648
1649static int gpmi_init_last(struct gpmi_nand_data *this)
1650{
1651 struct mtd_info *mtd = &this->mtd;
1652 struct nand_chip *chip = mtd->priv;
1653 struct nand_ecc_ctrl *ecc = &chip->ecc;
1654 struct bch_geometry *bch_geo = &this->bch_geometry;
1655 int ret;
1656
1657
1658 ret = gpmi_set_geometry(this);
1659 if (ret)
1660 return ret;
1661
1662
1663 ecc->read_page = gpmi_ecc_read_page;
1664 ecc->write_page = gpmi_ecc_write_page;
1665 ecc->read_oob = gpmi_ecc_read_oob;
1666 ecc->write_oob = gpmi_ecc_write_oob;
1667 ecc->mode = NAND_ECC_HW;
1668 ecc->size = bch_geo->ecc_chunk_size;
1669 ecc->strength = bch_geo->ecc_strength;
1670 ecc->layout = &gpmi_hw_ecclayout;
1671
1672
1673
1674
1675
1676
1677 if (GPMI_IS_MX6(this) &&
1678 ((bch_geo->gf_len * bch_geo->ecc_strength) % 8) == 0) {
1679 ecc->read_subpage = gpmi_ecc_read_subpage;
1680 chip->options |= NAND_SUBPAGE_READ;
1681 }
1682
1683
1684
1685
1686
1687
1688
1689 gpmi_extra_init(this);
1690
1691 return 0;
1692}
1693
1694static int gpmi_nand_init(struct gpmi_nand_data *this)
1695{
1696 struct mtd_info *mtd = &this->mtd;
1697 struct nand_chip *chip = &this->nand;
1698 struct mtd_part_parser_data ppdata = {};
1699 int ret;
1700
1701
1702 this->current_chip = -1;
1703
1704
1705 mtd->priv = chip;
1706 mtd->name = "gpmi-nand";
1707 mtd->owner = THIS_MODULE;
1708
1709
1710 chip->priv = this;
1711 chip->select_chip = gpmi_select_chip;
1712 chip->cmd_ctrl = gpmi_cmd_ctrl;
1713 chip->dev_ready = gpmi_dev_ready;
1714 chip->read_byte = gpmi_read_byte;
1715 chip->read_buf = gpmi_read_buf;
1716 chip->write_buf = gpmi_write_buf;
1717 chip->badblock_pattern = &gpmi_bbt_descr;
1718 chip->block_markbad = gpmi_block_markbad;
1719 chip->options |= NAND_NO_SUBPAGE_WRITE;
1720
1721
1722 this->swap_block_mark = !GPMI_IS_MX23(this);
1723
1724 if (of_get_nand_on_flash_bbt(this->dev->of_node)) {
1725 chip->bbt_options |= NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB;
1726
1727 if (of_property_read_bool(this->dev->of_node,
1728 "fsl,no-blockmark-swap"))
1729 this->swap_block_mark = false;
1730 }
1731 dev_dbg(this->dev, "Blockmark swapping %sabled\n",
1732 this->swap_block_mark ? "en" : "dis");
1733
1734
1735
1736
1737
1738 this->bch_geometry.payload_size = 1024;
1739 this->bch_geometry.auxiliary_size = 128;
1740 ret = gpmi_alloc_dma_buffer(this);
1741 if (ret)
1742 goto err_out;
1743
1744 ret = nand_scan_ident(mtd, GPMI_IS_MX6(this) ? 2 : 1, NULL);
1745 if (ret)
1746 goto err_out;
1747
1748 ret = gpmi_init_last(this);
1749 if (ret)
1750 goto err_out;
1751
1752 chip->options |= NAND_SKIP_BBTSCAN;
1753 ret = nand_scan_tail(mtd);
1754 if (ret)
1755 goto err_out;
1756
1757 ret = nand_boot_init(this);
1758 if (ret)
1759 goto err_out;
1760 chip->scan_bbt(mtd);
1761
1762 ppdata.of_node = this->pdev->dev.of_node;
1763 ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
1764 if (ret)
1765 goto err_out;
1766 return 0;
1767
1768err_out:
1769 gpmi_nand_exit(this);
1770 return ret;
1771}
1772
1773static const struct of_device_id gpmi_nand_id_table[] = {
1774 {
1775 .compatible = "fsl,imx23-gpmi-nand",
1776 .data = &gpmi_devdata_imx23,
1777 }, {
1778 .compatible = "fsl,imx28-gpmi-nand",
1779 .data = &gpmi_devdata_imx28,
1780 }, {
1781 .compatible = "fsl,imx6q-gpmi-nand",
1782 .data = &gpmi_devdata_imx6q,
1783 }, {
1784 .compatible = "fsl,imx6sx-gpmi-nand",
1785 .data = &gpmi_devdata_imx6sx,
1786 }, {}
1787};
1788MODULE_DEVICE_TABLE(of, gpmi_nand_id_table);
1789
1790static int gpmi_nand_probe(struct platform_device *pdev)
1791{
1792 struct gpmi_nand_data *this;
1793 const struct of_device_id *of_id;
1794 int ret;
1795
1796 this = devm_kzalloc(&pdev->dev, sizeof(*this), GFP_KERNEL);
1797 if (!this)
1798 return -ENOMEM;
1799
1800 of_id = of_match_device(gpmi_nand_id_table, &pdev->dev);
1801 if (of_id) {
1802 this->devdata = of_id->data;
1803 } else {
1804 dev_err(&pdev->dev, "Failed to find the right device id.\n");
1805 return -ENODEV;
1806 }
1807
1808 platform_set_drvdata(pdev, this);
1809 this->pdev = pdev;
1810 this->dev = &pdev->dev;
1811
1812 ret = acquire_resources(this);
1813 if (ret)
1814 goto exit_acquire_resources;
1815
1816 ret = init_hardware(this);
1817 if (ret)
1818 goto exit_nfc_init;
1819
1820 ret = gpmi_nand_init(this);
1821 if (ret)
1822 goto exit_nfc_init;
1823
1824 dev_info(this->dev, "driver registered.\n");
1825
1826 return 0;
1827
1828exit_nfc_init:
1829 release_resources(this);
1830exit_acquire_resources:
1831 dev_err(this->dev, "driver registration failed: %d\n", ret);
1832
1833 return ret;
1834}
1835
1836static int gpmi_nand_remove(struct platform_device *pdev)
1837{
1838 struct gpmi_nand_data *this = platform_get_drvdata(pdev);
1839
1840 gpmi_nand_exit(this);
1841 release_resources(this);
1842 return 0;
1843}
1844
1845static struct platform_driver gpmi_nand_driver = {
1846 .driver = {
1847 .name = "gpmi-nand",
1848 .of_match_table = gpmi_nand_id_table,
1849 },
1850 .probe = gpmi_nand_probe,
1851 .remove = gpmi_nand_remove,
1852};
1853module_platform_driver(gpmi_nand_driver);
1854
1855MODULE_AUTHOR("Freescale Semiconductor, Inc.");
1856MODULE_DESCRIPTION("i.MX GPMI NAND Flash Controller Driver");
1857MODULE_LICENSE("GPL");
1858