* S3C2410 NAND controller updates
@ 2009-05-30 17:41 Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Move to using platform device table Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd
Updates for the next kernel release for the S3C2410
NAND controller.
This series is available at:
git://aeryn.fluff.org.uk/bjdooks/linux.git next-mtd
^ permalink raw reply [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Move to using platform device table
2009-05-30 17:41 S3C2410 NAND controller updates Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Basic kerneldoc comment updates Ben Dooks
2009-06-01 5:47 ` [MTD] [NAND] S3C2410: Move to using platform device table Eric Miao
0 siblings, 2 replies; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Eric Miao, Ben Dooks
Commit 57fee4a58fe802272742caae248872c392a60670 added an
method to specify the platform device compatibility by using
an id-table instead of registering multiple drivers.
Move the S3C24XX NAND driver to using this ID table.
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
CC: Eric Miao <eric.miao@marvell.com>
---
drivers/mtd/nand/s3c2410.c | 78 ++++++++++++++-----------------------------
1 files changed, 26 insertions(+), 52 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 8e375d5..b7f0740 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -593,7 +593,7 @@ static inline void s3c2410_nand_cpufreq_deregister(struct s3c2410_nand_info *inf
/* device management functions */
-static int s3c2410_nand_remove(struct platform_device *pdev)
+static int s3c24xx_nand_remove(struct platform_device *pdev)
{
struct s3c2410_nand_info *info = to_nand_info(pdev);
@@ -788,18 +788,17 @@ static void s3c2410_nand_update_chip(struct s3c2410_nand_info *info,
}
}
-/* s3c2410_nand_probe
+/* s3c24xx_nand_probe
*
* called by device layer when it finds a device matching
* one our driver can handled. This code checks to see if
* it can allocate all necessary resources then calls the
* nand layer to look for devices
*/
-
-static int s3c24xx_nand_probe(struct platform_device *pdev,
- enum s3c_cpu_type cpu_type)
+static int s3c24xx_nand_probe(struct platform_device *pdev)
{
struct s3c2410_platform_nand *plat = to_nand_plat(pdev);
+ enum s3c_cpu_type cpu_type;
struct s3c2410_nand_info *info;
struct s3c2410_nand_mtd *nmtd;
struct s3c2410_nand_set *sets;
@@ -809,6 +808,8 @@ static int s3c24xx_nand_probe(struct platform_device *pdev,
int nr_sets;
int setno;
+ cpu_type = platform_get_device_id(pdev)->driver_data;
+
pr_debug("s3c2410_nand_probe(%p)\n", pdev);
info = kmalloc(sizeof(*info), GFP_KERNEL);
@@ -922,7 +923,7 @@ static int s3c24xx_nand_probe(struct platform_device *pdev,
return 0;
exit_error:
- s3c2410_nand_remove(pdev);
+ s3c24xx_nand_remove(pdev);
if (err == 0)
err = -EINVAL;
@@ -983,50 +984,30 @@ static int s3c24xx_nand_resume(struct platform_device *dev)
/* driver device registration */
-static int s3c2410_nand_probe(struct platform_device *dev)
-{
- return s3c24xx_nand_probe(dev, TYPE_S3C2410);
-}
-
-static int s3c2440_nand_probe(struct platform_device *dev)
-{
- return s3c24xx_nand_probe(dev, TYPE_S3C2440);
-}
-
-static int s3c2412_nand_probe(struct platform_device *dev)
-{
- return s3c24xx_nand_probe(dev, TYPE_S3C2412);
-}
-
-static struct platform_driver s3c2410_nand_driver = {
- .probe = s3c2410_nand_probe,
- .remove = s3c2410_nand_remove,
- .suspend = s3c24xx_nand_suspend,
- .resume = s3c24xx_nand_resume,
- .driver = {
- .name = "s3c2410-nand",
- .owner = THIS_MODULE,
+static struct platform_device_id s3c24xx_driver_ids[] = {
+ {
+ .name = "s3c2410-nand",
+ .driver_data = TYPE_S3C2410,
+ }, {
+ .name = "s3c2440-nand",
+ .driver_data = TYPE_S3C2440,
+ }, {
+ .name = "s3c2412-nand",
+ .driver_data = TYPE_S3C2412,
},
+ { }
};
-static struct platform_driver s3c2440_nand_driver = {
- .probe = s3c2440_nand_probe,
- .remove = s3c2410_nand_remove,
- .suspend = s3c24xx_nand_suspend,
- .resume = s3c24xx_nand_resume,
- .driver = {
- .name = "s3c2440-nand",
- .owner = THIS_MODULE,
- },
-};
+MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);
-static struct platform_driver s3c2412_nand_driver = {
- .probe = s3c2412_nand_probe,
- .remove = s3c2410_nand_remove,
+static struct platform_driver s3c24xx_nand_driver = {
+ .probe = s3c24xx_nand_probe,
+ .remove = s3c24xx_nand_remove,
.suspend = s3c24xx_nand_suspend,
.resume = s3c24xx_nand_resume,
+ .id_table = s3c24xx_driver_ids,
.driver = {
- .name = "s3c2412-nand",
+ .name = "s3c24xx-nand",
.owner = THIS_MODULE,
},
};
@@ -1035,16 +1016,12 @@ static int __init s3c2410_nand_init(void)
{
printk("S3C24XX NAND Driver, (c) 2004 Simtec Electronics\n");
- platform_driver_register(&s3c2412_nand_driver);
- platform_driver_register(&s3c2440_nand_driver);
- return platform_driver_register(&s3c2410_nand_driver);
+ return platform_driver_register(&s3c24xx_nand_driver);
}
static void __exit s3c2410_nand_exit(void)
{
- platform_driver_unregister(&s3c2412_nand_driver);
- platform_driver_unregister(&s3c2440_nand_driver);
- platform_driver_unregister(&s3c2410_nand_driver);
+ platform_driver_unregister(&s3c24xx_nand_driver);
}
module_init(s3c2410_nand_init);
@@ -1053,6 +1030,3 @@ module_exit(s3c2410_nand_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
MODULE_DESCRIPTION("S3C24XX MTD NAND driver");
-MODULE_ALIAS("platform:s3c2410-nand");
-MODULE_ALIAS("platform:s3c2412-nand");
-MODULE_ALIAS("platform:s3c2440-nand");
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Basic kerneldoc comment updates
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Move to using platform device table Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: NAND ECC by chip rather than global Ben Dooks
2009-06-01 5:47 ` [MTD] [NAND] S3C2410: Move to using platform device table Eric Miao
1 sibling, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Ben Dooks
Move to using kerneldoc style commenting in the driver
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 89 ++++++++++++++++++++++++++++++++++++++-----
1 files changed, 78 insertions(+), 11 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index b7f0740..a2d1c70 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -74,6 +74,14 @@ static struct nand_ecclayout nand_hw_eccoob = {
struct s3c2410_nand_info;
+/**
+ * struct s3c2410_nand_mtd - driver MTD structure
+ * @mtd: The MTD instance to pass to the MTD layer.
+ * @chip: The NAND chip information.
+ * @set: The platform information supplied for this set of NAND chips.
+ * @info: Link back to the hardware information.
+ * @scan_res: The result from calling nand_scan_ident().
+*/
struct s3c2410_nand_mtd {
struct mtd_info mtd;
struct nand_chip chip;
@@ -90,6 +98,21 @@ enum s3c_cpu_type {
/* overview of the s3c2410 nand state */
+/**
+ * struct s3c2410_nand_info - NAND controller state.
+ * @mtds: An array of MTD instances on this controoler.
+ * @platform: The platform data for this board.
+ * @device: The platform device we bound to.
+ * @area: The IO area resource that came from request_mem_region().
+ * @clk: The clock resource for this controller.
+ * @regs: The area mapped for the hardware registers described by @area.
+ * @sel_reg: Pointer to the register controlling the NAND selection.
+ * @sel_bit: The bit in @sel_reg to select the NAND chip.
+ * @mtd_count: The number of MTDs created from this controller.
+ * @save_sel: The contents of @sel_reg to be saved over suspend.
+ * @clk_rate: The clock rate from @clk.
+ * @cpu_type: The exact type of this controller.
+ */
struct s3c2410_nand_info {
/* mtd info */
struct nand_hw_control controller;
@@ -145,6 +168,14 @@ static inline int allow_clk_stop(struct s3c2410_nand_info *info)
#define NS_IN_KHZ 1000000
+/**
+ * s3c_nand_calc_rate - calculate timing data.
+ * @wanted: The cycle time in nanoseconds.
+ * @clk: The clock rate in kHz.
+ * @max: The maximum divider value.
+ *
+ * Calculate the timing value from the given parameters.
+ */
static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)
{
int result;
@@ -169,6 +200,14 @@ static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)
/* controller setup */
+/**
+ * s3c2410_nand_setrate - setup controller timing information.
+ * @info: The controller instance.
+ *
+ * Given the information supplied by the platform, calculate and set
+ * the necessary timing registers in the hardware to generate the
+ * necessary timing cycles to the hardware.
+ */
static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
{
struct s3c2410_platform_nand *plat = info->platform;
@@ -245,6 +284,13 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
return 0;
}
+/**
+ * s3c2410_nand_inithw - basic hardware initialisation
+ * @info: The hardware state.
+ *
+ * Do the basic initialisation of the hardware, using s3c2410_nand_setrate()
+ * to setup the hardware access speeds and set the controller to be enabled.
+*/
static int s3c2410_nand_inithw(struct s3c2410_nand_info *info)
{
int ret;
@@ -268,8 +314,19 @@ static int s3c2410_nand_inithw(struct s3c2410_nand_info *info)
return 0;
}
-/* select chip */
-
+/**
+ * s3c2410_nand_select_chip - select the given nand chip
+ * @mtd: The MTD instance for this chip.
+ * @chip: The chip number.
+ *
+ * This is called by the MTD layer to either select a given chip for the
+ * @mtd instance, or to indicate that the access has finished and the
+ * chip can be de-selected.
+ *
+ * The routine ensures that the nFCE line is correctly setup, and any
+ * platform specific selection code is called to route nFCE to the specific
+ * chip.
+ */
static void s3c2410_nand_select_chip(struct mtd_info *mtd, int chip)
{
struct s3c2410_nand_info *info;
@@ -667,11 +724,16 @@ static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,
}
#endif
-/* s3c2410_nand_init_chip
+/**
+ * s3c2410_nand_init_chip - initialise a single instance of an chip
+ * @info: The base NAND controller the chip is on.
+ * @nmtd: The new controller MTD instance to fill in.
+ * @set: The information passed from the board specific platform data.
*
- * init a single instance of an chip
-*/
-
+ * Initialise the given @nmtd from the information in @info and @set. This
+ * readies the structure for use with the MTD layer functions by ensuring
+ * all pointers are setup and the necessary control routines selected.
+ */
static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
struct s3c2410_nand_mtd *nmtd,
struct s3c2410_nand_set *set)
@@ -759,12 +821,17 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
chip->ecc.mode = NAND_ECC_NONE;
}
-/* s3c2410_nand_update_chip
+/**
+ * s3c2410_nand_update_chip - post probe update
+ * @info: The controller instance.
+ * @nmtd: The driver version of the MTD instance.
*
- * post-probe chip update, to change any items, such as the
- * layout for large page nand
- */
-
+ * This routine is called after the chip probe has succesfully completed
+ * and the relevant per-chip information updated. This call ensure that
+ * we update the internal state accordingly.
+ *
+ * The internal state is currently limited to the ECC state information.
+*/
static void s3c2410_nand_update_chip(struct s3c2410_nand_info *info,
struct s3c2410_nand_mtd *nmtd)
{
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: NAND ECC by chip rather than global
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Basic kerneldoc comment updates Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Small colon cleanup Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Andy Green, Nelson Castillo, Ben Dooks
From: Andy Green <andy@warmcat.com>
This makes us take note about the chosen ECC mode per-chip and
not the one set globally.
Signed-off-by: Andy Green <andy@warmcat.com>
Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
[ben-linux@fluff.org: andy@openmoko.com => andy@warmcat.com, rewrite subject]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 34 +++++++++++++++++++++++++---------
1 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index a2d1c70..daa4af9 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -819,6 +819,21 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
if (set->disable_ecc)
chip->ecc.mode = NAND_ECC_NONE;
+
+ switch (chip->ecc.mode) {
+ case NAND_ECC_NONE:
+ dev_info(info->device, "NAND ECC disabled\n");
+ break;
+ case NAND_ECC_SOFT:
+ dev_info(info->device, "NAND soft ECC\n");
+ break;
+ case NAND_ECC_HW:
+ dev_info(info->device, "NAND hardware ECC\n");
+ break;
+ default:
+ dev_info(info->device, "NAND ECC UNKNOWN\n");
+ break;
+ }
}
/**
@@ -840,18 +855,19 @@ static void s3c2410_nand_update_chip(struct s3c2410_nand_info *info,
dev_dbg(info->device, "chip %p => page shift %d\n",
chip, chip->page_shift);
- if (hardware_ecc) {
+ if (chip->ecc.mode != NAND_ECC_HW)
+ return;
+
/* change the behaviour depending on wether we are using
* the large or small page nand device */
- if (chip->page_shift > 10) {
- chip->ecc.size = 256;
- chip->ecc.bytes = 3;
- } else {
- chip->ecc.size = 512;
- chip->ecc.bytes = 3;
- chip->ecc.layout = &nand_hw_eccoob;
- }
+ if (chip->page_shift > 10) {
+ chip->ecc.size = 256;
+ chip->ecc.bytes = 3;
+ } else {
+ chip->ecc.size = 512;
+ chip->ecc.bytes = 3;
+ chip->ecc.layout = &nand_hw_eccoob;
}
}
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Small colon cleanup
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: NAND ECC by chip rather than global Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Uninitialised variable cleanup Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Nelson Castillo, Ben Dooks
From: Nelson Castillo <arhuaco@freaks-unidos.net>
checkpatch would complain with "disable_ecc : 1".
Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
[ben-linux@fluff.org: subject cleanup]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
arch/arm/plat-s3c/include/plat/nand.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h
index f4dcd14..9855467 100644
--- a/arch/arm/plat-s3c/include/plat/nand.h
+++ b/arch/arm/plat-s3c/include/plat/nand.h
@@ -22,7 +22,7 @@
*/
struct s3c2410_nand_set {
- unsigned int disable_ecc : 1;
+ unsigned int disable_ecc:1;
int nr_chips;
int nr_partitions;
@@ -39,7 +39,7 @@ struct s3c2410_platform_nand {
int twrph0; /* active time for nWE/nOE */
int twrph1; /* time for release CLE/ALE from nWE/nOE inactive */
- unsigned int ignore_unset_ecc : 1;
+ unsigned int ignore_unset_ecc:1;
int nr_sets;
struct s3c2410_nand_set *sets;
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Uninitialised variable cleanup
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Small colon cleanup Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Fix CFG debug order Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Nelson Castillo, Ben Dooks
From: Nelson Castillo <arhuaco@freaks-unidos.net>
~ Avoid warning without generating code.
(I don't even get the warning without the macro uninitialized_var).
Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
[ben-linux@fluff.org: subject cleanup]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 5 +----
1 files changed, 1 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index daa4af9..7be3663 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -214,7 +214,7 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
int tacls_max = (info->cpu_type == TYPE_S3C2412) ? 8 : 4;
int tacls, twrph0, twrph1;
unsigned long clkrate = clk_get_rate(info->clk);
- unsigned long set, cfg, mask;
+ unsigned long uninitialized_var(set), cfg, uninitialized_var(mask);
unsigned long flags;
/* calculate the timing information for the controller */
@@ -264,9 +264,6 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
break;
default:
- /* keep compiler happy */
- mask = 0;
- set = 0;
BUG();
}
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Fix CFG debug order
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Uninitialised variable cleanup Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow commandline partition processing Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Andy Green, Nelson Castillo, Ben Dooks
From: Andy Green <andy@warmcat.com>
Fix NAND CFG debug order.
Signed-off-by: Andy Green <andy@warmcat.com>
Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
[ben-linux@fluff.org: Change andy@openmoko.com to andy@warmcat.com, subject cleanup]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 7be3663..87c40de 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -267,8 +267,6 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
BUG();
}
- dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg);
-
local_irq_save(flags);
cfg = readl(info->regs + S3C2410_NFCONF);
@@ -278,6 +276,8 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
local_irq_restore(flags);
+ dev_dbg(info->device, "NF_CONF is 0x%lx\n", cfg);
+
return 0;
}
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Allow commandline partition processing
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Fix CFG debug order Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Andy Green, Andy Green, Ben Dooks, Nelson Castillo
From: Andy Green <andy@warmcat.com>
This patch allows commandline partition processing to
work with the s3c2410 NAND platform driver.
Signed-off-by: Andy Green <andy@warcat.com>
Signed-off-by: Nelson Castillo <arhuaco@freaks-unidos.net>
[ben-linux@fluff.org: Change andy@openmoko.com to andy@warmcat.com]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 18 ++++++++++++++++--
1 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 87c40de..ef56652 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -699,17 +699,31 @@ static int s3c24xx_nand_remove(struct platform_device *pdev)
}
#ifdef CONFIG_MTD_PARTITIONS
+const char *part_probes[] = { "cmdlinepart", NULL };
static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,
struct s3c2410_nand_mtd *mtd,
struct s3c2410_nand_set *set)
{
+ struct mtd_partition *part_info;
+ int nr_part = 0;
+
if (set == NULL)
return add_mtd_device(&mtd->mtd);
- if (set->nr_partitions > 0 && set->partitions != NULL) {
- return add_mtd_partitions(&mtd->mtd, set->partitions, set->nr_partitions);
+ if (set->nr_partitions == 0) {
+ mtd->mtd.name = set->name;
+ nr_part = parse_mtd_partitions(&mtd->mtd, part_probes,
+ &part_info, 0);
+ } else {
+ if (set->nr_partitions > 0 && set->partitions != NULL) {
+ nr_part = set->nr_partitions;
+ part_info = set->partitions;
+ }
}
+ if (nr_part > 0 && part_info)
+ return add_mtd_partitions(&mtd->mtd, part_info, nr_part);
+
return add_mtd_device(&mtd->mtd);
}
#else
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow commandline partition processing Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND Ben Dooks
2009-06-02 19:36 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Peter Korsgaard
0 siblings, 2 replies; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Michel Pollet, Ben Dooks
From: Michel Pollet <buserror@gmail.com>
Converted the old comnent to kerneldoc.
Signed-off-by: Michel Pollet <buserror@gmail.com>
[ben-linux@fluff.org: updated subject]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
arch/arm/plat-s3c/include/plat/nand.h | 22 ++++++++++++----------
1 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h
index 9855467..350ec95 100644
--- a/arch/arm/plat-s3c/include/plat/nand.h
+++ b/arch/arm/plat-s3c/include/plat/nand.h
@@ -10,17 +10,19 @@
* published by the Free Software Foundation.
*/
-/* struct s3c2410_nand_set
+/**
+ * struct s3c2410_nand_set - define a set of one or more nand chips
+ * @disable_ecc: Entirely disable ECC - Dangerous
+ * @nr_chips: Number of chips in this set
+ * @nr_partitions: Number of partitions pointed to be partitoons (or zero)
+ * @name: Name of set (optional)
+ * @nr_map: Map for low-layer logical to physical chip numbers (option)
+ * @partitions: The mtd partition list
*
- * define an set of one or more nand chips registered with an unique mtd
- *
- * nr_chips = number of chips in this set
- * nr_partitions = number of partitions pointed to be partitoons (or zero)
- * name = name of set (optional)
- * nr_map = map for low-layer logical to physical chip numbers (option)
- * partitions = mtd partition list
-*/
-
+ * define a set of one or more nand chips registered with an unique mtd. Also
+ * allows to pass flag to the underlying NAND layer. 'disable_ecc' will trigger
+ * a warning at boot time.
+ */
struct s3c2410_nand_set {
unsigned int disable_ecc:1;
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write Ben Dooks
2009-06-02 19:36 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Peter Korsgaard
1 sibling, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Michel Pollet, Ben Dooks
From: Michel Pollet <buserror@gmail.com>
Added a flag to allow the machine code to tell the NAND
subsystem that it should try to pickup a BBT from the flash,
and also skip the NAND full scan at startup.
Signed-off-by: Michel Pollet <buserror@gmail.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
arch/arm/plat-s3c/include/plat/nand.h | 5 +++++
drivers/mtd/nand/s3c2410.c | 6 ++++++
2 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h
index 350ec95..bed4a51 100644
--- a/arch/arm/plat-s3c/include/plat/nand.h
+++ b/arch/arm/plat-s3c/include/plat/nand.h
@@ -13,6 +13,10 @@
/**
* struct s3c2410_nand_set - define a set of one or more nand chips
* @disable_ecc: Entirely disable ECC - Dangerous
+ * @flash_bbt: Openmoko u-boot can create a Bad Block Table
+ * Setting this flag will allow the kernel to
+ * look for it at boot time and also skip the NAND
+ * scan.
* @nr_chips: Number of chips in this set
* @nr_partitions: Number of partitions pointed to be partitoons (or zero)
* @name: Name of set (optional)
@@ -25,6 +29,7 @@
*/
struct s3c2410_nand_set {
unsigned int disable_ecc:1;
+ unsigned int flash_bbt:1;
int nr_chips;
int nr_partitions;
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index ef56652..d315b51 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -845,6 +845,12 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
dev_info(info->device, "NAND ECC UNKNOWN\n");
break;
}
+
+ /* If you use u-boot BBT creation code, specifying this flag will
+ * let the kernel fish out the BBT from the NAND, and also skip the
+ * full NAND scan that can take 1/2s or so. Little things... */
+ if (set->flash_bbt)
+ chip->options |= NAND_USE_FLASH_BBT | NAND_SKIP_BBTSCAN;
}
/**
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Use DIV_ROUND_UP Ben Dooks
0 siblings, 1 reply; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Ben Dooks
Add code to deal with fractional lengths, as reported by
Werner Almesberger. Re-work of his original patch.
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 22 ++++++++++++++++++++--
1 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index d315b51..8a7f960 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -584,7 +584,16 @@ static void s3c2410_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
static void s3c2440_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
- readsl(info->regs + S3C2440_NFDATA, buf, len / 4);
+
+ readsl(info->regs + S3C2440_NFDATA, buf, len >> 2);
+
+ /* cleanup if we've got less than a word to do */
+ if (len & 3) {
+ buf += len & ~3;
+
+ for (; len & 3; len--)
+ *buf++ = readb(info->regs + S3C2440_NFDATA);
+ }
}
static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
@@ -596,7 +605,16 @@ static void s3c2410_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int
static void s3c2440_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
{
struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);
- writesl(info->regs + S3C2440_NFDATA, buf, len / 4);
+
+ writesl(info->regs + S3C2440_NFDATA, buf, len >> 2);
+
+ /* cleanup any fractional write */
+ if (len & 3) {
+ buf += len & ~3;
+
+ for (; len & 3; len--, buf++)
+ writeb(*buf, info->regs + S3C2440_NFDATA);
+ }
}
/* cpufreq driver support */
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [MTD] [NAND] S3C2410: Use DIV_ROUND_UP
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write Ben Dooks
@ 2009-05-30 17:41 ` Ben Dooks
0 siblings, 0 replies; 15+ messages in thread
From: Ben Dooks @ 2009-05-30 17:41 UTC (permalink / raw)
To: linux-mtd; +Cc: Ben Dooks
Change to using DIV_ROUND_UP() in the timing calculation
instead of blindly doing result++
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
---
drivers/mtd/nand/s3c2410.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 8a7f960..89b7905 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -180,8 +180,7 @@ static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)
{
int result;
- result = (wanted * clk) / NS_IN_KHZ;
- result++;
+ result = DIV_ROUND_UP((wanted * clk), NS_IN_KHZ);
pr_debug("result %d from %ld, %d\n", result, clk, wanted);
--
1.5.6.5
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [MTD] [NAND] S3C2410: Move to using platform device table
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Move to using platform device table Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Basic kerneldoc comment updates Ben Dooks
@ 2009-06-01 5:47 ` Eric Miao
1 sibling, 0 replies; 15+ messages in thread
From: Eric Miao @ 2009-06-01 5:47 UTC (permalink / raw)
To: Ben Dooks; +Cc: Eric Miao, linux-mtd
On Sun, May 31, 2009 at 1:41 AM, Ben Dooks <ben-linux@fluff.org> wrote:
> Commit 57fee4a58fe802272742caae248872c392a60670 added an
> method to specify the platform device compatibility by using
> an id-table instead of registering multiple drivers.
>
> Move the S3C24XX NAND driver to using this ID table.
>
> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
> CC: Eric Miao <eric.miao@marvell.com>
Yeah, looks much cleaner.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND Ben Dooks
@ 2009-06-02 19:36 ` Peter Korsgaard
2009-06-02 22:55 ` Ben Dooks
1 sibling, 1 reply; 15+ messages in thread
From: Peter Korsgaard @ 2009-06-02 19:36 UTC (permalink / raw)
To: Ben Dooks; +Cc: linux-mtd, Michel Pollet
>>>>> "Ben" == Ben Dooks <ben-linux@fluff.org> writes:
Hi,
Ben> diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h
Ben> index 9855467..350ec95 100644
Ben> --- a/arch/arm/plat-s3c/include/plat/nand.h
Ben> +++ b/arch/arm/plat-s3c/include/plat/nand.h
Ben> @@ -10,17 +10,19 @@
Ben> * published by the Free Software Foundation.
Ben> */
Ben> -/* struct s3c2410_nand_set
Ben> +/**
Ben> + * struct s3c2410_nand_set - define a set of one or more nand chips
Ben> + * @disable_ecc: Entirely disable ECC - Dangerous
Ben> + * @nr_chips: Number of chips in this set
Ben> + * @nr_partitions: Number of partitions pointed to be partitoons (or zero)
s/partitoons/partitions/ - And the text sounds pretty confusing to
me. What about
Number of struct mtd_partitions pointed to by partitions (or zero)
Yes, I know it won't fit in 80 chars.
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set
2009-06-02 19:36 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Peter Korsgaard
@ 2009-06-02 22:55 ` Ben Dooks
0 siblings, 0 replies; 15+ messages in thread
From: Ben Dooks @ 2009-06-02 22:55 UTC (permalink / raw)
To: Peter Korsgaard; +Cc: linux-mtd, Michel Pollet, Ben Dooks
On Tue, Jun 02, 2009 at 09:36:35PM +0200, Peter Korsgaard wrote:
> >>>>> "Ben" == Ben Dooks <ben-linux@fluff.org> writes:
>
> Hi,
>
> Ben> diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h
> Ben> index 9855467..350ec95 100644
> Ben> --- a/arch/arm/plat-s3c/include/plat/nand.h
> Ben> +++ b/arch/arm/plat-s3c/include/plat/nand.h
> Ben> @@ -10,17 +10,19 @@
> Ben> * published by the Free Software Foundation.
> Ben> */
>
> Ben> -/* struct s3c2410_nand_set
> Ben> +/**
> Ben> + * struct s3c2410_nand_set - define a set of one or more nand chips
> Ben> + * @disable_ecc: Entirely disable ECC - Dangerous
> Ben> + * @nr_chips: Number of chips in this set
> Ben> + * @nr_partitions: Number of partitions pointed to be partitoons (or zero)
>
> s/partitoons/partitions/ - And the text sounds pretty confusing to
> me. What about
>
> Number of struct mtd_partitions pointed to by partitions (or zero)
>
> Yes, I know it won't fit in 80 chars.
bah, merged the wrong patch. will fix.
> --
> Bye, Peter Korsgaard
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
--
Ben (ben@fluff.org, http://www.fluff.org/)
'a smiley only costs 4 bytes'
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2009-06-02 22:55 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-30 17:41 S3C2410 NAND controller updates Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Move to using platform device table Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Basic kerneldoc comment updates Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: NAND ECC by chip rather than global Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Small colon cleanup Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Uninitialised variable cleanup Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Fix CFG debug order Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow commandline partition processing Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write Ben Dooks
2009-05-30 17:41 ` [MTD] [NAND] S3C2410: Use DIV_ROUND_UP Ben Dooks
2009-06-02 19:36 ` [MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set Peter Korsgaard
2009-06-02 22:55 ` Ben Dooks
2009-06-01 5:47 ` [MTD] [NAND] S3C2410: Move to using platform device table Eric Miao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox