
Hi Boris,
Boris Brezillon boris.brezillon@bootlin.com wrote on Thu, 12 Jul 2018 00:20:52 +0200:
On Wed, 11 Jul 2018 17:25:12 +0200 Miquel Raynal miquel.raynal@bootlin.com wrote:
Some MTD sublayers/drivers are implementing ->_read/write() and not ->_read/write_oob().
While for NAND devices both are usually valid, for NOR devices, using the _oob variant has no real meaning. But, as the MTD layer is supposed to hide as much as possible the flash complexity to the user, there is no reason to error out while it is just a matter of rewritting things internally.
Add a fallback on mtd->_read() (resp. mtd->_write()) when the user calls mtd_read_oob() (resp. mtd_write_oob()) while mtd->_read_oob() (resp. mtd->_write_oob) is not implemented. There is already a fallback on the _oob variant if the former is used.
Now I'm jealous. Can we have the same thing Linux :-).
U-Boot, one step ahead ;)
Signed-off-by: Miquel Raynal miquel.raynal@bootlin.com
drivers/mtd/mtdcore.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index ba170f212e..095c58cf8c 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -1048,20 +1048,27 @@ int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) { int ret_code; ops->retlen = ops->oobretlen = 0;
if (!mtd->_read_oob)
return -EOPNOTSUPP;
ret_code = mtd_check_oob_ops(mtd, from, ops); if (ret_code) return ret_code;
- /* Check the validity of a potential fallback on mtd->_read */
- if ((!mtd->_read_oob) && (!mtd->_read || ops->oobbuf))
Parens around !mtd->_read_oob are not needed.
[...]
- return mtd->_write_oob(mtd, to, ops);
- /* Check the validity of a potential fallback on mtd->_write */
- if ((!mtd->_write_oob) && (!mtd->_write || ops->oobbuf))
Ditto.
Right!
Thanks, Miquèl