mtd: mtdchar: handle chips that have user otp but no factory otp

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Fri Apr 5 08:59:02 EDT 2013


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=5dc63fa2c2e149dd3e8128e54c9ca251d0558ea0
Commit:     5dc63fa2c2e149dd3e8128e54c9ca251d0558ea0
Parent:     6b75152bbfce9bed30de44189d6032099c74c855
Author:     Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
AuthorDate: Mon Mar 4 17:35:24 2013 +0100
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Fri Apr 5 11:58:34 2013 +0100

    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 at pengutronix.de>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 drivers/mtd/mtdchar.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
index 92ab30a..c2b6729 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)
 {
 	struct mtd_info *mtd = mfi->mtd;
 	size_t retlen;
-	int ret = 0;
-
-	/*
-	 * Make a fake call to mtd_read_fact_prot_reg() to check if OTP
-	 * operations are supported.
-	 */
-	if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) == -EOPNOTSUPP)
-		return -EOPNOTSUPP;
 
 	switch (mode) {
 	case MTD_OTP_FACTORY:
+		if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) ==
+				-EOPNOTSUPP)
+			return -EOPNOTSUPP;
+
 		mfi->mode = MTD_FILE_MODE_OTP_FACTORY;
 		break;
 	case MTD_OTP_USER:
+		if (mtd_read_user_prot_reg(mtd, -1, 0, &retlen, NULL) ==
+				-EOPNOTSUPP)
+			return -EOPNOTSUPP;
+
 		mfi->mode = MTD_FILE_MODE_OTP_USER;
 		break;
-	default:
-		ret = -EINVAL;
 	case MTD_OTP_OFF:
+		mfi->mode = MTD_FILE_MODE_NORMAL;
 		break;
+	default:
+		return -EINVAL;
 	}
-	return ret;
+
+	return 0;
 }
 #else
 # define otp_select_filemode(f,m)	-EOPNOTSUPP



More information about the linux-mtd-cvs mailing list