Age | Commit message (Collapse) | Author | Files | Lines |
|
When CONFIG_MTD_PARTITIONED_MASTER=y, it is fatal to call
mtd_device_parse_register() twice on the same MTD, as we try to register
the same device/kobject multipile times.
When CONFIG_MTD_PARTITIONED_MASTER=n, calling
mtd_device_parse_register() is more of just a nuisance, as we can mostly
navigate around any conflicting actions.
But anyway, doing so is a Bad Thing (TM), and we should complain loudly
for any drivers that try to do this.
Signed-off-by: Brian Norris <[email protected]>
Reviewed-by: Richard Weinberger <[email protected]>
|
|
Since commit 3efe41be224c ("mtd: implement common reboot notifier
boilerplate"), we might try to register a reboot notifier for an MTD
that failed to register. Let's avoid this by making the error path
clearer.
Signed-off-by: Brian Norris <[email protected]>
Reviewed-by: Richard Weinberger <[email protected]>
|
|
Changes the 32-bit time type timeval to the 64-bit time type
ktime_t, since 32-bit systems using struct timeval will break in the
year 2038. Correspondingly change do_gettimeofday() to ktime_get()
since ktime_get returns a ktime_t, but do_gettimeofday returns a
struct timeval.Here, ktime_get() is used instead of ktime_get_real()
since ktime_get() uses monotonic clock.
Signed-off-by: Shraddha Barke <[email protected]>
Reviewed-by: Arnd Bergmann <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
This patch adds support for 4-bit ECC BCH4 for the SPEAr600 SoC. This can
be used by boards equipped with a NAND chip that requires 4-bit ECC
strength. The SPEAr600 HW ECC only supports 1-bit ECC strength.
To enable SW BCH4, you need to specify this in your nand controller
DT node:
nand-ecc-mode = "soft_bch";
nand-ecc-strength = <4>;
nand-ecc-step-size = <512>;
Tested on a custom SPEAr600 board.
Signed-off-by: Stefan Roese <[email protected]>
Cc: Linus Walleij <[email protected]>
Cc: Viresh Kumar <[email protected]>
[Brian: tweaked the comments a bit]
Signed-off-by: Brian Norris <[email protected]>
|
|
Signed-off-by: Brian Norris <[email protected]>
Reviewed-by: Boris Brezillon <[email protected]>
|
|
If nand_wait_ready() times out, this is silently ignored, and its
caller will then proceed to read from/write to the chip before it is
ready. This can potentially result in corruption with no indication as
to why.
While a 20ms timeout seems like it should be plenty enough, certain
behaviour can cause it to timeout much earlier than expected. The
situation which prompted this change was that CPU 0, which is
responsible for updating jiffies, was holding interrupts disabled
for a fairly long time while writing to the console during a printk,
causing several jiffies updates to be delayed. If CPU 1 happens to
enter the timeout loop in nand_wait_ready() just before CPU 0 re-
enables interrupts and updates jiffies, CPU 1 will immediately time
out when the delayed jiffies updates are made. The result of this is
that nand_wait_ready() actually waits less time than the NAND chip
would normally take to be ready, and then read_page() proceeds to
read out bad data from the chip.
The situation described above may seem unlikely, but in fact it can be
reproduced almost every boot on the MIPS Creator Ci20.
Therefore, this patch increases the timeout to 400ms. This should be
enough to cover cases where jiffies updates get delayed. In nand_wait()
the timeout was previously chosen based on whether erasing or
programming. This is changed to be 400ms unconditionally as well to
avoid similar problems there. nand_wait() is also slightly refactored
to be consistent with nand_wait{,_status}_ready(). These changes should
have no effect during normal operation.
Debugging this was made more difficult by the misleading comment above
nand_wait_ready() stating "The timeout is caught later" - no timeout was
ever reported, leading me away from the real source of the problem.
Therefore, a pr_warn() is added when a timeout does occur so that it is
easier to pinpoint similar problems in future.
Signed-off-by: Alex Smith <[email protected]>
Signed-off-by: Harvey Hunt <[email protected]>
Reviewed-by: Niklas Cassel <[email protected]>
Cc: Alex Smith <[email protected]>
Cc: Zubair Lutfullah Kakakhel <[email protected]>
Cc: David Woodhouse <[email protected]>
Cc: Niklas Cassel <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Smatch found a bug in the error handling:
drivers/mtd/devices/docg3.c:1634 doc_register_sysfs()
error: buffer overflow 'doc_sys_attrs' 4 <= 4
The problem is that if the very last device_create_file() fails, then we
are beyond the end of the array. Actually, any time i == 3 then there
is a problem. We can fix this an simplify the code at the same time by
moving the !ret conditions out of the for loops and using a goto
instead.
Signed-off-by: Dan Carpenter <[email protected]>
Acked-by: Robert Jarzmik <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
With the previous modifications, lots of pxa3xx specific definitions can
be removed.
Signed-off-by: Antoine Tenart <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Rework the pxa3xx_nand driver to allow using functions exported by the
nand framework to detect the flash and the timings. Then setup the
timings using the helpers previously added.
Signed-off-by: Antoine Tenart <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Add helpers to setup the timings in the pxa3xx driver. These helpers
allow to either make use of the nand framework nand_sdr_timings or the
pxa3xx specific pxa3xx_nand_host, for compatibility reasons.
Signed-off-by: Antoine Tenart <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Using readsl() result in a build error on i386. Fix this by using
ioread32_rep() instead, to allow compile testing the pxa3xx nand driver
on other architectures later.
Suggested-by: Arnd Bergmann <[email protected]>
Signed-off-by: Antoine Tenart <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
If common clock framework is configured, the driver generates a warning,
which is fixed by this change:
WARNING: CPU: 0 PID: 1 at drivers/clk/clk.c:727 clk_core_enable+0x2c/0xa4()
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 4.3.0-rc2+ #206
Hardware name: LPC32XX SoC (Flattened Device Tree)
Backtrace:
[<>] (dump_backtrace) from [<>] (show_stack+0x18/0x1c)
[<>] (show_stack) from [<>] (dump_stack+0x20/0x28)
[<>] (dump_stack) from [<>] (warn_slowpath_common+0x90/0xb8)
[<>] (warn_slowpath_common) from [<>] (warn_slowpath_null+0x24/0x2c)
[<>] (warn_slowpath_null) from [<>] (clk_core_enable+0x2c/0xa4)
[<>] (clk_core_enable) from [<>] (clk_enable+0x24/0x38)
[<>] (clk_enable) from [<>] (lpc32xx_nand_probe+0x208/0x248)
[<>] (lpc32xx_nand_probe) from [<>] (platform_drv_probe+0x50/0xa0)
[<>] (platform_drv_probe) from [<>] (driver_probe_device+0x18c/0x408)
[<>] (driver_probe_device) from [<>] (__driver_attach+0x70/0x94)
[<>] (__driver_attach) from [<>] (bus_for_each_dev+0x74/0x98)
[<>] (bus_for_each_dev) from [<>] (driver_attach+0x20/0x28)
[<>] (driver_attach) from [<>] (bus_add_driver+0x11c/0x248)
[<>] (bus_add_driver) from [<>] (driver_register+0xa4/0xe8)
[<>] (driver_register) from [<>] (__platform_driver_register+0x50/0x64)
[<>] (__platform_driver_register) from [<>] (lpc32xx_nand_driver_init+0x18/0x20)
[<>] (lpc32xx_nand_driver_init) from [<>] (do_one_initcall+0x11c/0x1dc)
[<>] (do_one_initcall) from [<>] (kernel_init_freeable+0x10c/0x1d4)
[<>] (kernel_init_freeable) from [<>] (kernel_init+0x10/0xec)
[<>] (kernel_init) from [<>] (ret_from_fork+0x14/0x24)
Signed-off-by: Vladimir Zapolskiy <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
If common clock framework is configured, the driver generates a warning,
which is fixed by this change:
WARNING: CPU: 0 PID: 1 at drivers/clk/clk.c:727 clk_core_enable+0x2c/0xa4()
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 4.3.0-rc2+ #201
Hardware name: LPC32XX SoC (Flattened Device Tree)
Backtrace:
[<>] (dump_backtrace) from [<>] (show_stack+0x18/0x1c)
[<>] (show_stack) from [<>] (dump_stack+0x20/0x28)
[<>] (dump_stack) from [<>] (warn_slowpath_common+0x90/0xb8)
[<>] (warn_slowpath_common) from [<>] (warn_slowpath_null+0x24/0x2c)
[<>] (warn_slowpath_null) from [<>] (clk_core_enable+0x2c/0xa4)
[<>] (clk_core_enable) from [<>] (clk_enable+0x24/0x38)
[<>] (clk_enable) from [<>] (lpc32xx_nand_probe+0x290/0x568)
[<>] (lpc32xx_nand_probe) from [<>] (platform_drv_probe+0x50/0xa0)
[<>] (platform_drv_probe) from [<>] (driver_probe_device+0x18c/0x408)
[<>] (driver_probe_device) from [<>] (__driver_attach+0x70/0x94)
[<>] (__driver_attach) from [<>] (bus_for_each_dev+0x74/0x98)
[<>] (bus_for_each_dev) from [<>] (driver_attach+0x20/0x28)
[<>] (driver_attach) from [<>] (bus_add_driver+0x11c/0x248)
[<>] (bus_add_driver) from [<>] (driver_register+0xa4/0xe8)
[<>] (driver_register) from [<>] (__platform_driver_register+0x50/0x64)
[<>] (__platform_driver_register) from [<>] (lpc32xx_nand_driver_init+0x18/0x20)
[<>] (lpc32xx_nand_driver_init) from [<>] (do_one_initcall+0x11c/0x1dc)
[<>] (do_one_initcall) from [<>] (kernel_init_freeable+0x10c/0x1d4)
[<>] (kernel_init_freeable) from [<>] (kernel_init+0x10/0xec)
[<>] (kernel_init) from [<>] (ret_from_fork+0x14/0x24)
Signed-off-by: Vladimir Zapolskiy <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
We got the syntax wrong here. Compile tested this time!
Error:
drivers/mtd/maps/rbtx4939-flash.c: In function 'rbtx4939_flash_probe':
>> drivers/mtd/maps/rbtx4939-flash.c:99:11: error: request for member 'dev' in something not a structure or union
info->mtd.dev.parent = &dev->dev;
^
Fixes: 9aa7e50276c1 ("mtd: maps: rbtx4939-flash: show parent device in sysfs")
Reported-by: kbuild test robot <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
Cc: Frans Klaver <[email protected]>
|
|
Kernel headers should use linux/types.h instead.
Signed-off-by: Mikko Rapeli <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
We should prevent user to erasing mtd device with
an unaligned offset or length.
Signed-off-by: Dongsheng Yang <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
The old PM model is deprecated. This is equivalent.
Signed-off-by: Brian Norris <[email protected]>
Tested-by: Ezequiel Garcia <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
|
|
mtd_{suspend,resume}() get called from mtdcore in a class suspend/resume
callback. We don't need to call them again here. In practice, this would
actually work OK, as nand_base actually handles nesting OK -- it just
might print warnings.
Untested, but there are few (no?) users of PM for this driver AFAIK.
Signed-off-by: Brian Norris <[email protected]>
Tested-by: Ezequiel Garcia <[email protected]>
Acked-by: Ezequiel Garcia <[email protected]>
|
|
Building for x86 results in the following build errors:
drivers/mtd/spi-nor/fsl-quadspi.c: In function 'fsl_qspi_init_lut':
>> drivers/mtd/spi-nor/fsl-quadspi.c:355:21: error: 'SZ_16M' undeclared (first use in this function)
if (q->nor_size <= SZ_16M) {
^
drivers/mtd/spi-nor/fsl-quadspi.c:355:21: note: each undeclared identifier is reported only once for each function it appears in
drivers/mtd/spi-nor/fsl-quadspi.c: In function 'fsl_qspi_read':
>> drivers/mtd/spi-nor/fsl-quadspi.c:208:27: error: 'SZ_4M' undeclared (first use in this function)
#define QUADSPI_MIN_IOMAP SZ_4M
^
>> drivers/mtd/spi-nor/fsl-quadspi.c:845:25: note: in expansion of macro 'QUADSPI_MIN_IOMAP'
q->memmap_len = len > QUADSPI_MIN_IOMAP ? len : QUADSPI_MIN_IOMAP;
Explicitly include <linux/sizes.h> to fix the problem.
Reported-by: kbuild test robot <[email protected]>
Signed-off-by: Fabio Estevam <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
This driver doesn't actually need ARCH_MXC to compile. Relax the
constraints.
Signed-off-by: Brian Norris <[email protected]>
Acked-by: Han xu <[email protected]>
|
|
Seen when compile-testing on non-32-bit arch:
CC drivers/mtd/spi-nor/fsl-quadspi.o
drivers/mtd/spi-nor/fsl-quadspi.c: In function 'fsl_qspi_read':
drivers/mtd/spi-nor/fsl-quadspi.c:873:2: warning: format '%d' expects argument of type 'int', but argument 6 has type 'size_t' [-Wformat=]
dev_dbg(q->dev, "cmd [%x],read from 0x%p, len:%d\n",
^
Also drop the '0x' prefixing to the '%p' formatter, since %p already
knows how to format pointers appropriately.
Signed-off-by: Brian Norris <[email protected]>
Acked-by: Han xu <[email protected]>
|
|
These flash support dual and quad read. Tested dual read on the 32 Mbit
version.
Signed-off-by: Brian Norris <[email protected]>
|
|
In case the flash was locked at boot time.
Signed-off-by: Brian Norris <[email protected]>
|
|
Many other flash share the same features as ST Micro. I've tested some
Winbond flash, so add them.
Signed-off-by: Brian Norris <[email protected]>
|
|
This enables ioctl(MEMISLOCKED). Status can now be reported in the
mtdinfo or flash_lock utilities found in mtd-utils.
Signed-off-by: Brian Norris <[email protected]>
|
|
This code was a bit sloppy, would produce a lot of copy-and-paste, and
did not always provide a sensible interface:
* It didn't validate the length for LOCK and the offset for UNLOCK, so
we were essentially discarding half of the user-supplied data and
assuming what they wanted to lock/unlock
* It didn't do very good error checking
* It didn't make use of the fact that this operation works on
power-of-two dimensions
So, rewrite this to do proper bit arithmetic rather than a bunch of
hard-coded condition tables. Now we have:
* More comments on how this was derived
* Notes on what is (and isn't) supported
* A more exendible function, so we could add support for other
protection ranges
* More accurate locking - e.g., suppose the top quadrant is locked (75%
to 100%); then in the following cases, case (a) will succeed but (b)
will not (return -EINVAL):
(a) user requests lock 3rd quadrant (50% to 75%)
(b) user requests lock 3rd quadrant, minus a few blocks (e.g., 50%
to 73%)
Case (b) *should* fail, since we'd have to lock blocks that weren't
requested. But the old implementation didn't know the difference and
would lock the entire second half (50% to 100%)
This refactoring work will also help enable the addition of
mtd_is_locked() support and potentially the support of bottom boot
protection (TB=1).
Signed-off-by: Brian Norris <[email protected]>
|
|
I got the names of these fields wrong.
Signed-off-by: Brian Norris <[email protected]>
|
|
No functional change, just cosmetic.
Signed-off-by: Brian Norris <[email protected]>
|
|
These are often similar for CFI (parallel NOR) and for SPI NOR, but they
aren't always the same, for various reasons (different namespaces,
company acquisitions and renames, etc.). And some don't have CFI_MFR_*
entries at all.
So let's make a proper place to list the SPI NOR IDs, with all the SPI
NOR specific assumptions and comments.
Signed-off-by: Brian Norris <[email protected]>
|
|
These status bits use different ways of representing similar integer
constants -- some are decimal, some are hex. Make them more consistent.
At the same time, impose my own preference, since IMO it's clearer what
these are when using the BIT() macro.
Signed-off-by: Brian Norris <[email protected]>
|
|
We use BIT() in the header. No real problem for now, but it's better to
be accurate.
Signed-off-by: Brian Norris <[email protected]>
|
|
Signed-off-by: Sean Nyekjaer <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Signed-off-by: Sean Nyekjaer <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
The ->read_xxx() methods are all passed the page number the NAND controller
is supposed to read, but ->write_xxx() do not have such a parameter.
This is a problem if we want to properly implement data
scrambling/randomization in order to mitigate MLC sensibility to repeated
pattern: to prevent bitflips in adjacent pages in the same block we need
to avoid repeating the same pattern at the same offset in those pages,
hence the randomizer/scrambler engine need to be passed the page value
in order to adapt its seed accordingly.
Moreover, adding the page parameter to the ->write_xxx() methods add some
consistency to the current API.
Signed-off-by: Boris Brezillon <[email protected]>
CC: Josh Wu <[email protected]>
CC: Ezequiel Garcia <[email protected]>
CC: Maxime Ripard <[email protected]>
CC: Greg Kroah-Hartman <[email protected]>
CC: Huang Shijie <[email protected]>
CC: Stefan Agner <[email protected]>
CC: [email protected]
CC: [email protected]
CC: [email protected]
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Owner is automatically set by mtdcore. Make use of that.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where mtd parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where mtd parent device symlinks aren't shown in sysfs.
While at it, take advantage of the default owner and name values set by
mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Owner and name are automatically set by mtdcore. Make use of that.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Make sure the device structure is properly shown in sysfs by properly
filling in dev.parent.
While at it, make use of the default owner and name values set by
mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Owner is automatically set by mtdcore. Make use of that.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Owner is automatically set by mtdcore. Make use of that.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|
|
Fix a bug where parent device symlinks aren't shown in sysfs.
While at it, make use of the default owner value set by mtdcore.
Signed-off-by: Frans Klaver <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
|