aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2011-12-23 11:27:05 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-01-09 13:25:23 -0500
commitfd2819bbc92fc98bed5d612e4acbe16b6326f6bf (patch)
tree114f2a130cb854c74707eb805854fe048f65ac14
parent7ae79d7ff1769a3e9c47076b46e4eaa11204a2ee (diff)
mtd: introduce mtd_read_oob interface
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/mtd/inftlcore.c2
-rw-r--r--drivers/mtd/mtdchar.c4
-rw-r--r--drivers/mtd/mtdconcat.c2
-rw-r--r--drivers/mtd/mtdpart.c2
-rw-r--r--drivers/mtd/mtdswap.c4
-rw-r--r--drivers/mtd/nand/nand_bbt.c6
-rw-r--r--drivers/mtd/nftlcore.c2
-rw-r--r--drivers/mtd/sm_ftl.c2
-rw-r--r--drivers/mtd/ssfdc.c2
-rw-r--r--drivers/mtd/tests/mtd_oobtest.c14
-rw-r--r--drivers/mtd/tests/mtd_readtest.c2
-rw-r--r--drivers/staging/spectra/lld_mtd.c12
-rw-r--r--fs/jffs2/wbuf.c4
-rw-r--r--include/linux/mtd/mtd.h10
14 files changed, 37 insertions, 31 deletions
diff --git a/drivers/mtd/inftlcore.c b/drivers/mtd/inftlcore.c
index 0b038bed7b9c..07646e1273e2 100644
--- a/drivers/mtd/inftlcore.c
+++ b/drivers/mtd/inftlcore.c
@@ -158,7 +158,7 @@ int inftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len,
158 ops.oobbuf = buf; 158 ops.oobbuf = buf;
159 ops.datbuf = NULL; 159 ops.datbuf = NULL;
160 160
161 res = mtd->read_oob(mtd, offs & ~(mtd->writesize - 1), &ops); 161 res = mtd_read_oob(mtd, offs & ~(mtd->writesize - 1), &ops);
162 *retlen = ops.oobretlen; 162 *retlen = ops.oobretlen;
163 return res; 163 return res;
164} 164}
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
index 922da31d2c6b..e74f570a7b93 100644
--- a/drivers/mtd/mtdchar.c
+++ b/drivers/mtd/mtdchar.c
@@ -227,7 +227,7 @@ static ssize_t mtdchar_read(struct file *file, char __user *buf, size_t count,
227 ops.oobbuf = NULL; 227 ops.oobbuf = NULL;
228 ops.len = len; 228 ops.len = len;
229 229
230 ret = mtd->read_oob(mtd, *ppos, &ops); 230 ret = mtd_read_oob(mtd, *ppos, &ops);
231 retlen = ops.retlen; 231 retlen = ops.retlen;
232 break; 232 break;
233 } 233 }
@@ -471,7 +471,7 @@ static int mtdchar_readoob(struct file *file, struct mtd_info *mtd,
471 return -ENOMEM; 471 return -ENOMEM;
472 472
473 start &= ~((uint64_t)mtd->writesize - 1); 473 start &= ~((uint64_t)mtd->writesize - 1);
474 ret = mtd->read_oob(mtd, start, &ops); 474 ret = mtd_read_oob(mtd, start, &ops);
475 475
476 if (put_user(ops.oobretlen, retp)) 476 if (put_user(ops.oobretlen, retp))
477 ret = -EFAULT; 477 ret = -EFAULT;
diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c
index 45215501c4c7..cf35642e5f49 100644
--- a/drivers/mtd/mtdconcat.c
+++ b/drivers/mtd/mtdconcat.c
@@ -273,7 +273,7 @@ concat_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)
273 if (from + devops.len > subdev->size) 273 if (from + devops.len > subdev->size)
274 devops.len = subdev->size - from; 274 devops.len = subdev->size - from;
275 275
276 err = subdev->read_oob(subdev, from, &devops); 276 err = mtd_read_oob(subdev, from, &devops);
277 ops->retlen += devops.retlen; 277 ops->retlen += devops.retlen;
278 ops->oobretlen += devops.oobretlen; 278 ops->oobretlen += devops.oobretlen;
279 279
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 9ed58f7d7466..6fdc74ef19c1 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -138,7 +138,7 @@ static int part_read_oob(struct mtd_info *mtd, loff_t from,
138 return -EINVAL; 138 return -EINVAL;
139 } 139 }
140 140
141 res = part->master->read_oob(part->master, from + part->offset, ops); 141 res = mtd_read_oob(part->master, from + part->offset, ops);
142 if (unlikely(res)) { 142 if (unlikely(res)) {
143 if (mtd_is_bitflip(res)) 143 if (mtd_is_bitflip(res))
144 mtd->ecc_stats.corrected++; 144 mtd->ecc_stats.corrected++;
diff --git a/drivers/mtd/mtdswap.c b/drivers/mtd/mtdswap.c
index 6ff823e29c0c..0f0ab18d4405 100644
--- a/drivers/mtd/mtdswap.c
+++ b/drivers/mtd/mtdswap.c
@@ -312,7 +312,7 @@ static int mtdswap_handle_write_error(struct mtdswap_dev *d, struct swap_eb *eb)
312static int mtdswap_read_oob(struct mtdswap_dev *d, loff_t from, 312static int mtdswap_read_oob(struct mtdswap_dev *d, loff_t from,
313 struct mtd_oob_ops *ops) 313 struct mtd_oob_ops *ops)
314{ 314{
315 int ret = d->mtd->read_oob(d->mtd, from, ops); 315 int ret = mtd_read_oob(d->mtd, from, ops);
316 316
317 if (mtd_is_bitflip(ret)) 317 if (mtd_is_bitflip(ret))
318 return ret; 318 return ret;
@@ -955,7 +955,7 @@ static unsigned int mtdswap_eblk_passes(struct mtdswap_dev *d,
955 955
956 pos = base; 956 pos = base;
957 for (i = 0; i < mtd_pages; i++) { 957 for (i = 0; i < mtd_pages; i++) {
958 ret = mtd->read_oob(mtd, pos, &ops); 958 ret = mtd_read_oob(mtd, pos, &ops);
959 if (ret) 959 if (ret)
960 goto error; 960 goto error;
961 961
diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 1bcd6bc6798c..fcab50e80b90 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -317,7 +317,7 @@ static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
317 ops.len = min(len, (size_t)mtd->writesize); 317 ops.len = min(len, (size_t)mtd->writesize);
318 ops.oobbuf = buf + ops.len; 318 ops.oobbuf = buf + ops.len;
319 319
320 res = mtd->read_oob(mtd, offs, &ops); 320 res = mtd_read_oob(mtd, offs, &ops);
321 321
322 if (res) 322 if (res)
323 return res; 323 return res;
@@ -434,7 +434,7 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
434 * Read the full oob until read_oob is fixed to handle single 434 * Read the full oob until read_oob is fixed to handle single
435 * byte reads for 16 bit buswidth. 435 * byte reads for 16 bit buswidth.
436 */ 436 */
437 ret = mtd->read_oob(mtd, offs, &ops); 437 ret = mtd_read_oob(mtd, offs, &ops);
438 /* Ignore ECC errors when checking for BBM */ 438 /* Ignore ECC errors when checking for BBM */
439 if (ret && !mtd_is_bitflip_or_eccerr(ret)) 439 if (ret && !mtd_is_bitflip_or_eccerr(ret))
440 return ret; 440 return ret;
@@ -769,7 +769,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
769 /* Read oob data */ 769 /* Read oob data */
770 ops.ooblen = (len >> this->page_shift) * mtd->oobsize; 770 ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
771 ops.oobbuf = &buf[len]; 771 ops.oobbuf = &buf[len];
772 res = mtd->read_oob(mtd, to + mtd->writesize, &ops); 772 res = mtd_read_oob(mtd, to + mtd->writesize, &ops);
773 if (res < 0 || ops.oobretlen != ops.ooblen) 773 if (res < 0 || ops.oobretlen != ops.ooblen)
774 goto outerr; 774 goto outerr;
775 775
diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c
index 1a9d9c1d3a74..7497f5efc26b 100644
--- a/drivers/mtd/nftlcore.c
+++ b/drivers/mtd/nftlcore.c
@@ -153,7 +153,7 @@ int nftl_read_oob(struct mtd_info *mtd, loff_t offs, size_t len,
153 ops.oobbuf = buf; 153 ops.oobbuf = buf;
154 ops.datbuf = NULL; 154 ops.datbuf = NULL;
155 155
156 res = mtd->read_oob(mtd, offs & ~mask, &ops); 156 res = mtd_read_oob(mtd, offs & ~mask, &ops);
157 *retlen = ops.oobretlen; 157 *retlen = ops.oobretlen;
158 return res; 158 return res;
159} 159}
diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
index 2f1acb1ab5e8..748aa4416691 100644
--- a/drivers/mtd/sm_ftl.c
+++ b/drivers/mtd/sm_ftl.c
@@ -278,7 +278,7 @@ again:
278 278
279 /* Unfortunately, oob read will _always_ succeed, 279 /* Unfortunately, oob read will _always_ succeed,
280 despite card removal..... */ 280 despite card removal..... */
281 ret = mtd->read_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); 281 ret = mtd_read_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops);
282 282
283 /* Test for unknown errors */ 283 /* Test for unknown errors */
284 if (ret != 0 && !mtd_is_bitflip_or_eccerr(ret)) { 284 if (ret != 0 && !mtd_is_bitflip_or_eccerr(ret)) {
diff --git a/drivers/mtd/ssfdc.c b/drivers/mtd/ssfdc.c
index 293e22a5710f..0e6881338357 100644
--- a/drivers/mtd/ssfdc.c
+++ b/drivers/mtd/ssfdc.c
@@ -175,7 +175,7 @@ static int read_raw_oob(struct mtd_info *mtd, loff_t offs, uint8_t *buf)
175 ops.oobbuf = buf; 175 ops.oobbuf = buf;
176 ops.datbuf = NULL; 176 ops.datbuf = NULL;
177 177
178 ret = mtd->read_oob(mtd, offs, &ops); 178 ret = mtd_read_oob(mtd, offs, &ops);
179 if (ret < 0 || ops.oobretlen != OOB_SIZE) 179 if (ret < 0 || ops.oobretlen != OOB_SIZE)
180 return -1; 180 return -1;
181 181
diff --git a/drivers/mtd/tests/mtd_oobtest.c b/drivers/mtd/tests/mtd_oobtest.c
index 7d52854c16dd..962d27a64e64 100644
--- a/drivers/mtd/tests/mtd_oobtest.c
+++ b/drivers/mtd/tests/mtd_oobtest.c
@@ -192,7 +192,7 @@ static int verify_eraseblock(int ebnum)
192 ops.ooboffs = use_offset; 192 ops.ooboffs = use_offset;
193 ops.datbuf = NULL; 193 ops.datbuf = NULL;
194 ops.oobbuf = readbuf; 194 ops.oobbuf = readbuf;
195 err = mtd->read_oob(mtd, addr, &ops); 195 err = mtd_read_oob(mtd, addr, &ops);
196 if (err || ops.oobretlen != use_len) { 196 if (err || ops.oobretlen != use_len) {
197 printk(PRINT_PREF "error: readoob failed at %#llx\n", 197 printk(PRINT_PREF "error: readoob failed at %#llx\n",
198 (long long)addr); 198 (long long)addr);
@@ -219,7 +219,7 @@ static int verify_eraseblock(int ebnum)
219 ops.ooboffs = 0; 219 ops.ooboffs = 0;
220 ops.datbuf = NULL; 220 ops.datbuf = NULL;
221 ops.oobbuf = readbuf; 221 ops.oobbuf = readbuf;
222 err = mtd->read_oob(mtd, addr, &ops); 222 err = mtd_read_oob(mtd, addr, &ops);
223 if (err || ops.oobretlen != mtd->ecclayout->oobavail) { 223 if (err || ops.oobretlen != mtd->ecclayout->oobavail) {
224 printk(PRINT_PREF "error: readoob failed at " 224 printk(PRINT_PREF "error: readoob failed at "
225 "%#llx\n", (long long)addr); 225 "%#llx\n", (long long)addr);
@@ -284,7 +284,7 @@ static int verify_eraseblock_in_one_go(int ebnum)
284 ops.ooboffs = 0; 284 ops.ooboffs = 0;
285 ops.datbuf = NULL; 285 ops.datbuf = NULL;
286 ops.oobbuf = readbuf; 286 ops.oobbuf = readbuf;
287 err = mtd->read_oob(mtd, addr, &ops); 287 err = mtd_read_oob(mtd, addr, &ops);
288 if (err || ops.oobretlen != len) { 288 if (err || ops.oobretlen != len) {
289 printk(PRINT_PREF "error: readoob failed at %#llx\n", 289 printk(PRINT_PREF "error: readoob failed at %#llx\n",
290 (long long)addr); 290 (long long)addr);
@@ -544,7 +544,7 @@ static int __init mtd_oobtest_init(void)
544 ops.oobbuf = readbuf; 544 ops.oobbuf = readbuf;
545 printk(PRINT_PREF "attempting to start read past end of OOB\n"); 545 printk(PRINT_PREF "attempting to start read past end of OOB\n");
546 printk(PRINT_PREF "an error is expected...\n"); 546 printk(PRINT_PREF "an error is expected...\n");
547 err = mtd->read_oob(mtd, addr0, &ops); 547 err = mtd_read_oob(mtd, addr0, &ops);
548 if (err) { 548 if (err) {
549 printk(PRINT_PREF "error occurred as expected\n"); 549 printk(PRINT_PREF "error occurred as expected\n");
550 err = 0; 550 err = 0;
@@ -588,7 +588,7 @@ static int __init mtd_oobtest_init(void)
588 ops.oobbuf = readbuf; 588 ops.oobbuf = readbuf;
589 printk(PRINT_PREF "attempting to read past end of device\n"); 589 printk(PRINT_PREF "attempting to read past end of device\n");
590 printk(PRINT_PREF "an error is expected...\n"); 590 printk(PRINT_PREF "an error is expected...\n");
591 err = mtd->read_oob(mtd, mtd->size - mtd->writesize, &ops); 591 err = mtd_read_oob(mtd, mtd->size - mtd->writesize, &ops);
592 if (err) { 592 if (err) {
593 printk(PRINT_PREF "error occurred as expected\n"); 593 printk(PRINT_PREF "error occurred as expected\n");
594 err = 0; 594 err = 0;
@@ -632,7 +632,7 @@ static int __init mtd_oobtest_init(void)
632 ops.oobbuf = readbuf; 632 ops.oobbuf = readbuf;
633 printk(PRINT_PREF "attempting to read past end of device\n"); 633 printk(PRINT_PREF "attempting to read past end of device\n");
634 printk(PRINT_PREF "an error is expected...\n"); 634 printk(PRINT_PREF "an error is expected...\n");
635 err = mtd->read_oob(mtd, mtd->size - mtd->writesize, &ops); 635 err = mtd_read_oob(mtd, mtd->size - mtd->writesize, &ops);
636 if (err) { 636 if (err) {
637 printk(PRINT_PREF "error occurred as expected\n"); 637 printk(PRINT_PREF "error occurred as expected\n");
638 err = 0; 638 err = 0;
@@ -698,7 +698,7 @@ static int __init mtd_oobtest_init(void)
698 ops.ooboffs = 0; 698 ops.ooboffs = 0;
699 ops.datbuf = NULL; 699 ops.datbuf = NULL;
700 ops.oobbuf = readbuf; 700 ops.oobbuf = readbuf;
701 err = mtd->read_oob(mtd, addr, &ops); 701 err = mtd_read_oob(mtd, addr, &ops);
702 if (err) 702 if (err)
703 goto out; 703 goto out;
704 if (memcmp(readbuf, writebuf, mtd->ecclayout->oobavail * 2)) { 704 if (memcmp(readbuf, writebuf, mtd->ecclayout->oobavail * 2)) {
diff --git a/drivers/mtd/tests/mtd_readtest.c b/drivers/mtd/tests/mtd_readtest.c
index 0c58d2976c76..5eaeada84284 100644
--- a/drivers/mtd/tests/mtd_readtest.c
+++ b/drivers/mtd/tests/mtd_readtest.c
@@ -74,7 +74,7 @@ static int read_eraseblock_by_page(int ebnum)
74 ops.ooboffs = 0; 74 ops.ooboffs = 0;
75 ops.datbuf = NULL; 75 ops.datbuf = NULL;
76 ops.oobbuf = oobbuf; 76 ops.oobbuf = oobbuf;
77 ret = mtd->read_oob(mtd, addr, &ops); 77 ret = mtd_read_oob(mtd, addr, &ops);
78 if ((ret && !mtd_is_bitflip(ret)) || 78 if ((ret && !mtd_is_bitflip(ret)) ||
79 ops.oobretlen != mtd->oobsize) { 79 ops.oobretlen != mtd->oobsize) {
80 printk(PRINT_PREF "error: read oob failed at " 80 printk(PRINT_PREF "error: read oob failed at "
diff --git a/drivers/staging/spectra/lld_mtd.c b/drivers/staging/spectra/lld_mtd.c
index 2eb032131960..ed8e5f067087 100644
--- a/drivers/staging/spectra/lld_mtd.c
+++ b/drivers/staging/spectra/lld_mtd.c
@@ -351,9 +351,9 @@ u16 mtd_Read_Page_Main_Spare(u8 *read_data, u32 Block,
351 ops.ooblen = BTSIG_BYTES; 351 ops.ooblen = BTSIG_BYTES;
352 ops.ooboffs = 0; 352 ops.ooboffs = 0;
353 353
354 ret = spectra_mtd->read_oob(spectra_mtd, 354 ret = mtd_read_oob(spectra_mtd,
355 (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), 355 (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize),
356 &ops); 356 &ops);
357 if (ret) { 357 if (ret) {
358 printk(KERN_ERR "%s failed %d\n", __func__, ret); 358 printk(KERN_ERR "%s failed %d\n", __func__, ret);
359 return FAIL; 359 return FAIL;
@@ -484,9 +484,9 @@ u16 mtd_Read_Page_Spare(u8 *read_data, u32 Block,
484 ops.ooblen = BTSIG_BYTES; 484 ops.ooblen = BTSIG_BYTES;
485 ops.ooboffs = 0; 485 ops.ooboffs = 0;
486 486
487 ret = spectra_mtd->read_oob(spectra_mtd, 487 ret = mtd_read_oob(spectra_mtd,
488 (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize), 488 (Block * spectra_mtd->erasesize) + (Page * spectra_mtd->writesize),
489 &ops); 489 &ops);
490 if (ret) { 490 if (ret) {
491 printk(KERN_ERR "%s failed %d\n", __func__, ret); 491 printk(KERN_ERR "%s failed %d\n", __func__, ret);
492 return FAIL; 492 return FAIL;
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 3ea2f8db9358..efc0cb370306 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -1032,7 +1032,7 @@ int jffs2_check_oob_empty(struct jffs2_sb_info *c,
1032 ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; 1032 ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0;
1033 ops.datbuf = NULL; 1033 ops.datbuf = NULL;
1034 1034
1035 ret = c->mtd->read_oob(c->mtd, jeb->offset, &ops); 1035 ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
1036 if (ret || ops.oobretlen != ops.ooblen) { 1036 if (ret || ops.oobretlen != ops.ooblen) {
1037 printk(KERN_ERR "cannot read OOB for EB at %08x, requested %zd" 1037 printk(KERN_ERR "cannot read OOB for EB at %08x, requested %zd"
1038 " bytes, read %zd bytes, error %d\n", 1038 " bytes, read %zd bytes, error %d\n",
@@ -1075,7 +1075,7 @@ int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c,
1075 ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; 1075 ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0;
1076 ops.datbuf = NULL; 1076 ops.datbuf = NULL;
1077 1077
1078 ret = c->mtd->read_oob(c->mtd, jeb->offset, &ops); 1078 ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
1079 if (ret || ops.oobretlen != ops.ooblen) { 1079 if (ret || ops.oobretlen != ops.ooblen) {
1080 printk(KERN_ERR "cannot read OOB for EB at %08x, requested %zd" 1080 printk(KERN_ERR "cannot read OOB for EB at %08x, requested %zd"
1081 " bytes, read %zd bytes, error %d\n", 1081 " bytes, read %zd bytes, error %d\n",
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 2fb83cd3d264..0db8d87ce451 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -188,6 +188,8 @@ struct mtd_info {
188 size_t *retlen, const u_char *buf); 188 size_t *retlen, const u_char *buf);
189 int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len, 189 int (*panic_write) (struct mtd_info *mtd, loff_t to, size_t len,
190 size_t *retlen, const u_char *buf); 190 size_t *retlen, const u_char *buf);
191 int (*read_oob) (struct mtd_info *mtd, loff_t from,
192 struct mtd_oob_ops *ops);
191 193
192 /* Backing device capabilities for this device 194 /* Backing device capabilities for this device
193 * - provides mmap capabilities 195 * - provides mmap capabilities
@@ -195,8 +197,6 @@ struct mtd_info {
195 struct backing_dev_info *backing_dev_info; 197 struct backing_dev_info *backing_dev_info;
196 198
197 199
198 int (*read_oob) (struct mtd_info *mtd, loff_t from,
199 struct mtd_oob_ops *ops);
200 int (*write_oob) (struct mtd_info *mtd, loff_t to, 200 int (*write_oob) (struct mtd_info *mtd, loff_t to,
201 struct mtd_oob_ops *ops); 201 struct mtd_oob_ops *ops);
202 202
@@ -320,6 +320,12 @@ static inline int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
320 return mtd->panic_write(mtd, to, len, retlen, buf); 320 return mtd->panic_write(mtd, to, len, retlen, buf);
321} 321}
322 322
323static inline int mtd_read_oob(struct mtd_info *mtd, loff_t from,
324 struct mtd_oob_ops *ops)
325{
326 return mtd->read_oob(mtd, from, ops);
327}
328
323static inline struct mtd_info *dev_to_mtd(struct device *dev) 329static inline struct mtd_info *dev_to_mtd(struct device *dev)
324{ 330{
325 return dev ? dev_get_drvdata(dev) : NULL; 331 return dev ? dev_get_drvdata(dev) : NULL;