diff mbox series

[v5,1/2] mtd: spinand: Add support for setting plane select bits

Message ID 20240830100310.1553675-2-linchengming884@gmail.com
State New
Headers show
Series Add support for two-plane serial NAND flash | expand

Commit Message

Cheng Ming Lin Aug. 30, 2024, 10:03 a.m. UTC
From: Cheng Ming Lin <chengminglin@mxic.com.tw>

Add two flags for inserting the Plane Select bit into the column
address during the write_to_cache and the read_from_cache operation.

Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash
that require inserting the Plane Select bit into the column address
during the write_to_cache operation.

Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
that require inserting the Plane Select bit into the column address
during the read_from_cache operation.

Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
---
 drivers/mtd/nand/spi/core.c | 6 ++++++
 include/linux/mtd/spinand.h | 2 ++
 2 files changed, 8 insertions(+)

Comments

Miquel Raynal Aug. 30, 2024, 3:55 p.m. UTC | #1
Hi ChengMing,

linchengming884@gmail.com wrote on Fri, 30 Aug 2024 18:03:09 +0800:

> From: Cheng Ming Lin <chengminglin@mxic.com.tw>
> 
> Add two flags for inserting the Plane Select bit into the column
> address during the write_to_cache and the read_from_cache operation.
> 
> Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash

This flag has been renamed :)

> that require inserting the Plane Select bit into the column address
> during the write_to_cache operation.
> 
> Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
> that require inserting the Plane Select bit into the column address
> during the read_from_cache operation.
> 
> Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
> ---
>  drivers/mtd/nand/spi/core.c | 6 ++++++
>  include/linux/mtd/spinand.h | 2 ++
>  2 files changed, 8 insertions(+)
> 
> diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> index e0b6715e5dfe..e7b592cdbb4c 100644
> --- a/drivers/mtd/nand/spi/core.c
> +++ b/drivers/mtd/nand/spi/core.c
> @@ -386,6 +386,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
>  	else
>  		rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
>  
> +	if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
> +		column |= req->pos.plane << fls(nanddev_page_size(nand));

Isn't there any better way to know what the bit position is?

Thanks,
Miquèl
Cheng Ming Lin Sept. 2, 2024, 8:37 a.m. UTC | #2
Hi Miquel,

Miquel Raynal <miquel.raynal@bootlin.com> 於 2024年8月30日 週五 下午11:55寫道:
>
> Hi ChengMing,
>
> linchengming884@gmail.com wrote on Fri, 30 Aug 2024 18:03:09 +0800:
>
> > From: Cheng Ming Lin <chengminglin@mxic.com.tw>
> >
> > Add two flags for inserting the Plane Select bit into the column
> > address during the write_to_cache and the read_from_cache operation.
> >
> > Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash
>
> This flag has been renamed :)

Thank you for the reminder. I will make the necessary changes.

>
> > that require inserting the Plane Select bit into the column address
> > during the write_to_cache operation.
> >
> > Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
> > that require inserting the Plane Select bit into the column address
> > during the read_from_cache operation.
> >
> > Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > ---
> >  drivers/mtd/nand/spi/core.c | 6 ++++++
> >  include/linux/mtd/spinand.h | 2 ++
> >  2 files changed, 8 insertions(+)
> >
> > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > index e0b6715e5dfe..e7b592cdbb4c 100644
> > --- a/drivers/mtd/nand/spi/core.c
> > +++ b/drivers/mtd/nand/spi/core.c
> > @@ -386,6 +386,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
> >       else
> >               rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
> >
> > +     if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
> > +             column |= req->pos.plane << fls(nanddev_page_size(nand));
>
> Isn't there any better way to know what the bit position is?

There are two other methods to determine the bit position:
- column |=

>
> Thanks,
> Miquèl
Cheng Ming Lin Sept. 2, 2024, 8:42 a.m. UTC | #3
Hi Miquel,

I accidentally sent the previous email before it was finished.

Miquel Raynal <miquel.raynal@bootlin.com> 於 2024年8月30日 週五 下午11:55寫道:
>
> Hi ChengMing,
>
> linchengming884@gmail.com wrote on Fri, 30 Aug 2024 18:03:09 +0800:
>
> > From: Cheng Ming Lin <chengminglin@mxic.com.tw>
> >
> > Add two flags for inserting the Plane Select bit into the column
> > address during the write_to_cache and the read_from_cache operation.
> >
> > Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash
>
> This flag has been renamed :)

Thank you for the reminder. I will make the necessary changes.

>
> > that require inserting the Plane Select bit into the column address
> > during the write_to_cache operation.
> >
> > Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
> > that require inserting the Plane Select bit into the column address
> > during the read_from_cache operation.
> >
> > Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > ---
> >  drivers/mtd/nand/spi/core.c | 6 ++++++
> >  include/linux/mtd/spinand.h | 2 ++
> >  2 files changed, 8 insertions(+)
> >
> > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > index e0b6715e5dfe..e7b592cdbb4c 100644
> > --- a/drivers/mtd/nand/spi/core.c
> > +++ b/drivers/mtd/nand/spi/core.c
> > @@ -386,6 +386,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
> >       else
> >               rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
> >
> > +     if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
> > +             column |= req->pos.plane << fls(nanddev_page_size(nand));
>
> Isn't there any better way to know what the bit position is?

There are two other methods to determine the bit position:
- column |= res->pos.plane << fls(nand->memorg.pagesize)
- column |= wdesc->info.offset

>
> Thanks,
> Miquèl

Thanks,
Cheng Ming Lin
Miquel Raynal Sept. 2, 2024, 12:28 p.m. UTC | #4
Hi Cheng,

linchengming884@gmail.com wrote on Mon, 2 Sep 2024 16:42:55 +0800:

> Hi Miquel,
> 
> I accidentally sent the previous email before it was finished.
> 
> Miquel Raynal <miquel.raynal@bootlin.com> 於 2024年8月30日 週五 下午11:55寫道:
> >
> > Hi ChengMing,
> >
> > linchengming884@gmail.com wrote on Fri, 30 Aug 2024 18:03:09 +0800:
> >  
> > > From: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > >
> > > Add two flags for inserting the Plane Select bit into the column
> > > address during the write_to_cache and the read_from_cache operation.
> > >
> > > Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash  
> >
> > This flag has been renamed :)  
> 
> Thank you for the reminder. I will make the necessary changes.
> 
> >  
> > > that require inserting the Plane Select bit into the column address
> > > during the write_to_cache operation.
> > >
> > > Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
> > > that require inserting the Plane Select bit into the column address
> > > during the read_from_cache operation.
> > >
> > > Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > > ---
> > >  drivers/mtd/nand/spi/core.c | 6 ++++++
> > >  include/linux/mtd/spinand.h | 2 ++
> > >  2 files changed, 8 insertions(+)
> > >
> > > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > > index e0b6715e5dfe..e7b592cdbb4c 100644
> > > --- a/drivers/mtd/nand/spi/core.c
> > > +++ b/drivers/mtd/nand/spi/core.c
> > > @@ -386,6 +386,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
> > >       else
> > >               rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
> > >
> > > +     if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
> > > +             column |= req->pos.plane << fls(nanddev_page_size(nand));  
> >
> > Isn't there any better way to know what the bit position is?  
> 
> There are two other methods to determine the bit position:
> - column |= res->pos.plane << fls(nand->memorg.pagesize)
> - column |= wdesc->info.offset

Ok, let's keep it is as-is for now.

Thanks,
Miquèl
Cheng Ming Lin Sept. 3, 2024, 1:16 a.m. UTC | #5
Hi Miquel,

Miquel Raynal <miquel.raynal@bootlin.com> 於 2024年9月2日 週一 下午8:28寫道:
>
> Hi Cheng,
>
> linchengming884@gmail.com wrote on Mon, 2 Sep 2024 16:42:55 +0800:
>
> > Hi Miquel,
> >
> > I accidentally sent the previous email before it was finished.
> >
> > Miquel Raynal <miquel.raynal@bootlin.com> 於 2024年8月30日 週五 下午11:55寫道:
> > >
> > > Hi ChengMing,
> > >
> > > linchengming884@gmail.com wrote on Fri, 30 Aug 2024 18:03:09 +0800:
> > >
> > > > From: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > > >
> > > > Add two flags for inserting the Plane Select bit into the column
> > > > address during the write_to_cache and the read_from_cache operation.
> > > >
> > > > Add the SPINAND_HAS_PP_PLANE_SELECT_BIT flag for serial NAND flash
> > >
> > > This flag has been renamed :)
> >
> > Thank you for the reminder. I will make the necessary changes.
> >
> > >
> > > > that require inserting the Plane Select bit into the column address
> > > > during the write_to_cache operation.
> > > >
> > > > Add the SPINAND_HAS_READ_PLANE_SELECT_BIT flag for serial NAND flash
> > > > that require inserting the Plane Select bit into the column address
> > > > during the read_from_cache operation.
> > > >
> > > > Signed-off-by: Cheng Ming Lin <chengminglin@mxic.com.tw>
> > > > ---
> > > >  drivers/mtd/nand/spi/core.c | 6 ++++++
> > > >  include/linux/mtd/spinand.h | 2 ++
> > > >  2 files changed, 8 insertions(+)
> > > >
> > > > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > > > index e0b6715e5dfe..e7b592cdbb4c 100644
> > > > --- a/drivers/mtd/nand/spi/core.c
> > > > +++ b/drivers/mtd/nand/spi/core.c
> > > > @@ -386,6 +386,9 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,
> > > >       else
> > > >               rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
> > > >
> > > > +     if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
> > > > +             column |= req->pos.plane << fls(nanddev_page_size(nand));
> > >
> > > Isn't there any better way to know what the bit position is?
> >
> > There are two other methods to determine the bit position:
> > - column |= res->pos.plane << fls(nand->memorg.pagesize)
> > - column |= wdesc->info.offset
>
> Ok, let's keep it is as-is for now.
>

Got it. I'll keep it as-is for now.

> Thanks,
> Miquèl

Thanks,
Cheng Ming Lin
diff mbox series

Patch

diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index e0b6715e5dfe..e7b592cdbb4c 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -386,6 +386,9 @@  static int spinand_read_from_cache_op(struct spinand_device *spinand,
 	else
 		rdesc = spinand->dirmaps[req->pos.plane].rdesc_ecc;
 
+	if (spinand->flags & SPINAND_HAS_READ_PLANE_SELECT_BIT)
+		column |= req->pos.plane << fls(nanddev_page_size(nand));
+
 	while (nbytes) {
 		ret = spi_mem_dirmap_read(rdesc, column, nbytes, buf);
 		if (ret < 0)
@@ -460,6 +463,9 @@  static int spinand_write_to_cache_op(struct spinand_device *spinand,
 	else
 		wdesc = spinand->dirmaps[req->pos.plane].wdesc_ecc;
 
+	if (spinand->flags & SPINAND_HAS_PROG_PLANE_SELECT_BIT)
+		column |= req->pos.plane << fls(nanddev_page_size(nand));
+
 	while (nbytes) {
 		ret = spi_mem_dirmap_write(wdesc, column, nbytes, buf);
 		if (ret < 0)
diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h
index 5c19ead60499..0e0df620da53 100644
--- a/include/linux/mtd/spinand.h
+++ b/include/linux/mtd/spinand.h
@@ -312,6 +312,8 @@  struct spinand_ecc_info {
 
 #define SPINAND_HAS_QE_BIT		BIT(0)
 #define SPINAND_HAS_CR_FEAT_BIT		BIT(1)
+#define SPINAND_HAS_PROG_PLANE_SELECT_BIT		BIT(2)
+#define SPINAND_HAS_READ_PLANE_SELECT_BIT		BIT(3)
 
 /**
  * struct spinand_ondie_ecc_conf - private SPI-NAND on-die ECC engine structure