diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2013-03-04 11:35:24 -0500 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2013-04-05 06:58:34 -0400 |
commit | 5dc63fa2c2e149dd3e8128e54c9ca251d0558ea0 (patch) | |
tree | bd41eea01066cec5f1babbb43c7b839eafed13b6 /drivers/mtd/mtdchar.c | |
parent | 6b75152bbfce9bed30de44189d6032099c74c855 (diff) |
mtd: mtdchar: handle chips that have user otp but no factory otp
Before this patch mtd_read_fact_prot_reg was used to check availability
for both MTD_OTP_FACTORY and MTD_OTP_USER access. This made accessing
user otp for chips that don't have a factory otp area impossible. So use
the right wrapper depending on the intended area to be accessed.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/mtdchar.c')
-rw-r--r-- | drivers/mtd/mtdchar.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c index 92ab30ab00dc..c2b6729da496 100644 --- a/drivers/mtd/mtdchar.c +++ b/drivers/mtd/mtdchar.c | |||
@@ -370,28 +370,30 @@ static int otp_select_filemode(struct mtd_file_info *mfi, int mode) | |||
370 | { | 370 | { |
371 | struct mtd_info *mtd = mfi->mtd; | 371 | struct mtd_info *mtd = mfi->mtd; |
372 | size_t retlen; | 372 | size_t retlen; |
373 | int ret = 0; | ||
374 | |||
375 | /* | ||
376 | * Make a fake call to mtd_read_fact_prot_reg() to check if OTP | ||
377 | * operations are supported. | ||
378 | */ | ||
379 | if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) == -EOPNOTSUPP) | ||
380 | return -EOPNOTSUPP; | ||
381 | 373 | ||
382 | switch (mode) { | 374 | switch (mode) { |
383 | case MTD_OTP_FACTORY: | 375 | case MTD_OTP_FACTORY: |
376 | if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) == | ||
377 | -EOPNOTSUPP) | ||
378 | return -EOPNOTSUPP; | ||
379 | |||
384 | mfi->mode = MTD_FILE_MODE_OTP_FACTORY; | 380 | mfi->mode = MTD_FILE_MODE_OTP_FACTORY; |
385 | break; | 381 | break; |
386 | case MTD_OTP_USER: | 382 | case MTD_OTP_USER: |
383 | if (mtd_read_user_prot_reg(mtd, -1, 0, &retlen, NULL) == | ||
384 | -EOPNOTSUPP) | ||
385 | return -EOPNOTSUPP; | ||
386 | |||
387 | mfi->mode = MTD_FILE_MODE_OTP_USER; | 387 | mfi->mode = MTD_FILE_MODE_OTP_USER; |
388 | break; | 388 | break; |
389 | default: | ||
390 | ret = -EINVAL; | ||
391 | case MTD_OTP_OFF: | 389 | case MTD_OTP_OFF: |
390 | mfi->mode = MTD_FILE_MODE_NORMAL; | ||
392 | break; | 391 | break; |
392 | default: | ||
393 | return -EINVAL; | ||
393 | } | 394 | } |
394 | return ret; | 395 | |
396 | return 0; | ||
395 | } | 397 | } |
396 | #else | 398 | #else |
397 | # define otp_select_filemode(f,m) -EOPNOTSUPP | 399 | # define otp_select_filemode(f,m) -EOPNOTSUPP |