nand: davinci: add support for driver model

Extend the davinci NAND driver to support the driver model. For now this
doesn't add any device-tree parsing due to the fact that we can't access
the actual nand node on the device-tree - it's a subnode of the aemif
device and we don't have an aemif driver on davinci at the moment.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This commit is contained in:
Bartosz Golaszewski 2019-07-29 08:58:03 +02:00 committed by Tom Rini
parent 7bf9972643
commit 29d8eb3345

View file

@ -31,6 +31,7 @@
#include <common.h>
#include <asm/io.h>
#include <nand.h>
#include <dm/uclass.h>
#include <asm/ti-common/davinci_nand.h>
/* Definitions for 4-bit hardware ECC */
@ -785,10 +786,53 @@ static void davinci_nand_init(struct nand_chip *nand)
nand->dev_ready = nand_davinci_dev_ready;
}
int board_nand_init(struct nand_chip *chip) __attribute__((weak));
#ifdef CONFIG_SYS_NAND_SELF_INIT
static int davinci_nand_probe(struct udevice *dev)
{
struct nand_chip *nand = dev_get_priv(dev);
struct mtd_info *mtd = nand_to_mtd(nand);
int ret;
nand->IO_ADDR_R = (void __iomem *)CONFIG_SYS_NAND_BASE;
nand->IO_ADDR_W = (void __iomem *)CONFIG_SYS_NAND_BASE;
davinci_nand_init(nand);
ret = nand_scan(mtd, CONFIG_SYS_NAND_MAX_CHIPS);
if (ret)
return ret;
return nand_register(0, mtd);
}
static const struct udevice_id davinci_nand_ids[] = {
{ .compatible = "ti,davinci-nand" },
{ }
};
U_BOOT_DRIVER(davinci_nand) = {
.name = "davinci-nand",
.id = UCLASS_MTD,
.of_match = davinci_nand_ids,
.probe = davinci_nand_probe,
.priv_auto_alloc_size = sizeof(struct nand_chip),
};
void board_nand_init(void)
{
struct udevice *dev;
int ret;
ret = uclass_get_device_by_driver(UCLASS_MTD,
DM_GET_DRIVER(davinci_nand), &dev);
if (ret && ret != -ENODEV)
pr_err("Failed to initialize %s: %d\n", dev->name, ret);
}
#else
int board_nand_init(struct nand_chip *chip) __attribute__((weak));
int board_nand_init(struct nand_chip *chip)
{
davinci_nand_init(chip);
return 0;
}
#endif /* CONFIG_SYS_NAND_SELF_INIT */