From 169c3902403efb11e405ddad05a08724f69237e7 Mon Sep 17 00:00:00 2001 From: Zhaoyifeng Date: Fri, 1 Dec 2017 11:00:53 +0800 Subject: [PATCH] drivers: rk_nand: support global partition table The driver will check cmdline mtd partition table first, if there is no mtd partition table, then the driver will add nand block device and set gd flag GENHD_FL_EXT_DEVT. Change-Id: I262c935a2fac89c2a203dac9b8e90133317860f8 Signed-off-by: Zhaoyifeng --- drivers/rk_nand/rk_nand_blk.c | 41 +++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/rk_nand/rk_nand_blk.c b/drivers/rk_nand/rk_nand_blk.c index 78b87801067e..f01370c91167 100644 --- a/drivers/rk_nand/rk_nand_blk.c +++ b/drivers/rk_nand/rk_nand_blk.c @@ -468,7 +468,10 @@ static int nand_prase_cmdline_part(struct nand_part *pdisk_part) unsigned int cap_size = rk_ftl_get_capacity(); char *cmdline; - cmdline = strstr(saved_command_line, "mtdparts=") + 9; + cmdline = strstr(saved_command_line, "mtdparts="); + if (!cmdline) + return 0; + cmdline += 9; if (!memcmp(cmdline, "rk29xxnand:", strlen("rk29xxnand:"))) { pbuf = cmdline + strlen("rk29xxnand:"); rknand_get_part(pbuf, pdisk_part, &part_num); @@ -578,6 +581,7 @@ static int nand_add_dev(struct nand_blk_ops *nandr, struct nand_part *part) gd->major = nandr->major; gd->first_minor = (dev->devnum) << nandr->minorbits; + gd->fops = &nand_blktrans_ops; if (part->name[0]) @@ -599,6 +603,15 @@ static int nand_add_dev(struct nand_blk_ops *nandr, struct nand_part *part) dev->blkcore_priv = gd; gd->queue = nandr->rq; gd->queue->bypass_depth = 1; + if (part->size == rk_ftl_get_capacity()) { + gd->flags = GENHD_FL_EXT_DEVT; + gd->minors = 255; + snprintf(gd->disk_name, + sizeof(gd->disk_name), + "%s%d", + nandr->name, + dev->devnum); + } if (part->type == PART_NO_ACCESS) dev->disable_access = 1; @@ -646,7 +659,8 @@ static int nand_blk_register(struct nand_blk_ops *nandr) { struct task_struct *tsk; int i, ret; - int offset; + u32 offset; + u32 part_size; rk_nand_schedule_enable_config(1); nandr->quit = 0; @@ -681,15 +695,20 @@ static int nand_blk_register(struct nand_blk_ops *nandr) tsk = kthread_run(nand_blktrans_thread, (void *)nandr, "rknand"); g_max_part_num = nand_prase_cmdline_part(disk_array); - offset = 0; - nandr->last_dev_index = 0; - for (i = 0; i < g_max_part_num; i++) { - pr_info("%10s: 0x%09llx -- 0x%09llx (%llu MB)\n", - disk_array[i].name, - (u64)disk_array[i].offset * 512, - (u64)(disk_array[i].offset + disk_array[i].size) * 512, - (u64)disk_array[i].size / 2048); - nand_add_dev(nandr, &disk_array[i]); + if (g_max_part_num) { + offset = 0; + nandr->last_dev_index = 0; + for (i = 0; i < g_max_part_num; i++) { + part_size = (disk_array[i].offset + disk_array[i].size); + pr_info("%10s: 0x%09llx -- 0x%09llx (%llu MB)\n", + disk_array[i].name, + (u64)disk_array[i].offset * 512, + (u64)part_size * 512, + (u64)disk_array[i].size / 2048); + nand_add_dev(nandr, &disk_array[i]); + } + } else { + nand_blk_add_whole_disk(); } rknand_create_procfs();