From 79012fdf2c52f52f85170ac775276d50ac828ef7 Mon Sep 17 00:00:00 2001 From: Han Xu Date: Wed, 21 Oct 2015 11:43:55 -0500 Subject: [PATCH] MLK-11747: mtd: gpmi: save bch geometry setting only in initial stage fix the bch setting issue when system suspend/resume, the bch geometry only need to be saved to debugfs in driver initial stage Signed-off-by: Han Xu (cherry picked from commit 3b4f7178854e428fb5ef08d554b13abe4f27c533) --- drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 36 +++++++++++++++----------- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 5 ++++ drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 1 + 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c index b8a753b0471c..437e83504edb 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c @@ -254,6 +254,27 @@ void gpmi_dump_info(struct gpmi_nand_data *this) geo->block_mark_bit_offset); } +int bch_save_geometry(struct gpmi_nand_data *this) +{ + struct bch_geometry *bch_geo = &this->bch_geometry; + struct dentry *dbg_root; + + dbg_root = debugfs_create_dir("gpmi-nand", NULL); + if (!dbg_root) { + dev_err(this->dev, "failed to create debug directory\n"); + return -EINVAL; + } + + dbg_bch_geo.data = (void *)bch_geo; + dbg_bch_geo.size = sizeof(struct bch_geometry); + if (!debugfs_create_blob("bch_geometry", S_IRUGO, + dbg_root, &dbg_bch_geo)) { + dev_err(this->dev, "failed to create debug bch geometry\n"); + return -EINVAL; + } + return 0; +} + /* Configures the geometry for BCH. */ int bch_set_geometry(struct gpmi_nand_data *this) { @@ -267,7 +288,6 @@ int bch_set_geometry(struct gpmi_nand_data *this) unsigned int page_size; unsigned int gf_len; int ret; - struct dentry *dbg_root; if (common_nfc_set_geometry(this)) return !0; @@ -280,20 +300,6 @@ int bch_set_geometry(struct gpmi_nand_data *this) page_size = bch_geo->page_size; gf_len = bch_geo->gf_len; - dbg_root = debugfs_create_dir("gpmi-nand", NULL); - if (!dbg_root) { - dev_err(this->dev, "failed to create debug directory\n"); - return -EINVAL; - } - - dbg_bch_geo.data = (void *)bch_geo; - dbg_bch_geo.size = sizeof(struct bch_geometry); - if (!debugfs_create_blob("bch_geometry", S_IRUGO, - dbg_root, &dbg_bch_geo)) { - dev_err(this->dev, "failed to create debug bch geometry\n"); - return -EINVAL; - } - ret = pm_runtime_get_sync(this->dev); if (ret < 0) { dev_err(this->dev, "Failed to enable clock\n"); diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index feaa24913c07..922f868460bc 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -2200,6 +2200,11 @@ static int gpmi_init_last(struct gpmi_nand_data *this) if (ret) return ret; + /* Save the geometry to debugfs*/ + ret = bch_save_geometry(this); + if (ret) + return ret; + /* Init the nand_ecc_ctrl{} */ ecc->read_page = gpmi_ecc_read_page; ecc->write_page = gpmi_ecc_write_page; diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h index db60deacb160..e0d2d89bee29 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.h +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.h @@ -287,6 +287,7 @@ extern int gpmi_init(struct gpmi_nand_data *); extern int gpmi_extra_init(struct gpmi_nand_data *); extern void gpmi_clear_bch(struct gpmi_nand_data *); extern void gpmi_dump_info(struct gpmi_nand_data *); +extern int bch_save_geometry(struct gpmi_nand_data *); extern int bch_set_geometry(struct gpmi_nand_data *); extern int gpmi_is_ready(struct gpmi_nand_data *, unsigned chip); extern int gpmi_send_command(struct gpmi_nand_data *); -- 2.17.1