All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/8] sf: Add MTD support to spi_flash
Date: Thu, 29 Oct 2015 07:04:46 +0100	[thread overview]
Message-ID: <5631B6FE.7020606@denx.de> (raw)
In-Reply-To: <1444679655-30349-1-git-send-email-jteki@openedev.com>

Hello Jgan,

Am 12.10.2015 um 21:54 schrieb Jagan Teki:
> This patch adds mtd_info support to spi_flash layer, MTD has
> proven core for flash operations so adding MTD to spi_flash
> will extends more functionality.
>
> Signed-off-by: Jagan Teki <jteki@openedev.com>
> ---
>   drivers/mtd/spi/sf_ops.c   | 45 +++++++++++++++++++++++++--------------------
>   drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++++++--------
>   include/spi_flash.h        |  9 +++++----
>   3 files changed, 48 insertions(+), 32 deletions(-)

Reviewed-by: Heiko Schocher <hs@denx.de>

bye,
Heiko
>
> diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c
> index 703099f..f5ee376 100644
> --- a/drivers/mtd/spi/sf_ops.c
> +++ b/drivers/mtd/spi/sf_ops.c
> @@ -146,7 +146,7 @@ static int spi_flash_read_bar(struct spi_flash *flash, u8 idcode0)
>   	u8 curr_bank = 0;
>   	int ret;
>
> -	if (flash->size <= SPI_FLASH_16MB_BOUN)
> +	if (flash->mtd->size <= SPI_FLASH_16MB_BOUN)
>   		goto bank_end;
>
>   	switch (idcode0) {
> @@ -176,8 +176,8 @@ static void spi_flash_dual(struct spi_flash *flash, u32 *addr)
>   {
>   	switch (flash->dual_flash) {
>   	case SF_DUAL_STACKED_FLASH:
> -		if (*addr >= (flash->size >> 1)) {
> -			*addr -= flash->size >> 1;
> +		if (*addr >= (flash->mtd->size >> 1)) {
> +			*addr -= flash->mtd->size >> 1;
>   			flash->spi->flags |= SPI_XFER_U_PAGE;
>   		} else {
>   			flash->spi->flags &= ~SPI_XFER_U_PAGE;
> @@ -303,7 +303,7 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset,
>   	u8 cmd[SPI_FLASH_CMD_LEN];
>   	int ret = -1;
>
> -	erase_size = flash->erase_size;
> +	erase_size = mtd->erasesize;
>   	if (offset % erase_size || len % erase_size) {
>   		debug("SF: Erase offset/length not multiple of erase size\n");
>   		return -1;
> @@ -693,7 +693,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
>   		return 0;
>   	}
>
> -	if (flash->size != size) {
> +	if (flash->mtd->size != size) {
>   		debug("%s: Memory map must cover entire device\n", __func__);
>   		return -1;
>   	}
> @@ -705,6 +705,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
>
>   int spi_flash_scan(struct spi_flash *flash)
>   {
> +	struct mtd_info *mtd = flash->mtd;
>   	const struct spi_flash_params *params;
>   	u16 jedec, ext_jedec;
>   	u8 idcode[5];
> @@ -754,24 +755,27 @@ int spi_flash_scan(struct spi_flash *flash)
>
>   	/* Assign spi data */
>   	flash->name = params->name;
> +	mtd->type = MTD_NORFLASH;
> +	mtd->writesize = 1;
> +	mtd->flags = MTD_CAP_NORFLASH;
>   	flash->memory_map = flash->spi->memory_map;
>   	flash->dual_flash = flash->spi->option;
>
>   	/* Assign spi_flash ops */
> -	flash->write = spi_flash_cmd_write_ops;
> +	mtd->_write = spi_flash_cmd_write_ops;
>   #if defined(CONFIG_SPI_FLASH_SST)
>   	if (params->flags & SST_WR)
>   		flash->flags |= SNOR_F_SST_WR;
>
>   	if (params->flags & SNOR_F_SST_WR) {
>   		if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
> -			flash->write = sst_write_bp;
> +			mtd->_write = sst_write_bp;
>   		else
> -			flash->write = sst_write_wp;
> +			mtd->_write = sst_write_wp;
>   	}
>   #endif
> -	flash->erase = spi_flash_cmd_erase_ops;
> -	flash->read = spi_flash_cmd_read_ops;
> +	mtd->_erase = spi_flash_cmd_erase_ops;
> +	mtd->_read = spi_flash_cmd_read_ops;
>
>   	/* Compute the flash size */
>   	flash->shift = (flash->dual_flash & SF_DUAL_PARALLEL_FLASH) ? 1 : 0;
> @@ -790,27 +794,28 @@ int spi_flash_scan(struct spi_flash *flash)
>   		flash->page_size = 256;
>   	}
>   	flash->page_size <<= flash->shift;
> +	mtd->writebufsize = flash->page_size;
>   	flash->sector_size = params->sector_size << flash->shift;
> -	flash->size = flash->sector_size * params->nr_sectors << flash->shift;
> +	mtd->size = flash->sector_size * params->nr_sectors << flash->shift;
>   #ifdef CONFIG_SF_DUAL_FLASH
>   	if (flash->dual_flash & SF_DUAL_STACKED_FLASH)
> -		flash->size <<= 1;
> +		mtd->size <<= 1;
>   #endif
>
>   	/* Compute erase sector and command */
>   	if (params->flags & SECT_4K) {
>   		flash->erase_cmd = CMD_ERASE_4K;
> -		flash->erase_size = 4096 << flash->shift;
> +		mtd->erasesize = 4096 << flash->shift;
>   	} else if (params->flags & SECT_32K) {
>   		flash->erase_cmd = CMD_ERASE_32K;
> -		flash->erase_size = 32768 << flash->shift;
> +		mtd->erasesize = 32768 << flash->shift;
>   	} else {
>   		flash->erase_cmd = CMD_ERASE_64K;
> -		flash->erase_size = flash->sector_size;
> +		mtd->erasesize = flash->sector_size;
>   	}
>
>   	/* Now erase size becomes valid sector size */
> -	flash->sector_size = flash->erase_size;
> +	flash->sector_size = mtd->erasesize;
>
>   	/* Look for the fastest read cmd */
>   	cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx);
> @@ -882,8 +887,8 @@ int spi_flash_scan(struct spi_flash *flash)
>   #ifndef CONFIG_SPL_BUILD
>   	printf("SF: Detected %s with page size ", flash->name);
>   	print_size(flash->page_size, ", erase size ");
> -	print_size(flash->erase_size, ", total ");
> -	print_size(flash->size, "");
> +	print_size(mtd->erasesize, ", total ");
> +	print_size(mtd->size, "");
>   	if (flash->memory_map)
>   		printf(", mapped at %p", flash->memory_map);
>   	puts("\n");
> @@ -891,9 +896,9 @@ int spi_flash_scan(struct spi_flash *flash)
>
>   #ifndef CONFIG_SPI_FLASH_BAR
>   	if (((flash->dual_flash == SF_SINGLE_FLASH) &&
> -	     (flash->size > SPI_FLASH_16MB_BOUN)) ||
> +	     (mtd->size > SPI_FLASH_16MB_BOUN)) ||
>   	     ((flash->dual_flash > SF_SINGLE_FLASH) &&
> -	     (flash->size > SPI_FLASH_16MB_BOUN << 1))) {
> +	     (mtd->size > SPI_FLASH_16MB_BOUN << 1))) {
>   		puts("SF: Warning - Only lower 16MiB accessible,");
>   		puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
>   	}
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index 87ac33e..b8704e2 100644
> --- a/drivers/mtd/spi/sf_probe.c
> +++ b/drivers/mtd/spi/sf_probe.c
> @@ -14,9 +14,15 @@
>   #include <malloc.h>
>   #include <spi.h>
>   #include <spi_flash.h>
> +#include <linux/mtd/mtd.h>
>
>   #include "sf_internal.h"
>
> +struct spi_flash_priv {
> +	struct spi_flash	flash;
> +	struct mtd_info		mtd;
> +};
> +
>   #ifndef CONFIG_DM_SPI_FLASH
>   struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus)
>   {
> @@ -123,12 +129,19 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
>
>   int spi_flash_std_probe(struct udevice *dev)
>   {
> -	struct spi_flash *flash = dev_get_uclass_priv(dev);
> +	struct spi_flash_priv *priv = dev_get_uclass_priv(dev);
>   	struct spi_slave *slave = dev_get_parentdata(dev);
> +	struct spi_flash *flash;
>   	int ret;
>
> -	flash->dev = dev;
> +	flash = &priv->flash;
> +	flash->mtd = &priv->mtd;
> +
>   	flash->spi = slave;
> +	flash->priv = priv;
> +
> +	priv->mtd.priv = flash;
> +	flash->dev = dev;
>
>   	/* Claim spi bus */
>   	ret = spi_claim_bus(slave);
> @@ -143,19 +156,16 @@ int spi_flash_std_probe(struct udevice *dev)
>   		goto err_scan;
>   	}
>
> -#ifdef CONFIG_SPI_FLASH_MTD
> -	ret = spi_flash_mtd_register(flash);
> +	ret = add_mtd_device(&priv->mtd);
>   	if (ret) {
>   		printf("SF: failed to register mtd device: %d\n", ret);
>   		goto err_mtd;
>   	}
> -#endif
> +
>   	return ret;
>
> -#ifdef CONFIG_SPI_FLASH_MTD
>   err_mtd:
>   	spi_free_slave(slave);
> -#endif
>   err_scan:
>   	spi_release_bus(slave);
>   	return ret;
> @@ -177,7 +187,7 @@ U_BOOT_DRIVER(spi_flash_std) = {
>   	.id		= UCLASS_SPI_FLASH,
>   	.of_match	= spi_flash_std_ids,
>   	.probe		= spi_flash_std_probe,
> -	.priv_auto_alloc_size = sizeof(struct spi_flash),
> +	.priv_auto_alloc_size = sizeof(struct spi_flash_priv),
>   	.ops		= &spi_flash_std_ops,
>   };
>
> diff --git a/include/spi_flash.h b/include/spi_flash.h
> index 0732172..d0af8d3 100644
> --- a/include/spi_flash.h
> +++ b/include/spi_flash.h
> @@ -17,6 +17,7 @@
>
>   #include <dm.h>	/* Because we dereference struct udevice here */
>   #include <linux/types.h>
> +#include <linux/mtd/mtd.h>
>
>   #ifndef CONFIG_SF_DEFAULT_SPEED
>   # define CONFIG_SF_DEFAULT_SPEED	1000000
> @@ -36,16 +37,15 @@ struct spi_slave;
>   /**
>    * struct spi_flash - SPI flash structure
>    *
> + * @mtd:		point to a mtd_info structure
>    * @spi:		SPI slave
>    * @dev:		SPI flash device
>    * @name:		Name of SPI flash
>    * @dual_flash:		Indicates dual flash memories - dual stacked, parallel
>    * @shift:		Flash shift useful in dual parallel
>    * @flags:		Indication of spi flash flags
> - * @size:		Total flash size
>    * @page_size:		Write (page) size
>    * @sector_size:	Sector size
> - * @erase_size:		Erase size
>    * @bank_read_cmd:	Bank read cmd
>    * @bank_write_cmd:	Bank write cmd
>    * @bank_curr:		Current flash bank
> @@ -54,6 +54,7 @@ struct spi_slave;
>    * @write_cmd:		Write cmd - page and quad program.
>    * @dummy_byte:		Dummy cycles for read operation.
>    * @memory_map:		Address of read-only SPI flash access
> + * @priv:		the private data
>    * @read:		Flash read ops: Read len bytes at offset into buf
>    *			Supported cmds: Fast Array Read
>    * @write:		Flash write ops: Write len bytes from buf into offset
> @@ -63,6 +64,7 @@ struct spi_slave;
>    * return 0 - Success, 1 - Failure
>    */
>   struct spi_flash {
> +	struct mtd_info *mtd;
>   	struct spi_slave *spi;
>   #ifdef CONFIG_DM_SPI_FLASH
>   	struct udevice *dev;
> @@ -72,10 +74,8 @@ struct spi_flash {
>   	u8 shift;
>   	u16 flags;
>
> -	u32 size;
>   	u32 page_size;
>   	u32 sector_size;
> -	u32 erase_size;
>   #ifdef CONFIG_SPI_FLASH_BAR
>   	u8 bank_read_cmd;
>   	u8 bank_write_cmd;
> @@ -87,6 +87,7 @@ struct spi_flash {
>   	u8 dummy_byte;
>
>   	void *memory_map;
> +	void *priv;
>   	int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
>   	int (*write)(struct spi_flash *flash, u32 offset, size_t len,
>   			const void *buf);
>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

      parent reply	other threads:[~2015-10-29  6:04 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-12 19:54 [U-Boot] [PATCH 1/8] sf: Add MTD support to spi_flash Jagan Teki
2015-10-12 19:54 ` [U-Boot] [PATCH 2/8] sf: Use mtd_info ops instead of spi_flash ops Jagan Teki
2015-10-29  6:29   ` Heiko Schocher
2015-10-12 19:54 ` [U-Boot] [PATCH 3/8] cmd_sf: Use mtd->size instead of flash->size Jagan Teki
2015-10-29  6:32   ` Heiko Schocher
2015-10-12 19:54 ` [U-Boot] [PATCH 4/8] dm-sf: use mtd_ops, drop dm_spi_flash_ops Jagan Teki
2015-10-29  6:35   ` Heiko Schocher
2015-10-29 13:11     ` Jagan Teki
2015-11-06  3:15       ` Simon Glass
2015-10-12 19:54 ` [U-Boot] [PATCH 5/8] sf: Add MTD support for non-dm spi_flash interface Jagan Teki
2015-10-29  6:37   ` Heiko Schocher
2015-10-12 19:54 ` [U-Boot] [PATCH 6/8] sf: probe: Minor cleanup Jagan Teki
2015-10-29  6:54   ` Heiko Schocher
2015-10-12 19:54 ` [U-Boot] [PATCH 7/8] sf: Drop SPI_FLASH_MTD driver Jagan Teki
2015-10-12 19:54 ` [U-Boot] [PATCH 8/8] configs: Remove CONFIG_SPI_FLASH_MTD Jagan Teki
2015-10-29  6:04 ` Heiko Schocher [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5631B6FE.7020606@denx.de \
    --to=hs@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.