* [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 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 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-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 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 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 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-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-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 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-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 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 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 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).