All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup
@ 2014-03-20 13:18 Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 1/4] mtd: devices: elm: check for hardware engine's design constraints Pekon Gupta
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:18 UTC (permalink / raw)
  To: Brian Norris; +Cc: Stefan Roese, linux-mtd, Pekon Gupta, Ezequiel Garcia

*changes v7 -> v8*
Incorporated feedbacks from Brian Norris <computersforpeace@gmail.com>
 - renamed ecc_step_bytes -> ecc_syndrome_size


*changes v6 -> v7*
Incorporated feedbacks from Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
 - using dev_err() instead of pr_err()
 - moved un-related addition of info->ecc_steps, info->ecc_step_bytes,
   info->ecc_step_size from [PATCH v6 1/4] into subsequent patches
 - dropped pr_fmt() change


*changes v5 -> v6*
[PATCH 02/04] minor cleanup

*changes v4 -> v5*
This patch series is split version from earlier series [1].
This series refactors and cleans ELM driver which is used by Hardware
based BCHx ecc-schemes.
 - Undo: introduction of 'struct mtd_info' and 'struct nand_chip'. Instead
         keep ELM driver independent of mtd_info and nand_chip structs and
         pass only required ECC configurations as elm_config() arguments
         elm_config(..., int ecc_steps, int ecc_step_size, int ecc_step_bytes)
 - Undo: re-writing of elm_load_syndrome() ECC register configurations.

*changes v3 -> v4 [1]*
 - in-corporated feedbacks from Brian Norris <computersforpeace@gmail.com>
 - updated: use 'pr_fmt(fmt)' to suffix DRIVER_NAME
 - removed: local 'eccsteps' in ELM driver, instead using nand_chip->ecc.steps
 - undo: irrelavant white-space changes

[1] http://lists.infradead.org/pipermail/linux-mtd/2013-November/050242.html

Pekon Gupta (4):
  mtd: devices: elm: check for hardware engine's design constraints
  mtd: devices: elm: clean elm_load_syndrome
  mtd: devices: elm: configure parallel channels based on ecc_steps
  mtd: devices: elm: update DRIVER_NAME as "omap-elm"

 drivers/mtd/devices/elm.c         | 43 ++++++++++++++++++++++++++++-----------
 drivers/mtd/nand/omap2.c          |  9 +++++---
 include/linux/platform_data/elm.h | 10 ++-------
 3 files changed, 39 insertions(+), 23 deletions(-)

-- 
1.8.5.1.163.gd7aced9

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v8 1/4] mtd: devices: elm: check for hardware engine's design constraints
  2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
@ 2014-03-20 13:18 ` Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome Pekon Gupta
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:18 UTC (permalink / raw)
  To: Brian Norris; +Cc: Stefan Roese, linux-mtd, Pekon Gupta, Ezequiel Garcia

ELM hardware engine is used by BCH ecc-schemes for detecting and locating ECC
errors. This patch adds the following checks for ELM hardware engine:

 - ELM internal buffers are of 1K,
   so it cannot process data with ecc-step-size > 1K.

 - ELM engine can execute upto maximum of 8 threads in parallel,
   so in *page-mode* (when complete page is processed in single iteration),
   ELM cannot support ecc-steps > 8.

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 drivers/mtd/devices/elm.c         | 13 ++++++++++++-
 drivers/mtd/nand/omap2.c          |  9 ++++++---
 include/linux/platform_data/elm.h |  3 ++-
 3 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c
index f160d2c..c51752a 100644
--- a/drivers/mtd/devices/elm.c
+++ b/drivers/mtd/devices/elm.c
@@ -103,7 +103,8 @@ static u32 elm_read_reg(struct elm_info *info, int offset)
  * @dev:	ELM device
  * @bch_type:	Type of BCH ecc
  */
-int elm_config(struct device *dev, enum bch_ecc bch_type)
+int elm_config(struct device *dev, enum bch_ecc bch_type,
+	int ecc_steps, int ecc_step_size, int ecc_syndrome_size)
 {
 	u32 reg_val;
 	struct elm_info *info = dev_get_drvdata(dev);
@@ -112,6 +113,16 @@ int elm_config(struct device *dev, enum bch_ecc bch_type)
 		dev_err(dev, "Unable to configure elm - device not probed?\n");
 		return -ENODEV;
 	}
+	/* ELM cannot detect ECC errors for chunks > 1KB */
+	if (ecc_step_size > ((ELM_ECC_SIZE + 1) / 2)) {
+		dev_err(dev, "unsupported config ecc-size=%d\n", ecc_step_size);
+		return -EINVAL;
+	}
+	/* ELM support 8 error syndrome process */
+	if (ecc_steps > ERROR_VECTOR_MAX) {
+		dev_err(dev, "unsupported config ecc-step=%d\n", ecc_steps);
+		return -EINVAL;
+	}
 
 	reg_val = (bch_type & ECC_BCH_LEVEL_MASK) | (ELM_ECC_SIZE << 16);
 	elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index ab9c472..6f9b339 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -1540,6 +1540,8 @@ static int is_elm_present(struct omap_nand_info *info,
 			struct device_node *elm_node, enum bch_ecc bch_type)
 {
 	struct platform_device *pdev;
+	struct nand_ecc_ctrl *ecc = &info->nand.ecc;
+	int err;
 	/* check whether elm-id is passed via DT */
 	if (!elm_node) {
 		pr_err("nand: error: ELM DT node not found\n");
@@ -1553,9 +1555,10 @@ static int is_elm_present(struct omap_nand_info *info,
 	}
 	/* ELM module available, now configure it */
 	info->elm_dev = &pdev->dev;
-	if (elm_config(info->elm_dev, bch_type))
-		return -ENODEV;
-	return 0;
+	err = elm_config(info->elm_dev, bch_type,
+		(info->mtd.writesize / ecc->size), ecc->size, ecc->bytes);
+
+	return err;
 }
 #endif /* CONFIG_MTD_NAND_ECC_BCH */
 
diff --git a/include/linux/platform_data/elm.h b/include/linux/platform_data/elm.h
index bf0a83b..6e37156 100644
--- a/include/linux/platform_data/elm.h
+++ b/include/linux/platform_data/elm.h
@@ -50,5 +50,6 @@ struct elm_errorvec {
 
 void elm_decode_bch_error_page(struct device *dev, u8 *ecc_calc,
 		struct elm_errorvec *err_vec);
-int elm_config(struct device *dev, enum bch_ecc bch_type);
+int elm_config(struct device *dev, enum bch_ecc bch_type,
+	int ecc_steps, int ecc_step_size, int ecc_syndrome_size);
 #endif /* __ELM_H */
-- 
1.8.5.1.163.gd7aced9

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome
  2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 1/4] mtd: devices: elm: check for hardware engine's design constraints Pekon Gupta
@ 2014-03-20 13:18 ` Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 3/4] mtd: devices: elm: configure parallel channels based on ecc_steps Pekon Gupta
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:18 UTC (permalink / raw)
  To: Brian Norris; +Cc: Stefan Roese, linux-mtd, Pekon Gupta, Ezequiel Garcia

This patch refactors elm_load_syndrome() to make it scalable for newer
ECC schemes by removing scheme specific macros (like ECC_BYTES*xx),
and instead using ECC control information passed during elm_config.

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 drivers/mtd/devices/elm.c         | 18 +++++++++++-------
 include/linux/platform_data/elm.h |  7 -------
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c
index c51752a..4fbfaf6 100644
--- a/drivers/mtd/devices/elm.c
+++ b/drivers/mtd/devices/elm.c
@@ -84,6 +84,7 @@ struct elm_info {
 	struct list_head list;
 	enum bch_ecc bch_type;
 	struct elm_registers elm_regs;
+	int ecc_syndrome_size;
 };
 
 static LIST_HEAD(elm_devices);
@@ -126,7 +127,8 @@ int elm_config(struct device *dev, enum bch_ecc bch_type,
 
 	reg_val = (bch_type & ECC_BCH_LEVEL_MASK) | (ELM_ECC_SIZE << 16);
 	elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
-	info->bch_type = bch_type;
+	info->bch_type		= bch_type;
+	info->ecc_syndrome_size	= ecc_syndrome_size;
 
 	return 0;
 }
@@ -175,10 +177,8 @@ static void elm_load_syndrome(struct elm_info *info,
 			elm_configure_page_mode(info, i, true);
 			offset = ELM_SYNDROME_FRAGMENT_0 +
 				SYNDROME_FRAGMENT_REG_SIZE * i;
-
-			/* BCH8 */
-			if (info->bch_type) {
-
+			switch (info->bch_type) {
+			case BCH8_ECC:
 				/* syndrome fragment 0 = ecc[9-12B] */
 				val = cpu_to_be32(*(u32 *) &ecc[9]);
 				elm_write_reg(info, offset, val);
@@ -197,7 +197,8 @@ static void elm_load_syndrome(struct elm_info *info,
 				offset += 4;
 				val = ecc[0];
 				elm_write_reg(info, offset, val);
-			} else {
+				break;
+			case BCH4_ECC:
 				/* syndrome fragment 0 = ecc[20-52b] bits */
 				val = (cpu_to_be32(*(u32 *) &ecc[3]) >> 4) |
 					((ecc[2] & 0xf) << 28);
@@ -207,11 +208,14 @@ static void elm_load_syndrome(struct elm_info *info,
 				offset += 4;
 				val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12;
 				elm_write_reg(info, offset, val);
+				break;
+			default:
+				pr_err("invalid config bch_type\n");
 			}
 		}
 
 		/* Update ecc pointer with ecc byte size */
-		ecc += info->bch_type ? BCH8_SIZE : BCH4_SIZE;
+		ecc += info->ecc_syndrome_size;
 	}
 }
 
diff --git a/include/linux/platform_data/elm.h b/include/linux/platform_data/elm.h
index 6e37156..4edb406 100644
--- a/include/linux/platform_data/elm.h
+++ b/include/linux/platform_data/elm.h
@@ -26,13 +26,6 @@ enum bch_ecc {
 /* ELM support 8 error syndrome process */
 #define ERROR_VECTOR_MAX		8
 
-#define BCH8_ECC_OOB_BYTES		13
-#define BCH4_ECC_OOB_BYTES		7
-/* RBL requires 14 byte even though BCH8 uses only 13 byte */
-#define BCH8_SIZE			(BCH8_ECC_OOB_BYTES + 1)
-/* Uses 1 extra byte to handle erased pages */
-#define BCH4_SIZE			(BCH4_ECC_OOB_BYTES + 1)
-
 /**
  * struct elm_errorvec - error vector for elm
  * @error_reported:		set true for vectors error is reported
-- 
1.8.5.1.163.gd7aced9

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v8 3/4] mtd: devices: elm: configure parallel channels based on ecc_steps
  2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 1/4] mtd: devices: elm: check for hardware engine's design constraints Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome Pekon Gupta
@ 2014-03-20 13:18 ` Pekon Gupta
  2014-03-20 13:18 ` [PATCH v8 4/4] mtd: devices: elm: update DRIVER_NAME as "omap-elm" Pekon Gupta
  2014-03-20 13:48 ` [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Ezequiel Garcia
  4 siblings, 0 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:18 UTC (permalink / raw)
  To: Brian Norris; +Cc: Stefan Roese, linux-mtd, Pekon Gupta, Ezequiel Garcia

ELM hardware can process up to maximum of 8 hannels in parallel for
ECC error detection. Currently the number of channels getting configured for
processing is static determined by macro ERROR_VECTOR_MAX. However, the actual
number of channels that need to be processed is the ECC step number.
This patch just avoids configuring extra unused channels.

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 drivers/mtd/devices/elm.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c
index 4fbfaf6..26df41f 100644
--- a/drivers/mtd/devices/elm.c
+++ b/drivers/mtd/devices/elm.c
@@ -84,6 +84,7 @@ struct elm_info {
 	struct list_head list;
 	enum bch_ecc bch_type;
 	struct elm_registers elm_regs;
+	int ecc_steps;
 	int ecc_syndrome_size;
 };
 
@@ -128,6 +129,7 @@ int elm_config(struct device *dev, enum bch_ecc bch_type,
 	reg_val = (bch_type & ECC_BCH_LEVEL_MASK) | (ELM_ECC_SIZE << 16);
 	elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
 	info->bch_type		= bch_type;
+	info->ecc_steps		= ecc_steps;
 	info->ecc_syndrome_size	= ecc_syndrome_size;
 
 	return 0;
@@ -170,7 +172,7 @@ static void elm_load_syndrome(struct elm_info *info,
 	int i, offset;
 	u32 val;
 
-	for (i = 0; i < ERROR_VECTOR_MAX; i++) {
+	for (i = 0; i < info->ecc_steps; i++) {
 
 		/* Check error reported */
 		if (err_vec[i].error_reported) {
@@ -238,7 +240,7 @@ static void elm_start_processing(struct elm_info *info,
 	 * Set syndrome vector valid, so that ELM module
 	 * will process it for vectors error is reported
 	 */
-	for (i = 0; i < ERROR_VECTOR_MAX; i++) {
+	for (i = 0; i < info->ecc_steps; i++) {
 		if (err_vec[i].error_reported) {
 			offset = ELM_SYNDROME_FRAGMENT_6 +
 				SYNDROME_FRAGMENT_REG_SIZE * i;
@@ -267,7 +269,7 @@ static void elm_error_correction(struct elm_info *info,
 	int offset;
 	u32 reg_val;
 
-	for (i = 0; i < ERROR_VECTOR_MAX; i++) {
+	for (i = 0; i < info->ecc_steps; i++) {
 
 		/* Check error reported */
 		if (err_vec[i].error_reported) {
-- 
1.8.5.1.163.gd7aced9

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v8 4/4] mtd: devices: elm: update DRIVER_NAME as "omap-elm"
  2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
                   ` (2 preceding siblings ...)
  2014-03-20 13:18 ` [PATCH v8 3/4] mtd: devices: elm: configure parallel channels based on ecc_steps Pekon Gupta
@ 2014-03-20 13:18 ` Pekon Gupta
  2014-03-20 13:48 ` [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Ezequiel Garcia
  4 siblings, 0 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:18 UTC (permalink / raw)
  To: Brian Norris; +Cc: Stefan Roese, linux-mtd, Pekon Gupta, Ezequiel Garcia

use "omap-elm" as DRIVER_NAME

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 drivers/mtd/devices/elm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c
index 26df41f..1fd4a0f 100644
--- a/drivers/mtd/devices/elm.c
+++ b/drivers/mtd/devices/elm.c
@@ -15,6 +15,8 @@
  *
  */
 
+#define DRIVER_NAME	"omap-elm"
+
 #include <linux/platform_device.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
@@ -520,7 +522,7 @@ MODULE_DEVICE_TABLE(of, elm_of_match);
 
 static struct platform_driver elm_driver = {
 	.driver	= {
-		.name	= "elm",
+		.name	= DRIVER_NAME,
 		.owner	= THIS_MODULE,
 		.of_match_table = of_match_ptr(elm_of_match),
 		.pm	= &elm_pm_ops,
-- 
1.8.5.1.163.gd7aced9

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup
  2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
                   ` (3 preceding siblings ...)
  2014-03-20 13:18 ` [PATCH v8 4/4] mtd: devices: elm: update DRIVER_NAME as "omap-elm" Pekon Gupta
@ 2014-03-20 13:48 ` Ezequiel Garcia
  2014-03-26  6:12   ` Brian Norris
  4 siblings, 1 reply; 8+ messages in thread
From: Ezequiel Garcia @ 2014-03-20 13:48 UTC (permalink / raw)
  To: Pekon Gupta; +Cc: Stefan Roese, Brian Norris, linux-mtd

On Mar 20, Pekon Gupta wrote:
> *changes v7 -> v8*
> Incorporated feedbacks from Brian Norris <computersforpeace@gmail.com>
>  - renamed ecc_step_bytes -> ecc_syndrome_size
> 
> 
> *changes v6 -> v7*
> Incorporated feedbacks from Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
>  - using dev_err() instead of pr_err()
>  - moved un-related addition of info->ecc_steps, info->ecc_step_bytes,
>    info->ecc_step_size from [PATCH v6 1/4] into subsequent patches
>  - dropped pr_fmt() change
> 
> 
> *changes v5 -> v6*
> [PATCH 02/04] minor cleanup
> 
> *changes v4 -> v5*
> This patch series is split version from earlier series [1].
> This series refactors and cleans ELM driver which is used by Hardware
> based BCHx ecc-schemes.
>  - Undo: introduction of 'struct mtd_info' and 'struct nand_chip'. Instead
>          keep ELM driver independent of mtd_info and nand_chip structs and
>          pass only required ECC configurations as elm_config() arguments
>          elm_config(..., int ecc_steps, int ecc_step_size, int ecc_step_bytes)
>  - Undo: re-writing of elm_load_syndrome() ECC register configurations.
> 
> *changes v3 -> v4 [1]*
>  - in-corporated feedbacks from Brian Norris <computersforpeace@gmail.com>
>  - updated: use 'pr_fmt(fmt)' to suffix DRIVER_NAME
>  - removed: local 'eccsteps' in ELM driver, instead using nand_chip->ecc.steps
>  - undo: irrelavant white-space changes
> 
> [1] http://lists.infradead.org/pipermail/linux-mtd/2013-November/050242.html
> 
> Pekon Gupta (4):
>   mtd: devices: elm: check for hardware engine's design constraints
>   mtd: devices: elm: clean elm_load_syndrome
>   mtd: devices: elm: configure parallel channels based on ecc_steps
>   mtd: devices: elm: update DRIVER_NAME as "omap-elm"
> 

For the whole series:

Reviewed-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup
  2014-03-20 13:48 ` [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Ezequiel Garcia
@ 2014-03-26  6:12   ` Brian Norris
  0 siblings, 0 replies; 8+ messages in thread
From: Brian Norris @ 2014-03-26  6:12 UTC (permalink / raw)
  To: Ezequiel Garcia; +Cc: Stefan Roese, linux-mtd, Pekon Gupta

On Thu, Mar 20, 2014 at 10:48:28AM -0300, Ezequiel Garcia wrote:
> On Mar 20, Pekon Gupta wrote:
> > *changes v7 -> v8*
> > Incorporated feedbacks from Brian Norris <computersforpeace@gmail.com>
> >  - renamed ecc_step_bytes -> ecc_syndrome_size
> > 
[...]
> > Pekon Gupta (4):
> >   mtd: devices: elm: check for hardware engine's design constraints
> >   mtd: devices: elm: clean elm_load_syndrome
> >   mtd: devices: elm: configure parallel channels based on ecc_steps
> >   mtd: devices: elm: update DRIVER_NAME as "omap-elm"
> > 
> 
> For the whole series:
> 
> Reviewed-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>

Pushed to l2-mtd.git. Thanks!

Brian

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome
  2014-03-20 13:13 Pekon Gupta
@ 2014-03-20 13:13 ` Pekon Gupta
  0 siblings, 0 replies; 8+ messages in thread
From: Pekon Gupta @ 2014-03-20 13:13 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-omap, Ezequiel Garcia, Stefan Roese, Pekon Gupta

This patch refactors elm_load_syndrome() to make it scalable for newer
ECC schemes by removing scheme specific macros (like ECC_BYTES*xx),
and instead using ECC control information passed during elm_config.

Signed-off-by: Pekon Gupta <pekon@ti.com>
---
 drivers/mtd/devices/elm.c         | 18 +++++++++++-------
 include/linux/platform_data/elm.h |  7 -------
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/mtd/devices/elm.c b/drivers/mtd/devices/elm.c
index c51752a..4fbfaf6 100644
--- a/drivers/mtd/devices/elm.c
+++ b/drivers/mtd/devices/elm.c
@@ -84,6 +84,7 @@ struct elm_info {
 	struct list_head list;
 	enum bch_ecc bch_type;
 	struct elm_registers elm_regs;
+	int ecc_syndrome_size;
 };
 
 static LIST_HEAD(elm_devices);
@@ -126,7 +127,8 @@ int elm_config(struct device *dev, enum bch_ecc bch_type,
 
 	reg_val = (bch_type & ECC_BCH_LEVEL_MASK) | (ELM_ECC_SIZE << 16);
 	elm_write_reg(info, ELM_LOCATION_CONFIG, reg_val);
-	info->bch_type = bch_type;
+	info->bch_type		= bch_type;
+	info->ecc_syndrome_size	= ecc_syndrome_size;
 
 	return 0;
 }
@@ -175,10 +177,8 @@ static void elm_load_syndrome(struct elm_info *info,
 			elm_configure_page_mode(info, i, true);
 			offset = ELM_SYNDROME_FRAGMENT_0 +
 				SYNDROME_FRAGMENT_REG_SIZE * i;
-
-			/* BCH8 */
-			if (info->bch_type) {
-
+			switch (info->bch_type) {
+			case BCH8_ECC:
 				/* syndrome fragment 0 = ecc[9-12B] */
 				val = cpu_to_be32(*(u32 *) &ecc[9]);
 				elm_write_reg(info, offset, val);
@@ -197,7 +197,8 @@ static void elm_load_syndrome(struct elm_info *info,
 				offset += 4;
 				val = ecc[0];
 				elm_write_reg(info, offset, val);
-			} else {
+				break;
+			case BCH4_ECC:
 				/* syndrome fragment 0 = ecc[20-52b] bits */
 				val = (cpu_to_be32(*(u32 *) &ecc[3]) >> 4) |
 					((ecc[2] & 0xf) << 28);
@@ -207,11 +208,14 @@ static void elm_load_syndrome(struct elm_info *info,
 				offset += 4;
 				val = cpu_to_be32(*(u32 *) &ecc[0]) >> 12;
 				elm_write_reg(info, offset, val);
+				break;
+			default:
+				pr_err("invalid config bch_type\n");
 			}
 		}
 
 		/* Update ecc pointer with ecc byte size */
-		ecc += info->bch_type ? BCH8_SIZE : BCH4_SIZE;
+		ecc += info->ecc_syndrome_size;
 	}
 }
 
diff --git a/include/linux/platform_data/elm.h b/include/linux/platform_data/elm.h
index 6e37156..4edb406 100644
--- a/include/linux/platform_data/elm.h
+++ b/include/linux/platform_data/elm.h
@@ -26,13 +26,6 @@ enum bch_ecc {
 /* ELM support 8 error syndrome process */
 #define ERROR_VECTOR_MAX		8
 
-#define BCH8_ECC_OOB_BYTES		13
-#define BCH4_ECC_OOB_BYTES		7
-/* RBL requires 14 byte even though BCH8 uses only 13 byte */
-#define BCH8_SIZE			(BCH8_ECC_OOB_BYTES + 1)
-/* Uses 1 extra byte to handle erased pages */
-#define BCH4_SIZE			(BCH4_ECC_OOB_BYTES + 1)
-
 /**
  * struct elm_errorvec - error vector for elm
  * @error_reported:		set true for vectors error is reported
-- 
1.8.5.1.163.gd7aced9


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-03-26  6:12 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-20 13:18 [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Pekon Gupta
2014-03-20 13:18 ` [PATCH v8 1/4] mtd: devices: elm: check for hardware engine's design constraints Pekon Gupta
2014-03-20 13:18 ` [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome Pekon Gupta
2014-03-20 13:18 ` [PATCH v8 3/4] mtd: devices: elm: configure parallel channels based on ecc_steps Pekon Gupta
2014-03-20 13:18 ` [PATCH v8 4/4] mtd: devices: elm: update DRIVER_NAME as "omap-elm" Pekon Gupta
2014-03-20 13:48 ` [PATCH v8 0/4] mtd: devices: elm: add checks ELM H/W constrains, driver code cleanup Ezequiel Garcia
2014-03-26  6:12   ` Brian Norris
  -- strict thread matches above, loose matches on Subject: below --
2014-03-20 13:13 Pekon Gupta
2014-03-20 13:13 ` [PATCH v8 2/4] mtd: devices: elm: clean elm_load_syndrome Pekon Gupta

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.