92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 410a91f6efa1c4c3c4369d1dd2c31286749dff33 Mon Sep 17 00:00:00 2001
 | 
						|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
 | 
						|
Date: Wed, 23 Mar 2016 11:19:01 +0100
 | 
						|
Subject: [PATCH 073/102] of: mtd: prepare helper reading NAND ECC algo from
 | 
						|
 DT
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Type: text/plain; charset=UTF-8
 | 
						|
Content-Transfer-Encoding: 8bit
 | 
						|
 | 
						|
NAND subsystem is being slightly reworked to store ECC details in
 | 
						|
separated fields. In future we'll want to add support for more DT
 | 
						|
properties as specifying every possible setup with a single
 | 
						|
"nand-ecc-mode" is a pretty bad idea.
 | 
						|
To allow this let's add a helper that will support something like
 | 
						|
"nand-ecc-algo" in future. Right now we use it for keeping backward
 | 
						|
compatibility.
 | 
						|
 | 
						|
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 | 
						|
Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
 | 
						|
---
 | 
						|
 drivers/of/of_mtd.c    |   36 ++++++++++++++++++++++++++++++++++++
 | 
						|
 include/linux/of_mtd.h |    6 ++++++
 | 
						|
 2 files changed, 42 insertions(+)
 | 
						|
 | 
						|
--- a/drivers/of/of_mtd.c
 | 
						|
+++ b/drivers/of/of_mtd.c
 | 
						|
@@ -50,6 +50,42 @@ int of_get_nand_ecc_mode(struct device_n
 | 
						|
 EXPORT_SYMBOL_GPL(of_get_nand_ecc_mode);
 | 
						|
 
 | 
						|
 /**
 | 
						|
+ * of_get_nand_ecc_algo - Get nand ecc algorithm for given device_node
 | 
						|
+ * @np:	Pointer to the given device_node
 | 
						|
+ *
 | 
						|
+ * The function gets ecc algorithm and returns its enum value, or errno in error
 | 
						|
+ * case.
 | 
						|
+ */
 | 
						|
+int of_get_nand_ecc_algo(struct device_node *np)
 | 
						|
+{
 | 
						|
+	const char *pm;
 | 
						|
+	int err;
 | 
						|
+
 | 
						|
+	/*
 | 
						|
+	 * TODO: Read ECC algo OF property and map it to enum nand_ecc_algo.
 | 
						|
+	 * It's not implemented yet as currently NAND subsystem ignores
 | 
						|
+	 * algorithm explicitly set this way. Once it's handled we should
 | 
						|
+	 * document & support new property.
 | 
						|
+	 */
 | 
						|
+
 | 
						|
+	/*
 | 
						|
+	 * For backward compatibility we also read "nand-ecc-mode" checking
 | 
						|
+	 * for some obsoleted values that were specifying ECC algorithm.
 | 
						|
+	 */
 | 
						|
+	err = of_property_read_string(np, "nand-ecc-mode", &pm);
 | 
						|
+	if (err < 0)
 | 
						|
+		return err;
 | 
						|
+
 | 
						|
+	if (!strcasecmp(pm, "soft"))
 | 
						|
+		return NAND_ECC_HAMMING;
 | 
						|
+	else if (!strcasecmp(pm, "soft_bch"))
 | 
						|
+		return NAND_ECC_BCH;
 | 
						|
+
 | 
						|
+	return -ENODEV;
 | 
						|
+}
 | 
						|
+EXPORT_SYMBOL_GPL(of_get_nand_ecc_algo);
 | 
						|
+
 | 
						|
+/**
 | 
						|
  * of_get_nand_ecc_step_size - Get ECC step size associated to
 | 
						|
  * the required ECC strength (see below).
 | 
						|
  * @np:	Pointer to the given device_node
 | 
						|
--- a/include/linux/of_mtd.h
 | 
						|
+++ b/include/linux/of_mtd.h
 | 
						|
@@ -13,6 +13,7 @@
 | 
						|
 
 | 
						|
 #include <linux/of.h>
 | 
						|
 int of_get_nand_ecc_mode(struct device_node *np);
 | 
						|
+int of_get_nand_ecc_algo(struct device_node *np);
 | 
						|
 int of_get_nand_ecc_step_size(struct device_node *np);
 | 
						|
 int of_get_nand_ecc_strength(struct device_node *np);
 | 
						|
 int of_get_nand_bus_width(struct device_node *np);
 | 
						|
@@ -24,6 +25,11 @@ static inline int of_get_nand_ecc_mode(s
 | 
						|
 {
 | 
						|
 	return -ENOSYS;
 | 
						|
 }
 | 
						|
+
 | 
						|
+static inline int of_get_nand_ecc_algo(struct device_node *np)
 | 
						|
+{
 | 
						|
+	return -ENOSYS;
 | 
						|
+}
 | 
						|
 
 | 
						|
 static inline int of_get_nand_ecc_step_size(struct device_node *np)
 | 
						|
 {
 |