diff options
-rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 46 |
1 files changed, 41 insertions, 5 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 50700ab5a57a..4814fc9b237b 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c | |||
@@ -142,6 +142,37 @@ static int atmel_nand_device_ready(struct mtd_info *mtd) | |||
142 | } | 142 | } |
143 | 143 | ||
144 | /* | 144 | /* |
145 | * Minimal-overhead PIO for data access. | ||
146 | */ | ||
147 | static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len) | ||
148 | { | ||
149 | struct nand_chip *nand_chip = mtd->priv; | ||
150 | |||
151 | __raw_readsb(nand_chip->IO_ADDR_R, buf, len); | ||
152 | } | ||
153 | |||
154 | static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len) | ||
155 | { | ||
156 | struct nand_chip *nand_chip = mtd->priv; | ||
157 | |||
158 | __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2); | ||
159 | } | ||
160 | |||
161 | static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len) | ||
162 | { | ||
163 | struct nand_chip *nand_chip = mtd->priv; | ||
164 | |||
165 | __raw_writesb(nand_chip->IO_ADDR_W, buf, len); | ||
166 | } | ||
167 | |||
168 | static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len) | ||
169 | { | ||
170 | struct nand_chip *nand_chip = mtd->priv; | ||
171 | |||
172 | __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2); | ||
173 | } | ||
174 | |||
175 | /* | ||
145 | * write oob for small pages | 176 | * write oob for small pages |
146 | */ | 177 | */ |
147 | static int atmel_nand_write_oob_512(struct mtd_info *mtd, | 178 | static int atmel_nand_write_oob_512(struct mtd_info *mtd, |
@@ -436,8 +467,14 @@ static int __init atmel_nand_probe(struct platform_device *pdev) | |||
436 | 467 | ||
437 | nand_chip->chip_delay = 20; /* 20us command delay time */ | 468 | nand_chip->chip_delay = 20; /* 20us command delay time */ |
438 | 469 | ||
439 | if (host->board->bus_width_16) /* 16-bit bus width */ | 470 | if (host->board->bus_width_16) { /* 16-bit bus width */ |
440 | nand_chip->options |= NAND_BUSWIDTH_16; | 471 | nand_chip->options |= NAND_BUSWIDTH_16; |
472 | nand_chip->read_buf = atmel_read_buf16; | ||
473 | nand_chip->write_buf = atmel_write_buf16; | ||
474 | } else { | ||
475 | nand_chip->read_buf = atmel_read_buf; | ||
476 | nand_chip->write_buf = atmel_write_buf; | ||
477 | } | ||
441 | 478 | ||
442 | platform_set_drvdata(pdev, host); | 479 | platform_set_drvdata(pdev, host); |
443 | atmel_nand_enable(host); | 480 | atmel_nand_enable(host); |
@@ -546,7 +583,7 @@ err_nand_ioremap: | |||
546 | /* | 583 | /* |
547 | * Remove a NAND device. | 584 | * Remove a NAND device. |
548 | */ | 585 | */ |
549 | static int __devexit atmel_nand_remove(struct platform_device *pdev) | 586 | static int __exit atmel_nand_remove(struct platform_device *pdev) |
550 | { | 587 | { |
551 | struct atmel_nand_host *host = platform_get_drvdata(pdev); | 588 | struct atmel_nand_host *host = platform_get_drvdata(pdev); |
552 | struct mtd_info *mtd = &host->mtd; | 589 | struct mtd_info *mtd = &host->mtd; |
@@ -564,8 +601,7 @@ static int __devexit atmel_nand_remove(struct platform_device *pdev) | |||
564 | } | 601 | } |
565 | 602 | ||
566 | static struct platform_driver atmel_nand_driver = { | 603 | static struct platform_driver atmel_nand_driver = { |
567 | .probe = atmel_nand_probe, | 604 | .remove = __exit_p(atmel_nand_remove), |
568 | .remove = atmel_nand_remove, | ||
569 | .driver = { | 605 | .driver = { |
570 | .name = "atmel_nand", | 606 | .name = "atmel_nand", |
571 | .owner = THIS_MODULE, | 607 | .owner = THIS_MODULE, |
@@ -574,7 +610,7 @@ static struct platform_driver atmel_nand_driver = { | |||
574 | 610 | ||
575 | static int __init atmel_nand_init(void) | 611 | static int __init atmel_nand_init(void) |
576 | { | 612 | { |
577 | return platform_driver_register(&atmel_nand_driver); | 613 | return platform_driver_probe(&atmel_nand_driver, atmel_nand_probe); |
578 | } | 614 | } |
579 | 615 | ||
580 | 616 | ||