xref: /rk3399_rockchip-uboot/drivers/mtd/onenand/onenand_uboot.c (revision 77b93e5e9b28328f76556e0c0b94889df47077d7)
16cb2239aSKyungmin Park /*
26cb2239aSKyungmin Park  *  drivers/mtd/onenand/onenand_uboot.c
36cb2239aSKyungmin Park  *
46cb2239aSKyungmin Park  *  Copyright (C) 2005-2008 Samsung Electronics
56cb2239aSKyungmin Park  *  Kyungmin Park <kyungmin.park@samsung.com>
66cb2239aSKyungmin Park  *
76cb2239aSKyungmin Park  * This program is free software; you can redistribute it and/or modify
86cb2239aSKyungmin Park  * it under the terms of the GNU General Public License version 2 as
96cb2239aSKyungmin Park  * published by the Free Software Foundation.
106cb2239aSKyungmin Park  */
116cb2239aSKyungmin Park 
126cb2239aSKyungmin Park /*
136cb2239aSKyungmin Park  * OneNAND initialization at U-Boot
146cb2239aSKyungmin Park  */
156cb2239aSKyungmin Park 
166cb2239aSKyungmin Park #include <common.h>
177b15e2bbSMike Frysinger #include <linux/compat.h>
186cb2239aSKyungmin Park #include <linux/mtd/mtd.h>
196cb2239aSKyungmin Park #include <linux/mtd/onenand.h>
206cb2239aSKyungmin Park 
216cb2239aSKyungmin Park struct mtd_info onenand_mtd;
226cb2239aSKyungmin Park struct onenand_chip onenand_chip;
23dbe29e36SStefan Roese static __attribute__((unused)) char dev_name[] = "onenand0";
246cb2239aSKyungmin Park 
onenand_init(void)256cb2239aSKyungmin Park void onenand_init(void)
266cb2239aSKyungmin Park {
27*77b93e5eSLadislav Michl 	int err = 0;
286cb2239aSKyungmin Park 	memset(&onenand_mtd, 0, sizeof(struct mtd_info));
296cb2239aSKyungmin Park 	memset(&onenand_chip, 0, sizeof(struct onenand_chip));
306cb2239aSKyungmin Park 
316cb2239aSKyungmin Park 	onenand_mtd.priv = &onenand_chip;
326cb2239aSKyungmin Park 
33ef0921d6SKyungmin Park #ifdef CONFIG_USE_ONENAND_BOARD_INIT
34*77b93e5eSLadislav Michl 	/* It's used for some board init required */
35*77b93e5eSLadislav Michl 	err = onenand_board_init(&onenand_mtd);
36ef0921d6SKyungmin Park #else
37ef0921d6SKyungmin Park 	onenand_chip.base = (void *) CONFIG_SYS_ONENAND_BASE;
38ef0921d6SKyungmin Park #endif
39ef0921d6SKyungmin Park 
40*77b93e5eSLadislav Michl 	if (!err && !(onenand_scan(&onenand_mtd, 1))) {
416cb2239aSKyungmin Park 
42cacbe919SAmul Kumar Saha 		if (onenand_chip.device_id & DEVICE_IS_FLEXONENAND)
43cacbe919SAmul Kumar Saha 			puts("Flex-");
446cb2239aSKyungmin Park 		puts("OneNAND: ");
45dbe29e36SStefan Roese 
46d558107cSStefan Roese #ifdef CONFIG_MTD_DEVICE
47dbe29e36SStefan Roese 		/*
48dbe29e36SStefan Roese 		 * Add MTD device so that we can reference it later
49dbe29e36SStefan Roese 		 * via the mtdcore infrastructure (e.g. ubi).
50dbe29e36SStefan Roese 		 */
51dbe29e36SStefan Roese 		onenand_mtd.name = dev_name;
52dbe29e36SStefan Roese 		add_mtd_device(&onenand_mtd);
53dbe29e36SStefan Roese #endif
546cb2239aSKyungmin Park 	}
55*77b93e5eSLadislav Michl 	print_size(onenand_chip.chipsize, "\n");
56*77b93e5eSLadislav Michl }
57