diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-14 20:05:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-14 20:05:39 -0400 |
| commit | 65e0b598bdb3fe1122ab9a9708fc785e7ac41671 (patch) | |
| tree | 938f939493d27900fdfa50232158483e82b68697 | |
| parent | d7a4b63b5138e29122e72a5192d98be86ca68cca (diff) | |
| parent | 99d389640b58052884fb231bce9dbffb4f595aa4 (diff) | |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6:
mtd: pxa3xx: fix build error when CONFIG_MTD_PARTITIONS is not defined
mtd: mxc_nand: configure pages per block for v2 controller
mtd: OneNAND: Fix loop hang when DMA error at Samsung SoCs
mtd: OneNAND: Fix 2KiB pagesize handling at Samsung SoCs
mtd: Blackfin NFC: fix invalid free in remove()
mtd: Blackfin NFC: fix build error after nand_scan_ident() change
mxc_nand: Do not do byte accesses to the NFC buffer.
| -rw-r--r-- | drivers/mtd/nand/bf5xx_nand.c | 9 | ||||
| -rw-r--r-- | drivers/mtd/nand/mxc_nand.c | 47 | ||||
| -rw-r--r-- | drivers/mtd/nand/pxa3xx_nand.c | 6 | ||||
| -rw-r--r-- | drivers/mtd/onenand/samsung.c | 16 |
4 files changed, 41 insertions, 37 deletions
diff --git a/drivers/mtd/nand/bf5xx_nand.c b/drivers/mtd/nand/bf5xx_nand.c index a382e3dd0a5d..6fbeefa3a766 100644 --- a/drivers/mtd/nand/bf5xx_nand.c +++ b/drivers/mtd/nand/bf5xx_nand.c | |||
| @@ -682,7 +682,6 @@ static int __devinit bf5xx_nand_add_partition(struct bf5xx_nand_info *info) | |||
| 682 | static int __devexit bf5xx_nand_remove(struct platform_device *pdev) | 682 | static int __devexit bf5xx_nand_remove(struct platform_device *pdev) |
| 683 | { | 683 | { |
| 684 | struct bf5xx_nand_info *info = to_nand_info(pdev); | 684 | struct bf5xx_nand_info *info = to_nand_info(pdev); |
| 685 | struct mtd_info *mtd = NULL; | ||
| 686 | 685 | ||
| 687 | platform_set_drvdata(pdev, NULL); | 686 | platform_set_drvdata(pdev, NULL); |
| 688 | 687 | ||
| @@ -690,11 +689,7 @@ static int __devexit bf5xx_nand_remove(struct platform_device *pdev) | |||
| 690 | * and their partitions, then go through freeing the | 689 | * and their partitions, then go through freeing the |
| 691 | * resources used | 690 | * resources used |
| 692 | */ | 691 | */ |
| 693 | mtd = &info->mtd; | 692 | nand_release(&info->mtd); |
| 694 | if (mtd) { | ||
| 695 | nand_release(mtd); | ||
| 696 | kfree(mtd); | ||
| 697 | } | ||
| 698 | 693 | ||
| 699 | peripheral_free_list(bfin_nfc_pin_req); | 694 | peripheral_free_list(bfin_nfc_pin_req); |
| 700 | bf5xx_nand_dma_remove(info); | 695 | bf5xx_nand_dma_remove(info); |
| @@ -710,7 +705,7 @@ static int bf5xx_nand_scan(struct mtd_info *mtd) | |||
| 710 | struct nand_chip *chip = mtd->priv; | 705 | struct nand_chip *chip = mtd->priv; |
| 711 | int ret; | 706 | int ret; |
| 712 | 707 | ||
| 713 | ret = nand_scan_ident(mtd, 1); | 708 | ret = nand_scan_ident(mtd, 1, NULL); |
| 714 | if (ret) | 709 | if (ret) |
| 715 | return ret; | 710 | return ret; |
| 716 | 711 | ||
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index fcf8ceb277d4..b2828e84d243 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c | |||
| @@ -67,7 +67,9 @@ | |||
| 67 | #define NFC_V1_V2_CONFIG1_BIG (1 << 5) | 67 | #define NFC_V1_V2_CONFIG1_BIG (1 << 5) |
| 68 | #define NFC_V1_V2_CONFIG1_RST (1 << 6) | 68 | #define NFC_V1_V2_CONFIG1_RST (1 << 6) |
| 69 | #define NFC_V1_V2_CONFIG1_CE (1 << 7) | 69 | #define NFC_V1_V2_CONFIG1_CE (1 << 7) |
| 70 | #define NFC_V1_V2_CONFIG1_ONE_CYCLE (1 << 8) | 70 | #define NFC_V2_CONFIG1_ONE_CYCLE (1 << 8) |
| 71 | #define NFC_V2_CONFIG1_PPB(x) (((x) & 0x3) << 9) | ||
| 72 | #define NFC_V2_CONFIG1_FP_INT (1 << 11) | ||
| 71 | 73 | ||
| 72 | #define NFC_V1_V2_CONFIG2_INT (1 << 15) | 74 | #define NFC_V1_V2_CONFIG2_INT (1 << 15) |
| 73 | 75 | ||
| @@ -402,16 +404,16 @@ static void send_read_id_v1_v2(struct mxc_nand_host *host) | |||
| 402 | /* Wait for operation to complete */ | 404 | /* Wait for operation to complete */ |
| 403 | wait_op_done(host, true); | 405 | wait_op_done(host, true); |
| 404 | 406 | ||
| 407 | memcpy(host->data_buf, host->main_area0, 16); | ||
| 408 | |||
| 405 | if (this->options & NAND_BUSWIDTH_16) { | 409 | if (this->options & NAND_BUSWIDTH_16) { |
| 406 | void __iomem *main_buf = host->main_area0; | ||
| 407 | /* compress the ID info */ | 410 | /* compress the ID info */ |
| 408 | writeb(readb(main_buf + 2), main_buf + 1); | 411 | host->data_buf[1] = host->data_buf[2]; |
| 409 | writeb(readb(main_buf + 4), main_buf + 2); | 412 | host->data_buf[2] = host->data_buf[4]; |
| 410 | writeb(readb(main_buf + 6), main_buf + 3); | 413 | host->data_buf[3] = host->data_buf[6]; |
| 411 | writeb(readb(main_buf + 8), main_buf + 4); | 414 | host->data_buf[4] = host->data_buf[8]; |
| 412 | writeb(readb(main_buf + 10), main_buf + 5); | 415 | host->data_buf[5] = host->data_buf[10]; |
| 413 | } | 416 | } |
| 414 | memcpy(host->data_buf, host->main_area0, 16); | ||
| 415 | } | 417 | } |
| 416 | 418 | ||
| 417 | static uint16_t get_dev_status_v3(struct mxc_nand_host *host) | 419 | static uint16_t get_dev_status_v3(struct mxc_nand_host *host) |
| @@ -729,27 +731,30 @@ static void preset_v1_v2(struct mtd_info *mtd) | |||
| 729 | { | 731 | { |
| 730 | struct nand_chip *nand_chip = mtd->priv; | 732 | struct nand_chip *nand_chip = mtd->priv; |
| 731 | struct mxc_nand_host *host = nand_chip->priv; | 733 | struct mxc_nand_host *host = nand_chip->priv; |
| 732 | uint16_t tmp; | 734 | uint16_t config1 = 0; |
| 733 | 735 | ||
| 734 | /* enable interrupt, disable spare enable */ | 736 | if (nand_chip->ecc.mode == NAND_ECC_HW) |
| 735 | tmp = readw(NFC_V1_V2_CONFIG1); | 737 | config1 |= NFC_V1_V2_CONFIG1_ECC_EN; |
| 736 | tmp &= ~NFC_V1_V2_CONFIG1_INT_MSK; | 738 | |
| 737 | tmp &= ~NFC_V1_V2_CONFIG1_SP_EN; | 739 | if (nfc_is_v21()) |
| 738 | if (nand_chip->ecc.mode == NAND_ECC_HW) { | 740 | config1 |= NFC_V2_CONFIG1_FP_INT; |
| 739 | tmp |= NFC_V1_V2_CONFIG1_ECC_EN; | 741 | |
| 740 | } else { | 742 | if (!cpu_is_mx21()) |
| 741 | tmp &= ~NFC_V1_V2_CONFIG1_ECC_EN; | 743 | config1 |= NFC_V1_V2_CONFIG1_INT_MSK; |
| 742 | } | ||
| 743 | 744 | ||
| 744 | if (nfc_is_v21() && mtd->writesize) { | 745 | if (nfc_is_v21() && mtd->writesize) { |
| 746 | uint16_t pages_per_block = mtd->erasesize / mtd->writesize; | ||
| 747 | |||
| 745 | host->eccsize = get_eccsize(mtd); | 748 | host->eccsize = get_eccsize(mtd); |
| 746 | if (host->eccsize == 4) | 749 | if (host->eccsize == 4) |
| 747 | tmp |= NFC_V2_CONFIG1_ECC_MODE_4; | 750 | config1 |= NFC_V2_CONFIG1_ECC_MODE_4; |
| 751 | |||
| 752 | config1 |= NFC_V2_CONFIG1_PPB(ffs(pages_per_block) - 6); | ||
| 748 | } else { | 753 | } else { |
| 749 | host->eccsize = 1; | 754 | host->eccsize = 1; |
| 750 | } | 755 | } |
| 751 | 756 | ||
| 752 | writew(tmp, NFC_V1_V2_CONFIG1); | 757 | writew(config1, NFC_V1_V2_CONFIG1); |
| 753 | /* preset operation */ | 758 | /* preset operation */ |
| 754 | 759 | ||
| 755 | /* Unlock the internal RAM Buffer */ | 760 | /* Unlock the internal RAM Buffer */ |
diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index 4d89f3780207..4d01cda68844 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c | |||
| @@ -1320,6 +1320,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) | |||
| 1320 | goto fail_free_irq; | 1320 | goto fail_free_irq; |
| 1321 | } | 1321 | } |
| 1322 | 1322 | ||
| 1323 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 1323 | if (mtd_has_cmdlinepart()) { | 1324 | if (mtd_has_cmdlinepart()) { |
| 1324 | static const char *probes[] = { "cmdlinepart", NULL }; | 1325 | static const char *probes[] = { "cmdlinepart", NULL }; |
| 1325 | struct mtd_partition *parts; | 1326 | struct mtd_partition *parts; |
| @@ -1332,6 +1333,9 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) | |||
| 1332 | } | 1333 | } |
| 1333 | 1334 | ||
| 1334 | return add_mtd_partitions(mtd, pdata->parts, pdata->nr_parts); | 1335 | return add_mtd_partitions(mtd, pdata->parts, pdata->nr_parts); |
| 1336 | #else | ||
| 1337 | return 0; | ||
| 1338 | #endif | ||
| 1335 | 1339 | ||
| 1336 | fail_free_irq: | 1340 | fail_free_irq: |
| 1337 | free_irq(irq, info); | 1341 | free_irq(irq, info); |
| @@ -1364,7 +1368,9 @@ static int pxa3xx_nand_remove(struct platform_device *pdev) | |||
| 1364 | platform_set_drvdata(pdev, NULL); | 1368 | platform_set_drvdata(pdev, NULL); |
| 1365 | 1369 | ||
| 1366 | del_mtd_device(mtd); | 1370 | del_mtd_device(mtd); |
| 1371 | #ifdef CONFIG_MTD_PARTITIONS | ||
| 1367 | del_mtd_partitions(mtd); | 1372 | del_mtd_partitions(mtd); |
| 1373 | #endif | ||
| 1368 | irq = platform_get_irq(pdev, 0); | 1374 | irq = platform_get_irq(pdev, 0); |
| 1369 | if (irq >= 0) | 1375 | if (irq >= 0) |
| 1370 | free_irq(irq, info); | 1376 | free_irq(irq, info); |
diff --git a/drivers/mtd/onenand/samsung.c b/drivers/mtd/onenand/samsung.c index cb443af3d45f..a460f1b748c2 100644 --- a/drivers/mtd/onenand/samsung.c +++ b/drivers/mtd/onenand/samsung.c | |||
| @@ -554,14 +554,13 @@ static int s5pc110_dma_ops(void *dst, void *src, size_t count, int direction) | |||
| 554 | 554 | ||
| 555 | do { | 555 | do { |
| 556 | status = readl(base + S5PC110_DMA_TRANS_STATUS); | 556 | status = readl(base + S5PC110_DMA_TRANS_STATUS); |
| 557 | if (status & S5PC110_DMA_TRANS_STATUS_TE) { | ||
| 558 | writel(S5PC110_DMA_TRANS_CMD_TEC, | ||
| 559 | base + S5PC110_DMA_TRANS_CMD); | ||
| 560 | return -EIO; | ||
| 561 | } | ||
| 557 | } while (!(status & S5PC110_DMA_TRANS_STATUS_TD)); | 562 | } while (!(status & S5PC110_DMA_TRANS_STATUS_TD)); |
| 558 | 563 | ||
| 559 | if (status & S5PC110_DMA_TRANS_STATUS_TE) { | ||
| 560 | writel(S5PC110_DMA_TRANS_CMD_TEC, base + S5PC110_DMA_TRANS_CMD); | ||
| 561 | writel(S5PC110_DMA_TRANS_CMD_TDC, base + S5PC110_DMA_TRANS_CMD); | ||
| 562 | return -EIO; | ||
| 563 | } | ||
| 564 | |||
| 565 | writel(S5PC110_DMA_TRANS_CMD_TDC, base + S5PC110_DMA_TRANS_CMD); | 564 | writel(S5PC110_DMA_TRANS_CMD_TDC, base + S5PC110_DMA_TRANS_CMD); |
| 566 | 565 | ||
| 567 | return 0; | 566 | return 0; |
| @@ -571,13 +570,12 @@ static int s5pc110_read_bufferram(struct mtd_info *mtd, int area, | |||
| 571 | unsigned char *buffer, int offset, size_t count) | 570 | unsigned char *buffer, int offset, size_t count) |
| 572 | { | 571 | { |
| 573 | struct onenand_chip *this = mtd->priv; | 572 | struct onenand_chip *this = mtd->priv; |
| 574 | void __iomem *bufferram; | ||
| 575 | void __iomem *p; | 573 | void __iomem *p; |
| 576 | void *buf = (void *) buffer; | 574 | void *buf = (void *) buffer; |
| 577 | dma_addr_t dma_src, dma_dst; | 575 | dma_addr_t dma_src, dma_dst; |
| 578 | int err; | 576 | int err; |
| 579 | 577 | ||
| 580 | p = bufferram = this->base + area; | 578 | p = this->base + area; |
| 581 | if (ONENAND_CURRENT_BUFFERRAM(this)) { | 579 | if (ONENAND_CURRENT_BUFFERRAM(this)) { |
| 582 | if (area == ONENAND_DATARAM) | 580 | if (area == ONENAND_DATARAM) |
| 583 | p += this->writesize; | 581 | p += this->writesize; |
| @@ -621,7 +619,7 @@ static int s5pc110_read_bufferram(struct mtd_info *mtd, int area, | |||
| 621 | normal: | 619 | normal: |
| 622 | if (count != mtd->writesize) { | 620 | if (count != mtd->writesize) { |
| 623 | /* Copy the bufferram to memory to prevent unaligned access */ | 621 | /* Copy the bufferram to memory to prevent unaligned access */ |
| 624 | memcpy(this->page_buf, bufferram, mtd->writesize); | 622 | memcpy(this->page_buf, p, mtd->writesize); |
| 625 | p = this->page_buf + offset; | 623 | p = this->page_buf + offset; |
| 626 | } | 624 | } |
| 627 | 625 | ||
