summaryrefslogtreecommitdiffstats
path: root/drivers/nand/nand.c
diff options
context:
space:
mode:
authorsascha <sascha@nomad.localdomain>2007-10-20 01:13:46 +0200
committersascha <sascha@nomad.localdomain>2007-10-20 01:13:46 +0200
commit3f90fc9d3ec1f729ce7fb464829391bf91b94aad (patch)
treee672cb6eaaa0a5df8001463231f5aa3aef1f3704 /drivers/nand/nand.c
parentd24db665ac967582e3026b76d6922304814b6dc4 (diff)
downloadbarebox-3f90fc9d3ec1f729ce7fb464829391bf91b94aad.tar.gz
barebox-3f90fc9d3ec1f729ce7fb464829391bf91b94aad.tar.xz
NAND support work in progress
Diffstat (limited to 'drivers/nand/nand.c')
-rw-r--r--drivers/nand/nand.c59
1 files changed, 25 insertions, 34 deletions
diff --git a/drivers/nand/nand.c b/drivers/nand/nand.c
index 18f90a035f..6700655d96 100644
--- a/drivers/nand/nand.c
+++ b/drivers/nand/nand.c
@@ -22,59 +22,50 @@
*/
#include <common.h>
-#include <nand.h>
+#include <linux/mtd/nand.h>
#include <init.h>
#include <xfuncs.h>
#include <driver.h>
-char *default_nand_name = "huhu";
-
-static inline int board_nand_init(struct nand_chip *nand)
+static ssize_t nand_read(struct device_d *dev, void* buf, size_t count, ulong offset, ulong flags)
{
- return 0;
-}
+ struct nand_chip *nand = dev->priv;
+ size_t retlen;
+ int ret;
+ char oobuf[NAND_MAX_OOBSIZE];
-static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
- ulong base_addr)
-{
- mtd->priv = nand;
+ printf("%s\n", __FUNCTION__);
- nand->IO_ADDR_R = nand->IO_ADDR_W = (void __iomem *)base_addr;
- if (board_nand_init(nand) == 0) {
- if (nand_scan(mtd, 1) == 0) {
- if (!mtd->name)
- mtd->name = (char *)default_nand_name;
- } else
- mtd->name = NULL;
- } else {
- mtd->name = NULL;
- mtd->size = 0;
- }
+ ret = nand->read_ecc(nand, offset, count, &retlen, buf, oobuf, &nand->oobinfo);
+ if(ret)
+ return ret;
+ return retlen;
}
-struct nand_host {
- struct mtd_info info;
- struct nand_chip chip;
- struct device_d *dev;
-};
-
-static int nand_probe (struct device_d *dev)
+static ssize_t nand_write(struct device_d* dev, const void* buf, size_t count, ulong offset, ulong flags)
{
- struct nand_host *host;
-
- host = xzalloc(sizeof(*host));
+ struct nand_chip *nand = dev->priv;
+ size_t retlen;
+ int ret;
- nand_init_chip(&host->info, &host->chip, dev->map_base);
+ ret = nand->write_ecc(nand, offset, count, &retlen, buf, NULL, &nand->oobinfo);
+ if (ret)
+ return ret;
+ return retlen;
+}
+static int nand_probe (struct device_d *dev)
+{
+ printf("%s\n", __FUNCTION__);
return 0;
}
static struct driver_d nand_driver = {
.name = "nand_flash",
.probe = nand_probe,
-// .read = nand_read,
-// .write = nand_write,
+ .read = nand_read,
+ .write = nand_write,
// .erase = nand_erase,
// .protect= nand_protect,
// .memmap = generic_memmap_ro,