mtd: nand: refactor the NAND subsystem (part 1)
Subsystems (15)
v4 cover mtd: nand: refactor the NAND subsystem (part 1)
Hello,
This huge series aims at clarifying the relationship between the mtd and nand_chip structures and hiding NAND framework internals to NAND controller drivers.
The first part of the series (patch 1 to 4) is a set of fixes/simple reworks easing the migration to mtd_to_nand().
The second part of the series embeds the mtd structure into the nand_chip one so that NAND controller drivers don't have to bother allocating the MTD device and linking it with the NAND chip.
The last part of the series hides accesses to the chip->priv field behind two helper functions.
This allows removal of some of the boilerplate code done in all NAND controller drivers, but most importantly, it unifies a bit the way NAND chip structures are instantiated (even though we still have two different kinds of drivers: those embedding the nand_chip struct into their private nand chip representation, and those allocating two different structures and linking them together with the chip->priv field).
As said in the title, this refactoring is only the first step. I plan to rework the NAND controller / NAND chip separation for pretty much the same
reasons: clarifying the separation between the two concepts, and getting rid of more boilerplate code in NAND controller drivers.
Stay tuned ;-).
Best Regards,
Boris
Changes since v3:
- fix some bugs introduced when migrating to nand_to_mtd()
- split the huge commit switching all drivers to nand_to_mtd() into several commits (one per driver) to ease review and integration
- add a simple fixes/reworks at the beginning of the series (mainly to ease migration to nand_to_mtd())
- drop already applied patches.
Changes since v2:
- fix some build warnings/erros
Changes since v1:
- dropped already applied patches
- fixed some typos
- manually fixed some modifications omitted by the coccinelle scripts
- manually reworked modifactions done by coccinelle scripts to improve readability and fix coding style issues
*** BLURB HERE ***
Boris Brezillon (58):
mtd: nand: denali: add missing nand_release() call in denali_remove()
mtd: nand: fsmc: create and use mtd_to_fsmc()
mtd: nand: nuc900: create and use mtd_to_nuc900()
mtd: nand: omap2: create and use mtd_to_omap()
mtd: nand: ams-delta: use the mtd instance embedded in struct
nand_chip
mtd: nand: atmel: use the mtd instance embedded in struct nand_chip
mtd: nand: au1550nd: use the mtd instance embedded in struct nand_chip
mtd: nand: bcm47xx: use the mtd instance embedded in struct nand_chip
mtd: nand: bf5xx: use the mtd instance embedded in struct nand_chip
mtd: nand: brcm: use the mtd instance embedded in struct nand_chip
mtd: nand: cafe: use the mtd instance embedded in struct nand_chip
mtd: nand: cmx270: use the mtd instance embedded in struct nand_chip
mtd: nand: cs553x: use the mtd instance embedded in struct nand_chip
mtd: nand: davinci: use the mtd instance embedded in struct nand_chip
mtd: nand: denali: use the mtd instance embedded in struct nand_chip
mtd: nand: diskonchip: use the mtd instance embedded in struct
nand_chip
mtd: nand: docg4: use the mtd instance embedded in struct nand_chip
mtd: nand: fsl_elbc: use the mtd instance embedded in struct nand_chip
mtd: nand: fsl_ifc: use the mtd instance embedded in struct nand_chip
mtd: nand: fsl_upm: use the mtd instance embedded in struct nand_chip
mtd: nand: fsmc: use the mtd instance embedded in struct nand_chip
mtd: nand: gpio: use the mtd instance embedded in struct nand_chip
mtd: nand: gpmi: use the mtd instance embedded in struct nand_chip
mtd: nand: hisi504: use the mtd instance embedded in struct nand_chip
mtd: nand: jz4740: use the mtd instance embedded in struct nand_chip
mtd: nand: lpc32xx: use the mtd instance embedded in struct nand_chip
mtd: nand: mpc5121: use the mtd instance embedded in struct nand_chip
mtd: nand: mxc: use the mtd instance embedded in struct nand_chip
mtd: nand: nandsim: use the mtd instance embedded in struct nand_chip
mtd: nand: ndfc: use the mtd instance embedded in struct nand_chip
mtd: nand: nuc900: use the mtd instance embedded in struct nand_chip
mtd: nand: omap2: use the mtd instance embedded in struct nand_chip
mtd: nand: orion: use the mtd instance embedded in struct nand_chip
mtd: nand: pasemi: use the mtd instance embedded in struct nand_chip
mtd: nand: plat: use the mtd instance embedded in struct nand_chip
mtd: nand: pxa3xx: use the mtd instance embedded in struct nand_chip
mtd: nand: r852: use the mtd instance embedded in struct nand_chip
mtd: nand: s3c2410: use the mtd instance embedded in struct nand_chip
mtd: nand: sh_flctl: use the mtd instance embedded in struct nand_chip
mtd: nand: sharpsl: use the mtd instance embedded in struct nand_chip
mtd: nand: socrates: use the mtd instance embedded in struct nand_chip
mtd: nand: sunxi: use the mtd instance embedded in struct nand_chip
mtd: nand: tmio: use the mtd instance embedded in struct nand_chip
mtd: nand: txx9ndfmc: use the mtd instance embedded in struct
nand_chip
mtd: nand: vf610: use the mtd instance embedded in struct nand_chip
mtd: nand: update the documentation to reflect framework changes
staging: mt29f_spinand: use the mtd instance embedded in struct
nand_chip
cris: nand: use the mtd instance embedded in struct nand_chip
mtd: nand: update mtd_to_nand()
mtd: nand: remove useless mtd->priv = chip assignments
cris: nand: remove useless mtd->priv = chip assignments
staging: mt29f_spinand: remove useless mtd->priv = chip assignment
mtd: nand: simplify nand_dt_init() usage
mtd: nand: kill the chip->flash_node field
mtd: nand: add helpers to access ->priv
ARM: make use of nand_set/get_controller_data() helpers
mtd: nand: make use of nand_set/get_controller_data() helpers
staging: mt29f_spinand: make use of nand_set/get_controller_data()
helpers
Documentation/DocBook/mtdnand.tmpl | 31 +++++----- arch/arm/mach-ixp4xx/ixdp425-setup.c | 4 +- arch/cris/arch-v32/drivers/mach-a3/nandflash.c | 6 +- arch/cris/arch-v32/drivers/mach-fs/nandflash.c | 6 +- drivers/mtd/nand/ams-delta.c | 22 +++---- drivers/mtd/nand/atmel_nand.c | 69 ++++++++++----------- drivers/mtd/nand/au1550nd.c | 18 +++--- drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h | 1 - drivers/mtd/nand/bcm47xxnflash/main.c | 9 +-- drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c | 18 +++--- drivers/mtd/nand/bf5xx_nand.c | 13 ++-- drivers/mtd/nand/brcmnand/brcmnand.c | 44 +++++++------ drivers/mtd/nand/cafe_nand.c | 35 ++++++----- drivers/mtd/nand/cmx270_nand.c | 14 ++--- drivers/mtd/nand/cs553x_nand.c | 18 +++--- drivers/mtd/nand/davinci_nand.c | 29 ++++----- drivers/mtd/nand/denali.c | 68 ++++++++++++--------- drivers/mtd/nand/denali.h | 1 - drivers/mtd/nand/diskonchip.c | 85 +++++++++++++------------- drivers/mtd/nand/docg4.c | 66 ++++++++++---------- drivers/mtd/nand/fsl_elbc_nand.c | 47 +++++++------- drivers/mtd/nand/fsl_ifc_nand.c | 53 ++++++++-------- drivers/mtd/nand/fsl_upm.c | 28 +++++---- drivers/mtd/nand/fsmc_nand.c | 54 ++++++++-------- drivers/mtd/nand/gpio.c | 20 +++--- drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 52 ++++++++-------- drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 1 - drivers/mtd/nand/hisi504_nand.c | 34 +++++------ drivers/mtd/nand/jz4740_nand.c | 10 ++- drivers/mtd/nand/lpc32xx_mlc.c | 27 ++++---- drivers/mtd/nand/lpc32xx_slc.c | 28 ++++----- drivers/mtd/nand/mpc5121_nfc.c | 28 ++++----- drivers/mtd/nand/mxc_nand.c | 42 ++++++------- drivers/mtd/nand/nand_base.c | 18 +++--- drivers/mtd/nand/nandsim.c | 17 +++--- drivers/mtd/nand/ndfc.c | 39 ++++++------ drivers/mtd/nand/nuc900_nand.c | 38 +++++------- drivers/mtd/nand/omap2.c | 68 ++++++++------------- drivers/mtd/nand/orion_nand.c | 9 ++- drivers/mtd/nand/pasemi_nand.c | 13 ++-- drivers/mtd/nand/plat_nand.c | 16 ++--- drivers/mtd/nand/pxa3xx_nand.c | 54 ++++++++-------- drivers/mtd/nand/r852.c | 39 ++++++------ drivers/mtd/nand/r852.h | 1 - drivers/mtd/nand/s3c2410.c | 25 ++++---- drivers/mtd/nand/sh_flctl.c | 9 ++- drivers/mtd/nand/sharpsl.c | 21 ++++--- drivers/mtd/nand/socrates_nand.c | 17 +++--- drivers/mtd/nand/sunxi_nand.c | 14 ++--- drivers/mtd/nand/tmio_nand.c | 11 ++-- drivers/mtd/nand/txx9ndfmc.c | 13 ++-- drivers/mtd/nand/vf610_nfc.c | 9 +-- drivers/staging/mt29f_spinand/mt29f_spinand.c | 15 ++--- include/linux/mtd/nand.h | 19 ++++-- include/linux/mtd/sh_flctl.h | 3 +- 56 files changed, 699 insertions(+), 752 deletions(-)
Signature · 1 line
2.1.4
PATCH v4 1/58 mtd: nand: denali: add missing nand_release() call in denali_remove()
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
--- drivers/mtd/nand/denali.c | 1 + 1 file changed, 1 insertion(+)
drivers/mtd/nand/denali.c +1 -0
@@ -1622,6 +1622,7 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); dma_unmap_single(denali->dev, denali->buf.dma_buf, denali->mtd.writesize + denali->mtd.oobsize,
Signature · 1 line
2.1.4
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+
Does this follow these rules, fromDocumentation/stable_kernel_rules.txt?
- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
Quoted 10 lines
Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")--- drivers/mtd/nand/denali.c | 1 + 1 file changed, 1 insertion(+)drivers/mtd/nand/denali.c +0
-0
drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1628
Quoted 7 lines
drivers/mtd/nand/denali.c +1
-0@@ -1622,6 +1622,7 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); dma_unmap_single(denali->dev, denali->buf.dma_buf, denali->mtd.writesize + denali->mtd.oobsize,
It feels a bit odd to allow usage of MTD fields after it has been unregistered. Maybe precompute this before the nand_release()?
Brian
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Hi Brian,
Quoted 9 lines · On Thu, 10 Dec 2015 16:40:08 -0800 Brian Norris <[email protected]>…
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+
Quoted 7 lines
Does this follow these rules, from
Documentation/stable_kernel_rules.txt?- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
As you wish, I'll remove those Cc and Fixes tags, or just drop the patch if you think it's useless...
I just noticed the bug while reworking this series, and thought it would be useful to fix it, but I honestly don't care if it's applied or not (I don't use this platform).
Quoted 6 lines
Quoted 6 lines
Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")--- drivers/mtd/nand/denali.c | 1 + 1 file changed, 1 insertion(+)
Quoted 15 lines
drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1628
Quoted 12 lines
drivers/mtd/nand/denali.c +1
-0@@ -1622,6 +1622,7 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); dma_unmap_single(denali->dev, denali->buf.dma_buf, denali->mtd.writesize + denali->mtd.oobsize,It feels a bit odd to allow usage of MTD fields after it has been unregistered. Maybe precompute this before the
nand_release()?
nand_realease() is not releasing the mtd instance or re-initialazing its field, so it should be safe, but I agree that pre-computing the DMA buffer size is more future-proof.
I'll fix that, send a v5 and let you decide whether it's needed or not.
Best Regards,
Boris
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Quoted 17 lines · Boris Brezillon
Hi Brian,
Quoted 12 lines · On Thu, 10 Dec 2015 16:40:08 -0800 Brian Norris <[email protected]>…
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+Does this follow these rules, from
Documentation/stable_kernel_rules.txt?
Quoted 7 lines
Quoted 4 lines
- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
As you wish, I'll remove those Cc and Fixes tags, or just drop the patch if you think it's useless...
The fixes tag is a separate thing from CCing stable. It's useful on by itself. I always put the person who wrote the original patch in the To:
header so they can review and comment if I have made a mistake.
regards,
dan carpenter
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Hi Dan,
Quoted 23 lines · On Fri, 11 Dec 2015 17:39:47 +0300 Dan Carpenter <[email protected]>…
Quoted 22 lines · Boris Brezillon
Hi Brian,
Quoted 16 lines · On Thu, 10 Dec 2015 16:40:08 -0800 Brian Norris <[email protected]>…
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+Does this follow these rules, from
Documentation/stable_kernel_rules.txt?- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
Quoted 6 lines
Quoted 2 lines
As you wish, I'll remove those Cc and Fixes tags, or just drop the patch if you think it's useless...
The fixes tag is a separate thing from CCing stable. It's useful on by itself. I always put the person who wrote the original patch in the To:
header so they can review and comment if I have made a mistake.
Noted. I added back the Fixes tag and added Dinh Nguyen (the commit author) in the loop.
Thanks,
Boris
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
In reply to Brian NorrisHi Brian,
Quoted 9 lines · On Thu, 10 Dec 2015 16:40:08 -0800 Brian Norris <[email protected]>…
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+
Quoted 7 lines
Does this follow these rules, from
Documentation/stable_kernel_rules.txt?- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
Sorry to bring the "stable or not stable (that is the question :-))" debate back, but after thinking a bit more about the implications of this missing nand_release() call, I think it is worth backporting the fix to all stable kernels.
The reason is, it can potentially introduce a security hole, because if the mtd device is not unregister but the underlying mtd object is freed and the kernel reuses the same memory region for a different object, the MTD layer will possibly call one of the mtd->_method() function, and this field might point to another completely different function.
You'll say that denali devices are probably never removed and this is the reason why people have never seen this problem before, which would be a good reason to not bother backporting the patch.
But, given that the driver can be compiled as a module (the user can possibly load/unload it, which will in turn create/destroy the NAND/MTD device), and that the denali controller can be exposed through a PCI bus (which, AFAIK is hotpluggable), I really think this fix should be sent to stable.
Best Regards,
Boris
Quoted 23 lines
Quoted 11 lines
Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")--- drivers/mtd/nand/denali.c | 1 + 1 file changed, 1 insertion(+)drivers/mtd/nand/denali.c +0
-0drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1628
Quoted 7 lines
drivers/mtd/nand/denali.c +1
-0@@ -1622,6 +1622,7 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); dma_unmap_single(denali->dev, denali->buf.dma_buf, denali->mtd.writesize + denali->mtd.oobsize,It feels a bit odd to allow usage of MTD fields after it has been unregistered. Maybe precompute this before the
nand_release()?Brian
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v4 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Hi Boris,
Quoted 29 lines · Boris Brezillon
Quoted 9 lines · On Thu, 10 Dec 2015 16:40:08 -0800 Brian Norris <[email protected]>…
Quoted 7 lines · Boris Brezillon
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Cc <[email protected]> #3.8+Quoted 7 lines
Does this follow these rules, from
Documentation/stable_kernel_rules.txt?- It must be obviously correct and tested.
- It must fix a real bug that bothers people (not a, "This could be a problem..." type thing).
Sorry to bring the "stable or not stable (that is the question :-))" debate back, but after thinking a bit more about the implications of this missing
nand_release()call, I think it is worth backporting the fix to all stable kernels.
The reason is, it can potentially introduce a security hole, because if the mtd device is not unregister but the underlying mtd object is freed and the kernel reuses the same memory region for a different object, the MTD layer will possibly call one of themtd->_method()function, and this field might point to another completely different function.
Quoted 8 lines
You'll say that denali devices are probably never removed and this is the reason why people have never seen this problem before, which would be a good reason to not bother backporting the patch.
But, given that the driver can be compiled as a module (the user can possibly load/unload it, which will in turn create/destroy the NAND/MTD device), and that the denali controller can be exposed through a PCI bus (which, AFAIK is hotpluggable), I really think this fix should be sent to stable.
That's all well and good, but still nobody has told me they've tested this.
I've pushed your v5 (+ comments, + ack) to l2-mtd.git. If it gets testing and this request is made again at that point, we can easily send it to stable after it hits Linus' tree. See option 2 in Documentation/stable_kernel_rules.txt. You can even send the email yourself, just CC me and anyone else relevant. I'll ack it if it's been tested.
Regards,
Brian
PATCH v5 1/58 mtd: nand: denali: add missing nand_release() call in denali_remove()
In reply to Boris BrezillonUnregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
---
Changes since v4:
- remove Cc stable and fixes tags
- calculate the dma buffer size before calling nand_release()
drivers/mtd/nand/denali.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mtd/nand/denali.c +4 -2
@@ -1622,9 +1622,11 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +int bufsize = denali->mtd.writesize + denali->mtd.oobsize; + +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); -dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, +dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL ); }EXPORT_SYMBOL (denali_remove);
Signature · 1 line
2.1.4
Re: [PATCH v5 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
+ Dinh (who made commit 2a0a288ec258)
Also added back the Fixes tag.
Quoted 6 lines · On Fri, 11 Dec 2015 15:02:34 +0100 Boris Brezillon…
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>
Quoted 26 lines
---
Changes since v4:
- remove Cc stable and fixes tags
- calculate the dma buffer size before callingnand_release()drivers/mtd/nand/denali.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/mtd/nand/denali.c +4
-2@@ -1622,9 +1622,11 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +int bufsize = denali->mtd.writesize + denali->mtd.oobsize; + +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); -dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, +dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL ); }EXPORT_SYMBOL (denali_remove);
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v5 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Hi Boris,
Quoted 24 lines · Boris Brezillon
+ Dinh (who made commit
2a0a288ec258)Also added back the Fixes tag.
Quoted 6 lines · On Fri, 11 Dec 2015 15:02:34 +0100 Boris Brezillon…
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")Quoted 8 lines
---
Changes since v4:
- remove Cc stable and fixes tags
- calculate the dma buffer size before callingnand_release()drivers/mtd/nand/denali.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
Quoted 16 lines
Quoted 6 lines
drivers/mtd/nand/denali.c +0
-0@@ -1622,9 +1622,11 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1630
Quoted 10 lines
drivers/mtd/nand/denali.c +4
-2void denali_remove (struct denali_nand_info *denali) { +int bufsize = denali->mtd.writesize + denali->mtd.oobsize; + +nand_release (&denali->mtd);denali_irq_cleanup (denali->irq, denali); -dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, +dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL );
Not sure what is the need to add bufsize here, but the commit message doesn't reflect the change.
Dinh
Re: [PATCH v5 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Hi Dinh,
Quoted 39 lines · On Fri, 11 Dec 2015 10:50:21 -0600 Dinh Nguyen <[email protected]> wrote:
Hi Boris,
Quoted 35 lines · Boris Brezillon
+ Dinh (who made commit
2a0a288ec258)Also added back the Fixes tag.
Quoted 6 lines · On Fri, 11 Dec 2015 15:02:34 +0100 Boris Brezillon…
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")Quoted 19 lines
---
Changes since v4:
- remove Cc stable and fixes tags
- calculate the dma buffer size before callingnand_release()drivers/mtd/nand/denali.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/mtd/nand/denali.c +3
-0@@ -1622,9 +1622,11 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +int bufsize = denali->mtd.writesize + denali->mtd.oobsize; + +nand_release (&denali->mtd);
Quoted 8 lines
Quoted 5 lines
drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1630
Quoted 5 lines
drivers/mtd/nand/denali.c +1
-2denali_irq_cleanup (denali->irq, denali); -dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, +dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL );Not sure what is the need to add bufsize here, but the commit message doesn't reflect the change.
You were not in Cc of the first version (my fault), but Brian pointed that the mtd fields could be in an unknown state after the nand_release() call (this is currently not the case, but it change in the future). The idea is to pre-compute the DMA buffer size before releasing the mtd/nand device to prevent any future issues.
I don't think it is worth mentioning this in the commit message, because these are just implementation details, but I can add the following comment before the bufsize declaration:
/*
* Pre-compute DMA buffer size to avoid any problems in case
* nand_release() ever changes in a way that mtd->writesize and
* mtd->oobsize are not reliable after this call.
*/
What do you think?
Best Regards,
Boris
Quoted 2 lines
Dinh
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Dinh Nguyen
Acked-byRe: [PATCH v5 01/58] mtd: nand: denali: add missing nand_release() call in denali_remove()
Quoted 63 lines · Boris Brezillon
Hi Dinh,
Quoted 39 lines · On Fri, 11 Dec 2015 10:50:21 -0600 Dinh Nguyen <[email protected]> wrote:
Hi Boris,
Quoted 35 lines · Boris Brezillon
+ Dinh (who made commit
2a0a288ec258)Also added back the Fixes tag.
Quoted 6 lines · On Fri, 11 Dec 2015 15:02:34 +0100 Boris Brezillon…
Unregister the NAND device from the NAND subsystem when removing a denali NAND controller, otherwise the MTD attached to the NAND device is still exposed by the MTD layer, and accesses to this device will likely crash the system.
Signed-off-by Boris Brezillon <[email protected]>Fixes 2a0a288ec258 ("mtd: denali: split the generic driver and PCI layer")Quoted 19 lines
---
Changes since v4:
- remove Cc stable and fixes tags
- calculate the dma buffer size before callingnand_release()drivers/mtd/nand/denali.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/mtd/nand/denali.c +3
-0@@ -1622,9 +1622,11 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { +int bufsize = denali->mtd.writesize + denali->mtd.oobsize; + +nand_release (&denali->mtd);Quoted 8 lines
Quoted 5 lines
drivers/mtd/nand/denali.c EXPORT_SYMBOL(denali_init); · line 1630
Quoted 5 lines
drivers/mtd/nand/denali.c +1
-2denali_irq_cleanup (denali->irq, denali); -dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, +dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL );Not sure what is the need to add bufsize here, but the commit message doesn't reflect the change.
You were not in Cc of the first version (my fault), but Brian pointed that the mtd fields could be in an unknown state after the
nand_release()call (this is currently not the case, but it change in the future). The idea is to pre-compute the DMA buffer size before releasing the mtd/nand device to prevent any future issues.I don't think it is worth mentioning this in the commit message, because these are just implementation details, but I can add the following comment before the bufsize declaration:
Quoted 8 lines
/*
* Pre-compute DMA buffer size to avoid any problems in case
*nand_release()ever changes in a way thatmtd->writesizeand
*mtd->oobsizeare not reliable after this call.
*/What do you think?
Ah, perfect! With the updated comment,
Thanks,
Dinh
PATCH v4 2/58 mtd: nand: fsmc: create and use mtd_to_fsmc()
In reply to Boris BrezillonCreate and use mtd_to_fsmc() to avoid duplication of container_of(mtd, struct fsmc_nand_data, mtd) calls.
--- drivers/mtd/nand/fsmc_nand.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-)
drivers/mtd/nand/fsmc_nand.c +14 -17
@@ -326,13 +326,18 @@ struct fsmc_nand_data {void (*select_chip)(uint32_t bank,uint32_t busw); }; +static inline struct fsmc_nand_data *mtd_to_fsmc (struct mtd_info *mtd) +{ + return container_of(mtd, struct fsmc_nand_data, mtd); +} +/* Assert CS signal based on chipnr */ static void fsmc_select_chip (struct mtd_info *mtd,int chipnr) {struct nand_chip *chip =mtd_to_nand (mtd);struct fsmc_nand_data *host; - host = container_of(mtd, struct fsmc_nand_data, mtd); + host =mtd_to_fsmc (mtd);switch (chipnr) {case -1 :
@@ -359,8 +364,7 @@ static void fsmc_select_chip(struct mtd_info *mtd, int chipnr)static void fsmc_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *this =mtd_to_nand (mtd); -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);void __iomem *regs = host->regs_va;unsigned int bank = host->bank;
@@ -445,8 +449,7 @@ static void fsmc_nand_setup(void __iomem *regs, uint32_t bank,*/ static void fsmc_enable_hwecc (struct mtd_info *mtd,int mode) { -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);void __iomem *regs = host->regs_va;uint32_t bank = host->bank;
@@ -466,8 +469,7 @@ static void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)static int fsmc_read_hwecc_ecc4 (struct mtd_info *mtd,const uint8_t *data,uint8_t *ecc) { -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);void __iomem *regs = host->regs_va;uint32_t bank = host->bank;uint32_t ecc_tmp;
@@ -517,8 +519,7 @@ static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data,static int fsmc_read_hwecc_ecc1 (struct mtd_info *mtd,const uint8_t *data,uint8_t *ecc) { -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);void __iomem *regs = host->regs_va;uint32_t bank = host->bank;uint32_t ecc_tmp;
@@ -674,9 +675,8 @@ static void fsmc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)*/ static void fsmc_read_buf_dma (struct mtd_info *mtd,uint8_t *buf,int len) { -struct fsmc_nand_data *host; +struct fsmc_nand_data *host =mtd_to_fsmc (mtd); - host = container_of(mtd, struct fsmc_nand_data, mtd);dma_xfer (host, buf, len,DMA_FROM_DEVICE ); }
@@ -689,9 +689,8 @@ static void fsmc_read_buf_dma(struct mtd_info *mtd, uint8_t *buf, int len)static void fsmc_write_buf_dma (struct mtd_info *mtd,const uint8_t *buf,int len) { -struct fsmc_nand_data *host; +struct fsmc_nand_data *host =mtd_to_fsmc (mtd); - host = container_of(mtd, struct fsmc_nand_data, mtd);dma_xfer (host, (void *)buf, len,DMA_TO_DEVICE ); }
@@ -712,8 +711,7 @@ static void fsmc_write_buf_dma(struct mtd_info *mtd, const uint8_t *buf,static int fsmc_read_page_hwecc (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);struct fsmc_eccplace *ecc_place = host->ecc_place;int i, j, s, stat, eccsize = chip->ecc.size;int eccbytes = chip->ecc.bytes;
@@ -782,9 +780,8 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,static int fsmc_bch8_correct_data (struct mtd_info *mtd,uint8_t *dat,uint8_t *read_ecc,uint8_t *calc_ecc) { -struct fsmc_nand_data *host =container_of (mtd, - struct fsmc_nand_data, mtd);struct nand_chip *chip =mtd_to_nand (mtd); +struct fsmc_nand_data *host =mtd_to_fsmc (mtd);void __iomem *regs = host->regs_va;unsigned int bank = host->bank;uint32_t err_idx[8 ];
Signature · 1 line
2.1.4
PATCH v4 3/58 mtd: nand: nuc900: create and use mtd_to_nuc900()
In reply to Boris BrezillonCreate and use mtd_to_nuc900() instead of direct container_of() calls.
--- drivers/mtd/nand/nuc900_nand.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-)
drivers/mtd/nand/nuc900_nand.c +10 -15
@@ -62,6 +62,11 @@ struct nuc900_nand {spinlock_t lock; }; +static inline struct nuc900_nand *mtd_to_nuc900 (struct mtd_info *mtd) +{ + return container_of(mtd, struct nuc900_nand, mtd); +} +static const struct mtd_partition partitions[] = { { .name ="NAND FS 0" ,
@@ -78,9 +83,7 @@ static const struct mtd_partition partitions[] = {static unsigned char nuc900_nand_read_byte (struct mtd_info *mtd) {unsigned char ret; -struct nuc900_nand *nand; - - nand = container_of(mtd, struct nuc900_nand, mtd); +struct nuc900_nand *nand =mtd_to_nuc900 (mtd); ret = (unsigned char )read_data_reg (nand);
@@ -91,9 +94,7 @@ static void nuc900_nand_read_buf(struct mtd_info *mtd, unsigned char *buf, int len) { int i; -struct nuc900_nand *nand; - - nand = container_of(mtd, struct nuc900_nand, mtd); +struct nuc900_nand *nand =mtd_to_nuc900 (mtd);for (i =0 ; i < len; i++) buf[i] = (unsigned char )read_data_reg (nand);
@@ -103,9 +104,7 @@ static void nuc900_nand_write_buf(struct mtd_info *mtd, const unsigned char *buf, int len) { int i; -struct nuc900_nand *nand; - - nand = container_of(mtd, struct nuc900_nand, mtd); +struct nuc900_nand *nand =mtd_to_nuc900 (mtd);for (i =0 ; i < len; i++)write_data_reg (nand, buf[i]);
@@ -124,11 +123,9 @@ static int nuc900_check_rb(struct nuc900_nand *nand)static int nuc900_nand_devready (struct mtd_info *mtd) { -struct nuc900_nand *nand; +struct nuc900_nand *nand =mtd_to_nuc900 (mtd);int ready; - nand = container_of(mtd, struct nuc900_nand, mtd); - ready = (nuc900_check_rb (nand)) ?1 :0 ;return ready; }
@@ -137,9 +134,7 @@ static void nuc900_nand_command_lp(struct mtd_info *mtd, unsigned int command, int column, int page_addr) { registerstruct nand_chip *chip =mtd_to_nand (mtd); -struct nuc900_nand *nand; - - nand = container_of(mtd, struct nuc900_nand, mtd); +struct nuc900_nand *nand =mtd_to_nuc900 (mtd);if (command ==NAND_CMD_READOOB ) { column += mtd->writesize;
Signature · 1 line
2.1.4
PATCH v4 4/58 mtd: nand: omap2: create and use mtd_to_omap()
In reply to Boris BrezillonDefine and use mtd_to_omap() instead of container_of();
--- drivers/mtd/nand/omap2.c | 55 ++++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 34 deletions(-)
drivers/mtd/nand/omap2.c +21 -34
@@ -177,6 +177,10 @@ struct omap_nand_info {struct device_node *of_node; }; +static inline struct omap_nand_info *mtd_to_omap (struct mtd_info *mtd) +{ + return container_of(mtd, struct omap_nand_info, mtd); +}/** * omap_prefetch_enable - configures and starts prefetch transfer * @cs: cs (chip select) number
@@ -247,8 +251,7 @@ static int omap_prefetch_reset(int cs, struct omap_nand_info *info)*/ static void omap_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);if (cmd !=NAND_CMD_NONE ) {if (ctrl &NAND_CLE )
@@ -283,8 +286,7 @@ static void omap_read_buf8(struct mtd_info *mtd, u_char *buf, int len)*/ static void omap_write_buf8 (struct mtd_info *mtd,const u_char *buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);u_char *p = (u_char *)buf;u32 status =0 ;
@@ -319,8 +321,7 @@ static void omap_read_buf16(struct mtd_info *mtd, u_char *buf, int len)*/ static void omap_write_buf16 (struct mtd_info *mtd,const u_char * buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);u16 *p = (u16 *) buf;u32 status =0 ;/* FIXME try bursts of writesw() or DMA ... */
@@ -344,8 +345,7 @@ static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len)*/ static void omap_read_buf_pref (struct mtd_info *mtd,u_char *buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);uint32_t r_count =0 ;int ret =0 ;u32 *p = (u32 *)buf;
@@ -392,8 +392,7 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)static void omap_write_buf_pref (struct mtd_info *mtd,const u_char *buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);uint32_t w_count =0 ;int i =0 , ret =0 ;u16 *p = (u16 *)buf;
@@ -458,8 +457,7 @@ static void omap_nand_dma_callback(void *data)static inline int omap_nand_dma_transfer (struct mtd_info *mtd,void *addr,unsigned int len,int is_write) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);struct dma_async_tx_descriptor *tx;enum dma_data_direction dir = is_write ?DMA_TO_DEVICE :DMA_FROM_DEVICE ;
@@ -623,8 +621,7 @@ done:*/ static void omap_read_buf_irq_pref (struct mtd_info *mtd,u_char *buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);int ret =0 ;if (len <= mtd->oobsize) {
@@ -671,8 +668,7 @@ out_copy:static void omap_write_buf_irq_pref (struct mtd_info *mtd,const u_char *buf,int len) { -struct omap_nand_info *info =container_of (mtd, - struct omap_nand_info, mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);int ret =0 ;unsigned long tim, limit;u32 val;
@@ -886,8 +882,7 @@ static int omap_compare_ecc(u8 *ecc_data1, /* read from NAND memory */static int omap_correct_data (struct mtd_info *mtd,u_char *dat,u_char *read_ecc,u_char *calc_ecc) { - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);int blockCnt =0 , i =0 , ret =0 ;int stat =0 ;
@@ -928,8 +923,7 @@ static int omap_correct_data(struct mtd_info *mtd, u_char *dat,static int omap_calculate_ecc (struct mtd_info *mtd,const u_char *dat,u_char *ecc_code) { - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);u32 val; val =readl (info->reg.gpmc_ecc_config);
@@ -953,8 +947,7 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat,*/ static void omap_enable_hwecc (struct mtd_info *mtd,int mode) { - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);struct nand_chip *chip =mtd_to_nand (mtd);unsigned int dev_width = (chip->options &NAND_BUSWIDTH_16 ) ?1 :0 ;u32 val;
@@ -1002,8 +995,7 @@ static void omap_enable_hwecc(struct mtd_info *mtd, int mode)static int omap_wait (struct mtd_info *mtd,struct nand_chip *chip) {struct nand_chip *this =mtd_to_nand (mtd); - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);unsigned long timeo = jiffies;int status, state = this->state;
@@ -1031,8 +1023,7 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)static int omap_dev_ready (struct mtd_info *mtd) {unsigned int val =0 ; - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd); val =readl (info->reg.gpmc_status);
@@ -1058,8 +1049,7 @@ static void __maybe_unused omap_enable_hwecc_bch(struct mtd_info *mtd, int mode) {unsigned int bch_type;unsigned int dev_width, nsectors; - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);enum omap_ecc ecc_opt = info->ecc_opt;struct nand_chip *chip =mtd_to_nand (mtd);u32 val, wr_mode;
@@ -1162,8 +1152,7 @@ static u8 bch8_polynomial[] = {0xef, 0x51, 0x2e, 0x09, 0xed, 0x93, 0x9a, 0xc2,static int __maybe_unused omap_calculate_ecc_bch (struct mtd_info *mtd,const u_char *dat,u_char *ecc_calc) { - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);int eccbytes = info->nand.ecc.bytes;struct gpmc_nand_regs *gpmc_regs = &info->reg;u8 *ecc_code;
@@ -1334,8 +1323,7 @@ static int erased_sector_bitflips(u_char *data, u_char *oob,static int omap_elm_correct_data (struct mtd_info *mtd,u_char *data,u_char *read_ecc,u_char *calc_ecc) { - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);struct nand_ecc_ctrl *ecc = &info->nand.ecc;int eccsteps = info->nand.ecc.steps;int i , j, stat =0 ;
@@ -2057,8 +2045,7 @@ static int omap_nand_remove(struct platform_device *pdev) {struct mtd_info *mtd =platform_get_drvdata (pdev);struct nand_chip *nand_chip =mtd_to_nand (mtd); - struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, - mtd); +struct omap_nand_info *info =mtd_to_omap (mtd);if (nand_chip->ecc.priv) {nand_bch_free (nand_chip->ecc.priv); nand_chip->ecc.priv =NULL ;
Signature · 1 line
2.1.4
PATCH v4 5/58 mtd: nand: ams-delta: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance instead of allocating our own.
--- drivers/mtd/nand/ams-delta.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/mtd/nand/ams-delta.c +5 -8
@@ -183,19 +183,16 @@ static int ams_delta_init(struct platform_device *pdev)return -ENXIO ;/* Allocate memory for MTD device structure and private data */ - ams_delta_mtd =kzalloc (sizeof (struct mtd_info ) + -sizeof (struct nand_chip ),GFP_KERNEL ); -if (!ams_delta_mtd) { + this =kzalloc (sizeof (struct nand_chip ),GFP_KERNEL ); +if (!this) {printk (KERN_WARNING "Unable to allocate E3 NAND MTD device structure.\n" ); err = -ENOMEM ; goto out; } + ams_delta_mtd =nand_to_mtd (this); ams_delta_mtd->owner =THIS_MODULE ; -/* Get pointer to private data */ - this = (struct nand_chip *) (&ams_delta_mtd[1 ]); -/* Link the private data with the MTD structure */ ams_delta_mtd->priv = this;
@@ -256,7 +253,7 @@ out_gpio:gpio_free (AMS_DELTA_GPIO_PIN_NAND_RB );iounmap (io_base); out_free: -kfree (ams_delta_mtd); +kfree (this); out:return err; }
@@ -276,7 +273,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)iounmap (io_base);/* Free the MTD device structure */ -kfree (ams_delta_mtd); +kfree (mtd_to_nand (ams_delta_mtd));return 0 ; }
Signature · 1 line
2.1.4
PATCH v4 6/58 mtd: nand: atmel: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/atmel_nand.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/mtd/nand/atmel_nand.c +7 -6
@@ -116,7 +116,6 @@ static struct atmel_nfc nand_nfc;struct atmel_nand_host {struct nand_chip nand_chip; -struct mtd_info mtd;void __iomem *io_base;dma_addr_t io_phys;struct atmel_nand_data board;
@@ -317,8 +316,10 @@ static int nfc_set_sram_bank(struct atmel_nand_host *host, unsigned int bank)return -EINVAL ;if (bank) { +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip); +/* Only for a 2k-page or lower flash, NFC can handle 2 banks */ -if (host->mtd.writesize >2048 ) +if (mtd->writesize >2048 )return -EINVAL ;nfc_writel (host->nfc->hsmc_regs,BANK ,ATMEL_HSMC_NFC_BANK1 ); }else {
@@ -1159,8 +1160,8 @@ static uint16_t *create_lookup_table(struct device *dev, int sector_size)static int atmel_pmecc_nand_init_params (struct platform_device *pdev,struct atmel_nand_host *host) { -struct mtd_info *mtd = &host->mtd;struct nand_chip *nand_chip = &host->nand_chip; +struct mtd_info *mtd =nand_to_mtd (nand_chip);struct resource *regs, *regs_pmerr, *regs_rom;uint16_t *galois_table;int cap, sector_size, err_no;
@@ -1586,8 +1587,8 @@ static int atmel_of_init_port(struct atmel_nand_host *host,static int atmel_hw_nand_init_params (struct platform_device *pdev,struct atmel_nand_host *host) { -struct mtd_info *mtd = &host->mtd;struct nand_chip *nand_chip = &host->nand_chip; +struct mtd_info *mtd =nand_to_mtd (nand_chip);struct resource *regs; regs =platform_get_resource (pdev,IORESOURCE_MEM ,1 );
@@ -2112,8 +2113,8 @@ static int atmel_nand_probe(struct platform_device *pdev) } host->io_phys = (dma_addr_t )mem->start; - mtd = &host->mtd; nand_chip = &host->nand_chip; + mtd =nand_to_mtd (nand_chip); host->dev = &pdev->dev;if (IS_ENABLED (CONFIG_OF ) && pdev->dev.of_node) {nand_set_flash_node (nand_chip, pdev->dev.of_node);
@@ -2283,7 +2284,7 @@ err_nand_ioremap:static int atmel_nand_remove (struct platform_device *pdev) {struct atmel_nand_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);nand_release (mtd);
Signature · 1 line
2.1.4
PATCH v4 7/58 mtd: nand: au1550nd: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/au1550nd.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/mtd/nand/au1550nd.c +11 -8
@@ -23,7 +23,6 @@struct au1550nd_ctx { -struct mtd_info info;struct nand_chip chip;int cs;
@@ -197,8 +196,9 @@ static void au_read_buf16(struct mtd_info *mtd, u_char *buf, int len)static void au1550_hwcontrol (struct mtd_info *mtd,int cmd) { - struct au1550nd_ctx *ctx = container_of(mtd, struct au1550nd_ctx, info);struct nand_chip *this =mtd_to_nand (mtd); + struct au1550nd_ctx *ctx = container_of(this, struct au1550nd_ctx, + chip);switch (cmd) {
@@ -267,8 +267,9 @@ static void au1550_select_chip(struct mtd_info *mtd, int chip)*/ static void au1550_command (struct mtd_info *mtd,unsigned command,int column,int page_addr) { - struct au1550nd_ctx *ctx = container_of(mtd, struct au1550nd_ctx, info);struct nand_chip *this =mtd_to_nand (mtd); + struct au1550nd_ctx *ctx = container_of(this, struct au1550nd_ctx, + chip);int ce_override =0 , i;unsigned long flags =0 ;
@@ -405,6 +406,7 @@ static int au1550nd_probe(struct platform_device *pdev)struct au1550nd_platdata *pd;struct au1550nd_ctx *ctx;struct nand_chip *this; +struct mtd_info *mtd;struct resource *r;int ret, cs;
@@ -438,8 +440,9 @@ static int au1550nd_probe(struct platform_device *pdev) } this = &ctx->chip; - ctx->info.priv = this; - ctx->info.dev.parent = &pdev->dev; + mtd =nand_to_mtd (this); + mtd->priv = this; + mtd->dev.parent = &pdev->dev;/* figure out which CS# r->start belongs to */ cs =find_nand_cs (r->start);
@@ -467,13 +470,13 @@ static int au1550nd_probe(struct platform_device *pdev) this->write_buf = (pd->devwidth) ? au_write_buf16 : au_write_buf; this->read_buf = (pd->devwidth) ? au_read_buf16 : au_read_buf; - ret =nand_scan (&ctx->info,1 ); + ret =nand_scan (mtd,1 );if (ret) {dev_err (&pdev->dev,"NAND scan failed with %d\n" , ret); goto out3; } -mtd_device_register (&ctx->info, pd->parts, pd->num_parts); +mtd_device_register (mtd, pd->parts, pd->num_parts);platform_set_drvdata (pdev, ctx);
@@ -493,7 +496,7 @@ static int au1550nd_remove(struct platform_device *pdev)struct au1550nd_ctx *ctx =platform_get_drvdata (pdev);struct resource *r =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -nand_release (&ctx->info); +nand_release (nand_to_mtd (&ctx->chip));iounmap (ctx->base);release_mem_region (r->start,0x1000 );kfree (ctx);
Signature · 1 line
2.1.4
PATCH v4 8/58 mtd: nand: bcm47xx: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h | 1 - drivers/mtd/nand/bcm47xxnflash/main.c | 8 +++++--- drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-)
drivers/mtd/nand/bcm47xxnflash/bcm47xxnflash.h +0 -1
@@ -12,7 +12,6 @@ struct bcm47xxnflash {struct bcma_drv_cc *cc;struct nand_chip nand_chip; -struct mtd_info mtd;unsigned curr_command;int curr_page_addr;
drivers/mtd/nand/bcm47xxnflash/main.c +5 -3
@@ -27,6 +27,7 @@ static int bcm47xxnflash_probe(struct platform_device *pdev) {struct bcma_nflash *nflash =dev_get_platdata (&pdev->dev);struct bcm47xxnflash *b47n; +struct mtd_info *mtd;int err =0 ; b47n =devm_kzalloc (&pdev->dev,sizeof (*b47n),GFP_KERNEL );
@@ -34,8 +35,9 @@ static int bcm47xxnflash_probe(struct platform_device *pdev)return -ENOMEM ; b47n->nand_chip.priv = b47n; - b47n->mtd.dev.parent = &pdev->dev; - b47n->mtd.priv = &b47n->nand_chip;/* Required */ + mtd =nand_to_mtd (&b47n->nand_chip); + mtd->dev.parent = &pdev->dev; + mtd->priv = &b47n->nand_chip;/* Required */ b47n->cc = container_of(nflash, struct bcma_drv_cc, nflash);if (b47n->cc->core->bus->chipinfo.id ==BCMA_CHIP_ID_BCM4706 ) {
@@ -49,7 +51,7 @@ static int bcm47xxnflash_probe(struct platform_device *pdev)return err; } - err =mtd_device_parse_register (&b47n->mtd, probes,NULL ,NULL ,0 ); + err =mtd_device_parse_register (mtd, probes,NULL ,NULL ,0 );if (err) {pr_err ("Failed to register MTD device: %d\n" , err);return err;
drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c +1 -1
@@ -421,7 +421,7 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n) (w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));/* Scan NAND */ - err =nand_scan (&b47n->mtd,1 ); + err =nand_scan (nand_to_mtd (&b47n->nand_chip),1 );if (err) {pr_err ("Could not scan NAND flash: %d\n" , err); goto exit;
Signature · 1 line
2.1.4
PATCH v4 9/58 mtd: nand: bf5xx: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/bf5xx_nand.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/mtd/nand/bf5xx_nand.c +6 -6
@@ -142,7 +142,6 @@ static struct nand_ecclayout bootrom_ecclayout = {struct bf5xx_nand_info {/* mtd info */ struct nand_hw_control controller; -struct mtd_info mtd;struct nand_chip chip;/* platform info */
@@ -160,7 +159,8 @@ struct bf5xx_nand_info {*/ static struct bf5xx_nand_info *mtd_to_nand_info (struct mtd_info *mtd) { - return container_of(mtd, struct bf5xx_nand_info, mtd); + return container_of(mtd_to_nand(mtd), struct bf5xx_nand_info, + chip); }static struct bf5xx_nand_info *to_nand_info (struct platform_device *pdev)
@@ -660,7 +660,7 @@ static int bf5xx_nand_hw_init(struct bf5xx_nand_info *info)*/ static int bf5xx_nand_add_partition (struct bf5xx_nand_info *info) { -struct mtd_info *mtd = &info->mtd; +struct mtd_info *mtd =nand_to_mtd (&info->chip);struct mtd_partition *parts = info->platform->partitions;int nr = info->platform->nr_partitions;
@@ -675,7 +675,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev)* and their partitions, then go through freeing the * resources used */ -nand_release (&info->mtd); +nand_release (nand_to_mtd (&info->chip));peripheral_free_list (bfin_nfc_pin_req);bf5xx_nand_dma_remove (info);
@@ -756,6 +756,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev)/* initialise chip data struct */ chip = &info->chip; + mtd =nand_to_mtd (&info->chip);if (plat->data_width) chip->options |=NAND_BUSWIDTH_16 ;
@@ -772,7 +773,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev) chip->cmd_ctrl = bf5xx_nand_hwcontrol; chip->dev_ready = bf5xx_nand_devready; - chip->priv = &info->mtd; + chip->priv = mtd; chip->controller = &info->controller; chip->IO_ADDR_R = (void __iomem *)NFC_READ ;
@@ -781,7 +782,6 @@ static int bf5xx_nand_probe(struct platform_device *pdev) chip->chip_delay =0 ;/* initialise mtd info data struct */ - mtd = &info->mtd; mtd->priv = chip; mtd->dev.parent = &pdev->dev;
Signature · 1 line
2.1.4
PATCH v4 10/58 mtd: nand: brcm: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/brcmnand/brcmnand.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/mtd/nand/brcmnand/brcmnand.c +6 -7
@@ -178,7 +178,6 @@ struct brcmnand_host {struct list_head node;struct nand_chip chip; -struct mtd_info mtd;struct platform_device *pdev;int cs;
@@ -1074,7 +1073,7 @@ static int brcmnand_low_level_op(struct brcmnand_host *host, enum brcmnand_llop_type type, u32 data, bool last_op) { - struct mtd_info *mtd = &host->mtd; + struct mtd_info *mtd = nand_to_mtd(&host->chip);struct nand_chip *chip = &host->chip;struct brcmnand_controller *ctrl = host->ctrl;u32 tmp;
@@ -1802,7 +1801,7 @@ static inline int get_blk_adr_bytes(u64 size, u32 writesize)static int brcmnand_setup_dev (struct brcmnand_host *host) { -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->chip);struct nand_chip *chip = &host->chip;struct brcmnand_controller *ctrl = host->ctrl;struct brcmnand_cfg *cfg = &host->hwcfg;
@@ -1916,7 +1915,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)return -ENXIO ; } - mtd = &host->mtd; + mtd =nand_to_mtd (&host->chip); chip = &host->chip;nand_set_flash_node (chip, dn);
@@ -2060,8 +2059,8 @@ static int brcmnand_resume(struct device *dev) }list_for_each_entry (host, &ctrl->host_list, node) { -struct mtd_info *mtd = &host->mtd; -struct nand_chip *chip =mtd_to_nand (mtd); +struct nand_chip *chip = &host->chip; +struct mtd_info *mtd =nand_to_mtd (chip);brcmnand_save_restore_cs_config (host,1 );
@@ -2262,7 +2261,7 @@ int brcmnand_remove(struct platform_device *pdev)struct brcmnand_host *host;list_for_each_entry (host, &ctrl->host_list, node) -nand_release (&host->mtd); +nand_release (nand_to_mtd (&host->chip));dev_set_drvdata (&pdev->dev,NULL );
Signature · 1 line
2.1.4
PATCH v4 11/58 mtd: nand: cafe: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/cafe_nand.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/mtd/nand/cafe_nand.c +5 -5
@@ -605,11 +605,11 @@ static int cafe_nand_probe(struct pci_dev *pdev,pci_set_master (pdev); - mtd =kzalloc (sizeof (*mtd) +sizeof (struct cafe_priv ),GFP_KERNEL ); -if (!mtd) + cafe =kzalloc (sizeof (*cafe),GFP_KERNEL ); +if (!cafe)return -ENOMEM ; - cafe = (void *)(&mtd[1 ]); + mtd =nand_to_mtd (&cafe->nand); mtd->dev.parent = &pdev->dev; mtd->priv = &cafe->nand; cafe->nand.priv = cafe;
@@ -792,7 +792,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, out_ior:pci_iounmap (pdev, cafe->mmio); out_free_mtd: -kfree (mtd); +kfree (cafe); out:return err; }
@@ -813,7 +813,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)2112 +sizeof (struct nand_buffers ) + mtd->writesize + mtd->oobsize, cafe->dmabuf, cafe->dmaaddr); -kfree (mtd); +kfree (cafe); }static const struct pci_device_id cafe_nand_tbl[] = {
Signature · 1 line
2.1.4
PATCH v4 12/58 mtd: nand: cmx270: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/cmx270_nand.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/mtd/nand/cmx270_nand.c +5 -8
@@ -160,10 +160,8 @@ static int __init cmx270_init(void)gpio_direction_input (GPIO_NAND_RB );/* Allocate memory for MTD device structure and private data */ - cmx270_nand_mtd =kzalloc (sizeof (struct mtd_info ) + -sizeof (struct nand_chip ), -GFP_KERNEL ); -if (!cmx270_nand_mtd) { + this =kzalloc (sizeof (struct nand_chip ),GFP_KERNEL ); +if (!this) { ret = -ENOMEM ; goto err_kzalloc; }
@@ -175,8 +173,7 @@ static int __init cmx270_init(void) goto err_ioremap; } -/* Get pointer to private data */ - this = (struct nand_chip *)(&cmx270_nand_mtd[1 ]); + cmx270_nand_mtd =nand_to_mtd (this);/* Link the private data with the MTD structure */ cmx270_nand_mtd->owner =THIS_MODULE ;
@@ -216,7 +213,7 @@ static int __init cmx270_init(void) err_scan:iounmap (cmx270_nand_io); err_ioremap: -kfree (cmx270_nand_mtd); +kfree (this); err_kzalloc:gpio_free (GPIO_NAND_RB ); err_gpio_request:
@@ -241,7 +238,7 @@ static void __exit cmx270_cleanup(void)iounmap (cmx270_nand_io);/* Free the MTD device structure */ -kfree (cmx270_nand_mtd); +kfree (mtd_to_nand (cmx270_nand_mtd)); }module_exit (cmx270_cleanup);
Signature · 1 line
2.1.4
PATCH v4 13/58 mtd: nand: cs553x: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/cs553x_nand.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/mtd/nand/cs553x_nand.c +8 -9
@@ -197,14 +197,13 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) }/* Allocate memory for MTD device structure and private data */ - new_mtd =kzalloc (sizeof (struct mtd_info ) +sizeof (struct nand_chip ),GFP_KERNEL ); -if (!new_mtd) { + this =kzalloc (sizeof (struct nand_chip ),GFP_KERNEL ); +if (!this) { err = -ENOMEM ; goto out; } -/* Get pointer to private data */ - this = (struct nand_chip *)(&new_mtd[1 ]); + new_mtd =nand_to_mtd (this);/* Link the private data with the MTD structure */ new_mtd->priv = this;
@@ -257,7 +256,7 @@ out_free: out_ior:iounmap (this->IO_ADDR_R); out_mtd: -kfree (new_mtd); +kfree (this); out:return err; }
@@ -337,19 +336,19 @@ static void __exit cs553x_cleanup(void)if (!mtd)continue ; - this =mtd_to_nand (cs553x_mtd[i]); + this =mtd_to_nand (mtd); mmio_base = this->IO_ADDR_R;/* Release resources, unregister device */ -nand_release (cs553x_mtd[i]); -kfree (cs553x_mtd[i]->name); +nand_release (mtd); +kfree (mtd->name); cs553x_mtd[i] =NULL ;/* unmap physical address */ iounmap (mmio_base);/* Free the MTD device structure */ -kfree (mtd); +kfree (this); } }
Signature · 1 line
2.1.4
PATCH v4 14/58 mtd: nand: davinci: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/davinci_nand.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-)
drivers/mtd/nand/davinci_nand.c +16 -14
@@ -53,7 +53,6 @@* outputs in a "wire-AND" configuration, with no per-chip signals. */ struct davinci_nand_info { -struct mtd_info mtd;struct nand_chip chip;struct nand_ecclayout ecclayout;
@@ -80,8 +79,10 @@ struct davinci_nand_info {static DEFINE_SPINLOCK (davinci_nand_lock);static bool ecc4_busy; -#define to_davinci_nand (m) container_of(m, struct davinci_nand_info, mtd) - +static inline struct davinci_nand_info *to_davinci_nand (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct davinci_nand_info, chip); +}static inline unsigned int davinci_nand_readl (struct davinci_nand_info *info,int offset)
@@ -636,6 +637,7 @@ static int nand_davinci_probe(struct platform_device *pdev)int ret;uint32_t val;nand_ecc_modes_t ecc_mode; +struct mtd_info *mtd; pdata =nand_davinci_get_pdata (pdev);if (IS_ERR (pdata))
@@ -682,8 +684,9 @@ static int nand_davinci_probe(struct platform_device *pdev) info->base = base; info->vaddr = vaddr; - info->mtd.priv = &info->chip; - info->mtd.dev.parent = &pdev->dev; + mtd =nand_to_mtd (&info->chip); + mtd->priv = &info->chip; + mtd->dev.parent = &pdev->dev;nand_set_flash_node (&info->chip, pdev->dev.of_node); info->chip.IO_ADDR_R = vaddr;
@@ -785,7 +788,7 @@ static int nand_davinci_probe(struct platform_device *pdev)spin_unlock_irq (&davinci_nand_lock);/* Scan to find existence of the device(s) */ - ret =nand_scan_ident (&info->mtd, pdata->mask_chipsel ?2 :1 ,NULL ); + ret =nand_scan_ident (mtd, pdata->mask_chipsel ?2 :1 ,NULL );if (ret <0 ) {dev_dbg (&pdev->dev,"no NAND chip(s) found\n" ); goto err;
@@ -797,9 +800,9 @@ static int nand_davinci_probe(struct platform_device *pdev)* usable: 10 bytes are needed, not 6. */ if (pdata->ecc_bits ==4 ) { -int chunks = info->mtd.writesize /512 ; +int chunks = mtd->writesize /512 ; -if (!chunks || info->mtd.oobsize <16 ) { +if (!chunks || mtd->oobsize <16 ) {dev_dbg (&pdev->dev,"too small\n" ); ret = -EINVAL ; goto err;
@@ -811,8 +814,7 @@ static int nand_davinci_probe(struct platform_device *pdev)*/ if (chunks ==1 ) { info->ecclayout = hwecc4_small; - info->ecclayout.oobfree[1 ].length = - info->mtd.oobsize -16 ; + info->ecclayout.oobfree[1 ].length = mtd->oobsize -16 ; goto syndrome_done; }if (chunks ==4 ) {
@@ -833,15 +835,15 @@ syndrome_done: info->chip.ecc.layout = &info->ecclayout; } - ret =nand_scan_tail (&info->mtd); + ret =nand_scan_tail (mtd);if (ret <0 ) goto err;if (pdata->parts) - ret =mtd_device_parse_register (&info->mtd,NULL ,NULL , + ret =mtd_device_parse_register (mtd,NULL ,NULL , pdata->parts, pdata->nr_parts);else - ret =mtd_device_register (&info->mtd,NULL ,0 ); + ret =mtd_device_register (mtd,NULL ,0 );if (ret <0 ) goto err;
@@ -871,7 +873,7 @@ static int nand_davinci_remove(struct platform_device *pdev) ecc4_busy = false;spin_unlock_irq (&davinci_nand_lock); -nand_release (&info->mtd); +nand_release (nand_to_mtd (&info->chip));clk_disable_unprepare (info->clk);
Signature · 1 line
2.1.4
PATCH v4 15/58 mtd: nand: denali: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
Conflicts:
drivers/mtd/nand/denali.c
--- drivers/mtd/nand/denali.c | 70 ++++++++++++++++++++++++++--------------------- drivers/mtd/nand/denali.h | 1 - 2 files changed, 39 insertions(+), 32 deletions(-)
drivers/mtd/nand/denali.c +39 -31
@@ -75,7 +75,10 @@ MODULE_PARM_DESC(onfi_timing_mode,* this macro allows us to convert from an MTD structure to our own * device context (denali) structure. */ -#define mtd_to_denali (m) container_of(m, struct denali_nand_info, mtd) +static inline struct denali_nand_info *mtd_to_denali (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct denali_nand_info, nand); +}/* * These constants are defined by the driver to enable common driver
@@ -986,6 +989,8 @@ static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf,* than one NAND connected. */ if (err_byte <ECC_SECTOR_SIZE ) { +struct mtd_info *mtd = +nand_to_mtd (&denali->nand);int offset; offset = (err_sector *
@@ -995,7 +1000,7 @@ static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf, err_device;/* correct the ECC error */ buf[offset] ^= err_correction_value; - denali->mtd.ecc_stats.corrected++; + mtd->ecc_stats.corrected++; bitflips++; } }else {
@@ -1062,7 +1067,7 @@ static int write_page(struct mtd_info *mtd, struct nand_chip *chip, {struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_status;uint32_t irq_mask =INTR_STATUS__DMA_CMD_COMP |INTR_STATUS__PROGRAM_FAIL ;
@@ -1160,7 +1165,7 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_status; uint32_t irq_mask = INTR_STATUS__ECC_TRANSACTION_DONE |
@@ -1193,14 +1198,14 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,denali_enable_dma (denali, false);if (check_erased_page) { -read_oob_data (&denali->mtd, chip->oob_poi, denali->page); +read_oob_data (mtd, chip->oob_poi, denali->page);/* check ECC failures that may have occurred on erased pages */ if (check_erased_page) { -if (!is_erased (buf, denali->mtd.writesize)) - denali->mtd.ecc_stats.failed++; -if (!is_erased (buf, denali->mtd.oobsize)) - denali->mtd.ecc_stats.failed++; +if (!is_erased (buf, mtd->writesize)) + mtd->ecc_stats.failed++; +if (!is_erased (buf, mtd->oobsize)) + mtd->ecc_stats.failed++; } }return max_bitflips;
@@ -1211,7 +1216,7 @@ static int denali_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, {struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_mask =INTR_STATUS__DMA_CMD_COMP ;if (page != denali->page) {
@@ -1428,6 +1433,7 @@ static void denali_drv_init(struct denali_nand_info *denali)int denali_init (struct denali_nand_info *denali) { +struct mtd_info *mtd =nand_to_mtd (&denali->nand);int ret;if (denali->platform ==INTEL_CE4100 ) {
@@ -1447,7 +1453,7 @@ int denali_init(struct denali_nand_info *denali)if (!denali->buf.buf)return -ENOMEM ; - denali->mtd.dev.parent = denali->dev; + mtd->dev.parent = denali->dev;denali_hw_init (denali);denali_drv_init (denali);
@@ -1463,8 +1469,8 @@ int denali_init(struct denali_nand_info *denali)/* now that our ISR is registered, we can enable interrupts */ denali_set_intr_modes (denali, true); - denali->mtd.name ="denali-nand" ; - denali->mtd.priv = &denali->nand; + mtd->name ="denali-nand" ; + mtd->priv = &denali->nand;/* register the driver with the NAND core subsystem */ denali->nand.select_chip = denali_select_chip;
@@ -1477,7 +1483,7 @@ int denali_init(struct denali_nand_info *denali)* this is the first stage in a two step process to register * with the nand subsystem */ -if (nand_scan_ident (&denali->mtd, denali->max_banks,NULL )) { +if (nand_scan_ident (mtd, denali->max_banks,NULL )) { ret = -ENXIO ; goto failed_req_irq; }
@@ -1485,7 +1491,7 @@ int denali_init(struct denali_nand_info *denali)/* allocate the right size buffer now */ devm_kfree (denali->dev, denali->buf.buf); denali->buf.buf =devm_kzalloc (denali->dev, - denali->mtd.writesize + denali->mtd.oobsize, + mtd->writesize + mtd->oobsize,GFP_KERNEL );if (!denali->buf.buf) { ret = -ENOMEM ;
@@ -1500,7 +1506,7 @@ int denali_init(struct denali_nand_info *denali) } denali->buf.dma_buf =dma_map_single (denali->dev, denali->buf.buf, - denali->mtd.writesize + denali->mtd.oobsize, + mtd->writesize + mtd->oobsize,DMA_BIDIRECTIONAL );if (dma_mapping_error (denali->dev, denali->buf.dma_buf)) {dev_err (denali->dev,"Spectra: failed to map DMA buffer\n" );
@@ -1521,10 +1527,10 @@ int denali_init(struct denali_nand_info *denali) denali->nand.bbt_erase_shift += (denali->devnum -1 ); denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift; denali->nand.chip_shift += (denali->devnum -1 ); - denali->mtd.writesize <<= (denali->devnum -1 ); - denali->mtd.oobsize <<= (denali->devnum -1 ); - denali->mtd.erasesize <<= (denali->devnum -1 ); - denali->mtd.size = denali->nand.numchips * denali->nand.chipsize; + mtd->writesize <<= (denali->devnum -1 ); + mtd->oobsize <<= (denali->devnum -1 ); + mtd->erasesize <<= (denali->devnum -1 ); + mtd->size = denali->nand.numchips * denali->nand.chipsize; denali->bbtskipbytes *= denali->devnum;/*
@@ -1551,16 +1557,16 @@ int denali_init(struct denali_nand_info *denali)* SLC if possible. * */ if (!nand_is_slc (&denali->nand) && - (denali->mtd.oobsize > (denali->bbtskipbytes + -ECC_15BITS * (denali->mtd.writesize / + (mtd->oobsize > (denali->bbtskipbytes + +ECC_15BITS * (mtd->writesize /ECC_SECTOR_SIZE )))) {/* if MLC OOB size is large enough, use 15bit ECC*/ denali->nand.ecc.strength =15 ; denali->nand.ecc.layout = &nand_15bit_oob; denali->nand.ecc.bytes =ECC_15BITS ;iowrite32 (15 , denali->flash_reg +ECC_CORRECTION ); - }else if (denali->mtd.oobsize < (denali->bbtskipbytes + -ECC_8BITS * (denali->mtd.writesize / + }else if (mtd->oobsize < (denali->bbtskipbytes + +ECC_8BITS * (mtd->writesize /ECC_SECTOR_SIZE ))) {pr_err ("Your NAND chip OOB is not large enough to contain 8bit ECC correction codes" ); goto failed_req_irq;
@@ -1574,11 +1580,11 @@ int denali_init(struct denali_nand_info *denali) denali->nand.ecc.bytes *= denali->devnum; denali->nand.ecc.strength *= denali->devnum; denali->nand.ecc.layout->eccbytes *= - denali->mtd.writesize /ECC_SECTOR_SIZE ; + mtd->writesize /ECC_SECTOR_SIZE ; denali->nand.ecc.layout->oobfree[0 ].offset = denali->bbtskipbytes + denali->nand.ecc.layout->eccbytes; denali->nand.ecc.layout->oobfree[0 ].length = - denali->mtd.oobsize - denali->nand.ecc.layout->eccbytes - + mtd->oobsize - denali->nand.ecc.layout->eccbytes - denali->bbtskipbytes;/*
@@ -1586,7 +1592,7 @@ int denali_init(struct denali_nand_info *denali)* contained by each nand chip. blksperchip will help driver to * know how many blocks is taken by FW. */ - denali->totalblks = denali->mtd.size >> denali->nand.phys_erase_shift; + denali->totalblks = mtd->size >> denali->nand.phys_erase_shift; denali->blksperchip = denali->totalblks / denali->nand.numchips;/* override the default read operations */
@@ -1599,12 +1605,12 @@ int denali_init(struct denali_nand_info *denali) denali->nand.ecc.write_oob = denali_write_oob; denali->nand.erase = denali_erase; -if (nand_scan_tail (&denali->mtd)) { +if (nand_scan_tail (mtd)) { ret = -ENXIO ; goto failed_req_irq; } - ret =mtd_device_register (&denali->mtd,NULL ,0 ); + ret =mtd_device_register (mtd,NULL ,0 );if (ret) {dev_err (denali->dev,"Spectra: Failed to register MTD: %d\n" , ret);
@@ -1622,10 +1628,12 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { -nand_release (&denali->mtd); +struct mtd_info *mtd =nand_to_mtd (&denali->nand); + +nand_release (mtd);denali_irq_cleanup (denali->irq, denali);dma_unmap_single (denali->dev, denali->buf.dma_buf, - denali->mtd.writesize + denali->mtd.oobsize, + mtd->writesize + mtd->oobsize,DMA_BIDIRECTIONAL ); }EXPORT_SYMBOL (denali_remove);
drivers/mtd/nand/denali.h +0 -1
@@ -450,7 +450,6 @@ struct nand_buf {#define DT 3struct denali_nand_info { -struct mtd_info mtd;struct nand_chip nand;int flash_bank;/* currently selected chip */ int status;
Signature · 1 line
2.1.4
PATCH v5 15/58 mtd: nand: denali: use the mtd instance embedded in struct nand_chip
struct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes since v4:
- fix conflict after changes brought in v5 of patch 1
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
Conflicts:
drivers/mtd/nand/denali.c
--- drivers/mtd/nand/denali.c | 69 ++++++++++++++++++++++++++--------------------- drivers/mtd/nand/denali.h | 1 - 2 files changed, 38 insertions(+), 32 deletions(-)
drivers/mtd/nand/denali.c +38 -31
@@ -75,7 +75,10 @@ MODULE_PARM_DESC(onfi_timing_mode,* this macro allows us to convert from an MTD structure to our own * device context (denali) structure. */ -#define mtd_to_denali (m) container_of(m, struct denali_nand_info, mtd) +static inline struct denali_nand_info *mtd_to_denali (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct denali_nand_info, nand); +}/* * These constants are defined by the driver to enable common driver
@@ -986,6 +989,8 @@ static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf,* than one NAND connected. */ if (err_byte <ECC_SECTOR_SIZE ) { +struct mtd_info *mtd = +nand_to_mtd (&denali->nand);int offset; offset = (err_sector *
@@ -995,7 +1000,7 @@ static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf, err_device;/* correct the ECC error */ buf[offset] ^= err_correction_value; - denali->mtd.ecc_stats.corrected++; + mtd->ecc_stats.corrected++; bitflips++; } }else {
@@ -1062,7 +1067,7 @@ static int write_page(struct mtd_info *mtd, struct nand_chip *chip, {struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_status;uint32_t irq_mask =INTR_STATUS__DMA_CMD_COMP |INTR_STATUS__PROGRAM_FAIL ;
@@ -1160,7 +1165,7 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_status; uint32_t irq_mask = INTR_STATUS__ECC_TRANSACTION_DONE |
@@ -1193,14 +1198,14 @@ static int denali_read_page(struct mtd_info *mtd, struct nand_chip *chip,denali_enable_dma (denali, false);if (check_erased_page) { -read_oob_data (&denali->mtd, chip->oob_poi, denali->page); +read_oob_data (mtd, chip->oob_poi, denali->page);/* check ECC failures that may have occurred on erased pages */ if (check_erased_page) { -if (!is_erased (buf, denali->mtd.writesize)) - denali->mtd.ecc_stats.failed++; -if (!is_erased (buf, denali->mtd.oobsize)) - denali->mtd.ecc_stats.failed++; +if (!is_erased (buf, mtd->writesize)) + mtd->ecc_stats.failed++; +if (!is_erased (buf, mtd->oobsize)) + mtd->ecc_stats.failed++; } }return max_bitflips;
@@ -1211,7 +1216,7 @@ static int denali_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, {struct denali_nand_info *denali =mtd_to_denali (mtd);dma_addr_t addr = denali->buf.dma_buf; -size_t size = denali->mtd.writesize + denali->mtd.oobsize; +size_t size = mtd->writesize + mtd->oobsize;uint32_t irq_mask =INTR_STATUS__DMA_CMD_COMP ;if (page != denali->page) {
@@ -1428,6 +1433,7 @@ static void denali_drv_init(struct denali_nand_info *denali)int denali_init (struct denali_nand_info *denali) { +struct mtd_info *mtd =nand_to_mtd (&denali->nand);int ret;if (denali->platform ==INTEL_CE4100 ) {
@@ -1447,7 +1453,7 @@ int denali_init(struct denali_nand_info *denali)if (!denali->buf.buf)return -ENOMEM ; - denali->mtd.dev.parent = denali->dev; + mtd->dev.parent = denali->dev;denali_hw_init (denali);denali_drv_init (denali);
@@ -1463,8 +1469,8 @@ int denali_init(struct denali_nand_info *denali)/* now that our ISR is registered, we can enable interrupts */ denali_set_intr_modes (denali, true); - denali->mtd.name ="denali-nand" ; - denali->mtd.priv = &denali->nand; + mtd->name ="denali-nand" ; + mtd->priv = &denali->nand;/* register the driver with the NAND core subsystem */ denali->nand.select_chip = denali_select_chip;
@@ -1477,7 +1483,7 @@ int denali_init(struct denali_nand_info *denali)* this is the first stage in a two step process to register * with the nand subsystem */ -if (nand_scan_ident (&denali->mtd, denali->max_banks,NULL )) { +if (nand_scan_ident (mtd, denali->max_banks,NULL )) { ret = -ENXIO ; goto failed_req_irq; }
@@ -1485,7 +1491,7 @@ int denali_init(struct denali_nand_info *denali)/* allocate the right size buffer now */ devm_kfree (denali->dev, denali->buf.buf); denali->buf.buf =devm_kzalloc (denali->dev, - denali->mtd.writesize + denali->mtd.oobsize, + mtd->writesize + mtd->oobsize,GFP_KERNEL );if (!denali->buf.buf) { ret = -ENOMEM ;
@@ -1500,7 +1506,7 @@ int denali_init(struct denali_nand_info *denali) } denali->buf.dma_buf =dma_map_single (denali->dev, denali->buf.buf, - denali->mtd.writesize + denali->mtd.oobsize, + mtd->writesize + mtd->oobsize,DMA_BIDIRECTIONAL );if (dma_mapping_error (denali->dev, denali->buf.dma_buf)) {dev_err (denali->dev,"Spectra: failed to map DMA buffer\n" );
@@ -1521,10 +1527,10 @@ int denali_init(struct denali_nand_info *denali) denali->nand.bbt_erase_shift += (denali->devnum -1 ); denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift; denali->nand.chip_shift += (denali->devnum -1 ); - denali->mtd.writesize <<= (denali->devnum -1 ); - denali->mtd.oobsize <<= (denali->devnum -1 ); - denali->mtd.erasesize <<= (denali->devnum -1 ); - denali->mtd.size = denali->nand.numchips * denali->nand.chipsize; + mtd->writesize <<= (denali->devnum -1 ); + mtd->oobsize <<= (denali->devnum -1 ); + mtd->erasesize <<= (denali->devnum -1 ); + mtd->size = denali->nand.numchips * denali->nand.chipsize; denali->bbtskipbytes *= denali->devnum;/*
@@ -1551,16 +1557,16 @@ int denali_init(struct denali_nand_info *denali)* SLC if possible. * */ if (!nand_is_slc (&denali->nand) && - (denali->mtd.oobsize > (denali->bbtskipbytes + -ECC_15BITS * (denali->mtd.writesize / + (mtd->oobsize > (denali->bbtskipbytes + +ECC_15BITS * (mtd->writesize /ECC_SECTOR_SIZE )))) {/* if MLC OOB size is large enough, use 15bit ECC*/ denali->nand.ecc.strength =15 ; denali->nand.ecc.layout = &nand_15bit_oob; denali->nand.ecc.bytes =ECC_15BITS ;iowrite32 (15 , denali->flash_reg +ECC_CORRECTION ); - }else if (denali->mtd.oobsize < (denali->bbtskipbytes + -ECC_8BITS * (denali->mtd.writesize / + }else if (mtd->oobsize < (denali->bbtskipbytes + +ECC_8BITS * (mtd->writesize /ECC_SECTOR_SIZE ))) {pr_err ("Your NAND chip OOB is not large enough to contain 8bit ECC correction codes" ); goto failed_req_irq;
@@ -1574,11 +1580,11 @@ int denali_init(struct denali_nand_info *denali) denali->nand.ecc.bytes *= denali->devnum; denali->nand.ecc.strength *= denali->devnum; denali->nand.ecc.layout->eccbytes *= - denali->mtd.writesize /ECC_SECTOR_SIZE ; + mtd->writesize /ECC_SECTOR_SIZE ; denali->nand.ecc.layout->oobfree[0 ].offset = denali->bbtskipbytes + denali->nand.ecc.layout->eccbytes; denali->nand.ecc.layout->oobfree[0 ].length = - denali->mtd.oobsize - denali->nand.ecc.layout->eccbytes - + mtd->oobsize - denali->nand.ecc.layout->eccbytes - denali->bbtskipbytes;/*
@@ -1586,7 +1592,7 @@ int denali_init(struct denali_nand_info *denali)* contained by each nand chip. blksperchip will help driver to * know how many blocks is taken by FW. */ - denali->totalblks = denali->mtd.size >> denali->nand.phys_erase_shift; + denali->totalblks = mtd->size >> denali->nand.phys_erase_shift; denali->blksperchip = denali->totalblks / denali->nand.numchips;/* override the default read operations */
@@ -1599,12 +1605,12 @@ int denali_init(struct denali_nand_info *denali) denali->nand.ecc.write_oob = denali_write_oob; denali->nand.erase = denali_erase; -if (nand_scan_tail (&denali->mtd)) { +if (nand_scan_tail (mtd)) { ret = -ENXIO ; goto failed_req_irq; } - ret =mtd_device_register (&denali->mtd,NULL ,0 ); + ret =mtd_device_register (mtd,NULL ,0 );if (ret) {dev_err (denali->dev,"Spectra: Failed to register MTD: %d\n" , ret);
@@ -1622,9 +1628,10 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { -int bufsize = denali->mtd.writesize + denali->mtd.oobsize; +struct mtd_info *mtd =nand_to_mtd (&denali->nand); +int bufsize = mtd->writesize + mtd->oobsize; -nand_release (&denali->mtd); +nand_release (mtd);denali_irq_cleanup (denali->irq, denali);dma_unmap_single (denali->dev, denali->buf.dma_buf, bufsize,DMA_BIDIRECTIONAL );
drivers/mtd/nand/denali.h +0 -1
@@ -450,7 +450,6 @@ struct nand_buf {#define DT 3struct denali_nand_info { -struct mtd_info mtd;struct nand_chip nand;int flash_bank;/* currently selected chip */ int status;
Signature · 1 line
2.1.4
PATCH v4 16/58 mtd: nand: diskonchip: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/diskonchip.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/mtd/nand/diskonchip.c +7 -7
@@ -1556,15 +1556,15 @@ static int __init doc_probe(unsigned long physadr)printk (KERN_NOTICE "DiskOnChip found at 0x%lx\n" , physadr); - len =sizeof (struct mtd_info ) + -sizeof (struct nand_chip ) +sizeof (struct doc_priv ) + (2 *sizeof (struct nand_bbt_descr )); - mtd =kzalloc (len,GFP_KERNEL ); -if (!mtd) { + len =sizeof (struct nand_chip ) +sizeof (struct doc_priv ) + + (2 *sizeof (struct nand_bbt_descr )); + nand =kzalloc (len,GFP_KERNEL ); +if (!nand) { ret = -ENOMEM ; goto fail; } - nand = (struct nand_chip *) (mtd +1 ); + mtd =nand_to_mtd (nand); doc = (struct doc_priv *) (nand +1 ); nand->bbt_td = (struct nand_bbt_descr *) (doc +1 ); nand->bbt_md = nand->bbt_td +1 ;
@@ -1615,7 +1615,7 @@ static int __init doc_probe(unsigned long physadr)haven't yet added it. This is handled without incident by mtd_device_unregister, as far as I can tell. */ nand_release (mtd); -kfree (mtd); +kfree (nand); goto fail; }
@@ -1650,7 +1650,7 @@ static void release_nanddoc(void)nand_release (mtd);iounmap (doc->virtadr);release_mem_region (doc->physadr,DOC_IOREMAP_LEN ); -kfree (mtd); +kfree (nand); } }
Signature · 1 line
2.1.4
PATCH v4 17/58 mtd: nand: docg4: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/docg4.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/mtd/nand/docg4.c +12 -11
@@ -1305,14 +1305,14 @@ static int __init probe_docg4(struct platform_device *pdev)return -EIO ; } - len =sizeof (struct mtd_info ) +sizeof (struct nand_chip ) + -sizeof (struct docg4_priv ); - mtd =kzalloc (len,GFP_KERNEL ); -if (mtd ==NULL ) { + len =sizeof (struct nand_chip ) +sizeof (struct docg4_priv ); + nand =kzalloc (len,GFP_KERNEL ); +if (nand ==NULL ) { retval = -ENOMEM ; - goto fail; + goto fail_unmap; } - nand = (struct nand_chip *) (mtd +1 ); + + mtd =nand_to_mtd (nand); doc = (struct docg4_priv *) (nand +1 ); mtd->priv = nand; nand->priv = doc;
@@ -1354,16 +1354,17 @@ static int __init probe_docg4(struct platform_device *pdev)return 0 ; fail: -iounmap (virtadr); -if (mtd) { +if (nand) {/* re-declarations avoid compiler warning */ -struct nand_chip *nand =mtd_to_nand (mtd);struct docg4_priv *doc = nand->priv;nand_release (mtd);/* deletes partitions and mtd devices */ free_bch (doc->bch); -kfree (mtd); +kfree (nand); } +fail_unmap: +iounmap (virtadr); +return retval; }
@@ -1372,7 +1373,7 @@ static int __exit cleanup_docg4(struct platform_device *pdev)struct docg4_priv *doc =platform_get_drvdata (pdev);nand_release (doc->mtd);free_bch (doc->bch); -kfree (doc->mtd); +kfree (mtd_to_nand (doc->mtd));iounmap (doc->virtadr);return 0 ; }
Signature · 1 line
2.1.4
PATCH v4 18/58 mtd: nand: fsl_elbc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/fsl_elbc_nand.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-)
drivers/mtd/nand/fsl_elbc_nand.c +15 -11
@@ -48,7 +48,6 @@/* mtd information per set */ struct fsl_elbc_mtd { -struct mtd_info mtd;struct nand_chip chip;struct fsl_lbc_ctrl *ctrl;
@@ -742,12 +741,13 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)struct fsl_lbc_regs __iomem *lbc = ctrl->regs;struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand;struct nand_chip *chip = &priv->chip; +struct mtd_info *mtd =nand_to_mtd (chip);dev_dbg (priv->dev,"eLBC Set Information for bank %d\n" , priv->bank);/* Fill in fsl_elbc_mtd structure */ - priv->mtd.priv = chip; - priv->mtd.dev.parent = priv->dev; + mtd->priv = chip; + mtd->dev.parent = priv->dev;nand_set_flash_node (chip, priv->dev->of_node);/* set timeout to maximum */
@@ -798,9 +798,11 @@ 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_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand; -nand_release (&priv->mtd); +struct mtd_info *mtd =nand_to_mtd (&priv->chip); -kfree (priv->mtd.name); +nand_release (mtd); + +kfree (mtd->name);if (priv->vbase)iounmap (priv->vbase);
@@ -824,6 +826,7 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev)int bank;struct device *dev;struct device_node *node = pdev->dev.of_node; +struct mtd_info *mtd;if (!fsl_lbc_ctrl_dev || !fsl_lbc_ctrl_dev->regs)return -ENODEV ;
@@ -886,8 +889,9 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev) goto err; } - priv->mtd.name =kasprintf (GFP_KERNEL ,"%llx.flash" , (u64 )res.start); -if (!priv->mtd.name) { + mtd =nand_to_mtd (&priv->chip); + mtd->name =kasprintf (GFP_KERNEL ,"%llx.flash" , (u64 )res.start); +if (!nand_to_mtd (&priv->chip)->name) { ret = -ENOMEM ; goto err; }
@@ -896,21 +900,21 @@ static int fsl_elbc_nand_probe(struct platform_device *pdev)if (ret) goto err; - ret =nand_scan_ident (&priv->mtd,1 ,NULL ); + ret =nand_scan_ident (mtd,1 ,NULL );if (ret) goto err; - ret =fsl_elbc_chip_init_tail (&priv->mtd); + ret =fsl_elbc_chip_init_tail (mtd);if (ret) goto err; - ret =nand_scan_tail (&priv->mtd); + ret =nand_scan_tail (mtd);if (ret) goto err;/* First look for RedBoot table or partitions on the command * line, these take precedence over device tree information */ -mtd_device_parse_register (&priv->mtd, part_probe_types,NULL , +mtd_device_parse_register (mtd, part_probe_types,NULL ,NULL ,0 ); printk(KERN_INFO "eLBC NAND device at 0x%llx, bank %d\n",
Signature · 1 line
2.1.4
PATCH v4 19/58 mtd: nand: fsl_ifc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/fsl_ifc_nand.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
drivers/mtd/nand/fsl_ifc_nand.c +16 -12
@@ -40,7 +40,6 @@ struct fsl_ifc_ctrl;/* mtd information per set */ struct fsl_ifc_mtd { -struct mtd_info mtd;struct nand_chip chip;struct fsl_ifc_ctrl *ctrl;
@@ -877,12 +876,13 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;struct nand_chip *chip = &priv->chip; +struct mtd_info *mtd =nand_to_mtd (&priv->chip);struct nand_ecclayout *layout;u32 csor;/* Fill in fsl_ifc_mtd structure */ - priv->mtd.priv = chip; - priv->mtd.dev.parent = priv->dev; + mtd->priv = chip; + mtd->dev.parent = priv->dev;nand_set_flash_node (chip, priv->dev->of_node);/* fill in nand_chip structure */
@@ -994,9 +994,11 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)static int fsl_ifc_chip_remove (struct fsl_ifc_mtd *priv) { -nand_release (&priv->mtd); +struct mtd_info *mtd =nand_to_mtd (&priv->chip); -kfree (priv->mtd.name); +nand_release (mtd); + +kfree (mtd->name);if (priv->vbase)iounmap (priv->vbase);
@@ -1031,6 +1033,7 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)int ret;int bank;struct device_node *node = dev->dev.of_node; +struct mtd_info *mtd;if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs)return -ENODEV ;
@@ -1103,8 +1106,10 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)IFC_NAND_EVTER_INTR_FTOERIR_EN |IFC_NAND_EVTER_INTR_WPERIR_EN , &ifc->ifc_nand.nand_evter_intr_en); - priv->mtd.name =kasprintf (GFP_KERNEL ,"%llx.flash" , (u64 )res.start); -if (!priv->mtd.name) { + + mtd =nand_to_mtd (&priv->chip); + mtd->name =kasprintf (GFP_KERNEL ,"%llx.flash" , (u64 )res.start); +if (!mtd->name) { ret = -ENOMEM ; goto err; }
@@ -1113,22 +1118,21 @@ static int fsl_ifc_nand_probe(struct platform_device *dev)if (ret) goto err; - ret =nand_scan_ident (&priv->mtd,1 ,NULL ); + ret =nand_scan_ident (mtd,1 ,NULL );if (ret) goto err; - ret =fsl_ifc_chip_init_tail (&priv->mtd); + ret =fsl_ifc_chip_init_tail (mtd);if (ret) goto err; - ret =nand_scan_tail (&priv->mtd); + ret =nand_scan_tail (mtd);if (ret) goto err;/* First look for RedBoot table or partitions on the command * line, these take precedence over device tree information */ -mtd_device_parse_register (&priv->mtd, part_probe_types,NULL , -NULL ,0 ); +mtd_device_parse_register (mtd, part_probe_types,NULL ,NULL ,0 );dev_info (priv->dev,"IFC NAND device at 0x%llx, bank %d\n" , (unsigned long long )res.start, priv->bank);
Signature · 1 line
2.1.4
PATCH v4 20/58 mtd: nand: fsl_upm: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/fsl_upm.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/mtd/nand/fsl_upm.c +16 -13
@@ -31,7 +31,6 @@struct fsl_upm_nand {struct device *dev; -struct mtd_info mtd;struct nand_chip chip;int last_ctrl;struct mtd_partition *parts;
@@ -49,7 +48,8 @@ struct fsl_upm_nand {static inline struct fsl_upm_nand *to_fsl_upm_nand (struct mtd_info *mtdinfo) { - return container_of(mtdinfo, struct fsl_upm_nand, mtd); + return container_of(mtd_to_nand(mtdinfo), struct fsl_upm_nand, + chip); }static int fun_chip_ready (struct mtd_info *mtd)
@@ -66,9 +66,10 @@ static int fun_chip_ready(struct mtd_info *mtd)static void fun_wait_rnb (struct fsl_upm_nand *fun) {if (fun->rnb_gpio[fun->mchip_number] >=0 ) { +struct mtd_info *mtd =nand_to_mtd (&fun->chip);int cnt =1000000 ; -while (--cnt && !fun_chip_ready (&fun->mtd)) +while (--cnt && !fun_chip_ready (mtd))cpu_relax ();if (!cnt)dev_err (fun->dev,"tired waiting for RNB\n" );
@@ -157,6 +158,7 @@ static int fun_chip_init(struct fsl_upm_nand *fun,const struct device_node *upm_np, const struct resource *io_res) { + struct mtd_info *mtd = nand_to_mtd(&fun->chip);int ret;struct device_node *flash_np;
@@ -174,30 +176,30 @@ static int fun_chip_init(struct fsl_upm_nand *fun,if (fun->rnb_gpio[0 ] >=0 ) fun->chip.dev_ready = fun_chip_ready; - fun->mtd.priv = &fun->chip; - fun->mtd.dev.parent = fun->dev; + mtd->priv = &fun->chip; + mtd->dev.parent = fun->dev; flash_np =of_get_next_child (upm_np,NULL );if (!flash_np)return -ENODEV ;nand_set_flash_node (&fun->chip, flash_np); - fun->mtd.name =kasprintf (GFP_KERNEL ,"0x%llx.%s" , (u64 )io_res->start, - flash_np->name); -if (!fun->mtd.name) { + mtd->name =kasprintf (GFP_KERNEL ,"0x%llx.%s" , (u64 )io_res->start, + flash_np->name); +if (!mtd->name) { ret = -ENOMEM ; goto err; } - ret =nand_scan (&fun->mtd, fun->mchip_count); + ret =nand_scan (mtd, fun->mchip_count);if (ret) goto err; - ret =mtd_device_register (&fun->mtd,NULL ,0 ); + ret =mtd_device_register (mtd,NULL ,0 ); err:of_node_put (flash_np);if (ret) -kfree (fun->mtd.name); +kfree (mtd->name);return ret; }
@@ -321,10 +323,11 @@ err1:static int fun_remove (struct platform_device *ofdev) {struct fsl_upm_nand *fun =dev_get_drvdata (&ofdev->dev); +struct mtd_info *mtd =nand_to_mtd (&fun->chip);int i; -nand_release (&fun->mtd); -kfree (fun->mtd.name); +nand_release (mtd); +kfree (mtd->name);for (i =0 ; i < fun->mchip_count; i++) {if (fun->rnb_gpio[i] <0 )
Signature · 1 line
2.1.4
PATCH v4 21/58 mtd: nand: fsmc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/fsmc_nand.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/mtd/nand/fsmc_nand.c +10 -12
@@ -299,7 +299,6 @@ static struct fsmc_eccplace fsmc_ecc4_sp_place = {*/ struct fsmc_nand_data {u32 pid; -struct mtd_info mtd;struct nand_chip nand;struct mtd_partition *partitions;unsigned int nr_partitions;
@@ -328,7 +327,7 @@ struct fsmc_nand_data {static inline struct fsmc_nand_data *mtd_to_fsmc (struct mtd_info *mtd) { - return container_of(mtd, struct fsmc_nand_data, mtd); + return container_of(mtd_to_nand(mtd), struct fsmc_nand_data, nand); }/* Assert CS signal based on chipnr */
@@ -1008,13 +1007,13 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)init_completion (&host->dma_access_complete);/* Link all private pointers */ - mtd = &host->mtd; + mtd =nand_to_mtd (&host->nand); nand = &host->nand; mtd->priv = nand; nand->priv = host;nand_set_flash_node (nand, np); - host->mtd.dev.parent = &pdev->dev; + mtd->dev.parent = &pdev->dev; nand->IO_ADDR_R = host->data_va; nand->IO_ADDR_W = host->data_va; nand->cmd_ctrl = fsmc_cmd_ctrl;
@@ -1077,14 +1076,14 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)/* * Scan to find existence of the device */ -if (nand_scan_ident (&host->mtd,1 ,NULL )) { +if (nand_scan_ident (mtd,1 ,NULL )) { ret = -ENXIO ;dev_err (&pdev->dev,"No NAND Device found!\n" ); goto err_scan_ident; }if (AMBA_REV_BITS (host->pid) >=8 ) { -switch (host->mtd.oobsize) { +switch (mtd->oobsize) {case 16 : nand->ecc.layout = &fsmc_ecc4_16_layout; host->ecc_place = &fsmc_ecc4_sp_place;
@@ -1135,7 +1134,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)* generated later in nand_bch_init() later. */ if (nand->ecc.mode !=NAND_ECC_SOFT_BCH ) { -switch (host->mtd.oobsize) { +switch (mtd->oobsize) {case 16 : nand->ecc.layout = &fsmc_ecc1_16_layout;break ;
@@ -1156,7 +1155,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev) }/* Second stage of scan to fill MTD data-structures */ -if (nand_scan_tail (&host->mtd)) { +if (nand_scan_tail (mtd)) { ret = -ENXIO ; goto err_probe; }
@@ -1171,9 +1170,8 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)/* * Check for partition info passed */ - host->mtd.name ="nand" ; - ret =mtd_device_register (&host->mtd, host->partitions, - host->nr_partitions); + mtd->name ="nand" ; + ret =mtd_device_register (mtd, host->partitions, host->nr_partitions);if (ret) goto err_probe;
@@ -1203,7 +1201,7 @@ static int fsmc_nand_remove(struct platform_device *pdev)struct fsmc_nand_data *host =platform_get_drvdata (pdev);if (host) { -nand_release (&host->mtd); +nand_release (nand_to_mtd (&host->nand));if (host->mode ==USE_DMA_ACCESS ) {dma_release_channel (host->write_dma_chan);
Signature · 1 line
2.1.4
PATCH v4 22/58 mtd: nand: gpio: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/gpio.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/mtd/nand/gpio.c +12 -9
@@ -35,12 +35,14 @@struct gpiomtd {void __iomem *io_sync; -struct mtd_info mtd_info;struct nand_chip nand_chip;struct gpio_nand_platdata plat; }; -#define gpio_nand_getpriv (x) container_of(x, struct gpiomtd, mtd_info) +static inline struct gpiomtd *gpio_nand_getpriv (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct gpiomtd, nand_chip); +}#ifdef CONFIG_ARM
@@ -195,7 +197,7 @@ static int gpio_nand_remove(struct platform_device *pdev) {struct gpiomtd *gpiomtd =platform_get_drvdata (pdev); -nand_release (&gpiomtd->mtd_info); +nand_release (nand_to_mtd (&gpiomtd->nand_chip));if (gpio_is_valid (gpiomtd->plat.gpio_nwp))gpio_set_value (gpiomtd->plat.gpio_nwp,0 );
@@ -208,6 +210,7 @@ static int gpio_nand_probe(struct platform_device *pdev) {struct gpiomtd *gpiomtd;struct nand_chip *chip; +struct mtd_info *mtd;struct resource *res;int ret =0 ;
@@ -274,24 +277,24 @@ static int gpio_nand_probe(struct platform_device *pdev) chip->chip_delay = gpiomtd->plat.chip_delay; chip->cmd_ctrl = gpio_nand_cmd_ctrl; - gpiomtd->mtd_info.priv = chip; - gpiomtd->mtd_info.dev.parent = &pdev->dev; + mtd =nand_to_mtd (chip); + mtd->priv = chip; + mtd->dev.parent = &pdev->dev;platform_set_drvdata (pdev, gpiomtd);if (gpio_is_valid (gpiomtd->plat.gpio_nwp))gpio_direction_output (gpiomtd->plat.gpio_nwp,1 ); -if (nand_scan (&gpiomtd->mtd_info,1 )) { +if (nand_scan (mtd,1 )) { ret = -ENXIO ; goto err_wp; }if (gpiomtd->plat.adjust_parts) - gpiomtd->plat.adjust_parts (&gpiomtd->plat, - gpiomtd->mtd_info.size); + gpiomtd->plat.adjust_parts (&gpiomtd->plat, mtd->size); - ret =mtd_device_register (&gpiomtd->mtd_info, gpiomtd->plat.parts, + ret =mtd_device_register (mtd, gpiomtd->plat.parts, gpiomtd->plat.num_parts);if (!ret)return 0 ;
Signature · 1 line
2.1.4
PATCH v4 23/58 mtd: nand: gpmi: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/gpmi-nand/gpmi-lib.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 23 +++++++++++------------ drivers/mtd/nand/gpmi-nand/gpmi-nand.h | 1 - 3 files changed, 12 insertions(+), 14 deletions(-)
drivers/mtd/nand/gpmi-nand/gpmi-lib.c +1 -1
@@ -919,7 +919,7 @@ static int enable_edo_mode(struct gpmi_nand_data *this, int mode) {struct resources *r = &this->resources;struct nand_chip *nand = &this->nand; -struct mtd_info *mtd = &this->mtd; +struct mtd_info *mtd =nand_to_mtd (nand);uint8_t *feature;unsigned long rate;int ret;
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +11 -12
@@ -107,7 +107,7 @@ static irqreturn_t bch_irq(int irq, void *cookie)static inline int get_ecc_strength (struct gpmi_nand_data *this) {struct bch_geometry *geo = &this->bch_geometry; -struct mtd_info *mtd = &this->mtd; +struct mtd_info *mtd =nand_to_mtd (&this->nand);int ecc_strength; ecc_strength = ((mtd->oobsize - geo->metadata_size) *8 )
@@ -139,8 +139,8 @@ static inline bool gpmi_check_ecc(struct gpmi_nand_data *this)static bool set_geometry_by_ecc_info (struct gpmi_nand_data *this) {struct bch_geometry *geo = &this->bch_geometry; -struct mtd_info *mtd = &this->mtd; -struct nand_chip *chip =mtd_to_nand (mtd); +struct nand_chip *chip = &this->nand; +struct mtd_info *mtd =nand_to_mtd (chip);struct nand_oobfree *of = gpmi_hw_ecclayout.oobfree;unsigned int block_mark_bit_offset;
@@ -257,7 +257,7 @@ static bool set_geometry_by_ecc_info(struct gpmi_nand_data *this)static int legacy_set_geometry (struct gpmi_nand_data *this) {struct bch_geometry *geo = &this->bch_geometry; -struct mtd_info *mtd = &this->mtd; +struct mtd_info *mtd =nand_to_mtd (&this->nand);unsigned int metadata_size;unsigned int status_size;unsigned int block_mark_bit_offset;
@@ -804,7 +804,7 @@ static int gpmi_alloc_dma_buffer(struct gpmi_nand_data *this) {struct bch_geometry *geo = &this->bch_geometry;struct device *dev = this->dev; -struct mtd_info *mtd = &this->mtd; +struct mtd_info *mtd =nand_to_mtd (&this->nand);/* [1] Allocate a command buffer. PAGE_SIZE is enough. */ this->cmd_buffer =kzalloc (PAGE_SIZE ,GFP_DMA |GFP_KERNEL );
@@ -1600,8 +1600,8 @@ static int mx23_check_transcription_stamp(struct gpmi_nand_data *this) {struct boot_rom_geometry *rom_geo = &this->rom_geometry;struct device *dev = this->dev; -struct mtd_info *mtd = &this->mtd;struct nand_chip *chip = &this->nand; +struct mtd_info *mtd =nand_to_mtd (chip);unsigned int search_area_size_in_strides;unsigned int stride;unsigned int page;
@@ -1655,8 +1655,8 @@ static int mx23_write_transcription_stamp(struct gpmi_nand_data *this) {struct device *dev = this->dev;struct boot_rom_geometry *rom_geo = &this->rom_geometry; -struct mtd_info *mtd = &this->mtd;struct nand_chip *chip = &this->nand; +struct mtd_info *mtd =nand_to_mtd (chip);unsigned int block_size_in_pages;unsigned int search_area_size_in_strides;unsigned int search_area_size_in_pages;
@@ -1735,7 +1735,7 @@ static int mx23_boot_init(struct gpmi_nand_data *this) {struct device *dev = this->dev;struct nand_chip *chip = &this->nand; -struct mtd_info *mtd = &this->mtd; +struct mtd_info *mtd =nand_to_mtd (chip);unsigned int block_count;unsigned int block;int chipnr;
@@ -1831,14 +1831,13 @@ static int gpmi_set_geometry(struct gpmi_nand_data *this)static void gpmi_nand_exit (struct gpmi_nand_data *this) { -nand_release (&this->mtd); +nand_release (nand_to_mtd (&this->nand));gpmi_free_dma_buffer (this); }static int gpmi_init_last (struct gpmi_nand_data *this) { -struct mtd_info *mtd = &this->mtd; -struct nand_chip *chip =mtd_to_nand (mtd); +struct nand_chip *chip = &this->nand;struct nand_ecc_ctrl *ecc = &chip->ecc;struct bch_geometry *bch_geo = &this->bch_geometry;int ret;
@@ -1886,8 +1885,8 @@ static int gpmi_init_last(struct gpmi_nand_data *this)static int gpmi_nand_init (struct gpmi_nand_data *this) { -struct mtd_info *mtd = &this->mtd;struct nand_chip *chip = &this->nand; +struct mtd_info *mtd =nand_to_mtd (chip);int ret;/* init current chip */
drivers/mtd/nand/gpmi-nand/gpmi-nand.h +0 -1
@@ -160,7 +160,6 @@ struct gpmi_nand_data {/* MTD / NAND */ struct nand_chip nand; -struct mtd_info mtd;/* General-use Variables */ int current_chip;
Signature · 1 line
2.1.4
PATCH v4 24/58 mtd: nand: hisi504: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/hisi504_nand.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/mtd/nand/hisi504_nand.c +6 -7
@@ -134,7 +134,6 @@struct hinfc_host {struct nand_chip chip; -struct mtd_info mtd;struct device *dev;void __iomem *iobase;void __iomem *mmio;
@@ -189,8 +188,8 @@ static void wait_controller_finished(struct hinfc_host *host)static void hisi_nfc_dma_transfer (struct hinfc_host *host,int todev) { -struct mtd_info *mtd = &host->mtd; -struct nand_chip *chip =mtd_to_nand (mtd); +struct nand_chip *chip = &host->chip; +struct mtd_info *mtd =nand_to_mtd (chip);unsigned long val;int ret;
@@ -262,7 +261,7 @@ static int hisi_nfc_send_cmd_pageprog(struct hinfc_host *host)static int hisi_nfc_send_cmd_readstart (struct hinfc_host *host) { -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->chip);if ((host->addr_value[0 ] == host->cache_addr_value[0 ]) && (host->addr_value[1 ] == host->cache_addr_value[1 ]))
@@ -643,7 +642,7 @@ static int hisi_nfc_ecc_probe(struct hinfc_host *host)int size, strength, ecc_bits;struct device *dev = host->dev;struct nand_chip *chip = &host->chip; -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (chip);struct device_node *np = host->dev->of_node; size =of_get_nand_ecc_step_size (np);
@@ -712,7 +711,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)platform_set_drvdata (pdev, host); chip = &host->chip; - mtd = &host->mtd; + mtd =nand_to_mtd (chip); irq =platform_get_irq (pdev,0 );if (irq <0 ) {
@@ -822,7 +821,7 @@ err_res:static int hisi_nfc_remove (struct platform_device *pdev) {struct hinfc_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->chip);nand_release (mtd);
Signature · 1 line
2.1.4
PATCH v4 25/58 mtd: nand: jz4740: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/jz4740_nand.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/mtd/nand/jz4740_nand.c +4 -5
@@ -59,7 +59,6 @@#define JZ_NAND_MEM_ADDR_OFFSET 0x10000struct jz_nand { -struct mtd_info mtd;struct nand_chip chip;void __iomem *base;struct resource *mem;
@@ -76,7 +75,7 @@ struct jz_nand {static inline struct jz_nand *mtd_to_jz_nand (struct mtd_info *mtd) { - return container_of(mtd, struct jz_nand, mtd); + return container_of(mtd_to_nand(mtd), struct jz_nand, chip); }static void jz_nand_select_chip (struct mtd_info *mtd,int chipnr)
@@ -334,8 +333,8 @@ static int jz_nand_detect_bank(struct platform_device *pdev,char gpio_name[9 ];char res_name[6 ];uint32_t ctrl; -struct mtd_info *mtd = &nand->mtd;struct nand_chip *chip = &nand->chip; +struct mtd_info *mtd =nand_to_mtd (chip);/* Request GPIO port. */ gpio =JZ_GPIO_MEM_CS0 + bank -1 ;
@@ -432,8 +431,8 @@ static int jz_nand_probe(struct platform_device *pdev) goto err_iounmap_mmio; } - mtd = &nand->mtd; chip = &nand->chip; + mtd =nand_to_mtd (chip); mtd->priv = chip; mtd->dev.parent = &pdev->dev; mtd->name ="jz4740-nand" ;
@@ -543,7 +542,7 @@ static int jz_nand_remove(struct platform_device *pdev)struct jz_nand *nand =platform_get_drvdata (pdev);size_t i; -nand_release (&nand->mtd); +nand_release (nand_to_mtd (&nand->chip));/* Deassert and disable all chips */ writel (0 , nand->base +JZ_REG_NAND_CTRL );
Signature · 1 line
2.1.4
PATCH v4 26/58 mtd: nand: lpc32xx: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/lpc32xx_mlc.c | 7 +++---- drivers/mtd/nand/lpc32xx_slc.c | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-)
drivers/mtd/nand/lpc32xx_mlc.c +3 -4
@@ -173,7 +173,6 @@ struct lpc32xx_nand_host {struct nand_chip nand_chip;struct lpc32xx_mlc_platform_data *pdata;struct clk *clk; -struct mtd_info mtd;void __iomem *io_base;int irq;struct lpc32xx_nand_cfg_mlc *ncfg;
@@ -566,7 +565,7 @@ static void lpc32xx_ecc_enable(struct mtd_info *mtd, int mode)static int lpc32xx_dma_setup (struct lpc32xx_nand_host *host) { -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);dma_cap_mask_t mask;if (!host->pdata || !host->pdata->dma_filter) {
@@ -660,8 +659,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) host->io_base_phy = rc->start; - mtd = &host->mtd; nand_chip = &host->nand_chip; + mtd =nand_to_mtd (nand_chip);if (pdev->dev.of_node) host->ncfg =lpc32xx_parse_dt (&pdev->dev);if (!host->ncfg) {
@@ -814,7 +813,7 @@ err_exit1:static int lpc32xx_nand_remove (struct platform_device *pdev) {struct lpc32xx_nand_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);nand_release (mtd);free_irq (host->irq, host);
drivers/mtd/nand/lpc32xx_slc.c +3 -4
@@ -204,7 +204,6 @@ struct lpc32xx_nand_host {struct nand_chip nand_chip;struct lpc32xx_slc_platform_data *pdata;struct clk *clk; -struct mtd_info mtd;void __iomem *io_base;struct lpc32xx_nand_cfg_slc *ncfg;
@@ -703,7 +702,7 @@ static int lpc32xx_nand_write_page_raw_syndrome(struct mtd_info *mtd,static int lpc32xx_nand_dma_setup (struct lpc32xx_nand_host *host) { -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);dma_cap_mask_t mask;if (!host->pdata || !host->pdata->dma_filter) {
@@ -799,8 +798,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) host->pdata =dev_get_platdata (&pdev->dev); - mtd = &host->mtd; chip = &host->nand_chip; + mtd =nand_to_mtd (chip); chip->priv = host;nand_set_flash_node (chip, pdev->dev.of_node); mtd->priv = chip;
@@ -932,7 +931,7 @@ static int lpc32xx_nand_remove(struct platform_device *pdev) {uint32_t tmp;struct lpc32xx_nand_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);nand_release (mtd);dma_release_channel (host->dma_chan);
Signature · 1 line
2.1.4
PATCH v4 27/58 mtd: nand: mpc5121: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/mpc5121_nfc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/mtd/nand/mpc5121_nfc.c +1 -2
@@ -118,7 +118,6 @@#define NFC_TIMEOUT (HZ / 10)/* 1/10 s */ struct mpc5121_nfc_prv { -struct mtd_info mtd;struct nand_chip chip;int irq;void __iomem *regs;
@@ -654,8 +653,8 @@ static int mpc5121_nfc_probe(struct platform_device *op)if (!prv)return -ENOMEM ; - mtd = &prv->mtd; chip = &prv->chip; + mtd =nand_to_mtd (chip); mtd->priv = chip; mtd->dev.parent = dev;
Signature · 1 line
2.1.4
PATCH v4 28/58 mtd: nand: mxc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/mxc_nand.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/mtd/nand/mxc_nand.c +2 -3
@@ -173,7 +173,6 @@ struct mxc_nand_devtype_data { };struct mxc_nand_host { -struct mtd_info mtd;struct nand_chip nand;struct device *dev;
@@ -1514,7 +1513,7 @@ static int mxcnd_probe(struct platform_device *pdev) host->dev = &pdev->dev;/* structures must be linked */ this = &host->nand; - mtd = &host->mtd; + mtd =nand_to_mtd (this); mtd->priv = this; mtd->dev.parent = &pdev->dev; mtd->name =DRIVER_NAME ;
@@ -1702,7 +1701,7 @@ static int mxcnd_remove(struct platform_device *pdev) {struct mxc_nand_host *host =platform_get_drvdata (pdev); -nand_release (&host->mtd); +nand_release (nand_to_mtd (&host->nand));if (host->clk_act)clk_disable_unprepare (host->clk);
Signature · 1 line
2.1.4
PATCH v4 29/58 mtd: nand: nandsim: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/nandsim.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/mtd/nand/nandsim.c +6 -6
@@ -2236,13 +2236,13 @@ static int __init ns_init_module(void) }/* Allocate and initialize mtd_info, nand_chip and nandsim structures */ - nsmtd =kzalloc (sizeof (struct mtd_info ) +sizeof (struct nand_chip ) - +sizeof (struct nandsim ),GFP_KERNEL ); -if (!nsmtd) { + chip =kzalloc (sizeof (struct nand_chip ) +sizeof (struct nandsim ), +GFP_KERNEL ); +if (!chip) {NS_ERR ("unable to allocate core structures.\n" );return -ENOMEM ; } - chip = (struct nand_chip *)(nsmtd +1 ); + nsmtd =nand_to_mtd (chip); nsmtd->priv = (void *)chip; nand = (struct nandsim *)(chip +1 ); chip->priv = (void *)nand;
@@ -2392,7 +2392,7 @@ err_exit:for (i =0 ;i <ARRAY_SIZE (nand->partitions); ++i)kfree (nand->partitions[i].name); error: -kfree (nsmtd); +kfree (chip);free_lists ();return retval;
@@ -2413,7 +2413,7 @@ static void __exit ns_cleanup_module(void)nand_release (nsmtd);/* Unregister driver */ for (i =0 ;i <ARRAY_SIZE (ns->partitions); ++i)kfree (ns->partitions[i].name); -kfree (nsmtd);/* Free other structures */ +kfree (mtd_to_nand (nsmtd));/* Free other structures */ free_lists (); }
Signature · 1 line
2.1.4
PATCH v4 30/58 mtd: nand: ndfc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/ndfc.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
drivers/mtd/nand/ndfc.c +13 -11
@@ -37,7 +37,6 @@struct ndfc_controller {struct platform_device *ofdev;void __iomem *ndfcbase; -struct mtd_info mtd;struct nand_chip chip;int chip_select;struct nand_hw_control ndfc_control;
@@ -147,6 +146,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, {struct device_node *flash_np;struct nand_chip *chip = &ndfc->chip; +struct mtd_info *mtd =nand_to_mtd (chip);int ret; chip->IO_ADDR_R = ndfc->ndfcbase +NDFC_DATA ;
@@ -167,31 +167,32 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, chip->ecc.strength =1 ; chip->priv = ndfc; - ndfc->mtd.priv = chip; - ndfc->mtd.dev.parent = &ndfc->ofdev->dev; + mtd->priv = chip; + mtd->dev.parent = &ndfc->ofdev->dev; flash_np =of_get_next_child (node,NULL );if (!flash_np)return -ENODEV ;nand_set_flash_node (chip, flash_np); - ndfc->mtd.name =kasprintf (GFP_KERNEL ,"%s.%s" , -dev_name (&ndfc->ofdev->dev), flash_np->name); -if (!ndfc->mtd.name) { + ppdata.of_node = flash_np; + mtd->name =kasprintf (GFP_KERNEL ,"%s.%s" ,dev_name (&ndfc->ofdev->dev), + flash_np->name); +if (!mtd->name) { ret = -ENOMEM ; goto err; } - ret =nand_scan (&ndfc->mtd,1 ); + ret =nand_scan (mtd,1 );if (ret) goto err; - ret =mtd_device_register (&ndfc->mtd,NULL ,0 ); + ret =mtd_device_register (mtd,NULL ,0 ); err:of_node_put (flash_np);if (ret) -kfree (ndfc->mtd.name); +kfree (mtd->name);return ret; }
@@ -258,9 +259,10 @@ static int ndfc_probe(struct platform_device *ofdev)static int ndfc_remove (struct platform_device *ofdev) {struct ndfc_controller *ndfc =dev_get_drvdata (&ofdev->dev); +struct mtd_info *mtd =nand_to_mtd (&ndfc->chip); -nand_release (&ndfc->mtd); -kfree (ndfc->mtd.name); +nand_release (mtd); +kfree (mtd->name);return 0 ; }
Signature · 1 line
2.1.4
PATCH v4 31/58 mtd: nand: nuc900: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/nuc900_nand.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/mtd/nand/nuc900_nand.c +8 -8
@@ -55,7 +55,6 @@ __raw_writel((val), (dev)->reg + REG_SMADDR)struct nuc900_nand { -struct mtd_info mtd;struct nand_chip chip;void __iomem *reg;struct clk *clk;
@@ -64,7 +63,7 @@ struct nuc900_nand {static inline struct nuc900_nand *mtd_to_nuc900 (struct mtd_info *mtd) { - return container_of(mtd, struct nuc900_nand, mtd); + return container_of(mtd_to_nand(mtd), struct nuc900_nand, chip); }static const struct mtd_partition partitions[] = {
@@ -236,6 +235,7 @@ static int nuc900_nand_probe(struct platform_device *pdev) {struct nuc900_nand *nuc900_nand;struct nand_chip *chip; +struct mtd_info *mtd;struct resource *res; nuc900_nand = devm_kzalloc(&pdev->dev, sizeof(struct nuc900_nand),
@@ -243,9 +243,10 @@ static int nuc900_nand_probe(struct platform_device *pdev)if (!nuc900_nand)return -ENOMEM ; chip = &(nuc900_nand->chip); + mtd =nand_to_mtd (chip); - nuc900_nand->mtd.priv = chip; - nuc900_nand->mtd.dev.parent = &pdev->dev; + mtd->priv = chip; + mtd->dev.parent = &pdev->dev;spin_lock_init (&nuc900_nand->lock); nuc900_nand->clk =devm_clk_get (&pdev->dev,NULL );
@@ -269,11 +270,10 @@ static int nuc900_nand_probe(struct platform_device *pdev)nuc900_nand_enable (nuc900_nand); -if (nand_scan (&(nuc900_nand->mtd),1 )) +if (nand_scan (mtd,1 ))return -ENXIO ; -mtd_device_register (&(nuc900_nand->mtd), partitions, -ARRAY_SIZE (partitions)); +mtd_device_register (mtd, partitions,ARRAY_SIZE (partitions));platform_set_drvdata (pdev, nuc900_nand);
@@ -284,7 +284,7 @@ static int nuc900_nand_remove(struct platform_device *pdev) {struct nuc900_nand *nuc900_nand =platform_get_drvdata (pdev); -nand_release (&nuc900_nand->mtd); +nand_release (nand_to_mtd (&nuc900_nand->chip));clk_disable (nuc900_nand->clk);return 0 ;
Signature · 1 line
2.1.4
PATCH v4 32/58 mtd: nand: omap2: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/omap2.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/mtd/nand/omap2.c +7 -7
@@ -152,7 +152,6 @@ static struct nand_hw_control omap_gpmc_controller = {struct omap_nand_info {struct omap_nand_platform_data *pdata; -struct mtd_info mtd;struct nand_chip nand;struct platform_device *pdev;
@@ -179,8 +178,9 @@ struct omap_nand_info {static inline struct omap_nand_info *mtd_to_omap (struct mtd_info *mtd) { - return container_of(mtd, struct omap_nand_info, mtd); + return container_of(mtd_to_nand(mtd), struct omap_nand_info, nand); } +/** * omap_prefetch_enable - configures and starts prefetch transfer * @cs: cs (chip select) number
@@ -1670,10 +1670,10 @@ static int omap_nand_probe(struct platform_device *pdev) info->reg = pdata->reg; info->of_node = pdata->of_node; info->ecc_opt = pdata->ecc_opt; - mtd = &info->mtd; + nand_chip = &info->nand; + mtd =nand_to_mtd (nand_chip); mtd->priv = &info->nand; mtd->dev.parent = &pdev->dev; - nand_chip = &info->nand; nand_chip->ecc.priv =NULL ;nand_set_flash_node (nand_chip, pdata->of_node);
@@ -1897,7 +1897,7 @@ static int omap_nand_probe(struct platform_device *pdev) ecclayout->eccpos[ecclayout->eccbytes -1 ] +1 ; err =elm_config (info->elm_dev,BCH4_ECC , - info->mtd.writesize / nand_chip->ecc.size, + mtd->writesize / nand_chip->ecc.size, nand_chip->ecc.size, nand_chip->ecc.bytes);if (err <0 ) goto return_error;
@@ -1951,7 +1951,7 @@ static int omap_nand_probe(struct platform_device *pdev) nand_chip->ecc.write_page = omap_write_page_bch; err =elm_config (info->elm_dev,BCH8_ECC , - info->mtd.writesize / nand_chip->ecc.size, + mtd->writesize / nand_chip->ecc.size, nand_chip->ecc.size, nand_chip->ecc.bytes);if (err <0 ) goto return_error;
@@ -1981,7 +1981,7 @@ static int omap_nand_probe(struct platform_device *pdev) nand_chip->ecc.write_page = omap_write_page_bch; err =elm_config (info->elm_dev,BCH16_ECC , - info->mtd.writesize / nand_chip->ecc.size, + mtd->writesize / nand_chip->ecc.size, nand_chip->ecc.size, nand_chip->ecc.bytes);if (err <0 ) goto return_error;
Signature · 1 line
2.1.4
PATCH v4 33/58 mtd: nand: orion: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/orion_nand.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mtd/nand/orion_nand.c +2 -2
@@ -85,11 +85,11 @@ static int __init orion_nand_probe(struct platform_device *pdev)u32 val =0 ; nc =devm_kzalloc (&pdev->dev, -sizeof (struct nand_chip ) +sizeof (struct mtd_info ), +sizeof (struct nand_chip ),GFP_KERNEL );if (!nc)return -ENOMEM ; - mtd = (struct mtd_info *)(nc +1 ); + mtd =nand_to_mtd (nc); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); io_base =devm_ioremap_resource (&pdev->dev, res);
Signature · 1 line
2.1.4
PATCH v4 34/58 mtd: nand: pasemi: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/pasemi_nand.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/mtd/nand/pasemi_nand.c +5 -7
@@ -110,17 +110,15 @@ static int pasemi_nand_probe(struct platform_device *ofdev)pr_debug ("pasemi_nand at %pR\n" , &res);/* Allocate memory for MTD device structure and private data */ - pasemi_nand_mtd =kzalloc (sizeof (struct mtd_info ) + -sizeof (struct nand_chip ),GFP_KERNEL ); -if (!pasemi_nand_mtd) { + chip =kzalloc (sizeof (struct nand_chip ),GFP_KERNEL ); +if (!chip) {printk (KERN_WARNING "Unable to allocate PASEMI NAND MTD device structure\n" ); err = -ENOMEM ; goto out; } -/* Get pointer to private data */ - chip = (struct nand_chip *)&pasemi_nand_mtd[1 ]; + pasemi_nand_mtd =nand_to_mtd (chip);/* Link the private data with the MTD structure */ pasemi_nand_mtd->priv = chip;
@@ -180,7 +178,7 @@ static int pasemi_nand_probe(struct platform_device *ofdev) out_ior:iounmap (chip->IO_ADDR_R); out_mtd: -kfree (pasemi_nand_mtd); +kfree (chip); out:return err; }
@@ -202,7 +200,7 @@ static int pasemi_nand_remove(struct platform_device *ofdev)iounmap (chip->IO_ADDR_R);/* Free the MTD device structure */ -kfree (pasemi_nand_mtd); +kfree (chip); pasemi_nand_mtd =NULL ;
Signature · 1 line
2.1.4
PATCH v4 35/58 mtd: nand: plat: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/plat_nand.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/mtd/nand/plat_nand.c +8 -7
@@ -20,7 +20,6 @@struct plat_nand_data {struct nand_chip chip; -struct mtd_info mtd;void __iomem *io_base; };
@@ -31,6 +30,7 @@ static int plat_nand_probe(struct platform_device *pdev) {struct platform_nand_data *pdata =dev_get_platdata (&pdev->dev);struct plat_nand_data *data; +struct mtd_info *mtd;struct resource *res;const char **part_types;int err =0 ;
@@ -58,8 +58,9 @@ static int plat_nand_probe(struct platform_device *pdev) data->chip.priv = &data;nand_set_flash_node (&data->chip, pdev->dev.of_node); - data->mtd.priv = &data->chip; - data->mtd.dev.parent = &pdev->dev; + mtd =nand_to_mtd (&data->chip); + mtd->priv = &data->chip; + mtd->dev.parent = &pdev->dev; data->chip.IO_ADDR_R = data->io_base; data->chip.IO_ADDR_W = data->io_base;
@@ -87,21 +88,21 @@ static int plat_nand_probe(struct platform_device *pdev) }/* Scan to find existence of the device */ -if (nand_scan (&data->mtd, pdata->chip.nr_chips)) { +if (nand_scan (mtd, pdata->chip.nr_chips)) { err = -ENXIO ; goto out; } part_types = pdata->chip.part_probe_types; - err =mtd_device_parse_register (&data->mtd, part_types,NULL , + err =mtd_device_parse_register (mtd, part_types,NULL , pdata->chip.partitions, pdata->chip.nr_partitions);if (!err)return err; -nand_release (&data->mtd); +nand_release (mtd); out:if (pdata->ctrl.remove) pdata->ctrl.remove (pdev);
@@ -116,7 +117,7 @@ static int plat_nand_remove(struct platform_device *pdev)struct plat_nand_data *data =platform_get_drvdata (pdev);struct platform_nand_data *pdata =dev_get_platdata (&pdev->dev); -nand_release (&data->mtd); +nand_release (nand_to_mtd (&data->chip));if (pdata->ctrl.remove) pdata->ctrl.remove (pdev);
Signature · 1 line
2.1.4
PATCH v4 36/58 mtd: nand: pxa3xx: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/pxa3xx_nand.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-)
drivers/mtd/nand/pxa3xx_nand.c +17 -16
@@ -167,7 +167,6 @@ enum pxa3xx_nand_variant {struct pxa3xx_nand_host {struct nand_chip chip; -struct mtd_info *mtd;void *info_data;/* page size of attached chip */
@@ -450,14 +449,15 @@ static int pxa3xx_nand_init_timings_compat(struct pxa3xx_nand_host *host,struct nand_chip *chip = &host->chip;struct pxa3xx_nand_info *info = host->info_data;const struct pxa3xx_nand_flash *f =NULL ; +struct mtd_info *mtd =nand_to_mtd (&host->chip);int i, id, ntypes; ntypes =ARRAY_SIZE (builtin_flash_types); - chip->cmdfunc (host->mtd,NAND_CMD_READID ,0x00 ,-1 ); + chip->cmdfunc (mtd,NAND_CMD_READID ,0x00 ,-1 ); - id = chip->read_byte (host->mtd); - id |= chip->read_byte (host->mtd) <<0x8 ; + id = chip->read_byte (mtd); + id |= chip->read_byte (mtd) <<0x8 ;for (i =0 ; i < ntypes; i++) { f = &builtin_flash_types[i];
@@ -890,7 +890,7 @@ static void set_command_address(struct pxa3xx_nand_info *info,static void prepare_start_command (struct pxa3xx_nand_info *info,int command) {struct pxa3xx_nand_host *host = info->host[info->cs]; -struct mtd_info *mtd = host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->chip);/* reset data and oob column point to handle data */ info->buf_start =0 ;
@@ -943,7 +943,7 @@ static int prepare_set_command(struct pxa3xx_nand_info *info, int command,struct mtd_info *mtd; host = info->host[info->cs]; - mtd = host->mtd; + mtd =nand_to_mtd (&host->chip); addr_cycle =0 ; exec_cmd =1 ;
@@ -1415,8 +1415,8 @@ static int pxa3xx_nand_config_ident(struct pxa3xx_nand_info *info)static void pxa3xx_nand_config_tail (struct pxa3xx_nand_info *info) {struct pxa3xx_nand_host *host = info->host[info->cs]; -struct mtd_info *mtd = host->mtd; -struct nand_chip *chip =mtd_to_nand (mtd); +struct nand_chip *chip = &host->chip; +struct mtd_info *mtd =nand_to_mtd (chip); info->reg_ndcr |= (host->col_addr_cycles ==2 ) ?NDCR_RA_START :0 ; info->reg_ndcr |= (chip->page_shift ==6 ) ?NDCR_PG_PER_BLK :0 ;
@@ -1693,19 +1693,20 @@ static int alloc_nand_resource(struct platform_device *pdev) pdata =dev_get_platdata (&pdev->dev);if (pdata->num_cs <=0 )return -ENODEV ; - info =devm_kzalloc (&pdev->dev,sizeof (*info) + (sizeof (*mtd) + -sizeof (*host)) * pdata->num_cs,GFP_KERNEL ); + info =devm_kzalloc (&pdev->dev, +sizeof (*info) +sizeof (*host) * pdata->num_cs, +GFP_KERNEL );if (!info)return -ENOMEM ; info->pdev = pdev; info->variant =pxa3xx_nand_get_variant (pdev);for (cs =0 ; cs < pdata->num_cs; cs++) { - mtd = (void *)&info[1 ] + (sizeof (*mtd) +sizeof (*host)) * cs; - chip = (struct nand_chip *)(&mtd[1 ]); - host = (struct pxa3xx_nand_host *)chip; + host = (void *)&info[1 ] +sizeof (*host) * cs; + chip = &host->chip; + chip->priv = host; + mtd =nand_to_mtd (chip); info->host[cs] = host; - host->mtd = mtd; host->cs = cs; host->info_data = info; mtd->priv = chip;
@@ -1833,7 +1834,7 @@ static int pxa3xx_nand_remove(struct platform_device *pdev)clk_disable_unprepare (info->clk);for (cs =0 ; cs < pdata->num_cs; cs++) -nand_release (info->host[cs]->mtd); +nand_release (nand_to_mtd (&info->host[cs]->chip));return 0 ; }
@@ -1904,7 +1905,7 @@ static int pxa3xx_nand_probe(struct platform_device *pdev) info =platform_get_drvdata (pdev); probe_success =0 ;for (cs =0 ; cs < pdata->num_cs; cs++) { -struct mtd_info *mtd = info->host[cs]->mtd; +struct mtd_info *mtd =nand_to_mtd (&info->host[cs]->chip);/* * The mtd name matches the one used in 'mtdparts' kernel
Signature · 1 line
2.1.4
PATCH v4 37/58 mtd: nand: r852: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
--- drivers/mtd/nand/r852.c | 34 +++++++++++++++------------------- drivers/mtd/nand/r852.h | 1 - 2 files changed, 15 insertions(+), 20 deletions(-)
drivers/mtd/nand/r852.c +15 -19
@@ -634,25 +634,22 @@ static void r852_update_media_status(struct r852_device *dev)*/ static int r852_register_nand_device (struct r852_device *dev) { - dev->mtd =kzalloc (sizeof (struct mtd_info ),GFP_KERNEL ); - -if (!dev->mtd) - goto error1; +struct mtd_info *mtd =nand_to_mtd (dev->chip);WARN_ON (dev->card_registred); - dev->mtd->priv = dev->chip; - dev->mtd->dev.parent = &dev->pci_dev->dev; + mtd->priv = dev->chip; + mtd->dev.parent = &dev->pci_dev->dev;if (dev->readonly) dev->chip->options |=NAND_ROM ;r852_engine_enable (dev); -if (sm_register_device (dev->mtd, dev->sm)) - goto error2; +if (sm_register_device (mtd, dev->sm)) + goto error1; -if (device_create_file (&dev->mtd->dev, &dev_attr_media_type)) { +if (device_create_file (&mtd->dev, &dev_attr_media_type)) {message ("can't create media type sysfs attribute" ); goto error3; }
@@ -660,9 +657,7 @@ static int r852_register_nand_device(struct r852_device *dev) dev->card_registred =1 ;return 0 ; error3: -nand_release (dev->mtd); -error2: -kfree (dev->mtd); +nand_release (mtd); error1:/* Force card redetect */ dev->card_detected =0 ;
@@ -675,15 +670,15 @@ error1:static void r852_unregister_nand_device (struct r852_device *dev) { +struct mtd_info *mtd =nand_to_mtd (dev->chip); +if (!dev->card_registred)return ; -device_remove_file (&dev->mtd->dev, &dev_attr_media_type); -nand_release (dev->mtd); +device_remove_file (&mtd->dev, &dev_attr_media_type); +nand_release (mtd);r852_engine_disable (dev); dev->card_registred =0 ; -kfree (dev->mtd); - dev->mtd =NULL ; }/* Card state updater */
@@ -1031,6 +1026,7 @@ static int r852_suspend(struct device *device)static int r852_resume (struct device *device) {struct r852_device *dev =pci_get_drvdata (to_pci_dev (device)); +struct mtd_info *mtd =nand_to_mtd (dev->chip);r852_disable_irqs (dev);r852_card_update_present (dev);
@@ -1050,9 +1046,9 @@ static int r852_resume(struct device *device)/* Otherwise, initialize the card */ if (dev->card_registred) {r852_engine_enable (dev); - dev->chip->select_chip (dev->mtd,0 ); - dev->chip->cmdfunc (dev->mtd,NAND_CMD_RESET ,-1 ,-1 ); - dev->chip->select_chip (dev->mtd,-1 ); + dev->chip->select_chip (mtd,0 ); + dev->chip->cmdfunc (mtd,NAND_CMD_RESET ,-1 ,-1 ); + dev->chip->select_chip (mtd,-1 ); }/* Program card detection IRQ */
drivers/mtd/nand/r852.h +0 -1
@@ -108,7 +108,6 @@struct r852_device {void __iomem *mmio;/* mmio */ -struct mtd_info *mtd;/* mtd backpointer */ struct nand_chip *chip;/* nand chip backpointer */ struct pci_dev *pci_dev;/* pci backpointer */
Signature · 1 line
2.1.4
PATCH v4 38/58 mtd: nand: s3c2410: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/s3c2410.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/mtd/nand/s3c2410.c +14 -9
@@ -104,7 +104,6 @@ struct s3c2410_nand_info;* @scan_res: The result from calling nand_scan_ident(). */ struct s3c2410_nand_mtd { -struct mtd_info mtd;struct nand_chip chip;struct s3c2410_nand_set *set;struct s3c2410_nand_info *info;
@@ -168,7 +167,8 @@ struct s3c2410_nand_info {static struct s3c2410_nand_mtd *s3c2410_nand_mtd_toours (struct mtd_info *mtd) { - return container_of(mtd, struct s3c2410_nand_mtd, mtd); + return container_of(mtd_to_nand(mtd), struct s3c2410_nand_mtd, + chip); }static struct s3c2410_nand_info *s3c2410_nand_mtd_toinfo (struct mtd_info *mtd)
@@ -745,7 +745,7 @@ static int s3c24xx_nand_remove(struct platform_device *pdev)for (mtdno =0 ; mtdno < info->mtd_count; mtdno++, ptr++) {pr_debug ("releasing mtd %d (%p)\n" , mtdno, ptr); -nand_release (&ptr->mtd); +nand_release (nand_to_mtd (&ptr->chip)); } }
@@ -762,9 +762,11 @@ static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info, struct s3c2410_nand_set *set) {if (set) { - mtd->mtd.name = set->name; +struct mtd_info *mtdinfo =nand_to_mtd (&mtd->chip); -return mtd_device_parse_register (&mtd->mtd,NULL ,NULL , + mtdinfo->name = set->name; + +return mtd_device_parse_register (mtdinfo,NULL ,NULL , set->partitions, set->nr_partitions); }
@@ -786,6 +788,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, struct s3c2410_nand_set *set) {struct nand_chip *chip = &nmtd->chip; +struct mtd_info *mtd =nand_to_mtd (chip);void __iomem *regs = info->regs; chip->write_buf = s3c2410_nand_write_buf;
@@ -831,7 +834,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, chip->IO_ADDR_R = chip->IO_ADDR_W; nmtd->info = info; - nmtd->mtd.priv = chip; + mtd->priv = chip; nmtd->set = set;#ifdef CONFIG_MTD_NAND_S3C2410_HWECC
@@ -1012,19 +1015,21 @@ static int s3c24xx_nand_probe(struct platform_device *pdev) nmtd = info->mtds;for (setno =0 ; setno < nr_sets; setno++, nmtd++) { +struct mtd_info *mtd =nand_to_mtd (&nmtd->chip); +pr_debug ("initialising set %d (%p, info %p)\n" , setno, nmtd, info); - nmtd->mtd.dev.parent = &pdev->dev; + mtd->dev.parent = &pdev->dev;s3c2410_nand_init_chip (info, nmtd, sets); - nmtd->scan_res =nand_scan_ident (&nmtd->mtd, + nmtd->scan_res =nand_scan_ident (mtd, (sets) ? sets->nr_chips :1 ,NULL );if (nmtd->scan_res ==0 ) {s3c2410_nand_update_chip (info, nmtd); -nand_scan_tail (&nmtd->mtd); +nand_scan_tail (mtd);s3c2410_nand_add_partition (info, nmtd, sets); }
Signature · 1 line
2.1.4
Re: [PATCH v4 38/58] mtd: nand: s3c2410: use the mtd instance embedded in struct nand_chip
Quoted 45 lines · Boris Brezillon
struct
nand_chipnow embeds an mtd device. Make use of this mtd instance.Signed-off-by Boris Brezillon <[email protected]>---
Changes generated with the following coccinelle script--->8---
virtual patch@fix1@
identifier__chipfield,__mtdfield;
type__type;
@@
(__type { ... struct nand_chip __chipfield; ...(quoted diff) +0
-1- struct mtd_info __mtdfield;}; | __type { ...(quoted diff) +0
-1- struct mtd_info __mtdfield;struct nand_chip __chipfield; ... };)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier__subfield;
type fix1.__type;__type*__priv;
@@
((quoted diff) +1
-1- __priv->__mtdfield.__subfield + nand_to_mtd(&__priv->__chipfield)->__subfield|
(quoted diff) +1
-1- &(__priv->__mtdfield) + nand_to_mtd(&__priv->__chipfield))
--->8---
Quoted 4 lines
--- drivers/mtd/nand/s3c2410.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
Looks correct:
Best regards,
Krzysztof
PATCH v4 39/58 mtd: nand: sh_flctl: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/sh_flctl.c | 8 ++++---- include/linux/mtd/sh_flctl.h | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-)
drivers/mtd/nand/sh_flctl.c +4 -4
@@ -607,13 +607,13 @@ static void execmd_read_page_sector(struct mtd_info *mtd, int page_addr)case FL_REPAIRABLE :dev_info (&flctl->pdev->dev,"applied ecc on page 0x%x" , page_addr); - flctl->mtd.ecc_stats.corrected++; + mtd->ecc_stats.corrected++;break ;case FL_ERROR :dev_warn (&flctl->pdev->dev,"page 0x%x contains corrupted data\n" , page_addr); - flctl->mtd.ecc_stats.failed++; + mtd->ecc_stats.failed++;break ;default : ;
@@ -1120,8 +1120,8 @@ static int flctl_probe(struct platform_device *pdev) }platform_set_drvdata (pdev, flctl); - flctl_mtd = &flctl->mtd; nand = &flctl->chip; + flctl_mtd =nand_to_mtd (nand);nand_set_flash_node (nand, pdev->dev.of_node); flctl_mtd->priv = nand; flctl_mtd->dev.parent = &pdev->dev;
@@ -1178,7 +1178,7 @@ static int flctl_remove(struct platform_device *pdev)struct sh_flctl *flctl =platform_get_drvdata (pdev);flctl_release_dma (flctl); -nand_release (&flctl->mtd); +nand_release (nand_to_mtd (&flctl->chip));pm_runtime_disable (&pdev->dev);return 0 ;
include/linux/mtd/sh_flctl.h +1 -2
@@ -143,7 +143,6 @@ enum flctl_ecc_res_t {struct dma_chan ;struct sh_flctl { -struct mtd_info mtd;struct nand_chip chip;struct platform_device *pdev;struct dev_pm_qos_request pm_qos;
@@ -186,7 +185,7 @@ struct sh_flctl_platform_data {static inline struct sh_flctl *mtd_to_flctl (struct mtd_info *mtdinfo) { - return container_of(mtdinfo, struct sh_flctl, mtd); + return container_of(mtd_to_nand(mtdinfo), struct sh_flctl, chip); }#endif /* __SH_FLCTL_H__ */
Signature · 1 line
2.1.4
PATCH v4 40/58 mtd: nand: sharpsl: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/sharpsl.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
drivers/mtd/nand/sharpsl.c +13 -9
@@ -29,13 +29,15 @@#include <asm/mach-types.h> struct sharpsl_nand { -struct mtd_info mtd;struct nand_chip chip;void __iomem *io; }; -#define mtd_to_sharpsl (_mtd) container_of(_mtd, struct sharpsl_nand, mtd) +static inline struct sharpsl_nand *mtd_to_sharpsl (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct sharpsl_nand, chip); +}/* register offset */ #define ECCLPLB 0x00/* line parity 7 - 0 bit */
@@ -109,6 +111,7 @@ static int sharpsl_nand_calculate_ecc(struct mtd_info *mtd, const u_char * dat,static int sharpsl_nand_probe (struct platform_device *pdev) {struct nand_chip *this; +struct mtd_info *mtd;struct resource *r;int err =0 ;struct sharpsl_nand *sharpsl;
@@ -143,8 +146,9 @@ static int sharpsl_nand_probe(struct platform_device *pdev) this = (struct nand_chip *)(&sharpsl->chip);/* Link the private data with the MTD structure */ - sharpsl->mtd.priv = this; - sharpsl->mtd.dev.parent = &pdev->dev; + mtd =nand_to_mtd (this); + mtd->priv = this; + mtd->dev.parent = &pdev->dev;platform_set_drvdata (pdev, sharpsl);
@@ -173,14 +177,14 @@ static int sharpsl_nand_probe(struct platform_device *pdev) this->ecc.correct = nand_correct_data;/* Scan to find existence of the device */ - err =nand_scan (&sharpsl->mtd,1 ); + err =nand_scan (mtd,1 );if (err) goto err_scan;/* Register the partitions */ - sharpsl->mtd.name ="sharpsl-nand" ; + mtd->name ="sharpsl-nand" ; - err =mtd_device_parse_register (&sharpsl->mtd,NULL ,NULL , + err =mtd_device_parse_register (mtd,NULL ,NULL , data->partitions, data->nr_partitions);if (err) goto err_add;
@@ -189,7 +193,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)return 0 ; err_add: -nand_release (&sharpsl->mtd); +nand_release (mtd); err_scan:iounmap (sharpsl->io);
@@ -207,7 +211,7 @@ static int sharpsl_nand_remove(struct platform_device *pdev)struct sharpsl_nand *sharpsl =platform_get_drvdata (pdev);/* Release resources, unregister device */ -nand_release (&sharpsl->mtd); +nand_release (nand_to_mtd (&sharpsl->chip));iounmap (sharpsl->io);
Signature · 1 line
2.1.4
PATCH v4 41/58 mtd: nand: socrates: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/socrates_nand.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/mtd/nand/socrates_nand.c +2 -3
@@ -30,7 +30,6 @@struct socrates_nand_host {struct nand_chip nand_chip; -struct mtd_info mtd;void __iomem *io_base;struct device *dev; };
@@ -159,8 +158,8 @@ static int socrates_nand_probe(struct platform_device *ofdev)return -EIO ; } - mtd = &host->mtd; nand_chip = &host->nand_chip; + mtd =nand_to_mtd (nand_chip); host->dev = &ofdev->dev; nand_chip->priv = host;/* link the private data structures */
@@ -216,7 +215,7 @@ out:static int socrates_nand_remove (struct platform_device *ofdev) {struct socrates_nand_host *host =dev_get_drvdata (&ofdev->dev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->chip);nand_release (mtd);
Signature · 1 line
2.1.4
PATCH v5 41/58 mtd: nand: socrates: use the mtd instance embedded in struct nand_chip
struct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes since v4:
- fix build error
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/socrates_nand.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/mtd/nand/socrates_nand.c +2 -3
@@ -30,7 +30,6 @@struct socrates_nand_host {struct nand_chip nand_chip; -struct mtd_info mtd;void __iomem *io_base;struct device *dev; };
@@ -159,8 +158,8 @@ static int socrates_nand_probe(struct platform_device *ofdev)return -EIO ; } - mtd = &host->mtd; nand_chip = &host->nand_chip; + mtd =nand_to_mtd (nand_chip); host->dev = &ofdev->dev; nand_chip->priv = host;/* link the private data structures */
@@ -216,7 +215,7 @@ out:static int socrates_nand_remove (struct platform_device *ofdev) {struct socrates_nand_host *host =dev_get_drvdata (&ofdev->dev); -struct mtd_info *mtd = &host->mtd; +struct mtd_info *mtd =nand_to_mtd (&host->nand_chip);nand_release (mtd);
Signature · 1 line
2.1.4
PATCH v4 42/58 mtd: nand: sunxi: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/sunxi_nand.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/mtd/nand/sunxi_nand.c +6 -7
@@ -234,7 +234,6 @@ struct sunxi_nand_hw_ecc {struct sunxi_nand_chip {struct list_head node;struct nand_chip nand; -struct mtd_info mtd;unsigned long clk_rate;u32 timing_cfg;u32 timing_ctl;
@@ -991,6 +990,7 @@ static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,static int sunxi_nand_chip_init_timings (struct sunxi_nand_chip *chip,struct device_node *np) { +struct mtd_info *mtd =nand_to_mtd (&chip->nand);const struct nand_sdr_timings *timings;int ret;int mode;
@@ -1008,12 +1008,11 @@ static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip, feature[0 ] = mode;for (i =0 ; i < chip->nsels; i++) { - chip->nand.select_chip (&chip->mtd, i); - ret = chip->nand.onfi_set_features (&chip->mtd, - &chip->nand, + chip->nand.select_chip (mtd, i); + ret = chip->nand.onfi_set_features (mtd, &chip->nand,ONFI_FEATURE_ADDR_TIMING_MODE , feature); - chip->nand.select_chip (&chip->mtd,-1 ); + chip->nand.select_chip (mtd,-1 );if (ret)return ret; }
@@ -1336,7 +1335,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, nand->write_buf = sunxi_nfc_write_buf; nand->read_byte = sunxi_nfc_read_byte; - mtd = &chip->mtd; + mtd =nand_to_mtd (nand); mtd->dev.parent = dev; mtd->priv = nand;
@@ -1407,7 +1406,7 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)while (!list_empty (&nfc->chips)) { chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, node); -nand_release (&chip->mtd); +nand_release (nand_to_mtd (&chip->nand));sunxi_nand_ecc_cleanup (&chip->nand.ecc);list_del (&chip->node); }
Signature · 1 line
2.1.4
PATCH v4 43/58 mtd: nand: tmio: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/tmio_nand.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/mtd/nand/tmio_nand.c +6 -4
@@ -103,7 +103,6 @@/*--------------------------------------------------------------------------*/ struct tmio_nand { -struct mtd_info mtd;struct nand_chip chip;struct platform_device *dev;
@@ -119,7 +118,10 @@ struct tmio_nand { unsigned read_good:1; }; -#define mtd_to_tmio (m) container_of(m, struct tmio_nand, mtd) +static inline struct tmio_nand *mtd_to_tmio (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct tmio_nand, chip); +}/*--------------------------------------------------------------------------*/
@@ -378,8 +380,8 @@ static int tmio_probe(struct platform_device *dev) tmio->dev = dev;platform_set_drvdata (dev, tmio); - mtd = &tmio->mtd; nand_chip = &tmio->chip; + mtd =nand_to_mtd (nand_chip); mtd->priv = nand_chip; mtd->name ="tmio-nand" ; mtd->dev.parent = &dev->dev;
@@ -456,7 +458,7 @@ static int tmio_remove(struct platform_device *dev) {struct tmio_nand *tmio =platform_get_drvdata (dev); -nand_release (&tmio->mtd); +nand_release (nand_to_mtd (&tmio->chip));tmio_hw_stop (dev, tmio);return 0 ; }
Signature · 1 line
2.1.4
PATCH v4 44/58 mtd: nand: txx9ndfmc: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/txx9ndfmc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/mtd/nand/txx9ndfmc.c +1 -2
@@ -63,7 +63,6 @@struct txx9ndfmc_priv {struct platform_device *dev;struct nand_chip chip; -struct mtd_info mtd;int cs;const char *mtdname; };
@@ -322,7 +321,7 @@ static int __init txx9ndfmc_probe(struct platform_device *dev)if (!txx9_priv)continue ; chip = &txx9_priv->chip; - mtd = &txx9_priv->mtd; + mtd =nand_to_mtd (chip); mtd->dev.parent = &dev->dev; mtd->priv = chip;
Signature · 1 line
2.1.4
PATCH v4 45/58 mtd: nand: vf610: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Make use of this mtd instance.
---
Changes generated with the following coccinelle script
--->8---
virtual patch
@fix1@
identifier __chipfield, __mtdfield;
type __type;
@@
(
__type {
...
struct nand_chip __chipfield;
...
- struct mtd_info __mtdfield;
...
};
|
__type {
...
- struct mtd_info __mtdfield;
...
struct nand_chip __chipfield;
...
};)
@fix2 depends on fix1@
identifier fix1.__chipfield, fix1.__mtdfield;
identifier __subfield;
type fix1.__type;__type *__priv;
@@
(
- __priv->__mtdfield.__subfield
+ nand_to_mtd(&__priv->__chipfield)->__subfield
|
- &(__priv->__mtdfield)
+ nand_to_mtd(&__priv->__chipfield)
)
--->8---
--- drivers/mtd/nand/vf610_nfc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/nand/vf610_nfc.c +5 -3
@@ -156,7 +156,6 @@ enum vf610_nfc_variant { };struct vf610_nfc { -struct mtd_info mtd;struct nand_chip chip;struct device *dev;void __iomem *regs;
@@ -171,7 +170,10 @@ struct vf610_nfc {u32 ecc_mode; }; -#define mtd_to_nfc (_mtd) container_of(_mtd, struct vf610_nfc, mtd) +static inline struct vf610_nfc *mtd_to_nfc (struct mtd_info *mtd) +{ + return container_of(mtd_to_nand(mtd), struct vf610_nfc, chip); +}static struct nand_ecclayout vf610_nfc_ecc45 = { .eccbytes =45 ,
@@ -674,8 +676,8 @@ static int vf610_nfc_probe(struct platform_device *pdev)return -ENOMEM ; nfc->dev = &pdev->dev; - mtd = &nfc->mtd; chip = &nfc->chip; + mtd =nand_to_mtd (chip); mtd->priv = chip; mtd->owner =THIS_MODULE ;
Signature · 1 line
2.1.4
PATCH v4 46/58 mtd: nand: update the documentation to reflect framework changes
In reply to Boris BrezillonThe MTD device is now directly embedded in the nand_chip struct. Update the mtdnand documentation to mention this aspect and fix the different examples.
--- Documentation/DocBook/mtdnand.tmpl | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-)
Documentation/DocBook/mtdnand.tmpl +15 -16
@@ -162,12 +162,15 @@ <sect1 id="Basic_defines"> <title>Basic defines</title> <para> - At least you have to provide a mtd structure and - a storage for the ioremap'ed chip address. - You can allocate the mtd structure using kmalloc - or you can allocate it statically. - In case of static allocation you have to allocate - a nand_chip structure too. + At least you have to provide a nand_chip structure + and a storage for the ioremap'ed chip address. + You can allocate the nand_chip structure using + kmalloc or you can allocate it statically. + The NAND chip structure embeds an mtd structure + which will be registered to the MTD subsystem. + You can extract a pointer to the mtd structure + from a nand_chip pointer using the nand_to_mtd() + helper. </para> <para> Kmalloc based example
@@ -180,7 +183,6 @@ static void __iomem *baseaddr; Static example </para> <programlisting> -static struct mtd_info board_mtd; static struct nand_chip board_chip; static void __iomem *baseaddr; </programlisting>
@@ -274,13 +276,15 @@ static int __init board_init (void) int err = 0; /* Allocate memory for MTD device structure and private data */ - board_mtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL); - if (!board_mtd) { + this = kzalloc(sizeof(struct nand_chip), GFP_KERNEL); + if (!this) { printk ("Unable to allocate NAND MTD device structure.\n"); err = -ENOMEM; goto out; } + board_mtd = nand_to_mtd(this); + /* map physical address */ baseaddr = ioremap(CHIP_PHYSICAL_ADDRESS, 1024); if (!baseaddr) {
@@ -289,11 +293,6 @@ static int __init board_init (void) goto out_mtd; } - /* Get pointer to private data */ - this = (struct nand_chip *) (); - /* Link the private data with the MTD structure */ - board_mtd->priv = this; - /* Set address of NAND IO lines */ this->IO_ADDR_R = baseaddr; this->IO_ADDR_W = baseaddr;
@@ -317,7 +316,7 @@ static int __init board_init (void) out_ior: iounmap(baseaddr); out_mtd: - kfree (board_mtd); + kfree (this); out: return err; }
@@ -343,7 +342,7 @@ static void __exit board_cleanup (void) iounmap(baseaddr); /* Free the MTD device structure */ - kfree (board_mtd); + kfree (mtd_to_nand(board_mtd)); } module_exit(board_cleanup); #endif
Signature · 1 line
2.1.4
PATCH v4 47/58 staging: mt29f_spinand: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device, use it instead of allocating a new one.
--- drivers/staging/mt29f_spinand/mt29f_spinand.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/staging/mt29f_spinand/mt29f_spinand.c +1 -3
@@ -903,9 +903,7 @@ static int spinand_probe(struct spi_device *spi_nand) chip->options |=NAND_CACHEPRG ; chip->select_chip = spinand_select_chip; - mtd =devm_kzalloc (&spi_nand->dev,sizeof (struct mtd_info ),GFP_KERNEL ); -if (!mtd) -return -ENOMEM ; + mtd =nand_to_mtd (chip);dev_set_drvdata (&spi_nand->dev, mtd);
Signature · 1 line
2.1.4
PATCH v4 48/58 cris: nand: use the mtd instance embedded in struct nand_chip
In reply to Boris Brezillonstruct nand_chip now embeds an mtd device. Patch all drivers to make use of this mtd instance instead of using the instance embedded in their private struct or dynamically allocated.
---
Most of those changes were generated with the coccinelle script added in commit c671312 "coccinelle: nand: detect and correct drivers embedding an mtd_info object"
--- arch/cris/arch-v32/drivers/mach-a3/nandflash.c | 3 +-- arch/cris/arch-v32/drivers/mach-fs/nandflash.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
arch/cris/arch-v32/drivers/mach-a3/nandflash.c +1 -2
@@ -36,7 +36,6 @@#define CE_BIT 12struct mtd_info_wrapper { -struct mtd_info info;struct nand_chip chip; };
@@ -148,7 +147,7 @@ struct mtd_info *__init crisv32_nand_flash_probe(void)/* Get pointer to private data */ this = &wrapper->chip; - crisv32_mtd = &wrapper->info; + crisv32_mtd =nand_to_mtd (this);/* Link the private data with the MTD structure */ crisv32_mtd->priv = this;
arch/cris/arch-v32/drivers/mach-fs/nandflash.c +1 -2
@@ -31,7 +31,6 @@#define BY_BIT 7struct mtd_info_wrapper { -struct mtd_info info;struct nand_chip chip; };
@@ -129,7 +128,7 @@ struct mtd_info *__init crisv32_nand_flash_probe(void)/* Get pointer to private data */ this = &wrapper->chip; - crisv32_mtd = &wrapper->info; + crisv32_mtd =nand_to_mtd (this); pa_oe.oe |=1 <<CE_BIT ; pa_oe.oe |=1 <<ALE_BIT ;
Signature · 1 line
2.1.4
PATCH v4 49/58 mtd: nand: update mtd_to_nand()
In reply to Boris BrezillonNow that all drivers are using the mtd instance embedded in the nand_chip struct we can safely update the mtd_to_nand() implementation to use the container_of macro instead of returning the content of mtd->priv. This will allow us to remove mtd->priv = chip assignments done in all NAND controller drivers.
--- include/linux/mtd/nand.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/mtd/nand.h +1 -1
@@ -734,7 +734,7 @@ static inline struct device_node *nand_get_flash_node(struct nand_chip *chip)static inline struct nand_chip *mtd_to_nand (struct mtd_info *mtd) { -return mtd->priv; + return container_of(mtd, struct nand_chip, mtd); }static inline struct mtd_info *nand_to_mtd (struct nand_chip *chip)
Signature · 1 line
2.1.4
PATCH v4 50/58 mtd: nand: remove useless mtd->priv = chip assignments
In reply to Boris Brezillonmtd_to_nand() now uses the container_of() approach to transform an mtd_info pointer into a nand_chip one. Drop useless mtd->priv assignments from NAND controller drivers.
---
Patch generated with the following coccinelle script:
---8<----
virtual patch
@@
struct mtd_info m;
struct mtd_info *mp;
struct nand_chip *c;
@@
(
-(m).priv = c;
|
-(mp)->priv = c;
|
-(mp)->priv = (void *)c;
)
---8<----
--- drivers/mtd/nand/ams-delta.c | 3 --- drivers/mtd/nand/atmel_nand.c | 1 - drivers/mtd/nand/au1550nd.c | 1 - drivers/mtd/nand/bcm47xxnflash/main.c | 1 - drivers/mtd/nand/bf5xx_nand.c | 1 - drivers/mtd/nand/brcmnand/brcmnand.c | 1 - drivers/mtd/nand/cafe_nand.c | 1 - drivers/mtd/nand/cmx270_nand.c | 1 - drivers/mtd/nand/cs553x_nand.c | 1 - drivers/mtd/nand/davinci_nand.c | 1 - drivers/mtd/nand/denali.c | 1 - drivers/mtd/nand/diskonchip.c | 1 - drivers/mtd/nand/docg4.c | 1 - drivers/mtd/nand/fsl_elbc_nand.c | 1 - drivers/mtd/nand/fsl_ifc_nand.c | 1 - drivers/mtd/nand/fsl_upm.c | 1 - drivers/mtd/nand/fsmc_nand.c | 1 - drivers/mtd/nand/gpio.c | 1 - drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 1 - drivers/mtd/nand/hisi504_nand.c | 1 - drivers/mtd/nand/jz4740_nand.c | 1 - drivers/mtd/nand/lpc32xx_mlc.c | 1 - drivers/mtd/nand/lpc32xx_slc.c | 1 - drivers/mtd/nand/mpc5121_nfc.c | 1 - drivers/mtd/nand/mxc_nand.c | 1 - drivers/mtd/nand/nandsim.c | 1 - drivers/mtd/nand/ndfc.c | 1 - drivers/mtd/nand/nuc900_nand.c | 1 - drivers/mtd/nand/omap2.c | 1 - drivers/mtd/nand/orion_nand.c | 1 - drivers/mtd/nand/pasemi_nand.c | 1 - drivers/mtd/nand/plat_nand.c | 1 - drivers/mtd/nand/pxa3xx_nand.c | 1 - drivers/mtd/nand/r852.c | 1 - drivers/mtd/nand/s3c2410.c | 2 -- drivers/mtd/nand/sh_flctl.c | 1 - drivers/mtd/nand/sharpsl.c | 1 - drivers/mtd/nand/socrates_nand.c | 1 - drivers/mtd/nand/sunxi_nand.c | 1 - drivers/mtd/nand/tmio_nand.c | 1 - drivers/mtd/nand/txx9ndfmc.c | 2 -- drivers/mtd/nand/vf610_nfc.c | 1 - 42 files changed, 46 deletions(-)
drivers/mtd/nand/ams-delta.c +0 -3
@@ -193,9 +193,6 @@ static int ams_delta_init(struct platform_device *pdev) ams_delta_mtd =nand_to_mtd (this); ams_delta_mtd->owner =THIS_MODULE ; -/* Link the private data with the MTD structure */ - ams_delta_mtd->priv = this; -/* * Don't try to request the memory region from here, * it should have been already requested from the
drivers/mtd/nand/atmel_nand.c +0 -1
@@ -2128,7 +2128,6 @@ static int atmel_nand_probe(struct platform_device *pdev) } nand_chip->priv = host;/* link the private data structures */ - mtd->priv = nand_chip; mtd->dev.parent = &pdev->dev;/* Set address of NAND IO lines */
drivers/mtd/nand/au1550nd.c +0 -1
@@ -441,7 +441,6 @@ static int au1550nd_probe(struct platform_device *pdev) this = &ctx->chip; mtd =nand_to_mtd (this); - mtd->priv = this; mtd->dev.parent = &pdev->dev;/* figure out which CS# r->start belongs to */
drivers/mtd/nand/bcm47xxnflash/main.c +0 -1
@@ -37,7 +37,6 @@ static int bcm47xxnflash_probe(struct platform_device *pdev) b47n->nand_chip.priv = b47n; mtd =nand_to_mtd (&b47n->nand_chip); mtd->dev.parent = &pdev->dev; - mtd->priv = &b47n->nand_chip;/* Required */ b47n->cc = container_of(nflash, struct bcma_drv_cc, nflash);if (b47n->cc->core->bus->chipinfo.id ==BCMA_CHIP_ID_BCM4706 ) {
drivers/mtd/nand/bf5xx_nand.c +0 -1
@@ -782,7 +782,6 @@ static int bf5xx_nand_probe(struct platform_device *pdev) chip->chip_delay =0 ;/* initialise mtd info data struct */ - mtd->priv = chip; mtd->dev.parent = &pdev->dev;/* initialise the hardware */
drivers/mtd/nand/brcmnand/brcmnand.c +0 -1
@@ -1920,7 +1920,6 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)nand_set_flash_node (chip, dn); chip->priv = host; - mtd->priv = chip; mtd->name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"brcmnand.%d" , host->cs); mtd->owner =THIS_MODULE ;
drivers/mtd/nand/cafe_nand.c +0 -1
@@ -611,7 +611,6 @@ static int cafe_nand_probe(struct pci_dev *pdev, mtd =nand_to_mtd (&cafe->nand); mtd->dev.parent = &pdev->dev; - mtd->priv = &cafe->nand; cafe->nand.priv = cafe; cafe->pdev = pdev;
drivers/mtd/nand/cmx270_nand.c +0 -1
@@ -177,7 +177,6 @@ static int __init cmx270_init(void)/* Link the private data with the MTD structure */ cmx270_nand_mtd->owner =THIS_MODULE ; - cmx270_nand_mtd->priv = this;/* insert callbacks */ this->IO_ADDR_R = cmx270_nand_io;
drivers/mtd/nand/cs553x_nand.c +0 -1
@@ -206,7 +206,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) new_mtd =nand_to_mtd (this);/* Link the private data with the MTD structure */ - new_mtd->priv = this; new_mtd->owner =THIS_MODULE ;/* map physical address */
drivers/mtd/nand/davinci_nand.c +0 -1
@@ -685,7 +685,6 @@ static int nand_davinci_probe(struct platform_device *pdev) info->vaddr = vaddr; mtd =nand_to_mtd (&info->chip); - mtd->priv = &info->chip; mtd->dev.parent = &pdev->dev;nand_set_flash_node (&info->chip, pdev->dev.of_node);
drivers/mtd/nand/denali.c +0 -1
@@ -1470,7 +1470,6 @@ int denali_init(struct denali_nand_info *denali)/* now that our ISR is registered, we can enable interrupts */ denali_set_intr_modes (denali, true); mtd->name ="denali-nand" ; - mtd->priv = &denali->nand;/* register the driver with the NAND core subsystem */ denali->nand.select_chip = denali_select_chip;
drivers/mtd/nand/diskonchip.c +0 -1
@@ -1569,7 +1569,6 @@ static int __init doc_probe(unsigned long physadr) nand->bbt_td = (struct nand_bbt_descr *) (doc +1 ); nand->bbt_md = nand->bbt_td +1 ; - mtd->priv = nand; mtd->owner =THIS_MODULE ; nand->priv = doc;
drivers/mtd/nand/docg4.c +0 -1
@@ -1314,7 +1314,6 @@ static int __init probe_docg4(struct platform_device *pdev) mtd =nand_to_mtd (nand); doc = (struct docg4_priv *) (nand +1 ); - mtd->priv = nand; nand->priv = doc; mtd->dev.parent = &pdev->dev; doc->virtadr = virtadr;
drivers/mtd/nand/fsl_elbc_nand.c +0 -1
@@ -746,7 +746,6 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)dev_dbg (priv->dev,"eLBC Set Information for bank %d\n" , priv->bank);/* Fill in fsl_elbc_mtd structure */ - mtd->priv = chip; mtd->dev.parent = priv->dev;nand_set_flash_node (chip, priv->dev->of_node);
drivers/mtd/nand/fsl_ifc_nand.c +0 -1
@@ -881,7 +881,6 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)u32 csor;/* Fill in fsl_ifc_mtd structure */ - mtd->priv = chip; mtd->dev.parent = priv->dev;nand_set_flash_node (chip, priv->dev->of_node);
drivers/mtd/nand/fsl_upm.c +0 -1
@@ -176,7 +176,6 @@ static int fun_chip_init(struct fsl_upm_nand *fun,if (fun->rnb_gpio[0 ] >=0 ) fun->chip.dev_ready = fun_chip_ready; - mtd->priv = &fun->chip; mtd->dev.parent = fun->dev; flash_np =of_get_next_child (upm_np,NULL );
drivers/mtd/nand/fsmc_nand.c +0 -1
@@ -1009,7 +1009,6 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)/* Link all private pointers */ mtd =nand_to_mtd (&host->nand); nand = &host->nand; - mtd->priv = nand; nand->priv = host;nand_set_flash_node (nand, np);
drivers/mtd/nand/gpio.c +0 -1
@@ -278,7 +278,6 @@ static int gpio_nand_probe(struct platform_device *pdev) chip->cmd_ctrl = gpio_nand_cmd_ctrl; mtd =nand_to_mtd (chip); - mtd->priv = chip; mtd->dev.parent = &pdev->dev;platform_set_drvdata (pdev, gpiomtd);
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +0 -1
@@ -1893,7 +1893,6 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) this->current_chip =-1 ;/* init the MTD data structures */ - mtd->priv = chip; mtd->name ="gpmi-nand" ; mtd->dev.parent = this->dev;
drivers/mtd/nand/hisi504_nand.c +0 -1
@@ -735,7 +735,6 @@ static int hisi_nfc_probe(struct platform_device *pdev) goto err_res; } - mtd->priv = chip; mtd->name ="hisi_nand" ; mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/jz4740_nand.c +0 -1
@@ -433,7 +433,6 @@ static int jz_nand_probe(struct platform_device *pdev) chip = &nand->chip; mtd =nand_to_mtd (chip); - mtd->priv = chip; mtd->dev.parent = &pdev->dev; mtd->name ="jz4740-nand" ;
drivers/mtd/nand/lpc32xx_mlc.c +0 -1
@@ -681,7 +681,6 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) nand_chip->priv = host;/* link the private data structures */ nand_set_flash_node (nand_chip, pdev->dev.of_node); - mtd->priv = nand_chip; mtd->dev.parent = &pdev->dev;/* Get NAND clock */
drivers/mtd/nand/lpc32xx_slc.c +0 -1
@@ -802,7 +802,6 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) mtd =nand_to_mtd (chip); chip->priv = host;nand_set_flash_node (chip, pdev->dev.of_node); - mtd->priv = chip; mtd->owner =THIS_MODULE ; mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/mpc5121_nfc.c +0 -1
@@ -656,7 +656,6 @@ static int mpc5121_nfc_probe(struct platform_device *op) chip = &prv->chip; mtd =nand_to_mtd (chip); - mtd->priv = chip; mtd->dev.parent = dev; chip->priv = prv;nand_set_flash_node (chip, dn);
drivers/mtd/nand/mxc_nand.c +0 -1
@@ -1514,7 +1514,6 @@ static int mxcnd_probe(struct platform_device *pdev)/* structures must be linked */ this = &host->nand; mtd =nand_to_mtd (this); - mtd->priv = this; mtd->dev.parent = &pdev->dev; mtd->name =DRIVER_NAME ;
drivers/mtd/nand/nandsim.c +0 -1
@@ -2243,7 +2243,6 @@ static int __init ns_init_module(void)return -ENOMEM ; } nsmtd =nand_to_mtd (chip); - nsmtd->priv = (void *)chip; nand = (struct nandsim *)(chip +1 ); chip->priv = (void *)nand;
drivers/mtd/nand/ndfc.c +0 -1
@@ -167,7 +167,6 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, chip->ecc.strength =1 ; chip->priv = ndfc; - mtd->priv = chip; mtd->dev.parent = &ndfc->ofdev->dev; flash_np =of_get_next_child (node,NULL );
drivers/mtd/nand/nuc900_nand.c +0 -1
@@ -245,7 +245,6 @@ static int nuc900_nand_probe(struct platform_device *pdev) chip = &(nuc900_nand->chip); mtd =nand_to_mtd (chip); - mtd->priv = chip; mtd->dev.parent = &pdev->dev;spin_lock_init (&nuc900_nand->lock);
drivers/mtd/nand/omap2.c +0 -1
@@ -1672,7 +1672,6 @@ static int omap_nand_probe(struct platform_device *pdev) info->ecc_opt = pdata->ecc_opt; nand_chip = &info->nand; mtd =nand_to_mtd (nand_chip); - mtd->priv = &info->nand; mtd->dev.parent = &pdev->dev; nand_chip->ecc.priv =NULL ;nand_set_flash_node (nand_chip, pdata->of_node);
drivers/mtd/nand/orion_nand.c +0 -1
@@ -122,7 +122,6 @@ static int __init orion_nand_probe(struct platform_device *pdev) board =dev_get_platdata (&pdev->dev); } - mtd->priv = nc; mtd->dev.parent = &pdev->dev; nc->priv = board;
drivers/mtd/nand/pasemi_nand.c +0 -1
@@ -121,7 +121,6 @@ static int pasemi_nand_probe(struct platform_device *ofdev) pasemi_nand_mtd =nand_to_mtd (chip);/* Link the private data with the MTD structure */ - pasemi_nand_mtd->priv = chip; pasemi_nand_mtd->dev.parent = &ofdev->dev; chip->IO_ADDR_R =of_iomap (np,0 );
drivers/mtd/nand/plat_nand.c +0 -1
@@ -59,7 +59,6 @@ static int plat_nand_probe(struct platform_device *pdev) data->chip.priv = &data;nand_set_flash_node (&data->chip, pdev->dev.of_node); mtd =nand_to_mtd (&data->chip); - mtd->priv = &data->chip; mtd->dev.parent = &pdev->dev; data->chip.IO_ADDR_R = data->io_base;
drivers/mtd/nand/pxa3xx_nand.c +0 -1
@@ -1709,7 +1709,6 @@ static int alloc_nand_resource(struct platform_device *pdev) info->host[cs] = host; host->cs = cs; host->info_data = info; - mtd->priv = chip; mtd->dev.parent = &pdev->dev;/* FIXME: all chips use the same device tree partitions */ nand_set_flash_node (chip, np);
drivers/mtd/nand/r852.c +0 -1
@@ -638,7 +638,6 @@ static int r852_register_nand_device(struct r852_device *dev)WARN_ON (dev->card_registred); - mtd->priv = dev->chip; mtd->dev.parent = &dev->pci_dev->dev;if (dev->readonly)
drivers/mtd/nand/s3c2410.c +0 -2
@@ -788,7 +788,6 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, struct s3c2410_nand_set *set) {struct nand_chip *chip = &nmtd->chip; -struct mtd_info *mtd =nand_to_mtd (chip);void __iomem *regs = info->regs; chip->write_buf = s3c2410_nand_write_buf;
@@ -834,7 +833,6 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, chip->IO_ADDR_R = chip->IO_ADDR_W; nmtd->info = info; - mtd->priv = chip; nmtd->set = set;#ifdef CONFIG_MTD_NAND_S3C2410_HWECC
drivers/mtd/nand/sh_flctl.c +0 -1
@@ -1123,7 +1123,6 @@ static int flctl_probe(struct platform_device *pdev) nand = &flctl->chip; flctl_mtd =nand_to_mtd (nand);nand_set_flash_node (nand, pdev->dev.of_node); - flctl_mtd->priv = nand; flctl_mtd->dev.parent = &pdev->dev; flctl->pdev = pdev; flctl->hwecc = pdata->has_hwecc;
drivers/mtd/nand/sharpsl.c +0 -1
@@ -147,7 +147,6 @@ static int sharpsl_nand_probe(struct platform_device *pdev)/* Link the private data with the MTD structure */ mtd =nand_to_mtd (this); - mtd->priv = this; mtd->dev.parent = &pdev->dev;platform_set_drvdata (pdev, sharpsl);
drivers/mtd/nand/socrates_nand.c +0 -1
@@ -164,7 +164,6 @@ static int socrates_nand_probe(struct platform_device *ofdev) nand_chip->priv = host;/* link the private data structures */ nand_set_flash_node (nand_chip, ofdev->dev.of_node); - mtd->priv = nand_chip; mtd->name ="socrates_nand" ; mtd->dev.parent = &ofdev->dev;
drivers/mtd/nand/sunxi_nand.c +0 -1
@@ -1337,7 +1337,6 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, mtd =nand_to_mtd (nand); mtd->dev.parent = dev; - mtd->priv = nand; ret =nand_scan_ident (mtd, nsels,NULL );if (ret)
drivers/mtd/nand/tmio_nand.c +0 -1
@@ -382,7 +382,6 @@ static int tmio_probe(struct platform_device *dev)platform_set_drvdata (dev, tmio); nand_chip = &tmio->chip; mtd =nand_to_mtd (nand_chip); - mtd->priv = nand_chip; mtd->name ="tmio-nand" ; mtd->dev.parent = &dev->dev;
drivers/mtd/nand/txx9ndfmc.c +0 -2
@@ -324,8 +324,6 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) mtd =nand_to_mtd (chip); mtd->dev.parent = &dev->dev; - mtd->priv = chip; - chip->read_byte = txx9ndfmc_read_byte; chip->read_buf = txx9ndfmc_read_buf; chip->write_buf = txx9ndfmc_write_buf;
drivers/mtd/nand/vf610_nfc.c +0 -1
@@ -679,7 +679,6 @@ static int vf610_nfc_probe(struct platform_device *pdev) chip = &nfc->chip; mtd =nand_to_mtd (chip); - mtd->priv = chip; mtd->owner =THIS_MODULE ; mtd->dev.parent = nfc->dev; mtd->name =DRV_NAME ;
Signature · 1 line
2.1.4
PATCH v4 51/58 cris: nand: remove useless mtd->priv = chip assignments
In reply to Boris Brezillonmtd_to_nand() now uses the container_of() approach to transform an mtd_info pointer into a nand_chip one. Drop useless mtd->priv assignments from NAND controller drivers.
---
Patch generated with the following coccinelle script:
---8<----
virtual patch
@@
struct mtd_info m;
struct mtd_info *mp;
struct nand_chip *c;
@@
(
-(m).priv = c;
|
-(mp)->priv = c;
|
-(mp)->priv = (void *)c;
)
---8<----
--- arch/cris/arch-v32/drivers/mach-a3/nandflash.c | 3 --- arch/cris/arch-v32/drivers/mach-fs/nandflash.c | 3 --- 2 files changed, 6 deletions(-)
arch/cris/arch-v32/drivers/mach-a3/nandflash.c +0 -3
@@ -149,9 +149,6 @@ struct mtd_info *__init crisv32_nand_flash_probe(void) this = &wrapper->chip; crisv32_mtd =nand_to_mtd (this); -/* Link the private data with the MTD structure */ - crisv32_mtd->priv = this; -/* Set address of NAND IO lines */ this->IO_ADDR_R = read_cs; this->IO_ADDR_W = write_cs;
arch/cris/arch-v32/drivers/mach-fs/nandflash.c +0 -3
@@ -140,9 +140,6 @@ struct mtd_info *__init crisv32_nand_flash_probe(void) bif_cfg.gated_csp1 = regk_bif_core_wr;REG_WR (bif_core, regi_bif_core, rw_grp3_cfg, bif_cfg); -/* Link the private data with the MTD structure */ - crisv32_mtd->priv = this; -/* Set address of NAND IO lines */ this->IO_ADDR_R = read_cs; this->IO_ADDR_W = write_cs;
Signature · 1 line
2.1.4
PATCH v4 52/58 staging: mt29f_spinand: remove useless mtd->priv = chip assignment
In reply to Boris Brezillonmtd_to_nand() now uses the container_of() approach to transform an mtd_info pointer into a nand_chip one. Drop useless mtd->priv assignments from NAND controller drivers.
---
Patch generated with the following coccinelle script:
---8<----
virtual patch
@@
struct mtd_info m;
struct mtd_info *mp;
struct nand_chip *c;
@@
(
-(m).priv = c;
|
-(mp)->priv = c;
|
-(mp)->priv = (void *)c;
)
---8<----
--- drivers/staging/mt29f_spinand/mt29f_spinand.c | 1 - 1 file changed, 1 deletion(-)
drivers/staging/mt29f_spinand/mt29f_spinand.c +0 -1
@@ -907,7 +907,6 @@ static int spinand_probe(struct spi_device *spi_nand)dev_set_drvdata (&spi_nand->dev, mtd); - mtd->priv = chip; mtd->dev.parent = &spi_nand->dev; mtd->oobsize =64 ;
Signature · 1 line
2.1.4
PATCH v4 53/58 mtd: nand: simplify nand_dt_init() usage
In reply to Boris Brezillonnand_dt_init() function requires 3 arguments where it actually needs one (dn and mtd can both be retrieved from chip). Drop these parameters.
Testing for dn != NULL inside nand_dt_init() also helps simplifying the caller code.
--- drivers/mtd/nand/nand_base.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/mtd/nand/nand_base.c +11 -10
@@ -3937,11 +3937,17 @@ ident_done:return type; } -static int nand_dt_init (struct mtd_info *mtd,struct nand_chip *chip, -struct device_node *dn) +static int nand_dt_init (struct nand_chip *chip) { +struct device_node *dn =nand_get_flash_node (chip);int ecc_mode, ecc_strength, ecc_step; +if (!dn) +return 0 ; + +/* MTD can automatically handle DT partitions, etc. */ +mtd_set_of_node (nand_to_mtd (chip), dn); +if (of_get_nand_bus_width (dn) ==16 ) chip->options |=NAND_BUSWIDTH_16 ;
@@ -3989,14 +3995,9 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,struct nand_flash_dev *type;int ret; -if (nand_get_flash_node (chip)) { -/* MTD can automatically handle DT partitions, etc. */ -mtd_set_of_node (mtd,nand_get_flash_node (chip)); - - ret =nand_dt_init (mtd, chip,nand_get_flash_node (chip)); -if (ret) -return ret; - } + ret =nand_dt_init (chip); +if (ret) +return ret;/* Set the default functions */ nand_set_defaults (chip, chip->options &NAND_BUSWIDTH_16 );
Signature · 1 line
2.1.4
PATCH v4 54/58 mtd: nand: kill the chip->flash_node field
In reply to Boris BrezillonNow that the nand_chip struct directly embeds an mtd_info struct we can get rid of the ->flash_node field and forward set/get_flash_node requests to the MTD layer.
As a side effect, we no longer need the mtd_set_of_node() call done in nand_dt_init().
--- drivers/mtd/nand/nand_base.c | 3 --- include/linux/mtd/nand.h | 7 ++----- 2 files changed, 2 insertions(+), 8 deletions(-)
drivers/mtd/nand/nand_base.c +0 -3
@@ -3945,9 +3945,6 @@ static int nand_dt_init(struct nand_chip *chip)if (!dn)return 0 ; -/* MTD can automatically handle DT partitions, etc. */ -mtd_set_of_node (nand_to_mtd (chip), dn); -if (of_get_nand_bus_width (dn) ==16 ) chip->options |=NAND_BUSWIDTH_16 ;
include/linux/mtd/nand.h +2 -5
@@ -545,7 +545,6 @@ struct nand_buffers {* flash device * @IO_ADDR_W: [BOARDSPECIFIC] address to write the 8 I/O lines of the * flash device. -* @flash_node: [BOARDSPECIFIC] device node describing this instance * @read_byte: [REPLACEABLE] read one byte from the chip * @read_word: [REPLACEABLE] read one word from the chip * @write_byte: [REPLACEABLE] write a single byte to the chip on the
@@ -645,8 +644,6 @@ struct nand_chip {void __iomem *IO_ADDR_R ;void __iomem *IO_ADDR_W ; -struct device_node *flash_node; -uint8_t (*read_byte)(struct mtd_info *mtd);u16 (*read_word)(struct mtd_info *mtd);void (*write_byte)(struct mtd_info *mtd,uint8_t byte);
@@ -724,12 +721,12 @@ struct nand_chip {static inline void nand_set_flash_node (struct nand_chip *chip,struct device_node *np) { - chip->flash_node = np; +mtd_set_of_node (&chip->mtd, np); }static inline struct device_node *nand_get_flash_node (struct nand_chip *chip) { -return chip->flash_node; +return mtd_get_of_node (&chip->mtd); }static inline struct nand_chip *mtd_to_nand (struct mtd_info *mtd)
Signature · 1 line
2.1.4
PATCH v4 55/58 mtd: nand: add helpers to access ->priv
In reply to Boris BrezillonAdd two helpers to access the field reserved for private controller data. This makes it clearer what this field is reserved for and ease future refactoring.
--- include/linux/mtd/nand.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
include/linux/mtd/nand.h +10 -0
@@ -739,6 +739,16 @@ static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip)return &chip->mtd; } +static inline void *nand_get_controller_data (struct nand_chip *chip) +{ +return chip->priv; +} + +static inline void nand_set_controller_data (struct nand_chip *chip,void *priv) +{ + chip->priv = priv; +} +/* * NAND Flash Manufacturer ID Codes */
Signature · 1 line
2.1.4
Re: [PATCH v4 55/58] mtd: nand: add helpers to access ->priv
Hi Boris,
Quoted 3 lines · Boris Brezillon
Add two helpers to access the field reserved for private controller data. This makes it clearer what this field is reserved for and ease future refactoring.
I agree with the refactoring part, but I'm not sure about the name. Is it really "controller" data? That sounds like something that has 1 instance per controller. But the way this is sometimes used, we get 1 instance per NAND chip, and there may be more than one NAND chip per controller.
So at the moment, this is more like opaque "driver data", like dev_{get,set}_drvdata(), which doesn't really have a prescribed use -- it's up to the driver.
Notably, we already have a (sort of) 1-per-controler-instance field:
struct nand_hw_control (I notice we have both the 'controller' and 'hwcontrol' fields in nand_chip; that's pretty ugly too...). Those don't have private data fields, but we could of course extend that if we really want "controller" data.
Anyway, I don't feel like this question is resolved well enough to say that we should go change all drivers to use these accessors. I know you have bigger plans for putting more "controller" infrastructure into the core drivers/mtd/nand/ code, so I'd like to see how that fits in here.
(If we're going to discuss this much more, I'd suggest a smaller CC list. I'm mostly putting this here to show why I'm not taking the last 4 patches right now.)
Regards,
Brian
Quoted 29 lines
Signed-off-by Boris Brezillon <[email protected]>--- include/linux/mtd/nand.h | 10 ++++++++++ 1 file changed, 10 insertions(+)include/linux/mtd/nand.h +10
-0@@ -739,6 +739,16 @@ static inline struct mtd_info *nand_to_mtd(struct nand_chip *chip)return &chip->mtd; } +static inline void *nand_get_controller_data (struct nand_chip *chip) +{ +return chip->priv; +} + +static inline void nand_set_controller_data (struct nand_chip *chip,void *priv) +{ + chip->priv = priv; +} +/* * NAND Flash Manufacturer ID Codes */ Signature · 1 line
2.1.4
Re: [PATCH v4 55/58] mtd: nand: add helpers to access ->priv
Hi Brian,
Quoted 13 lines · On Fri, 18 Dec 2015 14:17:58 -0800 Brian Norris <[email protected]>…
Hi Boris,
Quoted 3 lines · Boris Brezillon
Add two helpers to access the field reserved for private controller data. This makes it clearer what this field is reserved for and ease future refactoring.
I agree with the refactoring part, but I'm not sure about the name. Is it really "controller" data? That sounds like something that has 1 instance per controller. But the way this is sometimes used, we get 1 instance per NAND chip, and there may be more than one NAND chip per controller.
Quoted 7 lines
So at the moment, this is more like opaque "driver data", like dev_{get,set}_drvdata(), which doesn't really have a prescribed use -- it's up to the driver.
Notably, we already have a (sort of) 1-per-controler-instance field:
structnand_hw_control(I notice we have both the 'controller' and 'hwcontrol' fields innand_chip; that's pretty ugly too...).
Will be addressed soon ;-).
Quoted 3 lines
Those don't
have private data fields, but we could of course extend that if we really want "controller" data.
Actually the nand_{get,set}_controller_data() helpers are not about assigning NAND controller private data (as you pointed those can already be retrieved thanks to the ->controller field using the container_of() trick), but per-chip private data instantiated by the NAND controller and attached to a specific chip. For example, some controllers pre-compute some register values or a clk rate to set when a specific chip is selected. This is what per-chip controller data is meant for.
Now, the reason I explicitly specified the data usage instead of using a generic name like nand_{get,set}_data() is because I plan to define other helpers to allow NAND manufacturer code to manipulate its own private data. This is required if we want to support read-retry on some chips who are requiring a read OTP area step to retrieve some register values which will later be used to change from one read-retry mode to another.
The plan was to define the nand_{set,get}_manufacturer_data() helpers, and create or reuse an existing priv field (mtd->priv?) to store this private data.
Also note that the spi framework provides the same kind of helpers [1].
This being said, I'm perfectly fine changing the function names, but I'd like to replace it by something explicitly telling the user that this field should only be set by NAND controller drivers.
[1]http://lxr.free-electrons.com/source/include/linux/spi/spi.h#L189
Best Regards,
Boris
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v4 55/58] mtd: nand: add helpers to access ->priv
Quoted 8 lines · Boris Brezillon
Actually the nand_{get,set}_controller_data() helpers are not about assigning NAND controller private data (as you pointed those can already be retrieved thanks to the ->controller field using the
container_of()trick), but per-chip private data instantiated by the NAND controller and attached to a specific chip. For example, some controllers pre-compute some register values or a clk rate to set when a specific chip is selected. This is what per-chip controller data is meant for.
Sure. Really, it's just anything the controller driver needs to store on a per-chip basis. All I'm suggesting is picking a name that doesn't imply it's a per-controller instance, when it's actually a per-flash-chip instance.
Quoted 2 lines
Now, the reason I explicitly specified the data usage instead of using a generic name like nand_{get,set}_data() is because I plan to define
I never suggested just "_data"; I said "_drvdata".
Quoted 8 lines
other helpers to allow NAND manufacturer code to manipulate its own private data. This is required if we want to support read-retry on some chips who are requiring a read OTP area step to retrieve some register values which will later be used to change from one read-retry mode to another.
The plan was to define the nand_{set,get}_manufacturer_data() helpers, and create or reuse an existing priv field (mtd->priv?) to store this private data.
That's interesting. Sounds like an OK idea. (Personally, I wouldn't try to use mtd->priv for this, but otherwise looks OK.)
Quoted 1 line
Also note that the spi framework provides the same kind of helpers [1].
Hmm, OK. FWIW, they have both "driver data" and "controller state". It's not perfectly clear to me why both exist.
Quoted 3 lines
This being said, I'm perfectly fine changing the function names, but I'd like to replace it by something explicitly telling the user that this field should only be set by NAND controller drivers.
Sure. I though a "driver data"-based name did this. But I'll leave it to you. I could even be OK with "controller data", if you still think this fits your overall controller refactoring plan, and communicates its purpose best.
Regards,
Brian
Re: [PATCH v4 55/58] mtd: nand: add helpers to access ->priv
Hi Brian,
Quoted 15 lines · On Wed, 6 Jan 2016 15:13:23 -0800 Brian Norris <[email protected]>…
Quoted 8 lines · Boris Brezillon
Actually the nand_{get,set}_controller_data() helpers are not about assigning NAND controller private data (as you pointed those can already be retrieved thanks to the ->controller field using the
container_of()trick), but per-chip private data instantiated by the NAND controller and attached to a specific chip. For example, some controllers pre-compute some register values or a clk rate to set when a specific chip is selected. This is what per-chip controller data is meant for.Sure. Really, it's just anything the controller driver needs to store on a per-chip basis. All I'm suggesting is picking a name that doesn't imply it's a per-controller instance, when it's actually a per-flash-chip instance.
Quoted 4 lines
Quoted 2 lines
Now, the reason I explicitly specified the data usage instead of using a generic name like nand_{get,set}_data() is because I plan to define
I never suggested just "
_data"; I said "_drvdata".
Not sure it clarifies the per-chip aspect ;), and driver is, IMHO, too
generic: I also consider manufacturer specific code as drivers (but in this case they are chip drivers, not controller drivers).
How about nand_{get,set}_ctrldrvdata()?
Quoted 10 lines
Quoted 9 lines
other helpers to allow NAND manufacturer code to manipulate its own private data. This is required if we want to support read-retry on some chips who are requiring a read OTP area step to retrieve some register values which will later be used to change from one read-retry mode to another.
The plan was to define the nand_{set,get}_manufacturer_data() helpers, and create or reuse an existing priv field (mtd->priv?) to store this private data.
Quoted 2 lines
That's interesting. Sounds like an OK idea. (Personally, I wouldn't try to use
mtd->privfor this, but otherwise looks OK.)
Yes, I don't like the idea of using mtd->priv to store that, but it's shame to have this unused field and create another one :p.
Quoted 5 lines
Quoted 2 lines
Also note that the spi framework provides the same kind of helpers [1].
Hmm, OK. FWIW, they have both "driver data" and "controller state". It's not perfectly clear to me why both exist.
Well, "driver data" in this case is the data used by the i2c device driver (the driver communicating with the device on the i2c bus), while the "controller state" is the per-device controller specific data. If we do the analogy with the NAND framework, I'd consider the "SPI controller state" as what I call here the "NAND controller per-chip data", and the "SPI driver data" as the "manufacturer data".
I know the names are not necessarily better in the SPI framework, but I think we should find names that describe as much as possible which data is used by which part of the code.
Quoted 9 lines
Quoted 4 lines
This being said, I'm perfectly fine changing the function names, but I'd like to replace it by something explicitly telling the user that this field should only be set by NAND controller drivers.
Sure. I though a "driver data"-based name did this. But I'll leave it to you. I could even be OK with "controller data", if you still think this fits your overall controller refactoring plan, and communicates its purpose best.
If you're OK with that I'd like to keep a name containing the 'controller' or 'ctrl' word in it:
1/ nand_{get,set}_controller_data() (the names originally proposed) 2/ nand_{get,set}_ctrldrv_data() or nand_{get,set}_ctrldrvdata()
What do you prefer?
Best Regards,
Boris
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Re: [PATCH v4 55/58] mtd: nand: add helpers to access ->priv
Hi Boris,
Quoted 7 lines · Boris Brezillon
Quoted 5 lines · On Wed, 6 Jan 2016 15:13:23 -0800 Brian Norris <[email protected]>…
Quoted 2 lines · Boris Brezillon
Now, the reason I explicitly specified the data usage instead of using a generic name like nand_{get,set}_data() is because I plan to define
Quoted 7 lines
Quoted 1 line
I never suggested just "
_data"; I said "_drvdata".Not sure it clarifies the per-chip aspect ;), and driver is, IMHO, too
generic: I also consider manufacturer specific code as drivers (but in this case they are chip drivers, not controller drivers).How about nand_{get,set}_ctrldrvdata()?
That's just more confusing :)
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines
other helpers to allow NAND manufacturer code to manipulate its own private data. This is required if we want to support read-retry on some chips who are requiring a read OTP area step to retrieve some register values which will later be used to change from one read-retry mode to another.
The plan was to define the nand_{set,get}_manufacturer_data() helpers, and create or reuse an existing priv field (mtd->priv?) to store this private data.
[...]
Quoted 12 lines
Quoted 4 lines
Quoted 1 line
Also note that the spi framework provides the same kind of helpers [1].
Hmm, OK. FWIW, they have both "driver data" and "controller state". It's not perfectly clear to me why both exist.
Well, "driver data" in this case is the data used by the i2c device driver (the driver communicating with the device on the i2c bus), while the "controller state" is the per-device controller specific data. If we do the analogy with the NAND framework, I'd consider the "SPI controller state" as what I call here the "NAND controller per-chip data", and the "SPI driver data" as the "manufacturer data".
Quoted 3 lines
I know the names are not necessarily better in the SPI framework, but I think we should find names that describe as much as possible which data is used by which part of the code.
Re-reviewing the SPI framework helpers suggests to me that their usage scheme is actually not too bad. And it's actually pretty similar to your current naming scheme.
Quoted 9 lines
Quoted 8 lines
Quoted 3 lines
This being said, I'm perfectly fine changing the function names, but I'd like to replace it by something explicitly telling the user that this field should only be set by NAND controller drivers.
Sure. I though a "driver data"-based name did this. But I'll leave it to you. I could even be OK with "controller data", if you still think this fits your overall controller refactoring plan, and communicates its purpose best.
Quoted 6 lines
If you're OK with that I'd like to keep a name containing the 'controller' or 'ctrl' word in it:
1/ nand_{get,set}_controller_data() (the names originally proposed) 2/ nand_{get,set}_ctrldrv_data() or nand_{get,set}_ctrldrvdata()What do you prefer?
I guess (1) is not that bad in the end. I at least prefer it to (2). Sorry for the bikeshedding!
So are these last few patches still applicable as-is, or should I await a new submission?
Thanks,
Brian
A message that is not in the archive (sent off-list or not yet received): 20160107182140.02111dc1@bbrezillon
PATCH v4 55/58 mtd: nand: add helpers to access ->priv
(Re-constructing CC list)
Quoted 7 lines · Boris Brezillon
Quoted 2 lines · On Thu, 7 Jan 2016 09:17:00 -0800 Brian Norris <[email protected]>…
So are these last few patches still applicable as-is, or should I await a new submission?
It still applies correctly (I rebased it on l2-mtd/master). You may want to adapt the jz4780 driver to make use of these helpers.
OK. Fixed some small conflicts and pushed patches 55-58 to l2-mtd.git. Thanks!
Brian
PATCH v4 56/58 ARM: make use of nand_set/get_controller_data() helpers
In reply to Boris BrezillonNew helpers have been added to avoid directly accessing chip->field. Use them where appropriate.
--- arch/arm/mach-ixp4xx/ixdp425-setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-ixp4xx/ixdp425-setup.c +2 -2
@@ -77,7 +77,7 @@ static void ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) { struct nand_chip *this = mtd_to_nand(mtd); -int offset = (int )this->priv; +int offset = (int )nand_get_controller_data (this);if (ctrl &NAND_CTRL_CHANGE ) {if (ctrl &NAND_NCE ) {
@@ -88,7 +88,7 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) offset = (ctrl &NAND_CLE ) ?IXDP425_NAND_CMD_BYTE :0 ; offset |= (ctrl &NAND_ALE ) ?IXDP425_NAND_ADDR_BYTE :0 ; - this->priv = (void *)offset; +nand_set_controller_data (this, (void *)offset); }if (cmd !=NAND_CMD_NONE )
Signature · 1 line
2.1.4
PATCH v4 57/58 mtd: nand: make use of nand_set/get_controller_data() helpers
In reply to Boris BrezillonNew helpers have been added to avoid directly accessing chip->field. Use them where appropriate.
--- drivers/mtd/nand/ams-delta.c | 6 +-- drivers/mtd/nand/atmel_nand.c | 55 +++++++++++----------- drivers/mtd/nand/bcm47xxnflash/main.c | 2 +- drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c | 16 +++---- drivers/mtd/nand/bf5xx_nand.c | 2 +- drivers/mtd/nand/brcmnand/brcmnand.c | 30 ++++++------ drivers/mtd/nand/cafe_nand.c | 24 +++++----- drivers/mtd/nand/diskonchip.c | 70 ++++++++++++++-------------- drivers/mtd/nand/docg4.c | 42 ++++++++--------- drivers/mtd/nand/fsl_elbc_nand.c | 22 ++++----- drivers/mtd/nand/fsl_ifc_nand.c | 26 +++++------ drivers/mtd/nand/fsmc_nand.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 28 +++++------ drivers/mtd/nand/hisi504_nand.c | 20 ++++---- drivers/mtd/nand/lpc32xx_mlc.c | 19 ++++---- drivers/mtd/nand/lpc32xx_slc.c | 20 ++++---- drivers/mtd/nand/mpc5121_nfc.c | 24 +++++----- drivers/mtd/nand/mxc_nand.c | 36 +++++++------- drivers/mtd/nand/nandsim.c | 4 +- drivers/mtd/nand/ndfc.c | 16 +++---- drivers/mtd/nand/orion_nand.c | 4 +- drivers/mtd/nand/plat_nand.c | 2 +- drivers/mtd/nand/pxa3xx_nand.c | 22 ++++----- drivers/mtd/nand/r852.c | 6 +-- drivers/mtd/nand/s3c2410.c | 4 +- drivers/mtd/nand/socrates_nand.c | 11 +++-- drivers/mtd/nand/txx9ndfmc.c | 8 ++-- 27 files changed, 262 insertions(+), 259 deletions(-)
drivers/mtd/nand/ams-delta.c +3 -3
@@ -65,7 +65,7 @@ static struct mtd_partition partition_info[] = {static void ams_delta_write_byte (struct mtd_info *mtd,u_char byte) {struct nand_chip *this =mtd_to_nand (mtd); -void __iomem *io_base = this->priv; +void __iomem *io_base = (void __iomem *)nand_get_controller_data (this);writew (0 , io_base +OMAP_MPUIO_IO_CNTL );writew (byte, this->IO_ADDR_W);
@@ -78,7 +78,7 @@ static u_char ams_delta_read_byte(struct mtd_info *mtd) {u_char res;struct nand_chip *this =mtd_to_nand (mtd); -void __iomem *io_base = this->priv; +void __iomem *io_base = (void __iomem *)nand_get_controller_data (this);gpio_set_value (AMS_DELTA_GPIO_PIN_NAND_NRE ,0 );ndelay (40 );
@@ -206,7 +206,7 @@ static int ams_delta_init(struct platform_device *pdev) goto out_free; } - this->priv = io_base; +nand_set_controller_data (this, (void *)io_base);/* Set address of NAND IO lines */ this->IO_ADDR_R = io_base +OMAP_MPUIO_INPUT_LATCH ;
drivers/mtd/nand/atmel_nand.c +28 -27
217 lines not on this page · raw message
drivers/mtd/nand/bcm47xxnflash/main.c +1 -1
@@ -34,7 +34,7 @@ static int bcm47xxnflash_probe(struct platform_device *pdev)if (!b47n)return -ENOMEM ; - b47n->nand_chip.priv = b47n; +nand_set_controller_data (&b47n->nand_chip, b47n); mtd =nand_to_mtd (&b47n->nand_chip); mtd->dev.parent = &pdev->dev; b47n->cc = container_of(nflash, struct bcma_drv_cc, nflash);
drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c +8 -8
@@ -90,7 +90,7 @@ static void bcm47xxnflash_ops_bcm4706_read(struct mtd_info *mtd, uint8_t *buf, int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);u32 ctlcode;u32 *dest = (u32 *)buf;
@@ -140,7 +140,7 @@ static void bcm47xxnflash_ops_bcm4706_write(struct mtd_info *mtd, const uint8_t *buf, int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);struct bcma_drv_cc *cc = b47n->cc;u32 ctlcode;
@@ -174,7 +174,7 @@ static void bcm47xxnflash_ops_bcm4706_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);u32 code =0 ;if (cmd ==NAND_CMD_NONE )
@@ -200,7 +200,7 @@ static void bcm47xxnflash_ops_bcm4706_select_chip(struct mtd_info *mtd,static int bcm47xxnflash_ops_bcm4706_dev_ready (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);return !!(bcma_cc_read32 (b47n->cc,BCMA_CC_NFLASH_CTL ) &NCTL_READY ); }
@@ -217,7 +217,7 @@ static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct mtd_info *mtd, int page_addr) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);struct bcma_drv_cc *cc = b47n->cc;u32 ctlcode;int i;
@@ -313,7 +313,7 @@ static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct mtd_info *mtd,static u8 bcm47xxnflash_ops_bcm4706_read_byte (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);struct bcma_drv_cc *cc = b47n->cc;u32 tmp =0 ;
@@ -342,7 +342,7 @@ static void bcm47xxnflash_ops_bcm4706_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);switch (b47n->curr_command) {case NAND_CMD_READ0 :
@@ -358,7 +358,7 @@ static void bcm47xxnflash_ops_bcm4706_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv; +struct bcm47xxnflash *b47n =nand_get_controller_data (nand_chip);switch (b47n->curr_command) {case NAND_CMD_SEQIN :
drivers/mtd/nand/bf5xx_nand.c +1 -1
@@ -773,7 +773,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev) chip->cmd_ctrl = bf5xx_nand_hwcontrol; chip->dev_ready = bf5xx_nand_devready; - chip->priv = mtd; +nand_set_controller_data (chip, mtd); chip->controller = &info->controller; chip->IO_ADDR_R = (void __iomem *)NFC_READ ;
drivers/mtd/nand/brcmnand/brcmnand.c +15 -15
@@ -873,7 +873,7 @@ static struct nand_ecclayout *brcmstb_choose_ecc_layout(static void brcmnand_wp (struct mtd_info *mtd,int wp) {struct nand_chip *chip =mtd_to_nand (mtd); -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;if ((ctrl->features &BRCMNAND_HAS_WP ) && wp_on ==1 ) {
@@ -1039,7 +1039,7 @@ static void brcmnand_cmd_ctrl(struct mtd_info *mtd, int dat,static int brcmnand_waitfunc (struct mtd_info *mtd,struct nand_chip *this) {struct nand_chip *chip =mtd_to_nand (mtd); -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;unsigned long timeo =msecs_to_jiffies (100 );
@@ -1113,7 +1113,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;u64 addr = (u64 )page_addr << chip->page_shift;int native_cmd =0 ;
@@ -1219,7 +1219,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,static uint8_t brcmnand_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;uint8_t ret =0 ;int addr, offs;
@@ -1286,7 +1286,7 @@ static void brcmnand_write_buf(struct mtd_info *mtd, const uint8_t *buf, {int i;struct nand_chip *chip =mtd_to_nand (mtd); -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);switch (host->last_cmd) {case NAND_CMD_SET_FEATURES :
@@ -1396,7 +1396,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, u64 addr, unsigned int trans, u32 *buf, u8 *oob, u64 *err_addr) { - struct brcmnand_host *host = chip->priv; + struct brcmnand_host *host = nand_get_controller_data(chip);struct brcmnand_controller *ctrl = host->ctrl;int i, j, ret =0 ;
@@ -1459,7 +1459,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_read (struct mtd_info *mtd,struct nand_chip *chip,u64 addr,unsigned int trans,u32 *buf,u8 *oob) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;u64 err_addr =0 ;int err;
@@ -1509,7 +1509,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);u8 *oob = oob_required ? (u8 *)chip->oob_poi :NULL ; return brcmnand_read(mtd, chip, host->last_addr,
@@ -1519,7 +1519,7 @@ static int brcmnand_read_page(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_read_page_raw (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);u8 *oob = oob_required ? (u8 *)chip->oob_poi :NULL ;int ret;
@@ -1541,7 +1541,7 @@ static int brcmnand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_read_oob_raw (struct mtd_info *mtd,struct nand_chip *chip,int page) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);brcmnand_set_ecc_enabled (host,0 ); brcmnand_read(mtd, chip, (u64)page << chip->page_shift,
@@ -1554,7 +1554,7 @@ static int brcmnand_read_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_write (struct mtd_info *mtd,struct nand_chip *chip,u64 addr,const u32 *buf,u8 *oob) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);struct brcmnand_controller *ctrl = host->ctrl;unsigned int i, j, trans = mtd->writesize >>FC_SHIFT ;int status, ret =0 ;
@@ -1625,7 +1625,7 @@ out:static int brcmnand_write_page (struct mtd_info *mtd,struct nand_chip *chip,const uint8_t *buf,int oob_required,int page) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);void *oob = oob_required ? chip->oob_poi :NULL ;brcmnand_write (mtd, chip, host->last_addr, (const u32 *)buf, oob);
@@ -1636,7 +1636,7 @@ static int brcmnand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, const uint8_t *buf, int oob_required, int page) { - struct brcmnand_host *host = chip->priv; + struct brcmnand_host *host = nand_get_controller_data(chip);void *oob = oob_required ? chip->oob_poi :NULL ;brcmnand_set_ecc_enabled (host,0 );
@@ -1655,7 +1655,7 @@ static int brcmnand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,static int brcmnand_write_oob_raw (struct mtd_info *mtd,struct nand_chip *chip,int page) { -struct brcmnand_host *host = chip->priv; +struct brcmnand_host *host =nand_get_controller_data (chip);int ret;brcmnand_set_ecc_enabled (host,0 );
@@ -1919,7 +1919,7 @@ static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn) chip = &host->chip;nand_set_flash_node (chip, dn); - chip->priv = host; +nand_set_controller_data (chip, host); mtd->name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"brcmnand.%d" , host->cs); mtd->owner =THIS_MODULE ;
drivers/mtd/nand/cafe_nand.c +12 -12
@@ -102,7 +102,7 @@ static const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL };static int cafe_device_ready (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);int result = !!(cafe_readl (cafe,NAND_STATUS ) &0x40000000 );uint32_t irqs =cafe_readl (cafe,NAND_IRQ );
@@ -119,7 +119,7 @@ static int cafe_device_ready(struct mtd_info *mtd)static void cafe_write_buf (struct mtd_info *mtd,const uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);if (usedma)memcpy (cafe->dmabuf + cafe->datalen, buf, len);
@@ -135,7 +135,7 @@ static void cafe_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)static void cafe_read_buf (struct mtd_info *mtd,uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);if (usedma)memcpy (buf, cafe->dmabuf + cafe->datalen, len);
@@ -150,7 +150,7 @@ static void cafe_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static uint8_t cafe_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);uint8_t d;cafe_read_buf (mtd, &d,1 );
@@ -163,7 +163,7 @@ static void cafe_nand_cmdfunc(struct mtd_info *mtd, unsigned command, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);int adrbytes =0 ;uint32_t ctl1;uint32_t doneint =0x80000000 ;
@@ -319,7 +319,7 @@ static void cafe_nand_cmdfunc(struct mtd_info *mtd, unsigned command,static void cafe_select_chip (struct mtd_info *mtd,int chipnr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);cafe_dev_dbg (&cafe->pdev->dev,"select_chip %d\n" , chipnr);
@@ -335,7 +335,7 @@ static irqreturn_t cafe_nand_interrupt(int irq, void *id) {struct mtd_info *mtd = id;struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);uint32_t irqs =cafe_readl (cafe,NAND_IRQ );cafe_writel (cafe, irqs & ~0x90000000 ,NAND_IRQ );if (!irqs)
@@ -384,7 +384,7 @@ static int cafe_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,static int cafe_nand_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);unsigned int max_bitflips =0 ; cafe_dev_dbg(&cafe->pdev->dev, "ECC result %08x SYN1,2 %08x\n",
@@ -526,7 +526,7 @@ static int cafe_nand_write_page_lowlevel(struct mtd_info *mtd, const uint8_t *buf, int oob_required, int page) { - struct cafe_priv *cafe = chip->priv; + struct cafe_priv *cafe = nand_get_controller_data(chip); chip->write_buf (mtd, buf, mtd->writesize); chip->write_buf (mtd, chip->oob_poi, mtd->oobsize);
@@ -611,7 +611,7 @@ static int cafe_nand_probe(struct pci_dev *pdev, mtd =nand_to_mtd (&cafe->nand); mtd->dev.parent = &pdev->dev; - cafe->nand.priv = cafe; +nand_set_controller_data (&cafe->nand, cafe); cafe->pdev = pdev; cafe->mmio =pci_iomap (pdev,0 ,0 );
@@ -800,7 +800,7 @@ static void cafe_nand_remove(struct pci_dev *pdev) {struct mtd_info *mtd =pci_get_drvdata (pdev);struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);/* Disable NAND IRQ in global IRQ mask register */ cafe_writel (cafe, ~1 &cafe_readl (cafe,GLOBAL_IRQ_MASK ),GLOBAL_IRQ_MASK );
@@ -828,7 +828,7 @@ static int cafe_nand_resume(struct pci_dev *pdev)uint32_t ctrl;struct mtd_info *mtd =pci_get_drvdata (pdev);struct nand_chip *chip =mtd_to_nand (mtd); -struct cafe_priv *cafe = chip->priv; +struct cafe_priv *cafe =nand_get_controller_data (chip);/* Start off by resetting the NAND controller completely */ cafe_writel (cafe,1 ,NAND_RESET );
drivers/mtd/nand/diskonchip.c +35 -35
280 lines not on this page · raw message
drivers/mtd/nand/docg4.c +21 -21
168 lines not on this page · raw message
drivers/mtd/nand/fsl_elbc_nand.c +11 -11
@@ -144,7 +144,7 @@ static struct nand_bbt_descr bbt_mirror_descr = {static void set_addr (struct mtd_info *mtd,int column,int page_addr,int oob) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_lbc_regs __iomem *lbc = ctrl->regs;struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand;
@@ -195,7 +195,7 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)static int fsl_elbc_run_command (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand;struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
@@ -267,7 +267,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_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
@@ -300,7 +300,7 @@ static void fsl_elbc_cmdfunc(struct mtd_info *mtd, unsigned int command, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand;struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
@@ -525,7 +525,7 @@ static void fsl_elbc_select_chip(struct mtd_info *mtd, int chip)static void fsl_elbc_write_buf (struct mtd_info *mtd,const u8 *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;unsigned int bufsize = mtd->writesize + mtd->oobsize;
@@ -563,7 +563,7 @@ static void fsl_elbc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)static u8 fsl_elbc_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;/* If there are still bytes in the FCM, then use the next byte. */
@@ -580,7 +580,7 @@ static u8 fsl_elbc_read_byte(struct mtd_info *mtd)static void fsl_elbc_read_buf (struct mtd_info *mtd,u8 *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;int avail;
@@ -604,7 +604,7 @@ static void fsl_elbc_read_buf(struct mtd_info *mtd, u8 *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_mtd *priv =nand_get_controller_data (chip);struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;if (elbc_fcm_ctrl->status !=LTESR_CC )
@@ -619,7 +619,7 @@ static int fsl_elbc_wait(struct mtd_info *mtd, struct nand_chip *chip)static int fsl_elbc_chip_init_tail (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_lbc_regs __iomem *lbc = ctrl->regs;unsigned int al;
@@ -696,7 +696,7 @@ static int fsl_elbc_chip_init_tail(struct mtd_info *mtd)static int fsl_elbc_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct fsl_elbc_mtd *priv = chip->priv; +struct fsl_elbc_mtd *priv =nand_get_controller_data (chip);struct fsl_lbc_ctrl *ctrl = priv->ctrl;struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = ctrl->nand;
@@ -770,7 +770,7 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv) chip->bbt_options =NAND_BBT_USE_FLASH ; chip->controller = &elbc_fcm_ctrl->controller; - chip->priv = priv; +nand_set_controller_data (chip, priv); chip->ecc.read_page = fsl_elbc_read_page; chip->ecc.write_page = fsl_elbc_write_page;
drivers/mtd/nand/fsl_ifc_nand.c +13 -13
@@ -230,7 +230,7 @@ static struct nand_bbt_descr bbt_mirror_descr = {static void set_addr (struct mtd_info *mtd,int column,int page_addr,int oob) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;int buf_num;
@@ -253,7 +253,7 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)static int is_blank (struct mtd_info *mtd,unsigned int bufnum) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize *2 );u32 __iomem *mainarea = (u32 __iomem *)addr;u8 __iomem *oob = addr + mtd->writesize;
@@ -292,7 +292,7 @@ static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,static void fsl_ifc_run_command (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
@@ -369,7 +369,7 @@ static void fsl_ifc_do_read(struct nand_chip *chip,int oob, struct mtd_info *mtd) { - struct fsl_ifc_mtd *priv = chip->priv; + struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
@@ -409,7 +409,7 @@ static void fsl_ifc_do_read(struct nand_chip *chip,static void fsl_ifc_cmdfunc (struct mtd_info *mtd,unsigned int command,int column,int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
@@ -624,7 +624,7 @@ static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)static void fsl_ifc_write_buf (struct mtd_info *mtd,const u8 *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);unsigned int bufsize = mtd->writesize + mtd->oobsize;if (len <=0 ) {
@@ -650,7 +650,7 @@ static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)static uint8_t fsl_ifc_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);unsigned int offset;/*
@@ -673,7 +673,7 @@ static uint8_t fsl_ifc_read_byte(struct mtd_info *mtd)static uint8_t fsl_ifc_read_byte16 (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);uint16_t data;/*
@@ -696,7 +696,7 @@ static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)static void fsl_ifc_read_buf (struct mtd_info *mtd,u8 *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);int avail;if (len <0 ) {
@@ -721,7 +721,7 @@ static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)*/ static int fsl_ifc_wait (struct mtd_info *mtd,struct nand_chip *chip) { -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_regs __iomem *ifc = ctrl->regs;u32 nand_fsr;
@@ -750,7 +750,7 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)static int fsl_ifc_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);struct fsl_ifc_ctrl *ctrl = priv->ctrl;struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
@@ -782,7 +782,7 @@ static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,static int fsl_ifc_chip_init_tail (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct fsl_ifc_mtd *priv = chip->priv; +struct fsl_ifc_mtd *priv =nand_get_controller_data (chip);dev_dbg (priv->dev,"%s: nand->numchips = %d\n" , __func__, chip->numchips);
@@ -914,7 +914,7 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv) } chip->controller = &ifc_nand_ctrl->controller; - chip->priv = priv; +nand_set_controller_data (chip, priv); chip->ecc.read_page = fsl_ifc_read_page; chip->ecc.write_page = fsl_ifc_write_page;
drivers/mtd/nand/fsmc_nand.c +1 -1
@@ -1009,7 +1009,7 @@ static int __init fsmc_nand_probe(struct platform_device *pdev)/* Link all private pointers */ mtd =nand_to_mtd (&host->nand); nand = &host->nand; - nand->priv = host; +nand_set_controller_data (nand, host);nand_set_flash_node (nand, np); mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +14 -14
@@ -857,7 +857,7 @@ error_alloc:static void gpmi_cmd_ctrl (struct mtd_info *mtd,int data,unsigned int ctrl) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);int ret;/*
@@ -891,7 +891,7 @@ static void gpmi_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)static int gpmi_dev_ready (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);return gpmi_is_ready (this, this->current_chip); }
@@ -899,7 +899,7 @@ static int gpmi_dev_ready(struct mtd_info *mtd)static void gpmi_select_chip (struct mtd_info *mtd,int chipnr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);if ((this->current_chip <0 ) && (chipnr >=0 ))gpmi_begin (this);
@@ -912,7 +912,7 @@ static void gpmi_select_chip(struct mtd_info *mtd, int chipnr)static void gpmi_read_buf (struct mtd_info *mtd,uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);dev_dbg (this->dev,"len is %d\n" , len); this->upper_buf = buf;
@@ -924,7 +924,7 @@ static void gpmi_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static void gpmi_write_buf (struct mtd_info *mtd,const uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);dev_dbg (this->dev,"len is %d\n" , len); this->upper_buf = (uint8_t *)buf;
@@ -936,7 +936,7 @@ static void gpmi_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)static uint8_t gpmi_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);uint8_t *buf = this->data_buffer_dma;gpmi_read_buf (mtd, buf,1 );
@@ -994,7 +994,7 @@ static void block_mark_swapping(struct gpmi_nand_data *this,static int gpmi_ecc_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);struct bch_geometry *nfc_geo = &this->bch_geometry;void *payload_virt;dma_addr_t payload_phys;
@@ -1074,7 +1074,7 @@ static int gpmi_ecc_read_page(struct mtd_info *mtd, struct nand_chip *chip,static int gpmi_ecc_read_subpage (struct mtd_info *mtd,struct nand_chip *chip,uint32_t offs,uint32_t len,uint8_t *buf,int page) { -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);void __iomem *bch_regs = this->resources.bch_regs;struct bch_geometry old_geo = this->bch_geometry;struct bch_geometry *geo = &this->bch_geometry;
@@ -1162,7 +1162,7 @@ static int gpmi_ecc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,static int gpmi_ecc_write_page (struct mtd_info *mtd,struct nand_chip *chip,const uint8_t *buf,int oob_required,int page) { -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);struct bch_geometry *nfc_geo = &this->bch_geometry;const void *payload_virt;dma_addr_t payload_phys;
@@ -1298,7 +1298,7 @@ exit_auxiliary:static int gpmi_ecc_read_oob (struct mtd_info *mtd,struct nand_chip *chip,int page) { -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);dev_dbg (this->dev,"page number is %d\n" , page);/* clear the OOB buffer */
@@ -1359,7 +1359,7 @@ static int gpmi_ecc_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int oob_required, int page) { - struct gpmi_nand_data *this = chip->priv; + struct gpmi_nand_data *this = nand_get_controller_data(chip);struct bch_geometry *nfc_geo = &this->bch_geometry;int eccsize = nfc_geo->ecc_chunk_size;int eccbits = nfc_geo->ecc_strength * nfc_geo->gf_len;
@@ -1448,7 +1448,7 @@ static int gpmi_ecc_write_page_raw(struct mtd_info *mtd,const uint8_t *buf, int oob_required, int page) { - struct gpmi_nand_data *this = chip->priv; + struct gpmi_nand_data *this = nand_get_controller_data(chip);struct bch_geometry *nfc_geo = &this->bch_geometry;int eccsize = nfc_geo->ecc_chunk_size;int eccbits = nfc_geo->ecc_strength * nfc_geo->gf_len;
@@ -1539,7 +1539,7 @@ static int gpmi_ecc_write_oob_raw(struct mtd_info *mtd, struct nand_chip *chip,static int gpmi_block_markbad (struct mtd_info *mtd,loff_t ofs) {struct nand_chip *chip =mtd_to_nand (mtd); -struct gpmi_nand_data *this = chip->priv; +struct gpmi_nand_data *this =nand_get_controller_data (chip);int ret =0 ;uint8_t *block_mark;int column, page, status, chipnr;
@@ -1897,7 +1897,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this) mtd->dev.parent = this->dev;/* init the nand_chip{}, we don't support a 16-bit NAND Flash bus. */ - chip->priv = this; +nand_set_controller_data (chip, this);nand_set_flash_node (chip, this->pdev->dev.of_node); chip->select_chip = gpmi_select_chip; chip->cmd_ctrl = gpmi_cmd_ctrl;
drivers/mtd/nand/hisi504_nand.c +10 -10
@@ -357,7 +357,7 @@ static int hisi_nfc_send_cmd_reset(struct hinfc_host *host, int chipselect)static void hisi_nfc_select_chip (struct mtd_info *mtd,int chipselect) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);if (chipselect <0 )return ;
@@ -368,7 +368,7 @@ static void hisi_nfc_select_chip(struct mtd_info *mtd, int chipselect)static uint8_t hisi_nfc_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);if (host->command ==NAND_CMD_STATUS )return *(uint8_t *)(host->mmio);
@@ -384,7 +384,7 @@ static uint8_t hisi_nfc_read_byte(struct mtd_info *mtd)static u16 hisi_nfc_read_word (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip); host->offset +=2 ;return *(u16 *)(host->buffer + host->offset -2 );
@@ -394,7 +394,7 @@ static void hisi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) { struct nand_chip *chip = mtd_to_nand(mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);memcpy (host->buffer + host->offset, buf, len); host->offset += len;
@@ -403,7 +403,7 @@ hisi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)static void hisi_nfc_read_buf (struct mtd_info *mtd,uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);memcpy (buf, host->buffer + host->offset, len); host->offset += len;
@@ -412,7 +412,7 @@ static void hisi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static void set_addr (struct mtd_info *mtd,int column,int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);unsigned int command = host->command; host->addr_cycle =0 ;
@@ -448,7 +448,7 @@ static void hisi_nfc_cmdfunc(struct mtd_info *mtd, unsigned command, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);int is_cache_invalid =1 ;unsigned int flag =0 ;
@@ -542,7 +542,7 @@ static irqreturn_t hinfc_irq_handle(int irq, void *devid)static int hisi_nand_read_page_hwecc (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip);int max_bitflips =0 , stat =0 , stat_max =0 , status_ecc;int stat_1, stat_2;
@@ -574,7 +574,7 @@ static int hisi_nand_read_page_hwecc(struct mtd_info *mtd,static int hisi_nand_read_oob (struct mtd_info *mtd,struct nand_chip *chip,int page) { -struct hinfc_host *host = chip->priv; +struct hinfc_host *host =nand_get_controller_data (chip); chip->cmdfunc (mtd,NAND_CMD_READOOB ,0 , page); chip->read_buf (mtd, chip->oob_poi, mtd->oobsize);
@@ -738,7 +738,7 @@ static int hisi_nfc_probe(struct platform_device *pdev) mtd->name ="hisi_nand" ; mtd->dev.parent = &pdev->dev; - chip->priv = host; +nand_set_controller_data (chip, host);nand_set_flash_node (chip, np); chip->cmdfunc = hisi_nfc_cmdfunc; chip->select_chip = hisi_nfc_select_chip;
drivers/mtd/nand/lpc32xx_mlc.c +10 -9
@@ -275,7 +275,7 @@ static void lpc32xx_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = nand_chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (nand_chip);if (cmd !=NAND_CMD_NONE ) {if (ctrl &NAND_CLE )
@@ -291,7 +291,7 @@ static void lpc32xx_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,static int lpc32xx_nand_device_ready (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = nand_chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (nand_chip); if ((readb(MLC_ISR(host->io_base)) & (MLCISR_CONTROLLER_READY | MLCISR_NAND_READY)) ==
@@ -317,7 +317,7 @@ static irqreturn_t lpc3xxx_nand_irq(int irq, struct lpc32xx_nand_host *host)static int lpc32xx_waitfunc_nand (struct mtd_info *mtd,struct nand_chip *chip) { -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);if (readb (MLC_ISR (host->io_base)) &MLCISR_NAND_READY ) goto exit;
@@ -337,7 +337,7 @@ exit:static int lpc32xx_waitfunc_controller (struct mtd_info *mtd,struct nand_chip *chip) { -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);if (readb (MLC_ISR (host->io_base)) &MLCISR_CONTROLLER_READY ) goto exit;
@@ -389,7 +389,7 @@ static int lpc32xx_xmit_dma(struct mtd_info *mtd, void *mem, int len, enum dma_transfer_direction dir) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);struct dma_async_tx_descriptor *desc;int flags =DMA_CTRL_ACK |DMA_PREP_INTERRUPT ;int res;
@@ -430,7 +430,7 @@ out1:static int lpc32xx_read_page (struct mtd_info *mtd,struct nand_chip *chip,uint8_t *buf,int oob_required,int page) { -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);int i, j;uint8_t *oobbuf = chip->oob_poi;uint32_t mlc_isr;
@@ -497,7 +497,7 @@ static int lpc32xx_write_page_lowlevel(struct mtd_info *mtd, const uint8_t *buf, int oob_required, int page) { - struct lpc32xx_nand_host *host = chip->priv; + struct lpc32xx_nand_host *host = nand_get_controller_data(chip);const uint8_t *oobbuf = chip->oob_poi;uint8_t *dma_buf = (uint8_t *)buf;int res;
@@ -542,7 +542,7 @@ static int lpc32xx_write_page_lowlevel(struct mtd_info *mtd,static int lpc32xx_read_oob (struct mtd_info *mtd,struct nand_chip *chip,int page) { -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);/* Read whole page - necessary with MLC controller! */ lpc32xx_read_page (mtd, chip, host->dummy_buf,1 , page);
@@ -679,7 +679,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) host->pdata =dev_get_platdata (&pdev->dev); - nand_chip->priv = host;/* link the private data structures */ +/* link the private data structures */ +nand_set_controller_data (nand_chip, host);nand_set_flash_node (nand_chip, pdev->dev.of_node); mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/lpc32xx_slc.c +10 -10
@@ -260,7 +260,7 @@ static void lpc32xx_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, {uint32_t tmp;struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);/* Does CE state need to be changed? */ tmp =readl (SLC_CFG (host->io_base));
@@ -284,7 +284,7 @@ static void lpc32xx_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,static int lpc32xx_nand_device_ready (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);int rdy =0 ;if ((readl (SLC_STAT (host->io_base)) &SLCSTAT_NAND_READY ) !=0 )
@@ -339,7 +339,7 @@ static int lpc32xx_nand_ecc_calculate(struct mtd_info *mtd,static uint8_t lpc32xx_nand_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);return (uint8_t )readl (SLC_DATA (host->io_base)); }
@@ -350,7 +350,7 @@ static uint8_t lpc32xx_nand_read_byte(struct mtd_info *mtd)static void lpc32xx_nand_read_buf (struct mtd_info *mtd,u_char *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);/* Direct device read with no ECC */ while (len-- >0 )
@@ -363,7 +363,7 @@ static void lpc32xx_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)static void lpc32xx_nand_write_buf (struct mtd_info *mtd,const uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);/* Direct device write with no ECC */ while (len-- >0 )
@@ -428,7 +428,7 @@ static int lpc32xx_xmit_dma(struct mtd_info *mtd, dma_addr_t dma, void *mem, int len, enum dma_transfer_direction dir) { struct nand_chip *chip = mtd_to_nand(mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);struct dma_async_tx_descriptor *desc;int flags =DMA_CTRL_ACK |DMA_PREP_INTERRUPT ;int res;
@@ -488,7 +488,7 @@ static int lpc32xx_xfer(struct mtd_info *mtd, uint8_t *buf, int eccsubpages, int read) {struct nand_chip *chip =mtd_to_nand (mtd); -struct lpc32xx_nand_host *host = chip->priv; +struct lpc32xx_nand_host *host =nand_get_controller_data (chip);int i, status =0 ;unsigned long timeout;int res;
@@ -603,7 +603,7 @@ static int lpc32xx_nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int oob_required, int page) { - struct lpc32xx_nand_host *host = chip->priv; + struct lpc32xx_nand_host *host = nand_get_controller_data(chip);int stat, i, status;uint8_t *oobecc, tmpecc[LPC32XX_ECC_SAVE_SIZE ];
@@ -665,7 +665,7 @@ static int lpc32xx_nand_write_page_syndrome(struct mtd_info *mtd,const uint8_t *buf, int oob_required, int page) { - struct lpc32xx_nand_host *host = chip->priv; + struct lpc32xx_nand_host *host = nand_get_controller_data(chip);uint8_t *pb = chip->oob_poi + chip->ecc.layout->eccpos[0 ];int error;
@@ -800,7 +800,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev) chip = &host->nand_chip; mtd =nand_to_mtd (chip); - chip->priv = host; +nand_set_controller_data (chip, host);nand_set_flash_node (chip, pdev->dev.of_node); mtd->owner =THIS_MODULE ; mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/mpc5121_nfc.c +12 -12
@@ -135,7 +135,7 @@ static void mpc5121_nfc_done(struct mtd_info *mtd);static inline u16 nfc_read (struct mtd_info *mtd,uint reg) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);return in_be16 (prv->regs + reg); }
@@ -144,7 +144,7 @@ static inline u16 nfc_read(struct mtd_info *mtd, uint reg)static inline void nfc_write (struct mtd_info *mtd,uint reg,u16 val) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);out_be16 (prv->regs + reg, val); }
@@ -214,7 +214,7 @@ static irqreturn_t mpc5121_nfc_irq(int irq, void *data) {struct mtd_info *mtd = data;struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);nfc_set (mtd,NFC_CONFIG1 ,NFC_INT_MASK );wake_up (&prv->irq_waitq);
@@ -226,7 +226,7 @@ static irqreturn_t mpc5121_nfc_irq(int irq, void *data)static void mpc5121_nfc_done (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);int rv;if ((nfc_read (mtd,NFC_CONFIG2 ) &NFC_INT ) ==0 ) {
@@ -281,7 +281,7 @@ static void mpc5121_nfc_select_chip(struct mtd_info *mtd, int chip)static int ads5121_chipselect_init (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);struct device_node *dn; dn =of_find_compatible_node (NULL ,NULL ,"fsl,mpc5121ads-cpld" );
@@ -303,7 +303,7 @@ static int ads5121_chipselect_init(struct mtd_info *mtd)static void ads5121_select_chip (struct mtd_info *mtd,int chip) {struct nand_chip *nand =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = nand->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (nand);u8 v; v =in_8 (prv->csreg);
@@ -333,7 +333,7 @@ static void mpc5121_nfc_command(struct mtd_info *mtd, unsigned command, int column, int page) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip); prv->column = (column >=0 ) ? column :0 ; prv->spareonly =0 ;
@@ -406,7 +406,7 @@ static void mpc5121_nfc_copy_spare(struct mtd_info *mtd, uint offset, u8 *buffer, uint size, int wr) {struct nand_chip *nand =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = nand->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (nand);uint o, s, sbsize, blksize;/*
@@ -458,7 +458,7 @@ static void mpc5121_nfc_buf_copy(struct mtd_info *mtd, u_char *buf, int len, int wr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);uint c = prv->column;uint l;
@@ -536,7 +536,7 @@ static u16 mpc5121_nfc_read_word(struct mtd_info *mtd)static int mpc5121_nfc_read_hw_config (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);struct mpc512x_reset_module *rm;struct device_node *rmnode;uint rcw_pagesize =0 ;
@@ -615,7 +615,7 @@ out:static void mpc5121_nfc_free (struct device *dev,struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mpc5121_nfc_prv *prv = chip->priv; +struct mpc5121_nfc_prv *prv =nand_get_controller_data (chip);if (prv->clk)clk_disable_unprepare (prv->clk);
@@ -657,7 +657,7 @@ static int mpc5121_nfc_probe(struct platform_device *op) mtd =nand_to_mtd (chip); mtd->dev.parent = dev; - chip->priv = prv; +nand_set_controller_data (chip, prv);nand_set_flash_node (chip, dn); prv->dev = dev;
drivers/mtd/nand/mxc_nand.c +18 -18
@@ -532,7 +532,7 @@ static void send_addr_v1_v2(struct mxc_nand_host *host, uint16_t addr, int islasstatic void send_page_v3 (struct mtd_info *mtd,unsigned int ops) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);uint32_t tmp; tmp =readl (NFC_V3_CONFIG1 );
@@ -548,7 +548,7 @@ static void send_page_v3(struct mtd_info *mtd, unsigned int ops)static void send_page_v2 (struct mtd_info *mtd,unsigned int ops) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);/* NANDFC buffer 0 is used for page read/write */ writew (host->active_cs <<4 ,NFC_V1_V2_BUF_ADDR );
@@ -562,7 +562,7 @@ static void send_page_v2(struct mtd_info *mtd, unsigned int ops)static void send_page_v1 (struct mtd_info *mtd,unsigned int ops) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);int bufs, i;if (mtd->writesize >512 )
@@ -663,7 +663,7 @@ static int mxc_nand_correct_data_v1(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);/* * 1-Bit errors are automatically corrected in HW. No need for
@@ -684,7 +684,7 @@ static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat, u_char *read_ecc, u_char *calc_ecc) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);u32 ecc_stat, err;int no_subpages =1 ;int ret =0 ;
@@ -722,7 +722,7 @@ static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,static u_char mxc_nand_read_byte (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);uint8_t ret;/* Check for status request */
@@ -746,7 +746,7 @@ static u_char mxc_nand_read_byte(struct mtd_info *mtd)static uint16_t mxc_nand_read_word (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);uint16_t ret; ret = *(uint16_t *)(host->data_buf + host->buf_start);
@@ -762,7 +762,7 @@ static void mxc_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);u16 col = host->buf_start;int n = mtd->oobsize + mtd->writesize - col;
@@ -780,7 +780,7 @@ static void mxc_nand_write_buf(struct mtd_info *mtd,static void mxc_nand_read_buf (struct mtd_info *mtd,u_char *buf,int len) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);u16 col = host->buf_start;int n = mtd->oobsize + mtd->writesize - col;
@@ -796,7 +796,7 @@ static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)static void mxc_nand_select_chip_v1_v3 (struct mtd_info *mtd,int chip) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);if (chip ==-1 ) {/* Disable the NFC clock */
@@ -817,7 +817,7 @@ static void mxc_nand_select_chip_v1_v3(struct mtd_info *mtd, int chip)static void mxc_nand_select_chip_v2 (struct mtd_info *mtd,int chip) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);if (chip ==-1 ) {/* Disable the NFC clock */
@@ -850,7 +850,7 @@ static void mxc_nand_select_chip_v2(struct mtd_info *mtd, int chip)static void copy_spare (struct mtd_info *mtd,bool bfrom) {struct nand_chip *this =mtd_to_nand (mtd); -struct mxc_nand_host *host = this->priv; +struct mxc_nand_host *host =nand_get_controller_data (this);u16 i, oob_chunk_size;u16 num_chunks = mtd->writesize /512 ;
@@ -893,7 +893,7 @@ static void copy_spare(struct mtd_info *mtd, bool bfrom)static void mxc_do_addr_cycle (struct mtd_info *mtd,int column,int page_addr) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);/* Write out column address, if necessary */ if (column !=-1 ) {
@@ -979,7 +979,7 @@ static void ecc_8bit_layout_4k(struct nand_ecclayout *layout)static void preset_v1 (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);uint16_t config1 =0 ;if (nand_chip->ecc.mode ==NAND_ECC_HW && mtd->writesize)
@@ -1007,7 +1007,7 @@ static void preset_v1(struct mtd_info *mtd)static void preset_v2 (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);uint16_t config1 =0 ; config1 |=NFC_V2_CONFIG1_FP_INT ;
@@ -1053,7 +1053,7 @@ static void preset_v2(struct mtd_info *mtd)static void preset_v3 (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (chip);uint32_t config2, config3;int i, addr_phases;
@@ -1124,7 +1124,7 @@ static void mxc_nand_command(struct mtd_info *mtd, unsigned command, int column, int page_addr) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct mxc_nand_host *host = nand_chip->priv; +struct mxc_nand_host *host =nand_get_controller_data (nand_chip);pr_debug ("mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n" , command, column, page_addr);
@@ -1520,7 +1520,7 @@ static int mxcnd_probe(struct platform_device *pdev)/* 50 us command delay time */ this->chip_delay =5 ; - this->priv = host; +nand_set_controller_data (this, host);nand_set_flash_node (this, pdev->dev.of_node), this->dev_ready = mxc_nand_dev_ready; this->cmdfunc = mxc_nand_command;
drivers/mtd/nand/nandsim.c +2 -2
@@ -667,7 +667,7 @@ static char *get_partition_name(int i)static int init_nandsim (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct nandsim *ns = chip->priv; +struct nandsim *ns =nand_get_controller_data (chip);int i, ret =0 ;uint64_t remains;uint64_t next_offset;
@@ -2244,7 +2244,7 @@ static int __init ns_init_module(void) } nsmtd =nand_to_mtd (chip); nand = (struct nandsim *)(chip +1 ); - chip->priv = (void *)nand; +nand_set_controller_data (chip, (void *)nand);/* * Register simulator's callbacks.
drivers/mtd/nand/ndfc.c +8 -8
@@ -48,7 +48,7 @@ static void ndfc_select_chip(struct mtd_info *mtd, int chip) {uint32_t ccr;struct nand_chip *nchip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = nchip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (nchip); ccr =in_be32 (ndfc->ndfcbase +NDFC_CCR );if (chip >=0 ) {
@@ -62,7 +62,7 @@ static void ndfc_select_chip(struct mtd_info *mtd, int chip)static void ndfc_hwcontrol (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *chip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip);if (cmd ==NAND_CMD_NONE )return ;
@@ -76,7 +76,7 @@ static void ndfc_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)static int ndfc_ready (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip);return in_be32 (ndfc->ndfcbase +NDFC_STAT ) &NDFC_STAT_IS_READY ; }
@@ -85,7 +85,7 @@ static void ndfc_enable_hwecc(struct mtd_info *mtd, int mode) {uint32_t ccr;struct nand_chip *chip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip); ccr =in_be32 (ndfc->ndfcbase +NDFC_CCR ); ccr |=NDFC_CCR_RESET_ECC ;
@@ -97,7 +97,7 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char *ecc_code) { struct nand_chip *chip = mtd_to_nand(mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip);uint32_t ecc;uint8_t *p = (uint8_t *)&ecc;
@@ -121,7 +121,7 @@ static int ndfc_calculate_ecc(struct mtd_info *mtd,static void ndfc_read_buf (struct mtd_info *mtd,uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip);uint32_t *p = (uint32_t *) buf;for (;len >0 ; len -=4 )
@@ -131,7 +131,7 @@ static void ndfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)static void ndfc_write_buf (struct mtd_info *mtd,const uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct ndfc_controller *ndfc = chip->priv; +struct ndfc_controller *ndfc =nand_get_controller_data (chip);uint32_t *p = (uint32_t *) buf;for (;len >0 ; len -=4 )
@@ -165,7 +165,7 @@ static int ndfc_chip_init(struct ndfc_controller *ndfc, chip->ecc.size =256 ; chip->ecc.bytes =3 ; chip->ecc.strength =1 ; - chip->priv = ndfc; +nand_set_controller_data (chip, ndfc); mtd->dev.parent = &ndfc->ofdev->dev;
drivers/mtd/nand/orion_nand.c +2 -2
@@ -26,7 +26,7 @@static void orion_nand_cmd_ctrl (struct mtd_info *mtd,int cmd,unsigned int ctrl) {struct nand_chip *nc =mtd_to_nand (mtd); -struct orion_nand_data *board = nc->priv; +struct orion_nand_data *board =nand_get_controller_data (nc);u32 offs;if (cmd ==NAND_CMD_NONE )
@@ -124,7 +124,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) mtd->dev.parent = &pdev->dev; - nc->priv = board; +nand_set_controller_data (nc, board);nand_set_flash_node (nc, pdev->dev.of_node); nc->IO_ADDR_R = nc->IO_ADDR_W = io_base; nc->cmd_ctrl = orion_nand_cmd_ctrl;
drivers/mtd/nand/plat_nand.c +1 -1
@@ -56,7 +56,7 @@ static int plat_nand_probe(struct platform_device *pdev)if (IS_ERR (data->io_base))return PTR_ERR (data->io_base); - data->chip.priv = &data; +nand_set_controller_data (&data->chip, &data);nand_set_flash_node (&data->chip, pdev->dev.of_node); mtd =nand_to_mtd (&data->chip); mtd->dev.parent = &pdev->dev;
drivers/mtd/nand/pxa3xx_nand.c +11 -11
@@ -1114,7 +1114,7 @@ static void nand_cmdfunc(struct mtd_info *mtd, unsigned command, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;int exec_cmd;
@@ -1163,7 +1163,7 @@ static void nand_cmdfunc_extended(struct mtd_info *mtd, int column, int page_addr) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;int exec_cmd, ext_cmd_type;
@@ -1283,7 +1283,7 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, uint8_t *buf, int oob_required, int page) { - struct pxa3xx_nand_host *host = chip->priv; + struct pxa3xx_nand_host *host = nand_get_controller_data(chip);struct pxa3xx_nand_info *info = host->info_data; chip->read_buf (mtd, buf, mtd->writesize);
@@ -1310,7 +1310,7 @@ static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,static uint8_t pxa3xx_nand_read_byte (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;char retval =0xFF ;
@@ -1324,7 +1324,7 @@ static uint8_t pxa3xx_nand_read_byte(struct mtd_info *mtd)static u16 pxa3xx_nand_read_word (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;u16 retval =0xFFFF ;
@@ -1338,7 +1338,7 @@ static u16 pxa3xx_nand_read_word(struct mtd_info *mtd)static void pxa3xx_nand_read_buf (struct mtd_info *mtd,uint8_t *buf,int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;int real_len =min_t (size_t, len, info->buf_count - info->buf_start);
@@ -1350,7 +1350,7 @@ static void pxa3xx_nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;int real_len =min_t (size_t, len, info->buf_count - info->buf_start);
@@ -1366,7 +1366,7 @@ static void pxa3xx_nand_select_chip(struct mtd_info *mtd, int chip)static int pxa3xx_nand_waitfunc (struct mtd_info *mtd,struct nand_chip *this) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;if (info->need_wait) {
@@ -1573,7 +1573,7 @@ static int pxa_ecc_init(struct pxa3xx_nand_info *info,static int pxa3xx_nand_scan (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct pxa3xx_nand_host *host = chip->priv; +struct pxa3xx_nand_host *host =nand_get_controller_data (chip);struct pxa3xx_nand_info *info = host->info_data;struct platform_device *pdev = info->pdev;struct pxa3xx_nand_platform_data *pdata =dev_get_platdata (&pdev->dev);
@@ -1704,7 +1704,7 @@ static int alloc_nand_resource(struct platform_device *pdev)for (cs =0 ; cs < pdata->num_cs; cs++) { host = (void *)&info[1 ] +sizeof (*host) * cs; chip = &host->chip; - chip->priv = host; +nand_set_controller_data (chip, host); mtd =nand_to_mtd (chip); info->host[cs] = host; host->cs = cs;
@@ -1713,7 +1713,7 @@ static int alloc_nand_resource(struct platform_device *pdev)/* FIXME: all chips use the same device tree partitions */ nand_set_flash_node (chip, np); - chip->priv = host; +nand_set_controller_data (chip, host); chip->ecc.read_page = pxa3xx_nand_read_page_hwecc; chip->ecc.write_page = pxa3xx_nand_write_page_hwecc; chip->controller = &info->controller;
drivers/mtd/nand/r852.c +3 -3
@@ -65,7 +65,7 @@ static inline void r852_write_reg_dword(struct r852_device *dev,static inline struct r852_device *r852_get_dev (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -return chip->priv; +return nand_get_controller_data (chip); }
@@ -361,7 +361,7 @@ static void r852_cmdctl(struct mtd_info *mtd, int dat, unsigned int ctrl)*/ static int r852_wait (struct mtd_info *mtd,struct nand_chip *chip) { -struct r852_device *dev = chip->priv; +struct r852_device *dev =nand_get_controller_data (chip);unsigned long timeout;int status;
@@ -879,7 +879,7 @@ static int r852_probe(struct pci_dev *pci_dev, const struct pci_device_id *id)if (!dev) goto error5; - chip->priv = dev; +nand_set_controller_data (chip, dev); dev->chip = chip; dev->pci_dev = pci_dev;pci_set_drvdata (pci_dev, dev);
drivers/mtd/nand/s3c2410.c +2 -2
@@ -385,7 +385,7 @@ static void s3c2410_nand_select_chip(struct mtd_info *mtd, int chip)struct nand_chip *this =mtd_to_nand (mtd);unsigned long cur; - nmtd = this->priv; + nmtd =nand_get_controller_data (this); info = nmtd->info;if (chip !=-1 )
@@ -794,7 +794,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info, chip->read_buf = s3c2410_nand_read_buf; chip->select_chip = s3c2410_nand_select_chip; chip->chip_delay =50 ; - chip->priv = nmtd; +nand_set_controller_data (chip, nmtd); chip->options = set->options; chip->controller = &info->controller;
drivers/mtd/nand/socrates_nand.c +6 -5
@@ -45,7 +45,7 @@ static void socrates_nand_write_buf(struct mtd_info *mtd, {int i;struct nand_chip *this =mtd_to_nand (mtd); -struct socrates_nand_host *host = this->priv; +struct socrates_nand_host *host =nand_get_controller_data (this);for (i =0 ; i < len; i++) { out_be32(host->io_base, FPGA_NAND_ENABLE |
@@ -64,7 +64,7 @@ static void socrates_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) {int i;struct nand_chip *this =mtd_to_nand (mtd); -struct socrates_nand_host *host = this->priv; +struct socrates_nand_host *host =nand_get_controller_data (this);uint32_t val; val =FPGA_NAND_ENABLE |FPGA_NAND_CMD_READ ;
@@ -105,7 +105,7 @@ static void socrates_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct socrates_nand_host *host = nand_chip->priv; +struct socrates_nand_host *host =nand_get_controller_data (nand_chip);uint32_t val;if (cmd ==NAND_CMD_NONE )
@@ -130,7 +130,7 @@ static void socrates_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,static int socrates_nand_device_ready (struct mtd_info *mtd) {struct nand_chip *nand_chip =mtd_to_nand (mtd); -struct socrates_nand_host *host = nand_chip->priv; +struct socrates_nand_host *host =nand_get_controller_data (nand_chip);if (in_be32 (host->io_base) &FPGA_NAND_BUSY )return 0 ;/* busy */
@@ -162,7 +162,8 @@ static int socrates_nand_probe(struct platform_device *ofdev) mtd =nand_to_mtd (nand_chip); host->dev = &ofdev->dev; - nand_chip->priv = host;/* link the private data structures */ +/* link the private data structures */ +nand_set_controller_data (nand_chip, host);nand_set_flash_node (nand_chip, ofdev->dev.of_node); mtd->name ="socrates_nand" ; mtd->dev.parent = &ofdev->dev;
drivers/mtd/nand/txx9ndfmc.c +4 -4
@@ -79,7 +79,7 @@ struct txx9ndfmc_drvdata {static struct platform_device *mtd_to_platdev (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct txx9ndfmc_priv *txx9_priv = chip->priv; +struct txx9ndfmc_priv *txx9_priv =nand_get_controller_data (chip);return txx9_priv->dev; }
@@ -135,7 +135,7 @@ static void txx9ndfmc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) {struct nand_chip *chip =mtd_to_nand (mtd); -struct txx9ndfmc_priv *txx9_priv = chip->priv; +struct txx9ndfmc_priv *txx9_priv =nand_get_controller_data (chip);struct platform_device *dev = txx9_priv->dev;struct txx9ndfmc_platform_data *plat =dev_get_platdata (&dev->dev);
@@ -340,7 +340,7 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) chip->chip_delay =100 ; chip->controller = &drvdata->hw_control; - chip->priv = txx9_priv; +nand_set_controller_data (chip, txx9_priv); txx9_priv->dev = dev;if (plat->ch_mask !=1 ) {
@@ -389,7 +389,7 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev)if (!mtd)continue ; chip =mtd_to_nand (mtd); - txx9_priv = chip->priv; + txx9_priv =nand_get_controller_data (chip);nand_release (mtd);kfree (txx9_priv->mtdname);
Signature · 1 line
2.1.4
PATCH v4 58/58 staging: mt29f_spinand: make use of nand_set/get_controller_data() helpers
In reply to Boris BrezillonNew helpers have been added to avoid directly accessing chip->field. Use them where appropriate.
--- drivers/staging/mt29f_spinand/mt29f_spinand.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/staging/mt29f_spinand/mt29f_spinand.c +5 -5
@@ -32,7 +32,7 @@static inline struct spinand_state *mtd_to_state (struct mtd_info *mtd) {struct nand_chip *chip =mtd_to_nand (mtd); -struct spinand_info *info = (struct spinand_info *)chip->priv; +struct spinand_info *info =nand_get_controller_data (chip);struct spinand_state *state = (struct spinand_state *)info->priv;return state;
@@ -633,7 +633,7 @@ static int spinand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,u8 *p = buf;int eccsize = chip->ecc.size;int eccsteps = chip->ecc.steps; -struct spinand_info *info = (struct spinand_info *)chip->priv; +struct spinand_info *info =nand_get_controller_data (chip); enable_read_hw_ecc =1 ;
@@ -679,7 +679,7 @@ static u8 spinand_read_byte(struct mtd_info *mtd)static int spinand_wait (struct mtd_info *mtd,struct nand_chip *chip) { -struct spinand_info *info = (struct spinand_info *)chip->priv; +struct spinand_info *info =nand_get_controller_data (chip);unsigned long timeo = jiffies;int retval, state = chip->state;
@@ -745,7 +745,7 @@ static void spinand_cmdfunc(struct mtd_info *mtd, unsigned int command, int column, int page) {struct nand_chip *chip =mtd_to_nand (mtd); -struct spinand_info *info = (struct spinand_info *)chip->priv; +struct spinand_info *info =nand_get_controller_data (chip);struct spinand_state *state = (struct spinand_state *)info->priv;switch (command) {
@@ -894,7 +894,7 @@ static int spinand_probe(struct spi_device *spi_nand)#endif nand_set_flash_node (chip, spi_nand->dev.of_node); - chip->priv = info; +nand_set_controller_data (chip, info); chip->read_buf = spinand_read_buf; chip->write_buf = spinand_write_buf; chip->read_byte = spinand_read_byte;
Signature · 1 line
2.1.4
Hi,
Quoted 28 lines · Boris Brezillon
Hello,
This huge series aims at clarifying the relationship between the mtd and
nand_chipstructures and hiding NAND framework internals to NAND controller drivers.The first part of the series (patch 1 to 4) is a set of fixes/simple reworks easing the migration to
mtd_to_nand().The second part of the series embeds the mtd structure into the
nand_chipone so that NAND controller drivers don't have to bother allocating the MTD device and linking it with the NAND chip.The last part of the series hides accesses to the
chip->privfield behind two helper functions.This allows removal of some of the boilerplate code done in all NAND controller drivers, but most importantly, it unifies a bit the way NAND chip structures are instantiated (even though we still have two different kinds of drivers: those embedding the
nand_chipstruct into their private nand chip representation, and those allocating two different structures and linking them together with thechip->privfield).As said in the title, this refactoring is only the first step. I plan to rework the NAND controller / NAND chip separation for pretty much the same
reasons: clarifying the separation between the two concepts, and getting rid of more boilerplate code in NAND controller drivers.
Quoted 5 lines
Stay tuned ;-).
Best Regards,
Boris
Thanks a lot for all the work here! Nice cleanups. I think I've pushed everything correctly to l2-mtd.git. Please verify that things look sane to you, if possible. There were a few v5's thrown in after the fact, as well as other cleanups that required apply-conflicts.
I'll summarize below anything I remember that's changed since the cover letter, for posterity.
Quoted 11 lines
Changes since v3:
- fix some bugs introduced when migrating tonand_to_mtd()
- split the huge commit switching all drivers tonand_to_mtd()into several commits (one per driver) to ease review and integration
- add a simple fixes/reworks at the beginning of the series (mainly to ease migration tonand_to_mtd())
- drop already applied patches.Changes since v2:
- fix some build warnings/erros
Quoted 8 lines
Changes since v1:
- dropped already applied patches
- fixed some typos
- manually fixed some modifications omitted by the coccinelle scripts
- manually reworked modifactions done by coccinelle scripts to improve readability and fix coding style issues*** BLURB HERE ***
Nice blurb :)
Quoted 3 lines
Boris Brezillon (58):
mtd: nand: denali: add missingnand_release()call indenali_remove()
You sent v5 of this, and I added in the comment that was written/requested afterward. That caused some small conflicts later.
Quoted 4 lines
mtd: nand: fsmc: create and use
mtd_to_fsmc()
mtd: nand: nuc900: create and usemtd_to_nuc900()
mtd: nand: omap2: create and usemtd_to_omap()
mtd: nand: ams-delta: use the mtd instance embedded in struct
Quoted 8 lines
nand_chip
mtd: nand: atmel: use the mtd instance embedded in structnand_chip
mtd: nand: au1550nd: use the mtd instance embedded in structnand_chip
mtd: nand: bcm47xx: use the mtd instance embedded in structnand_chip
mtd: nand: bf5xx: use the mtd instance embedded in structnand_chip
mtd: nand: brcm: use the mtd instance embedded in structnand_chip
mtd: nand: cafe: use the mtd instance embedded in structnand_chip
mtd: nand: cmx270: use the mtd instance embedded in structnand_chip
^^ I dropped one comment in this one
Quoted 3 lines
mtd: nand: cs553x: use the mtd instance embedded in struct
nand_chip
mtd: nand: davinci: use the mtd instance embedded in structnand_chip
mtd: nand: denali: use the mtd instance embedded in structnand_chip
You sent v5, but there were still trivial conflicts.
Quoted 3 lines
mtd: nand: diskonchip: use the mtd instance embedded in struct
nand_chip
mtd: nand: docg4: use the mtd instance embedded in structnand_chip
I cleaned some things up after this one, causing more trivial conflicts later in the controller_data accessor patches.
Quoted 32 lines
mtd: nand:
fsl_elbc: use the mtd instance embedded in structnand_chip
mtd: nand:fsl_ifc: use the mtd instance embedded in structnand_chip
mtd: nand:fsl_upm: use the mtd instance embedded in structnand_chip
mtd: nand: fsmc: use the mtd instance embedded in structnand_chip
mtd: nand: gpio: use the mtd instance embedded in structnand_chip
mtd: nand: gpmi: use the mtd instance embedded in structnand_chip
mtd: nand: hisi504: use the mtd instance embedded in structnand_chip
mtd: nand: jz4740: use the mtd instance embedded in structnand_chip
mtd: nand: lpc32xx: use the mtd instance embedded in structnand_chip
mtd: nand: mpc5121: use the mtd instance embedded in structnand_chip
mtd: nand: mxc: use the mtd instance embedded in structnand_chip
mtd: nand: nandsim: use the mtd instance embedded in structnand_chip
mtd: nand: ndfc: use the mtd instance embedded in structnand_chip
mtd: nand: nuc900: use the mtd instance embedded in structnand_chip
mtd: nand: omap2: use the mtd instance embedded in structnand_chip
mtd: nand: orion: use the mtd instance embedded in structnand_chip
mtd: nand: pasemi: use the mtd instance embedded in structnand_chip
mtd: nand: plat: use the mtd instance embedded in structnand_chip
mtd: nand: pxa3xx: use the mtd instance embedded in structnand_chip
mtd: nand: r852: use the mtd instance embedded in structnand_chip
mtd: nand: s3c2410: use the mtd instance embedded in structnand_chip
mtd: nand:sh_flctl: use the mtd instance embedded in structnand_chip
mtd: nand: sharpsl: use the mtd instance embedded in structnand_chip
mtd: nand: socrates: use the mtd instance embedded in structnand_chip
mtd: nand: sunxi: use the mtd instance embedded in structnand_chip
mtd: nand: tmio: use the mtd instance embedded in structnand_chip
mtd: nand: txx9ndfmc: use the mtd instance embedded in struct
nand_chip
mtd: nand: vf610: use the mtd instance embedded in structnand_chip
mtd: nand: update the documentation to reflect framework changes
staging:mt29f_spinand: use the mtd instance embedded in struct
nand_chip
Quoted 8 lines
cris: nand: use the mtd instance embedded in struct
nand_chip
mtd: nand: updatemtd_to_nand()
mtd: nand: remove uselessmtd->priv= chip assignments
cris: nand: remove uselessmtd->priv= chip assignments
staging:mt29f_spinand: remove uselessmtd->priv= chip assignment
mtd: nand: simplifynand_dt_init()usage
mtd: nand: kill thechip->flash_nodefield
mtd: nand: add helpers to access ->priv
I have some comments on this one, so I'm not pushing the last 4 patches for now.
Quoted 1 line
ARM: make use of nand_set/get_controller_data() helpers
BTW, I see that plat_nand.c and arch/arm/mach-ixp4xx/ixdp425-setup.c are making conflicting use of the ->priv field. You've essentially fixed the conflict in:
[PATCH] mtd: nand: remove unused and buggy get_platform_nandchip() helper function
http://lists.infradead.org/pipermail/linux-mtd/2015-December/064409.html
But really, that's a pretty big hack still... I don't care to fix it myself right now. Just whining :)
Quoted 3 lines
mtd: nand: make use of nand_set/get_controller_data() helpers
staging:mt29f_spinand: make use of nand_set/get_controller_data()
helpers
[...]
So, this has passed all my build tests and LGTM. Pushed patches 1 - 54 to l2-mtd.git!
Much thanks,
Brian