diff options
author | Brian Norris <computersforpeace@gmail.com> | 2012-05-02 13:14:55 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-05-14 00:20:00 -0400 |
commit | 1fbb938dff5b6bb4514a4e7600276b03c7f08e25 (patch) | |
tree | 49ab8089580041bcbd767ff7a57aa7188ee6b6c0 /drivers/mtd/nand/gpmi-nand | |
parent | b4f7aa84d6ff44327ab91a2973ebf0c2a7797d24 (diff) |
mtd: nand: add 'oob_required' argument to NAND {read,write}_page interfaces
New NAND controllers can perform read/write via HW engines which don't expose
OOB data in their DMA mode. To reflect this, we should rework the nand_chip /
nand_ecc_ctrl interfaces that assume that drivers will always read/write OOB
data in the nand_chip.oob_poi buffer. A better interface includes a boolean
argument that explicitly tells the callee when OOB data is requested by the
calling layer (for reading/writing to/from nand_chip.oob_poi).
This patch adds the 'oob_required' parameter to each relevant {read,write}_page
interface; all 'oob_required' parameters are left unused for now. The next
patch will set the parameter properly in the nand_base.c callers, and follow-up
patches will make use of 'oob_required' in some of the callee functions.
Note that currently, there is no harm in ignoring the 'oob_required' parameter
and *always* utilizing nand_chip.oob_poi, but there can be
performance/complexity/design benefits from avoiding filling oob_poi in the
common case. I will try to implement this for some drivers which can be ported
easily.
Note: I couldn't compile-test all of these easily, as some had ARCH
dependencies.
[dwmw2: Merge later 1/0 vs. true/false cleanup]
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Reviewed-by: Shmulik Ladkani <shmulik.ladkani@gmail.com>
Acked-by: Jiandong Zheng <jdzheng@broadcom.com>
Acked-by: Mike Dunn <mikedunn@newsguy.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand/gpmi-nand')
-rw-r--r-- | drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 9ec51cec2e14..d85a2c1fad54 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c | |||
@@ -842,7 +842,7 @@ static void block_mark_swapping(struct gpmi_nand_data *this, | |||
842 | } | 842 | } |
843 | 843 | ||
844 | static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, | 844 | static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip, |
845 | uint8_t *buf, int page) | 845 | uint8_t *buf, int oob_required, int page) |
846 | { | 846 | { |
847 | struct gpmi_nand_data *this = chip->priv; | 847 | struct gpmi_nand_data *this = chip->priv; |
848 | struct bch_geometry *nfc_geo = &this->bch_geometry; | 848 | struct bch_geometry *nfc_geo = &this->bch_geometry; |
@@ -928,8 +928,8 @@ exit_nfc: | |||
928 | return ret; | 928 | return ret; |
929 | } | 929 | } |
930 | 930 | ||
931 | static void gpmi_ecc_write_page(struct mtd_info *mtd, | 931 | static void gpmi_ecc_write_page(struct mtd_info *mtd, struct nand_chip *chip, |
932 | struct nand_chip *chip, const uint8_t *buf) | 932 | const uint8_t *buf, int oob_required) |
933 | { | 933 | { |
934 | struct gpmi_nand_data *this = chip->priv; | 934 | struct gpmi_nand_data *this = chip->priv; |
935 | struct bch_geometry *nfc_geo = &this->bch_geometry; | 935 | struct bch_geometry *nfc_geo = &this->bch_geometry; |
@@ -1309,7 +1309,7 @@ static int mx23_write_transcription_stamp(struct gpmi_nand_data *this) | |||
1309 | /* Write the first page of the current stride. */ | 1309 | /* Write the first page of the current stride. */ |
1310 | dev_dbg(dev, "Writing an NCB fingerprint in page 0x%x\n", page); | 1310 | dev_dbg(dev, "Writing an NCB fingerprint in page 0x%x\n", page); |
1311 | chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); | 1311 | chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); |
1312 | chip->ecc.write_page_raw(mtd, chip, buffer); | 1312 | chip->ecc.write_page_raw(mtd, chip, buffer, 0); |
1313 | chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); | 1313 | chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); |
1314 | 1314 | ||
1315 | /* Wait for the write to finish. */ | 1315 | /* Wait for the write to finish. */ |