[ 1/1] KVM/MMU: Fix comment in walk_shadow_page_lockless_end()

2018-09-06 Thread Tianyu Lan
kvm_commit_zap_page() has been renamed to kvm_mmu_commit_zap_page()
This patch is to fix the commit.

Signed-off-by: Lan Tianyu 
---
 arch/x86/kvm/mmu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 7ccd29b95746..648b839a349d 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -947,7 +947,7 @@ static void walk_shadow_page_lockless_end(struct kvm_vcpu 
*vcpu)
 {
/*
 * Make sure the write to vcpu->mode is not reordered in front of
-* reads to sptes.  If it does, kvm_commit_zap_page() can see us
+* reads to sptes.  If it does, kvm_mmu_commit_zap_page() can see us
 * OUTSIDE_GUEST_MODE and proceed to free the shadow page table.
 */
smp_store_release(>mode, OUTSIDE_GUEST_MODE);
-- 
2.14.4
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] vme: remove unneeded kfree

2018-09-06 Thread Linus Torvalds
On Thu, Sep 6, 2018 at 1:51 AM Ding Xiang
 wrote:
>
> put_device will call vme_dev_release to free vdev, kfree is
> unnecessary here.

That does seem to be the case.  I think "unnecessary" is overly kind,
it does seem to be a double free.

Looks like the issue was introduced back in 2013 by commit
def1820d25fa ("vme: add missing put_device() after device_register()
fails").

It seems you should *either* kfree() the vdev, _or_ do put_device(),
but doing both seems wrong.

I presume the device_register() has never failed, and this being
vme-only I'm guessing there isn't a vibrant testing community.

Greg?

  Linus
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: KASAN: null-ptr-deref Write in binder_update_page_range

2018-09-06 Thread Minchan Kim
Thanks, Martijn,

Greg, could you have a look to pick up?

On Mon, Aug 27, 2018 at 03:35:24PM +0200, Martijn Coenen wrote:
> Thanks Minchan!
> 
> On Thu, Aug 23, 2018 at 7:29 AM, Minchan Kim  wrote:
> > Signed-off-by: Todd Kjos 
> > Signed-off-by: Minchan Kim 
> Reviewed-by: Martijn Coenen 
> 
> > ---
> >  drivers/android/binder_alloc.c | 43 +++---
> >  1 file changed, 35 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
> > index 3f3b7b253445..64fd96eada31 100644
> > --- a/drivers/android/binder_alloc.c
> > +++ b/drivers/android/binder_alloc.c
> > @@ -332,6 +332,35 @@ static int binder_update_page_range(struct 
> > binder_alloc *alloc, int allocate,
> > return vma ? -ENOMEM : -ESRCH;
> >  }
> >
> > +
> > +static inline void binder_alloc_set_vma(struct binder_alloc *alloc,
> > +   struct vm_area_struct *vma)
> > +{
> > +   if (vma)
> > +   alloc->vma_vm_mm = vma->vm_mm;
> > +   /*
> > +* If we see alloc->vma is not NULL, buffer data structures set up
> > +* completely. Look at smp_rmb side binder_alloc_get_vma.
> > +* We also want to guarantee new alloc->vma_vm_mm is always visible
> > +* if alloc->vma is set.
> > +*/
> > +   smp_wmb();
> > +   alloc->vma = vma;
> > +}
> > +
> > +static inline struct vm_area_struct *binder_alloc_get_vma(
> > +   struct binder_alloc *alloc)
> > +{
> > +   struct vm_area_struct *vma = NULL;
> > +
> > +   if (alloc->vma) {
> > +   /* Look at description in binder_alloc_set_vma */
> > +   smp_rmb();
> > +   vma = alloc->vma;
> > +   }
> > +   return vma;
> > +}
> > +
> >  static struct binder_buffer *binder_alloc_new_buf_locked(
> > struct binder_alloc *alloc,
> > size_t data_size,
> > @@ -348,7 +377,7 @@ static struct binder_buffer 
> > *binder_alloc_new_buf_locked(
> > size_t size, data_offsets_size;
> > int ret;
> >
> > -   if (alloc->vma == NULL) {
> > +   if (!binder_alloc_get_vma(alloc)) {
> > binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
> >"%d: binder_alloc_buf, no vma\n",
> >alloc->pid);
> > @@ -723,9 +752,7 @@ int binder_alloc_mmap_handler(struct binder_alloc 
> > *alloc,
> > buffer->free = 1;
> > binder_insert_free_buffer(alloc, buffer);
> > alloc->free_async_space = alloc->buffer_size / 2;
> > -   barrier();
> > -   alloc->vma = vma;
> > -   alloc->vma_vm_mm = vma->vm_mm;
> > +   binder_alloc_set_vma(alloc, vma);
> > mmgrab(alloc->vma_vm_mm);
> >
> > return 0;
> > @@ -754,10 +781,10 @@ void binder_alloc_deferred_release(struct 
> > binder_alloc *alloc)
> > int buffers, page_count;
> > struct binder_buffer *buffer;
> >
> > -   BUG_ON(alloc->vma);
> > -
> > buffers = 0;
> > mutex_lock(>mutex);
> > +   BUG_ON(alloc->vma);
> > +
> > while ((n = rb_first(>allocated_buffers))) {
> > buffer = rb_entry(n, struct binder_buffer, rb_node);
> >
> > @@ -900,7 +927,7 @@ int binder_alloc_get_allocated_count(struct 
> > binder_alloc *alloc)
> >   */
> >  void binder_alloc_vma_close(struct binder_alloc *alloc)
> >  {
> > -   WRITE_ONCE(alloc->vma, NULL);
> > +   binder_alloc_set_vma(alloc, NULL);
> >  }
> >
> >  /**
> > @@ -935,7 +962,7 @@ enum lru_status binder_alloc_free_page(struct list_head 
> > *item,
> >
> > index = page - alloc->pages;
> > page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE;
> > -   vma = alloc->vma;
> > +   vma = binder_alloc_get_vma(alloc);
> > if (vma) {
> > if (!mmget_not_zero(alloc->vma_vm_mm))
> > goto err_mmget;
> > --
> > 2.18.0.1017.ga543ac7ca45-goog
> >
> >
> >
> >
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 19/19] mtd: rawnand: Move JEDEC code to nand_jedec.c

2018-09-06 Thread Boris Brezillon
This moves ONFI related code to nand_onfi.c and ONFI related
struct/macros to include/linux/mtd/onfi.h.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/Makefile |   1 +
 drivers/mtd/nand/raw/internals.h  |   3 +
 drivers/mtd/nand/raw/nand_base.c  |  98 +
 drivers/mtd/nand/raw/nand_jedec.c | 113 ++
 include/linux/mtd/jedec.h |  91 ++
 include/linux/mtd/rawnand.h   |  79 +-
 6 files changed, 210 insertions(+), 175 deletions(-)
 create mode 100644 drivers/mtd/nand/raw/nand_jedec.c
 create mode 100644 include/linux/mtd/jedec.h

diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile
index cc9f50f3ad1b..be2c17863ee5 100644
--- a/drivers/mtd/nand/raw/Makefile
+++ b/drivers/mtd/nand/raw/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_MTD_NAND_TEGRA)  += tegra_nand.o
 
 nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o
 nand-objs += nand_onfi.o
+nand-objs += nand_jedec.o
 nand-objs += nand_amd.o
 nand-objs += nand_hynix.o
 nand-objs += nand_macronix.o
diff --git a/drivers/mtd/nand/raw/internals.h b/drivers/mtd/nand/raw/internals.h
index 1ce720a8d756..88b5da620e7d 100644
--- a/drivers/mtd/nand/raw/internals.h
+++ b/drivers/mtd/nand/raw/internals.h
@@ -108,4 +108,7 @@ int nand_legacy_check_hooks(struct nand_chip *chip);
 u16 onfi_crc16(u16 crc, u8 const *p, size_t len);
 int nand_onfi_detect(struct nand_chip *chip);
 
+/* JEDEC functions */
+int nand_jedec_detect(struct nand_chip *chip);
+
 #endif /* __LINUX_RAWNAND_INTERNALS */
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 812e8bd6ad82..dc3955da0426 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -4387,102 +4387,6 @@ void sanitize_string(uint8_t *s, size_t len)
strim(s);
 }
 
-/*
- * Check if the NAND chip is JEDEC compliant, returns 1 if it is, 0 otherwise.
- */
-static int nand_flash_detect_jedec(struct nand_chip *chip)
-{
-   struct mtd_info *mtd = nand_to_mtd(chip);
-   struct nand_jedec_params *p;
-   struct jedec_ecc_info *ecc;
-   int jedec_version = 0;
-   char id[5];
-   int i, val, ret;
-
-   /* Try JEDEC for unknown chip or LP */
-   ret = nand_readid_op(chip, 0x40, id, sizeof(id));
-   if (ret || strncmp(id, "JEDEC", sizeof(id)))
-   return 0;
-
-   /* JEDEC chip: allocate a buffer to hold its parameter page */
-   p = kzalloc(sizeof(*p), GFP_KERNEL);
-   if (!p)
-   return -ENOMEM;
-
-   ret = nand_read_param_page_op(chip, 0x40, NULL, 0);
-   if (ret) {
-   ret = 0;
-   goto free_jedec_param_page;
-   }
-
-   for (i = 0; i < 3; i++) {
-   ret = nand_read_data_op(chip, p, sizeof(*p), true);
-   if (ret) {
-   ret = 0;
-   goto free_jedec_param_page;
-   }
-
-   if (onfi_crc16(ONFI_CRC_BASE, (uint8_t *)p, 510) ==
-   le16_to_cpu(p->crc))
-   break;
-   }
-
-   if (i == 3) {
-   pr_err("Could not find valid JEDEC parameter page; aborting\n");
-   goto free_jedec_param_page;
-   }
-
-   /* Check version */
-   val = le16_to_cpu(p->revision);
-   if (val & (1 << 2))
-   jedec_version = 10;
-   else if (val & (1 << 1))
-   jedec_version = 1; /* vendor specific version */
-
-   if (!jedec_version) {
-   pr_info("unsupported JEDEC version: %d\n", val);
-   goto free_jedec_param_page;
-   }
-
-   sanitize_string(p->manufacturer, sizeof(p->manufacturer));
-   sanitize_string(p->model, sizeof(p->model));
-   chip->parameters.model = kstrdup(p->model, GFP_KERNEL);
-   if (!chip->parameters.model) {
-   ret = -ENOMEM;
-   goto free_jedec_param_page;
-   }
-
-   mtd->writesize = le32_to_cpu(p->byte_per_page);
-
-   /* Please reference to the comment for nand_flash_detect_onfi. */
-   mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1);
-   mtd->erasesize *= mtd->writesize;
-
-   mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page);
-
-   /* Please reference to the comment for nand_flash_detect_onfi. */
-   chip->chipsize = 1 << (fls(le32_to_cpu(p->blocks_per_lun)) - 1);
-   chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count;
-   chip->bits_per_cell = p->bits_per_cell;
-
-   if (le16_to_cpu(p->features) & JEDEC_FEATURE_16_BIT_BUS)
-   chip->options |= NAND_BUSWIDTH_16;
-
-   /* ECC info */
-   ecc = >ecc_info[0];
-
-   if (ecc->codeword_size >= 9) {
-   chip->ecc_strength_ds = ecc->ecc_bits;
-   chip->ecc_step_ds = 1 << ecc->codeword_size;
-   } else {
-   pr_warn("Invalid 

[PATCH 14/19] mtd: rawnand: Move platform_nand_xxx definitions out of rawnand.h

2018-09-06 Thread Boris Brezillon
platform_nand_xxx definitions are just used by the plat_nand driver.
Let's move those definitions out of the core/driver-agnostic rawnand.h
header.

Signed-off-by: Boris Brezillon 
---
 arch/arm/mach-ep93xx/snappercl15.c  |  3 +-
 arch/arm/mach-ep93xx/ts72xx.c   |  3 +-
 arch/arm/mach-imx/mach-qong.c   |  2 +-
 arch/arm/mach-omap1/board-fsample.c |  3 +-
 arch/arm/mach-omap1/board-h2.c  |  3 +-
 arch/arm/mach-omap1/board-h3.c  |  2 +-
 arch/arm/mach-omap1/board-perseus2.c|  3 +-
 arch/arm/mach-orion5x/ts78xx-setup.c|  3 +-
 arch/arm/mach-pxa/balloon3.c|  3 +-
 arch/arm/mach-pxa/em-x270.c |  3 +-
 arch/arm/mach-pxa/palmtx.c  |  3 +-
 arch/mips/alchemy/devboards/db1200.c|  3 +-
 arch/mips/alchemy/devboards/db1300.c|  3 +-
 arch/mips/alchemy/devboards/db1550.c|  3 +-
 arch/mips/netlogic/xlr/platform-flash.c |  3 +-
 arch/mips/pnx833x/common/platform.c |  3 +-
 arch/mips/rb532/devices.c   |  3 +-
 arch/sh/boards/mach-migor/setup.c   |  2 +-
 drivers/mtd/nand/raw/plat_nand.c|  3 +-
 include/linux/mtd/platnand.h| 74 +
 include/linux/mtd/rawnand.h | 60 --
 21 files changed, 93 insertions(+), 95 deletions(-)
 create mode 100644 include/linux/mtd/platnand.h

diff --git a/arch/arm/mach-ep93xx/snappercl15.c 
b/arch/arm/mach-ep93xx/snappercl15.c
index 1dad83a0bc5b..cf0cb58b3454 100644
--- a/arch/arm/mach-ep93xx/snappercl15.c
+++ b/arch/arm/mach-ep93xx/snappercl15.c
@@ -23,8 +23,7 @@
 #include 
 #include 
 
-#include 
-#include 
+#include 
 
 #include 
 #include 
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index 188bf02595c5..c6a533699b00 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -16,8 +16,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c
index 48972944bb95..5c5df8ca38dd 100644
--- a/arch/arm/mach-imx/mach-qong.c
+++ b/arch/arm/mach-imx/mach-qong.c
@@ -18,7 +18,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 
 #include 
diff --git a/arch/arm/mach-omap1/board-fsample.c 
b/arch/arm/mach-omap1/board-fsample.c
index e9f512a0602e..4a0a66815ca0 100644
--- a/arch/arm/mach-omap1/board-fsample.c
+++ b/arch/arm/mach-omap1/board-fsample.c
@@ -16,8 +16,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c
index d5dd2acd6f78..9d9a6ca15df0 100644
--- a/arch/arm/mach-omap1/board-h2.c
+++ b/arch/arm/mach-omap1/board-h2.c
@@ -24,8 +24,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index a75856fe4259..cd6e02c5c01a 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -23,7 +23,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-omap1/board-perseus2.c 
b/arch/arm/mach-omap1/board-perseus2.c
index c61c7c7520ca..06a584fef5b8 100644
--- a/arch/arm/mach-omap1/board-perseus2.c
+++ b/arch/arm/mach-omap1/board-perseus2.c
@@ -16,8 +16,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c 
b/arch/arm/mach-orion5x/ts78xx-setup.c
index aac2c6eb35e2..fda9b75c3a33 100644
--- a/arch/arm/mach-orion5x/ts78xx-setup.c
+++ b/arch/arm/mach-orion5x/ts78xx-setup.c
@@ -16,8 +16,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c
index 256e60c38a6d..c52c081eb6d9 100644
--- a/arch/arm/mach-pxa/balloon3.c
+++ b/arch/arm/mach-pxa/balloon3.c
@@ -25,11 +25,10 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
-#include 
+#include 
 #include 
 #include 
 
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 3acb945a2628..c30d20e1fb7a 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -15,8 +15,7 @@
 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 #include 
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index 36ea32c1bbcc..1d06a8e91d8f 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -28,8 +28,7 @@
 #include 
 #include 
 #include 
-#include 
-#include 
+#include 
 #include 
 #include 
 
diff --git a/arch/mips/alchemy/devboards/db1200.c 
b/arch/mips/alchemy/devboards/db1200.c
index 97dc74f7f41a..4bf02f96ab7f 100644
--- a/arch/mips/alchemy/devboards/db1200.c
+++ b/arch/mips/alchemy/devboards/db1200.c
@@ -29,8 +29,7 @@
 

[PATCH 18/19] mtd: rawnand: Move ONFI code to nand_onfi.c

2018-09-06 Thread Boris Brezillon
This moves ONFI related code to nand_onfi.c and ONFI related
struct/macros to include/linux/mtd/onfi.h.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/Makefile|   1 +
 drivers/mtd/nand/raw/internals.h |   7 +
 drivers/mtd/nand/raw/nand_base.c | 296 +
 drivers/mtd/nand/raw/nand_onfi.c | 305 +++
 include/linux/mtd/onfi.h | 178 +++
 include/linux/mtd/rawnand.h  | 164 +
 6 files changed, 496 insertions(+), 455 deletions(-)
 create mode 100644 drivers/mtd/nand/raw/nand_onfi.c
 create mode 100644 include/linux/mtd/onfi.h

diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile
index 78f67de2e60b..cc9f50f3ad1b 100644
--- a/drivers/mtd/nand/raw/Makefile
+++ b/drivers/mtd/nand/raw/Makefile
@@ -58,6 +58,7 @@ obj-$(CONFIG_MTD_NAND_MTK)+= mtk_ecc.o mtk_nand.o
 obj-$(CONFIG_MTD_NAND_TEGRA)   += tegra_nand.o
 
 nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o
+nand-objs += nand_onfi.o
 nand-objs += nand_amd.o
 nand-objs += nand_hynix.o
 nand-objs += nand_macronix.o
diff --git a/drivers/mtd/nand/raw/internals.h b/drivers/mtd/nand/raw/internals.h
index 289a4b8f7974..1ce720a8d756 100644
--- a/drivers/mtd/nand/raw/internals.h
+++ b/drivers/mtd/nand/raw/internals.h
@@ -88,8 +88,11 @@ int nand_read_page_raw_notsupp(struct nand_chip *chip, u8 
*buf,
 int nand_write_page_raw_notsupp(struct nand_chip *chip, const u8 *buf,
int oob_required, int page);
 int nand_exit_status_op(struct nand_chip *chip);
+int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
+   unsigned int len);
 void nand_decode_ext_id(struct nand_chip *chip);
 void panic_nand_wait(struct nand_chip *chip, unsigned long timeo);
+void sanitize_string(uint8_t *s, size_t len);
 
 /* BBT functions */
 int nand_markbad_bbt(struct nand_chip *chip, loff_t offs);
@@ -101,4 +104,8 @@ void nand_legacy_set_defaults(struct nand_chip *chip);
 void nand_legacy_adjust_cmdfunc(struct nand_chip *chip);
 int nand_legacy_check_hooks(struct nand_chip *chip);
 
+/* ONFI functions */
+u16 onfi_crc16(u16 crc, u8 const *p, size_t len);
+int nand_onfi_detect(struct nand_chip *chip);
+
 #endif /* __LINUX_RAWNAND_INTERNALS */
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 4ef00cefd5da..812e8bd6ad82 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -986,8 +986,8 @@ EXPORT_SYMBOL_GPL(nand_read_page_op);
  *
  * Returns 0 on success, a negative error code otherwise.
  */
-static int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
-  unsigned int len)
+int nand_read_param_page_op(struct nand_chip *chip, u8 page, void *buf,
+   unsigned int len)
 {
unsigned int i;
u8 *p = buf;
@@ -4370,7 +4370,7 @@ static void nand_set_defaults(struct nand_chip *chip)
 }
 
 /* Sanitize ONFI strings so we can safely print them */
-static void sanitize_string(uint8_t *s, size_t len)
+void sanitize_string(uint8_t *s, size_t len)
 {
ssize_t i;
 
@@ -4387,294 +4387,6 @@ static void sanitize_string(uint8_t *s, size_t len)
strim(s);
 }
 
-static u16 onfi_crc16(u16 crc, u8 const *p, size_t len)
-{
-   int i;
-   while (len--) {
-   crc ^= *p++ << 8;
-   for (i = 0; i < 8; i++)
-   crc = (crc << 1) ^ ((crc & 0x8000) ? 0x8005 : 0);
-   }
-
-   return crc;
-}
-
-/* Parse the Extended Parameter Page. */
-static int nand_flash_detect_ext_param_page(struct nand_chip *chip,
-   struct nand_onfi_params *p)
-{
-   struct onfi_ext_param_page *ep;
-   struct onfi_ext_section *s;
-   struct onfi_ext_ecc_info *ecc;
-   uint8_t *cursor;
-   int ret;
-   int len;
-   int i;
-
-   len = le16_to_cpu(p->ext_param_page_length) * 16;
-   ep = kmalloc(len, GFP_KERNEL);
-   if (!ep)
-   return -ENOMEM;
-
-   /* Send our own NAND_CMD_PARAM. */
-   ret = nand_read_param_page_op(chip, 0, NULL, 0);
-   if (ret)
-   goto ext_out;
-
-   /* Use the Change Read Column command to skip the ONFI param pages. */
-   ret = nand_change_read_column_op(chip,
-sizeof(*p) * p->num_of_param_pages,
-ep, len, true);
-   if (ret)
-   goto ext_out;
-
-   ret = -EINVAL;
-   if ((onfi_crc16(ONFI_CRC_BASE, ((uint8_t *)ep) + 2, len - 2)
-   != le16_to_cpu(ep->crc))) {
-   pr_debug("fail in the CRC.\n");
-   goto ext_out;
-   }
-
-   /*
-* Check the signature.
-* Do not strictly follow the ONFI spec, maybe changed in future.
-*/
-   if (strncmp(ep->sig, 

[PATCH 13/19] mtd: rawnand: Get rid of a few unused definitions

2018-09-06 Thread Boris Brezillon
Those definitions are not used, let's remove them.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/nand_timings.c | 14 --
 include/linux/mtd/rawnand.h |  8 
 2 files changed, 22 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_timings.c 
b/drivers/mtd/nand/raw/nand_timings.c
index ebc7b5f76f77..cb4f0007b65c 100644
--- a/drivers/mtd/nand/raw/nand_timings.c
+++ b/drivers/mtd/nand/raw/nand_timings.c
@@ -270,20 +270,6 @@ static const struct nand_data_interface onfi_sdr_timings[] 
= {
},
 };
 
-/**
- * onfi_async_timing_mode_to_sdr_timings - [NAND Interface] Retrieve NAND
- * timings according to the given ONFI timing mode
- * @mode: ONFI timing mode
- */
-const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode)
-{
-   if (mode < 0 || mode >= ARRAY_SIZE(onfi_sdr_timings))
-   return ERR_PTR(-EINVAL);
-
-   return _sdr_timings[mode].timings.sdr;
-}
-EXPORT_SYMBOL(onfi_async_timing_mode_to_sdr_timings);
-
 /**
  * onfi_fill_data_interface - [NAND Interface] Initialize a data interface from
  * given ONFI mode
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 608279104aae..8aa8b57ca4b1 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -119,10 +119,6 @@ enum nand_ecc_algo {
 #define NAND_ECC_GENERIC_ERASED_CHECK  BIT(0)
 #define NAND_ECC_MAXIMIZE  BIT(1)
 
-/* Bit mask for flags passed to do_nand_read_ecc */
-#define NAND_GET_DEVICE0x80
-
-
 /*
  * Option constants for bizarre disfunctionality and real
  * features.
@@ -163,9 +159,7 @@ enum nand_ecc_algo {
 #define NAND_SAMSUNG_LP_OPTIONS NAND_CACHEPRG
 
 /* Macros to identify the above */
-#define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
 #define NAND_HAS_SUBPAGE_READ(chip) ((chip->options & NAND_SUBPAGE_READ))
-#define NAND_HAS_SUBPAGE_WRITE(chip) !((chip)->options & NAND_NO_SUBPAGE_WRITE)
 
 /* Non chip related options */
 /* This option skips the bbt scan during initialization. */
@@ -1649,8 +1643,6 @@ static inline int nand_opcode_8bits(unsigned int command)
return 0;
 }
 
-/* get timing characteristics from ONFI timing mode. */
-const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode);
 
 int nand_check_erased_ecc_chunk(void *data, int datalen,
void *ecc, int ecclen,
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 03/19] mtd: rawnand: Deprecate ->{read, write}_{byte, buf}() hooks

2018-09-06 Thread Boris Brezillon
All those hooks have been replaced by ->exec_op(). Move them to the
nand_legacy struct.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |  6 +--
 drivers/mtd/nand/raw/atmel/nand-controller.c |  8 ++--
 drivers/mtd/nand/raw/au1550nd.c  |  6 +--
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  6 +--
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  6 +--
 drivers/mtd/nand/raw/cafe_nand.c | 10 ++---
 drivers/mtd/nand/raw/cmx270_nand.c   |  6 +--
 drivers/mtd/nand/raw/cs553x_nand.c   |  6 +--
 drivers/mtd/nand/raw/davinci_nand.c  |  4 +-
 drivers/mtd/nand/raw/denali.c| 12 +++---
 drivers/mtd/nand/raw/diskonchip.c| 28 ++---
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  6 +--
 drivers/mtd/nand/raw/fsl_ifc_nand.c  | 12 +++---
 drivers/mtd/nand/raw/fsl_upm.c   |  6 +--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   | 14 +++
 drivers/mtd/nand/raw/hisi504_nand.c  | 10 ++---
 drivers/mtd/nand/raw/lpc32xx_slc.c   | 16 
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  6 +--
 drivers/mtd/nand/raw/mtk_nand.c  |  8 ++--
 drivers/mtd/nand/raw/mxc_nand.c  | 10 ++---
 drivers/mtd/nand/raw/nand_base.c | 50 
 drivers/mtd/nand/raw/nand_hynix.c|  2 +-
 drivers/mtd/nand/raw/nandsim.c   |  8 ++--
 drivers/mtd/nand/raw/ndfc.c  |  4 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  6 +--
 drivers/mtd/nand/raw/omap2.c | 22 +--
 drivers/mtd/nand/raw/orion_nand.c|  2 +-
 drivers/mtd/nand/raw/oxnas_nand.c|  6 +--
 drivers/mtd/nand/raw/pasemi_nand.c   |  4 +-
 drivers/mtd/nand/raw/plat_nand.c |  4 +-
 drivers/mtd/nand/raw/qcom_nandc.c| 17 
 drivers/mtd/nand/raw/r852.c  |  6 +--
 drivers/mtd/nand/raw/s3c2410.c   |  8 ++--
 drivers/mtd/nand/raw/sh_flctl.c  | 10 ++---
 drivers/mtd/nand/raw/socrates_nand.c |  6 +--
 drivers/mtd/nand/raw/sunxi_nand.c|  6 +--
 drivers/mtd/nand/raw/tango_nand.c|  6 +--
 drivers/mtd/nand/raw/tmio_nand.c |  6 +--
 drivers/mtd/nand/raw/txx9ndfmc.c |  6 +--
 drivers/mtd/nand/raw/xway_nand.c |  6 +--
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  8 ++--
 include/linux/mtd/rawnand.h  | 21 +-
 42 files changed, 200 insertions(+), 200 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 5bc8b29faf6d..6616f473aeb2 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -210,9 +210,9 @@ static int ams_delta_init(struct platform_device *pdev)
/* Set address of NAND IO lines */
this->legacy.IO_ADDR_R = io_base + OMAP_MPUIO_INPUT_LATCH;
this->legacy.IO_ADDR_W = io_base + OMAP_MPUIO_OUTPUT;
-   this->read_byte = ams_delta_read_byte;
-   this->write_buf = ams_delta_write_buf;
-   this->read_buf = ams_delta_read_buf;
+   this->legacy.read_byte = ams_delta_read_byte;
+   this->legacy.write_buf = ams_delta_write_buf;
+   this->legacy.read_buf = ams_delta_read_buf;
this->cmd_ctrl = ams_delta_hwcontrol;
if (gpio_request(AMS_DELTA_GPIO_PIN_NAND_RB, "nand_rdy") == 0) {
this->dev_ready = ams_delta_nand_ready;
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index a38633a67ead..9b2876b5a9c2 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -1473,10 +1473,10 @@ static void atmel_nand_init(struct 
atmel_nand_controller *nc,
nand->base.controller = >base;
 
chip->cmd_ctrl = atmel_nand_cmd_ctrl;
-   chip->read_byte = atmel_nand_read_byte;
-   chip->write_byte = atmel_nand_write_byte;
-   chip->read_buf = atmel_nand_read_buf;
-   chip->write_buf = atmel_nand_write_buf;
+   chip->legacy.read_byte = atmel_nand_read_byte;
+   chip->legacy.write_byte = atmel_nand_write_byte;
+   chip->legacy.read_buf = atmel_nand_read_buf;
+   chip->legacy.write_buf = atmel_nand_write_buf;
chip->select_chip = atmel_nand_select_chip;
 
if (nc->mck && nc->caps->ops->setup_data_interface)
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index b7bb2b2af4ef..0db5dc61b155 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -440,10 +440,10 @@ static int au1550nd_probe(struct platform_device *pdev)
if (pd->devwidth)
this->options |= NAND_BUSWIDTH_16;
 
-   this->read_byte = (pd->devwidth) ? 

[PATCH 09/19] mtd: rawnand: Deprecate ->chip_delay

2018-09-06 Thread Boris Brezillon
The wait timeouts and delays are directly extracted from the NAND
timings and ->chip_delay is only used in legacy path, so let's move it
to the nand_legacy struct to make it clear.

Signed-off-by: Boris Brezillon 
---
 Documentation/driver-api/mtdnand.rst |  2 +-
 drivers/mtd/nand/raw/ams-delta.c |  2 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |  2 +-
 drivers/mtd/nand/raw/au1550nd.c  |  4 ++--
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  2 +-
 drivers/mtd/nand/raw/cafe_nand.c |  2 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |  2 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  2 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  2 +-
 drivers/mtd/nand/raw/diskonchip.c|  4 ++--
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  4 ++--
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  4 ++--
 drivers/mtd/nand/raw/fsl_upm.c   |  2 +-
 drivers/mtd/nand/raw/fsmc_nand.c |  1 -
 drivers/mtd/nand/raw/gpio.c  |  2 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |  2 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  2 +-
 drivers/mtd/nand/raw/jz4780_nand.c   |  2 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  2 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  2 +-
 drivers/mtd/nand/raw/mxc_nand.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 14 +++---
 drivers/mtd/nand/raw/nandsim.c   |  2 +-
 drivers/mtd/nand/raw/ndfc.c  |  2 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  6 +++---
 drivers/mtd/nand/raw/omap2.c |  4 ++--
 drivers/mtd/nand/raw/orion_nand.c|  2 +-
 drivers/mtd/nand/raw/oxnas_nand.c|  2 +-
 drivers/mtd/nand/raw/pasemi_nand.c   |  2 +-
 drivers/mtd/nand/raw/plat_nand.c |  2 +-
 drivers/mtd/nand/raw/s3c2410.c   |  2 +-
 drivers/mtd/nand/raw/sh_flctl.c  |  2 +-
 drivers/mtd/nand/raw/sharpsl.c   |  2 +-
 drivers/mtd/nand/raw/socrates_nand.c |  2 +-
 drivers/mtd/nand/raw/sunxi_nand.c|  2 +-
 drivers/mtd/nand/raw/tmio_nand.c |  2 +-
 drivers/mtd/nand/raw/txx9ndfmc.c |  2 +-
 drivers/mtd/nand/raw/xway_nand.c |  2 +-
 include/linux/mtd/rawnand.h  |  6 +++---
 39 files changed, 53 insertions(+), 54 deletions(-)

diff --git a/Documentation/driver-api/mtdnand.rst 
b/Documentation/driver-api/mtdnand.rst
index 0d3fa4d6576d..55447659b81f 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -240,7 +240,7 @@ necessary information about the device.
 /* Reference hardware control function */
 this->hwcontrol = board_hwcontrol;
 /* Set command delay time, see datasheet for correct value */
-this->chip_delay = CHIP_DEPENDEND_COMMAND_DELAY;
+this->legacy.chip_delay = CHIP_DEPENDEND_COMMAND_DELAY;
 /* Assign the device ready function, if available */
 this->legacy.dev_ready = board_dev_ready;
 this->eccmode = NAND_ECC_SOFT;
diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 2fa6fa3c7464..3d3786dcc5d1 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -221,7 +221,7 @@ static int ams_delta_init(struct platform_device *pdev)
pr_notice("Couldn't request gpio for Delta NAND ready.\n");
}
/* 25 us command delay time */
-   this->chip_delay = 30;
+   this->legacy.chip_delay = 30;
this->ecc.mode = NAND_ECC_SOFT;
this->ecc.algo = NAND_ECC_HAMMING;
 
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index dd022080442d..ad0245c66892 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -1483,7 +1483,7 @@ static void atmel_nand_init(struct atmel_nand_controller 
*nc,
chip->setup_data_interface = atmel_nand_setup_data_interface;
 
/* Some NANDs require a longer delay than the default one (20us). */
-   chip->chip_delay = 40;
+   chip->legacy.chip_delay = 40;
 
/*
 * Use a bounce buffer when the buffer passed by the MTD user is not
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 81bba469c0e4..9731c1c487f6 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -342,7 +342,7 @@ static void au1550_command(struct nand_chip *this, unsigned 
command,
/* Apply a short delay always to ensure that we do wait tWB. */
ndelay(100);
/* Wait for a chip to become ready... */
-   for (i = this->chip_delay;
+   for 

[PATCH 10/19] mtd: rawnand: Move function prototypes after struct declarations

2018-09-06 Thread Boris Brezillon
Move nand_scan[_with_ids]() and nand_wait_ready() at the end of the
file where all function prototype lies. This will also allow us to get
rid of the nand_flash_dev forward declaration.

Signed-off-by: Boris Brezillon 
---
 include/linux/mtd/rawnand.h | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 992d78d29674..15183b73fed2 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -27,18 +27,6 @@
 struct nand_chip;
 struct nand_flash_dev;
 
-/* Scan and identify a NAND device */
-int nand_scan_with_ids(struct nand_chip *chip, unsigned int max_chips,
-  struct nand_flash_dev *ids);
-
-static inline int nand_scan(struct nand_chip *chip, unsigned int max_chips)
-{
-   return nand_scan_with_ids(chip, max_chips, NULL);
-}
-
-/* Internal helper for board drivers which need to override command function */
-void nand_wait_ready(struct nand_chip *chip);
-
 /* The maximum number of NAND chips in an array */
 #define NAND_MAX_CHIPS 8
 
@@ -1739,6 +1727,18 @@ int nand_read_data_op(struct nand_chip *chip, void *buf, 
unsigned int len,
 int nand_write_data_op(struct nand_chip *chip, const void *buf,
   unsigned int len, bool force_8bit);
 
+/* Scan and identify a NAND device */
+int nand_scan_with_ids(struct nand_chip *chip, unsigned int max_chips,
+  struct nand_flash_dev *ids);
+
+static inline int nand_scan(struct nand_chip *chip, unsigned int max_chips)
+{
+   return nand_scan_with_ids(chip, max_chips, NULL);
+}
+
+/* Internal helper for board drivers which need to override command function */
+void nand_wait_ready(struct nand_chip *chip);
+
 /*
  * Free resources held by the NAND device, must be called on error after a
  * sucessful nand_scan().
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 05/19] mtd: rawnand: Deprecate ->dev_ready() and ->waitfunc()

2018-09-06 Thread Boris Brezillon
Those hooks have been replaced by ->exec_op(). Move them to the
nand_legacy struct.

Signed-off-by: Boris Brezillon 
---
 Documentation/driver-api/mtdnand.rst |  4 +--
 drivers/mtd/nand/raw/ams-delta.c |  4 +--
 drivers/mtd/nand/raw/atmel/nand-controller.c |  8 +++---
 drivers/mtd/nand/raw/au1550nd.c  |  7 +++--
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  2 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  2 +-
 drivers/mtd/nand/raw/cafe_nand.c |  2 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |  2 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  2 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  2 +-
 drivers/mtd/nand/raw/denali.c|  7 +++--
 drivers/mtd/nand/raw/diskonchip.c| 10 +++
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  2 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  2 +-
 drivers/mtd/nand/raw/fsl_upm.c   |  2 +-
 drivers/mtd/nand/raw/gpio.c  |  2 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  2 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  2 +-
 drivers/mtd/nand/raw/jz4780_nand.c   |  2 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  4 +--
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  2 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  2 +-
 drivers/mtd/nand/raw/mtk_nand.c  |  2 +-
 drivers/mtd/nand/raw/mxc_nand.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 36 
 drivers/mtd/nand/raw/nandsim.c   |  2 +-
 drivers/mtd/nand/raw/ndfc.c  |  2 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  8 +++---
 drivers/mtd/nand/raw/omap2.c |  4 +--
 drivers/mtd/nand/raw/pasemi_nand.c   |  2 +-
 drivers/mtd/nand/raw/plat_nand.c |  2 +-
 drivers/mtd/nand/raw/r852.c  |  6 ++--
 drivers/mtd/nand/raw/s3c2410.c   |  6 ++--
 drivers/mtd/nand/raw/sharpsl.c   |  2 +-
 drivers/mtd/nand/raw/socrates_nand.c |  2 +-
 drivers/mtd/nand/raw/sunxi_nand.c|  4 +--
 drivers/mtd/nand/raw/tango_nand.c|  4 +--
 drivers/mtd/nand/raw/tmio_nand.c |  4 +--
 drivers/mtd/nand/raw/txx9ndfmc.c |  2 +-
 drivers/mtd/nand/raw/xway_nand.c |  2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  2 +-
 include/linux/mtd/rawnand.h  | 18 ++--
 42 files changed, 93 insertions(+), 93 deletions(-)

diff --git a/Documentation/driver-api/mtdnand.rst 
b/Documentation/driver-api/mtdnand.rst
index 1d2403f1d8c5..0d3fa4d6576d 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -197,7 +197,7 @@ to read back the state of the pin. The function has no 
arguments and
 should return 0, if the device is busy (R/B pin is low) and 1, if the
 device is ready (R/B pin is high). If the hardware interface does not
 give access to the ready busy pin, then the function must not be defined
-and the function pointer this->dev_ready is set to NULL.
+and the function pointer this->legacy.dev_ready is set to NULL.
 
 Init function
 -
@@ -242,7 +242,7 @@ necessary information about the device.
 /* Set command delay time, see datasheet for correct value */
 this->chip_delay = CHIP_DEPENDEND_COMMAND_DELAY;
 /* Assign the device ready function, if available */
-this->dev_ready = board_dev_ready;
+this->legacy.dev_ready = board_dev_ready;
 this->eccmode = NAND_ECC_SOFT;
 
 /* Scan to find existence of the device */
diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 756f6339d457..2fa6fa3c7464 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -215,9 +215,9 @@ static int ams_delta_init(struct platform_device *pdev)
this->legacy.read_buf = ams_delta_read_buf;
this->legacy.cmd_ctrl = ams_delta_hwcontrol;
if (gpio_request(AMS_DELTA_GPIO_PIN_NAND_RB, "nand_rdy") == 0) {
-   this->dev_ready = ams_delta_nand_ready;
+   this->legacy.dev_ready = ams_delta_nand_ready;
} else {
-   this->dev_ready = NULL;
+   this->legacy.dev_ready = NULL;
pr_notice("Couldn't request gpio for Delta NAND ready.\n");
}
/* 25 us command delay time */
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 37f617ec178e..dd022080442d 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -488,14 +488,14 @@ static void atmel_nand_select_chip(struct nand_chip 
*chip, int cs)
 
if (cs < 0 || cs >= nand->numcs) {

[PATCH 07/19] mtd: rawnand: Deprecate ->erase()

2018-09-06 Thread Boris Brezillon
The ->erase() hook have been overloaded by some drivers for bad reasons:
either the driver was not fitting in the NAND framework and should have
been an MTD driver (docg4), or the driver uses a specific path for the
ERASE operation (denali), instead of implementing it generically.
In any case, we should discourage people from overloading this method
and encourage them to implement ->exec_op() instead.

Move the ->erase() hook to the nand_legacy struct to make it clear.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/denali.c| 2 +-
 drivers/mtd/nand/raw/nand_base.c | 7 +--
 include/linux/mtd/rawnand.h  | 4 ++--
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
index c14493ef6126..858358027dc9 100644
--- a/drivers/mtd/nand/raw/denali.c
+++ b/drivers/mtd/nand/raw/denali.c
@@ -1275,7 +1275,7 @@ static int denali_attach_chip(struct nand_chip *chip)
chip->ecc.write_page_raw = denali_write_page_raw;
chip->ecc.read_oob = denali_read_oob;
chip->ecc.write_oob = denali_write_oob;
-   chip->erase = denali_erase;
+   chip->legacy.erase = denali_erase;
 
ret = denali_multidev_fixup(denali);
if (ret)
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index d71a3d303903..57c89e275a3a 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -4730,7 +4730,11 @@ int nand_erase_nand(struct nand_chip *chip, struct 
erase_info *instr,
(page + pages_per_block))
chip->pagebuf = -1;
 
-   status = chip->erase(chip, page & chip->pagemask);
+   if (chip->legacy.erase)
+   status = chip->legacy.erase(chip,
+   page & chip->pagemask);
+   else
+   status = single_erase(chip, page & chip->pagemask);
 
/* See if block erase succeeded */
if (status) {
@@ -5756,7 +5760,6 @@ static int nand_detect(struct nand_chip *chip, struct 
nand_flash_dev *type)
chip->options |= NAND_ROW_ADDR_3;
 
chip->badblockbits = 8;
-   chip->erase = single_erase;
 
/* Do not replace user supplied command function! */
if (mtd->writesize > 512 && chip->legacy.cmdfunc == nand_command)
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index aa3e931d0206..97c6ff7d127e 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1189,6 +1189,7 @@ int nand_op_parser_exec_op(struct nand_chip *chip,
  * @waitfunc: hardware specific function for wait on ready.
  * @block_bad: check if a block is bad, using OOB markers
  * @block_markbad: mark a block bad
+ * @erase: erase function
  *
  * If you look at this structure you're already wrong. These fields/hooks are
  * all deprecated.
@@ -1207,6 +1208,7 @@ struct nand_legacy {
int (*waitfunc)(struct nand_chip *chip);
int (*block_bad)(struct nand_chip *chip, loff_t ofs);
int (*block_markbad)(struct nand_chip *chip, loff_t ofs);
+   int (*erase)(struct nand_chip *chip, int page);
 };
 
 /**
@@ -1228,7 +1230,6 @@ struct nand_legacy {
  * @buf_align: minimum buffer alignment required by a platform
  * @dummy_controller:  dummy controller implementation for drivers that can
  * only control a single chip
- * @erase: [REPLACEABLE] erase function
  * @chip_delay:[BOARDSPECIFIC] chip dependent delay for 
transferring
  * data from array to read regs (tR).
  * @state: [INTERN] the current state of the NAND device
@@ -1308,7 +1309,6 @@ struct nand_chip {
int (*exec_op)(struct nand_chip *chip,
   const struct nand_operation *op,
   bool check_only);
-   int (*erase)(struct nand_chip *chip, int page);
int (*set_features)(struct nand_chip *chip, int feature_addr,
uint8_t *subfeature_para);
int (*get_features)(struct nand_chip *chip, int feature_addr,
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 15/19] mtd: rawnand: Inline onfi_get_async_timing_mode()

2018-09-06 Thread Boris Brezillon
onfi_get_async_timing_mode() is only used in one place inside
nand_base.c. Let's inline the code and kill the helper.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/nand_base.c | 5 +++--
 include/linux/mtd/rawnand.h  | 9 -
 2 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 2f8bbc3bca7a..136ccdc61a06 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -1310,8 +1310,9 @@ static int nand_init_data_interface(struct nand_chip 
*chip)
 * if the NAND does not support ONFI, fallback to the default ONFI
 * timing mode.
 */
-   modes = onfi_get_async_timing_mode(chip);
-   if (modes == ONFI_TIMING_MODE_UNKNOWN) {
+   if (chip->parameters.onfi) {
+   modes = chip->parameters.onfi->async_timing_mode;
+   } else {
if (!chip->onfi_timing_mode_default)
return 0;
 
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 04e11a314e9c..7f0e3dc222ed 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1540,15 +1540,6 @@ int nand_isbad_bbt(struct nand_chip *chip, loff_t offs, 
int allowbbt);
 int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
int allowbbt);
 
-/* return the supported asynchronous timing mode. */
-static inline int onfi_get_async_timing_mode(struct nand_chip *chip)
-{
-   if (!chip->parameters.onfi)
-   return ONFI_TIMING_MODE_UNKNOWN;
-
-   return chip->parameters.onfi->async_timing_mode;
-}
-
 int onfi_fill_data_interface(struct nand_chip *chip,
 enum nand_data_interface_type type,
 int timing_mode);
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 06/19] mtd: rawnand: Deprecate ->block_{bad,markbad}() hooks

2018-09-06 Thread Boris Brezillon
Those hooks have been overloaded by some drivers for bad reasons:
either the driver was not fitting in the NAND framework and should
have been an MTD driver (docg4), or it was not properly implementing
the OOB read/write request or had a weird layout where BBM are trashed.
In any case, we should discourage people from overloading those
methods and encourage them to fix their driver instead.

Move the ->block_{bad,markbad}() hooks to the nand_legacy struct to
make it clear.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/cafe_nand.c   |  2 +-
 drivers/mtd/nand/raw/diskonchip.c  |  2 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c |  4 ++--
 drivers/mtd/nand/raw/nand_base.c   | 37 ++
 drivers/mtd/nand/raw/nand_bbt.c|  2 +-
 drivers/mtd/nand/raw/qcom_nandc.c  |  4 ++--
 drivers/mtd/nand/raw/sm_common.c   |  2 +-
 include/linux/mtd/rawnand.h|  9 
 8 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index 738af0f0a48d..db62b12800d3 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -719,7 +719,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,
 
if (skipbbt) {
cafe->nand.options |= NAND_SKIP_BBTSCAN;
-   cafe->nand.block_bad = cafe_nand_block_bad;
+   cafe->nand.legacy.block_bad = cafe_nand_block_bad;
}
 
if (numtimings && numtimings != 3) {
diff --git a/drivers/mtd/nand/raw/diskonchip.c 
b/drivers/mtd/nand/raw/diskonchip.c
index c3a79369fbed..16fdfd06ef25 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -1572,7 +1572,7 @@ static int __init doc_probe(unsigned long physadr)
nand->legacy.cmd_ctrl   = doc200x_hwcontrol;
nand->legacy.dev_ready  = doc200x_dev_ready;
nand->legacy.waitfunc   = doc200x_wait;
-   nand->block_bad = doc200x_block_bad;
+   nand->legacy.block_bad  = doc200x_block_bad;
nand->ecc.hwctl = doc200x_enable_hwecc;
nand->ecc.calculate = doc200x_calculate_ecc;
nand->ecc.correct   = doc200x_correct_data;
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c 
b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
index dc6291902acf..94c2b7525c85 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
@@ -1774,7 +1774,7 @@ static int mx23_boot_init(struct gpmi_nand_data  *this)
 */
if (block_mark != 0xff) {
dev_dbg(dev, "Transcribing mark in block %u\n", block);
-   ret = chip->block_markbad(chip, byte);
+   ret = chip->legacy.block_markbad(chip, byte);
if (ret)
dev_err(dev,
"Failed to mark block bad with ret 
%d\n",
@@ -1908,7 +1908,7 @@ static int gpmi_nand_init(struct gpmi_nand_data *this)
chip->legacy.read_buf   = gpmi_read_buf;
chip->legacy.write_buf  = gpmi_write_buf;
chip->badblock_pattern  = _bbt_descr;
-   chip->block_markbad = gpmi_block_markbad;
+   chip->legacy.block_markbad = gpmi_block_markbad;
chip->options   |= NAND_NO_SUBPAGE_WRITE;
 
/* Set up swap_block_mark, must be set before the gpmi_set_geometry() */
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 30b55a4677f9..d71a3d303903 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -475,6 +475,27 @@ static int nand_default_block_markbad(struct nand_chip 
*chip, loff_t ofs)
return ret;
 }
 
+/**
+ * nand_markbad_bbm - mark a block by updating the BBM
+ * @chip: NAND chip object
+ * @ofs: offset of the block to mark bad
+ */
+int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs)
+{
+   if (chip->legacy.block_markbad)
+   return chip->legacy.block_markbad(chip, ofs);
+
+   return nand_default_block_markbad(chip, ofs);
+}
+
+static int nand_isbad_bbm(struct nand_chip *chip, loff_t ofs)
+{
+   if (chip->legacy.block_bad)
+   return chip->legacy.block_bad(chip, ofs);
+
+   return nand_block_bad(chip, ofs);
+}
+
 /**
  * nand_block_markbad_lowlevel - mark a block bad
  * @mtd: MTD device structure
@@ -482,7 +503,7 @@ static int nand_default_block_markbad(struct nand_chip 
*chip, loff_t ofs)
  *
  * This function performs the generic NAND bad block marking steps (i.e., bad
  * block table(s) and/or marker(s)). We only allow the hardware driver to
- * specify how to write bad block markers to OOB (chip->block_markbad).
+ * specify how to write bad block markers to OOB (chip->legacy.block_markbad).
  *
  * We try operations in the following order:
  *
@@ -510,7 +531,7 @@ static int 

[PATCH 02/19] mtd: rawnand: Create a legacy struct and move ->IO_ADDR_{R, W} there

2018-09-06 Thread Boris Brezillon
We regularly have new NAND controller drivers that are making use of
fields/hooks that we want to get rid of but can't because of all the
legacy drivers that we might break if we do.

So, instead of removing those fields/hooks, let's move them to a
sub-struct which is clearly documented as deprecated.

We start with the ->IO_ADDR_{R,W] fields.

Signed-off-by: Boris Brezillon 
---
 Documentation/driver-api/mtdnand.rst | 24 
 arch/arm/mach-ep93xx/snappercl15.c   |  5 +++--
 arch/arm/mach-ep93xx/ts72xx.c|  6 +++---
 arch/arm/mach-imx/mach-qong.c|  4 ++--
 arch/arm/mach-ixp4xx/ixdp425-setup.c |  2 +-
 arch/arm/mach-omap1/board-nand.c |  2 +-
 arch/arm/mach-orion5x/ts78xx-setup.c |  6 +++---
 arch/arm/mach-pxa/balloon3.c |  2 +-
 arch/arm/mach-pxa/em-x270.c  |  6 +++---
 arch/arm/mach-pxa/palmtx.c   |  2 +-
 arch/mips/alchemy/devboards/db1200.c |  6 +++---
 arch/mips/alchemy/devboards/db1300.c |  6 +++---
 arch/mips/alchemy/devboards/db1550.c |  6 +++---
 arch/mips/pnx833x/common/platform.c  |  2 +-
 arch/mips/rb532/devices.c|  2 +-
 arch/sh/boards/mach-migor/setup.c|  6 +++---
 drivers/mtd/nand/raw/ams-delta.c |  8 
 drivers/mtd/nand/raw/au1550nd.c  | 26 +-
 drivers/mtd/nand/raw/cmx270_nand.c   | 16 
 drivers/mtd/nand/raw/cs553x_nand.c   | 30 +++---
 drivers/mtd/nand/raw/davinci_nand.c  | 24 
 drivers/mtd/nand/raw/fsl_upm.c   | 16 
 drivers/mtd/nand/raw/gpio.c  | 10 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  8 
 drivers/mtd/nand/raw/jz4780_nand.c   |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  4 ++--
 drivers/mtd/nand/raw/nand_base.c | 12 ++--
 drivers/mtd/nand/raw/ndfc.c  |  4 ++--
 drivers/mtd/nand/raw/omap2.c | 30 +++---
 drivers/mtd/nand/raw/orion_nand.c|  6 +++---
 drivers/mtd/nand/raw/pasemi_nand.c   | 22 +++---
 drivers/mtd/nand/raw/plat_nand.c |  4 ++--
 drivers/mtd/nand/raw/s3c2410.c   | 12 ++--
 drivers/mtd/nand/raw/sharpsl.c   |  6 +++---
 drivers/mtd/nand/raw/tmio_nand.c |  6 +++---
 include/linux/mtd/rawnand.h  | 26 --
 37 files changed, 190 insertions(+), 175 deletions(-)

diff --git a/Documentation/driver-api/mtdnand.rst 
b/Documentation/driver-api/mtdnand.rst
index 5470a3d6bd9e..1d2403f1d8c5 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -180,10 +180,10 @@ by a chip select decoder.
 {
 struct nand_chip *this = mtd_to_nand(mtd);
 switch(cmd){
-case NAND_CTL_SETCLE: this->IO_ADDR_W |= CLE_ADRR_BIT;  break;
-case NAND_CTL_CLRCLE: this->IO_ADDR_W &= ~CLE_ADRR_BIT; break;
-case NAND_CTL_SETALE: this->IO_ADDR_W |= ALE_ADRR_BIT;  break;
-case NAND_CTL_CLRALE: this->IO_ADDR_W &= ~ALE_ADRR_BIT; break;
+case NAND_CTL_SETCLE: this->legacy.IO_ADDR_W |= CLE_ADRR_BIT;  
break;
+case NAND_CTL_CLRCLE: this->legacy.IO_ADDR_W &= ~CLE_ADRR_BIT; 
break;
+case NAND_CTL_SETALE: this->legacy.IO_ADDR_W |= ALE_ADRR_BIT;  
break;
+case NAND_CTL_CLRALE: this->legacy.IO_ADDR_W &= ~ALE_ADRR_BIT; 
break;
 }
 }
 
@@ -235,8 +235,8 @@ necessary information about the device.
 }
 
 /* Set address of NAND IO lines */
-this->IO_ADDR_R = baseaddr;
-this->IO_ADDR_W = baseaddr;
+this->legacy.IO_ADDR_R = baseaddr;
+this->legacy.IO_ADDR_W = baseaddr;
 /* Reference hardware control function */
 this->hwcontrol = board_hwcontrol;
 /* Set command delay time, see datasheet for correct value */
@@ -336,17 +336,17 @@ connected to an address decoder.
 struct nand_chip *this = mtd_to_nand(mtd);
 
 /* Deselect all chips */
-this->IO_ADDR_R &= ~BOARD_NAND_ADDR_MASK;
-this->IO_ADDR_W &= ~BOARD_NAND_ADDR_MASK;
+this->legacy.IO_ADDR_R &= ~BOARD_NAND_ADDR_MASK;
+this->legacy.IO_ADDR_W &= ~BOARD_NAND_ADDR_MASK;
 switch (chip) {
 case 0:
-this->IO_ADDR_R |= BOARD_NAND_ADDR_CHIP0;
-this->IO_ADDR_W |= BOARD_NAND_ADDR_CHIP0;
+this->legacy.IO_ADDR_R |= BOARD_NAND_ADDR_CHIP0;
+this->legacy.IO_ADDR_W |= BOARD_NAND_ADDR_CHIP0;
 break;
 
 case n:
-this->IO_ADDR_R |= BOARD_NAND_ADDR_CHIPn;
-this->IO_ADDR_W |= BOARD_NAND_ADDR_CHIPn;
+this->legacy.IO_ADDR_R |= BOARD_NAND_ADDR_CHIPn;
+this->legacy.IO_ADDR_W |= BOARD_NAND_ADDR_CHIPn;
 break;
 }
 }
diff --git a/arch/arm/mach-ep93xx/snappercl15.c 
b/arch/arm/mach-ep93xx/snappercl15.c
index aa03ea79c5f5..1dad83a0bc5b 100644
--- 

[PATCH 08/19] mtd: rawnand: Deprecate ->{set,get}_features() hooks

2018-09-06 Thread Boris Brezillon
Those hooks should be replaced by a proper ->exec_op() implementation.
Move them to the nand_legacy struct to make it clear.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |   4 +-
 drivers/mtd/nand/raw/cafe_nand.c |   4 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |   4 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |   4 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |   4 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   |   4 +-
 drivers/mtd/nand/raw/mxc_nand.c  |   4 +-
 drivers/mtd/nand/raw/nand_base.c | 112 +--
 drivers/mtd/nand/raw/qcom_nandc.c|   4 +-
 drivers/mtd/nand/raw/sh_flctl.c  |   4 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|   4 +-
 include/linux/mtd/rawnand.h  |  12 +--
 12 files changed, 70 insertions(+), 94 deletions(-)

diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
index 925d4cd4401e..357bc75948b0 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
@@ -390,8 +390,8 @@ int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash 
*b47n)
b47n->nand_chip.legacy.read_byte = bcm47xxnflash_ops_bcm4706_read_byte;
b47n->nand_chip.legacy.read_buf = bcm47xxnflash_ops_bcm4706_read_buf;
b47n->nand_chip.legacy.write_buf = bcm47xxnflash_ops_bcm4706_write_buf;
-   b47n->nand_chip.set_features = nand_get_set_features_notsupp;
-   b47n->nand_chip.get_features = nand_get_set_features_notsupp;
+   b47n->nand_chip.legacy.set_features = nand_get_set_features_notsupp;
+   b47n->nand_chip.legacy.get_features = nand_get_set_features_notsupp;
 
nand_chip->chip_delay = 50;
b47n->nand_chip.bbt_options = NAND_BBT_USE_FLASH;
diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index db62b12800d3..e3f702bef549 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -709,8 +709,8 @@ static int cafe_nand_probe(struct pci_dev *pdev,
cafe->nand.legacy.read_buf = cafe_read_buf;
cafe->nand.legacy.write_buf = cafe_write_buf;
cafe->nand.select_chip = cafe_select_chip;
-   cafe->nand.set_features = nand_get_set_features_notsupp;
-   cafe->nand.get_features = nand_get_set_features_notsupp;
+   cafe->nand.legacy.set_features = nand_get_set_features_notsupp;
+   cafe->nand.legacy.get_features = nand_get_set_features_notsupp;
 
cafe->nand.chip_delay = 0;
 
diff --git a/drivers/mtd/nand/raw/fsl_elbc_nand.c 
b/drivers/mtd/nand/raw/fsl_elbc_nand.c
index 29f0832de39b..c5f3aa908416 100644
--- a/drivers/mtd/nand/raw/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_elbc_nand.c
@@ -782,8 +782,8 @@ static int fsl_elbc_chip_init(struct fsl_elbc_mtd *priv)
chip->select_chip = fsl_elbc_select_chip;
chip->legacy.cmdfunc = fsl_elbc_cmdfunc;
chip->legacy.waitfunc = fsl_elbc_wait;
-   chip->set_features = nand_get_set_features_notsupp;
-   chip->get_features = nand_get_set_features_notsupp;
+   chip->legacy.set_features = nand_get_set_features_notsupp;
+   chip->legacy.get_features = nand_get_set_features_notsupp;
 
chip->bbt_td = _main_descr;
chip->bbt_md = _mirror_descr;
diff --git a/drivers/mtd/nand/raw/fsl_ifc_nand.c 
b/drivers/mtd/nand/raw/fsl_ifc_nand.c
index 682ae383c3e9..a303d12079f0 100644
--- a/drivers/mtd/nand/raw/fsl_ifc_nand.c
+++ b/drivers/mtd/nand/raw/fsl_ifc_nand.c
@@ -867,8 +867,8 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
chip->select_chip = fsl_ifc_select_chip;
chip->legacy.cmdfunc = fsl_ifc_cmdfunc;
chip->legacy.waitfunc = fsl_ifc_wait;
-   chip->set_features = nand_get_set_features_notsupp;
-   chip->get_features = nand_get_set_features_notsupp;
+   chip->legacy.set_features = nand_get_set_features_notsupp;
+   chip->legacy.get_features = nand_get_set_features_notsupp;
 
chip->bbt_td = _main_descr;
chip->bbt_md = _mirror_descr;
diff --git a/drivers/mtd/nand/raw/hisi504_nand.c 
b/drivers/mtd/nand/raw/hisi504_nand.c
index 6e17239983db..fee7d63e8de8 100644
--- a/drivers/mtd/nand/raw/hisi504_nand.c
+++ b/drivers/mtd/nand/raw/hisi504_nand.c
@@ -788,8 +788,8 @@ static int hisi_nfc_probe(struct platform_device *pdev)
chip->legacy.write_buf  = hisi_nfc_write_buf;
chip->legacy.read_buf   = hisi_nfc_read_buf;
chip->chip_delay= HINFC504_CHIP_DELAY;
-   chip->set_features  = nand_get_set_features_notsupp;
-   chip->get_features  = nand_get_set_features_notsupp;
+   chip->legacy.set_features   = nand_get_set_features_notsupp;
+   chip->legacy.get_features   = nand_get_set_features_notsupp;
 
hisi_nfc_host_init(host);
 
diff --git 

[PATCH 04/19] mtd: rawnand: Deprecate ->cmd_ctrl() and ->cmdfunc()

2018-09-06 Thread Boris Brezillon
Those hooks have been replaced by ->exec_op(). Move them to the
nand_legacy struct.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |   2 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |   4 +-
 drivers/mtd/nand/raw/au1550nd.c  |   2 +-
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |   6 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |   4 +-
 drivers/mtd/nand/raw/cafe_nand.c |   2 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |   2 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |   2 +-
 drivers/mtd/nand/raw/davinci_nand.c  |   2 +-
 drivers/mtd/nand/raw/denali.c|   2 +-
 drivers/mtd/nand/raw/diskonchip.c|   6 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |   2 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |   2 +-
 drivers/mtd/nand/raw/fsl_upm.c   |   4 +-
 drivers/mtd/nand/raw/gpio.c  |   2 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |   2 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |   2 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |   2 +-
 drivers/mtd/nand/raw/jz4780_nand.c   |   2 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |   2 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |   2 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   |   2 +-
 drivers/mtd/nand/raw/mtk_nand.c  |   2 +-
 drivers/mtd/nand/raw/mxc_nand.c  |   2 +-
 drivers/mtd/nand/raw/nand_base.c | 138 ---
 drivers/mtd/nand/raw/nand_hynix.c|   4 +-
 drivers/mtd/nand/raw/nandsim.c   |   2 +-
 drivers/mtd/nand/raw/ndfc.c  |   2 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |   2 +-
 drivers/mtd/nand/raw/omap2.c |   2 +-
 drivers/mtd/nand/raw/orion_nand.c|   2 +-
 drivers/mtd/nand/raw/oxnas_nand.c|   2 +-
 drivers/mtd/nand/raw/pasemi_nand.c   |   2 +-
 drivers/mtd/nand/raw/plat_nand.c |   2 +-
 drivers/mtd/nand/raw/qcom_nandc.c|  14 +--
 drivers/mtd/nand/raw/r852.c  |   2 +-
 drivers/mtd/nand/raw/s3c2410.c   |   6 +-
 drivers/mtd/nand/raw/sh_flctl.c  |   2 +-
 drivers/mtd/nand/raw/sharpsl.c   |   2 +-
 drivers/mtd/nand/raw/socrates_nand.c |   2 +-
 drivers/mtd/nand/raw/sunxi_nand.c|   2 +-
 drivers/mtd/nand/raw/tango_nand.c|   2 +-
 drivers/mtd/nand/raw/tmio_nand.c |   2 +-
 drivers/mtd/nand/raw/txx9ndfmc.c |   2 +-
 drivers/mtd/nand/raw/xway_nand.c |   2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|   2 +-
 include/linux/mtd/rawnand.h  |  21 ++--
 47 files changed, 144 insertions(+), 137 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 6616f473aeb2..756f6339d457 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -213,7 +213,7 @@ static int ams_delta_init(struct platform_device *pdev)
this->legacy.read_byte = ams_delta_read_byte;
this->legacy.write_buf = ams_delta_write_buf;
this->legacy.read_buf = ams_delta_read_buf;
-   this->cmd_ctrl = ams_delta_hwcontrol;
+   this->legacy.cmd_ctrl = ams_delta_hwcontrol;
if (gpio_request(AMS_DELTA_GPIO_PIN_NAND_RB, "nand_rdy") == 0) {
this->dev_ready = ams_delta_nand_ready;
} else {
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 9b2876b5a9c2..37f617ec178e 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -1472,7 +1472,7 @@ static void atmel_nand_init(struct atmel_nand_controller 
*nc,
mtd->dev.parent = nc->dev;
nand->base.controller = >base;
 
-   chip->cmd_ctrl = atmel_nand_cmd_ctrl;
+   chip->legacy.cmd_ctrl = atmel_nand_cmd_ctrl;
chip->legacy.read_byte = atmel_nand_read_byte;
chip->legacy.write_byte = atmel_nand_write_byte;
chip->legacy.read_buf = atmel_nand_read_buf;
@@ -1524,7 +1524,7 @@ static void atmel_hsmc_nand_init(struct 
atmel_nand_controller *nc,
atmel_nand_init(nc, nand);
 
/* Overload some methods for the HSMC controller. */
-   chip->cmd_ctrl = atmel_hsmc_nand_cmd_ctrl;
+   chip->legacy.cmd_ctrl = atmel_hsmc_nand_cmd_ctrl;
chip->select_chip = atmel_hsmc_nand_select_chip;
 }
 
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 0db5dc61b155..5d45f13288fc 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -430,7 +430,7 @@ static int au1550nd_probe(struct platform_device *pdev)
 
this->dev_ready = 

[PATCH 16/19] mtd: rawnand: Keep all internal stuff private

2018-09-06 Thread Boris Brezillon
A lot of things defined in rawnand.h should not be exposed to NAND
controller drivers and should only be shared by core files.

Create the drivers/mtd/nand/rawn/internals.h header to store such
definitions, and move all private defs to this header.

Also remove EXPORT_SYMBOLS() on functions that are not supposed to be
exposed.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/internals.h | 98 
 drivers/mtd/nand/raw/nand_amd.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 21 
 drivers/mtd/nand/raw/nand_bbt.c  |  3 +-
 drivers/mtd/nand/raw/nand_hynix.c|  3 +-
 drivers/mtd/nand/raw/nand_ids.c  |  4 +-
 drivers/mtd/nand/raw/nand_macronix.c |  2 +-
 drivers/mtd/nand/raw/nand_micron.c   |  3 +-
 drivers/mtd/nand/raw/nand_samsung.c  |  2 +-
 drivers/mtd/nand/raw/nand_timings.c  |  4 +-
 drivers/mtd/nand/raw/nand_toshiba.c  |  2 +-
 include/linux/mtd/rawnand.h  | 96 ---
 12 files changed, 123 insertions(+), 117 deletions(-)
 create mode 100644 drivers/mtd/nand/raw/internals.h

diff --git a/drivers/mtd/nand/raw/internals.h b/drivers/mtd/nand/raw/internals.h
new file mode 100644
index ..1d2edddb6127
--- /dev/null
+++ b/drivers/mtd/nand/raw/internals.h
@@ -0,0 +1,98 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2018 - Bootlin
+ *
+ * Author: Boris Brezillon 
+ *
+ * Header containing internal definitions to be used only by core files.
+ * NAND controller drivers should not include this file.
+ */
+
+#ifndef __LINUX_RAWNAND_INTERNALS
+#define __LINUX_RAWNAND_INTERNALS
+
+#include 
+
+/*
+ * NAND Flash Manufacturer ID Codes
+ */
+#define NAND_MFR_TOSHIBA   0x98
+#define NAND_MFR_ESMT  0xc8
+#define NAND_MFR_SAMSUNG   0xec
+#define NAND_MFR_FUJITSU   0x04
+#define NAND_MFR_NATIONAL  0x8f
+#define NAND_MFR_RENESAS   0x07
+#define NAND_MFR_STMICRO   0x20
+#define NAND_MFR_HYNIX 0xad
+#define NAND_MFR_MICRON0x2c
+#define NAND_MFR_AMD   0x01
+#define NAND_MFR_MACRONIX  0xc2
+#define NAND_MFR_EON   0x92
+#define NAND_MFR_SANDISK   0x45
+#define NAND_MFR_INTEL 0x89
+#define NAND_MFR_ATO   0x9b
+#define NAND_MFR_WINBOND   0xef
+
+/**
+ * struct nand_manufacturer_ops - NAND Manufacturer operations
+ * @detect: detect the NAND memory organization and capabilities
+ * @init: initialize all vendor specific fields (like the ->read_retry()
+ *   implementation) if any.
+ * @cleanup: the ->init() function may have allocated resources, ->cleanup()
+ *  is here to let vendor specific code release those resources.
+ * @fixup_onfi_param_page: apply vendor specific fixups to the ONFI parameter
+ *page. This is called after the checksum is verified.
+ */
+struct nand_manufacturer_ops {
+   void (*detect)(struct nand_chip *chip);
+   int (*init)(struct nand_chip *chip);
+   void (*cleanup)(struct nand_chip *chip);
+   void (*fixup_onfi_param_page)(struct nand_chip *chip,
+ struct nand_onfi_params *p);
+};
+
+/**
+ * struct nand_manufacturer - NAND Flash Manufacturer structure
+ * @name: Manufacturer name
+ * @id: manufacturer ID code of device.
+ * @ops: manufacturer operations
+ */
+struct nand_manufacturer {
+   int id;
+   char *name;
+   const struct nand_manufacturer_ops *ops;
+};
+
+
+extern struct nand_flash_dev nand_flash_ids[];
+
+extern const struct nand_manufacturer_ops toshiba_nand_manuf_ops;
+extern const struct nand_manufacturer_ops samsung_nand_manuf_ops;
+extern const struct nand_manufacturer_ops hynix_nand_manuf_ops;
+extern const struct nand_manufacturer_ops micron_nand_manuf_ops;
+extern const struct nand_manufacturer_ops amd_nand_manuf_ops;
+extern const struct nand_manufacturer_ops macronix_nand_manuf_ops;
+
+/* Core functions */
+const struct nand_manufacturer *nand_get_manufacturer(u8 id);
+int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs);
+int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
+   int allowbbt);
+int onfi_fill_data_interface(struct nand_chip *chip,
+enum nand_data_interface_type type,
+int timing_mode);
+int nand_get_features(struct nand_chip *chip, int addr, u8 *subfeature_param);
+int nand_set_features(struct nand_chip *chip, int addr, u8 *subfeature_param);
+int nand_read_page_raw_notsupp(struct nand_chip *chip, u8 *buf,
+  int oob_required, int page);
+int nand_write_page_raw_notsupp(struct nand_chip *chip, const u8 *buf,
+   int oob_required, int page);
+int nand_exit_status_op(struct nand_chip *chip);
+void nand_decode_ext_id(struct nand_chip *chip);
+
+/* BBT functions */
+int nand_markbad_bbt(struct nand_chip *chip, loff_t offs);
+int nand_isreserved_bbt(struct nand_chip *chip, loff_t offs);
+int 

[PATCH 12/19] mtd: rawnand: Get rid of the duplicate nand_chip forward declaration

2018-09-06 Thread Boris Brezillon
There's already a forward declaration of nand_chip at the beginning of
the file. Get rid of this one.

Signed-off-by: Boris Brezillon 
---
 include/linux/mtd/rawnand.h | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 768415ed1159..608279104aae 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -210,9 +210,6 @@ enum nand_ecc_algo {
 #define NAND_CI_CELLTYPE_MSK   0x0C
 #define NAND_CI_CELLTYPE_SHIFT 2
 
-/* Keep gcc happy */
-struct nand_chip;
-
 /* ONFI version bits */
 #define ONFI_VERSION_1_0   BIT(1)
 #define ONFI_VERSION_2_0   BIT(2)
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 17/19] mtd: rawnand: Move legacy code to nand_legacy.c

2018-09-06 Thread Boris Brezillon
Allows us to move a few hundred lines of deprecated code out of the
core file which is quite big.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/Makefile  |   2 +-
 drivers/mtd/nand/raw/internals.h   |   6 +
 drivers/mtd/nand/raw/nand_base.c   | 618 +--
 drivers/mtd/nand/raw/nand_legacy.c | 642 +
 4 files changed, 660 insertions(+), 608 deletions(-)
 create mode 100644 drivers/mtd/nand/raw/nand_legacy.c

diff --git a/drivers/mtd/nand/raw/Makefile b/drivers/mtd/nand/raw/Makefile
index a6ef0673e29e..78f67de2e60b 100644
--- a/drivers/mtd/nand/raw/Makefile
+++ b/drivers/mtd/nand/raw/Makefile
@@ -57,7 +57,7 @@ obj-$(CONFIG_MTD_NAND_QCOM)   += qcom_nandc.o
 obj-$(CONFIG_MTD_NAND_MTK) += mtk_ecc.o mtk_nand.o
 obj-$(CONFIG_MTD_NAND_TEGRA)   += tegra_nand.o
 
-nand-objs := nand_base.o nand_bbt.o nand_timings.o nand_ids.o
+nand-objs := nand_base.o nand_legacy.o nand_bbt.o nand_timings.o nand_ids.o
 nand-objs += nand_amd.o
 nand-objs += nand_hynix.o
 nand-objs += nand_macronix.o
diff --git a/drivers/mtd/nand/raw/internals.h b/drivers/mtd/nand/raw/internals.h
index 1d2edddb6127..289a4b8f7974 100644
--- a/drivers/mtd/nand/raw/internals.h
+++ b/drivers/mtd/nand/raw/internals.h
@@ -89,10 +89,16 @@ int nand_write_page_raw_notsupp(struct nand_chip *chip, 
const u8 *buf,
int oob_required, int page);
 int nand_exit_status_op(struct nand_chip *chip);
 void nand_decode_ext_id(struct nand_chip *chip);
+void panic_nand_wait(struct nand_chip *chip, unsigned long timeo);
 
 /* BBT functions */
 int nand_markbad_bbt(struct nand_chip *chip, loff_t offs);
 int nand_isreserved_bbt(struct nand_chip *chip, loff_t offs);
 int nand_isbad_bbt(struct nand_chip *chip, loff_t offs, int allowbbt);
 
+/* Legacy */
+void nand_legacy_set_defaults(struct nand_chip *chip);
+void nand_legacy_adjust_cmdfunc(struct nand_chip *chip);
+int nand_legacy_check_hooks(struct nand_chip *chip);
+
 #endif /* __LINUX_RAWNAND_INTERNALS */
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index d48c588d1abe..4ef00cefd5da 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -36,7 +36,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -253,150 +252,6 @@ static void nand_release_device(struct mtd_info *mtd)
spin_unlock(>controller->lock);
 }
 
-/**
- * nand_read_byte - [DEFAULT] read one byte from the chip
- * @chip: NAND chip object
- *
- * Default read function for 8bit buswidth
- */
-static uint8_t nand_read_byte(struct nand_chip *chip)
-{
-   return readb(chip->legacy.IO_ADDR_R);
-}
-
-/**
- * nand_read_byte16 - [DEFAULT] read one byte endianness aware from the chip
- * @chip: NAND chip object
- *
- * Default read function for 16bit buswidth with endianness conversion.
- *
- */
-static uint8_t nand_read_byte16(struct nand_chip *chip)
-{
-   return (uint8_t) cpu_to_le16(readw(chip->legacy.IO_ADDR_R));
-}
-
-/**
- * nand_select_chip - [DEFAULT] control CE line
- * @chip: NAND chip object
- * @chipnr: chipnumber to select, -1 for deselect
- *
- * Default select function for 1 chip devices.
- */
-static void nand_select_chip(struct nand_chip *chip, int chipnr)
-{
-   switch (chipnr) {
-   case -1:
-   chip->legacy.cmd_ctrl(chip, NAND_CMD_NONE,
- 0 | NAND_CTRL_CHANGE);
-   break;
-   case 0:
-   break;
-
-   default:
-   BUG();
-   }
-}
-
-/**
- * nand_write_byte - [DEFAULT] write single byte to chip
- * @chip: NAND chip object
- * @byte: value to write
- *
- * Default function to write a byte to I/O[7:0]
- */
-static void nand_write_byte(struct nand_chip *chip, uint8_t byte)
-{
-   chip->legacy.write_buf(chip, , 1);
-}
-
-/**
- * nand_write_byte16 - [DEFAULT] write single byte to a chip with width 16
- * @chip: NAND chip object
- * @byte: value to write
- *
- * Default function to write a byte to I/O[7:0] on a 16-bit wide chip.
- */
-static void nand_write_byte16(struct nand_chip *chip, uint8_t byte)
-{
-   uint16_t word = byte;
-
-   /*
-* It's not entirely clear what should happen to I/O[15:8] when writing
-* a byte. The ONFi spec (Revision 3.1; 2012-09-19, Section 2.16) reads:
-*
-*When the host supports a 16-bit bus width, only data is
-*transferred at the 16-bit width. All address and command line
-*transfers shall use only the lower 8-bits of the data bus. During
-*command transfers, the host may place any value on the upper
-*8-bits of the data bus. During address transfers, the host shall
-*set the upper 8-bits of the data bus to 00h.
-*
-* One user of the write_byte callback is nand_set_features. The
-* four parameters are specified to be written to I/O[7:0], but this is

[PATCH 11/19] mtd: rawnand: Get rid of nand_flash_dev forward declation

2018-09-06 Thread Boris Brezillon
nand_scan[with_ids]() have been moved at the end of the file. We can
now get rid of of the nand_flash_dev forward declaration.

Signed-off-by: Boris Brezillon 
---
 include/linux/mtd/rawnand.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 15183b73fed2..768415ed1159 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -25,7 +25,6 @@
 #include 
 
 struct nand_chip;
-struct nand_flash_dev;
 
 /* The maximum number of NAND chips in an array */
 #define NAND_MAX_CHIPS 8
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 01/19] mtd: rawnand: Leave chip->IO_ADDR_{R, W} to NULL when unused

2018-09-06 Thread Boris Brezillon
There's no point in poisoning the ->IO_ADDR_{R,W}, a NULL pointer
is just as good to detect unexpected ->IO_ADDR_{R,W} usage.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/brcmnand/brcmnand.c | 3 ---
 drivers/mtd/nand/raw/socrates_nand.c | 4 
 2 files changed, 7 deletions(-)

diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index fee40a3ce5d2..851db4a7d3e4 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -2270,9 +2270,6 @@ static int brcmnand_init_cs(struct brcmnand_host *host, 
struct device_node *dn)
mtd->owner = THIS_MODULE;
mtd->dev.parent = >dev;
 
-   chip->IO_ADDR_R = (void __iomem *)0xdeadbeef;
-   chip->IO_ADDR_W = (void __iomem *)0xdeadbeef;
-
chip->cmd_ctrl = brcmnand_cmd_ctrl;
chip->cmdfunc = brcmnand_cmdfunc;
chip->waitfunc = brcmnand_waitfunc;
diff --git a/drivers/mtd/nand/raw/socrates_nand.c 
b/drivers/mtd/nand/raw/socrates_nand.c
index 64ea9a014054..aa42b4ea4d23 100644
--- a/drivers/mtd/nand/raw/socrates_nand.c
+++ b/drivers/mtd/nand/raw/socrates_nand.c
@@ -152,10 +152,6 @@ static int socrates_nand_probe(struct platform_device 
*ofdev)
mtd->name = "socrates_nand";
mtd->dev.parent = >dev;
 
-   /*should never be accessed directly */
-   nand_chip->IO_ADDR_R = (void *)0xdeadbeef;
-   nand_chip->IO_ADDR_W = (void *)0xdeadbeef;
-
nand_chip->cmd_ctrl = socrates_nand_cmd_ctrl;
nand_chip->read_byte = socrates_nand_read_byte;
nand_chip->write_buf = socrates_nand_write_buf;
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 00/19] mtd: rawnand: API cleanup (2nd batch)

2018-09-06 Thread Boris Brezillon
Hello,

This is the 2nd batch of API cleanup patches. This time we move
deprecated hooks/fields to the nand_legacy struct, and then move some
of the code found in nand_base.c into separate source/header files.

With this new organization, new comers should more easily identify the
bits they can use in their NAND controller drivers and those that are
only meant for core code. It also shrink a bit nand_base.c which was
over 6000 lines of code.

Note that existing coding style issues (reported by checkpatch) in arch
or driver code are intentionally not fixed to keep the series focused
on the API/core cleanup.

Regards,

Boris

Boris Brezillon (19):
  mtd: rawnand: Leave chip->IO_ADDR_{R,W} to NULL when unused
  mtd: rawnand: Create a legacy struct and move ->IO_ADDR_{R,W} there
  mtd: rawnand: Deprecate ->{read,write}_{byte,buf}() hooks
  mtd: rawnand: Deprecate ->cmd_ctrl() and ->cmdfunc()
  mtd: rawnand: Deprecate ->dev_ready() and ->waitfunc()
  mtd: rawnand: Deprecate ->block_{bad,markbad}() hooks
  mtd: rawnand: Deprecate ->erase()
  mtd: rawnand: Deprecate ->{set,get}_features() hooks
  mtd: rawnand: Deprecate ->chip_delay
  mtd: rawnand: Move function prototypes after struct declarations
  mtd: rawnand: Get rid of nand_flash_dev forward declation
  mtd: rawnand: Get rid of the duplicate nand_chip forward declaration
  mtd: rawnand: Get rid of a few unused definitions
  mtd: rawnand: Move platform_nand_xxx definitions out of rawnand.h
  mtd: rawnand: Inline onfi_get_async_timing_mode()
  mtd: rawnand: Keep all internal stuff private
  mtd: rawnand: Move legacy code to nand_legacy.c
  mtd: rawnand: Move ONFI code to nand_onfi.c
  mtd: rawnand: Move JEDEC code to nand_jedec.c

 Documentation/driver-api/mtdnand.rst |   30 +-
 arch/arm/mach-ep93xx/snappercl15.c   |8 +-
 arch/arm/mach-ep93xx/ts72xx.c|9 +-
 arch/arm/mach-imx/mach-qong.c|6 +-
 arch/arm/mach-ixp4xx/ixdp425-setup.c |2 +-
 arch/arm/mach-omap1/board-fsample.c  |3 +-
 arch/arm/mach-omap1/board-h2.c   |3 +-
 arch/arm/mach-omap1/board-h3.c   |2 +-
 arch/arm/mach-omap1/board-nand.c |2 +-
 arch/arm/mach-omap1/board-perseus2.c |3 +-
 arch/arm/mach-orion5x/ts78xx-setup.c |9 +-
 arch/arm/mach-pxa/balloon3.c |5 +-
 arch/arm/mach-pxa/em-x270.c  |9 +-
 arch/arm/mach-pxa/palmtx.c   |5 +-
 arch/mips/alchemy/devboards/db1200.c |9 +-
 arch/mips/alchemy/devboards/db1300.c |9 +-
 arch/mips/alchemy/devboards/db1550.c |9 +-
 arch/mips/netlogic/xlr/platform-flash.c  |3 +-
 arch/mips/pnx833x/common/platform.c  |5 +-
 arch/mips/rb532/devices.c|5 +-
 arch/sh/boards/mach-migor/setup.c|8 +-
 drivers/mtd/nand/raw/Makefile|4 +-
 drivers/mtd/nand/raw/ams-delta.c |   22 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |   22 +-
 drivers/mtd/nand/raw/au1550nd.c  |   43 +-
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |   22 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |   15 +-
 drivers/mtd/nand/raw/cafe_nand.c |   22 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |   28 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |   42 +-
 drivers/mtd/nand/raw/davinci_nand.c  |   34 +-
 drivers/mtd/nand/raw/denali.c|   23 +-
 drivers/mtd/nand/raw/diskonchip.c|   50 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |   18 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |   24 +-
 drivers/mtd/nand/raw/fsl_upm.c   |   30 +-
 drivers/mtd/nand/raw/fsmc_nand.c |1 -
 drivers/mtd/nand/raw/gpio.c  |   16 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |   22 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |   18 +-
 drivers/mtd/nand/raw/internals.h |  114 ++
 drivers/mtd/nand/raw/jz4740_nand.c   |   14 +-
 drivers/mtd/nand/raw/jz4780_nand.c   |   10 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |   12 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |   26 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   |   14 +-
 drivers/mtd/nand/raw/mtk_nand.c  |   12 +-
 drivers/mtd/nand/raw/mxc_nand.c  |   20 +-
 drivers/mtd/nand/raw/nand_amd.c  |2 +-
 drivers/mtd/nand/raw/nand_base.c | 1260 +++---
 drivers/mtd/nand/raw/nand_bbt.c  |5 +-
 drivers/mtd/nand/raw/nand_hynix.c|9 +-
 drivers/mtd/nand/raw/nand_ids.c  |4 +-
 drivers/mtd/nand/raw/nand_jedec.c|  113 ++
 

[PATCH v9 9/9] ARM: dts: sun8i-h3: Add Video Engine and reserved memory nodes

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This adds nodes for the Video Engine and the associated reserved memory
for the H3. Up to 96 MiB of memory are dedicated to the CMA pool.

Signed-off-by: Paul Kocialkowski 
Acked-by: Maxime Ripard 
---
 arch/arm/boot/dts/sun8i-h3.dtsi | 25 +
 1 file changed, 25 insertions(+)

diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi
index f0096074a467..3ecfabb10151 100644
--- a/arch/arm/boot/dts/sun8i-h3.dtsi
+++ b/arch/arm/boot/dts/sun8i-h3.dtsi
@@ -119,6 +119,20 @@
 ;
};
 
+   reserved-memory {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   cma_pool: cma@4a00 {
+   compatible = "shared-dma-pool";
+   size = <0x600>;
+   alloc-ranges = <0x4a00 0x600>;
+   reusable;
+   linux,cma-default;
+   };
+   };
+
soc {
system-control@1c0 {
compatible = "allwinner,sun8i-h3-system-control";
@@ -142,6 +156,17 @@
};
};
 
+   video-codec@01c0e000 {
+   compatible = "allwinner,sun8i-h3-video-engine";
+   reg = <0x01c0e000 0x1000>;
+   clocks = < CLK_BUS_VE>, < CLK_VE>,
+< CLK_DRAM_VE>;
+   clock-names = "ahb", "mod", "ram";
+   resets = < RST_BUS_VE>;
+   interrupts = ;
+   allwinner,sram = <_sram 1>;
+   };
+
mali: gpu@1c4 {
compatible = "allwinner,sun8i-h3-mali", "arm,mali-400";
reg = <0x01c4 0x1>;
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 8/9] ARM: dts: sun8i-a33: Add Video Engine and reserved memory nodes

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This adds nodes for the Video Engine and the associated reserved memory
for the A33. Up to 96 MiB of memory are dedicated to the CMA pool.

The VPU can only map the first 256 MiB of DRAM, so the reserved memory
pool has to be located in that area. Following Allwinner's decision in
downstream software, the last 96 MiB of the first 256 MiB of RAM are
reserved for this purpose.

Signed-off-by: Paul Kocialkowski 
Acked-by: Maxime Ripard 
---
 arch/arm/boot/dts/sun8i-a33.dtsi | 26 ++
 1 file changed, 26 insertions(+)

diff --git a/arch/arm/boot/dts/sun8i-a33.dtsi b/arch/arm/boot/dts/sun8i-a33.dtsi
index 4e92741b24a7..c1cc8f09dd9a 100644
--- a/arch/arm/boot/dts/sun8i-a33.dtsi
+++ b/arch/arm/boot/dts/sun8i-a33.dtsi
@@ -190,6 +190,21 @@
reg = <0x4000 0x8000>;
};
 
+   reserved-memory {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   /* Address must be kept in the lower 256 MiBs of DRAM for VE. */
+   cma_pool: cma@4a00 {
+   compatible = "shared-dma-pool";
+   size = <0x600>;
+   alloc-ranges = <0x4a00 0x600>;
+   reusable;
+   linux,cma-default;
+   };
+   };
+
sound: sound {
compatible = "simple-audio-card";
simple-audio-card,name = "sun8i-a33-audio";
@@ -254,6 +269,17 @@
};
};
 
+   video-codec@01c0e000 {
+   compatible = "allwinner,sun8i-a33-video-engine";
+   reg = <0x01c0e000 0x1000>;
+   clocks = < CLK_BUS_VE>, < CLK_VE>,
+< CLK_DRAM_VE>;
+   clock-names = "ahb", "mod", "ram";
+   resets = < RST_BUS_VE>;
+   interrupts = ;
+   allwinner,sram = <_sram 1>;
+   };
+
crypto: crypto-engine@1c15000 {
compatible = "allwinner,sun4i-a10-crypto";
reg = <0x01c15000 0x1000>;
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 7/9] ARM: dts: sun7i-a20: Add Video Engine and reserved memory nodes

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This adds nodes for the Video Engine and the associated reserved memory
for the A20. Up to 96 MiB of memory are dedicated to the CMA pool.

The VPU can only map the first 256 MiB of DRAM, so the reserved memory
pool has to be located in that area. Following Allwinner's decision in
downstream software, the last 96 MiB of the first 256 MiB of RAM are
reserved for this purpose.

Signed-off-by: Paul Kocialkowski 
Acked-by: Maxime Ripard 
---
 arch/arm/boot/dts/sun7i-a20.dtsi | 26 ++
 1 file changed, 26 insertions(+)

diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi
index 9c52712af241..02e40da9f028 100644
--- a/arch/arm/boot/dts/sun7i-a20.dtsi
+++ b/arch/arm/boot/dts/sun7i-a20.dtsi
@@ -174,6 +174,21 @@
reg = <0x4000 0x8000>;
};
 
+   reserved-memory {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   /* Address must be kept in the lower 256 MiBs of DRAM for VE. */
+   cma_pool: cma@4a00 {
+   compatible = "shared-dma-pool";
+   size = <0x600>;
+   alloc-ranges = <0x4a00 0x600>;
+   reusable;
+   linux,cma-default;
+   };
+   };
+
timer {
compatible = "arm,armv7-timer";
interrupts = ,
@@ -479,6 +494,17 @@
};
};
 
+   video-codec@1c0e000 {
+   compatible = "allwinner,sun7i-a20-video-engine";
+   reg = <0x01c0e000 0x1000>;
+   clocks = < CLK_AHB_VE>, < CLK_VE>,
+< CLK_DRAM_VE>;
+   clock-names = "ahb", "mod", "ram";
+   resets = < RST_VE>;
+   interrupts = ;
+   allwinner,sram = <_sram 1>;
+   };
+
mmc0: mmc@1c0f000 {
compatible = "allwinner,sun7i-a20-mmc";
reg = <0x01c0f000 0x1000>;
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 5/9] media: platform: Add Cedrus VPU decoder driver

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This introduces the Cedrus VPU driver that supports the VPU found in
Allwinner SoCs, also known as Video Engine. It is implemented through
a V4L2 M2M decoder device and a media device (used for media requests).
So far, it only supports MPEG-2 decoding.

Since this VPU is stateless, synchronization with media requests is
required in order to ensure consistency between frame headers that
contain metadata about the frame to process and the raw slice data that
is used to generate the frame.

This driver was made possible thanks to the long-standing effort
carried out by the linux-sunxi community in the interest of reverse
engineering, documenting and implementing support for the Allwinner VPU.

Signed-off-by: Paul Kocialkowski 
Acked-by: Maxime Ripard 
---
 MAINTAINERS   |   7 +
 drivers/staging/media/Kconfig |   2 +
 drivers/staging/media/Makefile|   1 +
 drivers/staging/media/sunxi/Kconfig   |  15 +
 drivers/staging/media/sunxi/Makefile  |   1 +
 drivers/staging/media/sunxi/cedrus/Kconfig|  14 +
 drivers/staging/media/sunxi/cedrus/Makefile   |   3 +
 drivers/staging/media/sunxi/cedrus/cedrus.c   | 422 ++
 drivers/staging/media/sunxi/cedrus/cedrus.h   | 165 ++
 .../staging/media/sunxi/cedrus/cedrus_dec.c   |  70 +++
 .../staging/media/sunxi/cedrus/cedrus_dec.h   |  27 +
 .../staging/media/sunxi/cedrus/cedrus_hw.c| 322 +++
 .../staging/media/sunxi/cedrus/cedrus_hw.h|  30 +
 .../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 237 
 .../staging/media/sunxi/cedrus/cedrus_regs.h  | 233 
 .../staging/media/sunxi/cedrus/cedrus_video.c | 544 ++
 .../staging/media/sunxi/cedrus/cedrus_video.h |  30 +
 17 files changed, 2123 insertions(+)
 create mode 100644 drivers/staging/media/sunxi/Kconfig
 create mode 100644 drivers/staging/media/sunxi/Makefile
 create mode 100644 drivers/staging/media/sunxi/cedrus/Kconfig
 create mode 100644 drivers/staging/media/sunxi/cedrus/Makefile
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus.c
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus.h
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_dec.c
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_dec.h
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_hw.c
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_hw.h
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_regs.h
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_video.c
 create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_video.h

diff --git a/MAINTAINERS b/MAINTAINERS
index a5b256b25905..6d69f3ad1aa9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -663,6 +663,13 @@ L: linux-cry...@vger.kernel.org
 S: Maintained
 F: drivers/crypto/sunxi-ss/
 
+ALLWINNER VPU DRIVER
+M: Maxime Ripard 
+M: Paul Kocialkowski 
+L: linux-me...@vger.kernel.org
+S: Maintained
+F: drivers/staging/media/sunxi/cedrus/
+
 ALPHA PORT
 M: Richard Henderson 
 M: Ivan Kokshaysky 
diff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig
index db5cf67047ad..b3620a8f2d9f 100644
--- a/drivers/staging/media/Kconfig
+++ b/drivers/staging/media/Kconfig
@@ -31,6 +31,8 @@ source "drivers/staging/media/mt9t031/Kconfig"
 
 source "drivers/staging/media/omap4iss/Kconfig"
 
+source "drivers/staging/media/sunxi/Kconfig"
+
 source "drivers/staging/media/tegra-vde/Kconfig"
 
 source "drivers/staging/media/zoran/Kconfig"
diff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile
index 503fbe47fa58..42948f805548 100644
--- a/drivers/staging/media/Makefile
+++ b/drivers/staging/media/Makefile
@@ -5,5 +5,6 @@ obj-$(CONFIG_SOC_CAMERA_IMX074) += imx074/
 obj-$(CONFIG_SOC_CAMERA_MT9T031)   += mt9t031/
 obj-$(CONFIG_VIDEO_DM365_VPFE) += davinci_vpfe/
 obj-$(CONFIG_VIDEO_OMAP4)  += omap4iss/
+obj-$(CONFIG_VIDEO_SUNXI)  += sunxi/
 obj-$(CONFIG_TEGRA_VDE)+= tegra-vde/
 obj-$(CONFIG_VIDEO_ZORAN)  += zoran/
diff --git a/drivers/staging/media/sunxi/Kconfig 
b/drivers/staging/media/sunxi/Kconfig
new file mode 100644
index ..c78d92240ceb
--- /dev/null
+++ b/drivers/staging/media/sunxi/Kconfig
@@ -0,0 +1,15 @@
+config VIDEO_SUNXI
+   bool "Allwinner sunXi family Video Devices"
+   depends on ARCH_SUNXI || COMPILE_TEST
+   help
+ If you have an Allwinner SoC based on the sunXi family, say Y.
+
+ Note that this option doesn't include new drivers in the
+ kernel: saying N will just cause Kconfig to skip all the
+ questions about Allwinner media devices.
+
+if VIDEO_SUNXI
+
+source "drivers/staging/media/sunxi/cedrus/Kconfig"
+
+endif
diff --git a/drivers/staging/media/sunxi/Makefile 
b/drivers/staging/media/sunxi/Makefile
new file mode 100644
index 

[PATCH v9 6/9] ARM: dts: sun5i: Add Video Engine and reserved memory nodes

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This adds nodes for the Video Engine and the associated reserved memory
for sun5i-based platforms. Up to 96 MiB of memory are dedicated to the
CMA pool.

The VPU can only map the first 256 MiB of DRAM, so the reserved memory
pool has to be located in that area. Following Allwinner's decision in
downstream software, the last 96 MiB of the first 256 MiB of RAM are
reserved for this purpose.

Signed-off-by: Paul Kocialkowski 
Acked-by: Maxime Ripard 
---
 arch/arm/boot/dts/sun5i.dtsi | 26 ++
 1 file changed, 26 insertions(+)

diff --git a/arch/arm/boot/dts/sun5i.dtsi b/arch/arm/boot/dts/sun5i.dtsi
index 8bfb36651177..9cd65c46720b 100644
--- a/arch/arm/boot/dts/sun5i.dtsi
+++ b/arch/arm/boot/dts/sun5i.dtsi
@@ -108,6 +108,21 @@
};
};
 
+   reserved-memory {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   /* Address must be kept in the lower 256 MiBs of DRAM for VE. */
+   cma_pool: cma@4a00 {
+   compatible = "shared-dma-pool";
+   size = <0x600>;
+   alloc-ranges = <0x4a00 0x600>;
+   reusable;
+   linux,cma-default;
+   };
+   };
+
soc@1c0 {
compatible = "simple-bus";
#address-cells = <1>;
@@ -294,6 +309,17 @@
};
};
 
+   video-codec@1c0e000 {
+   compatible = "allwinner,sun5i-a13-video-engine";
+   reg = <0x01c0e000 0x1000>;
+   clocks = < CLK_AHB_VE>, < CLK_VE>,
+< CLK_DRAM_VE>;
+   clock-names = "ahb", "mod", "ram";
+   resets = < RST_VE>;
+   interrupts = <53>;
+   allwinner,sram = <_sram 1>;
+   };
+
mmc0: mmc@1c0f000 {
compatible = "allwinner,sun5i-a13-mmc";
reg = <0x01c0f000 0x1000>;
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 4/9] dt-bindings: media: Document bindings for the Cedrus VPU driver

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This adds a device-tree binding document that specifies the properties
used by the Cedrus VPU driver, as well as examples.

Signed-off-by: Paul Kocialkowski 
Reviewed-by: Rob Herring 
Acked-by: Maxime Ripard 
---
 .../devicetree/bindings/media/cedrus.txt  | 54 +++
 1 file changed, 54 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/media/cedrus.txt

diff --git a/Documentation/devicetree/bindings/media/cedrus.txt 
b/Documentation/devicetree/bindings/media/cedrus.txt
new file mode 100644
index ..a089a0c1ff05
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/cedrus.txt
@@ -0,0 +1,54 @@
+Device-tree bindings for the VPU found in Allwinner SoCs, referred to as the
+Video Engine (VE) in Allwinner literature.
+
+The VPU can only access the first 256 MiB of DRAM, that are DMA-mapped starting
+from the DRAM base. This requires specific memory allocation and handling.
+
+Required properties:
+- compatible   : must be one of the following compatibles:
+   - "allwinner,sun4i-a10-video-engine"
+   - "allwinner,sun5i-a13-video-engine"
+   - "allwinner,sun7i-a20-video-engine"
+   - "allwinner,sun8i-a33-video-engine"
+   - "allwinner,sun8i-h3-video-engine"
+- reg  : register base and length of VE;
+- clocks   : list of clock specifiers, corresponding to entries in
+ the clock-names property;
+- clock-names  : should contain "ahb", "mod" and "ram" entries;
+- resets   : phandle for reset;
+- interrupts   : VE interrupt number;
+- allwinner,sram   : SRAM region to use with the VE.
+
+Optional properties:
+- memory-region: CMA pool to use for buffers allocation 
instead of the
+ default CMA pool.
+
+Example:
+
+reserved-memory {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   /* Address must be kept in the lower 256 MiBs of DRAM for VE. */
+   cma_pool: cma@4a00 {
+   compatible = "shared-dma-pool";
+   size = <0x600>;
+   alloc-ranges = <0x4a00 0x600>;
+   reusable;
+   linux,cma-default;
+   };
+};
+
+video-codec@1c0e000 {
+   compatible = "allwinner,sun7i-a20-video-engine";
+   reg = <0x01c0e000 0x1000>;
+
+   clocks = < CLK_AHB_VE>, < CLK_VE>,
+< CLK_DRAM_VE>;
+   clock-names = "ahb", "mod", "ram";
+
+   resets = < RST_VE>;
+   interrupts = ;
+   allwinner,sram = <_sram 1>;
+};
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 3/9] media: v4l: Add definition for the Sunxi tiled NV12 format

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

This introduces support for the Sunxi tiled NV12 format, where each
component of the YUV frame is divided into macroblocks. Hence, the size
of each plane requires specific alignment. The pixels inside each
macroblock are coded in linear order (line after line from top to
bottom).

This tiled NV12 format is used by the video engine on Allwinner
platforms: it is the default format for decoded frames (and the only
one available in the oldest supported platforms).

Signed-off-by: Paul Kocialkowski 
---
 Documentation/media/uapi/v4l/pixfmt-reserved.rst | 15 ++-
 drivers/media/v4l2-core/v4l2-ioctl.c |  1 +
 include/uapi/linux/videodev2.h   |  1 +
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/Documentation/media/uapi/v4l/pixfmt-reserved.rst 
b/Documentation/media/uapi/v4l/pixfmt-reserved.rst
index 38af1472a4b4..0c399858bda2 100644
--- a/Documentation/media/uapi/v4l/pixfmt-reserved.rst
+++ b/Documentation/media/uapi/v4l/pixfmt-reserved.rst
@@ -243,7 +243,20 @@ please make a proposal on the linux-media mailing list.
It is an opaque intermediate format and the MDP hardware must be
used to convert ``V4L2_PIX_FMT_MT21C`` to ``V4L2_PIX_FMT_NV12M``,
``V4L2_PIX_FMT_YUV420M`` or ``V4L2_PIX_FMT_YVU420``.
-
+* .. _V4L2-PIX-FMT-SUNXI-TILED-NV12:
+
+  - ``V4L2_PIX_FMT_SUNXI_TILED_NV12``
+  - 'ST12'
+  - Two-planar NV12-based format used by the video engine found on 
Allwinner
+   (codenamed sunxi) platforms, with 32x32 tiles for the luminance plane
+   and 32x64 tiles for the chrominance plane. The data in each tile is
+   stored in linear order, within the tile bounds. Each tile follows the
+   previous one linearly in memory (from left to right, top to bottom).
+
+   The associated buffer dimensions are aligned to match an integer number
+   of tiles, resulting in 32-aligned resolutions for the luminance plane
+   and 16-aligned resolutions for the chrominance plane (with 2x2
+   subsampling).
 
 .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
 
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c 
b/drivers/media/v4l2-core/v4l2-ioctl.c
index 1a8feaf6c3f7..c148c44caffb 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1337,6 +1337,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
case V4L2_PIX_FMT_SE401:descr = "GSPCA SE401"; break;
case V4L2_PIX_FMT_S5C_UYVY_JPG: descr = "S5C73MX interleaved 
UYVY/JPEG"; break;
case V4L2_PIX_FMT_MT21C:descr = "Mediatek Compressed 
Format"; break;
+   case V4L2_PIX_FMT_SUNXI_TILED_NV12: descr = "Sunxi Tiled NV12 
Format"; break;
default:
WARN(1, "Unknown pixelformat 0x%08x\n", 
fmt->pixelformat);
if (fmt->description[0])
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 314ec7a5f046..7412a255d9ce 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -677,6 +677,7 @@ struct v4l2_pix_format {
 #define V4L2_PIX_FMT_Z16  v4l2_fourcc('Z', '1', '6', ' ') /* Depth data 
16-bit */
 #define V4L2_PIX_FMT_MT21Cv4l2_fourcc('M', 'T', '2', '1') /* Mediatek 
compressed block mode  */
 #define V4L2_PIX_FMT_INZI v4l2_fourcc('I', 'N', 'Z', 'I') /* Intel Planar 
Greyscale 10-bit and Depth 16-bit */
+#define V4L2_PIX_FMT_SUNXI_TILED_NV12 v4l2_fourcc('S', 'T', '1', '2') /* Sunxi 
Tiled NV12 Format */
 
 /* 10bit raw bayer packed, 32 bytes for every 25 pixels, last LSB 6 bits 
unused */
 #define V4L2_PIX_FMT_IPU3_SBGGR10  v4l2_fourcc('i', 'p', '3', 'b') /* IPU3 
packed 10-bit BGGR bayer */
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 2/9] media: v4l: Add definitions for MPEG-2 slice format and metadata

2018-09-06 Thread Paul Kocialkowski
From: Paul Kocialkowski 

Stateless video decoding engines require both the MPEG-2 slices and
associated metadata from the video stream in order to decode frames.

This introduces definitions for a new pixel format, describing buffers
with MPEG-2 slice data, as well as control structure sfor passing the
frame metadata to drivers.

This is based on work from both Florent Revest and Hugues Fruchet.

Signed-off-by: Paul Kocialkowski 
---
 .../media/uapi/v4l/extended-controls.rst  | 176 ++
 .../media/uapi/v4l/pixfmt-compressed.rst  |  16 ++
 .../media/uapi/v4l/vidioc-queryctrl.rst   |  14 +-
 .../media/videodev2.h.rst.exceptions  |   2 +
 drivers/media/v4l2-core/v4l2-ctrls.c  |  63 +++
 drivers/media/v4l2-core/v4l2-ioctl.c  |   1 +
 include/media/v4l2-ctrls.h|  18 +-
 include/uapi/linux/v4l2-controls.h|  65 +++
 include/uapi/linux/videodev2.h|   5 +
 9 files changed, 351 insertions(+), 9 deletions(-)

diff --git a/Documentation/media/uapi/v4l/extended-controls.rst 
b/Documentation/media/uapi/v4l/extended-controls.rst
index 9f7312bf3365..f1951236266a 100644
--- a/Documentation/media/uapi/v4l/extended-controls.rst
+++ b/Documentation/media/uapi/v4l/extended-controls.rst
@@ -1497,6 +1497,182 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
 
 
 
+.. _v4l2-mpeg-mpeg2:
+
+``V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS (struct)``
+Specifies the slice parameters (as extracted from the bitstream) for the
+associated MPEG-2 slice data. This includes the necessary parameters for
+configuring a stateless hardware decoding pipeline for MPEG-2.
+The bitstream parameters are defined according to :ref:`mpeg2part2`.
+
+.. c:type:: v4l2_ctrl_mpeg2_slice_params
+
+.. cssclass:: longtable
+
+.. flat-table:: struct v4l2_ctrl_mpeg2_slice_params
+:header-rows:  0
+:stub-columns: 0
+:widths:   1 1 2
+
+* - __u32
+  - ``bit_size``
+  - Size (in bits) of the current slice data.
+* - __u32
+  - ``data_bit_offset``
+  - Offset (in bits) to the video data in the current slice data.
+* - struct :c:type:`v4l2_mpeg2_sequence`
+  - ``sequence``
+  - Structure with MPEG-2 sequence metadata, merging relevant fields from
+   the sequence header and sequence extension parts of the bitstream.
+* - struct :c:type:`v4l2_mpeg2_picture`
+  - ``picture``
+  - Structure with MPEG-2 picture metadata, merging relevant fields from
+   the picture header and picture coding extension parts of the bitstream.
+* - __u8
+  - ``quantiser_scale_code``
+  - Code used to determine the quantization scale to use for the IDCT.
+* - __u8
+  - ``backward_ref_index``
+  - Index for the V4L2 buffer to use as backward reference, used with
+   B-coded and P-coded frames.
+* - __u8
+  - ``forward_ref_index``
+  - Index for the V4L2 buffer to use as forward reference, used with
+   P-coded frames.
+
+.. c:type:: v4l2_mpeg2_sequence
+
+.. cssclass:: longtable
+
+.. flat-table:: struct v4l2_mpeg2_sequence
+:header-rows:  0
+:stub-columns: 0
+:widths:   1 1 2
+
+* - __u16
+  - ``horizontal_size``
+  - The width of the displayable part of the frame's luminance component.
+* - __u16
+  - ``vertical_size``
+  - The height of the displayable part of the frame's luminance component.
+* - __u32
+  - ``vbv_buffer_size``
+  - Used to calculate the required size of the video buffering verifier,
+   defined (in bits) as: 16 * 1024 * vbv_buffer_size.
+* - __u8
+  - ``profile_and_level_indication``
+  - The current profile and level indication as extracted from the
+   bitstream.
+* - __u8
+  - ``progressive_sequence``
+  - Indication that all the frames for the sequence are progressive instead
+   of interlaced.
+* - __u8
+  - ``chroma_format``
+  - The chrominance sub-sampling format (1: 4:2:0, 2: 4:2:2, 3: 4:4:4).
+
+.. c:type:: v4l2_mpeg2_picture
+
+.. cssclass:: longtable
+
+.. flat-table:: struct v4l2_mpeg2_picture
+:header-rows:  0
+:stub-columns: 0
+:widths:   1 1 2
+
+* - __u8
+  - ``picture_coding_type``
+  - Picture coding type for the frame covered by the current slice
+   (V4L2_MPEG2_PICTURE_CODING_TYPE_I, V4L2_MPEG2_PICTURE_CODING_TYPE_P or
+   V4L2_MPEG2_PICTURE_CODING_TYPE_B).
+* - __u8
+  - ``f_code[2][2]``
+  - Motion vector codes.
+* - __u8
+  - ``intra_dc_precision``
+  - Precision of Discrete Cosine transform (0: 8 bits precision,
+   1: 9 bits precision, 2: 10 bits precision, 3: 11 bits precision).
+* - __u8
+  - ``picture_structure``
+  - Picture structure (1: interlaced top field, 2: interlaced bottom field,
+   3: progressive frame).
+* - __u8
+  - ``top_field_first``
+  - If set to 1 and interlaced stream, top field is output first.
+

[PATCH v9 1/9] media: videobuf2-core: Rework and rename helper for request buffer count

2018-09-06 Thread Paul Kocialkowski
The helper indicating whether buffers are associated with the request is
reworked and renamed to return the number of associated buffer objects.

This is useful for drivers that need to check how many buffers are in
the request to validate it.

Existing users of the helper don't need particular adaptation since the
meaning of zero/non-zero remains consistent.

Signed-off-by: Paul Kocialkowski 
---
 .../media/common/videobuf2/videobuf2-core.c| 18 --
 .../media/common/videobuf2/videobuf2-v4l2.c|  2 +-
 include/media/videobuf2-core.h |  4 ++--
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/media/common/videobuf2/videobuf2-core.c 
b/drivers/media/common/videobuf2/videobuf2-core.c
index cb86b02afd4a..194b9188ad3e 100644
--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -1368,23 +1368,21 @@ bool vb2_request_object_is_buffer(struct 
media_request_object *obj)
 }
 EXPORT_SYMBOL_GPL(vb2_request_object_is_buffer);
 
-bool vb2_request_has_buffers(struct media_request *req)
+unsigned int vb2_request_buffer_cnt(struct media_request *req)
 {
struct media_request_object *obj;
unsigned long flags;
-   bool has_buffers = false;
+   unsigned int buffer_cnt = 0;
 
spin_lock_irqsave(>lock, flags);
-   list_for_each_entry(obj, >objects, list) {
-   if (vb2_request_object_is_buffer(obj)) {
-   has_buffers = true;
-   break;
-   }
-   }
+   list_for_each_entry(obj, >objects, list)
+   if (vb2_request_object_is_buffer(obj))
+   buffer_cnt++;
spin_unlock_irqrestore(>lock, flags);
-   return has_buffers;
+
+   return buffer_cnt;
 }
-EXPORT_SYMBOL_GPL(vb2_request_has_buffers);
+EXPORT_SYMBOL_GPL(vb2_request_buffer_cnt);
 
 int vb2_core_prepare_buf(struct vb2_queue *q, unsigned int index, void *pb)
 {
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c 
b/drivers/media/common/videobuf2/videobuf2-v4l2.c
index 6831a2eb1859..a17033ab2c22 100644
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
@@ -1139,7 +1139,7 @@ int vb2_request_validate(struct media_request *req)
struct media_request_object *obj;
int ret = 0;
 
-   if (!vb2_request_has_buffers(req))
+   if (!vb2_request_buffer_cnt(req))
return -ENOENT;
 
list_for_each_entry(obj, >objects, list) {
diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h
index 6c76b9802589..e86981d615ae 100644
--- a/include/media/videobuf2-core.h
+++ b/include/media/videobuf2-core.h
@@ -1191,10 +1191,10 @@ int vb2_verify_memory_type(struct vb2_queue *q,
 bool vb2_request_object_is_buffer(struct media_request_object *obj);
 
 /**
- * vb2_request_has_buffers() - return true if the request contains buffers
+ * vb2_request_buffer_cnt() - return the number of buffers in the request
  *
  * @req:   the request.
  */
-bool vb2_request_has_buffers(struct media_request *req);
+unsigned int vb2_request_buffer_cnt(struct media_request *req);
 
 #endif /* _MEDIA_VIDEOBUF2_CORE_H */
-- 
2.18.0

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v9 0/9] Cedrus driver for the Allwinner Video Engine, using media requests

2018-09-06 Thread Paul Kocialkowski
This is the ninth iteration of the updated Cedrus driver,
that supports the Video Engine found on most Allwinner SoCs, starting
with the A10. It was tested on the A13, A20, A33 and H3.

The initial version of this driver[0] was originally written and
submitted by Florent Revest using a previous version of the request API
that is necessary to provide coherency between controls and the buffers
they apply to.

The driver was adapted to use the latest version of the media request
API[1], as submitted by Hans Verkuil. Media request API support is a
hard requirement for the Cedrus driver.

The driver itself currently only supports MPEG2 and more codecs will be
added eventually. The default output frame format provided by the Video
Engine is a multi-planar tiled YUV format (based on NV12). A specific
format is introduced in the V4L2 API to describe it. Starting with the
A33, the Video Engine can also output untiled YUV formats.

This implementation is based on the significant work that was conducted
by various members of the linux-sunxi community for understanding and
documenting the Video Engine's innards.

In addition to the media requests API, the following series are required
for Cedrus:
* vicodec: the Virtual Codec driver
* allwinner: a64: add SRAM controller / system control
* SRAM patches from the Cedrus VPU driver series version 5

Changes since v8:
* Removed dummy job_abort as it is now optional;
* Fixed video device registration order;
* Fixed queue_setup for properly handling CREATE_BUFFERS;
* Switched to single-planar API and applied associated reworks,
  since our formats are not multi-planar V4L2 pixel formats.
* Added validation of the number of buffers associated with the request,
  by modifying the relevant helper as instructed;
* Used strlcpy where needed;
* Applied various minor fixups from suggestions;
* Added some comments for clarity.

Changes since v7:
* Rebased on the latest Request API;
* Brought back comment about DRAM width;
* Fixed building as a module;
* Fixed copyright headers.

Changes since v6:
* Reworked MPEG2 controls to stick closer to the bitstream;
* Updated controls documentation accordingly and added requested fixes;
* Renamed tiled format to V4L2_PIX_FMT_SUNXI_TILED_NV12;
* Added various minor driver fixes based on Hans' feedback;
* Fixed dst frame alignment based on Jernej's feedback and tests;
* Removed set bits for the disabled secondary output.

Changes since v5:
* Added MPEG2 quantization matrices definitions and support;
* Cleaned up registers definitions;
* Moved the driver to staging as requested;
* Removed label and newline in device-tree sources;
* Made it possible to build the driver for COMPILE_TEST;
* Fixed various strict checkpatch warnings;
* Used v4l2_m2m_register_media_controller and MEDIA_ENT_F_PROC_VIDEO_DECODER;
* Moved capabilities to compatible-specific variants;
* Removed overkill buffer checks in device_run;
* Renamed from Sunxi-Cedrus to Cedrus.

Changes since v4:
* updated to version 16 of the media requests API;
* added support for VPU-based untiling (starting with the A33);
* added support for the H3, with SRAM support;
* reworked SRAM support and associated compatibles;
* improved failure paths;
* added some MPEG2 input data validation;
* reworked video/format functions to handle multiple formats;
* removed in-driver buffer queues;
* used a threaded irq instead of a workqueue;
* merged various improvements and cleanups from Maxime;
* renamed MPEG2_SLICE_HEADER to MPEG2_SLICE_PARAMS;
* added prefixes to MPEG2 picture coding types;
* used single-buffer allocations to ensure contiguous planes

Changes since v3:
* updated to version 15 of the media request API;
* got rid of untested MPEG1 support;
* added definitons for picture coding types;
* added documentation about MPEG2 slice header fields;
* added documentation about MPEG2 slice format;
* added documentation about the MB32 NV12 format;
* added MPEG2 slice header validation;
* removed the assigned-clocks property;
* reworked and fixed error paths;
* harmonized debug prints, with v4l2 helpers when applicable;
* checked the series through checkpatch;
* switched to SPDX license headers;
* renamed MPEG2 frame header to slice header for consistency and clarity;
* removed A20 SRAM compatible from the driver's list.

Changes since v2:
* updated to version 13 of the media request API;
* integrated various changes from Maxime Ripard;
* reworked memory reservation to use CMA, dynamic allocation and allow
  DMABUF;
* removed reserved memory binding since the CMA pool is the default one
  (and allow ENODEV in the driver, for that use case);
* added SRAM controller support for the SRAM region used by the VE;
* updated the device-tree bindings the for SRAM region;
* added per-platform bindings;
* added A13 support;
* renamed VE node name and label;
* fixed Florent's authorship for the MPEG2 headers;
* added a MAINTAINERS entry.

Changes since v1:
* use the latest version of the request API for Hans Verkuil;

Re: [PATCH v2 00/23] mtd: rawnand: Stop passing mtd_info to drivers

2018-09-06 Thread Miquel Raynal
Hi Boris,

Boris Brezillon  wrote on Thu,  6 Sep 2018
14:05:12 +0200:

> Hello,
> 
> This is the first set of patches aiming at cleaning the raw NAND API.
> 
> This one focuses on inconsistencies we have in the API + the nand_chip
> and nand_ecc_ctrl interfaces. Some functions/hooks are passed a
> nand_chip object, some are passed an mtd_info object and some are
> passed both.
> 
> Since mtd_info can be extracted from nand_chip, we can simply always
> pass a nand_chip and make things consistent. Hopefully with these
> changes merged we'll stop seeing new drivers reproducing the same
> mistake (passing both mtd_info and nand_chip or using mtd_info where
> nand_chip is more appropriate).
> 
> For those who want to see what's in the pipe, here is a branch [1]
> containing all the cleanups I plan to merge.
> 
> Not much has changed in this v2. I just rebased on top of nand/next,
> fixed typos, added A-b/R-b tags, and that's all.
> 
> Regards,
> 
> Boris
> 
> [1]https://github.com/bbrezillon/linux-0day/commits/nand/api-cleanup
> 
> Boris Brezillon (23):
>   mtd: rawnand: plat_nand: Pass a nand_chip object to all
> platform_nand_ctrl hooks
>   mtd: rawnand: Pass a nand_chip object to nand_scan()
>   mtd: rawnand: Pass a nand_chip object to nand_release()
>   mtd: rawnand: Pass a nand_chip object to nand_wait_ready()
>   mtd: rawnand: Pass a nand_chip object to ecc->hwctl()
>   mtd: rawnand: Pass a nand_chip object to ecc->calculate()
>   mtd: rawnand: Pass a nand_chip object to ecc->correct()
>   mtd: rawnand: Pass a nand_chip object to ecc->read_xxx() hooks
>   mtd: rawnand: Pass a nand_chip object to ecc->write_xxx() hooks
>   mtd: rawnand: Pass a nand_chip object to chip->read_xxx() hooks
>   mtd: rawnand: Pass a nand_chip object to chip->write_xxx() hooks
>   mtd: rawnand: Pass a nand_chip object to chip->select_chip()
>   mtd: rawnand: Pass a nand_chip object to chip->block_xxx() hooks
>   mtd: rawnand: Pass a nand_chip object to chip->cmd_ctrl()
>   mtd: rawnand: Pass a nand_chip object to chip->dev_ready()
>   mtd: rawnand: Pass a nand_chip object to chip->cmdfunc()
>   mtd: rawnand: Pass a nand_chip object to chip->waitfunc()
>   mtd: rawnand: Pass a nand_chip object to chip->erase()
>   mtd: rawnand: Pass a nand_chip object to chip->{get,set}_features()
>   mtd: rawnand: Pass a nand_chip object to chip->setup_read_retry()
>   mtd: rawnand: Pass a nand_chip object to chip->setup_data_interface()
>   mtd: rawnand: Pass a nand_chip object to all nand_xxx_bbt() helpers
>   mtd: rawnand: Pass a nand_chip object nand_erase_nand()
> 
>  Documentation/driver-api/mtdnand.rst |   4 +-
>  arch/arm/mach-ep93xx/snappercl15.c   |   7 +-
>  arch/arm/mach-ep93xx/ts72xx.c|   7 +-
>  arch/arm/mach-imx/mach-qong.c|  11 +-
>  arch/arm/mach-ixp4xx/ixdp425-setup.c |   3 +-
>  arch/arm/mach-omap1/board-fsample.c  |   2 +-
>  arch/arm/mach-omap1/board-h2.c   |   2 +-
>  arch/arm/mach-omap1/board-h3.c   |   2 +-
>  arch/arm/mach-omap1/board-nand.c |   3 +-
>  arch/arm/mach-omap1/board-perseus2.c |   2 +-
>  arch/arm/mach-omap1/common.h |   2 +-
>  arch/arm/mach-orion5x/ts78xx-setup.c |  18 +-
>  arch/arm/mach-pxa/balloon3.c |   8 +-
>  arch/arm/mach-pxa/em-x270.c  |   5 +-
>  arch/arm/mach-pxa/palmtx.c   |   5 +-
>  arch/mips/alchemy/devboards/db1200.c |   5 +-
>  arch/mips/alchemy/devboards/db1300.c |   5 +-
>  arch/mips/alchemy/devboards/db1550.c |   5 +-
>  arch/mips/netlogic/xlr/platform-flash.c  |   4 +-
>  arch/mips/pnx833x/common/platform.c  |   3 +-
>  arch/mips/rb532/devices.c|   5 +-
>  arch/sh/boards/mach-migor/setup.c|   6 +-
>  drivers/mtd/nand/raw/ams-delta.c |  24 +-
>  drivers/mtd/nand/raw/atmel/nand-controller.c |  74 ++-
>  drivers/mtd/nand/raw/au1550nd.c  |  70 ++-
>  drivers/mtd/nand/raw/bcm47xxnflash/main.c|   2 +-
>  drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  38 +-
>  drivers/mtd/nand/raw/brcmnand/brcmnand.c |  78 +--
>  drivers/mtd/nand/raw/cafe_nand.c |  56 +--
>  drivers/mtd/nand/raw/cmx270_nand.c   |  20 +-
>  drivers/mtd/nand/raw/cs553x_nand.c   |  33 +-
>  drivers/mtd/nand/raw/davinci_nand.c  |  59 +--
>  drivers/mtd/nand/raw/denali.c|  87 ++--
>  drivers/mtd/nand/raw/diskonchip.c| 116 ++---
>  drivers/mtd/nand/raw/docg4.c |  83 ++--
>  drivers/mtd/nand/raw/fsl_elbc_nand.c |  52 +-
>  drivers/mtd/nand/raw/fsl_ifc_nand.c  |  46 +-
>  drivers/mtd/nand/raw/fsl_upm.c   |  34 +-
>  drivers/mtd/nand/raw/fsmc_nand.c |  42 +-
>  

Re: [PATCH v2 01/23] mtd: rawnand: plat_nand: Pass a nand_chip object to all platform_nand_ctrl hooks

2018-09-06 Thread Paul Burton
Hi Boris,

On Thu, Sep 06, 2018 at 02:05:13PM +0200, Boris Brezillon wrote:
> Let's make the raw NAND API consistent by patching all helpers and
> hooks to take a nand_chip object instead of an mtd_info one or
> remove the mtd_info object when both are passed.
> 
> In order to do that, we first need to update the platform_nand_ctrl
> hooks to take a nand_chip object instead of an mtd_info.
> 
> We add temporary plat_nand_xxx() wrappers to the do the mtd -> chip
> conversion, but those will be dropped when patching nand_chip hooks to
> take a nand_chip object.
> 
> Signed-off-by: Boris Brezillon 
> Reviewed-by: Alexander Sverdlin 
> Acked-by: Alexander Sverdlin 
> Acked-by: Robert Jarzmik 
> Acked-by: Krzysztof Halasa 

Acked-by: Paul Burton  # MIPS parts

Thanks,
Paul
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v2 1/2] staging: rtl8188eu: remove empty if statement in rtw_led.c

2018-09-06 Thread Joe Perches
On Thu, 2018-09-06 at 13:32 +0300, Dan Carpenter wrote:
> Thanks.
> 
> Reviewed-by: Dan Carpenter 

Trivial, but these case statement blocks should prefer
unindented blocks instead of reformatting the test.

Perhaps similar to the below for each of the cases:
---
 drivers/staging/rtl8188eu/core/rtw_led.c | 53 
 1 file changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/staging/rtl8188eu/core/rtw_led.c 
b/drivers/staging/rtl8188eu/core/rtw_led.c
index cbef871a7679..d9c19c1cda16 100644
--- a/drivers/staging/rtl8188eu/core/rtw_led.c
+++ b/drivers/staging/rtl8188eu/core/rtw_led.c
@@ -290,33 +290,34 @@ static void SwLedControlMode1(struct adapter *padapter, 
enum LED_CTL_MODE LedAct
}
break;
case LED_CTL_SITE_SURVEY:
-   if ((pmlmepriv->LinkDetectInfo.bBusyTraffic) && 
(check_fwstate(pmlmepriv, _FW_LINKED))) {
-   ;
-   } else if (!pLed->bLedScanBlinkInProgress) {
-   if (IS_LED_WPS_BLINKING(pLed))
-   return;
-   if (pLed->bLedNoLinkBlinkInProgress) {
-   del_timer_sync(>BlinkTimer);
-   pLed->bLedNoLinkBlinkInProgress = false;
-   }
-   if (pLed->bLedLinkBlinkInProgress) {
-   del_timer_sync(>BlinkTimer);
-pLed->bLedLinkBlinkInProgress = false;
-   }
-   if (pLed->bLedBlinkInProgress) {
-   del_timer_sync(>BlinkTimer);
-   pLed->bLedBlinkInProgress = false;
-   }
-   pLed->bLedScanBlinkInProgress = true;
-   pLed->CurrLedState = LED_BLINK_SCAN;
-   pLed->BlinkTimes = 24;
-   if (pLed->bLedOn)
-   pLed->BlinkingLedState = RTW_LED_OFF;
-   else
-   pLed->BlinkingLedState = RTW_LED_ON;
-   mod_timer(>BlinkTimer, jiffies +
- 
msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
+   if (pmlmepriv->LinkDetectInfo.bBusyTraffic &&
+   check_fwstate(pmlmepriv, _FW_LINKED))
+   break;
+   if (pLed->bLedScanBlinkInProgress)
+   break;
+   if (IS_LED_WPS_BLINKING(pLed))
+   return;
+   if (pLed->bLedNoLinkBlinkInProgress) {
+   del_timer_sync(>BlinkTimer);
+   pLed->bLedNoLinkBlinkInProgress = false;
+   }
+   if (pLed->bLedLinkBlinkInProgress) {
+   del_timer_sync(>BlinkTimer);
+   pLed->bLedLinkBlinkInProgress = false;
+   }
+   if (pLed->bLedBlinkInProgress) {
+   del_timer_sync(>BlinkTimer);
+   pLed->bLedBlinkInProgress = false;
}
+   pLed->bLedScanBlinkInProgress = true;
+   pLed->CurrLedState = LED_BLINK_SCAN;
+   pLed->BlinkTimes = 24;
+   if (pLed->bLedOn)
+   pLed->BlinkingLedState = RTW_LED_OFF;
+   else
+   pLed->BlinkingLedState = RTW_LED_ON;
+   mod_timer(>BlinkTimer, jiffies +
+ msecs_to_jiffies(LED_BLINK_SCAN_INTERVAL_ALPHA));
break;
case LED_CTL_TX:
case LED_CTL_RX:

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH] staging: rtl8723bs: check for i out of range before accessing szLine[i]

2018-09-06 Thread Colin King
From: Colin Ian King 

Currently szLine[i] is being accessed before the index i is being
ranged checked.  Fix this by checking the range first.  Also, evaluate
the length of the string szLine just once rather than multiple times and
move the loop variable i to an inner scope and make it an int.

Signed-off-by: Colin Ian King 
---
 drivers/staging/rtl8723bs/hal/hal_com_phycfg.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/rtl8723bs/hal/hal_com_phycfg.c 
b/drivers/staging/rtl8723bs/hal/hal_com_phycfg.c
index 0d2c61b67d0e..0833cce43dd3 100644
--- a/drivers/staging/rtl8723bs/hal/hal_com_phycfg.c
+++ b/drivers/staging/rtl8723bs/hal/hal_com_phycfg.c
@@ -2919,7 +2919,6 @@ int PHY_ConfigRFWithTxPwrTrackParaFile(struct adapter 
*Adapter, char *pFileName)
struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
int rlen = 0, rtStatus = _FAIL;
char *szLine, *ptmp;
-   u32 i = 0;
 
if (!(Adapter->registrypriv.load_phy_file & 
LOAD_RF_TXPWR_TRACK_PARA_FILE))
return rtStatus;
@@ -2958,8 +2957,10 @@ int PHY_ConfigRFWithTxPwrTrackParaFile(struct adapter 
*Adapter, char *pFileName)
char band[5] = "", path[5] = "", sign[5] = "";
char chnl[5] = "", rate[10] = "";
char data[300] = ""; /*  100 is too small */
+   const int len = strlen(szLine);
+   int i;
 
-   if (strlen(szLine) < 10 || szLine[0] != '[')
+   if (len < 10 || szLine[0] != '[')
continue;
 
strncpy(band, szLine+1, 2);
@@ -2973,7 +2974,7 @@ int PHY_ConfigRFWithTxPwrTrackParaFile(struct adapter 
*Adapter, char *pFileName)
if (!ParseQualifiedString(szLine, , chnl, 
'[', ']')) {
/* DBG_871X("Fail to parse channel 
group!\n"); */
}
-   while (szLine[i] != '{' && i < strlen(szLine))
+   while (i < len && szLine[i] != '{')
i++;
if (!ParseQualifiedString(szLine, , data, 
'{', '}')) {
/* DBG_871X("Fail to parse data!\n"); */
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 17/23] mtd: rawnand: Pass a nand_chip object to chip->waitfunc()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->waitfunc() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/atmel/nand-controller.c  |  2 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c  | 12 +--
 drivers/mtd/nand/raw/denali.c |  4 ++--
 drivers/mtd/nand/raw/diskonchip.c |  2 +-
 drivers/mtd/nand/raw/docg4.c  |  4 ++--
 drivers/mtd/nand/raw/fsl_elbc_nand.c  |  4 ++--
 drivers/mtd/nand/raw/fsl_ifc_nand.c   |  3 ++-
 drivers/mtd/nand/raw/lpc32xx_mlc.c| 17 
 drivers/mtd/nand/raw/nand_base.c  | 29 ---
 drivers/mtd/nand/raw/omap2.c  |  8 +++-
 drivers/mtd/nand/raw/r852.c   |  2 +-
 drivers/mtd/nand/raw/tango_nand.c |  2 +-
 drivers/mtd/nand/raw/tmio_nand.c  |  5 ++---
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 ++-
 include/linux/mtd/rawnand.h   |  2 +-
 15 files changed, 42 insertions(+), 57 deletions(-)

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 2dcd8aa0ce0b..d5939114f999 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -945,7 +945,7 @@ static int atmel_hsmc_nand_pmecc_write_pg(struct nand_chip 
*chip,
dev_err(nc->base.dev, "Failed to program NAND page (err = 
%d)\n",
ret);
 
-   status = chip->waitfunc(mtd, chip);
+   status = chip->waitfunc(chip);
if (status & NAND_STATUS_FAIL)
return -EIO;
 
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index 4b814a39b24f..fee40a3ce5d2 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -1237,9 +1237,8 @@ static void brcmnand_cmd_ctrl(struct nand_chip *chip, int 
dat,
/* intentionally left blank */
 }
 
-static int brcmnand_waitfunc(struct mtd_info *mtd, struct nand_chip *this)
+static int brcmnand_waitfunc(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct brcmnand_host *host = nand_get_controller_data(chip);
struct brcmnand_controller *ctrl = host->ctrl;
unsigned long timeo = msecs_to_jiffies(100);
@@ -1274,7 +1273,6 @@ static int brcmnand_low_level_op(struct brcmnand_host 
*host,
 enum brcmnand_llop_type type, u32 data,
 bool last_op)
 {
-   struct mtd_info *mtd = nand_to_mtd(>chip);
struct nand_chip *chip = >chip;
struct brcmnand_controller *ctrl = host->ctrl;
u32 tmp;
@@ -1307,7 +1305,7 @@ static int brcmnand_low_level_op(struct brcmnand_host 
*host,
(void)brcmnand_read_reg(ctrl, BRCMNAND_LL_OP);
 
brcmnand_send_cmd(host, CMD_LOW_LEVEL_OP);
-   return brcmnand_waitfunc(mtd, chip);
+   return brcmnand_waitfunc(chip);
 }
 
 static void brcmnand_cmdfunc(struct nand_chip *chip, unsigned command,
@@ -1383,7 +1381,7 @@ static void brcmnand_cmdfunc(struct nand_chip *chip, 
unsigned command,
(void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
 
brcmnand_send_cmd(host, native_cmd);
-   brcmnand_waitfunc(mtd, chip);
+   brcmnand_waitfunc(chip);
 
if (native_cmd == CMD_PARAMETER_READ ||
native_cmd == CMD_PARAMETER_CHANGE_COL) {
@@ -1615,7 +1613,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, 
struct nand_chip *chip,
(void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
/* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */
brcmnand_send_cmd(host, CMD_PAGE_READ);
-   brcmnand_waitfunc(mtd, chip);
+   brcmnand_waitfunc(chip);
 
if (likely(buf)) {
brcmnand_soc_data_bus_prepare(ctrl->soc, false);
@@ -1893,7 +1891,7 @@ static int brcmnand_write(struct mtd_info *mtd, struct 
nand_chip *chip,
 
/* we cannot use SPARE_AREA_PROGRAM when PARTIAL_PAGE_EN=0 */
brcmnand_send_cmd(host, CMD_PROGRAM_PAGE);
-   status = brcmnand_waitfunc(mtd, chip);
+   status = brcmnand_waitfunc(chip);
 
if (status & NAND_STATUS_FAIL) {
dev_info(ctrl->dev, "program failed at %llx\n",
diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
index 7258dd13b3f9..0c3fff9d65af 100644
--- a/drivers/mtd/nand/raw/denali.c
+++ b/drivers/mtd/nand/raw/denali.c
@@ -904,9 +904,9 @@ static void denali_select_chip(struct nand_chip *chip, int 
cs)
denali->active_bank = cs;
 }
 
-static int denali_waitfunc(struct mtd_info *mtd, struct nand_chip *chip)
+static int 

[PATCH v2 10/23] mtd: rawnand: Pass a nand_chip object to chip->read_xxx() hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle all chip->read_xxx() hooks at once.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |  7 ++--
 drivers/mtd/nand/raw/atmel/nand-controller.c | 10 +++---
 drivers/mtd/nand/raw/au1550nd.c  | 15 -
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c | 10 +++---
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  7 ++--
 drivers/mtd/nand/raw/cafe_nand.c | 10 +++---
 drivers/mtd/nand/raw/cmx270_nand.c   |  7 ++--
 drivers/mtd/nand/raw/cs553x_nand.c   |  7 ++--
 drivers/mtd/nand/raw/davinci_nand.c  |  5 ++-
 drivers/mtd/nand/raw/denali.c| 11 ---
 drivers/mtd/nand/raw/diskonchip.c| 32 +++---
 drivers/mtd/nand/raw/docg4.c | 13 +++-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  8 ++---
 drivers/mtd/nand/raw/fsl_ifc_nand.c  | 13 +++-
 drivers/mtd/nand/raw/fsl_upm.c   |  8 ++---
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   | 16 -
 drivers/mtd/nand/raw/hisi504_nand.c  |  8 ++---
 drivers/mtd/nand/raw/lpc32xx_slc.c   | 12 +++
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  8 ++---
 drivers/mtd/nand/raw/mtk_nand.c  |  7 ++--
 drivers/mtd/nand/raw/mxc_nand.c  | 10 +++---
 drivers/mtd/nand/raw/nand_base.c | 41 ++--
 drivers/mtd/nand/raw/nandsim.c   |  8 ++---
 drivers/mtd/nand/raw/ndfc.c  |  3 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  8 ++---
 drivers/mtd/nand/raw/omap2.c | 24 --
 drivers/mtd/nand/raw/orion_nand.c|  3 +-
 drivers/mtd/nand/raw/oxnas_nand.c|  6 ++--
 drivers/mtd/nand/raw/pasemi_nand.c   |  4 +--
 drivers/mtd/nand/raw/plat_nand.c | 11 +--
 drivers/mtd/nand/raw/qcom_nandc.c|  6 ++--
 drivers/mtd/nand/raw/r852.c  |  8 ++---
 drivers/mtd/nand/raw/s3c2410.c   |  6 ++--
 drivers/mtd/nand/raw/sh_flctl.c  | 10 +++---
 drivers/mtd/nand/raw/socrates_nand.c | 10 +++---
 drivers/mtd/nand/raw/sunxi_nand.c| 11 +++
 drivers/mtd/nand/raw/tango_nand.c| 12 +++
 drivers/mtd/nand/raw/tmio_nand.c |  8 ++---
 drivers/mtd/nand/raw/txx9ndfmc.c |  8 ++---
 drivers/mtd/nand/raw/xway_nand.c |  8 ++---
 drivers/staging/mt29f_spinand/mt29f_spinand.c| 10 +++---
 include/linux/mtd/rawnand.h  |  4 +--
 42 files changed, 186 insertions(+), 247 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index acf7971e815d..eb48c939c4ae 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -75,10 +75,9 @@ static void ams_delta_write_byte(struct mtd_info *mtd, 
u_char byte)
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 1);
 }
 
-static u_char ams_delta_read_byte(struct mtd_info *mtd)
+static u_char ams_delta_read_byte(struct nand_chip *this)
 {
u_char res;
-   struct nand_chip *this = mtd_to_nand(mtd);
void __iomem *io_base = (void __iomem *)nand_get_controller_data(this);
 
gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 0);
@@ -99,12 +98,12 @@ static void ams_delta_write_buf(struct mtd_info *mtd, const 
u_char *buf,
ams_delta_write_byte(mtd, buf[i]);
 }
 
-static void ams_delta_read_buf(struct mtd_info *mtd, u_char *buf, int len)
+static void ams_delta_read_buf(struct nand_chip *this, u_char *buf, int len)
 {
int i;
 
for (i=0; iactivecs->io.virt);
@@ -429,9 +428,8 @@ static void atmel_nand_write_byte(struct mtd_info *mtd, u8 
byte)
iowrite8(byte, nand->activecs->io.virt);
 }
 
-static void atmel_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
+static void atmel_nand_read_buf(struct nand_chip *chip, u8 *buf, int len)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_nand_controller *nc;
 
@@ -883,8 +881,8 @@ static int atmel_nand_pmecc_read_pg(struct nand_chip *chip, 
u8 *buf,
if (ret)
return ret;
 
-   atmel_nand_read_buf(mtd, buf, mtd->writesize);
-   atmel_nand_read_buf(mtd, chip->oob_poi, mtd->oobsize);
+   atmel_nand_read_buf(chip, buf, mtd->writesize);
+   atmel_nand_read_buf(chip, chip->oob_poi, mtd->oobsize);
 
ret = atmel_nand_pmecc_correct_data(chip, buf, raw);
 
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index d277a141c7d3..76ea4141eb10 100644
--- 

[PATCH v2 09/23] mtd: rawnand: Pass a nand_chip object to ecc->write_xxx() hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle all ecc->write_xxx() hooks at once.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/atmel/nand-controller.c  | 12 ++---
 drivers/mtd/nand/raw/brcmnand/brcmnand.c  | 21 
 drivers/mtd/nand/raw/cafe_nand.c  | 13 ++---
 drivers/mtd/nand/raw/denali.c | 14 ++---
 drivers/mtd/nand/raw/docg4.c  | 17 +++---
 drivers/mtd/nand/raw/fsl_elbc_nand.c  | 14 +++--
 drivers/mtd/nand/raw/fsl_ifc_nand.c   |  6 ++-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c| 21 
 drivers/mtd/nand/raw/hisi504_nand.c   |  8 +--
 drivers/mtd/nand/raw/lpc32xx_mlc.c|  7 ++-
 drivers/mtd/nand/raw/lpc32xx_slc.c| 14 ++---
 drivers/mtd/nand/raw/marvell_nand.c   | 32 ++--
 drivers/mtd/nand/raw/mtk_nand.c   | 19 ---
 drivers/mtd/nand/raw/mxc_nand.c   | 13 +++--
 drivers/mtd/nand/raw/nand_base.c  | 74 ---
 drivers/mtd/nand/raw/nand_ecc.c   |  2 +-
 drivers/mtd/nand/raw/nand_micron.c|  7 ++-
 drivers/mtd/nand/raw/omap2.c  | 11 ++--
 drivers/mtd/nand/raw/qcom_nandc.c | 15 +++---
 drivers/mtd/nand/raw/sh_flctl.c   |  7 +--
 drivers/mtd/nand/raw/sunxi_nand.c | 21 
 drivers/mtd/nand/raw/tango_nand.c | 12 ++---
 drivers/mtd/nand/raw/tegra_nand.c | 13 ++---
 drivers/mtd/nand/raw/vf610_nfc.c  | 13 ++---
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  3 +-
 include/linux/mtd/rawnand.h   | 33 ++--
 26 files changed, 208 insertions(+), 214 deletions(-)

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 45061b591346..3ebe9b727315 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -858,15 +858,13 @@ static int atmel_nand_pmecc_write_pg(struct nand_chip 
*chip, const u8 *buf,
return nand_prog_page_end_op(chip);
 }
 
-static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,
-  struct nand_chip *chip, const u8 *buf,
+static int atmel_nand_pmecc_write_page(struct nand_chip *chip, const u8 *buf,
   int oob_required, int page)
 {
return atmel_nand_pmecc_write_pg(chip, buf, oob_required, page, false);
 }
 
-static int atmel_nand_pmecc_write_page_raw(struct mtd_info *mtd,
-  struct nand_chip *chip,
+static int atmel_nand_pmecc_write_page_raw(struct nand_chip *chip,
   const u8 *buf, int oob_required,
   int page)
 {
@@ -963,8 +961,7 @@ static int atmel_hsmc_nand_pmecc_write_pg(struct nand_chip 
*chip,
return ret;
 }
 
-static int atmel_hsmc_nand_pmecc_write_page(struct mtd_info *mtd,
-   struct nand_chip *chip,
+static int atmel_hsmc_nand_pmecc_write_page(struct nand_chip *chip,
const u8 *buf, int oob_required,
int page)
 {
@@ -972,8 +969,7 @@ static int atmel_hsmc_nand_pmecc_write_page(struct mtd_info 
*mtd,
  false);
 }
 
-static int atmel_hsmc_nand_pmecc_write_page_raw(struct mtd_info *mtd,
-   struct nand_chip *chip,
+static int atmel_hsmc_nand_pmecc_write_page_raw(struct nand_chip *chip,
const u8 *buf,
int oob_required, int page)
 {
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index a17ae692aee9..d8fb2b5c19c9 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -1909,9 +1909,10 @@ static int brcmnand_write(struct mtd_info *mtd, struct 
nand_chip *chip,
return ret;
 }
 
-static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
-  const uint8_t *buf, int oob_required, int page)
+static int brcmnand_write_page(struct nand_chip *chip, const uint8_t *buf,
+  int oob_required, int page)
 {
+   struct mtd_info *mtd = nand_to_mtd(chip);
struct brcmnand_host *host = nand_get_controller_data(chip);
void *oob = oob_required ? chip->oob_poi : NULL;
 
@@ -1921,10 +1922,10 @@ static int brcmnand_write_page(struct mtd_info *mtd, 
struct nand_chip *chip,
return nand_prog_page_end_op(chip);
 }
 
-static int brcmnand_write_page_raw(struct mtd_info *mtd,
-  struct 

[PATCH v2 21/23] mtd: rawnand: Pass a nand_chip object to chip->setup_data_interface()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->setup_data_interface() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/atmel/nand-controller.c | 3 +--
 drivers/mtd/nand/raw/denali.c| 4 ++--
 drivers/mtd/nand/raw/fsmc_nand.c | 3 +--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c| 3 +--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h   | 2 +-
 drivers/mtd/nand/raw/marvell_nand.c  | 3 +--
 drivers/mtd/nand/raw/mtk_nand.c  | 4 ++--
 drivers/mtd/nand/raw/mxc_nand.c  | 7 +++
 drivers/mtd/nand/raw/nand_base.c | 9 +++--
 drivers/mtd/nand/raw/s3c2410.c   | 3 ++-
 drivers/mtd/nand/raw/sunxi_nand.c| 3 +--
 drivers/mtd/nand/raw/tango_nand.c| 3 +--
 drivers/mtd/nand/raw/tegra_nand.c| 3 +--
 include/linux/mtd/rawnand.h  | 2 +-
 14 files changed, 21 insertions(+), 31 deletions(-)

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index d5939114f999..a38633a67ead 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -1448,10 +1448,9 @@ static int atmel_hsmc_nand_setup_data_interface(struct 
atmel_nand *nand,
return 0;
 }
 
-static int atmel_nand_setup_data_interface(struct mtd_info *mtd, int csline,
+static int atmel_nand_setup_data_interface(struct nand_chip *chip, int csline,
const struct nand_data_interface *conf)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_nand_controller *nc;
 
diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
index bb4ad3b822ad..c5e35461d6b3 100644
--- a/drivers/mtd/nand/raw/denali.c
+++ b/drivers/mtd/nand/raw/denali.c
@@ -932,10 +932,10 @@ static int denali_erase(struct nand_chip *chip, int page)
return irq_status & INTR__ERASE_COMP ? 0 : -EIO;
 }
 
-static int denali_setup_data_interface(struct mtd_info *mtd, int chipnr,
+static int denali_setup_data_interface(struct nand_chip *chip, int chipnr,
   const struct nand_data_interface *conf)
 {
-   struct denali_nand_info *denali = mtd_to_denali(mtd);
+   struct denali_nand_info *denali = mtd_to_denali(nand_to_mtd(chip));
const struct nand_sdr_timings *timings;
unsigned long t_x, mult_x;
int acc_clks, re_2_we, re_2_re, we_2_re, addr_2_data;
diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index 15bf533c907a..5e06fce4b295 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -340,10 +340,9 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,
return 0;
 }
 
-static int fsmc_setup_data_interface(struct mtd_info *mtd, int csline,
+static int fsmc_setup_data_interface(struct nand_chip *nand, int csline,
 const struct nand_data_interface *conf)
 {
-   struct nand_chip *nand = mtd_to_nand(mtd);
struct fsmc_nand_data *host = nand_get_controller_data(nand);
struct fsmc_nand_timings tims;
const struct nand_sdr_timings *sdrt;
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c 
b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c
index 88ea2203e263..bd4cfac6b5aa 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c
@@ -471,10 +471,9 @@ void gpmi_nfc_apply_timings(struct gpmi_nand_data *this)
udelay(dll_wait_time_us);
 }
 
-int gpmi_setup_data_interface(struct mtd_info *mtd, int chipnr,
+int gpmi_setup_data_interface(struct nand_chip *chip, int chipnr,
  const struct nand_data_interface *conf)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct gpmi_nand_data *this = nand_get_controller_data(chip);
const struct nand_sdr_timings *sdr;
 
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h 
b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h
index 69cd0cbde4f2..d0b79bac2728 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h
@@ -178,7 +178,7 @@ int gpmi_is_ready(struct gpmi_nand_data *, unsigned chip);
 int gpmi_send_command(struct gpmi_nand_data *);
 int gpmi_enable_clk(struct gpmi_nand_data *this);
 int gpmi_disable_clk(struct gpmi_nand_data *this);
-int gpmi_setup_data_interface(struct mtd_info *mtd, int chipnr,
+int gpmi_setup_data_interface(struct nand_chip *chip, int chipnr,
  const struct nand_data_interface *conf);
 void gpmi_nfc_apply_timings(struct gpmi_nand_data *this);
 int gpmi_read_data(struct gpmi_nand_data *, void *buf, int len);
diff --git a/drivers/mtd/nand/raw/marvell_nand.c 

[PATCH v2 20/23] mtd: rawnand: Pass a nand_chip object to chip->setup_read_retry()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->setup_read_retry() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/nand_base.c   | 12 +---
 drivers/mtd/nand/raw/nand_hynix.c  |  3 +--
 drivers/mtd/nand/raw/nand_micron.c |  3 +--
 include/linux/mtd/rawnand.h|  2 +-
 4 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 0ae597ced5b4..a7575aa68c48 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -3475,17 +3475,15 @@ static uint8_t *nand_transfer_oob(struct mtd_info *mtd, 
uint8_t *oob,
 
 /**
  * nand_setup_read_retry - [INTERN] Set the READ RETRY mode
- * @mtd: MTD device structure
+ * @chip: NAND chip object
  * @retry_mode: the retry mode to use
  *
  * Some vendors supply a special command to shift the Vt threshold, to be used
  * when there are too many bitflips in a page (i.e., ECC error). After setting
  * a new threshold, the host should retry reading the page.
  */
-static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
+static int nand_setup_read_retry(struct nand_chip *chip, int retry_mode)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
-
pr_debug("setting READ RETRY mode %d\n", retry_mode);
 
if (retry_mode >= chip->read_retries)
@@ -3494,7 +3492,7 @@ static int nand_setup_read_retry(struct mtd_info *mtd, 
int retry_mode)
if (!chip->setup_read_retry)
return -EOPNOTSUPP;
 
-   return chip->setup_read_retry(mtd, retry_mode);
+   return chip->setup_read_retry(chip, retry_mode);
 }
 
 static void nand_wait_readrdy(struct nand_chip *chip)
@@ -3619,7 +3617,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t 
from,
if (mtd->ecc_stats.failed - ecc_failures) {
if (retry_mode + 1 < chip->read_retries) {
retry_mode++;
-   ret = nand_setup_read_retry(mtd,
+   ret = nand_setup_read_retry(chip,
retry_mode);
if (ret < 0)
break;
@@ -3646,7 +3644,7 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t 
from,
 
/* Reset to retry mode 0 */
if (retry_mode) {
-   ret = nand_setup_read_retry(mtd, 0);
+   ret = nand_setup_read_retry(chip, 0);
if (ret < 0)
break;
retry_mode = 0;
diff --git a/drivers/mtd/nand/raw/nand_hynix.c 
b/drivers/mtd/nand/raw/nand_hynix.c
index fa873e517131..bb1c4f8ce785 100644
--- a/drivers/mtd/nand/raw/nand_hynix.c
+++ b/drivers/mtd/nand/raw/nand_hynix.c
@@ -113,9 +113,8 @@ static int hynix_nand_reg_write_op(struct nand_chip *chip, 
u8 addr, u8 val)
return 0;
 }
 
-static int hynix_nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
+static int hynix_nand_setup_read_retry(struct nand_chip *chip, int retry_mode)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct hynix_nand *hynix = nand_get_manufacturer_data(chip);
const u8 *values;
int i, ret;
diff --git a/drivers/mtd/nand/raw/nand_micron.c 
b/drivers/mtd/nand/raw/nand_micron.c
index 2f26dbeb5428..1a5505ccbe54 100644
--- a/drivers/mtd/nand/raw/nand_micron.c
+++ b/drivers/mtd/nand/raw/nand_micron.c
@@ -74,9 +74,8 @@ struct micron_nand {
struct micron_on_die_ecc ecc;
 };
 
-static int micron_nand_setup_read_retry(struct mtd_info *mtd, int retry_mode)
+static int micron_nand_setup_read_retry(struct nand_chip *chip, int retry_mode)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
u8 feature[ONFI_SUBFEATURE_PARAM_LEN] = {retry_mode};
 
return nand_set_features(chip, ONFI_FEATURE_ADDR_READ_RETRY, feature);
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 7c639070c512..14ce2b078206 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1303,7 +1303,7 @@ struct nand_chip {
uint8_t *subfeature_para);
int (*get_features)(struct nand_chip *chip, int feature_addr,
uint8_t *subfeature_para);
-   int (*setup_read_retry)(struct mtd_info *mtd, int retry_mode);
+   int (*setup_read_retry)(struct nand_chip *chip, int retry_mode);
int (*setup_data_interface)(struct mtd_info *mtd, int chipnr,
const struct nand_data_interface *conf);
 
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org

[PATCH v2 19/23] mtd: rawnand: Pass a nand_chip object to chip->{get, set}_features()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->{get,set}_features() hooks.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/mxc_nand.c  | 16 
 drivers/mtd/nand/raw/nand_base.c | 21 ++---
 include/linux/mtd/rawnand.h  | 12 ++--
 3 files changed, 20 insertions(+), 29 deletions(-)

diff --git a/drivers/mtd/nand/raw/mxc_nand.c b/drivers/mtd/nand/raw/mxc_nand.c
index a03a33656cf4..ec150e19a368 100644
--- a/drivers/mtd/nand/raw/mxc_nand.c
+++ b/drivers/mtd/nand/raw/mxc_nand.c
@@ -1393,11 +1393,11 @@ static void mxc_nand_command(struct nand_chip 
*nand_chip, unsigned command,
}
 }
 
-static int mxc_nand_set_features(struct mtd_info *mtd, struct nand_chip *chip,
-int addr, u8 *subfeature_param)
+static int mxc_nand_set_features(struct nand_chip *chip, int addr,
+u8 *subfeature_param)
 {
-   struct nand_chip *nand_chip = mtd_to_nand(mtd);
-   struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
+   struct mtd_info *mtd = nand_to_mtd(chip);
+   struct mxc_nand_host *host = nand_get_controller_data(chip);
int i;
 
host->buf_start = 0;
@@ -1413,11 +1413,11 @@ static int mxc_nand_set_features(struct mtd_info *mtd, 
struct nand_chip *chip,
return 0;
 }
 
-static int mxc_nand_get_features(struct mtd_info *mtd, struct nand_chip *chip,
-int addr, u8 *subfeature_param)
+static int mxc_nand_get_features(struct nand_chip *chip, int addr,
+u8 *subfeature_param)
 {
-   struct nand_chip *nand_chip = mtd_to_nand(mtd);
-   struct mxc_nand_host *host = nand_get_controller_data(nand_chip);
+   struct mtd_info *mtd = nand_to_mtd(chip);
+   struct mxc_nand_host *host = nand_get_controller_data(chip);
int i;
 
host->devtype_data->send_cmd(host, NAND_CMD_GET_FEATURES, false);
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 26be436eb8f1..0ae597ced5b4 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -1163,12 +1163,10 @@ static bool nand_supports_set_features(struct nand_chip 
*chip, int addr)
 int nand_get_features(struct nand_chip *chip, int addr,
  u8 *subfeature_param)
 {
-   struct mtd_info *mtd = nand_to_mtd(chip);
-
if (!nand_supports_get_features(chip, addr))
return -ENOTSUPP;
 
-   return chip->get_features(mtd, chip, addr, subfeature_param);
+   return chip->get_features(chip, addr, subfeature_param);
 }
 EXPORT_SYMBOL_GPL(nand_get_features);
 
@@ -1184,12 +1182,10 @@ EXPORT_SYMBOL_GPL(nand_get_features);
 int nand_set_features(struct nand_chip *chip, int addr,
  u8 *subfeature_param)
 {
-   struct mtd_info *mtd = nand_to_mtd(chip);
-
if (!nand_supports_set_features(chip, addr))
return -ENOTSUPP;
 
-   return chip->set_features(mtd, chip, addr, subfeature_param);
+   return chip->set_features(chip, addr, subfeature_param);
 }
 EXPORT_SYMBOL_GPL(nand_set_features);
 
@@ -4846,13 +4842,11 @@ static int nand_max_bad_blocks(struct mtd_info *mtd, 
loff_t ofs, size_t len)
 
 /**
  * nand_default_set_features- [REPLACEABLE] set NAND chip features
- * @mtd: MTD device structure
  * @chip: nand chip info structure
  * @addr: feature address.
  * @subfeature_param: the subfeature parameters, a four bytes array.
  */
-static int nand_default_set_features(struct mtd_info *mtd,
-struct nand_chip *chip, int addr,
+static int nand_default_set_features(struct nand_chip *chip, int addr,
 uint8_t *subfeature_param)
 {
return nand_set_features_op(chip, addr, subfeature_param);
@@ -4860,13 +4854,11 @@ static int nand_default_set_features(struct mtd_info 
*mtd,
 
 /**
  * nand_default_get_features- [REPLACEABLE] get NAND chip features
- * @mtd: MTD device structure
  * @chip: nand chip info structure
  * @addr: feature address.
  * @subfeature_param: the subfeature parameters, a four bytes array.
  */
-static int nand_default_get_features(struct mtd_info *mtd,
-struct nand_chip *chip, int addr,
+static int nand_default_get_features(struct nand_chip *chip, int addr,
 uint8_t *subfeature_param)
 {
return nand_get_features_op(chip, addr, subfeature_param);
@@ -4874,7 +4866,6 @@ static int nand_default_get_features(struct mtd_info *mtd,
 
 /**
  * nand_get_set_features_notsupp - set/get features stub returning -ENOTSUPP
- * @mtd: MTD device structure
  * @chip: nand chip info structure
  * @addr: feature address.
  * @subfeature_param: the subfeature parameters, a four bytes array.
@@ 

[PATCH v2 16/23] mtd: rawnand: Pass a nand_chip object to chip->cmdfunc()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->cmdfunc() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/au1550nd.c  |  7 ++--
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  4 +--
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  4 +--
 drivers/mtd/nand/raw/cafe_nand.c |  4 +--
 drivers/mtd/nand/raw/diskonchip.c|  5 +--
 drivers/mtd/nand/raw/docg4.c |  4 +--
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  4 +--
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  6 ++--
 drivers/mtd/nand/raw/hisi504_nand.c  |  6 ++--
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  8 ++---
 drivers/mtd/nand/raw/mxc_nand.c  |  6 ++--
 drivers/mtd/nand/raw/nand_base.c | 46 
 drivers/mtd/nand/raw/nand_hynix.c|  7 ++--
 drivers/mtd/nand/raw/nuc900_nand.c   |  5 +--
 drivers/mtd/nand/raw/qcom_nandc.c|  3 +-
 drivers/mtd/nand/raw/sh_flctl.c  |  3 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  4 +--
 include/linux/mtd/rawnand.h  |  2 +-
 18 files changed, 64 insertions(+), 64 deletions(-)

diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 1f0fba8d87c6..d0ec8606e769 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -236,14 +236,15 @@ static void au1550_select_chip(struct nand_chip *this, 
int chip)
 
 /**
  * au1550_command - Send command to NAND device
- * @mtd:   MTD device structure
+ * @this:  NAND chip object
  * @command:   the command to be sent
  * @column:the column address for this command, -1 if none
  * @page_addr: the page address for this command, -1 if none
  */
-static void au1550_command(struct mtd_info *mtd, unsigned command, int column, 
int page_addr)
+static void au1550_command(struct nand_chip *this, unsigned command,
+  int column, int page_addr)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(this);
struct au1550nd_ctx *ctx = container_of(this, struct au1550nd_ctx,
chip);
int ce_override = 0, i;
diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
index f6f694b3cd8e..59e1b88aae38 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
@@ -210,11 +210,11 @@ static int bcm47xxnflash_ops_bcm4706_dev_ready(struct 
nand_chip *nand_chip)
  * registers of ChipCommon core. Hacking cmd_ctrl to understand and convert
  * standard commands would be much more complicated.
  */
-static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct mtd_info *mtd,
+static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct nand_chip *nand_chip,
  unsigned command, int column,
  int page_addr)
 {
-   struct nand_chip *nand_chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(nand_chip);
struct bcm47xxnflash *b47n = nand_get_controller_data(nand_chip);
struct bcma_drv_cc *cc = b47n->cc;
u32 ctlcode;
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index 80f5b4b9ee75..4b814a39b24f 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -1310,10 +1310,10 @@ static int brcmnand_low_level_op(struct brcmnand_host 
*host,
return brcmnand_waitfunc(mtd, chip);
 }
 
-static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
+static void brcmnand_cmdfunc(struct nand_chip *chip, unsigned command,
 int column, int page_addr)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(chip);
struct brcmnand_host *host = nand_get_controller_data(chip);
struct brcmnand_controller *ctrl = host->ctrl;
u64 addr = (u64)page_addr << chip->page_shift;
diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index 60a2eecc2b2a..801045d77872 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -156,10 +156,10 @@ static uint8_t cafe_read_byte(struct nand_chip *chip)
return d;
 }
 
-static void cafe_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
+static void cafe_nand_cmdfunc(struct nand_chip *chip, unsigned command,
  int column, int page_addr)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(chip);
struct cafe_priv *cafe = 

[PATCH v2 23/23] mtd: rawnand: Pass a nand_chip object nand_erase_nand()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the nand_erase_nand() helper.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/nand_base.c | 10 +-
 drivers/mtd/nand/raw/nand_bbt.c  |  2 +-
 include/linux/mtd/rawnand.h  |  2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 074de0c8c9dc..ef4d90ed896d 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -505,7 +505,7 @@ static int nand_block_markbad_lowlevel(struct mtd_info 
*mtd, loff_t ofs)
memset(, 0, sizeof(einfo));
einfo.addr = ofs;
einfo.len = 1ULL << chip->phys_erase_shift;
-   nand_erase_nand(mtd, , 0);
+   nand_erase_nand(chip, , 0);
 
/* Write bad block marker to OOB */
nand_get_device(mtd, FL_WRITING);
@@ -4638,22 +4638,22 @@ static int single_erase(struct nand_chip *chip, int 
page)
  */
 static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
 {
-   return nand_erase_nand(mtd, instr, 0);
+   return nand_erase_nand(mtd_to_nand(mtd), instr, 0);
 }
 
 /**
  * nand_erase_nand - [INTERN] erase block(s)
- * @mtd: MTD device structure
+ * @chip: NAND chip object
  * @instr: erase instruction
  * @allowbbt: allow erasing the bbt area
  *
  * Erase one ore more blocks.
  */
-int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
+int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
int allowbbt)
 {
+   struct mtd_info *mtd = nand_to_mtd(chip);
int page, status, pages_per_block, ret, chipnr;
-   struct nand_chip *chip = mtd_to_nand(mtd);
loff_t len;
 
pr_debug("%s: start = 0x%012llx, len = %llu\n",
diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c
index 7424be0547f8..9d73e086c5de 100644
--- a/drivers/mtd/nand/raw/nand_bbt.c
+++ b/drivers/mtd/nand/raw/nand_bbt.c
@@ -853,7 +853,7 @@ static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
memset(, 0, sizeof(einfo));
einfo.addr = to;
einfo.len = 1 << this->bbt_erase_shift;
-   res = nand_erase_nand(mtd, , 1);
+   res = nand_erase_nand(this, , 1);
if (res < 0) {
pr_warn("nand_bbt: error while erasing BBT block %d\n",
res);
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index e0d98ca7cb45..e6360e1156e7 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1548,7 +1548,7 @@ int nand_create_bbt(struct nand_chip *chip);
 int nand_markbad_bbt(struct nand_chip *chip, loff_t offs);
 int nand_isreserved_bbt(struct nand_chip *chip, loff_t offs);
 int nand_isbad_bbt(struct nand_chip *chip, loff_t offs, int allowbbt);
-int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
+int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
int allowbbt);
 
 /**
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 22/23] mtd: rawnand: Pass a nand_chip object to all nand_xxx_bbt() helpers

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the nand_xxx_bbt() helpers.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/nand_base.c |  6 +++---
 drivers/mtd/nand/raw/nand_bbt.c  | 16 +++-
 include/linux/mtd/rawnand.h  |  6 +++---
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 0a89ab663728..074de0c8c9dc 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -515,7 +515,7 @@ static int nand_block_markbad_lowlevel(struct mtd_info 
*mtd, loff_t ofs)
 
/* Mark block bad in BBT */
if (chip->bbt) {
-   res = nand_markbad_bbt(mtd, ofs);
+   res = nand_markbad_bbt(chip, ofs);
if (!ret)
ret = res;
}
@@ -565,7 +565,7 @@ static int nand_block_isreserved(struct mtd_info *mtd, 
loff_t ofs)
if (!chip->bbt)
return 0;
/* Return info from the table */
-   return nand_isreserved_bbt(mtd, ofs);
+   return nand_isreserved_bbt(chip, ofs);
 }
 
 /**
@@ -585,7 +585,7 @@ static int nand_block_checkbad(struct mtd_info *mtd, loff_t 
ofs, int allowbbt)
return chip->block_bad(chip, ofs);
 
/* Return info from the table */
-   return nand_isbad_bbt(mtd, ofs, allowbbt);
+   return nand_isbad_bbt(chip, ofs, allowbbt);
 }
 
 /**
diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c
index 76849a441518..7424be0547f8 100644
--- a/drivers/mtd/nand/raw/nand_bbt.c
+++ b/drivers/mtd/nand/raw/nand_bbt.c
@@ -1387,12 +1387,11 @@ EXPORT_SYMBOL(nand_create_bbt);
 
 /**
  * nand_isreserved_bbt - [NAND Interface] Check if a block is reserved
- * @mtd: MTD device structure
+ * @this: NAND chip object
  * @offs: offset in the device
  */
-int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs)
+int nand_isreserved_bbt(struct nand_chip *this, loff_t offs)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
int block;
 
block = (int)(offs >> this->bbt_erase_shift);
@@ -1401,13 +1400,12 @@ int nand_isreserved_bbt(struct mtd_info *mtd, loff_t 
offs)
 
 /**
  * nand_isbad_bbt - [NAND Interface] Check if a block is bad
- * @mtd: MTD device structure
+ * @this: NAND chip object
  * @offs: offset in the device
  * @allowbbt: allow access to bad block table region
  */
-int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
+int nand_isbad_bbt(struct nand_chip *this, loff_t offs, int allowbbt)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
int block, res;
 
block = (int)(offs >> this->bbt_erase_shift);
@@ -1429,12 +1427,12 @@ int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, 
int allowbbt)
 
 /**
  * nand_markbad_bbt - [NAND Interface] Mark a block bad in the BBT
- * @mtd: MTD device structure
+ * @this: NAND chip object
  * @offs: offset of the bad block
  */
-int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
+int nand_markbad_bbt(struct nand_chip *this, loff_t offs)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(this);
int block, ret = 0;
 
block = (int)(offs >> this->bbt_erase_shift);
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index 5bfb9d543a8a..e0d98ca7cb45 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1545,9 +1545,9 @@ extern const struct nand_manufacturer_ops 
amd_nand_manuf_ops;
 extern const struct nand_manufacturer_ops macronix_nand_manuf_ops;
 
 int nand_create_bbt(struct nand_chip *chip);
-int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs);
-int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs);
-int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt);
+int nand_markbad_bbt(struct nand_chip *chip, loff_t offs);
+int nand_isreserved_bbt(struct nand_chip *chip, loff_t offs);
+int nand_isbad_bbt(struct nand_chip *chip, loff_t offs, int allowbbt);
 int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
int allowbbt);
 
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 13/23] mtd: rawnand: Pass a nand_chip object to chip->block_xxx() hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle all chip->block_xxx() hooks at once.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/cafe_nand.c   |  2 +-
 drivers/mtd/nand/raw/diskonchip.c  |  2 +-
 drivers/mtd/nand/raw/docg4.c   |  6 +++---
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c |  6 +++---
 drivers/mtd/nand/raw/nand_base.c   | 16 
 drivers/mtd/nand/raw/nand_bbt.c|  3 +--
 drivers/mtd/nand/raw/qcom_nandc.c  |  7 +++
 drivers/mtd/nand/raw/sm_common.c   |  3 ++-
 include/linux/mtd/rawnand.h|  4 ++--
 9 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index e70a47aad538..af6870269f9c 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -546,7 +546,7 @@ static int cafe_nand_write_page_lowlevel(struct nand_chip 
*chip,
return nand_prog_page_end_op(chip);
 }
 
-static int cafe_nand_block_bad(struct mtd_info *mtd, loff_t ofs)
+static int cafe_nand_block_bad(struct nand_chip *chip, loff_t ofs)
 {
return 0;
 }
diff --git a/drivers/mtd/nand/raw/diskonchip.c 
b/drivers/mtd/nand/raw/diskonchip.c
index 4d7b00d066fe..9cbcf020cabe 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -777,7 +777,7 @@ static int doc200x_dev_ready(struct mtd_info *mtd)
}
 }
 
-static int doc200x_block_bad(struct mtd_info *mtd, loff_t ofs)
+static int doc200x_block_bad(struct nand_chip *this, loff_t ofs)
 {
/* This is our last resort if we couldn't find or create a BBT.  Just
   pretend all blocks are good. */
diff --git a/drivers/mtd/nand/raw/docg4.c b/drivers/mtd/nand/raw/docg4.c
index 78c1d6fd42b2..9e6255408d49 100644
--- a/drivers/mtd/nand/raw/docg4.c
+++ b/drivers/mtd/nand/raw/docg4.c
@@ -1102,7 +1102,7 @@ static int __init read_factory_bbt(struct mtd_info *mtd)
return 0;
 }
 
-static int docg4_block_markbad(struct mtd_info *mtd, loff_t ofs)
+static int docg4_block_markbad(struct nand_chip *nand, loff_t ofs)
 {
/*
 * Mark a block as bad.  Bad blocks are marked in the oob area of the
@@ -1115,7 +1115,7 @@ static int docg4_block_markbad(struct mtd_info *mtd, 
loff_t ofs)
 
int ret, i;
uint8_t *buf;
-   struct nand_chip *nand = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(nand);
struct docg4_priv *doc = nand_get_controller_data(nand);
struct nand_bbt_descr *bbtd = nand->badblock_pattern;
int page = (int)(ofs >> nand->page_shift);
@@ -1147,7 +1147,7 @@ static int docg4_block_markbad(struct mtd_info *mtd, 
loff_t ofs)
return ret;
 }
 
-static int docg4_block_neverbad(struct mtd_info *mtd, loff_t ofs)
+static int docg4_block_neverbad(struct nand_chip *nand, loff_t ofs)
 {
/* only called when module_param ignore_badblocks is set */
return 0;
diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c 
b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
index f5f1aebf0d64..2dce9b62ebe7 100644
--- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
+++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
@@ -1542,9 +1542,9 @@ static int gpmi_ecc_write_oob_raw(struct nand_chip *chip, 
int page)
return gpmi_ecc_write_page_raw(chip, NULL, 1, page);
 }
 
-static int gpmi_block_markbad(struct mtd_info *mtd, loff_t ofs)
+static int gpmi_block_markbad(struct nand_chip *chip, loff_t ofs)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(chip);
struct gpmi_nand_data *this = nand_get_controller_data(chip);
int ret = 0;
uint8_t *block_mark;
@@ -1776,7 +1776,7 @@ static int mx23_boot_init(struct gpmi_nand_data  *this)
 */
if (block_mark != 0xff) {
dev_dbg(dev, "Transcribing mark in block %u\n", block);
-   ret = chip->block_markbad(mtd, byte);
+   ret = chip->block_markbad(chip, byte);
if (ret)
dev_err(dev,
"Failed to mark block bad with ret 
%d\n",
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 3d3e3c704a5a..add85235497e 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -398,15 +398,15 @@ static void nand_read_buf16(struct nand_chip *chip, 
uint8_t *buf, int len)
 
 /**
  * nand_block_bad - [DEFAULT] Read bad block marker from the chip
- * @mtd: MTD device structure
+ * @chip: NAND chip object
  * @ofs: offset from device start
  *
  * Check, if the block is bad.
  */
-static int nand_block_bad(struct mtd_info *mtd, loff_t ofs)
+static int nand_block_bad(struct nand_chip *chip, loff_t 

[PATCH v2 18/23] mtd: rawnand: Pass a nand_chip object to chip->erase()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->erase() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/denali.c| 4 ++--
 drivers/mtd/nand/raw/docg4.c | 4 ++--
 drivers/mtd/nand/raw/nand_base.c | 7 +++
 include/linux/mtd/rawnand.h  | 2 +-
 4 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c
index 0c3fff9d65af..bb4ad3b822ad 100644
--- a/drivers/mtd/nand/raw/denali.c
+++ b/drivers/mtd/nand/raw/denali.c
@@ -915,9 +915,9 @@ static int denali_waitfunc(struct nand_chip *chip)
return irq_status & INTR__INT_ACT ? 0 : NAND_STATUS_FAIL;
 }
 
-static int denali_erase(struct mtd_info *mtd, int page)
+static int denali_erase(struct nand_chip *chip, int page)
 {
-   struct denali_nand_info *denali = mtd_to_denali(mtd);
+   struct denali_nand_info *denali = mtd_to_denali(nand_to_mtd(chip));
uint32_t irq_status;
 
denali_reset_irq(denali);
diff --git a/drivers/mtd/nand/raw/docg4.c b/drivers/mtd/nand/raw/docg4.c
index ae20172f1b60..49500cae3d2f 100644
--- a/drivers/mtd/nand/raw/docg4.c
+++ b/drivers/mtd/nand/raw/docg4.c
@@ -892,9 +892,9 @@ static int docg4_read_oob(struct nand_chip *nand, int page)
return 0;
 }
 
-static int docg4_erase_block(struct mtd_info *mtd, int page)
+static int docg4_erase_block(struct nand_chip *nand, int page)
 {
-   struct nand_chip *nand = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(nand);
struct docg4_priv *doc = nand_get_controller_data(nand);
void __iomem *docptr = doc->virtadr;
uint16_t g4_page;
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 9be0f98c1244..26be436eb8f1 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -4623,14 +4623,13 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t 
to,
 
 /**
  * single_erase - [GENERIC] NAND standard block erase command function
- * @mtd: MTD device structure
+ * @chip: NAND chip object
  * @page: the page address of the block which will be erased
  *
  * Standard erase command for NAND chips. Returns NAND status.
  */
-static int single_erase(struct mtd_info *mtd, int page)
+static int single_erase(struct nand_chip *chip, int page)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
unsigned int eraseblock;
 
/* Send commands to erase a block */
@@ -4715,7 +4714,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct 
erase_info *instr,
(page + pages_per_block))
chip->pagebuf = -1;
 
-   status = chip->erase(mtd, page & chip->pagemask);
+   status = chip->erase(chip, page & chip->pagemask);
 
/* See if block erase succeeded */
if (status) {
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index c00e571d09ca..8c8315d977de 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -1298,7 +1298,7 @@ struct nand_chip {
int (*exec_op)(struct nand_chip *chip,
   const struct nand_operation *op,
   bool check_only);
-   int (*erase)(struct mtd_info *mtd, int page);
+   int (*erase)(struct nand_chip *chip, int page);
int (*set_features)(struct mtd_info *mtd, struct nand_chip *chip,
int feature_addr, uint8_t *subfeature_para);
int (*get_features)(struct mtd_info *mtd, struct nand_chip *chip,
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 12/23] mtd: rawnand: Pass a nand_chip object to chip->select_chip()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->select_chip() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/atmel/nand-controller.c |  9 ++-
 drivers/mtd/nand/raw/au1550nd.c  |  4 +-
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  4 +-
 drivers/mtd/nand/raw/cafe_nand.c |  3 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  4 +-
 drivers/mtd/nand/raw/denali.c|  6 +-
 drivers/mtd/nand/raw/diskonchip.c| 11 ++-
 drivers/mtd/nand/raw/docg4.c |  3 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  2 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  2 +-
 drivers/mtd/nand/raw/fsl_upm.c   |  4 +-
 drivers/mtd/nand/raw/fsmc_nand.c |  4 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   | 20 +++---
 drivers/mtd/nand/raw/hisi504_nand.c  |  3 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  9 ++-
 drivers/mtd/nand/raw/jz4780_nand.c   |  4 +-
 drivers/mtd/nand/raw/marvell_nand.c  |  3 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   | 12 ++--
 drivers/mtd/nand/raw/mtk_nand.c  |  5 +-
 drivers/mtd/nand/raw/mxc_nand.c  |  8 +--
 drivers/mtd/nand/raw/nand_base.c | 86 
 drivers/mtd/nand/raw/ndfc.c  |  3 +-
 drivers/mtd/nand/raw/plat_nand.c | 11 +--
 drivers/mtd/nand/raw/qcom_nandc.c|  3 +-
 drivers/mtd/nand/raw/r852.c  |  5 +-
 drivers/mtd/nand/raw/s3c2410.c   |  5 +-
 drivers/mtd/nand/raw/sh_flctl.c  |  4 +-
 drivers/mtd/nand/raw/sunxi_nand.c|  4 +-
 drivers/mtd/nand/raw/tango_nand.c|  3 +-
 drivers/mtd/nand/raw/tegra_nand.c|  3 +-
 drivers/mtd/nand/raw/vf610_nfc.c |  8 +--
 drivers/mtd/nand/raw/xway_nand.c |  3 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  2 +-
 include/linux/mtd/rawnand.h  |  2 +-
 34 files changed, 117 insertions(+), 145 deletions(-)

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 84ddede5ede4..5c8ef476ed47 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -483,9 +483,8 @@ static int atmel_nand_dev_ready(struct mtd_info *mtd)
return gpiod_get_value(nand->activecs->rb.gpio);
 }
 
-static void atmel_nand_select_chip(struct mtd_info *mtd, int cs)
+static void atmel_nand_select_chip(struct nand_chip *chip, int cs)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
 
if (cs < 0 || cs >= nand->numcs) {
@@ -514,15 +513,15 @@ static int atmel_hsmc_nand_dev_ready(struct mtd_info *mtd)
return status & ATMEL_HSMC_NFC_SR_RBEDGE(nand->activecs->rb.id);
 }
 
-static void atmel_hsmc_nand_select_chip(struct mtd_info *mtd, int cs)
+static void atmel_hsmc_nand_select_chip(struct nand_chip *chip, int cs)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(chip);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_hsmc_nand_controller *nc;
 
nc = to_hsmc_nand_controller(chip->controller);
 
-   atmel_nand_select_chip(mtd, cs);
+   atmel_nand_select_chip(chip, cs);
 
if (!nand->activecs) {
regmap_write(nc->base.smc, ATMEL_HSMC_NFC_CTRL,
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index f1cc9f672262..1bae3b2779aa 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -227,10 +227,10 @@ int au1550_device_ready(struct mtd_info *mtd)
  * chip needs it to be asserted during chip not ready time but the NAND
  * controller keeps it released.
  *
- * @mtd:   MTD device structure
+ * @this:  NAND chip object
  * @chip:  chipnumber to select, -1 for deselect
  */
-static void au1550_select_chip(struct mtd_info *mtd, int chip)
+static void au1550_select_chip(struct nand_chip *this, int chip)
 {
 }
 
diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
index 83eec2812aa0..c8e30b0308bc 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
@@ -191,8 +191,8 @@ static void bcm47xxnflash_ops_bcm4706_cmd_ctrl(struct 
mtd_info *mtd, int cmd,
 }
 
 /* Default nand_select_chip calls cmd_ctrl, which is not used in BCM4706 */
-static void bcm47xxnflash_ops_bcm4706_select_chip(struct mtd_info *mtd,
- int chip)
+static void 

[PATCH v2 06/23] mtd: rawnand: Pass a nand_chip object to ecc->calculate()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one.

Now is ecc->calculate()'s turn.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/cs553x_nand.c  |  4 ++--
 drivers/mtd/nand/raw/davinci_nand.c | 12 ++--
 drivers/mtd/nand/raw/diskonchip.c   |  4 ++--
 drivers/mtd/nand/raw/fsmc_nand.c| 10 +-
 drivers/mtd/nand/raw/jz4740_nand.c  |  6 +++---
 drivers/mtd/nand/raw/jz4780_nand.c  |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_slc.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c| 16 
 drivers/mtd/nand/raw/nand_bch.c |  5 ++---
 drivers/mtd/nand/raw/nand_ecc.c |  5 ++---
 drivers/mtd/nand/raw/ndfc.c |  3 +--
 drivers/mtd/nand/raw/omap2.c| 14 +++---
 drivers/mtd/nand/raw/r852.c |  6 +++---
 drivers/mtd/nand/raw/s3c2410.c  | 15 +--
 drivers/mtd/nand/raw/sharpsl.c  |  5 +++--
 drivers/mtd/nand/raw/tmio_nand.c|  6 +++---
 drivers/mtd/nand/raw/txx9ndfmc.c|  5 ++---
 include/linux/mtd/nand_bch.h|  5 +++--
 include/linux/mtd/nand_ecc.h|  4 +++-
 include/linux/mtd/rawnand.h |  4 ++--
 20 files changed, 69 insertions(+), 66 deletions(-)

diff --git a/drivers/mtd/nand/raw/cs553x_nand.c 
b/drivers/mtd/nand/raw/cs553x_nand.c
index 508bcb3d134f..193c3e8fa118 100644
--- a/drivers/mtd/nand/raw/cs553x_nand.c
+++ b/drivers/mtd/nand/raw/cs553x_nand.c
@@ -164,10 +164,10 @@ static void cs_enable_hwecc(struct nand_chip *this, int 
mode)
writeb(0x07, mmio_base + MM_NAND_ECC_CTL);
 }
 
-static int cs_calculate_ecc(struct mtd_info *mtd, const u_char *dat, u_char 
*ecc_code)
+static int cs_calculate_ecc(struct nand_chip *this, const u_char *dat,
+   u_char *ecc_code)
 {
uint32_t ecc;
-   struct nand_chip *this = mtd_to_nand(mtd);
void __iomem *mmio_base = this->IO_ADDR_R;
 
ecc = readl(mmio_base + MM_NAND_STS);
diff --git a/drivers/mtd/nand/raw/davinci_nand.c 
b/drivers/mtd/nand/raw/davinci_nand.c
index 329de266c953..af221e1c8a87 100644
--- a/drivers/mtd/nand/raw/davinci_nand.c
+++ b/drivers/mtd/nand/raw/davinci_nand.c
@@ -170,10 +170,10 @@ static void nand_davinci_hwctl_1bit(struct nand_chip 
*chip, int mode)
 /*
  * Read hardware ECC value and pack into three bytes
  */
-static int nand_davinci_calculate_1bit(struct mtd_info *mtd,
- const u_char *dat, u_char *ecc_code)
+static int nand_davinci_calculate_1bit(struct nand_chip *chip,
+  const u_char *dat, u_char *ecc_code)
 {
-   unsigned int ecc_val = nand_davinci_readecc_1bit(mtd);
+   unsigned int ecc_val = nand_davinci_readecc_1bit(nand_to_mtd(chip));
unsigned int ecc24 = (ecc_val & 0x0fff) | ((ecc_val & 0x0fff) >> 4);
 
/* invert so that erased block ecc is correct */
@@ -266,10 +266,10 @@ nand_davinci_readecc_4bit(struct davinci_nand_info *info, 
u32 code[4])
 }
 
 /* Terminate read ECC; or return ECC (as bytes) of data written to NAND. */
-static int nand_davinci_calculate_4bit(struct mtd_info *mtd,
-   const u_char *dat, u_char *ecc_code)
+static int nand_davinci_calculate_4bit(struct nand_chip *chip,
+  const u_char *dat, u_char *ecc_code)
 {
-   struct davinci_nand_info *info = to_davinci_nand(mtd);
+   struct davinci_nand_info *info = to_davinci_nand(nand_to_mtd(chip));
u32 raw_ecc[4], *p;
unsigned i;
 
diff --git a/drivers/mtd/nand/raw/diskonchip.c 
b/drivers/mtd/nand/raw/diskonchip.c
index d007f0704654..942a5ee83fbd 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -834,9 +834,9 @@ static void doc2001plus_enable_hwecc(struct nand_chip 
*this, int mode)
 }
 
 /* This code is only called on write */
-static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, 
unsigned char *ecc_code)
+static int doc200x_calculate_ecc(struct nand_chip *this, const u_char *dat,
+unsigned char *ecc_code)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
struct doc_priv *doc = nand_get_controller_data(this);
void __iomem *docptr = doc->virtadr;
int i;
diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index 0291a43d9f6e..d4e91465042c 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -385,10 +385,10 @@ static void fsmc_enable_hwecc(struct nand_chip *chip, int 
mode)
  * FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to
  * max of 8-bits)
  */
-static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data,
+static int fsmc_read_hwecc_ecc4(struct nand_chip *chip, const uint8_t *data,
uint8_t *ecc)
 {
-   struct fsmc_nand_data *host = mtd_to_fsmc(mtd);
+   struct fsmc_nand_data *host = 

[PATCH v2 07/23] mtd: rawnand: Pass a nand_chip object to ecc->correct()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one.

Now is ecc->correct()'s turn.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/davinci_nand.c |  9 -
 drivers/mtd/nand/raw/diskonchip.c   |  3 +--
 drivers/mtd/nand/raw/fsmc_nand.c|  9 -
 drivers/mtd/nand/raw/jz4740_nand.c  |  6 +++---
 drivers/mtd/nand/raw/jz4780_nand.c  |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_slc.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c| 10 +-
 drivers/mtd/nand/raw/nand_bch.c |  5 ++---
 drivers/mtd/nand/raw/nand_ecc.c |  7 +++
 drivers/mtd/nand/raw/omap2.c| 18 +-
 drivers/mtd/nand/raw/r852.c |  6 +++---
 drivers/mtd/nand/raw/s3c2410.c  |  3 ++-
 drivers/mtd/nand/raw/tmio_nand.c|  5 +++--
 drivers/mtd/nand/raw/txx9ndfmc.c|  6 +++---
 include/linux/mtd/nand_bch.h|  6 +++---
 include/linux/mtd/nand_ecc.h|  4 ++--
 include/linux/mtd/rawnand.h |  4 ++--
 17 files changed, 52 insertions(+), 55 deletions(-)

diff --git a/drivers/mtd/nand/raw/davinci_nand.c 
b/drivers/mtd/nand/raw/davinci_nand.c
index af221e1c8a87..c80b6c6da4aa 100644
--- a/drivers/mtd/nand/raw/davinci_nand.c
+++ b/drivers/mtd/nand/raw/davinci_nand.c
@@ -185,10 +185,9 @@ static int nand_davinci_calculate_1bit(struct nand_chip 
*chip,
return 0;
 }
 
-static int nand_davinci_correct_1bit(struct mtd_info *mtd, u_char *dat,
+static int nand_davinci_correct_1bit(struct nand_chip *chip, u_char *dat,
 u_char *read_ecc, u_char *calc_ecc)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
uint32_t eccNand = read_ecc[0] | (read_ecc[1] << 8) |
  (read_ecc[2] << 16);
uint32_t eccCalc = calc_ecc[0] | (calc_ecc[1] << 8) |
@@ -303,11 +302,11 @@ static int nand_davinci_calculate_4bit(struct nand_chip 
*chip,
 /* Correct up to 4 bits in data we just read, using state left in the
  * hardware plus the ecc_code computed when it was first written.
  */
-static int nand_davinci_correct_4bit(struct mtd_info *mtd,
-   u_char *data, u_char *ecc_code, u_char *null)
+static int nand_davinci_correct_4bit(struct nand_chip *chip, u_char *data,
+u_char *ecc_code, u_char *null)
 {
int i;
-   struct davinci_nand_info *info = to_davinci_nand(mtd);
+   struct davinci_nand_info *info = to_davinci_nand(nand_to_mtd(chip));
unsigned short ecc10[8];
unsigned short *ecc16;
u32 syndrome[4];
diff --git a/drivers/mtd/nand/raw/diskonchip.c 
b/drivers/mtd/nand/raw/diskonchip.c
index 942a5ee83fbd..142d21be874e 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -893,11 +893,10 @@ static int doc200x_calculate_ecc(struct nand_chip *this, 
const u_char *dat,
return 0;
 }
 
-static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat,
+static int doc200x_correct_data(struct nand_chip *this, u_char *dat,
u_char *read_ecc, u_char *isnull)
 {
int i, ret = 0;
-   struct nand_chip *this = mtd_to_nand(mtd);
struct doc_priv *doc = nand_get_controller_data(this);
void __iomem *docptr = doc->virtadr;
uint8_t calc_ecc[6];
diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index d4e91465042c..b41fd09fa389 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -769,7 +769,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, 
struct nand_chip *chip,
memcpy(_code[i], oob, chip->ecc.bytes);
chip->ecc.calculate(chip, p, _calc[i]);
 
-   stat = chip->ecc.correct(mtd, p, _code[i], _calc[i]);
+   stat = chip->ecc.correct(chip, p, _code[i], _calc[i]);
if (stat < 0) {
mtd->ecc_stats.failed++;
} else {
@@ -791,11 +791,10 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, 
struct nand_chip *chip,
  * calc_ecc is a 104 bit information containing maximum of 8 error
  * offset informations of 13 bits each in 512 bytes of read data.
  */
-static int fsmc_bch8_correct_data(struct mtd_info *mtd, uint8_t *dat,
-uint8_t *read_ecc, uint8_t *calc_ecc)
+static int fsmc_bch8_correct_data(struct nand_chip *chip, uint8_t *dat,
+ uint8_t *read_ecc, uint8_t *calc_ecc)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
-   struct fsmc_nand_data *host = mtd_to_fsmc(mtd);
+   struct fsmc_nand_data *host = mtd_to_fsmc(nand_to_mtd(chip));
uint32_t err_idx[8];
uint32_t num_err, i;
uint32_t ecc1, ecc2, ecc3, ecc4;
diff --git a/drivers/mtd/nand/raw/jz4740_nand.c 
b/drivers/mtd/nand/raw/jz4740_nand.c
index 98ea5172ac74..e926ed6ed296 100644
--- a/drivers/mtd/nand/raw/jz4740_nand.c
+++ 

[PATCH v2 14/23] mtd: rawnand: Pass a nand_chip object to chip->cmd_ctrl()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->cmd_ctrl() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |  4 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |  6 +--
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  7 ++--
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  4 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |  3 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  3 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  5 +--
 drivers/mtd/nand/raw/denali.c|  4 +-
 drivers/mtd/nand/raw/diskonchip.c| 22 +--
 drivers/mtd/nand/raw/fsl_upm.c   | 10 ++---
 drivers/mtd/nand/raw/gpio.c  |  5 ++-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  3 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  6 +--
 drivers/mtd/nand/raw/jz4780_nand.c   |  4 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  3 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  5 +--
 drivers/mtd/nand/raw/mtk_nand.c  |  5 ++-
 drivers/mtd/nand/raw/nand_base.c | 47 
 drivers/mtd/nand/raw/nandsim.c   |  3 +-
 drivers/mtd/nand/raw/ndfc.c  |  3 +-
 drivers/mtd/nand/raw/omap2.c |  6 +--
 drivers/mtd/nand/raw/orion_nand.c|  4 +-
 drivers/mtd/nand/raw/oxnas_nand.c|  3 +-
 drivers/mtd/nand/raw/pasemi_nand.c   |  4 +-
 drivers/mtd/nand/raw/plat_nand.c | 11 +-
 drivers/mtd/nand/raw/r852.c  |  4 +-
 drivers/mtd/nand/raw/s3c2410.c   |  6 ++-
 drivers/mtd/nand/raw/sharpsl.c   |  5 +--
 drivers/mtd/nand/raw/socrates_nand.c |  5 +--
 drivers/mtd/nand/raw/sunxi_nand.c|  3 +-
 drivers/mtd/nand/raw/tango_nand.c|  4 +-
 drivers/mtd/nand/raw/tmio_nand.c |  7 ++--
 drivers/mtd/nand/raw/txx9ndfmc.c |  3 +-
 drivers/mtd/nand/raw/xway_nand.c |  4 +-
 include/linux/mtd/rawnand.h  |  2 +-
 35 files changed, 98 insertions(+), 125 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index d742b929..8121d26194cf 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -113,7 +113,7 @@ static void ams_delta_read_buf(struct nand_chip *this, 
u_char *buf, int len)
  * NAND_CLE: bit 1 -> bit 7
  * NAND_ALE: bit 2 -> bit 6
  */
-static void ams_delta_hwcontrol(struct mtd_info *mtd, int cmd,
+static void ams_delta_hwcontrol(struct nand_chip *this, int cmd,
unsigned int ctrl)
 {
 
@@ -127,7 +127,7 @@ static void ams_delta_hwcontrol(struct mtd_info *mtd, int 
cmd,
}
 
if (cmd != NAND_CMD_NONE)
-   ams_delta_write_byte(mtd_to_nand(mtd), cmd);
+   ams_delta_write_byte(this, cmd);
 }
 
 static int ams_delta_nand_ready(struct mtd_info *mtd)
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 5c8ef476ed47..f088bff06723 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -594,10 +594,9 @@ static int atmel_nfc_exec_op(struct 
atmel_hsmc_nand_controller *nc, bool poll)
return ret;
 }
 
-static void atmel_hsmc_nand_cmd_ctrl(struct mtd_info *mtd, int dat,
+static void atmel_hsmc_nand_cmd_ctrl(struct nand_chip *chip, int dat,
 unsigned int ctrl)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_hsmc_nand_controller *nc;
 
@@ -621,10 +620,9 @@ static void atmel_hsmc_nand_cmd_ctrl(struct mtd_info *mtd, 
int dat,
}
 }
 
-static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+static void atmel_nand_cmd_ctrl(struct nand_chip *chip, int cmd,
unsigned int ctrl)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_nand_controller *nc;
 
diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
index c8e30b0308bc..d326f9d3648b 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
@@ -170,10 +170,9 @@ static void bcm47xxnflash_ops_bcm4706_write(struct 
mtd_info *mtd,
  * NAND chip ops
  **/
 
-static void bcm47xxnflash_ops_bcm4706_cmd_ctrl(struct mtd_info *mtd, int cmd,
-  unsigned int ctrl)
+static void 

[PATCH v2 08/23] mtd: rawnand: Pass a nand_chip object to ecc->read_xxx() hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle all ecc->read_xxx() hooks at once.

Signed-off-by: Boris Brezillon 
Acked-by: Stefan Agner 
---
Changes in v2:
- Add Stefan A-b
- Patched the Toshiba driver
---
 drivers/mtd/nand/raw/atmel/nand-controller.c  | 12 ++---
 drivers/mtd/nand/raw/brcmnand/brcmnand.c  | 21 
 drivers/mtd/nand/raw/cafe_nand.c  | 10 ++--
 drivers/mtd/nand/raw/denali.c | 17 +++---
 drivers/mtd/nand/raw/docg4.c  | 20 
 drivers/mtd/nand/raw/fsl_elbc_nand.c  |  5 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c   |  5 +-
 drivers/mtd/nand/raw/fsmc_nand.c  |  6 +--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c| 23 -
 drivers/mtd/nand/raw/hisi504_nand.c   |  9 ++--
 drivers/mtd/nand/raw/lpc32xx_mlc.c| 10 ++--
 drivers/mtd/nand/raw/lpc32xx_slc.c| 14 ++---
 drivers/mtd/nand/raw/marvell_nand.c   | 30 +--
 drivers/mtd/nand/raw/mtk_nand.c   | 23 +
 drivers/mtd/nand/raw/mxc_nand.c   | 11 ++--
 drivers/mtd/nand/raw/nand_base.c  | 74 +--
 drivers/mtd/nand/raw/nand_micron.c|  6 +--
 drivers/mtd/nand/raw/nand_toshiba.c   | 10 ++--
 drivers/mtd/nand/raw/omap2.c  |  6 +--
 drivers/mtd/nand/raw/qcom_nandc.c | 11 ++--
 drivers/mtd/nand/raw/r852.c   |  5 +-
 drivers/mtd/nand/raw/sh_flctl.c   |  6 ++-
 drivers/mtd/nand/raw/sunxi_nand.c | 26 +-
 drivers/mtd/nand/raw/tango_nand.c | 16 +++---
 drivers/mtd/nand/raw/tegra_nand.c | 15 +++---
 drivers/mtd/nand/raw/vf610_nfc.c  | 18 +++
 drivers/staging/mt29f_spinand/mt29f_spinand.c |  5 +-
 include/linux/mtd/rawnand.h   | 30 +--
 28 files changed, 221 insertions(+), 223 deletions(-)

diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index cef22a79f3a6..45061b591346 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -895,15 +895,13 @@ static int atmel_nand_pmecc_read_pg(struct nand_chip 
*chip, u8 *buf,
return ret;
 }
 
-static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
- struct nand_chip *chip, u8 *buf,
+static int atmel_nand_pmecc_read_page(struct nand_chip *chip, u8 *buf,
  int oob_required, int page)
 {
return atmel_nand_pmecc_read_pg(chip, buf, oob_required, page, false);
 }
 
-static int atmel_nand_pmecc_read_page_raw(struct mtd_info *mtd,
- struct nand_chip *chip, u8 *buf,
+static int atmel_nand_pmecc_read_page_raw(struct nand_chip *chip, u8 *buf,
  int oob_required, int page)
 {
return atmel_nand_pmecc_read_pg(chip, buf, oob_required, page, true);
@@ -1037,16 +1035,14 @@ static int atmel_hsmc_nand_pmecc_read_pg(struct 
nand_chip *chip, u8 *buf,
return ret;
 }
 
-static int atmel_hsmc_nand_pmecc_read_page(struct mtd_info *mtd,
-  struct nand_chip *chip, u8 *buf,
+static int atmel_hsmc_nand_pmecc_read_page(struct nand_chip *chip, u8 *buf,
   int oob_required, int page)
 {
return atmel_hsmc_nand_pmecc_read_pg(chip, buf, oob_required, page,
 false);
 }
 
-static int atmel_hsmc_nand_pmecc_read_page_raw(struct mtd_info *mtd,
-  struct nand_chip *chip,
+static int atmel_hsmc_nand_pmecc_read_page_raw(struct nand_chip *chip,
   u8 *buf, int oob_required,
   int page)
 {
diff --git a/drivers/mtd/nand/raw/brcmnand/brcmnand.c 
b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
index 19e6e918f896..a17ae692aee9 100644
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
@@ -1689,7 +1689,7 @@ static int brcmstb_nand_verify_erased_page(struct 
mtd_info *mtd,
sas = mtd->oobsize / chip->ecc.steps;
 
/* read without ecc for verification */
-   ret = chip->ecc.read_page_raw(mtd, chip, buf, true, page);
+   ret = chip->ecc.read_page_raw(chip, buf, true, page);
if (ret)
return ret;
 
@@ -1786,9 +1786,10 @@ static int brcmnand_read(struct mtd_info *mtd, struct 
nand_chip *chip,
return 0;
 }
 
-static int brcmnand_read_page(struct mtd_info *mtd, struct nand_chip *chip,
- uint8_t *buf, int oob_required, int page)
+static int brcmnand_read_page(struct nand_chip *chip, uint8_t *buf,
+ 

[PATCH v2 15/23] mtd: rawnand: Pass a nand_chip object to chip->dev_ready()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle the chip->dev_ready() hook.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |  2 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |  6 ++
 drivers/mtd/nand/raw/au1550nd.c  |  6 +++---
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  3 +--
 drivers/mtd/nand/raw/cafe_nand.c |  3 +--
 drivers/mtd/nand/raw/cmx270_nand.c   |  2 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  3 +--
 drivers/mtd/nand/raw/davinci_nand.c  |  4 ++--
 drivers/mtd/nand/raw/denali.c|  4 ++--
 drivers/mtd/nand/raw/diskonchip.c|  5 ++---
 drivers/mtd/nand/raw/fsl_upm.c   |  6 +++---
 drivers/mtd/nand/raw/gpio.c  |  4 ++--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  3 +--
 drivers/mtd/nand/raw/jz4740_nand.c   |  4 ++--
 drivers/mtd/nand/raw/jz4780_nand.c   |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  3 +--
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  3 +--
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  2 +-
 drivers/mtd/nand/raw/mtk_nand.c  |  4 ++--
 drivers/mtd/nand/raw/mxc_nand.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 10 +-
 drivers/mtd/nand/raw/nandsim.c   |  2 +-
 drivers/mtd/nand/raw/ndfc.c  |  3 +--
 drivers/mtd/nand/raw/nuc900_nand.c   |  6 +++---
 drivers/mtd/nand/raw/omap2.c |  4 ++--
 drivers/mtd/nand/raw/pasemi_nand.c   |  2 +-
 drivers/mtd/nand/raw/plat_nand.c | 12 +---
 drivers/mtd/nand/raw/r852.c  |  6 +++---
 drivers/mtd/nand/raw/s3c2410.c   |  9 ++---
 drivers/mtd/nand/raw/sharpsl.c   |  4 ++--
 drivers/mtd/nand/raw/socrates_nand.c |  3 +--
 drivers/mtd/nand/raw/sunxi_nand.c|  3 +--
 drivers/mtd/nand/raw/tango_nand.c|  3 +--
 drivers/mtd/nand/raw/tmio_nand.c |  8 
 drivers/mtd/nand/raw/txx9ndfmc.c |  4 ++--
 drivers/mtd/nand/raw/xway_nand.c |  2 +-
 include/linux/mtd/rawnand.h  |  2 +-
 37 files changed, 68 insertions(+), 88 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 8121d26194cf..48413203dbc2 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -130,7 +130,7 @@ static void ams_delta_hwcontrol(struct nand_chip *this, int 
cmd,
ams_delta_write_byte(this, cmd);
 }
 
-static int ams_delta_nand_ready(struct mtd_info *mtd)
+static int ams_delta_nand_ready(struct nand_chip *this)
 {
return gpio_get_value(AMS_DELTA_GPIO_PIN_NAND_RB);
 }
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index f088bff06723..2dcd8aa0ce0b 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -475,9 +475,8 @@ static void atmel_nand_write_buf(struct nand_chip *chip, 
const u8 *buf, int len)
iowrite8_rep(nand->activecs->io.virt, buf, len);
 }
 
-static int atmel_nand_dev_ready(struct mtd_info *mtd)
+static int atmel_nand_dev_ready(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
 
return gpiod_get_value(nand->activecs->rb.gpio);
@@ -499,9 +498,8 @@ static void atmel_nand_select_chip(struct nand_chip *chip, 
int cs)
chip->dev_ready = atmel_nand_dev_ready;
 }
 
-static int atmel_hsmc_nand_dev_ready(struct mtd_info *mtd)
+static int atmel_hsmc_nand_dev_ready(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_hsmc_nand_controller *nc;
u32 status;
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 1bae3b2779aa..1f0fba8d87c6 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -213,7 +213,7 @@ static void au1550_hwcontrol(struct mtd_info *mtd, int cmd)
wmb(); /* Drain the writebuffer */
 }
 
-int au1550_device_ready(struct mtd_info *mtd)
+int au1550_device_ready(struct nand_chip *this)
 {
return (alchemy_rdsmem(AU1000_MEM_STSTAT) & 0x1) ? 1 : 0;
 }
@@ -341,7 +341,7 @@ static void au1550_command(struct mtd_info *mtd, unsigned 
command, int column, i
/* Apply a short delay always to ensure that we do wait tWB. */
ndelay(100);
/* Wait for a chip to become ready... */
-   for (i = 

[PATCH v2 02/23] mtd: rawnand: Pass a nand_chip object to nand_scan()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers to take
a nand_chip object instead of an mtd_info one.

We start with nand_scan().

Signed-off-by: Boris Brezillon 
---
Changes in v2:
- Fix commit message
---
 Documentation/driver-api/mtdnand.rst |  2 +-
 drivers/mtd/nand/raw/ams-delta.c |  2 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |  2 +-
 drivers/mtd/nand/raw/au1550nd.c  |  2 +-
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  2 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  2 +-
 drivers/mtd/nand/raw/cafe_nand.c |  2 +-
 drivers/mtd/nand/raw/cmx270_nand.c   |  2 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  2 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  2 +-
 drivers/mtd/nand/raw/denali.c|  2 +-
 drivers/mtd/nand/raw/diskonchip.c|  2 +-
 drivers/mtd/nand/raw/docg4.c |  2 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  2 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  2 +-
 drivers/mtd/nand/raw/fsl_upm.c   |  2 +-
 drivers/mtd/nand/raw/fsmc_nand.c |  2 +-
 drivers/mtd/nand/raw/gpio.c  |  2 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  2 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |  2 +-
 drivers/mtd/nand/raw/jz4740_nand.c   |  2 +-
 drivers/mtd/nand/raw/jz4780_nand.c   |  2 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c   |  2 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  2 +-
 drivers/mtd/nand/raw/marvell_nand.c  |  2 +-
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  2 +-
 drivers/mtd/nand/raw/mtk_nand.c  |  2 +-
 drivers/mtd/nand/raw/mxc_nand.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 21 ++---
 drivers/mtd/nand/raw/nandsim.c   |  2 +-
 drivers/mtd/nand/raw/ndfc.c  |  2 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  2 +-
 drivers/mtd/nand/raw/omap2.c |  2 +-
 drivers/mtd/nand/raw/orion_nand.c|  2 +-
 drivers/mtd/nand/raw/oxnas_nand.c|  2 +-
 drivers/mtd/nand/raw/pasemi_nand.c   |  2 +-
 drivers/mtd/nand/raw/plat_nand.c |  2 +-
 drivers/mtd/nand/raw/qcom_nandc.c|  2 +-
 drivers/mtd/nand/raw/s3c2410.c   |  2 +-
 drivers/mtd/nand/raw/sh_flctl.c  |  2 +-
 drivers/mtd/nand/raw/sharpsl.c   |  2 +-
 drivers/mtd/nand/raw/sm_common.c |  2 +-
 drivers/mtd/nand/raw/socrates_nand.c |  2 +-
 drivers/mtd/nand/raw/sunxi_nand.c|  2 +-
 drivers/mtd/nand/raw/tango_nand.c|  2 +-
 drivers/mtd/nand/raw/tegra_nand.c|  2 +-
 drivers/mtd/nand/raw/tmio_nand.c |  2 +-
 drivers/mtd/nand/raw/txx9ndfmc.c |  2 +-
 drivers/mtd/nand/raw/vf610_nfc.c |  2 +-
 drivers/mtd/nand/raw/xway_nand.c |  2 +-
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  2 +-
 include/linux/mtd/rawnand.h  |  7 ---
 52 files changed, 64 insertions(+), 64 deletions(-)

diff --git a/Documentation/driver-api/mtdnand.rst 
b/Documentation/driver-api/mtdnand.rst
index c55a6034c397..1ab6f35b6410 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -246,7 +246,7 @@ necessary information about the device.
 this->eccmode = NAND_ECC_SOFT;
 
 /* Scan to find existence of the device */
-if (nand_scan (board_mtd, 1)) {
+if (nand_scan (this, 1)) {
 err = -ENXIO;
 goto out_ior;
 }
diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 37a3cc21c7bc..24ba7296ec08 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -235,7 +235,7 @@ static int ams_delta_init(struct platform_device *pdev)
goto out_gpio;
 
/* Scan to find existence of the device */
-   err = nand_scan(ams_delta_mtd, 1);
+   err = nand_scan(this, 1);
if (err)
goto out_mtd;
 
diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c 
b/drivers/mtd/nand/raw/atmel/nand-controller.c
index 8b9e05ac24ee..cef22a79f3a6 100644
--- a/drivers/mtd/nand/raw/atmel/nand-controller.c
+++ b/drivers/mtd/nand/raw/atmel/nand-controller.c
@@ -1683,7 +1683,7 @@ atmel_nand_controller_add_nand(struct 
atmel_nand_controller *nc,
 
nc->caps->ops->nand_init(nc, nand);
 
-   ret = nand_scan(mtd, nand->numcs);
+   ret = nand_scan(chip, nand->numcs);
if (ret) {
dev_err(nc->dev, "NAND scan failed: %d\n", ret);
return ret;
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 

[PATCH v2 11/23] mtd: rawnand: Pass a nand_chip object to chip->write_xxx() hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

Let's tackle all chip->write_xxx() hooks at once.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/ams-delta.c |  9 +++---
 drivers/mtd/nand/raw/atmel/nand-controller.c | 12 +++
 drivers/mtd/nand/raw/au1550nd.c  | 34 +---
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  6 ++--
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  5 ++-
 drivers/mtd/nand/raw/cafe_nand.c |  5 ++-
 drivers/mtd/nand/raw/cmx270_nand.c   |  4 +--
 drivers/mtd/nand/raw/cs553x_nand.c   |  9 ++
 drivers/mtd/nand/raw/davinci_nand.c  |  6 ++--
 drivers/mtd/nand/raw/denali.c| 13 
 drivers/mtd/nand/raw/diskonchip.c| 20 +---
 drivers/mtd/nand/raw/docg4.c | 10 +++---
 drivers/mtd/nand/raw/fsl_elbc_nand.c | 10 +++---
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  6 ++--
 drivers/mtd/nand/raw/fsl_upm.c   |  4 +--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  3 +-
 drivers/mtd/nand/raw/hisi504_nand.c  |  5 ++-
 drivers/mtd/nand/raw/lpc32xx_slc.c   |  8 ++---
 drivers/mtd/nand/raw/mpc5121_nfc.c   |  6 ++--
 drivers/mtd/nand/raw/mtk_nand.c  |  8 ++---
 drivers/mtd/nand/raw/mxc_nand.c  |  8 ++---
 drivers/mtd/nand/raw/nand_base.c | 41 ++--
 drivers/mtd/nand/raw/nand_hynix.c|  2 +-
 drivers/mtd/nand/raw/nandsim.c   |  9 +++---
 drivers/mtd/nand/raw/ndfc.c  |  3 +-
 drivers/mtd/nand/raw/nuc900_nand.c   |  4 +--
 drivers/mtd/nand/raw/omap2.c | 36 -
 drivers/mtd/nand/raw/oxnas_nand.c|  4 +--
 drivers/mtd/nand/raw/pasemi_nand.c   |  5 ++-
 drivers/mtd/nand/raw/plat_nand.c | 12 +--
 drivers/mtd/nand/raw/qcom_nandc.c|  3 +-
 drivers/mtd/nand/raw/r852.c  |  4 +--
 drivers/mtd/nand/raw/s3c2410.c   |  6 ++--
 drivers/mtd/nand/raw/sh_flctl.c  |  6 ++--
 drivers/mtd/nand/raw/socrates_nand.c |  7 ++--
 drivers/mtd/nand/raw/sunxi_nand.c|  5 ++-
 drivers/mtd/nand/raw/tango_nand.c|  8 ++---
 drivers/mtd/nand/raw/tmio_nand.c |  4 +--
 drivers/mtd/nand/raw/txx9ndfmc.c |  4 +--
 drivers/mtd/nand/raw/xway_nand.c |  4 +--
 drivers/staging/mt29f_spinand/mt29f_spinand.c|  4 +--
 include/linux/mtd/rawnand.h  |  4 +--
 42 files changed, 163 insertions(+), 203 deletions(-)

diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index eb48c939c4ae..d742b929 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -63,9 +63,8 @@ static const struct mtd_partition partition_info[] = {
  .size =  3 * SZ_256K },
 };
 
-static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte)
+static void ams_delta_write_byte(struct nand_chip *this, u_char byte)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
void __iomem *io_base = (void __iomem *)nand_get_controller_data(this);
 
writew(0, io_base + OMAP_MPUIO_IO_CNTL);
@@ -89,13 +88,13 @@ static u_char ams_delta_read_byte(struct nand_chip *this)
return res;
 }
 
-static void ams_delta_write_buf(struct mtd_info *mtd, const u_char *buf,
+static void ams_delta_write_buf(struct nand_chip *this, const u_char *buf,
int len)
 {
int i;
 
for (i=0; iactivecs->io.virt);
 }
 
-static void atmel_nand_write_byte(struct mtd_info *mtd, u8 byte)
+static void atmel_nand_write_byte(struct nand_chip *chip, u8 byte)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
 
if (chip->options & NAND_BUSWIDTH_16)
@@ -452,9 +451,8 @@ static void atmel_nand_read_buf(struct nand_chip *chip, u8 
*buf, int len)
ioread8_rep(nand->activecs->io.virt, buf, len);
 }
 
-static void atmel_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
+static void atmel_nand_write_buf(struct nand_chip *chip, const u8 *buf, int 
len)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
struct atmel_nand *nand = to_atmel_nand(chip);
struct atmel_nand_controller *nc;
 
@@ -841,7 +839,7 @@ static int atmel_nand_pmecc_write_pg(struct nand_chip 
*chip, const u8 *buf,
if (ret)
return ret;
 
-   atmel_nand_write_buf(mtd, buf, mtd->writesize);
+   atmel_nand_write_buf(chip, buf, mtd->writesize);
 
ret = atmel_nand_pmecc_generate_eccbytes(chip, raw);

[PATCH v2 05/23] mtd: rawnand: Pass a nand_chip object to ecc->hwctl()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one.

Now is ecc->hwctl()'s turn.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/cs553x_nand.c  |  3 +--
 drivers/mtd/nand/raw/davinci_nand.c | 10 +-
 drivers/mtd/nand/raw/diskonchip.c   |  6 ++
 drivers/mtd/nand/raw/fsmc_nand.c|  6 +++---
 drivers/mtd/nand/raw/jz4740_nand.c  |  4 ++--
 drivers/mtd/nand/raw/jz4780_nand.c  |  4 ++--
 drivers/mtd/nand/raw/lpc32xx_mlc.c  |  2 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c  |  2 +-
 drivers/mtd/nand/raw/nand_base.c| 14 +++---
 drivers/mtd/nand/raw/ndfc.c |  3 +--
 drivers/mtd/nand/raw/omap2.c| 17 -
 drivers/mtd/nand/raw/r852.c |  4 ++--
 drivers/mtd/nand/raw/s3c2410.c  | 15 +--
 drivers/mtd/nand/raw/sharpsl.c  |  4 ++--
 drivers/mtd/nand/raw/tmio_nand.c|  4 ++--
 drivers/mtd/nand/raw/txx9ndfmc.c|  4 ++--
 include/linux/mtd/rawnand.h |  2 +-
 17 files changed, 51 insertions(+), 53 deletions(-)

diff --git a/drivers/mtd/nand/raw/cs553x_nand.c 
b/drivers/mtd/nand/raw/cs553x_nand.c
index d4be416bb2fa..508bcb3d134f 100644
--- a/drivers/mtd/nand/raw/cs553x_nand.c
+++ b/drivers/mtd/nand/raw/cs553x_nand.c
@@ -157,9 +157,8 @@ static int cs553x_device_ready(struct mtd_info *mtd)
return (foo & CS_NAND_STS_FLASH_RDY) && !(foo & CS_NAND_CTLR_BUSY);
 }
 
-static void cs_enable_hwecc(struct mtd_info *mtd, int mode)
+static void cs_enable_hwecc(struct nand_chip *this, int mode)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
void __iomem *mmio_base = this->IO_ADDR_R;
 
writeb(0x07, mmio_base + MM_NAND_ECC_CTL);
diff --git a/drivers/mtd/nand/raw/davinci_nand.c 
b/drivers/mtd/nand/raw/davinci_nand.c
index 66d3d5966013..329de266c953 100644
--- a/drivers/mtd/nand/raw/davinci_nand.c
+++ b/drivers/mtd/nand/raw/davinci_nand.c
@@ -146,16 +146,16 @@ static inline uint32_t nand_davinci_readecc_1bit(struct 
mtd_info *mtd)
+ 4 * info->core_chipsel);
 }
 
-static void nand_davinci_hwctl_1bit(struct mtd_info *mtd, int mode)
+static void nand_davinci_hwctl_1bit(struct nand_chip *chip, int mode)
 {
struct davinci_nand_info *info;
uint32_t nandcfr;
unsigned long flags;
 
-   info = to_davinci_nand(mtd);
+   info = to_davinci_nand(nand_to_mtd(chip));
 
/* Reset ECC hardware */
-   nand_davinci_readecc_1bit(mtd);
+   nand_davinci_readecc_1bit(nand_to_mtd(chip));
 
spin_lock_irqsave(_nand_lock, flags);
 
@@ -231,9 +231,9 @@ static int nand_davinci_correct_1bit(struct mtd_info *mtd, 
u_char *dat,
  * OOB without recomputing ECC.
  */
 
-static void nand_davinci_hwctl_4bit(struct mtd_info *mtd, int mode)
+static void nand_davinci_hwctl_4bit(struct nand_chip *chip, int mode)
 {
-   struct davinci_nand_info *info = to_davinci_nand(mtd);
+   struct davinci_nand_info *info = to_davinci_nand(nand_to_mtd(chip));
unsigned long flags;
u32 val;
 
diff --git a/drivers/mtd/nand/raw/diskonchip.c 
b/drivers/mtd/nand/raw/diskonchip.c
index 43d1e08133ce..d007f0704654 100644
--- a/drivers/mtd/nand/raw/diskonchip.c
+++ b/drivers/mtd/nand/raw/diskonchip.c
@@ -797,9 +797,8 @@ static int doc200x_block_bad(struct mtd_info *mtd, loff_t 
ofs)
return 0;
 }
 
-static void doc200x_enable_hwecc(struct mtd_info *mtd, int mode)
+static void doc200x_enable_hwecc(struct nand_chip *this, int mode)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
struct doc_priv *doc = nand_get_controller_data(this);
void __iomem *docptr = doc->virtadr;
 
@@ -816,9 +815,8 @@ static void doc200x_enable_hwecc(struct mtd_info *mtd, int 
mode)
}
 }
 
-static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode)
+static void doc2001plus_enable_hwecc(struct nand_chip *this, int mode)
 {
-   struct nand_chip *this = mtd_to_nand(mtd);
struct doc_priv *doc = nand_get_controller_data(this);
void __iomem *docptr = doc->virtadr;
 
diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c
index 25d354e9448e..0291a43d9f6e 100644
--- a/drivers/mtd/nand/raw/fsmc_nand.c
+++ b/drivers/mtd/nand/raw/fsmc_nand.c
@@ -368,9 +368,9 @@ static int fsmc_setup_data_interface(struct mtd_info *mtd, 
int csline,
 /*
  * fsmc_enable_hwecc - Enables Hardware ECC through FSMC registers
  */
-static void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)
+static void fsmc_enable_hwecc(struct nand_chip *chip, int mode)
 {
-   struct fsmc_nand_data *host = mtd_to_fsmc(mtd);
+   struct fsmc_nand_data *host = mtd_to_fsmc(nand_to_mtd(chip));
 
writel_relaxed(readl(host->regs_va + FSMC_PC) & ~FSMC_ECCPLEN_256,
   host->regs_va + FSMC_PC);
@@ -740,7 +740,7 @@ static int fsmc_read_page_hwecc(struct mtd_info *mtd, 
struct nand_chip *chip,
 
for (i = 0, s = 0; s < eccsteps; s++, i += eccbytes, p += 

[PATCH v2 03/23] mtd: rawnand: Pass a nand_chip object to nand_release()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers to
take a nand_chip object instead of an mtd_info one.

Now is nand_release()'s turn.

Signed-off-by: Boris Brezillon 
---
 Documentation/driver-api/mtdnand.rst   | 2 +-
 drivers/mtd/nand/raw/ams-delta.c   | 2 +-
 drivers/mtd/nand/raw/au1550nd.c| 2 +-
 drivers/mtd/nand/raw/bcm47xxnflash/main.c  | 2 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c   | 2 +-
 drivers/mtd/nand/raw/cafe_nand.c   | 2 +-
 drivers/mtd/nand/raw/cmx270_nand.c | 2 +-
 drivers/mtd/nand/raw/cs553x_nand.c | 2 +-
 drivers/mtd/nand/raw/davinci_nand.c| 2 +-
 drivers/mtd/nand/raw/denali.c  | 4 +---
 drivers/mtd/nand/raw/diskonchip.c  | 4 ++--
 drivers/mtd/nand/raw/docg4.c   | 2 +-
 drivers/mtd/nand/raw/fsl_elbc_nand.c   | 3 +--
 drivers/mtd/nand/raw/fsl_ifc_nand.c| 3 +--
 drivers/mtd/nand/raw/fsl_upm.c | 2 +-
 drivers/mtd/nand/raw/fsmc_nand.c   | 2 +-
 drivers/mtd/nand/raw/gpio.c| 2 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 2 +-
 drivers/mtd/nand/raw/hisi504_nand.c| 3 +--
 drivers/mtd/nand/raw/jz4740_nand.c | 2 +-
 drivers/mtd/nand/raw/jz4780_nand.c | 4 ++--
 drivers/mtd/nand/raw/lpc32xx_mlc.c | 3 +--
 drivers/mtd/nand/raw/lpc32xx_slc.c | 3 +--
 drivers/mtd/nand/raw/marvell_nand.c| 4 ++--
 drivers/mtd/nand/raw/mpc5121_nfc.c | 2 +-
 drivers/mtd/nand/raw/mtk_nand.c| 4 ++--
 drivers/mtd/nand/raw/mxc_nand.c| 2 +-
 drivers/mtd/nand/raw/nand_base.c   | 8 
 drivers/mtd/nand/raw/nandsim.c | 4 ++--
 drivers/mtd/nand/raw/ndfc.c| 2 +-
 drivers/mtd/nand/raw/nuc900_nand.c | 2 +-
 drivers/mtd/nand/raw/omap2.c   | 2 +-
 drivers/mtd/nand/raw/orion_nand.c  | 5 ++---
 drivers/mtd/nand/raw/oxnas_nand.c  | 4 ++--
 drivers/mtd/nand/raw/pasemi_nand.c | 2 +-
 drivers/mtd/nand/raw/plat_nand.c   | 4 ++--
 drivers/mtd/nand/raw/qcom_nandc.c  | 2 +-
 drivers/mtd/nand/raw/r852.c| 4 ++--
 drivers/mtd/nand/raw/s3c2410.c | 2 +-
 drivers/mtd/nand/raw/sh_flctl.c| 2 +-
 drivers/mtd/nand/raw/sharpsl.c | 4 ++--
 drivers/mtd/nand/raw/socrates_nand.c   | 5 ++---
 drivers/mtd/nand/raw/sunxi_nand.c  | 4 ++--
 drivers/mtd/nand/raw/tango_nand.c  | 2 +-
 drivers/mtd/nand/raw/tmio_nand.c   | 4 ++--
 drivers/mtd/nand/raw/txx9ndfmc.c   | 2 +-
 drivers/mtd/nand/raw/vf610_nfc.c   | 2 +-
 drivers/mtd/nand/raw/xway_nand.c   | 4 ++--
 include/linux/mtd/rawnand.h| 2 +-
 49 files changed, 66 insertions(+), 75 deletions(-)

diff --git a/Documentation/driver-api/mtdnand.rst 
b/Documentation/driver-api/mtdnand.rst
index 1ab6f35b6410..5470a3d6bd9e 100644
--- a/Documentation/driver-api/mtdnand.rst
+++ b/Documentation/driver-api/mtdnand.rst
@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer.
 static void __exit board_cleanup (void)
 {
 /* Release resources, unregister device */
-nand_release (board_mtd);
+nand_release (mtd_to_nand(board_mtd));
 
 /* unmap physical address */
 iounmap(baseaddr);
diff --git a/drivers/mtd/nand/raw/ams-delta.c b/drivers/mtd/nand/raw/ams-delta.c
index 24ba7296ec08..acf7971e815d 100644
--- a/drivers/mtd/nand/raw/ams-delta.c
+++ b/drivers/mtd/nand/raw/ams-delta.c
@@ -264,7 +264,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)
void __iomem *io_base = platform_get_drvdata(pdev);
 
/* Release resources, unregister device */
-   nand_release(ams_delta_mtd);
+   nand_release(mtd_to_nand(ams_delta_mtd));
 
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
diff --git a/drivers/mtd/nand/raw/au1550nd.c b/drivers/mtd/nand/raw/au1550nd.c
index 614f5d447ba5..d277a141c7d3 100644
--- a/drivers/mtd/nand/raw/au1550nd.c
+++ b/drivers/mtd/nand/raw/au1550nd.c
@@ -477,7 +477,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(nand_to_mtd(>chip));
+   nand_release(>chip);
iounmap(ctx->base);
release_mem_region(r->start, 0x1000);
kfree(ctx);
diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/main.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/main.c
index fb31429b70a9..d79694160845 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/main.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/main.c
@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev)
 {
struct bcm47xxnflash *nflash = platform_get_drvdata(pdev);
 
-   nand_release(nand_to_mtd(>nand_chip));
+   nand_release(>nand_chip);
 
return 0;
 }
diff --git 

[PATCH v2 01/23] mtd: rawnand: plat_nand: Pass a nand_chip object to all platform_nand_ctrl hooks

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers and
hooks to take a nand_chip object instead of an mtd_info one or
remove the mtd_info object when both are passed.

In order to do that, we first need to update the platform_nand_ctrl
hooks to take a nand_chip object instead of an mtd_info.

We add temporary plat_nand_xxx() wrappers to the do the mtd -> chip
conversion, but those will be dropped when patching nand_chip hooks to
take a nand_chip object.

Signed-off-by: Boris Brezillon 
Reviewed-by: Alexander Sverdlin 
Acked-by: Alexander Sverdlin 
Acked-by: Robert Jarzmik 
Acked-by: Krzysztof Halasa 
---
Changes in v2:
- Fix commit message
- Add R-b/A-b tags
---
 arch/arm/mach-ep93xx/snappercl15.c  |  7 ++--
 arch/arm/mach-ep93xx/ts72xx.c   |  7 ++--
 arch/arm/mach-imx/mach-qong.c   | 11 +++
 arch/arm/mach-ixp4xx/ixdp425-setup.c|  3 +-
 arch/arm/mach-omap1/board-fsample.c |  2 +-
 arch/arm/mach-omap1/board-h2.c  |  2 +-
 arch/arm/mach-omap1/board-h3.c  |  2 +-
 arch/arm/mach-omap1/board-nand.c|  3 +-
 arch/arm/mach-omap1/board-perseus2.c|  2 +-
 arch/arm/mach-omap1/common.h|  2 +-
 arch/arm/mach-orion5x/ts78xx-setup.c| 18 ---
 arch/arm/mach-pxa/balloon3.c|  8 ++---
 arch/arm/mach-pxa/em-x270.c |  5 ++-
 arch/arm/mach-pxa/palmtx.c  |  5 ++-
 arch/mips/alchemy/devboards/db1200.c|  5 ++-
 arch/mips/alchemy/devboards/db1300.c|  5 ++-
 arch/mips/alchemy/devboards/db1550.c|  5 ++-
 arch/mips/netlogic/xlr/platform-flash.c |  4 +--
 arch/mips/pnx833x/common/platform.c |  3 +-
 arch/mips/rb532/devices.c   |  5 ++-
 arch/sh/boards/mach-migor/setup.c   |  6 ++--
 drivers/mtd/nand/raw/plat_nand.c| 57 ++---
 include/linux/mtd/rawnand.h | 10 +++---
 23 files changed, 101 insertions(+), 76 deletions(-)

diff --git a/arch/arm/mach-ep93xx/snappercl15.c 
b/arch/arm/mach-ep93xx/snappercl15.c
index 45940c1d7787..aa03ea79c5f5 100644
--- a/arch/arm/mach-ep93xx/snappercl15.c
+++ b/arch/arm/mach-ep93xx/snappercl15.c
@@ -45,10 +45,9 @@
 
 #define NAND_CTRL_ADDR(chip)   (chip->IO_ADDR_W + 0x40)
 
-static void snappercl15_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
+static void snappercl15_nand_cmd_ctrl(struct nand_chip *chip, int cmd,
  unsigned int ctrl)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
static u16 nand_state = SNAPPERCL15_NAND_WPN;
u16 set;
 
@@ -73,10 +72,8 @@ static void snappercl15_nand_cmd_ctrl(struct mtd_info *mtd, 
int cmd,
__raw_writew((cmd & 0xff) | nand_state, chip->IO_ADDR_W);
 }
 
-static int snappercl15_nand_dev_ready(struct mtd_info *mtd)
+static int snappercl15_nand_dev_ready(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
-
return !!(__raw_readw(NAND_CTRL_ADDR(chip)) & SNAPPERCL15_NAND_RDY);
 }
 
diff --git a/arch/arm/mach-ep93xx/ts72xx.c b/arch/arm/mach-ep93xx/ts72xx.c
index c089a2a4fe30..26259dd9e951 100644
--- a/arch/arm/mach-ep93xx/ts72xx.c
+++ b/arch/arm/mach-ep93xx/ts72xx.c
@@ -76,11 +76,9 @@ static void __init ts72xx_map_io(void)
 #define TS72XX_NAND_CONTROL_ADDR_LINE  22  /* 0xN040 */
 #define TS72XX_NAND_BUSY_ADDR_LINE 23  /* 0xN080 */
 
-static void ts72xx_nand_hwcontrol(struct mtd_info *mtd,
+static void ts72xx_nand_hwcontrol(struct nand_chip *chip,
  int cmd, unsigned int ctrl)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
-
if (ctrl & NAND_CTRL_CHANGE) {
void __iomem *addr = chip->IO_ADDR_R;
unsigned char bits;
@@ -99,9 +97,8 @@ static void ts72xx_nand_hwcontrol(struct mtd_info *mtd,
__raw_writeb(cmd, chip->IO_ADDR_W);
 }
 
-static int ts72xx_nand_device_ready(struct mtd_info *mtd)
+static int ts72xx_nand_device_ready(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
void __iomem *addr = chip->IO_ADDR_R;
 
addr += (1 << TS72XX_NAND_BUSY_ADDR_LINE);
diff --git a/arch/arm/mach-imx/mach-qong.c b/arch/arm/mach-imx/mach-qong.c
index 42a700053103..ff015f603ac9 100644
--- a/arch/arm/mach-imx/mach-qong.c
+++ b/arch/arm/mach-imx/mach-qong.c
@@ -129,10 +129,9 @@ static void qong_init_nor_mtd(void)
 /*
  * Hardware specific access to control-lines
  */
-static void qong_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int 
ctrl)
+static void qong_nand_cmd_ctrl(struct nand_chip *nand_chip, int cmd,
+  unsigned int ctrl)
 {
-   struct nand_chip *nand_chip = mtd_to_nand(mtd);
-
if (cmd == NAND_CMD_NONE)
return;
 
@@ -145,14 +144,14 @@ static void qong_nand_cmd_ctrl(struct mtd_info *mtd, int 
cmd, unsigned int ctrl)
 /*
  * Read the Device Ready pin.
  */
-static int qong_nand_device_ready(struct mtd_info *mtd)
+static int qong_nand_device_ready(struct nand_chip 

[PATCH v2 04/23] mtd: rawnand: Pass a nand_chip object to nand_wait_ready()

2018-09-06 Thread Boris Brezillon
Let's make the raw NAND API consistent by patching all helpers to
take a nand_chip object instead of an mtd_info one.

Now is nand_wait_ready()'s turn.

Signed-off-by: Boris Brezillon 
---
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  2 +-
 drivers/mtd/nand/raw/cafe_nand.c |  2 +-
 drivers/mtd/nand/raw/nand_base.c | 12 ++--
 include/linux/mtd/rawnand.h  |  2 +-
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c 
b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
index 9b62bc2d25a0..7022ffd271ad 100644
--- a/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
+++ b/drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c
@@ -232,7 +232,7 @@ static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct 
mtd_info *mtd,
nand_chip->cmd_ctrl(mtd, command, NAND_CTRL_CLE);
 
ndelay(100);
-   nand_wait_ready(mtd);
+   nand_wait_ready(nand_chip);
break;
case NAND_CMD_READID:
ctlcode = NCTL_CSA | 0x0100 | NCTL_CMD1W | NCTL_CMD0;
diff --git a/drivers/mtd/nand/raw/cafe_nand.c b/drivers/mtd/nand/raw/cafe_nand.c
index 3304594177c6..94e5f7a56084 100644
--- a/drivers/mtd/nand/raw/cafe_nand.c
+++ b/drivers/mtd/nand/raw/cafe_nand.c
@@ -313,7 +313,7 @@ static void cafe_nand_cmdfunc(struct mtd_info *mtd, 
unsigned command,
cafe_writel(cafe, cafe->ctl2, NAND_CTRL2);
return;
}
-   nand_wait_ready(mtd);
+   nand_wait_ready(chip);
cafe_writel(cafe, cafe->ctl2, NAND_CTRL2);
 }
 
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index f937efe145af..9d684f1d9e26 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -624,13 +624,13 @@ static void panic_nand_wait_ready(struct mtd_info *mtd, 
unsigned long timeo)
 
 /**
  * nand_wait_ready - [GENERIC] Wait for the ready pin after commands.
- * @mtd: MTD device structure
+ * @chip: NAND chip object
  *
  * Wait for the ready pin after a command, and warn if a timeout occurs.
  */
-void nand_wait_ready(struct mtd_info *mtd)
+void nand_wait_ready(struct nand_chip *chip)
 {
-   struct nand_chip *chip = mtd_to_nand(mtd);
+   struct mtd_info *mtd = nand_to_mtd(chip);
unsigned long timeo = 400;
 
if (in_interrupt() || oops_in_progress)
@@ -852,7 +852,7 @@ static void nand_command(struct mtd_info *mtd, unsigned int 
command,
 */
ndelay(100);
 
-   nand_wait_ready(mtd);
+   nand_wait_ready(chip);
 }
 
 static void nand_ccs_delay(struct nand_chip *chip)
@@ -1004,7 +1004,7 @@ static void nand_command_lp(struct mtd_info *mtd, 
unsigned int command,
 */
ndelay(100);
 
-   nand_wait_ready(mtd);
+   nand_wait_ready(chip);
 }
 
 /**
@@ -2251,7 +2251,7 @@ static int nand_wait_rdy_op(struct nand_chip *chip, 
unsigned int timeout_ms,
if (!chip->dev_ready)
udelay(chip->chip_delay);
else
-   nand_wait_ready(nand_to_mtd(chip));
+   nand_wait_ready(chip);
 
return 0;
 }
diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h
index e9c59f0624ad..55014e42912a 100644
--- a/include/linux/mtd/rawnand.h
+++ b/include/linux/mtd/rawnand.h
@@ -37,7 +37,7 @@ static inline int nand_scan(struct nand_chip *chip, int 
max_chips)
 }
 
 /* Internal helper for board drivers which need to override command function */
-void nand_wait_ready(struct mtd_info *mtd);
+void nand_wait_ready(struct nand_chip *chip);
 
 /* The maximum number of NAND chips in an array */
 #define NAND_MAX_CHIPS 8
-- 
2.14.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2 00/23] mtd: rawnand: Stop passing mtd_info to drivers

2018-09-06 Thread Boris Brezillon
Hello,

This is the first set of patches aiming at cleaning the raw NAND API.

This one focuses on inconsistencies we have in the API + the nand_chip
and nand_ecc_ctrl interfaces. Some functions/hooks are passed a
nand_chip object, some are passed an mtd_info object and some are
passed both.

Since mtd_info can be extracted from nand_chip, we can simply always
pass a nand_chip and make things consistent. Hopefully with these
changes merged we'll stop seeing new drivers reproducing the same
mistake (passing both mtd_info and nand_chip or using mtd_info where
nand_chip is more appropriate).

For those who want to see what's in the pipe, here is a branch [1]
containing all the cleanups I plan to merge.

Not much has changed in this v2. I just rebased on top of nand/next,
fixed typos, added A-b/R-b tags, and that's all.

Regards,

Boris

[1]https://github.com/bbrezillon/linux-0day/commits/nand/api-cleanup

Boris Brezillon (23):
  mtd: rawnand: plat_nand: Pass a nand_chip object to all
platform_nand_ctrl hooks
  mtd: rawnand: Pass a nand_chip object to nand_scan()
  mtd: rawnand: Pass a nand_chip object to nand_release()
  mtd: rawnand: Pass a nand_chip object to nand_wait_ready()
  mtd: rawnand: Pass a nand_chip object to ecc->hwctl()
  mtd: rawnand: Pass a nand_chip object to ecc->calculate()
  mtd: rawnand: Pass a nand_chip object to ecc->correct()
  mtd: rawnand: Pass a nand_chip object to ecc->read_xxx() hooks
  mtd: rawnand: Pass a nand_chip object to ecc->write_xxx() hooks
  mtd: rawnand: Pass a nand_chip object to chip->read_xxx() hooks
  mtd: rawnand: Pass a nand_chip object to chip->write_xxx() hooks
  mtd: rawnand: Pass a nand_chip object to chip->select_chip()
  mtd: rawnand: Pass a nand_chip object to chip->block_xxx() hooks
  mtd: rawnand: Pass a nand_chip object to chip->cmd_ctrl()
  mtd: rawnand: Pass a nand_chip object to chip->dev_ready()
  mtd: rawnand: Pass a nand_chip object to chip->cmdfunc()
  mtd: rawnand: Pass a nand_chip object to chip->waitfunc()
  mtd: rawnand: Pass a nand_chip object to chip->erase()
  mtd: rawnand: Pass a nand_chip object to chip->{get,set}_features()
  mtd: rawnand: Pass a nand_chip object to chip->setup_read_retry()
  mtd: rawnand: Pass a nand_chip object to chip->setup_data_interface()
  mtd: rawnand: Pass a nand_chip object to all nand_xxx_bbt() helpers
  mtd: rawnand: Pass a nand_chip object nand_erase_nand()

 Documentation/driver-api/mtdnand.rst |   4 +-
 arch/arm/mach-ep93xx/snappercl15.c   |   7 +-
 arch/arm/mach-ep93xx/ts72xx.c|   7 +-
 arch/arm/mach-imx/mach-qong.c|  11 +-
 arch/arm/mach-ixp4xx/ixdp425-setup.c |   3 +-
 arch/arm/mach-omap1/board-fsample.c  |   2 +-
 arch/arm/mach-omap1/board-h2.c   |   2 +-
 arch/arm/mach-omap1/board-h3.c   |   2 +-
 arch/arm/mach-omap1/board-nand.c |   3 +-
 arch/arm/mach-omap1/board-perseus2.c |   2 +-
 arch/arm/mach-omap1/common.h |   2 +-
 arch/arm/mach-orion5x/ts78xx-setup.c |  18 +-
 arch/arm/mach-pxa/balloon3.c |   8 +-
 arch/arm/mach-pxa/em-x270.c  |   5 +-
 arch/arm/mach-pxa/palmtx.c   |   5 +-
 arch/mips/alchemy/devboards/db1200.c |   5 +-
 arch/mips/alchemy/devboards/db1300.c |   5 +-
 arch/mips/alchemy/devboards/db1550.c |   5 +-
 arch/mips/netlogic/xlr/platform-flash.c  |   4 +-
 arch/mips/pnx833x/common/platform.c  |   3 +-
 arch/mips/rb532/devices.c|   5 +-
 arch/sh/boards/mach-migor/setup.c|   6 +-
 drivers/mtd/nand/raw/ams-delta.c |  24 +-
 drivers/mtd/nand/raw/atmel/nand-controller.c |  74 ++-
 drivers/mtd/nand/raw/au1550nd.c  |  70 ++-
 drivers/mtd/nand/raw/bcm47xxnflash/main.c|   2 +-
 drivers/mtd/nand/raw/bcm47xxnflash/ops_bcm4706.c |  38 +-
 drivers/mtd/nand/raw/brcmnand/brcmnand.c |  78 +--
 drivers/mtd/nand/raw/cafe_nand.c |  56 +--
 drivers/mtd/nand/raw/cmx270_nand.c   |  20 +-
 drivers/mtd/nand/raw/cs553x_nand.c   |  33 +-
 drivers/mtd/nand/raw/davinci_nand.c  |  59 +--
 drivers/mtd/nand/raw/denali.c|  87 ++--
 drivers/mtd/nand/raw/diskonchip.c| 116 ++---
 drivers/mtd/nand/raw/docg4.c |  83 ++--
 drivers/mtd/nand/raw/fsl_elbc_nand.c |  52 +-
 drivers/mtd/nand/raw/fsl_ifc_nand.c  |  46 +-
 drivers/mtd/nand/raw/fsl_upm.c   |  34 +-
 drivers/mtd/nand/raw/fsmc_nand.c |  42 +-
 drivers/mtd/nand/raw/gpio.c  |  13 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c|   3 +-
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c   |  99 ++--
 drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h   |   2 +-
 drivers/mtd/nand/raw/hisi504_nand.c 

Re: [PATCH 1/2 dhowells/mount-api] staging: erofs: rename superblock flags (MS_xyz -> SB_xyz)

2018-09-06 Thread Gao Xiang



On 2018/9/6 18:08, David Howells wrote:
> Gao Xiang  wrote:
> 
>> This patch follows commit 1751e8a6cb93 ("Rename superblock
>> flags (MS_xyz -> SB_xyz)") and after commit ("vfs: Suppress
>> MS_* flag defs within the kernel unless explicitly enabled"),
>> there is no MS_RDONLY and MS_NOATIME at all.
>>
>> Reported-by: Stephen Rothwell 
>> Reviewed-by: Chao Yu 
>> Signed-off-by: Gao Xiang 
> I recommend pushing this one to Linus now.  It's trivial enough.

Hi David,
I personally think that is fine, but I'd like to get Greg's idea and agreement, 
too...

> 
> Reviewed-by: David Howells 

Hi Greg,

As David suggested above, could you please help merge this patch to Linus?
It's trivial enough (since the commit 1751e8a6cb93) and MS_xyz will be removed
in the new mount apis patchset...

Thanks in advance...

Thanks,
Gao Xiang
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v2 1/2] staging: rtl8188eu: remove empty if statement in rtw_led.c

2018-09-06 Thread Dan Carpenter
Thanks.

Reviewed-by: Dan Carpenter 

regards,
dan carpenter
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 2/2 dhowells/mount-api] staging: erofs: update .mount and .remount_sb

2018-09-06 Thread David Howells
Gao Xiang  wrote:

> This patch updates .mount and .remount_sb after
> commit ("vfs: Require specification of size of
> mount data for internal mounts") in reference to
> drivers/usb/gadget/function/f_fs.c.
> 
> Reported-by: Stephen Rothwell 
> Signed-off-by: Gao Xiang 

I've folded this into my patch.

David
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 1/2 dhowells/mount-api] staging: erofs: rename superblock flags (MS_xyz -> SB_xyz)

2018-09-06 Thread David Howells
Gao Xiang  wrote:

> This patch follows commit 1751e8a6cb93 ("Rename superblock
> flags (MS_xyz -> SB_xyz)") and after commit ("vfs: Suppress
> MS_* flag defs within the kernel unless explicitly enabled"),
> there is no MS_RDONLY and MS_NOATIME at all.
> 
> Reported-by: Stephen Rothwell 
> Reviewed-by: Chao Yu 
> Signed-off-by: Gao Xiang 

I recommend pushing this one to Linus now.  It's trivial enough.

Reviewed-by: David Howells 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 2/2 dhowells/mount-api] staging: erofs: update .mount and .remount_sb

2018-09-06 Thread Chao Yu
On 2018/9/6 17:01, Gao Xiang wrote:
> This patch updates .mount and .remount_sb after
> commit ("vfs: Require specification of size of
> mount data for internal mounts") in reference to
> drivers/usb/gadget/function/f_fs.c.
> 
> Reported-by: Stephen Rothwell 
> Signed-off-by: Gao Xiang 

Reviewed-by: Chao Yu 

Thanks,

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/2 dhowells/mount-api] staging: erofs: update .mount and .remount_sb

2018-09-06 Thread Gao Xiang
This patch updates .mount and .remount_sb after
commit ("vfs: Require specification of size of
mount data for internal mounts") in reference to
drivers/usb/gadget/function/f_fs.c.

Reported-by: Stephen Rothwell 
Signed-off-by: Gao Xiang 
---
 drivers/staging/erofs/super.c | 13 +++--
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/erofs/super.c b/drivers/staging/erofs/super.c
index 2df9768..98614f1 100644
--- a/drivers/staging/erofs/super.c
+++ b/drivers/staging/erofs/super.c
@@ -480,7 +480,7 @@ struct erofs_mount_private {
 
 /* support mount_bdev() with options */
 static int erofs_fill_super(struct super_block *sb,
-   void *_priv, int silent)
+   void *_priv, size_t data_size, int silent)
 {
struct erofs_mount_private *priv = _priv;
 
@@ -488,9 +488,9 @@ static int erofs_fill_super(struct super_block *sb,
priv->options, silent);
 }
 
-static struct dentry *erofs_mount(
-   struct file_system_type *fs_type, int flags,
-   const char *dev_name, void *data)
+static struct dentry *erofs_mount(struct file_system_type *fs_type,
+ int flags, const char *dev_name,
+ void *data, size_t data_size)
 {
struct erofs_mount_private priv = {
.dev_name = dev_name,
@@ -498,7 +498,7 @@ static struct dentry *erofs_mount(
};
 
return mount_bdev(fs_type, flags, dev_name,
-   , erofs_fill_super);
+   , sizeof(priv), erofs_fill_super);
 }
 
 static void erofs_kill_sb(struct super_block *sb)
@@ -623,7 +623,8 @@ static int erofs_show_options(struct seq_file *seq, struct 
dentry *root)
return 0;
 }
 
-static int erofs_remount(struct super_block *sb, int *flags, char *data)
+static int erofs_remount(struct super_block *sb, int *flags,
+char *data, size_t data_size)
 {
BUG_ON(!sb_rdonly(sb));
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/2 dhowells/mount-api] staging: erofs: rename superblock flags (MS_xyz -> SB_xyz)

2018-09-06 Thread Gao Xiang
This patch follows commit 1751e8a6cb93 ("Rename superblock
flags (MS_xyz -> SB_xyz)") and after commit ("vfs: Suppress
MS_* flag defs within the kernel unless explicitly enabled"),
there is no MS_RDONLY and MS_NOATIME at all.

Reported-by: Stephen Rothwell 
Reviewed-by: Chao Yu 
Signed-off-by: Gao Xiang 
---

Once used MS_RDONLY, MS_NOATIME for the compatibility of older kernels,
which are removed in ("vfs: Suppress MS_* flag defs within the kernel
unless explicitly enabled").

 drivers/staging/erofs/super.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/erofs/super.c b/drivers/staging/erofs/super.c
index 1aec509..2df9768 100644
--- a/drivers/staging/erofs/super.c
+++ b/drivers/staging/erofs/super.c
@@ -340,7 +340,7 @@ static int erofs_read_super(struct super_block *sb,
goto err_sbread;
 
sb->s_magic = EROFS_SUPER_MAGIC;
-   sb->s_flags |= MS_RDONLY | MS_NOATIME;
+   sb->s_flags |= SB_RDONLY | SB_NOATIME;
sb->s_maxbytes = MAX_LFS_FILESIZE;
sb->s_time_gran = 1;
 
@@ -627,7 +627,7 @@ static int erofs_remount(struct super_block *sb, int 
*flags, char *data)
 {
BUG_ON(!sb_rdonly(sb));
 
-   *flags |= MS_RDONLY;
+   *flags |= SB_RDONLY;
return 0;
 }
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH] vme: remove unneeded kfree

2018-09-06 Thread Ding Xiang
put_device will call vme_dev_release to free vdev, kfree is
unnecessary here.

Signed-off-by: Ding Xiang 
---
 drivers/vme/vme.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/vme/vme.c b/drivers/vme/vme.c
index 92500f6..520a5f9 100644
--- a/drivers/vme/vme.c
+++ b/drivers/vme/vme.c
@@ -1890,7 +1890,6 @@ static int __vme_register_driver_bus(struct vme_driver 
*drv,
 
 err_reg:
put_device(>dev);
-   kfree(vdev);
 err_devalloc:
list_for_each_entry_safe(vdev, tmp, >devices, drv_list) {
list_del(>drv_list);
-- 
1.9.1



___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v8 4/8] media: platform: Add Cedrus VPU decoder driver

2018-09-06 Thread Hans Verkuil
On 09/06/2018 09:25 AM, Tomasz Figa wrote:
> On Thu, Sep 6, 2018 at 4:01 PM Hans Verkuil  wrote:
>>
>> On 09/05/2018 06:29 PM, Paul Kocialkowski wrote:
>>> Hi and thanks for the review!
>>>
>>> Le lundi 03 septembre 2018 à 11:11 +0200, Hans Verkuil a écrit :
 On 08/28/2018 09:34 AM, Paul Kocialkowski wrote:
> +static int cedrus_request_validate(struct media_request *req)
> +{
> +   struct media_request_object *obj, *obj_safe;
> +   struct v4l2_ctrl_handler *parent_hdl, *hdl;
> +   struct cedrus_ctx *ctx = NULL;
> +   struct v4l2_ctrl *ctrl_test;
> +   unsigned int i;
> +
> +   list_for_each_entry_safe(obj, obj_safe, >objects, list) {

 You don't need to use the _safe variant during validation.
>>>
>>> Okay, I'll use the regular one then.
>>>
> +   struct vb2_buffer *vb;
> +
> +   if (vb2_request_object_is_buffer(obj)) {
> +   vb = container_of(obj, struct vb2_buffer, req_obj);
> +   ctx = vb2_get_drv_priv(vb->vb2_queue);
> +
> +   break;
> +   }
> +   }

 Interesting question: what happens if more than one buffer is queued in the
 request? This is allowed by the request API and in that case the associated
 controls in the request apply to all queued buffers.

 Would this make sense at all for this driver? If not, then you need to
 check here if there is more than one buffer in the request and document in
 the spec that this is not allowed.
>>>
>>> Well, our driver was written with the (unformal) assumption that we
>>> only deal with a pair of one output and one capture buffer. So I will
>>> add a check for this at request validation time and document it in the
>>> spec. Should that be part of the MPEG-2 PIXFMT documentation (and
>>> duplicated for future formats we add support for)?
>>
>> Can you make a patch for vb2_request_has_buffers() in videobuf2-core.c
>> renaming it to vb2_request_buffer_cnt() and returning the number of buffers
>> in the request?
>>
>> Then you can call it here to check that you have only one buffer.
>>
>> And this has to be documented with the PIXFMT.
>>
>> Multiple buffers are certainly possible in non-codec scenarios (vim2m and
>> vivid happily accept that), so this is an exception that should be
>> documented and checked in the codec driver.
> 
> Hmm, isn't it still 1 buffer per 1 queue and just multiple queues
> included in the request?

No. The request API allows multiple buffers for the same vb2_queue to be
queued for the same request (obviously when the request is committed, the
buffers are queued to the driver in the same order).

> 
> If we indeed allow multiple buffers for the same queue in a request,
> we shouldn't restrict this on a per-driver basis. It's definitely not
> a hardware limitation, since the driver could just do the same as if 2
> requests with the same controls were given.

That's how it operates: for all buffers in the request the same controls
apply. But does this make sense for codecs? If the control(s) with the
codec metadata always change for every buffer, then having more than one
buffer in the request is senseless and the driver should check for this
in the validation step.

If it *does* make sense in some circumstances to have the same metadata
for multiple buffers, then it should be checked if the cedrus driver
handles this correctly.

Regards,

Hans
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v8 4/8] media: platform: Add Cedrus VPU decoder driver

2018-09-06 Thread Tomasz Figa
On Thu, Sep 6, 2018 at 4:01 PM Hans Verkuil  wrote:
>
> On 09/05/2018 06:29 PM, Paul Kocialkowski wrote:
> > Hi and thanks for the review!
> >
> > Le lundi 03 septembre 2018 à 11:11 +0200, Hans Verkuil a écrit :
> >> On 08/28/2018 09:34 AM, Paul Kocialkowski wrote:
> >>> +static int cedrus_request_validate(struct media_request *req)
> >>> +{
> >>> +   struct media_request_object *obj, *obj_safe;
> >>> +   struct v4l2_ctrl_handler *parent_hdl, *hdl;
> >>> +   struct cedrus_ctx *ctx = NULL;
> >>> +   struct v4l2_ctrl *ctrl_test;
> >>> +   unsigned int i;
> >>> +
> >>> +   list_for_each_entry_safe(obj, obj_safe, >objects, list) {
> >>
> >> You don't need to use the _safe variant during validation.
> >
> > Okay, I'll use the regular one then.
> >
> >>> +   struct vb2_buffer *vb;
> >>> +
> >>> +   if (vb2_request_object_is_buffer(obj)) {
> >>> +   vb = container_of(obj, struct vb2_buffer, req_obj);
> >>> +   ctx = vb2_get_drv_priv(vb->vb2_queue);
> >>> +
> >>> +   break;
> >>> +   }
> >>> +   }
> >>
> >> Interesting question: what happens if more than one buffer is queued in the
> >> request? This is allowed by the request API and in that case the associated
> >> controls in the request apply to all queued buffers.
> >>
> >> Would this make sense at all for this driver? If not, then you need to
> >> check here if there is more than one buffer in the request and document in
> >> the spec that this is not allowed.
> >
> > Well, our driver was written with the (unformal) assumption that we
> > only deal with a pair of one output and one capture buffer. So I will
> > add a check for this at request validation time and document it in the
> > spec. Should that be part of the MPEG-2 PIXFMT documentation (and
> > duplicated for future formats we add support for)?
>
> Can you make a patch for vb2_request_has_buffers() in videobuf2-core.c
> renaming it to vb2_request_buffer_cnt() and returning the number of buffers
> in the request?
>
> Then you can call it here to check that you have only one buffer.
>
> And this has to be documented with the PIXFMT.
>
> Multiple buffers are certainly possible in non-codec scenarios (vim2m and
> vivid happily accept that), so this is an exception that should be
> documented and checked in the codec driver.

Hmm, isn't it still 1 buffer per 1 queue and just multiple queues
included in the request?

If we indeed allow multiple buffers for the same queue in a request,
we shouldn't restrict this on a per-driver basis. It's definitely not
a hardware limitation, since the driver could just do the same as if 2
requests with the same controls were given.

Best regards,
Tomasz
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v8 4/8] media: platform: Add Cedrus VPU decoder driver

2018-09-06 Thread Hans Verkuil
On 09/06/2018 09:01 AM, Hans Verkuil wrote:
> On 09/05/2018 06:29 PM, Paul Kocialkowski wrote:
>> Hi and thanks for the review!
>>
>> Le lundi 03 septembre 2018 à 11:11 +0200, Hans Verkuil a écrit :
>>> On 08/28/2018 09:34 AM, Paul Kocialkowski wrote:
 +static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs,
 +unsigned int *nplanes, unsigned int sizes[],
 +struct device *alloc_devs[])
 +{
 +  struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
 +  struct cedrus_dev *dev = ctx->dev;
 +  struct v4l2_pix_format_mplane *mplane_fmt;
 +  struct cedrus_format *fmt;
 +  unsigned int i;
 +
 +  switch (vq->type) {
 +  case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
 +  mplane_fmt = >src_fmt;
 +  fmt = cedrus_find_format(mplane_fmt->pixelformat,
 +   CEDRUS_DECODE_SRC,
 +   dev->capabilities);
 +  break;
 +
 +  case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
 +  mplane_fmt = >dst_fmt;
 +  fmt = cedrus_find_format(mplane_fmt->pixelformat,
 +   CEDRUS_DECODE_DST,
 +   dev->capabilities);
 +  break;
 +
 +  default:
 +  return -EINVAL;
 +  }
 +
 +  if (!fmt)
 +  return -EINVAL;
 +
 +  if (fmt->num_buffers == 1) {
 +  sizes[0] = 0;
 +
 +  for (i = 0; i < fmt->num_planes; i++)
 +  sizes[0] += mplane_fmt->plane_fmt[i].sizeimage;
 +  } else if (fmt->num_buffers == fmt->num_planes) {
 +  for (i = 0; i < fmt->num_planes; i++)
 +  sizes[i] = mplane_fmt->plane_fmt[i].sizeimage;
 +  } else {
 +  return -EINVAL;
 +  }
 +
 +  *nplanes = fmt->num_buffers;
>>>
>>> This code does not take VIDIOC_CREATE_BUFFERS into account.
>>>
>>> If it is called from that ioctl, then *nplanes is non-zero and you need
>>> to check if *nplanes equals fmt->num_buffers and that sizes[n] is >=
>>> the required size of the format. If so, then return 0, otherwise return
>>> -EINVAL.
>>
>> Thanks for spotting this, I'll fix it as you suggested in the next
>> revision.
>>
>>> Doesn't v4l2-compliance fail on that? Or is that test skipped because this
>>> is a decoder for which streaming is not supported (yet)?
>>
>> Apparently, v4l2-compliance doesn't fail since I'm getting:
>> test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
> 
> It is tested, but only with the -s option. I'll see if I can improve the
> tests.

I've improved the tests. v4l2-compliance should now fail when run (without the
-s option) against this driver. Can you check that that is indeed the case?

Thanks!

Hans
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v8 4/8] media: platform: Add Cedrus VPU decoder driver

2018-09-06 Thread Hans Verkuil
On 09/05/2018 06:29 PM, Paul Kocialkowski wrote:
> Hi and thanks for the review!
> 
> Le lundi 03 septembre 2018 à 11:11 +0200, Hans Verkuil a écrit :
>> On 08/28/2018 09:34 AM, Paul Kocialkowski wrote:
>>> +static int cedrus_request_validate(struct media_request *req)
>>> +{
>>> +   struct media_request_object *obj, *obj_safe;
>>> +   struct v4l2_ctrl_handler *parent_hdl, *hdl;
>>> +   struct cedrus_ctx *ctx = NULL;
>>> +   struct v4l2_ctrl *ctrl_test;
>>> +   unsigned int i;
>>> +
>>> +   list_for_each_entry_safe(obj, obj_safe, >objects, list) {
>>
>> You don't need to use the _safe variant during validation.
> 
> Okay, I'll use the regular one then.
> 
>>> +   struct vb2_buffer *vb;
>>> +
>>> +   if (vb2_request_object_is_buffer(obj)) {
>>> +   vb = container_of(obj, struct vb2_buffer, req_obj);
>>> +   ctx = vb2_get_drv_priv(vb->vb2_queue);
>>> +
>>> +   break;
>>> +   }
>>> +   }
>>
>> Interesting question: what happens if more than one buffer is queued in the
>> request? This is allowed by the request API and in that case the associated
>> controls in the request apply to all queued buffers.
>>
>> Would this make sense at all for this driver? If not, then you need to
>> check here if there is more than one buffer in the request and document in
>> the spec that this is not allowed.
> 
> Well, our driver was written with the (unformal) assumption that we
> only deal with a pair of one output and one capture buffer. So I will
> add a check for this at request validation time and document it in the
> spec. Should that be part of the MPEG-2 PIXFMT documentation (and
> duplicated for future formats we add support for)?

Can you make a patch for vb2_request_has_buffers() in videobuf2-core.c
renaming it to vb2_request_buffer_cnt() and returning the number of buffers
in the request?

Then you can call it here to check that you have only one buffer.

And this has to be documented with the PIXFMT.

Multiple buffers are certainly possible in non-codec scenarios (vim2m and
vivid happily accept that), so this is an exception that should be
documented and checked in the codec driver.

> 
>> If it does make sense, then you need to test this.
>>
>> Again, this can be corrected in a follow-up patch, unless there will be a
>> v9 anyway.
> 
> [...]

>>> +static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs,
>>> + unsigned int *nplanes, unsigned int sizes[],
>>> + struct device *alloc_devs[])
>>> +{
>>> +   struct cedrus_ctx *ctx = vb2_get_drv_priv(vq);
>>> +   struct cedrus_dev *dev = ctx->dev;
>>> +   struct v4l2_pix_format_mplane *mplane_fmt;
>>> +   struct cedrus_format *fmt;
>>> +   unsigned int i;
>>> +
>>> +   switch (vq->type) {
>>> +   case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
>>> +   mplane_fmt = >src_fmt;
>>> +   fmt = cedrus_find_format(mplane_fmt->pixelformat,
>>> +CEDRUS_DECODE_SRC,
>>> +dev->capabilities);
>>> +   break;
>>> +
>>> +   case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
>>> +   mplane_fmt = >dst_fmt;
>>> +   fmt = cedrus_find_format(mplane_fmt->pixelformat,
>>> +CEDRUS_DECODE_DST,
>>> +dev->capabilities);
>>> +   break;
>>> +
>>> +   default:
>>> +   return -EINVAL;
>>> +   }
>>> +
>>> +   if (!fmt)
>>> +   return -EINVAL;
>>> +
>>> +   if (fmt->num_buffers == 1) {
>>> +   sizes[0] = 0;
>>> +
>>> +   for (i = 0; i < fmt->num_planes; i++)
>>> +   sizes[0] += mplane_fmt->plane_fmt[i].sizeimage;
>>> +   } else if (fmt->num_buffers == fmt->num_planes) {
>>> +   for (i = 0; i < fmt->num_planes; i++)
>>> +   sizes[i] = mplane_fmt->plane_fmt[i].sizeimage;
>>> +   } else {
>>> +   return -EINVAL;
>>> +   }
>>> +
>>> +   *nplanes = fmt->num_buffers;
>>
>> This code does not take VIDIOC_CREATE_BUFFERS into account.
>>
>> If it is called from that ioctl, then *nplanes is non-zero and you need
>> to check if *nplanes equals fmt->num_buffers and that sizes[n] is >=
>> the required size of the format. If so, then return 0, otherwise return
>> -EINVAL.
> 
> Thanks for spotting this, I'll fix it as you suggested in the next
> revision.
> 
>> Doesn't v4l2-compliance fail on that? Or is that test skipped because this
>> is a decoder for which streaming is not supported (yet)?
> 
> Apparently, v4l2-compliance doesn't fail since I'm getting:
> test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK

It is tested, but only with the -s option. I'll see if I can improve the
tests.

Regards,

Hans
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel