ARM: OMAP2+: nand: unify init functions

Helper function for updating nand platform data has been
added the capability to take timing structure arguement.
Usage of omap_nand_flash_init() has been replaced by modifed
one, omap_nand_flash_init was doing things similar to
board_nand_init except that NAND CS# were being acquired
based on bootloader setting. As CS# is hardwired for a given
board, acquiring gpmc CS# has been removed, and updated with
the value on board.

NAND CS# used in beagle board & omap3evm was found to be CS0.
Thomas Weber <thomas.weber.linux@googlemail.com> reported
that value of devkit8000 to be CS0. Overo board was found
to be using CS0 based on u-boot, while google grep says
omap3touchbook too has CS0.

Signed-off-by: Afzal Mohammed <afzal@ti.com>
Reviewed-by: Jon Hunter <jon-hunter@ti.com>
Acked-by: Igor Grinberg <grinberg@compulab.co.il>
This commit is contained in:
Afzal Mohammed 2012-02-29 18:11:56 +05:30
parent ddffeb8c4d
commit 2e618261c9
12 changed files with 62 additions and 85 deletions

View File

@ -55,8 +55,11 @@
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "board-flash.h"
#include "common-board-devices.h" #include "common-board-devices.h"
#define NAND_CS 0
#define OMAP_DM9000_GPIO_IRQ 25 #define OMAP_DM9000_GPIO_IRQ 25
#define OMAP3_DEVKIT_TS_GPIO 27 #define OMAP3_DEVKIT_TS_GPIO 27
@ -621,8 +624,9 @@ static void __init devkit8000_init(void)
usb_musb_init(NULL); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions, board_nand_init(devkit8000_nand_partitions,
ARRAY_SIZE(devkit8000_nand_partitions)); ARRAY_SIZE(devkit8000_nand_partitions), NAND_CS,
NAND_BUSWIDTH_16, NULL);
omap_twl4030_audio_init("omap3beagle"); omap_twl4030_audio_init("omap3beagle");
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */

View File

@ -104,41 +104,41 @@ __init board_onenand_init(struct mtd_partition *onenand_parts,
defined(CONFIG_MTD_NAND_OMAP2_MODULE) defined(CONFIG_MTD_NAND_OMAP2_MODULE)
/* Note that all values in this struct are in nanoseconds */ /* Note that all values in this struct are in nanoseconds */
static struct gpmc_timings nand_timings = { struct gpmc_timings nand_default_timings[1] = {
{
.sync_clk = 0,
.sync_clk = 0, .cs_on = 0,
.cs_rd_off = 36,
.cs_wr_off = 36,
.cs_on = 0, .adv_on = 6,
.cs_rd_off = 36, .adv_rd_off = 24,
.cs_wr_off = 36, .adv_wr_off = 36,
.adv_on = 6, .we_off = 30,
.adv_rd_off = 24, .oe_off = 48,
.adv_wr_off = 36,
.we_off = 30, .access = 54,
.oe_off = 48, .rd_cycle = 72,
.wr_cycle = 72,
.access = 54, .wr_access = 30,
.rd_cycle = 72, .wr_data_mux_bus = 0,
.wr_cycle = 72, },
.wr_access = 30,
.wr_data_mux_bus = 0,
}; };
static struct omap_nand_platform_data board_nand_data = { static struct omap_nand_platform_data board_nand_data;
.gpmc_t = &nand_timings,
};
void void
__init board_nand_init(struct mtd_partition *nand_parts, __init board_nand_init(struct mtd_partition *nand_parts, u8 nr_parts, u8 cs,
u8 nr_parts, u8 cs, int nand_type) int nand_type, struct gpmc_timings *gpmc_t)
{ {
board_nand_data.cs = cs; board_nand_data.cs = cs;
board_nand_data.parts = nand_parts; board_nand_data.parts = nand_parts;
board_nand_data.nr_parts = nr_parts; board_nand_data.nr_parts = nr_parts;
board_nand_data.devsize = nand_type; board_nand_data.devsize = nand_type;
board_nand_data.gpmc_t = gpmc_t;
board_nand_data.ecc_opt = OMAP_ECC_HAMMING_CODE_DEFAULT; board_nand_data.ecc_opt = OMAP_ECC_HAMMING_CODE_DEFAULT;
gpmc_nand_init(&board_nand_data); gpmc_nand_init(&board_nand_data);
@ -238,5 +238,6 @@ void __init board_flash_init(struct flash_partitions partition_info[],
pr_err("NAND: Unable to find configuration in GPMC\n"); pr_err("NAND: Unable to find configuration in GPMC\n");
else else
board_nand_init(partition_info[2].parts, board_nand_init(partition_info[2].parts,
partition_info[2].nr_parts, nandcs, nand_type); partition_info[2].nr_parts, nandcs,
nand_type, nand_default_timings);
} }

View File

@ -40,12 +40,14 @@ static inline void board_flash_init(struct flash_partitions part[],
#if defined(CONFIG_MTD_NAND_OMAP2) || \ #if defined(CONFIG_MTD_NAND_OMAP2) || \
defined(CONFIG_MTD_NAND_OMAP2_MODULE) defined(CONFIG_MTD_NAND_OMAP2_MODULE)
extern void board_nand_init(struct mtd_partition *nand_parts, extern void board_nand_init(struct mtd_partition *nand_parts,
u8 nr_parts, u8 cs, int nand_type); u8 nr_parts, u8 cs, int nand_type, struct gpmc_timings *gpmc_t);
extern struct gpmc_timings nand_default_timings[];
#else #else
static inline void board_nand_init(struct mtd_partition *nand_parts, static inline void board_nand_init(struct mtd_partition *nand_parts,
u8 nr_parts, u8 cs, int nand_type) u8 nr_parts, u8 cs, int nand_type, struct gpmc_timings *gpmc_t)
{ {
} }
#define nand_default_timings NULL
#endif #endif
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \ #if defined(CONFIG_MTD_ONENAND_OMAP2) || \

View File

@ -175,7 +175,7 @@ static void __init igep_flash_init(void)
pr_info("IGEP: initializing NAND memory device\n"); pr_info("IGEP: initializing NAND memory device\n");
board_nand_init(igep_flash_partitions, board_nand_init(igep_flash_partitions,
ARRAY_SIZE(igep_flash_partitions), ARRAY_SIZE(igep_flash_partitions),
0, NAND_BUSWIDTH_16); 0, NAND_BUSWIDTH_16, nand_default_timings);
} else if (mux == IGEP_SYSBOOT_ONENAND) { } else if (mux == IGEP_SYSBOOT_ONENAND) {
pr_info("IGEP: initializing OneNAND memory device\n"); pr_info("IGEP: initializing OneNAND memory device\n");
board_onenand_init(igep_flash_partitions, board_onenand_init(igep_flash_partitions,

View File

@ -420,8 +420,8 @@ static void __init omap_ldp_init(void)
omap_serial_init(); omap_serial_init();
omap_sdrc_init(NULL, NULL); omap_sdrc_init(NULL, NULL);
usb_musb_init(NULL); usb_musb_init(NULL);
board_nand_init(ldp_nand_partitions, board_nand_init(ldp_nand_partitions, ARRAY_SIZE(ldp_nand_partitions),
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); ZOOM_NAND_CS, 0, nand_default_timings);
omap_hsmmc_init(mmc); omap_hsmmc_init(mmc);
ldp_display_init(); ldp_display_init();

View File

@ -49,8 +49,11 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "pm.h" #include "pm.h"
#include "board-flash.h"
#include "common-board-devices.h" #include "common-board-devices.h"
#define NAND_CS 0
/* /*
* OMAP3 Beagle revision * OMAP3 Beagle revision
* Run time detection of Beagle revision is done by reading GPIO. * Run time detection of Beagle revision is done by reading GPIO.
@ -512,8 +515,9 @@ static void __init omap3_beagle_init(void)
usb_musb_init(NULL); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions, board_nand_init(omap3beagle_nand_partitions,
ARRAY_SIZE(omap3beagle_nand_partitions)); ARRAY_SIZE(omap3beagle_nand_partitions), NAND_CS,
NAND_BUSWIDTH_16, NULL);
omap_twl4030_audio_init("omap3beagle"); omap_twl4030_audio_init("omap3beagle");
/* Ensure msecure is mux'd to be able to set the RTC. */ /* Ensure msecure is mux'd to be able to set the RTC. */

View File

@ -56,6 +56,9 @@
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h" #include "common-board-devices.h"
#include "board-flash.h"
#define NAND_CS 0
#define OMAP3_EVM_TS_GPIO 175 #define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_EHCI_VBUS 22 #define OMAP3_EVM_EHCI_VBUS 22
@ -731,8 +734,9 @@ static void __init omap3_evm_init(void)
} }
usb_musb_init(&musb_board_data); usb_musb_init(&musb_board_data);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3evm_nand_partitions, board_nand_init(omap3evm_nand_partitions,
ARRAY_SIZE(omap3evm_nand_partitions)); ARRAY_SIZE(omap3evm_nand_partitions), NAND_CS,
NAND_BUSWIDTH_16, NULL);
omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL); omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);
omap3evm_init_smsc911x(); omap3evm_init_smsc911x();

View File

@ -50,6 +50,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "board-flash.h"
#include "common-board-devices.h" #include "common-board-devices.h"
#include <asm/setup.h> #include <asm/setup.h>
@ -59,6 +60,8 @@
#define TB_BL_PWM_TIMER 9 #define TB_BL_PWM_TIMER 9
#define TB_KILL_POWER_GPIO 168 #define TB_KILL_POWER_GPIO 168
#define NAND_CS 0
static unsigned long touchbook_revision; static unsigned long touchbook_revision;
static struct mtd_partition omap3touchbook_nand_partitions[] = { static struct mtd_partition omap3touchbook_nand_partitions[] = {
@ -365,8 +368,9 @@ static void __init omap3_touchbook_init(void)
omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata); omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
usb_musb_init(NULL); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap_nand_flash_init(NAND_BUSWIDTH_16, omap3touchbook_nand_partitions, board_nand_init(omap3touchbook_nand_partitions,
ARRAY_SIZE(omap3touchbook_nand_partitions)); ARRAY_SIZE(omap3touchbook_nand_partitions), NAND_CS,
NAND_BUSWIDTH_16, NULL);
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);

View File

@ -55,8 +55,11 @@
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "board-flash.h"
#include "common-board-devices.h" #include "common-board-devices.h"
#define NAND_CS 0
#define OVERO_GPIO_BT_XGATE 15 #define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_W2W_NRESET 16 #define OVERO_GPIO_W2W_NRESET 16
#define OVERO_GPIO_PENDOWN 114 #define OVERO_GPIO_PENDOWN 114
@ -495,8 +498,8 @@ static void __init overo_init(void)
omap_serial_init(); omap_serial_init();
omap_sdrc_init(mt46h32m32lf6_sdrc_params, omap_sdrc_init(mt46h32m32lf6_sdrc_params,
mt46h32m32lf6_sdrc_params); mt46h32m32lf6_sdrc_params);
omap_nand_flash_init(0, overo_nand_partitions, board_nand_init(overo_nand_partitions,
ARRAY_SIZE(overo_nand_partitions)); ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL);
usb_musb_init(NULL); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
overo_spi_init(); overo_spi_init();

View File

@ -113,8 +113,9 @@ static void __init omap_zoom_init(void)
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
} }
board_nand_init(zoom_nand_partitions, ARRAY_SIZE(zoom_nand_partitions), board_nand_init(zoom_nand_partitions,
ZOOM_NAND_CS, NAND_BUSWIDTH_16); ARRAY_SIZE(zoom_nand_partitions), ZOOM_NAND_CS,
NAND_BUSWIDTH_16, nand_default_timings);
zoom_debugboard_init(); zoom_debugboard_init();
zoom_peripherals_init(); zoom_peripherals_init();

View File

@ -96,48 +96,3 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
{ {
} }
#endif #endif
#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
static struct omap_nand_platform_data nand_data;
void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
int nr_parts)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* find out the chip-select on which NAND exists */
while (cs < GPMC_CS_NUM) {
u32 ret = 0;
ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
if ((ret & 0xC00) == 0x800) {
printk(KERN_INFO "Found NAND on CS%d\n", cs);
if (nandcs > GPMC_CS_NUM)
nandcs = cs;
}
cs++;
}
if (nandcs > GPMC_CS_NUM) {
pr_info("NAND: Unable to find configuration in GPMC\n");
return;
}
if (nandcs < GPMC_CS_NUM) {
nand_data.cs = nandcs;
nand_data.parts = parts;
nand_data.nr_parts = nr_parts;
nand_data.devsize = options;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
#else
void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
int nr_parts)
{
}
#endif

View File

@ -10,6 +10,5 @@ struct ads7846_platform_data;
void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
struct ads7846_platform_data *board_pdata); struct ads7846_platform_data *board_pdata);
void omap_nand_flash_init(int opts, struct mtd_partition *parts, int n_parts);
#endif /* __OMAP_COMMON_BOARD_DEVICES__ */ #endif /* __OMAP_COMMON_BOARD_DEVICES__ */