All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F
@ 2018-11-27 13:59 Clément Péron
  2018-11-27 14:47 ` Schrempf Frieder
  0 siblings, 1 reply; 5+ messages in thread
From: Clément Péron @ 2018-11-27 13:59 UTC (permalink / raw)
  To: Boris Brezillon, Miquel Raynal; +Cc: linux-mtd, Clément Péron

Add support for Toshiba chip TC58CVG2S0F

Signed-off-by: Clément Péron <peron.clem@gmail.com>
---

Hi,

Thanks a lot for adding this framework to Linux it's very nice and easy to read.

This is my first SPI Nand/Nand board so I'm still unfamiliar with those BBM and OOB features.

In the ECC status maybe I should return the Maximum Bit Flip Count (page 34 of the DS) like it's done for Macronix.

Datasheet could be found here: https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/TC58CVG2S0HxAIx_Rev1.1_2016-11-08.pdf


Also this has not been fully tested and untested with a QuadSPI controller.

Thanks,
Clement


 drivers/mtd/nand/spi/Makefile  |   2 +-
 drivers/mtd/nand/spi/core.c    |   1 +
 drivers/mtd/nand/spi/toshiba.c | 112 +++++++++++++++++++++++++++++++++
 include/linux/mtd/spinand.h    |   1 +
 4 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 drivers/mtd/nand/spi/toshiba.c

diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile
index b74e074b363a..be5f73512ece 100644
--- a/drivers/mtd/nand/spi/Makefile
+++ b/drivers/mtd/nand/spi/Makefile
@@ -1,3 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0
-spinand-objs := core.o macronix.o micron.o winbond.o
+spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
 obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index 30f83649c481..87bdf2a7b724 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -766,6 +766,7 @@ static const struct nand_ops spinand_ops = {
 static const struct spinand_manufacturer *spinand_manufacturers[] = {
 	&macronix_spinand_manufacturer,
 	&micron_spinand_manufacturer,
+	&toshiba_spinand_manufacturer,
 	&winbond_spinand_manufacturer,
 };
 
diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
new file mode 100644
index 000000000000..6ff65949ddd0
--- /dev/null
+++ b/drivers/mtd/nand/spi/toshiba.c
@@ -0,0 +1,112 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Author: Clément Péron <peron.clem@gmail.com>
+ */
+
+#include <linux/device.h>
+#include <linux/kernel.h>
+#include <linux/mtd/spinand.h>
+
+#define SPINAND_MFR_TOSHIBA		0x98
+
+static SPINAND_OP_VARIANTS(read_cache_variants,
+		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
+
+static SPINAND_OP_VARIANTS(write_cache_variants,
+		SPINAND_PROG_LOAD(true, 0, NULL, 0));
+
+static SPINAND_OP_VARIANTS(update_cache_variants,
+		SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
+static int tc58_ooblayout_ecc(struct mtd_info *mtd, int section,
+			      struct mtd_oob_region *region)
+{
+	/* ECC not accesible when Internal ECC is turned on. */
+	return -ERANGE;
+}
+
+static int tc58_ooblayout_free(struct mtd_info *mtd, int section,
+			       struct mtd_oob_region *region)
+{
+	if (section)
+		return -ERANGE;
+
+	/* Reserve 2 bytes for the BBM. */
+	region->offset = 2;
+	region->length = 126;
+
+	return 0;
+}
+
+static const struct mtd_ooblayout_ops tc58_ooblayout = {
+	.ecc = tc58_ooblayout_ecc,
+	.free = tc58_ooblayout_free,
+};
+
+static int tc58_ecc_get_status(struct spinand_device *spinand,
+			       u8 status)
+{
+	switch (status & STATUS_ECC_MASK) {
+	case STATUS_ECC_NO_BITFLIPS:
+		return 0;
+
+	case STATUS_ECC_HAS_BITFLIPS:
+		return 4;
+
+	case STATUS_ECC_UNCOR_ERROR:
+		return -EBADMSG;
+
+	default:
+		return 8;
+	}
+
+	return -EINVAL;
+}
+
+static const struct spinand_info toshiba_spinand_table[] = {
+	SPINAND_INFO("TC58CVG2S0F", 0xCD,
+		     NAND_MEMORG(1, SZ_4K, 256, 64, 2048, 1, 1, 1),
+		     NAND_ECCREQ(8, 512),
+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+					      &write_cache_variants,
+					      &update_cache_variants),
+		     0,
+		     SPINAND_ECCINFO(&tc58_ooblayout, tc58_ecc_get_status)),
+};
+/**
+ * toshiba_spinand_detect - initialize device related part in spinand_device
+ * struct if it is a Toshiba device.
+ * @spinand: SPI NAND device structure
+ */
+static int toshiba_spinand_detect(struct spinand_device *spinand)
+{
+	u8 *id = spinand->id.data;
+	int ret;
+
+	/*
+	 * Toshiba SPI NAND read ID need a dummy byte,
+	 * so the first byte in raw_id is dummy.
+	 */
+	if (id[1] != SPINAND_MFR_TOSHIBA)
+		return 0;
+
+	ret = spinand_match_and_init(spinand, toshiba_spinand_table,
+				     ARRAY_SIZE(toshiba_spinand_table), id[2]);
+	if (ret)
+		return ret;
+
+	return 1;
+}
+
+static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
+	.detect = toshiba_spinand_detect,
+};
+
+const struct spinand_manufacturer toshiba_spinand_manufacturer = {
+	.id = SPINAND_MFR_TOSHIBA,
+	.name = "Toshiba",
+	.ops = &toshiba_spinand_manuf_ops,
+};
diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h
index 088ff96c3eb6..816c4b00abca 100644
--- a/include/linux/mtd/spinand.h
+++ b/include/linux/mtd/spinand.h
@@ -196,6 +196,7 @@ struct spinand_manufacturer {
 /* SPI NAND manufacturers */
 extern const struct spinand_manufacturer macronix_spinand_manufacturer;
 extern const struct spinand_manufacturer micron_spinand_manufacturer;
+extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
 extern const struct spinand_manufacturer winbond_spinand_manufacturer;
 
 /**
-- 
2.19.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F
  2018-11-27 13:59 [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F Clément Péron
@ 2018-11-27 14:47 ` Schrempf Frieder
  2018-11-27 14:59   ` Clément Péron
  0 siblings, 1 reply; 5+ messages in thread
From: Schrempf Frieder @ 2018-11-27 14:47 UTC (permalink / raw)
  To: Clément Péron, Boris Brezillon, Miquel Raynal; +Cc: linux-mtd

Hello Clément,

On 27.11.18 14:59, Clément Péron wrote:
> Add support for Toshiba chip TC58CVG2S0F
> 
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
> ---
> 
> Hi,
> 
> Thanks a lot for adding this framework to Linux it's very nice and easy to read.
> 
> This is my first SPI Nand/Nand board so I'm still unfamiliar with those BBM and OOB features.
> 
> In the ECC status maybe I should return the Maximum Bit Flip Count (page 34 of the DS) like it's done for Macronix.
> 
> Datasheet could be found here: https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/TC58CVG2S0HxAIx_Rev1.1_2016-11-08.pdf
> 
> 
> Also this has not been fully tested and untested with a QuadSPI controller.

I'm afraid there is a big overlap between your patch and what I posted 
some days ago. See here: Patchwork [1] or linux-next [2].

Please have a look at my patch and test it with your hardware. You seem 
to use the same chip as I am (except for the last letter in the part 
number, whose meaning I don't know).

Thanks,
Frieder

[1] https://patchwork.ozlabs.org/patch/994687/
[2] 
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/mtd/nand/spi?h=next-20181127&id=f85fd9a073f7a0f063d046c07f0558c03b1d90de

> 
> Thanks,
> Clement
> 
> 
>   drivers/mtd/nand/spi/Makefile  |   2 +-
>   drivers/mtd/nand/spi/core.c    |   1 +
>   drivers/mtd/nand/spi/toshiba.c | 112 +++++++++++++++++++++++++++++++++
>   include/linux/mtd/spinand.h    |   1 +
>   4 files changed, 115 insertions(+), 1 deletion(-)
>   create mode 100644 drivers/mtd/nand/spi/toshiba.c
> 
> diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile
> index b74e074b363a..be5f73512ece 100644
> --- a/drivers/mtd/nand/spi/Makefile
> +++ b/drivers/mtd/nand/spi/Makefile
> @@ -1,3 +1,3 @@
>   # SPDX-License-Identifier: GPL-2.0
> -spinand-objs := core.o macronix.o micron.o winbond.o
> +spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
>   obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
> diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> index 30f83649c481..87bdf2a7b724 100644
> --- a/drivers/mtd/nand/spi/core.c
> +++ b/drivers/mtd/nand/spi/core.c
> @@ -766,6 +766,7 @@ static const struct nand_ops spinand_ops = {
>   static const struct spinand_manufacturer *spinand_manufacturers[] = {
>   	&macronix_spinand_manufacturer,
>   	&micron_spinand_manufacturer,
> +	&toshiba_spinand_manufacturer,
>   	&winbond_spinand_manufacturer,
>   };
>   
> diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
> new file mode 100644
> index 000000000000..6ff65949ddd0
> --- /dev/null
> +++ b/drivers/mtd/nand/spi/toshiba.c
> @@ -0,0 +1,112 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Author: Clément Péron <peron.clem@gmail.com>
> + */
> +
> +#include <linux/device.h>
> +#include <linux/kernel.h>
> +#include <linux/mtd/spinand.h>
> +
> +#define SPINAND_MFR_TOSHIBA		0x98
> +
> +static SPINAND_OP_VARIANTS(read_cache_variants,
> +		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
> +		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
> +		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
> +		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
> +
> +static SPINAND_OP_VARIANTS(write_cache_variants,
> +		SPINAND_PROG_LOAD(true, 0, NULL, 0));
> +
> +static SPINAND_OP_VARIANTS(update_cache_variants,
> +		SPINAND_PROG_LOAD(false, 0, NULL, 0));
> +
> +static int tc58_ooblayout_ecc(struct mtd_info *mtd, int section,
> +			      struct mtd_oob_region *region)
> +{
> +	/* ECC not accesible when Internal ECC is turned on. */
> +	return -ERANGE;
> +}
> +
> +static int tc58_ooblayout_free(struct mtd_info *mtd, int section,
> +			       struct mtd_oob_region *region)
> +{
> +	if (section)
> +		return -ERANGE;
> +
> +	/* Reserve 2 bytes for the BBM. */
> +	region->offset = 2;
> +	region->length = 126;
> +
> +	return 0;
> +}
> +
> +static const struct mtd_ooblayout_ops tc58_ooblayout = {
> +	.ecc = tc58_ooblayout_ecc,
> +	.free = tc58_ooblayout_free,
> +};
> +
> +static int tc58_ecc_get_status(struct spinand_device *spinand,
> +			       u8 status)
> +{
> +	switch (status & STATUS_ECC_MASK) {
> +	case STATUS_ECC_NO_BITFLIPS:
> +		return 0;
> +
> +	case STATUS_ECC_HAS_BITFLIPS:
> +		return 4;
> +
> +	case STATUS_ECC_UNCOR_ERROR:
> +		return -EBADMSG;
> +
> +	default:
> +		return 8;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +static const struct spinand_info toshiba_spinand_table[] = {
> +	SPINAND_INFO("TC58CVG2S0F", 0xCD,
> +		     NAND_MEMORG(1, SZ_4K, 256, 64, 2048, 1, 1, 1),
> +		     NAND_ECCREQ(8, 512),
> +		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> +					      &write_cache_variants,
> +					      &update_cache_variants),
> +		     0,
> +		     SPINAND_ECCINFO(&tc58_ooblayout, tc58_ecc_get_status)),
> +};
> +/**
> + * toshiba_spinand_detect - initialize device related part in spinand_device
> + * struct if it is a Toshiba device.
> + * @spinand: SPI NAND device structure
> + */
> +static int toshiba_spinand_detect(struct spinand_device *spinand)
> +{
> +	u8 *id = spinand->id.data;
> +	int ret;
> +
> +	/*
> +	 * Toshiba SPI NAND read ID need a dummy byte,
> +	 * so the first byte in raw_id is dummy.
> +	 */
> +	if (id[1] != SPINAND_MFR_TOSHIBA)
> +		return 0;
> +
> +	ret = spinand_match_and_init(spinand, toshiba_spinand_table,
> +				     ARRAY_SIZE(toshiba_spinand_table), id[2]);
> +	if (ret)
> +		return ret;
> +
> +	return 1;
> +}
> +
> +static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
> +	.detect = toshiba_spinand_detect,
> +};
> +
> +const struct spinand_manufacturer toshiba_spinand_manufacturer = {
> +	.id = SPINAND_MFR_TOSHIBA,
> +	.name = "Toshiba",
> +	.ops = &toshiba_spinand_manuf_ops,
> +};
> diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h
> index 088ff96c3eb6..816c4b00abca 100644
> --- a/include/linux/mtd/spinand.h
> +++ b/include/linux/mtd/spinand.h
> @@ -196,6 +196,7 @@ struct spinand_manufacturer {
>   /* SPI NAND manufacturers */
>   extern const struct spinand_manufacturer macronix_spinand_manufacturer;
>   extern const struct spinand_manufacturer micron_spinand_manufacturer;
> +extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
>   extern const struct spinand_manufacturer winbond_spinand_manufacturer;
>   
>   /**
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F
  2018-11-27 14:47 ` Schrempf Frieder
@ 2018-11-27 14:59   ` Clément Péron
  2018-11-27 15:07     ` Clément Péron
  0 siblings, 1 reply; 5+ messages in thread
From: Clément Péron @ 2018-11-27 14:59 UTC (permalink / raw)
  To: frieder.schrempf; +Cc: Boris Brezillon, Miquel Raynal, linux-mtd

Hi Frieder,

On Tue, 27 Nov 2018 at 15:47, Schrempf Frieder
<frieder.schrempf@kontron.de> wrote:
>
> Hello Clément,
>
> On 27.11.18 14:59, Clément Péron wrote:
> > Add support for Toshiba chip TC58CVG2S0F
> >
> > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > ---
> >
> > Hi,
> >
> > Thanks a lot for adding this framework to Linux it's very nice and easy to read.
> >
> > This is my first SPI Nand/Nand board so I'm still unfamiliar with those BBM and OOB features.
> >
> > In the ECC status maybe I should return the Maximum Bit Flip Count (page 34 of the DS) like it's done for Macronix.
> >
> > Datasheet could be found here: https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/TC58CVG2S0HxAIx_Rev1.1_2016-11-08.pdf
> >
> >
> > Also this has not been fully tested and untested with a QuadSPI controller.
>
> I'm afraid there is a big overlap between your patch and what I posted
> some days ago. See here: Patchwork [1] or linux-next [2].
>
> Please have a look at my patch and test it with your hardware. You seem
> to use the same chip as I am (except for the last letter in the part
> number, whose meaning I don't know).

Thanks for pointing that,

I'm not a linux-mtd subscriber could you reply and add my e-mail to your patch ?

Thanks
Clement

>
> Thanks,
> Frieder
>
> [1] https://patchwork.ozlabs.org/patch/994687/
> [2]
> https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/mtd/nand/spi?h=next-20181127&id=f85fd9a073f7a0f063d046c07f0558c03b1d90de
>
> >
> > Thanks,
> > Clement
> >
> >
> >   drivers/mtd/nand/spi/Makefile  |   2 +-
> >   drivers/mtd/nand/spi/core.c    |   1 +
> >   drivers/mtd/nand/spi/toshiba.c | 112 +++++++++++++++++++++++++++++++++
> >   include/linux/mtd/spinand.h    |   1 +
> >   4 files changed, 115 insertions(+), 1 deletion(-)
> >   create mode 100644 drivers/mtd/nand/spi/toshiba.c
> >
> > diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile
> > index b74e074b363a..be5f73512ece 100644
> > --- a/drivers/mtd/nand/spi/Makefile
> > +++ b/drivers/mtd/nand/spi/Makefile
> > @@ -1,3 +1,3 @@
> >   # SPDX-License-Identifier: GPL-2.0
> > -spinand-objs := core.o macronix.o micron.o winbond.o
> > +spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
> >   obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
> > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > index 30f83649c481..87bdf2a7b724 100644
> > --- a/drivers/mtd/nand/spi/core.c
> > +++ b/drivers/mtd/nand/spi/core.c
> > @@ -766,6 +766,7 @@ static const struct nand_ops spinand_ops = {
> >   static const struct spinand_manufacturer *spinand_manufacturers[] = {
> >       &macronix_spinand_manufacturer,
> >       &micron_spinand_manufacturer,
> > +     &toshiba_spinand_manufacturer,
> >       &winbond_spinand_manufacturer,
> >   };
> >
> > diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
> > new file mode 100644
> > index 000000000000..6ff65949ddd0
> > --- /dev/null
> > +++ b/drivers/mtd/nand/spi/toshiba.c
> > @@ -0,0 +1,112 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Author: Clément Péron <peron.clem@gmail.com>
> > + */
> > +
> > +#include <linux/device.h>
> > +#include <linux/kernel.h>
> > +#include <linux/mtd/spinand.h>
> > +
> > +#define SPINAND_MFR_TOSHIBA          0x98
> > +
> > +static SPINAND_OP_VARIANTS(read_cache_variants,
> > +             SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
> > +             SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
> > +             SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
> > +             SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
> > +
> > +static SPINAND_OP_VARIANTS(write_cache_variants,
> > +             SPINAND_PROG_LOAD(true, 0, NULL, 0));
> > +
> > +static SPINAND_OP_VARIANTS(update_cache_variants,
> > +             SPINAND_PROG_LOAD(false, 0, NULL, 0));
> > +
> > +static int tc58_ooblayout_ecc(struct mtd_info *mtd, int section,
> > +                           struct mtd_oob_region *region)
> > +{
> > +     /* ECC not accesible when Internal ECC is turned on. */
> > +     return -ERANGE;
> > +}
> > +
> > +static int tc58_ooblayout_free(struct mtd_info *mtd, int section,
> > +                            struct mtd_oob_region *region)
> > +{
> > +     if (section)
> > +             return -ERANGE;
> > +
> > +     /* Reserve 2 bytes for the BBM. */
> > +     region->offset = 2;
> > +     region->length = 126;
> > +
> > +     return 0;
> > +}
> > +
> > +static const struct mtd_ooblayout_ops tc58_ooblayout = {
> > +     .ecc = tc58_ooblayout_ecc,
> > +     .free = tc58_ooblayout_free,
> > +};
> > +
> > +static int tc58_ecc_get_status(struct spinand_device *spinand,
> > +                            u8 status)
> > +{
> > +     switch (status & STATUS_ECC_MASK) {
> > +     case STATUS_ECC_NO_BITFLIPS:
> > +             return 0;
> > +
> > +     case STATUS_ECC_HAS_BITFLIPS:
> > +             return 4;
> > +
> > +     case STATUS_ECC_UNCOR_ERROR:
> > +             return -EBADMSG;
> > +
> > +     default:
> > +             return 8;
> > +     }
> > +
> > +     return -EINVAL;
> > +}
> > +
> > +static const struct spinand_info toshiba_spinand_table[] = {
> > +     SPINAND_INFO("TC58CVG2S0F", 0xCD,
> > +                  NAND_MEMORG(1, SZ_4K, 256, 64, 2048, 1, 1, 1),
> > +                  NAND_ECCREQ(8, 512),
> > +                  SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> > +                                           &write_cache_variants,
> > +                                           &update_cache_variants),
> > +                  0,
> > +                  SPINAND_ECCINFO(&tc58_ooblayout, tc58_ecc_get_status)),
> > +};
> > +/**
> > + * toshiba_spinand_detect - initialize device related part in spinand_device
> > + * struct if it is a Toshiba device.
> > + * @spinand: SPI NAND device structure
> > + */
> > +static int toshiba_spinand_detect(struct spinand_device *spinand)
> > +{
> > +     u8 *id = spinand->id.data;
> > +     int ret;
> > +
> > +     /*
> > +      * Toshiba SPI NAND read ID need a dummy byte,
> > +      * so the first byte in raw_id is dummy.
> > +      */
> > +     if (id[1] != SPINAND_MFR_TOSHIBA)
> > +             return 0;
> > +
> > +     ret = spinand_match_and_init(spinand, toshiba_spinand_table,
> > +                                  ARRAY_SIZE(toshiba_spinand_table), id[2]);
> > +     if (ret)
> > +             return ret;
> > +
> > +     return 1;
> > +}
> > +
> > +static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
> > +     .detect = toshiba_spinand_detect,
> > +};
> > +
> > +const struct spinand_manufacturer toshiba_spinand_manufacturer = {
> > +     .id = SPINAND_MFR_TOSHIBA,
> > +     .name = "Toshiba",
> > +     .ops = &toshiba_spinand_manuf_ops,
> > +};
> > diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h
> > index 088ff96c3eb6..816c4b00abca 100644
> > --- a/include/linux/mtd/spinand.h
> > +++ b/include/linux/mtd/spinand.h
> > @@ -196,6 +196,7 @@ struct spinand_manufacturer {
> >   /* SPI NAND manufacturers */
> >   extern const struct spinand_manufacturer macronix_spinand_manufacturer;
> >   extern const struct spinand_manufacturer micron_spinand_manufacturer;
> > +extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
> >   extern const struct spinand_manufacturer winbond_spinand_manufacturer;
> >
> >   /**
> >

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F
  2018-11-27 14:59   ` Clément Péron
@ 2018-11-27 15:07     ` Clément Péron
  2018-11-27 15:15       ` Schrempf Frieder
  0 siblings, 1 reply; 5+ messages in thread
From: Clément Péron @ 2018-11-27 15:07 UTC (permalink / raw)
  To: frieder.schrempf; +Cc: Boris Brezillon, Miquel Raynal, linux-mtd

On Tue, 27 Nov 2018 at 15:59, Clément Péron <peron.clem@gmail.com> wrote:
>
> Hi Frieder,
>
> On Tue, 27 Nov 2018 at 15:47, Schrempf Frieder
> <frieder.schrempf@kontron.de> wrote:
> >
> > Hello Clément,
> >
> > On 27.11.18 14:59, Clément Péron wrote:
> > > Add support for Toshiba chip TC58CVG2S0F
> > >
> > > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > > ---
> > >
> > > Hi,
> > >
> > > Thanks a lot for adding this framework to Linux it's very nice and easy to read.
> > >
> > > This is my first SPI Nand/Nand board so I'm still unfamiliar with those BBM and OOB features.
> > >
> > > In the ECC status maybe I should return the Maximum Bit Flip Count (page 34 of the DS) like it's done for Macronix.
> > >
> > > Datasheet could be found here: https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/TC58CVG2S0HxAIx_Rev1.1_2016-11-08.pdf
> > >
> > >
> > > Also this has not been fully tested and untested with a QuadSPI controller.
> >
> > I'm afraid there is a big overlap between your patch and what I posted
> > some days ago. See here: Patchwork [1] or linux-next [2].
> >
> > Please have a look at my patch and test it with your hardware. You seem
> > to use the same chip as I am (except for the last letter in the part
> > number, whose meaning I don't know).
>
> Thanks for pointing that,
>
> I'm not a linux-mtd subscriber could you reply and add my e-mail to your patch ?
Or maybe as it has already been merged maybe I should write a new
e-mail with my remark no ?

Thanks,
Clement

>
> Thanks
> Clement
>
> >
> > Thanks,
> > Frieder
> >
> > [1] https://patchwork.ozlabs.org/patch/994687/
> > [2]
> > https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/mtd/nand/spi?h=next-20181127&id=f85fd9a073f7a0f063d046c07f0558c03b1d90de
> >
> > >
> > > Thanks,
> > > Clement
> > >
> > >
> > >   drivers/mtd/nand/spi/Makefile  |   2 +-
> > >   drivers/mtd/nand/spi/core.c    |   1 +
> > >   drivers/mtd/nand/spi/toshiba.c | 112 +++++++++++++++++++++++++++++++++
> > >   include/linux/mtd/spinand.h    |   1 +
> > >   4 files changed, 115 insertions(+), 1 deletion(-)
> > >   create mode 100644 drivers/mtd/nand/spi/toshiba.c
> > >
> > > diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile
> > > index b74e074b363a..be5f73512ece 100644
> > > --- a/drivers/mtd/nand/spi/Makefile
> > > +++ b/drivers/mtd/nand/spi/Makefile
> > > @@ -1,3 +1,3 @@
> > >   # SPDX-License-Identifier: GPL-2.0
> > > -spinand-objs := core.o macronix.o micron.o winbond.o
> > > +spinand-objs := core.o macronix.o micron.o toshiba.o winbond.o
> > >   obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
> > > diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
> > > index 30f83649c481..87bdf2a7b724 100644
> > > --- a/drivers/mtd/nand/spi/core.c
> > > +++ b/drivers/mtd/nand/spi/core.c
> > > @@ -766,6 +766,7 @@ static const struct nand_ops spinand_ops = {
> > >   static const struct spinand_manufacturer *spinand_manufacturers[] = {
> > >       &macronix_spinand_manufacturer,
> > >       &micron_spinand_manufacturer,
> > > +     &toshiba_spinand_manufacturer,
> > >       &winbond_spinand_manufacturer,
> > >   };
> > >
> > > diff --git a/drivers/mtd/nand/spi/toshiba.c b/drivers/mtd/nand/spi/toshiba.c
> > > new file mode 100644
> > > index 000000000000..6ff65949ddd0
> > > --- /dev/null
> > > +++ b/drivers/mtd/nand/spi/toshiba.c
> > > @@ -0,0 +1,112 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +/*
> > > + * Author: Clément Péron <peron.clem@gmail.com>
> > > + */
> > > +
> > > +#include <linux/device.h>
> > > +#include <linux/kernel.h>
> > > +#include <linux/mtd/spinand.h>
> > > +
> > > +#define SPINAND_MFR_TOSHIBA          0x98
> > > +
> > > +static SPINAND_OP_VARIANTS(read_cache_variants,
> > > +             SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
> > > +             SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
> > > +             SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
> > > +             SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
> > > +
> > > +static SPINAND_OP_VARIANTS(write_cache_variants,
> > > +             SPINAND_PROG_LOAD(true, 0, NULL, 0));
> > > +
> > > +static SPINAND_OP_VARIANTS(update_cache_variants,
> > > +             SPINAND_PROG_LOAD(false, 0, NULL, 0));
> > > +
> > > +static int tc58_ooblayout_ecc(struct mtd_info *mtd, int section,
> > > +                           struct mtd_oob_region *region)
> > > +{
> > > +     /* ECC not accesible when Internal ECC is turned on. */
> > > +     return -ERANGE;
> > > +}
> > > +
> > > +static int tc58_ooblayout_free(struct mtd_info *mtd, int section,
> > > +                            struct mtd_oob_region *region)
> > > +{
> > > +     if (section)
> > > +             return -ERANGE;
> > > +
> > > +     /* Reserve 2 bytes for the BBM. */
> > > +     region->offset = 2;
> > > +     region->length = 126;
> > > +
> > > +     return 0;
> > > +}
> > > +
> > > +static const struct mtd_ooblayout_ops tc58_ooblayout = {
> > > +     .ecc = tc58_ooblayout_ecc,
> > > +     .free = tc58_ooblayout_free,
> > > +};
> > > +
> > > +static int tc58_ecc_get_status(struct spinand_device *spinand,
> > > +                            u8 status)
> > > +{
> > > +     switch (status & STATUS_ECC_MASK) {
> > > +     case STATUS_ECC_NO_BITFLIPS:
> > > +             return 0;
> > > +
> > > +     case STATUS_ECC_HAS_BITFLIPS:
> > > +             return 4;
> > > +
> > > +     case STATUS_ECC_UNCOR_ERROR:
> > > +             return -EBADMSG;
> > > +
> > > +     default:
> > > +             return 8;
> > > +     }
> > > +
> > > +     return -EINVAL;
> > > +}
> > > +
> > > +static const struct spinand_info toshiba_spinand_table[] = {
> > > +     SPINAND_INFO("TC58CVG2S0F", 0xCD,
> > > +                  NAND_MEMORG(1, SZ_4K, 256, 64, 2048, 1, 1, 1),
> > > +                  NAND_ECCREQ(8, 512),
> > > +                  SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
> > > +                                           &write_cache_variants,
> > > +                                           &update_cache_variants),
> > > +                  0,
> > > +                  SPINAND_ECCINFO(&tc58_ooblayout, tc58_ecc_get_status)),
> > > +};
> > > +/**
> > > + * toshiba_spinand_detect - initialize device related part in spinand_device
> > > + * struct if it is a Toshiba device.
> > > + * @spinand: SPI NAND device structure
> > > + */
> > > +static int toshiba_spinand_detect(struct spinand_device *spinand)
> > > +{
> > > +     u8 *id = spinand->id.data;
> > > +     int ret;
> > > +
> > > +     /*
> > > +      * Toshiba SPI NAND read ID need a dummy byte,
> > > +      * so the first byte in raw_id is dummy.
> > > +      */
> > > +     if (id[1] != SPINAND_MFR_TOSHIBA)
> > > +             return 0;
> > > +
> > > +     ret = spinand_match_and_init(spinand, toshiba_spinand_table,
> > > +                                  ARRAY_SIZE(toshiba_spinand_table), id[2]);
> > > +     if (ret)
> > > +             return ret;
> > > +
> > > +     return 1;
> > > +}
> > > +
> > > +static const struct spinand_manufacturer_ops toshiba_spinand_manuf_ops = {
> > > +     .detect = toshiba_spinand_detect,
> > > +};
> > > +
> > > +const struct spinand_manufacturer toshiba_spinand_manufacturer = {
> > > +     .id = SPINAND_MFR_TOSHIBA,
> > > +     .name = "Toshiba",
> > > +     .ops = &toshiba_spinand_manuf_ops,
> > > +};
> > > diff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h
> > > index 088ff96c3eb6..816c4b00abca 100644
> > > --- a/include/linux/mtd/spinand.h
> > > +++ b/include/linux/mtd/spinand.h
> > > @@ -196,6 +196,7 @@ struct spinand_manufacturer {
> > >   /* SPI NAND manufacturers */
> > >   extern const struct spinand_manufacturer macronix_spinand_manufacturer;
> > >   extern const struct spinand_manufacturer micron_spinand_manufacturer;
> > > +extern const struct spinand_manufacturer toshiba_spinand_manufacturer;
> > >   extern const struct spinand_manufacturer winbond_spinand_manufacturer;
> > >
> > >   /**
> > >

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F
  2018-11-27 15:07     ` Clément Péron
@ 2018-11-27 15:15       ` Schrempf Frieder
  0 siblings, 0 replies; 5+ messages in thread
From: Schrempf Frieder @ 2018-11-27 15:15 UTC (permalink / raw)
  To: Clément Péron; +Cc: Boris Brezillon, Miquel Raynal, linux-mtd

On 27.11.18 16:07, Clément Péron wrote:
> On Tue, 27 Nov 2018 at 15:59, Clément Péron <peron.clem@gmail.com> wrote:
>>
>> Hi Frieder,
>>
>> On Tue, 27 Nov 2018 at 15:47, Schrempf Frieder
>> <frieder.schrempf@kontron.de> wrote:
>>>
>>> Hello Clément,
>>>
>>> On 27.11.18 14:59, Clément Péron wrote:
>>>> Add support for Toshiba chip TC58CVG2S0F
>>>>
>>>> Signed-off-by: Clément Péron <peron.clem@gmail.com>
>>>> ---
>>>>
>>>> Hi,
>>>>
>>>> Thanks a lot for adding this framework to Linux it's very nice and easy to read.
>>>>
>>>> This is my first SPI Nand/Nand board so I'm still unfamiliar with those BBM and OOB features.
>>>>
>>>> In the ECC status maybe I should return the Maximum Bit Flip Count (page 34 of the DS) like it's done for Macronix.
>>>>
>>>> Datasheet could be found here: https://media.digikey.com/pdf/Data%20Sheets/Toshiba%20PDFs/TC58CVG2S0HxAIx_Rev1.1_2016-11-08.pdf
>>>>
>>>>
>>>> Also this has not been fully tested and untested with a QuadSPI controller.
>>>
>>> I'm afraid there is a big overlap between your patch and what I posted
>>> some days ago. See here: Patchwork [1] or linux-next [2].
>>>
>>> Please have a look at my patch and test it with your hardware. You seem
>>> to use the same chip as I am (except for the last letter in the part
>>> number, whose meaning I don't know).
>>
>> Thanks for pointing that,
>>
>> I'm not a linux-mtd subscriber could you reply and add my e-mail to your patch ?
> Or maybe as it has already been merged maybe I should write a new
> e-mail with my remark no ?

Hm, I'm not sure. I have sent a copy of the original patch to you. I 
guess you can still reply with your comments and we will see how to deal 
with them.

If there are any issues, please let us know so we can apply fixes on top 
of the current patch.

Thanks,
Frieder

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-11-27 15:16 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-27 13:59 [RFC] mtd: spinand: Add initial support for Toshiba TC58CVG2S0F Clément Péron
2018-11-27 14:47 ` Schrempf Frieder
2018-11-27 14:59   ` Clément Péron
2018-11-27 15:07     ` Clément Péron
2018-11-27 15:15       ` Schrempf Frieder

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.