[PATCH 09/39] ARM: OMAP2+: flash: Adapt to gpmc driver
Afzal Mohammed
afzal at ti.com
Tue May 1 08:07:10 EDT 2012
gpmc driver has been converted to driver. Modify board_flash_init
so that it can setup gpmc driver platform details for boards
Signed-off-by: Afzal Mohammed <afzal at ti.com>
---
arch/arm/mach-omap2/board-3430sdp.c | 2 +-
arch/arm/mach-omap2/board-3630sdp.c | 3 +-
arch/arm/mach-omap2/board-flash.c | 89 +++++++++++++++++++----------------
arch/arm/mach-omap2/board-flash.h | 11 +++--
4 files changed, 58 insertions(+), 47 deletions(-)
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index da75f23..ac2e398 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -620,7 +620,7 @@ static void __init omap_3430sdp_init(void)
omap_sdrc_init(hyb18m512160af6_sdrc_params, NULL);
usb_musb_init(NULL);
board_smc91x_init();
- board_flash_init(sdp_flash_partitions, chip_sel_3430, 0);
+ board_flash_init(sdp_flash_partitions, chip_sel_3430, 0, NULL);
sdp3430_display_init();
enable_board_wakeup_source();
usbhs_init(&usbhs_bdata);
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c
index 6ef350d..74195b7 100644
--- a/arch/arm/mach-omap2/board-3630sdp.c
+++ b/arch/arm/mach-omap2/board-3630sdp.c
@@ -204,7 +204,8 @@ static void __init omap_sdp_init(void)
h8mbx00u0mer0em_sdrc_params);
zoom_display_init();
board_smc91x_init();
- board_flash_init(sdp_flash_partitions, chip_sel_sdp, NAND_BUSWIDTH_16);
+ board_flash_init(sdp_flash_partitions, chip_sel_sdp,
+ NAND_BUSWIDTH_16, NULL);
enable_board_wakeup_source();
usbhs_init(&usbhs_bdata);
}
diff --git a/arch/arm/mach-omap2/board-flash.c b/arch/arm/mach-omap2/board-flash.c
index 8727c05..8deead9 100644
--- a/arch/arm/mach-omap2/board-flash.c
+++ b/arch/arm/mach-omap2/board-flash.c
@@ -39,46 +39,33 @@ static struct physmap_flash_data board_nor_data = {
.width = 2,
};
-static struct resource board_nor_resource = {
- .flags = IORESOURCE_MEM,
+static struct gpmc_cs_data gpmc_nor_cs_data = {
};
-static struct platform_device board_nor_device = {
+static struct gpmc_device_pdata gpmc_nor_data = {
.name = "physmap-flash",
.id = 0,
- .dev = {
- .platform_data = &board_nor_data,
- },
- .num_resources = 1,
- .resource = &board_nor_resource,
+ .cs_data = &gpmc_nor_cs_data,
+ .num_cs = 1,
};
-static void
-__init board_nor_init(struct mtd_partition *nor_parts, u8 nr_parts, u8 cs)
+static __init struct gpmc_device_pdata *
+gpmc_nor_init(struct mtd_partition *nor_parts, u8 nr_parts, u8 cs)
{
- int err;
-
board_nor_data.parts = nor_parts;
board_nor_data.nr_parts = nr_parts;
- /* Configure start address and size of NOR device */
- if (omap_rev() >= OMAP3430_REV_ES1_0) {
- err = gpmc_cs_request(cs, FLASH_SIZE_SDPV2 - 1,
- (unsigned long *)&board_nor_resource.start);
- board_nor_resource.end = board_nor_resource.start
- + FLASH_SIZE_SDPV2 - 1;
- } else {
- err = gpmc_cs_request(cs, FLASH_SIZE_SDPV1 - 1,
- (unsigned long *)&board_nor_resource.start);
- board_nor_resource.end = board_nor_resource.start
- + FLASH_SIZE_SDPV1 - 1;
- }
- if (err < 0) {
- pr_err("NOR: Can't request GPMC CS\n");
- return;
- }
- if (platform_device_register(&board_nor_device) < 0)
- pr_err("Unable to register NOR device\n");
+ gpmc_nor_cs_data.cs = cs;
+
+ if (omap_rev() >= OMAP3430_REV_ES1_0)
+ gpmc_nor_cs_data.mem_size = FLASH_SIZE_SDPV2;
+ else
+ gpmc_nor_cs_data.mem_size = FLASH_SIZE_SDPV1;
+
+ gpmc_nor_data.pdata = &board_nor_data;
+ gpmc_nor_data.pdata_size = sizeof(board_nor_data);
+
+ return &gpmc_nor_data;
}
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
@@ -183,8 +170,11 @@ unmap:
*
* @return - void.
*/
-void __init board_flash_init(struct flash_partitions partition_info[],
- char chip_sel_board[][GPMC_CS_NUM], int nand_type)
+__init struct gpmc_device_pdata **board_flash_init(
+ struct flash_partitions partition_info[],
+ char chip_sel_board[][GPMC_CS_NUM],
+ int nand_type,
+ struct gpmc_device_pdata **gpmc_data)
{
u8 cs = 0;
u8 norcs = GPMC_CS_NUM + 1;
@@ -193,13 +183,18 @@ void __init board_flash_init(struct flash_partitions partition_info[],
u8 idx;
unsigned char *config_sel = NULL;
+ if (gpmc_data == NULL) {
+ pr_err("%s: NULL arguement passed\n", __func__);
+ return NULL;
+ }
+
/* REVISIT: Is this return correct idx for 2430 SDP?
* for which cs configuration matches for 2430 SDP?
*/
idx = get_gpmc0_type();
if (idx >= MAX_SUPPORTED_GPMC_CONFIG) {
pr_err("%s: Invalid chip select: %d\n", __func__, cs);
- return;
+ return gpmc_data;
}
config_sel = (unsigned char *)(chip_sel_board[idx]);
@@ -224,19 +219,31 @@ void __init board_flash_init(struct flash_partitions partition_info[],
if (norcs > GPMC_CS_NUM)
pr_err("NOR: Unable to find configuration in GPMC\n");
else
- board_nor_init(partition_info[0].parts,
+ *gpmc_data++ = gpmc_nor_init(partition_info[0].parts,
partition_info[0].nr_parts, norcs);
if (onenandcs > GPMC_CS_NUM)
pr_err("OneNAND: Unable to find configuration in GPMC\n");
- else
- board_onenand_init(partition_info[1].parts,
- partition_info[1].nr_parts, onenandcs);
+ else {
+ struct omap_onenand_platform_data *onenand_data;
+
+ onenand_data = board_onenand_init(partition_info[1].parts,
+ partition_info[1].nr_parts, onenandcs);
+ if (onenand_data != NULL)
+ *gpmc_data++ = gpmc_onenand_init(onenand_data);
+ }
if (nandcs > GPMC_CS_NUM)
pr_err("NAND: Unable to find configuration in GPMC\n");
- else
- board_nand_init(partition_info[2].parts,
- partition_info[2].nr_parts, nandcs,
- nand_type, nand_default_timings);
+ else {
+ struct omap_nand_platform_data *nand_data;
+
+ nand_data = board_nand_init(partition_info[2].parts,
+ partition_info[2].nr_parts, nandcs,
+ nand_type, nand_default_timings);
+ if (nand_data != NULL)
+ *gpmc_data++ = gpmc_nand_init(nand_data);
+ }
+
+ return gpmc_data;
}
diff --git a/arch/arm/mach-omap2/board-flash.h b/arch/arm/mach-omap2/board-flash.h
index 75ba49f..4dd733d 100644
--- a/arch/arm/mach-omap2/board-flash.h
+++ b/arch/arm/mach-omap2/board-flash.h
@@ -28,12 +28,15 @@ struct flash_partitions {
defined(CONFIG_MTD_NAND_OMAP2_MODULE) || \
defined(CONFIG_MTD_ONENAND_OMAP2) || \
defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
-extern void board_flash_init(struct flash_partitions [],
- char chip_sel[][GPMC_CS_NUM], int nand_type);
+extern struct gpmc_device_pdata **board_flash_init(
+ struct flash_partitions [], char chip_sel[][GPMC_CS_NUM],
+ int nand_type, struct gpmc_device_pdata **gpmc_data);
#else
-static inline void board_flash_init(struct flash_partitions part[],
- char chip_sel[][GPMC_CS_NUM], int nand_type)
+static inline struct gpmc_device_pdata **board_flash_init(
+ struct flash_partitions part[], char chip_sel[][GPMC_CS_NUM],
+ int nand_type, struct gpmc_device_pdata **gpmc_data)
{
+ return NULL;
}
#endif
--
1.7.10
More information about the linux-mtd
mailing list