* [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
@ 2010-08-06 2:51 Roy Zang
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
` (4 more replies)
0 siblings, 5 replies; 21+ messages in thread
From: Roy Zang @ 2010-08-06 2:51 UTC (permalink / raw)
To: linux-mtd; +Cc: B25806, linuxppc-dev, akpm, B11780
From: Lan Chunhe-B25806 <b25806@freescale.com>
Move Freescale elbc interrupt from nand dirver to elbc driver.
Then all elbc devices can use the interrupt instead of ONLY nand.
Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
send the patch to linux-mtd@lists.infradead.org
it has been posted to linuxppc-dev@ozlabs.org and do not get any comment.
arch/powerpc/Kconfig | 7 +-
arch/powerpc/include/asm/fsl_lbc.h | 34 +++++-
arch/powerpc/sysdev/fsl_lbc.c | 254 ++++++++++++++++++++++++++++++------
3 files changed, 253 insertions(+), 42 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 2031a28..5155b53 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -703,9 +703,12 @@ config 4xx_SOC
bool
config FSL_LBC
- bool
+ bool "Freescale Local Bus support"
+ depends on FSL_SOC
help
- Freescale Localbus support
+ Enables reporting of errors from the Freescale local bus
+ controller. Also contains some common code used by
+ drivers for specific local bus peripherals.
config FSL_GTM
bool
diff --git a/arch/powerpc/include/asm/fsl_lbc.h b/arch/powerpc/include/asm/fsl_lbc.h
index 1b5a210..9b95eab 100644
--- a/arch/powerpc/include/asm/fsl_lbc.h
+++ b/arch/powerpc/include/asm/fsl_lbc.h
@@ -1,9 +1,10 @@
/* Freescale Local Bus Controller
*
- * Copyright (c) 2006-2007 Freescale Semiconductor
+ * Copyright (c) 2006-2007, 2010 Freescale Semiconductor
*
* Authors: Nick Spence <nick.spence@freescale.com>,
* Scott Wood <scottwood@freescale.com>
+ * Jack Lan <jack.lan@freescale.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,6 +28,9 @@
#include <linux/types.h>
#include <linux/io.h>
+#include <linux/of_platform.h>
+#include <linux/interrupt.h>
+
struct fsl_lbc_bank {
__be32 br; /**< Base Register */
#define BR_BA 0xFFFF8000
@@ -125,13 +129,23 @@ struct fsl_lbc_regs {
#define LTESR_ATMW 0x00800000
#define LTESR_ATMR 0x00400000
#define LTESR_CS 0x00080000
+#define LTESR_UPM 0x00000002
#define LTESR_CC 0x00000001
#define LTESR_NAND_MASK (LTESR_FCT | LTESR_PAR | LTESR_CC)
+#define LTESR_MASK (LTESR_BM | LTESR_FCT | LTESR_PAR | LTESR_WP \
+ | LTESR_ATMW | LTESR_ATMR | LTESR_CS | LTESR_UPM \
+ | LTESR_CC)
+#define LTESR_CLEAR 0xFFFFFFFF
+#define LTECCR_CLEAR 0xFFFFFFFF
+#define LTESR_STATUS LTESR_MASK
+#define LTEIR_ENABLE LTESR_MASK
+#define LTEDR_ENABLE 0x00000000
__be32 ltedr; /**< Transfer Error Disable Register */
__be32 lteir; /**< Transfer Error Interrupt Register */
__be32 lteatr; /**< Transfer Error Attributes Register */
__be32 ltear; /**< Transfer Error Address Register */
- u8 res6[0xC];
+ __be32 lteccr; /**< Transfer Error ECC Register */
+ u8 res6[0x8];
__be32 lbcr; /**< Configuration Register */
#define LBCR_LDIS 0x80000000
#define LBCR_LDIS_SHIFT 31
@@ -265,7 +279,23 @@ static inline void fsl_upm_end_pattern(struct fsl_upm *upm)
cpu_relax();
}
+/* overview of the fsl lbc controller */
+
+struct fsl_lbc_ctrl {
+ /* device info */
+ struct device *dev;
+ struct fsl_lbc_regs __iomem *regs;
+ int irq;
+ wait_queue_head_t irq_wait;
+ spinlock_t lock;
+ void *nand;
+
+ /* status read from LTESR by irq handler */
+ unsigned int irq_status;
+};
+
extern int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base,
u32 mar);
+extern struct fsl_lbc_ctrl *fsl_lbc_ctrl_dev;
#endif /* __ASM_FSL_LBC_H */
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c
index dceb8d1..9c9e44f 100644
--- a/arch/powerpc/sysdev/fsl_lbc.c
+++ b/arch/powerpc/sysdev/fsl_lbc.c
@@ -5,6 +5,10 @@
*
* Author: Anton Vorontsov <avorontsov@ru.mvista.com>
*
+ * Copyright (c) 2010 Freescale Semiconductor
+ *
+ * Authors: Jack Lan <Jack.Lan@freescale.com>
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@@ -23,35 +27,8 @@
#include <asm/fsl_lbc.h>
static spinlock_t fsl_lbc_lock = __SPIN_LOCK_UNLOCKED(fsl_lbc_lock);
-static struct fsl_lbc_regs __iomem *fsl_lbc_regs;
-
-static char __initdata *compat_lbc[] = {
- "fsl,pq2-localbus",
- "fsl,pq2pro-localbus",
- "fsl,pq3-localbus",
- "fsl,elbc",
-};
-
-static int __init fsl_lbc_init(void)
-{
- struct device_node *lbus;
- int i;
-
- for (i = 0; i < ARRAY_SIZE(compat_lbc); i++) {
- lbus = of_find_compatible_node(NULL, NULL, compat_lbc[i]);
- if (lbus)
- goto found;
- }
- return -ENODEV;
-
-found:
- fsl_lbc_regs = of_iomap(lbus, 0);
- of_node_put(lbus);
- if (!fsl_lbc_regs)
- return -ENOMEM;
- return 0;
-}
-arch_initcall(fsl_lbc_init);
+struct fsl_lbc_ctrl *fsl_lbc_ctrl_dev;
+EXPORT_SYMBOL(fsl_lbc_ctrl_dev);
/**
* fsl_lbc_find - find Localbus bank
@@ -66,12 +43,12 @@ int fsl_lbc_find(phys_addr_t addr_base)
{
int i;
- if (!fsl_lbc_regs)
+ if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
return -ENODEV;
- for (i = 0; i < ARRAY_SIZE(fsl_lbc_regs->bank); i++) {
- __be32 br = in_be32(&fsl_lbc_regs->bank[i].br);
- __be32 or = in_be32(&fsl_lbc_regs->bank[i].or);
+ for (i = 0; i < ARRAY_SIZE(fsl_lbc_ctrl_dev->regs->bank); i++) {
+ __be32 br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].br);
+ __be32 or = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].or);
if (br & BR_V && (br & or & BR_BA) == addr_base)
return i;
@@ -99,17 +76,20 @@ int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm)
if (bank < 0)
return bank;
- br = in_be32(&fsl_lbc_regs->bank[bank].br);
+ if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
+ return -ENODEV;
+
+ br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[bank].br);
switch (br & BR_MSEL) {
case BR_MS_UPMA:
- upm->mxmr = &fsl_lbc_regs->mamr;
+ upm->mxmr = &fsl_lbc_ctrl_dev->regs->mamr;
break;
case BR_MS_UPMB:
- upm->mxmr = &fsl_lbc_regs->mbmr;
+ upm->mxmr = &fsl_lbc_ctrl_dev->regs->mbmr;
break;
case BR_MS_UPMC:
- upm->mxmr = &fsl_lbc_regs->mcmr;
+ upm->mxmr = &fsl_lbc_ctrl_dev->regs->mcmr;
break;
default:
return -EINVAL;
@@ -143,14 +123,18 @@ EXPORT_SYMBOL(fsl_upm_find);
* thus UPM pattern actually executed. Note that mar usage depends on the
* pre-programmed AMX bits in the UPM RAM.
*/
+
int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
{
int ret = 0;
unsigned long flags;
+ if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
+ return -ENODEV;
+
spin_lock_irqsave(&fsl_lbc_lock, flags);
- out_be32(&fsl_lbc_regs->mar, mar);
+ out_be32(&fsl_lbc_ctrl_dev->regs->mar, mar);
switch (upm->width) {
case 8:
@@ -172,3 +156,197 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
return ret;
}
EXPORT_SYMBOL(fsl_upm_run_pattern);
+
+static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl)
+{
+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
+
+ /* clear event registers */
+ setbits32(&lbc->ltesr, LTESR_CLEAR);
+ out_be32(&lbc->lteatr, 0);
+ out_be32(&lbc->ltear, 0);
+ out_be32(&lbc->lteccr, LTECCR_CLEAR);
+ out_be32(&lbc->ltedr, LTEDR_ENABLE);
+
+ /* Enable interrupts for any detected events */
+ out_be32(&lbc->lteir, LTEIR_ENABLE);
+
+ return 0;
+}
+
+static int __devexit fsl_lbc_ctrl_remove(struct of_device *ofdev)
+{
+ struct fsl_lbc_ctrl *ctrl = dev_get_drvdata(&ofdev->dev);
+
+ if (ctrl->irq)
+ free_irq(ctrl->irq, ctrl);
+
+ if (ctrl->regs)
+ iounmap(ctrl->regs);
+
+ dev_set_drvdata(&ofdev->dev, NULL);
+ kfree(ctrl);
+
+ return 0;
+}
+
+/* NOTE: This interrupt is used to report localbus events of various kinds,
+ * such as transaction errors on the chipselects.
+ */
+
+static irqreturn_t fsl_lbc_ctrl_irq(int irqno, void *data)
+{
+ struct fsl_lbc_ctrl *ctrl = data;
+ struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
+ u32 status;
+
+ status = in_be32(&lbc->ltesr);
+
+ if (status) {
+ out_be32(&lbc->ltesr, LTESR_CLEAR);
+ out_be32(&lbc->lteatr, 0);
+ out_be32(&lbc->ltear, 0);
+ ctrl->irq_status = status;
+
+ if (status & LTESR_BM)
+ dev_err(ctrl->dev, "Local bus monitor time-out: "
+ "LTESR 0x%08X\n", status);
+ if (status & LTESR_WP)
+ dev_err(ctrl->dev, "Write protect error: "
+ "LTESR 0x%08X\n", status);
+ if (status & LTESR_ATMW)
+ dev_err(ctrl->dev, "Atomic write error: "
+ "LTESR 0x%08X\n", status);
+ if (status & LTESR_ATMR)
+ dev_err(ctrl->dev, "Atomic read error: "
+ "LTESR 0x%08X\n", status);
+ if (status & LTESR_CS)
+ dev_err(ctrl->dev, "Chip select error: "
+ "LTESR 0x%08X\n", status);
+ if (status & LTESR_UPM)
+ ;
+ if (status & LTESR_FCT) {
+ dev_err(ctrl->dev, "FCM command time-out: "
+ "LTESR 0x%08X\n", status);
+ smp_wmb();
+ wake_up(&ctrl->irq_wait);
+ }
+ if (status & LTESR_PAR) {
+ dev_err(ctrl->dev, "Parity or Uncorrectable ECC error: "
+ "LTESR 0x%08X\n", status);
+ smp_wmb();
+ wake_up(&ctrl->irq_wait);
+ }
+ if (status & LTESR_CC) {
+ smp_wmb();
+ wake_up(&ctrl->irq_wait);
+ }
+ if (status & ~LTESR_MASK)
+ dev_err(ctrl->dev, "Unknown error: "
+ "LTESR 0x%08X\n", status);
+
+ return IRQ_HANDLED;
+ }
+
+ return IRQ_NONE;
+}
+
+/* fsl_lbc_ctrl_probe
+ *
+ * called by device layer when it finds a device matching
+ * one our driver can handled. This code allocates all of
+ * the resources needed for the controller only. The
+ * resources for the NAND banks themselves are allocated
+ * in the chip probe function.
+*/
+
+static int __devinit fsl_lbc_ctrl_probe(struct of_device *ofdev,
+ const struct of_device_id *match)
+{
+ int ret = 0;
+
+ fsl_lbc_ctrl_dev = kzalloc(sizeof(*fsl_lbc_ctrl_dev), GFP_KERNEL);
+ if (!fsl_lbc_ctrl_dev)
+ return -ENOMEM;
+
+ dev_set_drvdata(&ofdev->dev, fsl_lbc_ctrl_dev);
+
+ spin_lock_init(&fsl_lbc_ctrl_dev->lock);
+ init_waitqueue_head(&fsl_lbc_ctrl_dev->irq_wait);
+
+ fsl_lbc_ctrl_dev->regs = of_iomap(ofdev->dev.of_node, 0);
+ if (!fsl_lbc_ctrl_dev->regs) {
+ dev_err(&ofdev->dev, "failed to get memory region\n");
+ ret = -ENODEV;
+ goto err;
+ }
+
+ fsl_lbc_ctrl_dev->irq = of_irq_to_resource(ofdev->dev.of_node, 0, NULL);
+ if (fsl_lbc_ctrl_dev->irq == NO_IRQ) {
+ dev_err(&ofdev->dev, "failed to get irq resource\n");
+ ret = -ENODEV;
+ goto err;
+ }
+
+ fsl_lbc_ctrl_dev->dev = &ofdev->dev;
+
+ ret = fsl_lbc_ctrl_init(fsl_lbc_ctrl_dev);
+ if (ret < 0)
+ goto err;
+
+ ret = request_irq(fsl_lbc_ctrl_dev->irq, fsl_lbc_ctrl_irq, 0,
+ "fsl-lbc", fsl_lbc_ctrl_dev);
+ if (ret != 0) {
+ dev_err(&ofdev->dev, "failed to install irq (%d)\n",
+ fsl_lbc_ctrl_dev->irq);
+ ret = fsl_lbc_ctrl_dev->irq;
+ goto err;
+ }
+
+ return 0;
+
+err:
+ return ret;
+}
+
+static const struct of_device_id fsl_lbc_match[] = {
+ {
+ .compatible = "fsl,elbc",
+ },
+ {
+ .compatible = "fsl,pq3-localbus",
+ },
+ {
+ .compatible = "fsl,pq2-localbus",
+ },
+ {
+ .compatible = "fsl,pq2pro-localbus",
+ },
+ {},
+};
+
+static struct of_platform_driver fsl_lbc_ctrl_driver = {
+ .driver = {
+ .name = "fsl-lbc",
+ .of_match_table = fsl_lbc_match,
+ },
+ .probe = fsl_lbc_ctrl_probe,
+ .remove = __devexit_p(fsl_lbc_ctrl_remove),
+};
+
+static int __init fsl_lbc_init(void)
+{
+ return of_register_platform_driver(&fsl_lbc_ctrl_driver);
+}
+
+static void __exit fsl_lbc_exit(void)
+{
+ of_unregister_platform_driver(&fsl_lbc_ctrl_driver);
+}
+
+module_init(fsl_lbc_init);
+module_exit(fsl_lbc_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Freescale Semiconductor");
+MODULE_DESCRIPTION("Freescale Enhanced Local Bus Controller driver");
--
1.5.6.5
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
@ 2010-08-06 2:51 ` Roy Zang
2010-08-06 2:51 ` [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode Roy Zang
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
2010-08-09 7:33 ` [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Zang Roy-R61911
` (3 subsequent siblings)
4 siblings, 2 replies; 21+ messages in thread
From: Roy Zang @ 2010-08-06 2:51 UTC (permalink / raw)
To: linux-mtd; +Cc: B25806, linuxppc-dev, akpm, B11780
From: Lan Chunhe-B25806 <b25806@freescale.com>
The former driver had the two functions:
1. detecting nand flash partitions;
2. registering elbc interrupt.
Now, second function is removed to fsl_lbc.c.
Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
drivers/mtd/nand/Kconfig | 1 +
drivers/mtd/nand/fsl_elbc_nand.c | 464 ++++++++++++++------------------------
2 files changed, 170 insertions(+), 295 deletions(-)
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index ffc3720..4b4c82e 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -459,6 +459,7 @@ config MTD_NAND_ORION
config MTD_NAND_FSL_ELBC
tristate "NAND support for Freescale eLBC controllers"
depends on MTD_NAND && PPC_OF
+ select FSL_LBC
help
Various Freescale chips, including the 8313, include a NAND Flash
Controller Module with built-in hardware ECC capabilities.
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index 5084cc5..7bbcb3f 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -1,9 +1,10 @@
/* Freescale Enhanced Local Bus Controller NAND driver
*
- * Copyright (c) 2006-2007 Freescale Semiconductor
+ * Copyright (c) 2006-2007, 2010 Freescale Semiconductor
*
* Authors: Nick Spence <nick.spence@freescale.com>,
* Scott Wood <scottwood@freescale.com>
+ * Jack Lan <jack.lan@freescale.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,32 +25,21 @@
#include <linux/types.h>
#include <linux/init.h>
#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/of_platform.h>
-#include <linux/slab.h>
-#include <linux/interrupt.h>
-#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
-#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
-
-#include <asm/io.h>
#include <asm/fsl_lbc.h>
#define MAX_BANKS 8
#define ERR_BYTE 0xFF /* Value returned for read bytes when read failed */
#define FCM_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait for FCM */
-struct fsl_elbc_ctrl;
-
/* mtd information per set */
struct fsl_elbc_mtd {
struct mtd_info mtd;
struct nand_chip chip;
- struct fsl_elbc_ctrl *ctrl;
+ struct fsl_lbc_ctrl *ctrl;
struct device *dev;
int bank; /* Chip select bank number */
@@ -58,18 +48,12 @@ struct fsl_elbc_mtd {
unsigned int fmr; /* FCM Flash Mode Register value */
};
-/* overview of the fsl elbc controller */
+/* Freescale eLBC FCM controller infomation */
-struct fsl_elbc_ctrl {
+struct fsl_elbc_fcm_ctrl {
struct nand_hw_control controller;
struct fsl_elbc_mtd *chips[MAX_BANKS];
- /* device info */
- struct device *dev;
- struct fsl_lbc_regs __iomem *regs;
- int irq;
- wait_queue_head_t irq_wait;
- unsigned int irq_status; /* status read from LTESR by irq handler */
u8 __iomem *addr; /* Address of assigned FCM buffer */
unsigned int page; /* Last page written to / read from */
unsigned int read_bytes; /* Number of bytes read during command */
@@ -82,6 +66,8 @@ struct fsl_elbc_ctrl {
char *oob_poi; /* Place to write ECC after read back */
};
+static struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl;
+
/* These map to the positions used by the FCM hardware ECC generator */
/* Small Page FLASH with FMR[ECCM] = 0 */
@@ -164,11 +150,11 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
int buf_num;
- ctrl->page = page_addr;
+ elbc_fcm_ctrl->page = page_addr;
out_be32(&lbc->fbar,
page_addr >> (chip->phys_erase_shift - chip->page_shift));
@@ -185,16 +171,18 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
buf_num = page_addr & 7;
}
- ctrl->addr = priv->vbase + buf_num * 1024;
- ctrl->index = column;
+ elbc_fcm_ctrl->addr = priv->vbase + buf_num * 1024;
+ elbc_fcm_ctrl->index = column;
/* for OOB data point to the second half of the buffer */
if (oob)
- ctrl->index += priv->page_size ? 2048 : 512;
+ elbc_fcm_ctrl->index += priv->page_size ? 2048 : 512;
- dev_vdbg(ctrl->dev, "set_addr: bank=%d, ctrl->addr=0x%p (0x%p), "
+ dev_vdbg(priv->dev, "set_addr: bank=%d, "
+ "elbc_fcm_ctrl->addr=0x%p (0x%p), "
"index %x, pes %d ps %d\n",
- buf_num, ctrl->addr, priv->vbase, ctrl->index,
+ buf_num, elbc_fcm_ctrl->addr, priv->vbase,
+ elbc_fcm_ctrl->index,
chip->phys_erase_shift, chip->page_shift);
}
@@ -205,18 +193,18 @@ static int fsl_elbc_run_command(struct mtd_info *mtd)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
/* Setup the FMR[OP] to execute without write protection */
out_be32(&lbc->fmr, priv->fmr | 3);
- if (ctrl->use_mdr)
- out_be32(&lbc->mdr, ctrl->mdr);
+ if (elbc_fcm_ctrl->use_mdr)
+ out_be32(&lbc->mdr, elbc_fcm_ctrl->mdr);
- dev_vdbg(ctrl->dev,
+ dev_vdbg(priv->dev,
"fsl_elbc_run_command: fmr=%08x fir=%08x fcr=%08x\n",
in_be32(&lbc->fmr), in_be32(&lbc->fir), in_be32(&lbc->fcr));
- dev_vdbg(ctrl->dev,
+ dev_vdbg(priv->dev,
"fsl_elbc_run_command: fbar=%08x fpar=%08x "
"fbcr=%08x bank=%d\n",
in_be32(&lbc->fbar), in_be32(&lbc->fpar),
@@ -229,19 +217,18 @@ static int fsl_elbc_run_command(struct mtd_info *mtd)
/* wait for FCM complete flag or timeout */
wait_event_timeout(ctrl->irq_wait, ctrl->irq_status,
FCM_TIMEOUT_MSECS * HZ/1000);
- ctrl->status = ctrl->irq_status;
-
+ elbc_fcm_ctrl->status = ctrl->irq_status;
/* store mdr value in case it was needed */
- if (ctrl->use_mdr)
- ctrl->mdr = in_be32(&lbc->mdr);
+ if (elbc_fcm_ctrl->use_mdr)
+ elbc_fcm_ctrl->mdr = in_be32(&lbc->mdr);
- ctrl->use_mdr = 0;
+ elbc_fcm_ctrl->use_mdr = 0;
- if (ctrl->status != LTESR_CC) {
- dev_info(ctrl->dev,
+ if (elbc_fcm_ctrl->status != LTESR_CC) {
+ dev_info(priv->dev,
"command failed: fir %x fcr %x status %x mdr %x\n",
in_be32(&lbc->fir), in_be32(&lbc->fcr),
- ctrl->status, ctrl->mdr);
+ elbc_fcm_ctrl->status, elbc_fcm_ctrl->mdr);
return -EIO;
}
@@ -251,7 +238,7 @@ static int fsl_elbc_run_command(struct mtd_info *mtd)
static void fsl_elbc_do_read(struct nand_chip *chip, int oob)
{
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
if (priv->page_size) {
@@ -284,15 +271,15 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- ctrl->use_mdr = 0;
+ elbc_fcm_ctrl->use_mdr = 0;
/* clear the read buffer */
- ctrl->read_bytes = 0;
+ elbc_fcm_ctrl->read_bytes = 0;
if (command != NAND_CMD_PAGEPROG)
- ctrl->index = 0;
+ elbc_fcm_ctrl->index = 0;
switch (command) {
/* READ0 and READ1 read the entire buffer to use hardware ECC. */
@@ -301,7 +288,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* fall-through */
case NAND_CMD_READ0:
- dev_dbg(ctrl->dev,
+ dev_dbg(priv->dev,
"fsl_elbc_cmdfunc: NAND_CMD_READ0, page_addr:"
" 0x%x, column: 0x%x.\n", page_addr, column);
@@ -309,8 +296,8 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
out_be32(&lbc->fbcr, 0); /* read entire page to enable ECC */
set_addr(mtd, 0, page_addr, 0);
- ctrl->read_bytes = mtd->writesize + mtd->oobsize;
- ctrl->index += column;
+ elbc_fcm_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
+ elbc_fcm_ctrl->index += column;
fsl_elbc_do_read(chip, 0);
fsl_elbc_run_command(mtd);
@@ -318,14 +305,14 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* READOOB reads only the OOB because no ECC is performed. */
case NAND_CMD_READOOB:
- dev_vdbg(ctrl->dev,
+ dev_vdbg(priv->dev,
"fsl_elbc_cmdfunc: NAND_CMD_READOOB, page_addr:"
" 0x%x, column: 0x%x.\n", page_addr, column);
out_be32(&lbc->fbcr, mtd->oobsize - column);
set_addr(mtd, column, page_addr, 1);
- ctrl->read_bytes = mtd->writesize + mtd->oobsize;
+ elbc_fcm_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
fsl_elbc_do_read(chip, 1);
fsl_elbc_run_command(mtd);
@@ -333,7 +320,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* READID must read all 5 possible bytes while CEB is active */
case NAND_CMD_READID:
- dev_vdbg(ctrl->dev, "fsl_elbc_cmdfunc: NAND_CMD_READID.\n");
+ dev_vdbg(priv->dev, "fsl_elbc_cmdfunc: NAND_CMD_READID.\n");
out_be32(&lbc->fir, (FIR_OP_CM0 << FIR_OP0_SHIFT) |
(FIR_OP_UA << FIR_OP1_SHIFT) |
@@ -341,9 +328,9 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
out_be32(&lbc->fcr, NAND_CMD_READID << FCR_CMD0_SHIFT);
/* 5 bytes for manuf, device and exts */
out_be32(&lbc->fbcr, 5);
- ctrl->read_bytes = 5;
- ctrl->use_mdr = 1;
- ctrl->mdr = 0;
+ elbc_fcm_ctrl->read_bytes = 5;
+ elbc_fcm_ctrl->use_mdr = 1;
+ elbc_fcm_ctrl->mdr = 0;
set_addr(mtd, 0, 0, 0);
fsl_elbc_run_command(mtd);
@@ -351,7 +338,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* ERASE1 stores the block and page address */
case NAND_CMD_ERASE1:
- dev_vdbg(ctrl->dev,
+ dev_vdbg(priv->dev,
"fsl_elbc_cmdfunc: NAND_CMD_ERASE1, "
"page_addr: 0x%x.\n", page_addr);
set_addr(mtd, 0, page_addr, 0);
@@ -359,7 +346,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* ERASE2 uses the block and page address from ERASE1 */
case NAND_CMD_ERASE2:
- dev_vdbg(ctrl->dev, "fsl_elbc_cmdfunc: NAND_CMD_ERASE2.\n");
+ dev_vdbg(priv->dev, "fsl_elbc_cmdfunc: NAND_CMD_ERASE2.\n");
out_be32(&lbc->fir,
(FIR_OP_CM0 << FIR_OP0_SHIFT) |
@@ -374,8 +361,8 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
(NAND_CMD_ERASE2 << FCR_CMD2_SHIFT));
out_be32(&lbc->fbcr, 0);
- ctrl->read_bytes = 0;
- ctrl->use_mdr = 1;
+ elbc_fcm_ctrl->read_bytes = 0;
+ elbc_fcm_ctrl->use_mdr = 1;
fsl_elbc_run_command(mtd);
return;
@@ -383,14 +370,12 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* SEQIN sets up the addr buffer and all registers except the length */
case NAND_CMD_SEQIN: {
__be32 fcr;
- dev_vdbg(ctrl->dev,
- "fsl_elbc_cmdfunc: NAND_CMD_SEQIN/PAGE_PROG, "
+ dev_vdbg(priv->dev,
+ "fsl_elbc_cmdfunc: NAND_CMD_SEQIN/PAGE_PROG, "
"page_addr: 0x%x, column: 0x%x.\n",
page_addr, column);
- ctrl->column = column;
- ctrl->oob = 0;
- ctrl->use_mdr = 1;
+ elbc_fcm_ctrl->use_mdr = 1;
fcr = (NAND_CMD_STATUS << FCR_CMD1_SHIFT) |
(NAND_CMD_SEQIN << FCR_CMD2_SHIFT) |
@@ -420,7 +405,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* OOB area --> READOOB */
column -= mtd->writesize;
fcr |= NAND_CMD_READOOB << FCR_CMD0_SHIFT;
- ctrl->oob = 1;
+ elbc_fcm_ctrl->oob = 1;
} else {
WARN_ON(column != 0);
/* First 256 bytes --> READ0 */
@@ -429,24 +414,24 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
}
out_be32(&lbc->fcr, fcr);
- set_addr(mtd, column, page_addr, ctrl->oob);
+ set_addr(mtd, column, page_addr, elbc_fcm_ctrl->oob);
return;
}
/* PAGEPROG reuses all of the setup from SEQIN and adds the length */
case NAND_CMD_PAGEPROG: {
int full_page;
- dev_vdbg(ctrl->dev,
+ dev_vdbg(priv->dev,
"fsl_elbc_cmdfunc: NAND_CMD_PAGEPROG "
- "writing %d bytes.\n", ctrl->index);
+ "writing %d bytes.\n", elbc_fcm_ctrl->index);
/* if the write did not start at 0 or is not a full page
* then set the exact length, otherwise use a full page
* write so the HW generates the ECC.
*/
- if (ctrl->oob || ctrl->column != 0 ||
- ctrl->index != mtd->writesize + mtd->oobsize) {
- out_be32(&lbc->fbcr, ctrl->index);
+ if (elbc_fcm_ctrl->oob || elbc_fcm_ctrl->column != 0 ||
+ elbc_fcm_ctrl->index != mtd->writesize + mtd->oobsize) {
+ out_be32(&lbc->fbcr, elbc_fcm_ctrl->index);
full_page = 0;
} else {
out_be32(&lbc->fbcr, 0);
@@ -458,21 +443,21 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
/* Read back the page in order to fill in the ECC for the
* caller. Is this really needed?
*/
- if (full_page && ctrl->oob_poi) {
+ if (full_page && elbc_fcm_ctrl->oob_poi) {
out_be32(&lbc->fbcr, 3);
set_addr(mtd, 6, page_addr, 1);
- ctrl->read_bytes = mtd->writesize + 9;
+ elbc_fcm_ctrl->read_bytes = mtd->writesize + 9;
fsl_elbc_do_read(chip, 1);
fsl_elbc_run_command(mtd);
- memcpy_fromio(ctrl->oob_poi + 6,
- &ctrl->addr[ctrl->index], 3);
- ctrl->index += 3;
+ memcpy_fromio(elbc_fcm_ctrl->oob_poi + 6,
+ &elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index], 3);
+ elbc_fcm_ctrl->index += 3;
}
- ctrl->oob_poi = NULL;
+ elbc_fcm_ctrl->oob_poi = NULL;
return;
}
@@ -485,26 +470,26 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command,
out_be32(&lbc->fcr, NAND_CMD_STATUS << FCR_CMD0_SHIFT);
out_be32(&lbc->fbcr, 1);
set_addr(mtd, 0, 0, 0);
- ctrl->read_bytes = 1;
+ elbc_fcm_ctrl->read_bytes = 1;
fsl_elbc_run_command(mtd);
/* The chip always seems to report that it is
* write-protected, even when it is not.
*/
- setbits8(ctrl->addr, NAND_STATUS_WP);
+ setbits8(elbc_fcm_ctrl->addr, NAND_STATUS_WP);
return;
/* RESET without waiting for the ready line */
case NAND_CMD_RESET:
- dev_dbg(ctrl->dev, "fsl_elbc_cmdfunc: NAND_CMD_RESET.\n");
+ dev_dbg(priv->dev, "fsl_elbc_cmdfunc: NAND_CMD_RESET.\n");
out_be32(&lbc->fir, FIR_OP_CM0 << FIR_OP0_SHIFT);
out_be32(&lbc->fcr, NAND_CMD_RESET << FCR_CMD0_SHIFT);
fsl_elbc_run_command(mtd);
return;
default:
- dev_err(ctrl->dev,
+ dev_err(priv->dev,
"fsl_elbc_cmdfunc: error, unsupported command 0x%x.\n",
command);
}
@@ -524,24 +509,23 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
unsigned int bufsize = mtd->writesize + mtd->oobsize;
if (len <= 0) {
- dev_err(ctrl->dev, "write_buf of %d bytes", len);
- ctrl->status = 0;
+ dev_err(priv->dev, "write_buf of %d bytes", len);
+ elbc_fcm_ctrl->status = 0;
return;
}
- if ((unsigned int)len > bufsize - ctrl->index) {
- dev_err(ctrl->dev,
+ if ((unsigned int)len > bufsize - elbc_fcm_ctrl->index) {
+ dev_err(priv->dev,
"write_buf beyond end of buffer "
"(%d requested, %u available)\n",
- len, bufsize - ctrl->index);
- len = bufsize - ctrl->index;
+ len, bufsize - elbc_fcm_ctrl->index);
+ len = bufsize - elbc_fcm_ctrl->index;
}
- memcpy_toio(&ctrl->addr[ctrl->index], buf, len);
+ memcpy_toio(&elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index], buf, len);
/*
* This is workaround for the weird elbc hangs during nand write,
* Scott Wood says: "...perhaps difference in how long it takes a
@@ -549,9 +533,9 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
* is causing problems, and sync isn't helping for some reason."
* Reading back the last byte helps though.
*/
- in_8(&ctrl->addr[ctrl->index] + len - 1);
+ in_8(&elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index] + len - 1);
- ctrl->index += len;
+ elbc_fcm_ctrl->index += len;
}
/*
@@ -562,13 +546,12 @@ static u8 fsl_elbc_read_byte(struct mtd_info *mtd)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
/* If there are still bytes in the FCM, then use the next byte. */
- if (ctrl->index < ctrl->read_bytes)
- return in_8(&ctrl->addr[ctrl->index++]);
+ if (elbc_fcm_ctrl->index < elbc_fcm_ctrl->read_bytes)
+ return in_8(&elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index++]);
- dev_err(ctrl->dev, "read_byte beyond end of buffer\n");
+ dev_err(priv->dev, "read_byte beyond end of buffer\n");
return ERR_BYTE;
}
@@ -579,18 +562,18 @@ static void fsl_elbc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
int avail;
if (len < 0)
return;
- avail = min((unsigned int)len, ctrl->read_bytes - ctrl->index);
- memcpy_fromio(buf, &ctrl->addr[ctrl->index], avail);
- ctrl->index += avail;
+ avail = min((unsigned int)len,
+ elbc_fcm_ctrl->read_bytes - elbc_fcm_ctrl->index);
+ memcpy_fromio(buf, &elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index], avail);
+ elbc_fcm_ctrl->index += avail;
if (len > avail)
- dev_err(ctrl->dev,
+ dev_err(priv->dev,
"read_buf beyond end of buffer "
"(%d requested, %d available)\n",
len, avail);
@@ -603,30 +586,31 @@ static int fsl_elbc_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
int i;
if (len < 0) {
- dev_err(ctrl->dev, "write_buf of %d bytes", len);
+ dev_err(priv->dev, "write_buf of %d bytes", len);
return -EINVAL;
}
- if ((unsigned int)len > ctrl->read_bytes - ctrl->index) {
- dev_err(ctrl->dev,
- "verify_buf beyond end of buffer "
- "(%d requested, %u available)\n",
- len, ctrl->read_bytes - ctrl->index);
+ if ((unsigned int)len >
+ elbc_fcm_ctrl->read_bytes - elbc_fcm_ctrl->index) {
+ dev_err(priv->dev,
+ "verify_buf beyond end of buffer "
+ "(%d requested, %u available)\n",
+ len, elbc_fcm_ctrl->read_bytes - elbc_fcm_ctrl->index);
- ctrl->index = ctrl->read_bytes;
+ elbc_fcm_ctrl->index = elbc_fcm_ctrl->read_bytes;
return -EINVAL;
}
for (i = 0; i < len; i++)
- if (in_8(&ctrl->addr[ctrl->index + i]) != buf[i])
+ if (in_8(&elbc_fcm_ctrl->addr[elbc_fcm_ctrl->index + i])
+ != buf[i])
break;
- ctrl->index += len;
- return i == len && ctrl->status == LTESR_CC ? 0 : -EIO;
+ elbc_fcm_ctrl->index += len;
+ return i == len && elbc_fcm_ctrl->status == LTESR_CC ? 0 : -EIO;
}
/* This function is called after Program and Erase Operations to
@@ -634,23 +618,20 @@ static int fsl_elbc_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
*/
static int fsl_elbc_wait(struct mtd_info *mtd, struct nand_chip *chip)
{
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-
- if (ctrl->status != LTESR_CC)
+ if (elbc_fcm_ctrl->status != LTESR_CC)
return NAND_STATUS_FAIL;
/* The chip always seems to report that it is
* write-protected, even when it is not.
*/
- return (ctrl->mdr & 0xff) | NAND_STATUS_WP;
+ return (elbc_fcm_ctrl->mdr & 0xff) | NAND_STATUS_WP;
}
static int fsl_elbc_chip_init_tail(struct mtd_info *mtd)
{
struct nand_chip *chip = mtd->priv;
struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
unsigned int al;
@@ -665,41 +646,41 @@ static int fsl_elbc_chip_init_tail(struct mtd_info *mtd)
priv->fmr |= (12 << FMR_CWTO_SHIFT) | /* Timeout > 12 ms */
(al << FMR_AL_SHIFT);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->numchips = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->numchips = %d\n",
chip->numchips);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->chipsize = %lld\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->chipsize = %lld\n",
chip->chipsize);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->pagemask = %8x\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->pagemask = %8x\n",
chip->pagemask);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->chip_delay = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->chip_delay = %d\n",
chip->chip_delay);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->badblockpos = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->badblockpos = %d\n",
chip->badblockpos);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->chip_shift = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->chip_shift = %d\n",
chip->chip_shift);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->page_shift = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->page_shift = %d\n",
chip->page_shift);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->phys_erase_shift = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->phys_erase_shift = %d\n",
chip->phys_erase_shift);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecclayout = %p\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecclayout = %p\n",
chip->ecclayout);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecc.mode = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.mode = %d\n",
chip->ecc.mode);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecc.steps = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.steps = %d\n",
chip->ecc.steps);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecc.bytes = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.bytes = %d\n",
chip->ecc.bytes);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecc.total = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.total = %d\n",
chip->ecc.total);
- dev_dbg(ctrl->dev, "fsl_elbc_init: nand->ecc.layout = %p\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: nand->ecc.layout = %p\n",
chip->ecc.layout);
- dev_dbg(ctrl->dev, "fsl_elbc_init: mtd->flags = %08x\n", mtd->flags);
- dev_dbg(ctrl->dev, "fsl_elbc_init: mtd->size = %lld\n", mtd->size);
- dev_dbg(ctrl->dev, "fsl_elbc_init: mtd->erasesize = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->flags = %08x\n", mtd->flags);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->size = %lld\n", mtd->size);
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->erasesize = %d\n",
mtd->erasesize);
- dev_dbg(ctrl->dev, "fsl_elbc_init: mtd->writesize = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->writesize = %d\n",
mtd->writesize);
- dev_dbg(ctrl->dev, "fsl_elbc_init: mtd->oobsize = %d\n",
+ dev_dbg(priv->dev, "fsl_elbc_init: mtd->oobsize = %d\n",
mtd->oobsize);
/* adjust Option Register and ECC to match Flash page size */
@@ -719,7 +700,7 @@ static int fsl_elbc_chip_init_tail(struct mtd_info *mtd)
chip->badblock_pattern = &largepage_memorybased;
}
} else {
- dev_err(ctrl->dev,
+ dev_err(priv->dev,
"fsl_elbc_init: page size %d is not supported\n",
mtd->writesize);
return -1;
@@ -749,18 +730,15 @@ static void fsl_elbc_write_page(struct mtd_info *mtd,
struct nand_chip *chip,
const uint8_t *buf)
{
- struct fsl_elbc_mtd *priv = chip->priv;
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-
fsl_elbc_write_buf(mtd, buf, mtd->writesize);
fsl_elbc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
- ctrl->oob_poi = chip->oob_poi;
+ elbc_fcm_ctrl->oob_poi = chip->oob_poi;
}
static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
{
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
+ struct fsl_lbc_ctrl *ctrl = priv->ctrl;
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
struct nand_chip *chip = &priv->chip;
@@ -790,7 +768,7 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
chip->options = NAND_NO_READRDY | NAND_NO_AUTOINCR |
NAND_USE_FLASH_BBT;
- chip->controller = &ctrl->controller;
+ chip->controller = &elbc_fcm_ctrl->controller;
chip->priv = priv;
chip->ecc.read_page = fsl_elbc_read_page;
@@ -815,8 +793,6 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv)
{
- struct fsl_elbc_ctrl *ctrl = priv->ctrl;
-
nand_release(&priv->mtd);
kfree(priv->mtd.name);
@@ -824,16 +800,16 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv)
if (priv->vbase)
iounmap(priv->vbase);
- ctrl->chips[priv->bank] = NULL;
+ elbc_fcm_ctrl->chips[priv->bank] = NULL;
kfree(priv);
return 0;
}
-static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
- struct device_node *node)
+static int __devinit fsl_elbc_nand_probe(struct of_device *dev,
+ const struct of_device_id *match)
{
- struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
+ struct fsl_lbc_regs __iomem *lbc;
struct fsl_elbc_mtd *priv;
struct resource res;
#ifdef CONFIG_MTD_PARTITIONS
@@ -843,11 +819,16 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
#endif
int ret;
int bank;
+ struct device_node *node = dev->dev.of_node;
+
+ if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
+ return -ENODEV;
+ lbc = fsl_lbc_ctrl_dev->regs;
/* get, allocate and map the memory resource */
ret = of_address_to_resource(node, 0, &res);
if (ret) {
- dev_err(ctrl->dev, "failed to get resource\n");
+ dev_err(fsl_lbc_ctrl_dev->dev, "failed to get resource\n");
return ret;
}
@@ -861,7 +842,8 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
break;
if (bank >= MAX_BANKS) {
- dev_err(ctrl->dev, "address did not match any chip selects\n");
+ dev_err(fsl_lbc_ctrl_dev->dev, "address did not match any "
+ "chip selects\n");
return -ENODEV;
}
@@ -869,14 +851,28 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
if (!priv)
return -ENOMEM;
- ctrl->chips[bank] = priv;
+ if (fsl_lbc_ctrl_dev->nand == NULL) {
+ elbc_fcm_ctrl = kzalloc(sizeof(*elbc_fcm_ctrl), GFP_KERNEL);
+ if (!elbc_fcm_ctrl)
+ return -ENOMEM;
+
+ elbc_fcm_ctrl->read_bytes = 0;
+ elbc_fcm_ctrl->index = 0;
+ elbc_fcm_ctrl->addr = NULL;
+
+ spin_lock_init(&elbc_fcm_ctrl->controller.lock);
+ init_waitqueue_head(&elbc_fcm_ctrl->controller.wq);
+ fsl_lbc_ctrl_dev->nand = elbc_fcm_ctrl;
+ }
+
+ elbc_fcm_ctrl->chips[bank] = priv;
priv->bank = bank;
- priv->ctrl = ctrl;
- priv->dev = ctrl->dev;
+ priv->ctrl = fsl_lbc_ctrl_dev;
+ priv->dev = fsl_lbc_ctrl_dev->dev;
priv->vbase = ioremap(res.start, resource_size(&res));
if (!priv->vbase) {
- dev_err(ctrl->dev, "failed to map chip region\n");
+ dev_err(fsl_lbc_ctrl_dev->dev, "failed to map chip region\n");
ret = -ENOMEM;
goto err;
}
@@ -933,171 +929,49 @@ err:
return ret;
}
-static int __devinit fsl_elbc_ctrl_init(struct fsl_elbc_ctrl *ctrl)
+static int fsl_elbc_nand_remove(struct of_device *ofdev)
{
- struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
-
- /*
- * NAND transactions can tie up the bus for a long time, so set the
- * bus timeout to max by clearing LBCR[BMT] (highest base counter
- * value) and setting LBCR[BMTPS] to the highest prescaler value.
- */
- clrsetbits_be32(&lbc->lbcr, LBCR_BMT, 15);
-
- /* clear event registers */
- setbits32(&lbc->ltesr, LTESR_NAND_MASK);
- out_be32(&lbc->lteatr, 0);
-
- /* Enable interrupts for any detected events */
- out_be32(&lbc->lteir, LTESR_NAND_MASK);
-
- ctrl->read_bytes = 0;
- ctrl->index = 0;
- ctrl->addr = NULL;
-
- return 0;
-}
-
-static int fsl_elbc_ctrl_remove(struct of_device *ofdev)
-{
- struct fsl_elbc_ctrl *ctrl = dev_get_drvdata(&ofdev->dev);
int i;
for (i = 0; i < MAX_BANKS; i++)
- if (ctrl->chips[i])
- fsl_elbc_chip_remove(ctrl->chips[i]);
-
- if (ctrl->irq)
- free_irq(ctrl->irq, ctrl);
-
- if (ctrl->regs)
- iounmap(ctrl->regs);
-
- dev_set_drvdata(&ofdev->dev, NULL);
- kfree(ctrl);
- return 0;
-}
+ if (elbc_fcm_ctrl->chips[i])
+ fsl_elbc_chip_remove(elbc_fcm_ctrl->chips[i]);
-/* NOTE: This interrupt is also used to report other localbus events,
- * such as transaction errors on other chipselects. If we want to
- * capture those, we'll need to move the IRQ code into a shared
- * LBC driver.
- */
-
-static irqreturn_t fsl_elbc_ctrl_irq(int irqno, void *data)
-{
- struct fsl_elbc_ctrl *ctrl = data;
- struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
- __be32 status = in_be32(&lbc->ltesr) & LTESR_NAND_MASK;
-
- if (status) {
- out_be32(&lbc->ltesr, status);
- out_be32(&lbc->lteatr, 0);
-
- ctrl->irq_status = status;
- smp_wmb();
- wake_up(&ctrl->irq_wait);
-
- return IRQ_HANDLED;
- }
-
- return IRQ_NONE;
-}
-
-/* fsl_elbc_ctrl_probe
- *
- * called by device layer when it finds a device matching
- * one our driver can handled. This code allocates all of
- * the resources needed for the controller only. The
- * resources for the NAND banks themselves are allocated
- * in the chip probe function.
-*/
-
-static int __devinit fsl_elbc_ctrl_probe(struct of_device *ofdev,
- const struct of_device_id *match)
-{
- struct device_node *child;
- struct fsl_elbc_ctrl *ctrl;
- int ret;
-
- ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
- if (!ctrl)
- return -ENOMEM;
-
- dev_set_drvdata(&ofdev->dev, ctrl);
-
- spin_lock_init(&ctrl->controller.lock);
- init_waitqueue_head(&ctrl->controller.wq);
- init_waitqueue_head(&ctrl->irq_wait);
-
- ctrl->regs = of_iomap(ofdev->dev.of_node, 0);
- if (!ctrl->regs) {
- dev_err(&ofdev->dev, "failed to get memory region\n");
- ret = -ENODEV;
- goto err;
- }
-
- ctrl->irq = of_irq_to_resource(ofdev->dev.of_node, 0, NULL);
- if (ctrl->irq == NO_IRQ) {
- dev_err(&ofdev->dev, "failed to get irq resource\n");
- ret = -ENODEV;
- goto err;
- }
-
- ctrl->dev = &ofdev->dev;
-
- ret = fsl_elbc_ctrl_init(ctrl);
- if (ret < 0)
- goto err;
-
- ret = request_irq(ctrl->irq, fsl_elbc_ctrl_irq, 0, "fsl-elbc", ctrl);
- if (ret != 0) {
- dev_err(&ofdev->dev, "failed to install irq (%d)\n",
- ctrl->irq);
- ret = ctrl->irq;
- goto err;
- }
-
- for_each_child_of_node(ofdev->dev.of_node, child)
- if (of_device_is_compatible(child, "fsl,elbc-fcm-nand"))
- fsl_elbc_chip_probe(ctrl, child);
+ fsl_lbc_ctrl_dev->nand = NULL;
+ kfree(elbc_fcm_ctrl);
return 0;
-
-err:
- fsl_elbc_ctrl_remove(ofdev);
- return ret;
}
-static const struct of_device_id fsl_elbc_match[] = {
+static const struct of_device_id fsl_elbc_nand_match[] = {
{
- .compatible = "fsl,elbc",
+ .compatible = "fsl,elbc-fcm-nand",
},
{}
};
-static struct of_platform_driver fsl_elbc_ctrl_driver = {
+static struct of_platform_driver fsl_elbc_nand_driver = {
.driver = {
- .name = "fsl-elbc",
+ .name = "fsl,elbc-fcm-nand",
.owner = THIS_MODULE,
- .of_match_table = fsl_elbc_match,
+ .of_match_table = fsl_elbc_nand_match,
},
- .probe = fsl_elbc_ctrl_probe,
- .remove = fsl_elbc_ctrl_remove,
+ .probe = fsl_elbc_nand_probe,
+ .remove = fsl_elbc_nand_remove,
};
-static int __init fsl_elbc_init(void)
+static int __init fsl_elbc_nand_init(void)
{
- return of_register_platform_driver(&fsl_elbc_ctrl_driver);
+ return of_register_platform_driver(&fsl_elbc_nand_driver);
}
-static void __exit fsl_elbc_exit(void)
+static void __exit fsl_elbc_nand_exit(void)
{
- of_unregister_platform_driver(&fsl_elbc_ctrl_driver);
+ of_unregister_platform_driver(&fsl_elbc_nand_driver);
}
-module_init(fsl_elbc_init);
-module_exit(fsl_elbc_exit);
+module_init(fsl_elbc_nand_init);
+module_exit(fsl_elbc_nand_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Freescale");
--
1.5.6.5
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
@ 2010-08-06 2:51 ` Roy Zang
2010-09-03 11:36 ` Anton Vorontsov
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
1 sibling, 1 reply; 21+ messages in thread
From: Roy Zang @ 2010-08-06 2:51 UTC (permalink / raw)
To: linux-mtd; +Cc: B25806, linuxppc-dev, akpm, B11780
From: Lan Chunhe-B25806 <b25806@freescale.com>
When system uses 36bit physical address, res.start is 36bit
physical address. But the function of in_be32 returns 32bit
physical address. Then both of them compared each other is
wrong. So by converting the address of res.start into
the right format fixes this issue.
Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
arch/powerpc/include/asm/fsl_lbc.h | 1 +
arch/powerpc/sysdev/fsl_lbc.c | 33 ++++++++++++++++++++++++++++++++-
drivers/mtd/nand/fsl_elbc_nand.c | 2 +-
3 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/include/asm/fsl_lbc.h b/arch/powerpc/include/asm/fsl_lbc.h
index 9b95eab..28dcf63 100644
--- a/arch/powerpc/include/asm/fsl_lbc.h
+++ b/arch/powerpc/include/asm/fsl_lbc.h
@@ -249,6 +249,7 @@ struct fsl_upm {
int width;
};
+extern unsigned int convert_lbc_address(phys_addr_t addr_base);
extern int fsl_lbc_find(phys_addr_t addr_base);
extern int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm);
diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c
index 9c9e44f..08f98d8 100644
--- a/arch/powerpc/sysdev/fsl_lbc.c
+++ b/arch/powerpc/sysdev/fsl_lbc.c
@@ -31,6 +31,36 @@ struct fsl_lbc_ctrl *fsl_lbc_ctrl_dev;
EXPORT_SYMBOL(fsl_lbc_ctrl_dev);
/**
+ * convert_lbc_address - convert the base address
+ * @addr_base: base address of the memory bank
+ *
+ * This function converts a base address of lbc into the right format for the BR
+ * registers. If the SOC has eLBC then it returns 32bit physical address else
+ * it returns 34bit physical address for local bus(Example: MPC8641).
+ */
+unsigned int convert_lbc_address(phys_addr_t addr_base)
+{
+ void *dev;
+ int compatible;
+
+ dev = of_find_node_by_name(NULL, "localbus");
+ if (!dev) {
+ printk(KERN_INFO "fsl-lbc: can't find localbus node\n");
+ of_node_put(dev);
+ return 0;
+ }
+
+ compatible = of_device_is_compatible(dev, "fsl,elbc");
+ of_node_put(dev);
+ if (compatible)
+ return addr_base & 0xffff8000;
+ else
+ return (addr_base & 0x0ffff8000ull) \
+ | ((addr_base & 0x300000000ull) >> 19);
+}
+EXPORT_SYMBOL(convert_lbc_address);
+
+/**
* fsl_lbc_find - find Localbus bank
* @addr_base: base address of the memory bank
*
@@ -50,7 +80,8 @@ int fsl_lbc_find(phys_addr_t addr_base)
__be32 br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].br);
__be32 or = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].or);
- if (br & BR_V && (br & or & BR_BA) == addr_base)
+ if (br & BR_V && (br & or & BR_BA) \
+ == convert_lbc_address(addr_base))
return i;
}
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index 7bbcb3f..0e8dc40 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -838,7 +838,7 @@ static int __devinit fsl_elbc_nand_probe(struct of_device *dev,
(in_be32(&lbc->bank[bank].br) & BR_MSEL) == BR_MS_FCM &&
(in_be32(&lbc->bank[bank].br) &
in_be32(&lbc->bank[bank].or) & BR_BA)
- == res.start)
+ == convert_lbc_address(res.start))
break;
if (bank >= MAX_BANKS) {
--
1.5.6.5
^ permalink raw reply related [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
@ 2010-08-09 7:33 ` Zang Roy-R61911
2010-08-29 11:06 ` Artem Bityutskiy
2010-08-11 2:45 ` Zang Roy-R61911
` (2 subsequent siblings)
4 siblings, 1 reply; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-08-09 7:33 UTC (permalink / raw)
To: Zang Roy-R61911, linux-mtd
Cc: Lan Chunhe-B25806, linuxppc-dev, akpm, Gala Kumar-B11780
=20
> -----Original Message-----
> From: Zang Roy-R61911=20
> Sent: Friday, August 06, 2010 10:52 AM
> To: linux-mtd@lists.infradead.org
> Cc: linuxppc-dev@ozlabs.org; akpm@linux-foundation.org; Gala=20
> Kumar-B11780; Lan Chunhe-B25806
> Subject: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc=20
> interrupt common to elbc devices
>=20
> From: Lan Chunhe-B25806 <b25806@freescale.com>
>=20
> Move Freescale elbc interrupt from nand dirver to elbc driver.
> Then all elbc devices can use the interrupt instead of ONLY nand.
>=20
> Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> send the patch to linux-mtd@lists.infradead.org
> it has been posted to linuxppc-dev@ozlabs.org and do not get=20
> any comment.
Any comment about this serial patches?
If none, I'd ask Andrew to merge to his mm tree.
Thanks.
Roy
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
2010-08-09 7:33 ` [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Zang Roy-R61911
@ 2010-08-11 2:45 ` Zang Roy-R61911
2010-09-03 10:33 ` Zang Roy-R61911
2010-09-03 11:27 ` Anton Vorontsov
4 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-08-11 2:45 UTC (permalink / raw)
To: Zang Roy-R61911, linux-mtd
Cc: Lan Chunhe-B25806, linuxppc-dev, akpm, Gala Kumar-B11780,
Wood Scott-B07421
=20
> -----Original Message-----
> From: Zang Roy-R61911=20
> Sent: Friday, August 06, 2010 10:52 AM
> To: linux-mtd@lists.infradead.org
> Cc: linuxppc-dev@ozlabs.org; akpm@linux-foundation.org; Gala=20
> Kumar-B11780; Lan Chunhe-B25806
> Subject: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc=20
> interrupt common to elbc devices
>=20
> From: Lan Chunhe-B25806 <b25806@freescale.com>
>=20
> Move Freescale elbc interrupt from nand dirver to elbc driver.
> Then all elbc devices can use the interrupt instead of ONLY nand.
>=20
> Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> send the patch to linux-mtd@lists.infradead.org
> it has been posted to linuxppc-dev@ozlabs.org and do not get=20
> any comment.
>=20
> arch/powerpc/Kconfig | 7 +-
> arch/powerpc/include/asm/fsl_lbc.h | 34 +++++-
> arch/powerpc/sysdev/fsl_lbc.c | 254=20
> ++++++++++++++++++++++++++++++------
> 3 files changed, 253 insertions(+), 42 deletions(-)
Who is response to review the nand driver in mtd list?
Please help to comment on this serial patch.
Thanks.
Roy
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-08-09 7:33 ` [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Zang Roy-R61911
@ 2010-08-29 11:06 ` Artem Bityutskiy
0 siblings, 0 replies; 21+ messages in thread
From: Artem Bityutskiy @ 2010-08-29 11:06 UTC (permalink / raw)
To: Zang Roy-R61911
Cc: Lan Chunhe-B25806, linuxppc-dev, akpm, linux-mtd,
Gala Kumar-B11780
On Mon, 2010-08-09 at 15:33 +0800, Zang Roy-R61911 wrote:
> Any comment about this serial patches?
> If none, I'd ask Andrew to merge to his mm tree.
Could you please separate out MTD stuff, to the extent it is possible to
do?
--
Best Regards,
Artem Bityutskiy (Битюцкий Артём)
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
` (2 preceding siblings ...)
2010-08-11 2:45 ` Zang Roy-R61911
@ 2010-09-03 10:33 ` Zang Roy-R61911
2010-09-03 11:27 ` Anton Vorontsov
4 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-03 10:33 UTC (permalink / raw)
To: Zang Roy-R61911, linux-mtd, Gala Kumar-B11780
Cc: Lan Chunhe-B25806, linuxppc-dev, akpm
> -----Original Message-----
> From: Zang Roy-R61911
> Sent: Friday, August 06, 2010 10:52 AM
> To: linux-mtd@lists.infradead.org
> Cc: linuxppc-dev@ozlabs.org; akpm@linux-foundation.org; Gala
Kumar-B11780; Lan
> Chunhe-B25806
> Subject: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt
common to
> elbc devices
>=20
> From: Lan Chunhe-B25806 <b25806@freescale.com>
>=20
> Move Freescale elbc interrupt from nand dirver to elbc driver.
> Then all elbc devices can use the interrupt instead of ONLY nand.
>=20
> Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> send the patch to linux-mtd@lists.infradead.org
> it has been posted to linuxppc-dev@ozlabs.org and do not get any
comment.
Hi, Kumar
I can see that this patch delegates to you in the mail list.
Do you have any comment?
Today, I rebase the patch to Linux 2.6.26-rc3.
1/3, 3/3 are still OK for the latest tree.
For patch 2/3, some minor fix needs to change for of_dev to
platform_device.
Should I resend the patch?
Thanks.
Roy
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
` (3 preceding siblings ...)
2010-09-03 10:33 ` Zang Roy-R61911
@ 2010-09-03 11:27 ` Anton Vorontsov
2010-09-06 3:38 ` Zang Roy-R61911
4 siblings, 1 reply; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-03 11:27 UTC (permalink / raw)
To: Roy Zang; +Cc: B25806, linuxppc-dev, akpm, linux-mtd, B11780
On Fri, Aug 06, 2010 at 10:51:34AM +0800, Roy Zang wrote:
> From: Lan Chunhe-B25806 <b25806@freescale.com>
>
> Move Freescale elbc interrupt from nand dirver to elbc driver.
> Then all elbc devices can use the interrupt instead of ONLY nand.
>
> Signed-off-by: Lan Chunhe-B25806 <b25806@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
> send the patch to linux-mtd@lists.infradead.org
> it has been posted to linuxppc-dev@ozlabs.org and do not get any comment.
>
> arch/powerpc/Kconfig | 7 +-
> arch/powerpc/include/asm/fsl_lbc.h | 34 +++++-
> arch/powerpc/sysdev/fsl_lbc.c | 254 ++++++++++++++++++++++++++++++------
> 3 files changed, 253 insertions(+), 42 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 2031a28..5155b53 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -703,9 +703,12 @@ config 4xx_SOC
> bool
>
> config FSL_LBC
> - bool
> + bool "Freescale Local Bus support"
> + depends on FSL_SOC
> help
> - Freescale Localbus support
> + Enables reporting of errors from the Freescale local bus
> + controller. Also contains some common code used by
> + drivers for specific local bus peripherals.
>
> config FSL_GTM
> bool
[...]
> diff --git a/arch/powerpc/sysdev/fsl_lbc.c b/arch/powerpc/sysdev/fsl_lbc.c
> index dceb8d1..9c9e44f 100644
> --- a/arch/powerpc/sysdev/fsl_lbc.c
> +++ b/arch/powerpc/sysdev/fsl_lbc.c
> @@ -5,6 +5,10 @@
> *
> * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
> *
> + * Copyright (c) 2010 Freescale Semiconductor
> + *
> + * Authors: Jack Lan <Jack.Lan@freescale.com>
Would be prettier if you'd group copyright and authorship notices.
I.e.
Copyright 2008 MV
Copyright 2010 FSL
Authors: Anton
Jack
> + *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License as published by
> * the Free Software Foundation; either version 2 of the License, or
> @@ -23,35 +27,8 @@
> #include <asm/fsl_lbc.h>
>
> static spinlock_t fsl_lbc_lock = __SPIN_LOCK_UNLOCKED(fsl_lbc_lock);
> -static struct fsl_lbc_regs __iomem *fsl_lbc_regs;
> -
> -static char __initdata *compat_lbc[] = {
> - "fsl,pq2-localbus",
> - "fsl,pq2pro-localbus",
> - "fsl,pq3-localbus",
> - "fsl,elbc",
> -};
> -
> -static int __init fsl_lbc_init(void)
> -{
> - struct device_node *lbus;
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(compat_lbc); i++) {
> - lbus = of_find_compatible_node(NULL, NULL, compat_lbc[i]);
> - if (lbus)
> - goto found;
> - }
> - return -ENODEV;
> -
> -found:
> - fsl_lbc_regs = of_iomap(lbus, 0);
> - of_node_put(lbus);
> - if (!fsl_lbc_regs)
> - return -ENOMEM;
> - return 0;
> -}
> -arch_initcall(fsl_lbc_init);
> +struct fsl_lbc_ctrl *fsl_lbc_ctrl_dev;
> +EXPORT_SYMBOL(fsl_lbc_ctrl_dev);
>
> /**
> * fsl_lbc_find - find Localbus bank
> @@ -66,12 +43,12 @@ int fsl_lbc_find(phys_addr_t addr_base)
> {
> int i;
>
> - if (!fsl_lbc_regs)
> + if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
> return -ENODEV;
>
> - for (i = 0; i < ARRAY_SIZE(fsl_lbc_regs->bank); i++) {
> - __be32 br = in_be32(&fsl_lbc_regs->bank[i].br);
> - __be32 or = in_be32(&fsl_lbc_regs->bank[i].or);
> + for (i = 0; i < ARRAY_SIZE(fsl_lbc_ctrl_dev->regs->bank); i++) {
> + __be32 br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].br);
> + __be32 or = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].or);
A dedicated variable for regs would make this much more readable?
>
> if (br & BR_V && (br & or & BR_BA) == addr_base)
> return i;
> @@ -99,17 +76,20 @@ int fsl_upm_find(phys_addr_t addr_base, struct fsl_upm *upm)
> if (bank < 0)
> return bank;
>
> - br = in_be32(&fsl_lbc_regs->bank[bank].br);
> + if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
> + return -ENODEV;
> +
> + br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[bank].br);
>
> switch (br & BR_MSEL) {
> case BR_MS_UPMA:
> - upm->mxmr = &fsl_lbc_regs->mamr;
> + upm->mxmr = &fsl_lbc_ctrl_dev->regs->mamr;
Ditto, a very repetitive stuff, desires a variable for regs?
> break;
> case BR_MS_UPMB:
> - upm->mxmr = &fsl_lbc_regs->mbmr;
> + upm->mxmr = &fsl_lbc_ctrl_dev->regs->mbmr;
> break;
> case BR_MS_UPMC:
> - upm->mxmr = &fsl_lbc_regs->mcmr;
> + upm->mxmr = &fsl_lbc_ctrl_dev->regs->mcmr;
> break;
> default:
> return -EINVAL;
> @@ -143,14 +123,18 @@ EXPORT_SYMBOL(fsl_upm_find);
> * thus UPM pattern actually executed. Note that mar usage depends on the
> * pre-programmed AMX bits in the UPM RAM.
> */
> +
> int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
> {
> int ret = 0;
> unsigned long flags;
>
> + if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)
> + return -ENODEV;
> +
> spin_lock_irqsave(&fsl_lbc_lock, flags);
>
> - out_be32(&fsl_lbc_regs->mar, mar);
> + out_be32(&fsl_lbc_ctrl_dev->regs->mar, mar);
>
> switch (upm->width) {
> case 8:
> @@ -172,3 +156,197 @@ int fsl_upm_run_pattern(struct fsl_upm *upm, void __iomem *io_base, u32 mar)
> return ret;
> }
> EXPORT_SYMBOL(fsl_upm_run_pattern);
> +
> +static int __devinit fsl_lbc_ctrl_init(struct fsl_lbc_ctrl *ctrl)
> +{
> + struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
Yep, something like this for the functions above.
> +
> + /* clear event registers */
> + setbits32(&lbc->ltesr, LTESR_CLEAR);
> + out_be32(&lbc->lteatr, 0);
> + out_be32(&lbc->ltear, 0);
> + out_be32(&lbc->lteccr, LTECCR_CLEAR);
> + out_be32(&lbc->ltedr, LTEDR_ENABLE);
> +
> + /* Enable interrupts for any detected events */
> + out_be32(&lbc->lteir, LTEIR_ENABLE);
> +
> + return 0;
> +}
> +
> +static int __devexit fsl_lbc_ctrl_remove(struct of_device *ofdev)
> +{
> + struct fsl_lbc_ctrl *ctrl = dev_get_drvdata(&ofdev->dev);
> +
> + if (ctrl->irq)
> + free_irq(ctrl->irq, ctrl);
> +
> + if (ctrl->regs)
> + iounmap(ctrl->regs);
> +
> + dev_set_drvdata(&ofdev->dev, NULL);
> + kfree(ctrl);
> +
> + return 0;
> +}
> +
> +/* NOTE: This interrupt is used to report localbus events of various kinds,
> + * such as transaction errors on the chipselects.
> + */
/*
* multi line comments
* should be like this
*/
[...]
> +/* fsl_lbc_ctrl_probe
> + *
> + * called by device layer when it finds a device matching
> + * one our driver can handled. This code allocates all of
> + * the resources needed for the controller only. The
> + * resources for the NAND banks themselves are allocated
> + * in the chip probe function.
> +*/
ditto.
> +static int __devinit fsl_lbc_ctrl_probe(struct of_device *ofdev,
> + const struct of_device_id *match)
> +{
> + int ret = 0;
no need for the initial value here.
> +
> + fsl_lbc_ctrl_dev = kzalloc(sizeof(*fsl_lbc_ctrl_dev), GFP_KERNEL);
> + if (!fsl_lbc_ctrl_dev)
> + return -ENOMEM;
> +
> + dev_set_drvdata(&ofdev->dev, fsl_lbc_ctrl_dev);
> +
> + spin_lock_init(&fsl_lbc_ctrl_dev->lock);
> + init_waitqueue_head(&fsl_lbc_ctrl_dev->irq_wait);
> +
> + fsl_lbc_ctrl_dev->regs = of_iomap(ofdev->dev.of_node, 0);
> + if (!fsl_lbc_ctrl_dev->regs) {
> + dev_err(&ofdev->dev, "failed to get memory region\n");
> + ret = -ENODEV;
> + goto err;
> + }
> +
> + fsl_lbc_ctrl_dev->irq = of_irq_to_resource(ofdev->dev.of_node, 0, NULL);
> + if (fsl_lbc_ctrl_dev->irq == NO_IRQ) {
> + dev_err(&ofdev->dev, "failed to get irq resource\n");
> + ret = -ENODEV;
> + goto err;
> + }
> +
> + fsl_lbc_ctrl_dev->dev = &ofdev->dev;
> +
> + ret = fsl_lbc_ctrl_init(fsl_lbc_ctrl_dev);
> + if (ret < 0)
> + goto err;
> +
> + ret = request_irq(fsl_lbc_ctrl_dev->irq, fsl_lbc_ctrl_irq, 0,
> + "fsl-lbc", fsl_lbc_ctrl_dev);
> + if (ret != 0) {
> + dev_err(&ofdev->dev, "failed to install irq (%d)\n",
> + fsl_lbc_ctrl_dev->irq);
> + ret = fsl_lbc_ctrl_dev->irq;
> + goto err;
> + }
> +
> + return 0;
> +
> +err:
fsl_lbc_ctrl_dev leaked. Plus, after freeing it, you should
NULLify it as well, as other functions checks it for !NULL.
fsl_lbc_ctrl_dev->regs leaks too.
> + return ret;
> +}
> +
> +static const struct of_device_id fsl_lbc_match[] = {
> + {
> + .compatible = "fsl,elbc",
> + },
> + {
> + .compatible = "fsl,pq3-localbus",
> + },
> + {
> + .compatible = "fsl,pq2-localbus",
> + },
> + {
> + .compatible = "fsl,pq2pro-localbus",
> + },
> + {},
Could save 8 lines by writing "{ .compatible = "...", },".
> +};
> +
> +static struct of_platform_driver fsl_lbc_ctrl_driver = {
I think you shouldn't use of_platform for new code. just platform
will work (there's platform_driver.driver.of_match_table nowadays).
> + .driver = {
> + .name = "fsl-lbc",
> + .of_match_table = fsl_lbc_match,
> + },
> + .probe = fsl_lbc_ctrl_probe,
> + .remove = __devexit_p(fsl_lbc_ctrl_remove),
The device is not removable, I think you don't need this.
> +};
> +
> +static int __init fsl_lbc_init(void)
> +{
> + return of_register_platform_driver(&fsl_lbc_ctrl_driver);
> +}
> +
> +static void __exit fsl_lbc_exit(void)
> +{
> + of_unregister_platform_driver(&fsl_lbc_ctrl_driver);
> +}
> +
> +module_init(fsl_lbc_init);
> +module_exit(fsl_lbc_exit);
fsl_lbc is not a module, so you don't need _exit().
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Freescale Semiconductor");
> +MODULE_DESCRIPTION("Freescale Enhanced Local Bus Controller driver");
ditto, no need for this.
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode
2010-08-06 2:51 ` [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode Roy Zang
@ 2010-09-03 11:36 ` Anton Vorontsov
2010-09-06 3:56 ` Zang Roy-R61911
0 siblings, 1 reply; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-03 11:36 UTC (permalink / raw)
To: Roy Zang; +Cc: B25806, linuxppc-dev, akpm, linux-mtd, B11780
On Fri, Aug 06, 2010 at 10:51:36AM +0800, Roy Zang wrote:
[...]
> /**
> + * convert_lbc_address - convert the base address
> + * @addr_base: base address of the memory bank
> + *
> + * This function converts a base address of lbc into the right format for the BR
> + * registers. If the SOC has eLBC then it returns 32bit physical address else
> + * it returns 34bit physical address for local bus(Example: MPC8641).
> + */
> +unsigned int convert_lbc_address(phys_addr_t addr_base)
> +{
> + void *dev;
> + int compatible;
> +
> + dev = of_find_node_by_name(NULL, "localbus");
Nope, you shouldn't do this. Never search by name.
Also, aren't there already a global dev, which was found by the
_probe() stuff?
> + if (!dev) {
> + printk(KERN_INFO "fsl-lbc: can't find localbus node\n");
> + of_node_put(dev);
> + return 0;
> + }
> +
> + compatible = of_device_is_compatible(dev, "fsl,elbc");
> + of_node_put(dev);
> + if (compatible)
> + return addr_base & 0xffff8000;
> + else
> + return (addr_base & 0x0ffff8000ull) \
> + | ((addr_base & 0x300000000ull) >> 19);
> +}
> +EXPORT_SYMBOL(convert_lbc_address);
> +
> +/**
> * fsl_lbc_find - find Localbus bank
> * @addr_base: base address of the memory bank
> *
> @@ -50,7 +80,8 @@ int fsl_lbc_find(phys_addr_t addr_base)
> __be32 br = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].br);
> __be32 or = in_be32(&fsl_lbc_ctrl_dev->regs->bank[i].or);
>
> - if (br & BR_V && (br & or & BR_BA) == addr_base)
> + if (br & BR_V && (br & or & BR_BA) \
No need for "\" at the end of the line, keep == on the same line.
> + == convert_lbc_address(addr_base))
Would be prettier if you name it fsl_lbc_addr(). Keeps prefix
the same for the rest of the file, plus makes it shorter (so
there probably won't be any need for breaking the line).
> return i;
> }
>
> diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
> index 7bbcb3f..0e8dc40 100644
> --- a/drivers/mtd/nand/fsl_elbc_nand.c
> +++ b/drivers/mtd/nand/fsl_elbc_nand.c
> @@ -838,7 +838,7 @@ static int __devinit fsl_elbc_nand_probe(struct of_device *dev,
> (in_be32(&lbc->bank[bank].br) & BR_MSEL) == BR_MS_FCM &&
> (in_be32(&lbc->bank[bank].br) &
> in_be32(&lbc->bank[bank].or) & BR_BA)
> - == res.start)
> + == convert_lbc_address(res.start))
> break;
>
> if (bank >= MAX_BANKS) {
> --
> 1.5.6.5
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
2010-08-06 2:51 ` [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode Roy Zang
@ 2010-09-03 11:43 ` Anton Vorontsov
2010-09-03 17:33 ` Scott Wood
` (2 more replies)
1 sibling, 3 replies; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-03 11:43 UTC (permalink / raw)
To: Roy Zang; +Cc: B25806, linuxppc-dev, linux-mtd, Scott Wood, akpm, B11780
On Fri, Aug 06, 2010 at 10:51:35AM +0800, Roy Zang wrote:
[...]
>
> +static struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl;
> +
Are you sure that you want it as a global var? A bit scary change.
Oh, you probably don't need it, as you can get it from
fsl_lbc_ctrl_dev->nand?
I wonder if Scott saw these patches? Cc'ed.
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
@ 2010-09-03 17:33 ` Scott Wood
2010-09-06 3:40 ` Zang Roy-R61911
2010-09-06 4:49 ` Zang Roy-R61911
2 siblings, 0 replies; 21+ messages in thread
From: Scott Wood @ 2010-09-03 17:33 UTC (permalink / raw)
To: Anton Vorontsov; +Cc: B25806, linuxppc-dev, linux-mtd, akpm, B11780
On Fri, 3 Sep 2010 15:43:57 +0400
Anton Vorontsov <cbouatmailru@gmail.com> wrote:
> On Fri, Aug 06, 2010 at 10:51:35AM +0800, Roy Zang wrote:
> [...]
> >
> > +static struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl;
> > +
>
> Are you sure that you want it as a global var? A bit scary change.
>
> Oh, you probably don't need it, as you can get it from
> fsl_lbc_ctrl_dev->nand?
>
> I wonder if Scott saw these patches? Cc'ed.
I saw many iterations of these patches. :-)
I had the same reaction to this, but during internal review it did not
seem to be the most pressing concern to focus on.
In practice, there will only be one eLBC, and properly handling multiple
devices and binding the right one across this new boundary would have
been unnecessary complexity.
-Scott
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-09-03 11:27 ` Anton Vorontsov
@ 2010-09-06 3:38 ` Zang Roy-R61911
2010-09-06 8:21 ` Anton Vorontsov
0 siblings, 1 reply; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 3:38 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1i
ZXIgMDMsIDIwMTAgMTk6MjggUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODANCj4gU3ViamVjdDogUmU6IFtQQVRDSCAxLzNdW01URF0gUDQwODAvZUxCQzogTWFrZSBGcmVl
c2NhbGUgZWxiYyBpbnRlcnJ1cHQgY29tbW9uDQo+IHRvIGVsYmMgZGV2aWNlcw0KPiANCj4gT24g
RnJpLCBBdWcgMDYsIDIwMTAgYXQgMTA6NTE6MzRBTSArMDgwMCwgUm95IFphbmcgd3JvdGU6DQo+
ID4gRnJvbTogTGFuIENodW5oZS1CMjU4MDYgPGIyNTgwNkBmcmVlc2NhbGUuY29tPg0KPiA+DQo+
ID4gTW92ZSBGcmVlc2NhbGUgZWxiYyBpbnRlcnJ1cHQgZnJvbSBuYW5kIGRpcnZlciB0byBlbGJj
IGRyaXZlci4NCj4gPiBUaGVuIGFsbCBlbGJjIGRldmljZXMgY2FuIHVzZSB0aGUgaW50ZXJydXB0
IGluc3RlYWQgb2YgT05MWSBuYW5kLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogTGFuIENodW5o
ZS1CMjU4MDYgPGIyNTgwNkBmcmVlc2NhbGUuY29tPg0KPiA+IFNpZ25lZC1vZmYtYnk6IFJveSBa
YW5nIDx0aWUtZmVpLnphbmdAZnJlZXNjYWxlLmNvbT4NCj4gPiAtLS0NCj4gPiBzZW5kIHRoZSBw
YXRjaCB0byBsaW51eC1tdGRAbGlzdHMuaW5mcmFkZWFkLm9yZw0KPiA+IGl0IGhhcyBiZWVuIHBv
c3RlZCB0byBsaW51eHBwYy1kZXZAb3psYWJzLm9yZyBhbmQgZG8gbm90IGdldCBhbnkgY29tbWVu
dC4NCj4gPg0KPiA+ICBhcmNoL3Bvd2VycGMvS2NvbmZpZyAgICAgICAgICAgICAgIHwgICAgNyAr
LQ0KPiA+ICBhcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2xiYy5oIHwgICAzNCArKysrKy0N
Cj4gPiAgYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMgICAgICB8ICAyNTQgKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrLS0tDQo+IC0tLQ0KPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDI1
MyBpbnNlcnRpb25zKCspLCA0MiBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9h
cmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnDQo+ID4gaW5kZXggMjAz
MWEyOC4uNTE1NWI1MyAxMDA2NDQNCj4gPiAtLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZw0KPiA+
ICsrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnDQo+ID4gQEAgLTcwMyw5ICs3MDMsMTIgQEAgY29u
ZmlnIDR4eF9TT0MNCj4gPiAgCWJvb2wNCj4gPg0KPiA+ICBjb25maWcgRlNMX0xCQw0KPiA+IC0J
Ym9vbA0KPiA+ICsJYm9vbCAiRnJlZXNjYWxlIExvY2FsIEJ1cyBzdXBwb3J0Ig0KPiA+ICsJZGVw
ZW5kcyBvbiBGU0xfU09DDQo+ID4gIAloZWxwDQo+ID4gLQkgIEZyZWVzY2FsZSBMb2NhbGJ1cyBz
dXBwb3J0DQo+ID4gKwkgIEVuYWJsZXMgcmVwb3J0aW5nIG9mIGVycm9ycyBmcm9tIHRoZSBGcmVl
c2NhbGUgbG9jYWwgYnVzDQo+ID4gKwkgIGNvbnRyb2xsZXIuICBBbHNvIGNvbnRhaW5zIHNvbWUg
Y29tbW9uIGNvZGUgdXNlZCBieQ0KPiA+ICsJICBkcml2ZXJzIGZvciBzcGVjaWZpYyBsb2NhbCBi
dXMgcGVyaXBoZXJhbHMuDQo+ID4NCj4gPiAgY29uZmlnIEZTTF9HVE0NCj4gPiAgCWJvb2wNCj4g
Wy4uLl0NCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMgYi9h
cmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYw0KPiA+IGluZGV4IGRjZWI4ZDEuLjljOWU0NGYg
MTAwNjQ0DQo+ID4gLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMNCj4gPiArKysg
Yi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYw0KPiA+IEBAIC01LDYgKzUsMTAgQEANCj4g
PiAgICoNCj4gPiAgICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZp
c3RhLmNvbT4NCj4gPiAgICoNCj4gPiArICogQ29weXJpZ2h0IChjKSAyMDEwIEZyZWVzY2FsZSBT
ZW1pY29uZHVjdG9yDQo+ID4gKyAqDQo+ID4gKyAqIEF1dGhvcnM6IEphY2sgTGFuIDxKYWNrLkxh
bkBmcmVlc2NhbGUuY29tPg0KPiANCj4gV291bGQgYmUgcHJldHRpZXIgaWYgeW91J2QgZ3JvdXAg
Y29weXJpZ2h0IGFuZCBhdXRob3JzaGlwIG5vdGljZXMuDQo+IEkuZS4NCj4gDQo+IENvcHlyaWdo
dCAyMDA4IE1WDQo+IENvcHlyaWdodCAyMDEwIEZTTA0KPiANCj4gQXV0aG9yczogQW50b24NCj4g
ICAgICAgICAgSmFjaw0KVGhlbiBob3cgdG8gcmVmbGVjdCB0aGUgcmVsYXRpb25zaGlwIG9mIHRo
ZSBBdXRob3IgYW5kIHRoZSBjb21wYW55PyBmcm9tIGVtYWlsIGFkZHJlc3M/DQoNCj4gDQo+ID4g
KyAqDQo+ID4gICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQo+ID4gICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQo+ID4gICAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yDQo+ID4gQEAgLTIzLDM1ICsyNyw4IEBADQo+ID4gICNpbmNsdWRlIDxhc20vZnNsX2xi
Yy5oPg0KPiA+DQo+ID4gIHN0YXRpYyBzcGlubG9ja190IGZzbF9sYmNfbG9jayA9IF9fU1BJTl9M
T0NLX1VOTE9DS0VEKGZzbF9sYmNfbG9jayk7DQo+ID4gLXN0YXRpYyBzdHJ1Y3QgZnNsX2xiY19y
ZWdzIF9faW9tZW0gKmZzbF9sYmNfcmVnczsNCj4gPiAtDQo+ID4gLXN0YXRpYyBjaGFyIF9faW5p
dGRhdGEgKmNvbXBhdF9sYmNbXSA9IHsNCj4gPiAtCSJmc2wscHEyLWxvY2FsYnVzIiwNCj4gPiAt
CSJmc2wscHEycHJvLWxvY2FsYnVzIiwNCj4gPiAtCSJmc2wscHEzLWxvY2FsYnVzIiwNCj4gPiAt
CSJmc2wsZWxiYyIsDQo+ID4gLX07DQo+ID4gLQ0KPiA+IC1zdGF0aWMgaW50IF9faW5pdCBmc2xf
bGJjX2luaXQodm9pZCkNCj4gPiAtew0KPiA+IC0Jc3RydWN0IGRldmljZV9ub2RlICpsYnVzOw0K
PiA+IC0JaW50IGk7DQo+ID4gLQ0KPiA+IC0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29t
cGF0X2xiYyk7IGkrKykgew0KPiA+IC0JCWxidXMgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShO
VUxMLCBOVUxMLCBjb21wYXRfbGJjW2ldKTsNCj4gPiAtCQlpZiAobGJ1cykNCj4gPiAtCQkJZ290
byBmb3VuZDsNCj4gPiAtCX0NCj4gPiAtCXJldHVybiAtRU5PREVWOw0KPiA+IC0NCj4gPiAtZm91
bmQ6DQo+ID4gLQlmc2xfbGJjX3JlZ3MgPSBvZl9pb21hcChsYnVzLCAwKTsNCj4gPiAtCW9mX25v
ZGVfcHV0KGxidXMpOw0KPiA+IC0JaWYgKCFmc2xfbGJjX3JlZ3MpDQo+ID4gLQkJcmV0dXJuIC1F
Tk9NRU07DQo+ID4gLQlyZXR1cm4gMDsNCj4gPiAtfQ0KPiA+IC1hcmNoX2luaXRjYWxsKGZzbF9s
YmNfaW5pdCk7DQo+ID4gK3N0cnVjdCBmc2xfbGJjX2N0cmwgKmZzbF9sYmNfY3RybF9kZXY7DQo+
ID4gK0VYUE9SVF9TWU1CT0woZnNsX2xiY19jdHJsX2Rldik7DQo+ID4NCj4gPiAgLyoqDQo+ID4g
ICAqIGZzbF9sYmNfZmluZCAtIGZpbmQgTG9jYWxidXMgYmFuaw0KPiA+IEBAIC02NiwxMiArNDMs
MTIgQEAgaW50IGZzbF9sYmNfZmluZChwaHlzX2FkZHJfdCBhZGRyX2Jhc2UpDQo+ID4gIHsNCj4g
PiAgCWludCBpOw0KPiA+DQo+ID4gLQlpZiAoIWZzbF9sYmNfcmVncykNCj4gPiArCWlmICghZnNs
X2xiY19jdHJsX2RldiB8fCAhZnNsX2xiY19jdHJsX2Rldi0+cmVncykNCj4gPiAgCQlyZXR1cm4g
LUVOT0RFVjsNCj4gPg0KPiA+IC0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX2xiY19y
ZWdzLT5iYW5rKTsgaSsrKSB7DQo+ID4gLQkJX19iZTMyIGJyID0gaW5fYmUzMigmZnNsX2xiY19y
ZWdzLT5iYW5rW2ldLmJyKTsNCj4gPiAtCQlfX2JlMzIgb3IgPSBpbl9iZTMyKCZmc2xfbGJjX3Jl
Z3MtPmJhbmtbaV0ub3IpOw0KPiA+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX2xi
Y19jdHJsX2Rldi0+cmVncy0+YmFuayk7IGkrKykgew0KPiA+ICsJCV9fYmUzMiBiciA9IGluX2Jl
MzIoJmZzbF9sYmNfY3RybF9kZXYtPnJlZ3MtPmJhbmtbaV0uYnIpOw0KPiA+ICsJCV9fYmUzMiBv
ciA9IGluX2JlMzIoJmZzbF9sYmNfY3RybF9kZXYtPnJlZ3MtPmJhbmtbaV0ub3IpOw0KPiANCj4g
QSBkZWRpY2F0ZWQgdmFyaWFibGUgZm9yIHJlZ3Mgd291bGQgbWFrZSB0aGlzIG11Y2ggbW9yZSBy
ZWFkYWJsZT8NClllcy4gY29uc2lkZXJpbmcgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gbGluZS4N
Cj4gDQo+ID4NCj4gPiAgCQlpZiAoYnIgJiBCUl9WICYmIChiciAmIG9yICYgQlJfQkEpID09IGFk
ZHJfYmFzZSkNCj4gPiAgCQkJcmV0dXJuIGk7DQo+ID4gQEAgLTk5LDE3ICs3NiwyMCBAQCBpbnQg
ZnNsX3VwbV9maW5kKHBoeXNfYWRkcl90IGFkZHJfYmFzZSwgc3RydWN0IGZzbF91cG0NCj4gKnVw
bSkNCj4gPiAgCWlmIChiYW5rIDwgMCkNCj4gPiAgCQlyZXR1cm4gYmFuazsNCj4gPg0KPiA+IC0J
YnIgPSBpbl9iZTMyKCZmc2xfbGJjX3JlZ3MtPmJhbmtbYmFua10uYnIpOw0KPiA+ICsJaWYgKCFm
c2xfbGJjX2N0cmxfZGV2IHx8ICFmc2xfbGJjX2N0cmxfZGV2LT5yZWdzKQ0KPiA+ICsJCXJldHVy
biAtRU5PREVWOw0KPiA+ICsNCj4gPiArCWJyID0gaW5fYmUzMigmZnNsX2xiY19jdHJsX2Rldi0+
cmVncy0+YmFua1tiYW5rXS5icik7DQo+ID4NCj4gPiAgCXN3aXRjaCAoYnIgJiBCUl9NU0VMKSB7
DQo+ID4gIAljYXNlIEJSX01TX1VQTUE6DQo+ID4gLQkJdXBtLT5teG1yID0gJmZzbF9sYmNfcmVn
cy0+bWFtcjsNCj4gPiArCQl1cG0tPm14bXIgPSAmZnNsX2xiY19jdHJsX2Rldi0+cmVncy0+bWFt
cjsNCj4gDQo+IERpdHRvLCBhIHZlcnkgcmVwZXRpdGl2ZSBzdHVmZiwgZGVzaXJlcyBhIHZhcmlh
YmxlIGZvciByZWdzPw0KQnV0IHRoZSBmYWN0IGlzIHRoYXQgdGhlIHZhcmlhYmxlIHJlcHJlc2Vu
dHMgZGlmZmVyZW50IHJlZyBhZGRyZXNzIGFjY29yZGluZyB0byB0aGUgY29uZGl0aW9uLiBJdCB3
aWxsIGJlIHVnbHkgdG8gdXNlIHRoZSByZWcgYWRkcmVzcyBkaXJlY3RvbHkuDQo+IA0KPiA+ICAJ
CWJyZWFrOw0KPiA+ICAJY2FzZSBCUl9NU19VUE1COg0KPiA+IC0JCXVwbS0+bXhtciA9ICZmc2xf
bGJjX3JlZ3MtPm1ibXI7DQo+ID4gKwkJdXBtLT5teG1yID0gJmZzbF9sYmNfY3RybF9kZXYtPnJl
Z3MtPm1ibXI7DQo+ID4gIAkJYnJlYWs7DQo+ID4gIAljYXNlIEJSX01TX1VQTUM6DQo+ID4gLQkJ
dXBtLT5teG1yID0gJmZzbF9sYmNfcmVncy0+bWNtcjsNCj4gPiArCQl1cG0tPm14bXIgPSAmZnNs
X2xiY19jdHJsX2Rldi0+cmVncy0+bWNtcjsNCj4gPiAgCQlicmVhazsNCj4gPiAgCWRlZmF1bHQ6
DQo+ID4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+ID4gQEAgLTE0MywxNCArMTIzLDE4IEBAIEVYUE9S
VF9TWU1CT0woZnNsX3VwbV9maW5kKTsNCj4gPiAgICogdGh1cyBVUE0gcGF0dGVybiBhY3R1YWxs
eSBleGVjdXRlZC4gTm90ZSB0aGF0IG1hciB1c2FnZSBkZXBlbmRzIG9uIHRoZQ0KPiA+ICAgKiBw
cmUtcHJvZ3JhbW1lZCBBTVggYml0cyBpbiB0aGUgVVBNIFJBTS4NCj4gPiAgICovDQo+ID4gKw0K
PiA+ICBpbnQgZnNsX3VwbV9ydW5fcGF0dGVybihzdHJ1Y3QgZnNsX3VwbSAqdXBtLCB2b2lkIF9f
aW9tZW0gKmlvX2Jhc2UsIHUzMiBtYXIpDQo+ID4gIHsNCj4gPiAgCWludCByZXQgPSAwOw0KPiA+
ICAJdW5zaWduZWQgbG9uZyBmbGFnczsNCj4gPg0KPiA+ICsJaWYgKCFmc2xfbGJjX2N0cmxfZGV2
IHx8ICFmc2xfbGJjX2N0cmxfZGV2LT5yZWdzKQ0KPiA+ICsJCXJldHVybiAtRU5PREVWOw0KPiA+
ICsNCj4gPiAgCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfbGJjX2xvY2ssIGZsYWdzKTsNCj4gPg0K
PiA+IC0Jb3V0X2JlMzIoJmZzbF9sYmNfcmVncy0+bWFyLCBtYXIpOw0KPiA+ICsJb3V0X2JlMzIo
JmZzbF9sYmNfY3RybF9kZXYtPnJlZ3MtPm1hciwgbWFyKTsNCj4gPg0KPiA+ICAJc3dpdGNoICh1
cG0tPndpZHRoKSB7DQo+ID4gIAljYXNlIDg6DQo+ID4gQEAgLTE3MiwzICsxNTYsMTk3IEBAIGlu
dCBmc2xfdXBtX3J1bl9wYXR0ZXJuKHN0cnVjdCBmc2xfdXBtICp1cG0sIHZvaWQNCj4gX19pb21l
bSAqaW9fYmFzZSwgdTMyIG1hcikNCj4gPiAgCXJldHVybiByZXQ7DQo+ID4gIH0NCj4gPiAgRVhQ
T1JUX1NZTUJPTChmc2xfdXBtX3J1bl9wYXR0ZXJuKTsNCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQg
X19kZXZpbml0IGZzbF9sYmNfY3RybF9pbml0KHN0cnVjdCBmc2xfbGJjX2N0cmwgKmN0cmwpDQo+
ID4gK3sNCj4gPiArCXN0cnVjdCBmc2xfbGJjX3JlZ3MgX19pb21lbSAqbGJjID0gY3RybC0+cmVn
czsNCj4gDQo+IFllcCwgc29tZXRoaW5nIGxpa2UgdGhpcyBmb3IgdGhlIGZ1bmN0aW9ucyBhYm92
ZS4NCkkgZG8gbm90IHNlZSBhbnkgaGFybSB0byBhZGQgYSB2YXJpYWJsZSBsYmMgaW4gdGhlIGZ1
bmN0aW9uIHRvIGluY3JlYXNlIHRoZSByZWFkYWJsZS4NCj4gDQo+ID4gKw0KPiA+ICsJLyogY2xl
YXIgZXZlbnQgcmVnaXN0ZXJzICovDQo+ID4gKwlzZXRiaXRzMzIoJmxiYy0+bHRlc3IsIExURVNS
X0NMRUFSKTsNCj4gPiArCW91dF9iZTMyKCZsYmMtPmx0ZWF0ciwgMCk7DQo+ID4gKwlvdXRfYmUz
MigmbGJjLT5sdGVhciwgMCk7DQo+ID4gKwlvdXRfYmUzMigmbGJjLT5sdGVjY3IsIExURUNDUl9D
TEVBUik7DQo+ID4gKwlvdXRfYmUzMigmbGJjLT5sdGVkciwgTFRFRFJfRU5BQkxFKTsNCj4gPiAr
DQo+ID4gKwkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgYW55IGRldGVjdGVkIGV2ZW50cyAqLw0K
PiA+ICsJb3V0X2JlMzIoJmxiYy0+bHRlaXIsIExURUlSX0VOQUJMRSk7DQo+ID4gKw0KPiA+ICsJ
cmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgX19kZXZleGl0IGZzbF9s
YmNfY3RybF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpDQo+ID4gK3sNCj4gPiArCXN0
cnVjdCBmc2xfbGJjX2N0cmwgKmN0cmwgPSBkZXZfZ2V0X2RydmRhdGEoJm9mZGV2LT5kZXYpOw0K
PiA+ICsNCj4gPiArCWlmIChjdHJsLT5pcnEpDQo+ID4gKwkJZnJlZV9pcnEoY3RybC0+aXJxLCBj
dHJsKTsNCj4gPiArDQo+ID4gKwlpZiAoY3RybC0+cmVncykNCj4gPiArCQlpb3VubWFwKGN0cmwt
PnJlZ3MpOw0KPiA+ICsNCj4gPiArCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgTlVMTCk7
DQo+ID4gKwlrZnJlZShjdHJsKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiA+
ICsNCj4gPiArLyogTk9URTogVGhpcyBpbnRlcnJ1cHQgaXMgdXNlZCB0byByZXBvcnQgbG9jYWxi
dXMgZXZlbnRzIG9mIHZhcmlvdXMga2luZHMsDQo+ID4gKyAqIHN1Y2ggYXMgdHJhbnNhY3Rpb24g
ZXJyb3JzIG9uIHRoZSBjaGlwc2VsZWN0cy4NCj4gPiArICovDQo+IA0KPiAvKg0KPiAgKiBtdWx0
aSBsaW5lIGNvbW1lbnRzDQo+ICAqIHNob3VsZCBiZSBsaWtlIHRoaXMNCj4gICovDQpPSy4NCg0K
PiANCj4gWy4uLl0NCj4gPiArLyogZnNsX2xiY19jdHJsX3Byb2JlDQo+ID4gKyAqDQo+ID4gKyAq
IGNhbGxlZCBieSBkZXZpY2UgbGF5ZXIgd2hlbiBpdCBmaW5kcyBhIGRldmljZSBtYXRjaGluZw0K
PiA+ICsgKiBvbmUgb3VyIGRyaXZlciBjYW4gaGFuZGxlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcyBh
bGwgb2YNCj4gPiArICogdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIHRoZSBjb250cm9sbGVyIG9u
bHkuICBUaGUNCj4gPiArICogcmVzb3VyY2VzIGZvciB0aGUgTkFORCBiYW5rcyB0aGVtc2VsdmVz
IGFyZSBhbGxvY2F0ZWQNCj4gPiArICogaW4gdGhlIGNoaXAgcHJvYmUgZnVuY3Rpb24uDQo+ID4g
KyovDQo+IA0KPiBkaXR0by4NCk9LLg0KPiANCj4gPiArc3RhdGljIGludCBfX2RldmluaXQgZnNs
X2xiY19jdHJsX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LA0KPiA+ICsJCQkJCSBjb25z
dCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkNCj4gPiArew0KPiA+ICsJaW50IHJldCA9IDA7
DQo+IA0KPiBubyBuZWVkIGZvciB0aGUgaW5pdGlhbCB2YWx1ZSBoZXJlLg0KQW55IGhhcm0/DQoN
Cj4gDQo+ID4gKw0KPiA+ICsJZnNsX2xiY19jdHJsX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpmc2xf
bGJjX2N0cmxfZGV2KSwgR0ZQX0tFUk5FTCk7DQo+ID4gKwlpZiAoIWZzbF9sYmNfY3RybF9kZXYp
DQo+ID4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJZGV2X3NldF9kcnZkYXRhKCZv
ZmRldi0+ZGV2LCBmc2xfbGJjX2N0cmxfZGV2KTsNCj4gPiArDQo+ID4gKwlzcGluX2xvY2tfaW5p
dCgmZnNsX2xiY19jdHJsX2Rldi0+bG9jayk7DQo+ID4gKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZm
c2xfbGJjX2N0cmxfZGV2LT5pcnFfd2FpdCk7DQo+ID4gKw0KPiA+ICsJZnNsX2xiY19jdHJsX2Rl
di0+cmVncyA9IG9mX2lvbWFwKG9mZGV2LT5kZXYub2Zfbm9kZSwgMCk7DQo+ID4gKwlpZiAoIWZz
bF9sYmNfY3RybF9kZXYtPnJlZ3MpIHsNCj4gPiArCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiZmFp
bGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uXG4iKTsNCj4gPiArCQlyZXQgPSAtRU5PREVWOw0KPiA+
ICsJCWdvdG8gZXJyOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWZzbF9sYmNfY3RybF9kZXYtPmly
cSA9IG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+ZGV2Lm9mX25vZGUsIDAsIE5VTEwpOw0KPiA+
ICsJaWYgKGZzbF9sYmNfY3RybF9kZXYtPmlycSA9PSBOT19JUlEpIHsNCj4gPiArCQlkZXZfZXJy
KCZvZmRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VcbiIpOw0KPiA+ICsJCXJl
dCA9IC1FTk9ERVY7DQo+ID4gKwkJZ290byBlcnI7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJZnNs
X2xiY19jdHJsX2Rldi0+ZGV2ID0gJm9mZGV2LT5kZXY7DQo+ID4gKw0KPiA+ICsJcmV0ID0gZnNs
X2xiY19jdHJsX2luaXQoZnNsX2xiY19jdHJsX2Rldik7DQo+ID4gKwlpZiAocmV0IDwgMCkNCj4g
PiArCQlnb3RvIGVycjsNCj4gPiArDQo+ID4gKwlyZXQgPSByZXF1ZXN0X2lycShmc2xfbGJjX2N0
cmxfZGV2LT5pcnEsIGZzbF9sYmNfY3RybF9pcnEsIDAsDQo+ID4gKwkJCQkiZnNsLWxiYyIsIGZz
bF9sYmNfY3RybF9kZXYpOw0KPiA+ICsJaWYgKHJldCAhPSAwKSB7DQo+ID4gKwkJZGV2X2Vycigm
b2ZkZXYtPmRldiwgImZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLA0KPiA+ICsJCQlmc2xf
bGJjX2N0cmxfZGV2LT5pcnEpOw0KPiA+ICsJCXJldCA9IGZzbF9sYmNfY3RybF9kZXYtPmlycTsN
Cj4gPiArCQlnb3RvIGVycjsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsNCj4gPiAr
DQo+ID4gK2VycjoNCj4gDQo+IGZzbF9sYmNfY3RybF9kZXYgbGVha2VkLiBQbHVzLCBhZnRlciBm
cmVlaW5nIGl0LCB5b3Ugc2hvdWxkDQo+IE5VTExpZnkgaXQgYXMgd2VsbCwgYXMgb3RoZXIgZnVu
Y3Rpb25zIGNoZWNrcyBpdCBmb3IgIU5VTEwuDQpBZ3JlZS4NCj4gDQo+IGZzbF9sYmNfY3RybF9k
ZXYtPnJlZ3MgbGVha3MgdG9vLg0KQWdyZWUuDQo+IA0KPiA+ICsJcmV0dXJuIHJldDsNCj4gPiAr
fQ0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2xiY19t
YXRjaFtdID0gew0KPiA+ICsJew0KPiA+ICsJCS5jb21wYXRpYmxlID0gImZzbCxlbGJjIiwNCj4g
PiArCX0sDQo+ID4gKwl7DQo+ID4gKwkJLmNvbXBhdGlibGUgPSAiZnNsLHBxMy1sb2NhbGJ1cyIs
DQo+ID4gKwl9LA0KPiA+ICsJew0KPiA+ICsJCS5jb21wYXRpYmxlID0gImZzbCxwcTItbG9jYWxi
dXMiLA0KPiA+ICsJfSwNCj4gPiArCXsNCj4gPiArCQkuY29tcGF0aWJsZSA9ICJmc2wscHEycHJv
LWxvY2FsYnVzIiwNCj4gPiArCX0sDQo+ID4gKwl7fSwNCj4gDQo+IENvdWxkIHNhdmUgOCBsaW5l
cyBieSB3cml0aW5nICJ7IC5jb21wYXRpYmxlID0gIi4uLiIsIH0sIi4NCg0KQWdyZWUuDQo+IA0K
PiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZnNs
X2xiY19jdHJsX2RyaXZlciA9IHsNCj4gDQo+IEkgdGhpbmsgeW91IHNob3VsZG4ndCB1c2Ugb2Zf
cGxhdGZvcm0gZm9yIG5ldyBjb2RlLiBqdXN0IHBsYXRmb3JtDQo+IHdpbGwgd29yayAodGhlcmUn
cyBwbGF0Zm9ybV9kcml2ZXIuZHJpdmVyLm9mX21hdGNoX3RhYmxlIG5vd2FkYXlzKS4NCj4gDQo+
ID4gKwkuZHJpdmVyID0gew0KPiA+ICsJCS5uYW1lID0gImZzbC1sYmMiLA0KPiA+ICsJCS5vZl9t
YXRjaF90YWJsZSA9IGZzbF9sYmNfbWF0Y2gsDQo+ID4gKwl9LA0KPiA+ICsJLnByb2JlID0gZnNs
X2xiY19jdHJsX3Byb2JlLA0KPiA+ICsJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGZzbF9sYmNfY3Ry
bF9yZW1vdmUpLA0KPiANCj4gVGhlIGRldmljZSBpcyBub3QgcmVtb3ZhYmxlLCBJIHRoaW5rIHlv
dSBkb24ndCBuZWVkIHRoaXMuDQpBZ3JlZS4NCg0KPiANCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0
YXRpYyBpbnQgX19pbml0IGZzbF9sYmNfaW5pdCh2b2lkKQ0KPiA+ICt7DQo+ID4gKwlyZXR1cm4g
b2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmc2xfbGJjX2N0cmxfZHJpdmVyKTsNCj4gPiAr
fQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgX19leGl0IGZzbF9sYmNfZXhpdCh2b2lkKQ0KPiA+
ICt7DQo+ID4gKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZnNsX2xiY19jdHJsX2Ry
aXZlcik7DQo+ID4gK30NCj4gPiArDQo+ID4gK21vZHVsZV9pbml0KGZzbF9sYmNfaW5pdCk7DQo+
ID4gK21vZHVsZV9leGl0KGZzbF9sYmNfZXhpdCk7DQo+IA0KPiBmc2xfbGJjIGlzIG5vdCBhIG1v
ZHVsZSwgc28geW91IGRvbid0IG5lZWQgX2V4aXQoKS4NCkFncmVlLg0KPiANCj4gPiArTU9EVUxF
X0xJQ0VOU0UoIkdQTCIpOw0KPiA+ICtNT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1
Y3RvciIpOw0KPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBFbmhhbmNlZCBMb2Nh
bCBCdXMgQ29udHJvbGxlciBkcml2ZXIiKTsNCj4gDQo+IGRpdHRvLCBubyBuZWVkIGZvciB0aGlz
Lg0KQWdyZWUuDQpUaGFua3MuDQpSb3kNCg==
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
2010-09-03 17:33 ` Scott Wood
@ 2010-09-06 3:40 ` Zang Roy-R61911
2010-09-06 4:49 ` Zang Roy-R61911
2 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 3:40 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1i
ZXIgMDMsIDIwMTAgMTk6NDQgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODA7IFdvb2QgU2NvdHQtQjA3NDIxDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMi8zXVtNVERdIFA0
MDgwL25hbmQ6IE9ubHkgbWFrZSBlbGJjIG5hbmQgZHJpdmVyIGRldGVjdA0KPiBuYW5kIGZsYXNo
IHBhcnRpdGlvbnMNCj4gDQo+IE9uIEZyaSwgQXVnIDA2LCAyMDEwIGF0IDEwOjUxOjM1QU0gKzA4
MDAsIFJveSBaYW5nIHdyb3RlOg0KPiBbLi4uXQ0KPiA+DQo+ID4gK3N0YXRpYyBzdHJ1Y3QgZnNs
X2VsYmNfZmNtX2N0cmwgKmVsYmNfZmNtX2N0cmw7DQo+ID4gKw0KPiANCj4gQXJlIHlvdSBzdXJl
IHRoYXQgeW91IHdhbnQgaXQgYXMgYSBnbG9iYWwgdmFyPyBBIGJpdCBzY2FyeSBjaGFuZ2UuDQo+
IA0KPiBPaCwgeW91IHByb2JhYmx5IGRvbid0IG5lZWQgaXQsIGFzIHlvdSBjYW4gZ2V0IGl0IGZy
b20NCj4gZnNsX2xiY19jdHJsX2Rldi0+bmFuZD8NCj4gDQo+IEkgd29uZGVyIGlmIFNjb3R0IHNh
dyB0aGVzZSBwYXRjaGVzPyBDYydlZC4NClllcy4NClJveQ0K
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode
2010-09-03 11:36 ` Anton Vorontsov
@ 2010-09-06 3:56 ` Zang Roy-R61911
0 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 3:56 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Lan Chunhe-B25806, linuxppc-dev, akpm, linux-mtd,
Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1i
ZXIgMDMsIDIwMTAgMTk6MzYgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODANCj4gU3ViamVjdDogUmU6IFtQQVRDSCAzLzNdW01URF0gUDQwODAvbmFuZDogRml4IHRoZSBm
cmVlc2NhbGUgbGJjIGlzc3VlIHdpdGgNCj4gMzZiaXQgbW9kZQ0KPiANCj4gT24gRnJpLCBBdWcg
MDYsIDIwMTAgYXQgMTA6NTE6MzZBTSArMDgwMCwgUm95IFphbmcgd3JvdGU6DQo+IFsuLi5dDQo+
ID4gIC8qKg0KPiA+ICsgKiBjb252ZXJ0X2xiY19hZGRyZXNzIC0gY29udmVydCB0aGUgYmFzZSBh
ZGRyZXNzDQo+ID4gKyAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJh
bmsNCj4gPiArICoNCj4gPiArICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIGJhc2UgYWRkcmVz
cyBvZiBsYmMgaW50byB0aGUgcmlnaHQgZm9ybWF0IGZvcg0KPiB0aGUgQlINCj4gPiArICogcmVn
aXN0ZXJzLiBJZiB0aGUgU09DIGhhcyBlTEJDIHRoZW4gaXQgcmV0dXJucyAzMmJpdCBwaHlzaWNh
bCBhZGRyZXNzDQo+IGVsc2UNCj4gPiArICogaXQgcmV0dXJucyAzNGJpdCBwaHlzaWNhbCBhZGRy
ZXNzIGZvciBsb2NhbCBidXMoRXhhbXBsZTogTVBDODY0MSkuDQo+ID4gKyAqLw0KPiA+ICt1bnNp
Z25lZCBpbnQgY29udmVydF9sYmNfYWRkcmVzcyhwaHlzX2FkZHJfdCBhZGRyX2Jhc2UpDQo+ID4g
K3sNCj4gPiArCXZvaWQgKmRldjsNCj4gPiArCWludCBjb21wYXRpYmxlOw0KPiA+ICsNCj4gPiAr
CWRldiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJsb2NhbGJ1cyIpOw0KPiANCj4gTm9w
ZSwgeW91IHNob3VsZG4ndCBkbyB0aGlzLiBOZXZlciBzZWFyY2ggYnkgbmFtZS4NCk9LLiBJIHdp
bGwgc2VhcmNoIGJ5IGNvbXBhdGlibGUuDQo+IA0KPiBBbHNvLCBhcmVuJ3QgdGhlcmUgYWxyZWFk
eSBhIGdsb2JhbCBkZXYsIHdoaWNoIHdhcyBmb3VuZCBieSB0aGUNCj4gX3Byb2JlKCkgc3R1ZmY/
DQpJIGRvIG5vdCBzZWUgdGhlIGdsb2JhbCBkZXYgY2FuIGJlIHVzZWQgaW4gcHJvYmUuDQoNCj4g
DQo+ID4gKwlpZiAoIWRldikgew0KPiA+ICsJCXByaW50ayhLRVJOX0lORk8gImZzbC1sYmM6IGNh
bid0IGZpbmQgbG9jYWxidXMgbm9kZVxuIik7DQo+ID4gKwkJb2Zfbm9kZV9wdXQoZGV2KTsNCj4g
PiArCQlyZXR1cm4gMDsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwljb21wYXRpYmxlID0gb2ZfZGV2
aWNlX2lzX2NvbXBhdGlibGUoZGV2LCAiZnNsLGVsYmMiKTsNCj4gPiArCW9mX25vZGVfcHV0KGRl
dik7DQo+ID4gKwlpZiAoY29tcGF0aWJsZSkNCj4gPiArCQlyZXR1cm4gYWRkcl9iYXNlICYgMHhm
ZmZmODAwMDsNCj4gPiArCWVsc2UNCj4gPiArCQlyZXR1cm4gKGFkZHJfYmFzZSAmIDB4MGZmZmY4
MDAwdWxsKSBcDQo+ID4gKwkJCXwgKChhZGRyX2Jhc2UgJiAweDMwMDAwMDAwMHVsbCkgPj4gMTkp
Ow0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0woY29udmVydF9sYmNfYWRkcmVzcyk7DQo+ID4g
Kw0KPiA+ICsvKioNCj4gPiAgICogZnNsX2xiY19maW5kIC0gZmluZCBMb2NhbGJ1cyBiYW5rDQo+
ID4gICAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsNCj4gPiAg
ICoNCj4gPiBAQCAtNTAsNyArODAsOCBAQCBpbnQgZnNsX2xiY19maW5kKHBoeXNfYWRkcl90IGFk
ZHJfYmFzZSkNCj4gPiAgCQlfX2JlMzIgYnIgPSBpbl9iZTMyKCZmc2xfbGJjX2N0cmxfZGV2LT5y
ZWdzLT5iYW5rW2ldLmJyKTsNCj4gPiAgCQlfX2JlMzIgb3IgPSBpbl9iZTMyKCZmc2xfbGJjX2N0
cmxfZGV2LT5yZWdzLT5iYW5rW2ldLm9yKTsNCj4gPg0KPiA+IC0JCWlmIChiciAmIEJSX1YgJiYg
KGJyICYgb3IgJiBCUl9CQSkgPT0gYWRkcl9iYXNlKQ0KPiA+ICsJCWlmIChiciAmIEJSX1YgJiYg
KGJyICYgb3IgJiBCUl9CQSkgXA0KPiANCj4gTm8gbmVlZCBmb3IgIlwiIGF0IHRoZSBlbmQgb2Yg
dGhlIGxpbmUsIGtlZXAgPT0gb24gdGhlIHNhbWUgbGluZS4NCj4gDQo+ID4gKwkJCQk9PSBjb252
ZXJ0X2xiY19hZGRyZXNzKGFkZHJfYmFzZSkpDQo+IA0KPiBXb3VsZCBiZSBwcmV0dGllciBpZiB5
b3UgbmFtZSBpdCBmc2xfbGJjX2FkZHIoKS4gS2VlcHMgcHJlZml4DQo+IHRoZSBzYW1lIGZvciB0
aGUgcmVzdCBvZiB0aGUgZmlsZSwgcGx1cyBtYWtlcyBpdCBzaG9ydGVyIChzbw0KPiB0aGVyZSBw
cm9iYWJseSB3b24ndCBiZSBhbnkgbmVlZCBmb3IgYnJlYWtpbmcgdGhlIGxpbmUpLg0KQWdyZWUg
dGhlIG5ldyBuYW1lLg0KVGhhbmtzLg0KUm95DQo=
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
2010-09-03 17:33 ` Scott Wood
2010-09-06 3:40 ` Zang Roy-R61911
@ 2010-09-06 4:49 ` Zang Roy-R61911
2010-09-06 8:09 ` Anton Vorontsov
2 siblings, 1 reply; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 4:49 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1i
ZXIgMDMsIDIwMTAgMTk6NDQgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODA7IFdvb2QgU2NvdHQtQjA3NDIxDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMi8zXVtNVERdIFA0
MDgwL25hbmQ6IE9ubHkgbWFrZSBlbGJjIG5hbmQgZHJpdmVyIGRldGVjdA0KPiBuYW5kIGZsYXNo
IHBhcnRpdGlvbnMNCj4gDQo+IE9uIEZyaSwgQXVnIDA2LCAyMDEwIGF0IDEwOjUxOjM1QU0gKzA4
MDAsIFJveSBaYW5nIHdyb3RlOg0KPiBbLi4uXQ0KPiA+DQo+ID4gK3N0YXRpYyBzdHJ1Y3QgZnNs
X2VsYmNfZmNtX2N0cmwgKmVsYmNfZmNtX2N0cmw7DQo+ID4gKw0KPiANCj4gQXJlIHlvdSBzdXJl
IHRoYXQgeW91IHdhbnQgaXQgYXMgYSBnbG9iYWwgdmFyPyBBIGJpdCBzY2FyeSBjaGFuZ2UuDQo+
IA0KPiBPaCwgeW91IHByb2JhYmx5IGRvbid0IG5lZWQgaXQsIGFzIHlvdSBjYW4gZ2V0IGl0IGZy
b20NCj4gZnNsX2xiY19jdHJsX2Rldi0+bmFuZD8NCkdldCBpdCBmb3JtIGZzbF9sYmNfY3RybF9k
ZXYtPm5hbmQgb3IgYXNzaWduIGl0IHRvIGZzbF9sYmNfY3RybF9kZXYtPm5hbmQgaW4gcHJvYmU/
DQpUaGFua3MuDQpSb3kNCg0K
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-09-06 4:49 ` Zang Roy-R61911
@ 2010-09-06 8:09 ` Anton Vorontsov
2010-09-06 8:38 ` Zang Roy-R61911
0 siblings, 1 reply; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-06 8:09 UTC (permalink / raw)
To: Zang Roy-R61911
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
On Mon, Sep 06, 2010 at 12:49:17PM +0800, Zang Roy-R61911 wrote:
> > On Fri, Aug 06, 2010 at 10:51:35AM +0800, Roy Zang wrote:
> > [...]
> > >
> > > +static struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl;
> > > +
> >
> > Are you sure that you want it as a global var? A bit scary change.
> >
> > Oh, you probably don't need it, as you can get it from
> > fsl_lbc_ctrl_dev->nand?
> Get it form fsl_lbc_ctrl_dev->nand or assign it to
> fsl_lbc_ctrl_dev->nand in probe?
I meant to get it from fsl_lbc_ctrl_dev->nand. I.e. in
probe() you do: fsl_lbc_ctrl_dev->nand = elbc_fcm_ctrl, so
you probably don't need the global var.
(fsl_lbc_ctrl_dev seems to be global as well, duh. Well,
one variable less in the global name space. But I'd
probably use lbc_np->data to store the LBC private
struct).
Scott seem to be fine with it as there are probably no
plans to to add several localbus controllers into the SoCs.
But, I saw a custom board with two MPC82xx SoCs connected
together, one as a master (core + peripheral devs), and
other as a slave (its core was halted, and only slave's
CPM peripheral devices were used by the master CPU).
I think it is possible to connect two (or more) SoCs in
a such way so that two or more LBC controllers would
be visible for the Linux.
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-09-06 3:38 ` Zang Roy-R61911
@ 2010-09-06 8:21 ` Anton Vorontsov
2010-09-06 9:24 ` Zang Roy-R61911
0 siblings, 1 reply; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-06 8:21 UTC (permalink / raw)
To: Zang Roy-R61911
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
On Mon, Sep 06, 2010 at 11:38:09AM +0800, Zang Roy-R61911 wrote:
[...]
> > > switch (br & BR_MSEL) {
> > > case BR_MS_UPMA:
> > > - upm->mxmr = &fsl_lbc_regs->mamr;
> > > + upm->mxmr = &fsl_lbc_ctrl_dev->regs->mamr;
> >
> > Ditto, a very repetitive stuff, desires a variable for regs?
> But the fact is that the variable represents different reg
> address according to the condition. It will be ugly to use
> the reg address directoly.
I meant a dedicated var for 'fsl_lbc_ctrl_dev->regs'.
I.e.
regs = fsl_lbc_ctrl_dev->regs;
...
mxmr = ®s->mamr;
...
mxmr = ®s->mbmr;
..
mxmr = ®s->mcmr;
Instead of
mxmr = &fsl_lbc_ctrl_dev->regs->mamr;
...
mxmr = &fsl_lbc_ctrl_dev->regs->mbmr;
..
mxmr = &fsl_lbc_ctrl_dev->regs->mcmr;
[...]
> > > +static int __devinit fsl_lbc_ctrl_probe(struct of_device *ofdev,
> > > + const struct of_device_id *match)
> > > +{
> > > + int ret = 0;
> >
> > no need for the initial value here.
> Any harm?
Probably not as gcc will likely optimize it away,
but it's not needed, so why keep it there?
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions
2010-09-06 8:09 ` Anton Vorontsov
@ 2010-09-06 8:38 ` Zang Roy-R61911
0 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 8:38 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogTW9uZGF5LCBTZXB0ZW1i
ZXIgMDYsIDIwMTAgMTY6MTAgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODA7IFdvb2QgU2NvdHQtQjA3NDIxDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMi8zXVtNVERdIFA0
MDgwL25hbmQ6IE9ubHkgbWFrZSBlbGJjIG5hbmQgZHJpdmVyIGRldGVjdA0KPiBuYW5kIGZsYXNo
IHBhcnRpdGlvbnMNCj4gDQo+IE9uIE1vbiwgU2VwIDA2LCAyMDEwIGF0IDEyOjQ5OjE3UE0gKzA4
MDAsIFphbmcgUm95LVI2MTkxMSB3cm90ZToNCj4gPiA+IE9uIEZyaSwgQXVnIDA2LCAyMDEwIGF0
IDEwOjUxOjM1QU0gKzA4MDAsIFJveSBaYW5nIHdyb3RlOg0KPiA+ID4gWy4uLl0NCj4gPiA+ID4N
Cj4gPiA+ID4gK3N0YXRpYyBzdHJ1Y3QgZnNsX2VsYmNfZmNtX2N0cmwgKmVsYmNfZmNtX2N0cmw7
DQo+ID4gPiA+ICsNCj4gPiA+DQo+ID4gPiBBcmUgeW91IHN1cmUgdGhhdCB5b3Ugd2FudCBpdCBh
cyBhIGdsb2JhbCB2YXI/IEEgYml0IHNjYXJ5IGNoYW5nZS4NCj4gPiA+DQo+ID4gPiBPaCwgeW91
IHByb2JhYmx5IGRvbid0IG5lZWQgaXQsIGFzIHlvdSBjYW4gZ2V0IGl0IGZyb20NCj4gPiA+IGZz
bF9sYmNfY3RybF9kZXYtPm5hbmQ/DQo+ID4gR2V0IGl0IGZvcm0gZnNsX2xiY19jdHJsX2Rldi0+
bmFuZCBvciBhc3NpZ24gaXQgdG8NCj4gPiBmc2xfbGJjX2N0cmxfZGV2LT5uYW5kIGluIHByb2Jl
Pw0KPiANCj4gSSBtZWFudCB0byBnZXQgaXQgZnJvbSBmc2xfbGJjX2N0cmxfZGV2LT5uYW5kLiBJ
LmUuIGluDQo+IHByb2JlKCkgeW91IGRvOiBmc2xfbGJjX2N0cmxfZGV2LT5uYW5kID0gZWxiY19m
Y21fY3RybCwgc28NCj4geW91IHByb2JhYmx5IGRvbid0IG5lZWQgdGhlIGdsb2JhbCB2YXIuDQo+
IA0KPiAoZnNsX2xiY19jdHJsX2RldiBzZWVtcyB0byBiZSBnbG9iYWwgYXMgd2VsbCwgZHVoLiBX
ZWxsLA0KPiBvbmUgdmFyaWFibGUgbGVzcyBpbiB0aGUgZ2xvYmFsIG5hbWUgc3BhY2UuIEJ1dCBJ
J2QNCj4gcHJvYmFibHkgdXNlIGxiY19ucC0+ZGF0YSB0byBzdG9yZSB0aGUgTEJDIHByaXZhdGUN
Cj4gc3RydWN0KS4NClRoYXQgbWFrZXMgc2Vuc2UuDQo+IA0KPiBTY290dCBzZWVtIHRvIGJlIGZp
bmUgd2l0aCBpdCBhcyB0aGVyZSBhcmUgcHJvYmFibHkgbm8NCj4gcGxhbnMgdG8gdG8gYWRkIHNl
dmVyYWwgbG9jYWxidXMgY29udHJvbGxlcnMgaW50byB0aGUgU29Dcy4NCj4gDQo+IEJ1dCwgSSBz
YXcgYSBjdXN0b20gYm9hcmQgd2l0aCB0d28gTVBDODJ4eCBTb0NzIGNvbm5lY3RlZA0KPiB0b2dl
dGhlciwgb25lIGFzIGEgbWFzdGVyIChjb3JlICsgcGVyaXBoZXJhbCBkZXZzKSwgYW5kDQo+IG90
aGVyIGFzIGEgc2xhdmUgKGl0cyBjb3JlIHdhcyBoYWx0ZWQsIGFuZCBvbmx5IHNsYXZlJ3MNCj4g
Q1BNIHBlcmlwaGVyYWwgZGV2aWNlcyB3ZXJlIHVzZWQgYnkgdGhlIG1hc3RlciBDUFUpLg0KPiAN
Cj4gSSB0aGluayBpdCBpcyBwb3NzaWJsZSB0byBjb25uZWN0IHR3byAob3IgbW9yZSkgU29DcyBp
bg0KPiBhIHN1Y2ggd2F5IHNvIHRoYXQgdHdvIG9yIG1vcmUgTEJDIGNvbnRyb2xsZXJzIHdvdWxk
DQo+IGJlIHZpc2libGUgZm9yIHRoZSBMaW51eC4NClRoYXQgaXMgYW4gaW50ZXJlc3RpbmcgY2Fz
ZS4gRG8geW91IGhhdmUgYW55IHRob3VnaHQgaGVyZT8NClRoYW5rcy4NClJveQ0K
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-09-06 8:21 ` Anton Vorontsov
@ 2010-09-06 9:24 ` Zang Roy-R61911
2010-09-06 9:44 ` Anton Vorontsov
0 siblings, 1 reply; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 9:24 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogTW9uZGF5LCBTZXB0ZW1i
ZXIgMDYsIDIwMTAgMTY6MjIgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODA7IFdvb2QgU2NvdHQtQjA3NDIxDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMS8zXVtNVERdIFA0
MDgwL2VMQkM6IE1ha2UgRnJlZXNjYWxlIGVsYmMgaW50ZXJydXB0IGNvbW1vbg0KPiB0byBlbGJj
IGRldmljZXMNCj4gDQo+IE9uIE1vbiwgU2VwIDA2LCAyMDEwIGF0IDExOjM4OjA5QU0gKzA4MDAs
IFphbmcgUm95LVI2MTkxMSB3cm90ZToNCj4gWy4uLl0NCj4gPiA+ID4gIAlzd2l0Y2ggKGJyICYg
QlJfTVNFTCkgew0KPiA+ID4gPiAgCWNhc2UgQlJfTVNfVVBNQToNCj4gPiA+ID4gLQkJdXBtLT5t
eG1yID0gJmZzbF9sYmNfcmVncy0+bWFtcjsNCj4gPiA+ID4gKwkJdXBtLT5teG1yID0gJmZzbF9s
YmNfY3RybF9kZXYtPnJlZ3MtPm1hbXI7DQo+ID4gPg0KPiA+ID4gRGl0dG8sIGEgdmVyeSByZXBl
dGl0aXZlIHN0dWZmLCBkZXNpcmVzIGEgdmFyaWFibGUgZm9yIHJlZ3M/DQo+ID4gQnV0IHRoZSBm
YWN0IGlzIHRoYXQgdGhlIHZhcmlhYmxlIHJlcHJlc2VudHMgZGlmZmVyZW50IHJlZw0KPiA+IGFk
ZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBjb25kaXRpb24uIEl0IHdpbGwgYmUgdWdseSB0byB1c2UN
Cj4gPiB0aGUgcmVnIGFkZHJlc3MgZGlyZWN0b2x5Lg0KPiANCj4gSSBtZWFudCBhIGRlZGljYXRl
ZCB2YXIgZm9yICdmc2xfbGJjX2N0cmxfZGV2LT5yZWdzJy4NCj4gSS5lLg0KPiANCj4gcmVncyA9
IGZzbF9sYmNfY3RybF9kZXYtPnJlZ3M7DQo+IC4uLg0KPiBteG1yID0gJnJlZ3MtPm1hbXI7DQo+
IC4uLg0KPiBteG1yID0gJnJlZ3MtPm1ibXI7DQo+IC4uDQo+IG14bXIgPSAmcmVncy0+bWNtcjsN
Cj4gDQo+IEluc3RlYWQgb2YNCj4gDQo+IG14bXIgPSAmZnNsX2xiY19jdHJsX2Rldi0+cmVncy0+
bWFtcjsNCj4gLi4uDQo+IG14bXIgPSAmZnNsX2xiY19jdHJsX2Rldi0+cmVncy0+bWJtcjsNCj4g
Li4NCj4gbXhtciA9ICZmc2xfbGJjX2N0cmxfZGV2LT5yZWdzLT5tY21yOw0KVGhhdCBtYWtlcyBz
ZW5zZS4gIEEgZ2xvYmFsIG9yIGxvY2FsIHZhcmlhYmxlIGZvciBmc2xfbGJjX2N0cmxfZGV2LT5y
ZWdzPyBXaGljaCBvbmUgaXMgYmV0dGVyPw0KDQo+IA0KPiBbLi4uXQ0KPiA+ID4gPiArc3RhdGlj
IGludCBfX2RldmluaXQgZnNsX2xiY19jdHJsX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2
LA0KPiA+ID4gPiArCQkJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpDQo+ID4g
PiA+ICt7DQo+ID4gPiA+ICsJaW50IHJldCA9IDA7DQo+ID4gPg0KPiA+ID4gbm8gbmVlZCBmb3Ig
dGhlIGluaXRpYWwgdmFsdWUgaGVyZS4NCj4gPiBBbnkgaGFybT8NCj4gDQo+IFByb2JhYmx5IG5v
dCBhcyBnY2Mgd2lsbCBsaWtlbHkgb3B0aW1pemUgaXQgYXdheSwNCj4gYnV0IGl0J3Mgbm90IG5l
ZWRlZCwgc28gd2h5IGtlZXAgaXQgdGhlcmU/DQpoYWJpdC4NClRoYW5rcy4NClJveQ0KDQo=
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-09-06 9:24 ` Zang Roy-R61911
@ 2010-09-06 9:44 ` Anton Vorontsov
2010-09-06 10:15 ` Zang Roy-R61911
0 siblings, 1 reply; 21+ messages in thread
From: Anton Vorontsov @ 2010-09-06 9:44 UTC (permalink / raw)
To: Zang Roy-R61911
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
On Mon, Sep 06, 2010 at 05:24:35PM +0800, Zang Roy-R61911 wrote:
[..]
> > mxmr = &fsl_lbc_ctrl_dev->regs->mcmr;
> That makes sense. A global or local variable for fsl_lbc_ctrl_dev->regs? Which one is better?
The less global variables, the better. So, I'd vote for
a local one.
> > [...]
> > > > > +static int __devinit fsl_lbc_ctrl_probe(struct of_device *ofdev,
> > > > > + const struct of_device_id *match)
> > > > > +{
> > > > > + int ret = 0;
> > > >
> > > > no need for the initial value here.
> > > Any harm?
> >
> > Probably not as gcc will likely optimize it away,
> > but it's not needed, so why keep it there?
> habit.
;-)
Thanks,
--
Anton Vorontsov
email: cbouatmailru@gmail.com
irc://irc.freenode.net/bd2
^ permalink raw reply [flat|nested] 21+ messages in thread
* RE: [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices
2010-09-06 9:44 ` Anton Vorontsov
@ 2010-09-06 10:15 ` Zang Roy-R61911
0 siblings, 0 replies; 21+ messages in thread
From: Zang Roy-R61911 @ 2010-09-06 10:15 UTC (permalink / raw)
To: Anton Vorontsov
Cc: Wood Scott-B07421, Lan Chunhe-B25806, linuxppc-dev, linux-mtd,
akpm, Gala Kumar-B11780
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW50b24gVm9yb250c292
IFttYWlsdG86Y2JvdWF0bWFpbHJ1QGdtYWlsLmNvbV0NCj4gU2VudDogTW9uZGF5LCBTZXB0ZW1i
ZXIgMDYsIDIwMTAgMTc6NDQgUE0NCj4gVG86IFphbmcgUm95LVI2MTkxMQ0KPiBDYzogbGludXgt
bXRkQGxpc3RzLmluZnJhZGVhZC5vcmc7IExhbiBDaHVuaGUtQjI1ODA2OyBsaW51eHBwYy1kZXZA
b3psYWJzLm9yZzsNCj4gYWtwbUBsaW51eC1mb3VuZGF0aW9uLm9yZzsgR2FsYSBLdW1hci1CMTE3
ODA7IFdvb2QgU2NvdHQtQjA3NDIxDQo+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggMS8zXVtNVERdIFA0
MDgwL2VMQkM6IE1ha2UgRnJlZXNjYWxlIGVsYmMgaW50ZXJydXB0IGNvbW1vbg0KPiB0byBlbGJj
IGRldmljZXMNCj4gDQo+IE9uIE1vbiwgU2VwIDA2LCAyMDEwIGF0IDA1OjI0OjM1UE0gKzA4MDAs
IFphbmcgUm95LVI2MTkxMSB3cm90ZToNCj4gWy4uXQ0KPiA+ID4gbXhtciA9ICZmc2xfbGJjX2N0
cmxfZGV2LT5yZWdzLT5tY21yOw0KPiA+IFRoYXQgbWFrZXMgc2Vuc2UuICBBIGdsb2JhbCBvciBs
b2NhbCB2YXJpYWJsZSBmb3IgZnNsX2xiY19jdHJsX2Rldi0+cmVncz8NCj4gV2hpY2ggb25lIGlz
IGJldHRlcj8NCj4gDQo+IFRoZSBsZXNzIGdsb2JhbCB2YXJpYWJsZXMsIHRoZSBiZXR0ZXIuIFNv
LCBJJ2Qgdm90ZSBmb3INCj4gYSBsb2NhbCBvbmUuDQpJIGFsc28gcHJlZmVyIGxvY2FsIG9uZS4N
Cj4gDQo+ID4gPiBbLi4uXQ0KPiA+ID4gPiA+ID4gK3N0YXRpYyBpbnQgX19kZXZpbml0IGZzbF9s
YmNfY3RybF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwNCj4gPiA+ID4gPiA+ICsJCQkJ
CSBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkNCj4gPiA+ID4gPiA+ICt7DQo+ID4g
PiA+ID4gPiArCWludCByZXQgPSAwOw0KPiA+ID4gPiA+DQo+ID4gPiA+ID4gbm8gbmVlZCBmb3Ig
dGhlIGluaXRpYWwgdmFsdWUgaGVyZS4NCj4gPiA+ID4gQW55IGhhcm0/DQo+ID4gPg0KPiA+ID4g
UHJvYmFibHkgbm90IGFzIGdjYyB3aWxsIGxpa2VseSBvcHRpbWl6ZSBpdCBhd2F5LA0KPiA+ID4g
YnV0IGl0J3Mgbm90IG5lZWRlZCwgc28gd2h5IGtlZXAgaXQgdGhlcmU/DQo+ID4gaGFiaXQuDQo+
IA0KPiA7LSkNCjotKC4NClRoYW5rcyBmb3IgYWxsIHlvdXIgY29tbWVudHMuIFRoYXQgaXMgdmFs
dWFibGUuDQpJIHdpbGwgdXBkYXRlIHRoZSBwYXRjaCBhY2NvcmRpbmcgdG8geW91ciBjb21tZW50
IGFuZCB0aGUgbmV3IHBsYXRmb3JtIGRldmljZSBhcmNoLg0KUm95DQo=
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2010-09-06 10:15 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-06 2:51 [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Roy Zang
2010-08-06 2:51 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Roy Zang
2010-08-06 2:51 ` [PATCH 3/3][MTD] P4080/nand: Fix the freescale lbc issue with 36bit mode Roy Zang
2010-09-03 11:36 ` Anton Vorontsov
2010-09-06 3:56 ` Zang Roy-R61911
2010-09-03 11:43 ` [PATCH 2/3][MTD] P4080/nand: Only make elbc nand driver detect nand flash partitions Anton Vorontsov
2010-09-03 17:33 ` Scott Wood
2010-09-06 3:40 ` Zang Roy-R61911
2010-09-06 4:49 ` Zang Roy-R61911
2010-09-06 8:09 ` Anton Vorontsov
2010-09-06 8:38 ` Zang Roy-R61911
2010-08-09 7:33 ` [PATCH 1/3][MTD] P4080/eLBC: Make Freescale elbc interrupt common to elbc devices Zang Roy-R61911
2010-08-29 11:06 ` Artem Bityutskiy
2010-08-11 2:45 ` Zang Roy-R61911
2010-09-03 10:33 ` Zang Roy-R61911
2010-09-03 11:27 ` Anton Vorontsov
2010-09-06 3:38 ` Zang Roy-R61911
2010-09-06 8:21 ` Anton Vorontsov
2010-09-06 9:24 ` Zang Roy-R61911
2010-09-06 9:44 ` Anton Vorontsov
2010-09-06 10:15 ` Zang Roy-R61911
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).