All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Ray Jui <ray.jui@broadcom.com>
Cc: Brian Norris <computersforpeace@gmail.com>,
	Kamal Dasu <kdasu.kdev@gmail.com>,
	David Woodhouse <dwmw2@infradead.org>,
	linux-mtd@lists.infradead.org,
	bcm-kernel-feedback-list@broadcom.com,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Prafulla Kota <prafulla.kota@broadcom.com>
Subject: Re: [PATCH v2 1/2] mtd: brcmnand: iProc big endian and ONFI support
Date: Fri, 26 Aug 2016 09:47:28 +0200	[thread overview]
Message-ID: <20160826094728.1a68f443@bbrezillon> (raw)
In-Reply-To: <1469051631-7896-2-git-send-email-ray.jui@broadcom.com>

On Wed, 20 Jul 2016 14:53:50 -0700
Ray Jui <ray.jui@broadcom.com> wrote:

> This patch adds big endian and ONFI support for various iProc based
> SoCs that use the core brcmstb NAND controller
> 
> This patch was originally implemented by Prafulla Kota
> <prafulla.kota@broadcom.com> and fully tested on iProc based NS2 SVK
> 
> Signed-off-by: Prafulla Kota <prafulla.kota@broadcom.com>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>

Applied.

Thanks,

Boris

> ---
>  drivers/mtd/nand/brcmnand/brcmnand.c   | 12 ++++++------
>  drivers/mtd/nand/brcmnand/brcmnand.h   | 13 ++++++++-----
>  drivers/mtd/nand/brcmnand/iproc_nand.c | 18 ++++++++++++++----
>  3 files changed, 28 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
> index b76ad7c..12a1585 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.c
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.c
> @@ -1279,7 +1279,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
>  		u32 *flash_cache = (u32 *)ctrl->flash_cache;
>  		int i;
>  
> -		brcmnand_soc_data_bus_prepare(ctrl->soc);
> +		brcmnand_soc_data_bus_prepare(ctrl->soc, true);
>  
>  		/*
>  		 * Must cache the FLASH_CACHE now, since changes in
> @@ -1292,7 +1292,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
>  			 */
>  			flash_cache[i] = be32_to_cpu(brcmnand_read_fc(ctrl, i));
>  
> -		brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +		brcmnand_soc_data_bus_unprepare(ctrl->soc, true);
>  
>  		/* Cleanup from HW quirk: restore SECTOR_SIZE_1K */
>  		if (host->hwcfg.sector_size_1k)
> @@ -1508,12 +1508,12 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
>  		brcmnand_waitfunc(mtd, chip);
>  
>  		if (likely(buf)) {
> -			brcmnand_soc_data_bus_prepare(ctrl->soc);
> +			brcmnand_soc_data_bus_prepare(ctrl->soc, false);
>  
>  			for (j = 0; j < FC_WORDS; j++, buf++)
>  				*buf = brcmnand_read_fc(ctrl, j);
>  
> -			brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +			brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
>  		}
>  
>  		if (oob)
> @@ -1678,12 +1678,12 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,
>  		(void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
>  
>  		if (buf) {
> -			brcmnand_soc_data_bus_prepare(ctrl->soc);
> +			brcmnand_soc_data_bus_prepare(ctrl->soc, false);
>  
>  			for (j = 0; j < FC_WORDS; j++, buf++)
>  				brcmnand_write_fc(ctrl, j, *buf);
>  
> -			brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +			brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
>  		} else if (oob) {
>  			for (j = 0; j < FC_WORDS; j++)
>  				brcmnand_write_fc(ctrl, j, 0xffffffff);
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.h b/drivers/mtd/nand/brcmnand/brcmnand.h
> index ef5eabb..5c44cd4 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.h
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.h
> @@ -23,19 +23,22 @@ struct dev_pm_ops;
>  struct brcmnand_soc {
>  	bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
>  	void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
> -	void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare);
> +	void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
> +				 bool is_param);
>  };
>  
> -static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc)
> +static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
> +						 bool is_param)
>  {
>  	if (soc && soc->prepare_data_bus)
> -		soc->prepare_data_bus(soc, true);
> +		soc->prepare_data_bus(soc, true, is_param);
>  }
>  
> -static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc)
> +static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc,
> +						   bool is_param)
>  {
>  	if (soc && soc->prepare_data_bus)
> -		soc->prepare_data_bus(soc, false);
> +		soc->prepare_data_bus(soc, false, is_param);
>  }
>  
>  static inline u32 brcmnand_readl(void __iomem *addr)
> diff --git a/drivers/mtd/nand/brcmnand/iproc_nand.c b/drivers/mtd/nand/brcmnand/iproc_nand.c
> index 585596c..4c6ae11 100644
> --- a/drivers/mtd/nand/brcmnand/iproc_nand.c
> +++ b/drivers/mtd/nand/brcmnand/iproc_nand.c
> @@ -74,7 +74,8 @@ static void iproc_nand_intc_set(struct brcmnand_soc *soc, bool en)
>  	spin_unlock_irqrestore(&priv->idm_lock, flags);
>  }
>  
> -static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare)
> +static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare,
> +				  bool is_param)
>  {
>  	struct iproc_nand_soc *priv =
>  			container_of(soc, struct iproc_nand_soc, soc);
> @@ -86,10 +87,19 @@ static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare)
>  
>  	val = brcmnand_readl(mmio);
>  
> -	if (prepare)
> -		val |= IPROC_NAND_APB_LE_MODE;
> -	else
> +	/*
> +	 * In the case of BE or when dealing with NAND data, alway configure
> +	 * the APB bus to LE mode before accessing the FIFO and back to BE mode
> +	 * after the access is done
> +	 */
> +	if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) || !is_param) {
> +		if (prepare)
> +			val |= IPROC_NAND_APB_LE_MODE;
> +		else
> +			val &= ~IPROC_NAND_APB_LE_MODE;
> +	} else { /* when in LE accessing the parameter page, keep APB in BE */
>  		val &= ~IPROC_NAND_APB_LE_MODE;
> +	}
>  
>  	brcmnand_writel(val, mmio);
>  

WARNING: multiple messages have this Message-ID (diff)
From: boris.brezillon@free-electrons.com (Boris Brezillon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 1/2] mtd: brcmnand: iProc big endian and ONFI support
Date: Fri, 26 Aug 2016 09:47:28 +0200	[thread overview]
Message-ID: <20160826094728.1a68f443@bbrezillon> (raw)
In-Reply-To: <1469051631-7896-2-git-send-email-ray.jui@broadcom.com>

On Wed, 20 Jul 2016 14:53:50 -0700
Ray Jui <ray.jui@broadcom.com> wrote:

> This patch adds big endian and ONFI support for various iProc based
> SoCs that use the core brcmstb NAND controller
> 
> This patch was originally implemented by Prafulla Kota
> <prafulla.kota@broadcom.com> and fully tested on iProc based NS2 SVK
> 
> Signed-off-by: Prafulla Kota <prafulla.kota@broadcom.com>
> Signed-off-by: Ray Jui <ray.jui@broadcom.com>

Applied.

Thanks,

Boris

> ---
>  drivers/mtd/nand/brcmnand/brcmnand.c   | 12 ++++++------
>  drivers/mtd/nand/brcmnand/brcmnand.h   | 13 ++++++++-----
>  drivers/mtd/nand/brcmnand/iproc_nand.c | 18 ++++++++++++++----
>  3 files changed, 28 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.c b/drivers/mtd/nand/brcmnand/brcmnand.c
> index b76ad7c..12a1585 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.c
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.c
> @@ -1279,7 +1279,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
>  		u32 *flash_cache = (u32 *)ctrl->flash_cache;
>  		int i;
>  
> -		brcmnand_soc_data_bus_prepare(ctrl->soc);
> +		brcmnand_soc_data_bus_prepare(ctrl->soc, true);
>  
>  		/*
>  		 * Must cache the FLASH_CACHE now, since changes in
> @@ -1292,7 +1292,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,
>  			 */
>  			flash_cache[i] = be32_to_cpu(brcmnand_read_fc(ctrl, i));
>  
> -		brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +		brcmnand_soc_data_bus_unprepare(ctrl->soc, true);
>  
>  		/* Cleanup from HW quirk: restore SECTOR_SIZE_1K */
>  		if (host->hwcfg.sector_size_1k)
> @@ -1508,12 +1508,12 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,
>  		brcmnand_waitfunc(mtd, chip);
>  
>  		if (likely(buf)) {
> -			brcmnand_soc_data_bus_prepare(ctrl->soc);
> +			brcmnand_soc_data_bus_prepare(ctrl->soc, false);
>  
>  			for (j = 0; j < FC_WORDS; j++, buf++)
>  				*buf = brcmnand_read_fc(ctrl, j);
>  
> -			brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +			brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
>  		}
>  
>  		if (oob)
> @@ -1678,12 +1678,12 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip,
>  		(void)brcmnand_read_reg(ctrl, BRCMNAND_CMD_ADDRESS);
>  
>  		if (buf) {
> -			brcmnand_soc_data_bus_prepare(ctrl->soc);
> +			brcmnand_soc_data_bus_prepare(ctrl->soc, false);
>  
>  			for (j = 0; j < FC_WORDS; j++, buf++)
>  				brcmnand_write_fc(ctrl, j, *buf);
>  
> -			brcmnand_soc_data_bus_unprepare(ctrl->soc);
> +			brcmnand_soc_data_bus_unprepare(ctrl->soc, false);
>  		} else if (oob) {
>  			for (j = 0; j < FC_WORDS; j++)
>  				brcmnand_write_fc(ctrl, j, 0xffffffff);
> diff --git a/drivers/mtd/nand/brcmnand/brcmnand.h b/drivers/mtd/nand/brcmnand/brcmnand.h
> index ef5eabb..5c44cd4 100644
> --- a/drivers/mtd/nand/brcmnand/brcmnand.h
> +++ b/drivers/mtd/nand/brcmnand/brcmnand.h
> @@ -23,19 +23,22 @@ struct dev_pm_ops;
>  struct brcmnand_soc {
>  	bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
>  	void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
> -	void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare);
> +	void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
> +				 bool is_param);
>  };
>  
> -static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc)
> +static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
> +						 bool is_param)
>  {
>  	if (soc && soc->prepare_data_bus)
> -		soc->prepare_data_bus(soc, true);
> +		soc->prepare_data_bus(soc, true, is_param);
>  }
>  
> -static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc)
> +static inline void brcmnand_soc_data_bus_unprepare(struct brcmnand_soc *soc,
> +						   bool is_param)
>  {
>  	if (soc && soc->prepare_data_bus)
> -		soc->prepare_data_bus(soc, false);
> +		soc->prepare_data_bus(soc, false, is_param);
>  }
>  
>  static inline u32 brcmnand_readl(void __iomem *addr)
> diff --git a/drivers/mtd/nand/brcmnand/iproc_nand.c b/drivers/mtd/nand/brcmnand/iproc_nand.c
> index 585596c..4c6ae11 100644
> --- a/drivers/mtd/nand/brcmnand/iproc_nand.c
> +++ b/drivers/mtd/nand/brcmnand/iproc_nand.c
> @@ -74,7 +74,8 @@ static void iproc_nand_intc_set(struct brcmnand_soc *soc, bool en)
>  	spin_unlock_irqrestore(&priv->idm_lock, flags);
>  }
>  
> -static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare)
> +static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare,
> +				  bool is_param)
>  {
>  	struct iproc_nand_soc *priv =
>  			container_of(soc, struct iproc_nand_soc, soc);
> @@ -86,10 +87,19 @@ static void iproc_nand_apb_access(struct brcmnand_soc *soc, bool prepare)
>  
>  	val = brcmnand_readl(mmio);
>  
> -	if (prepare)
> -		val |= IPROC_NAND_APB_LE_MODE;
> -	else
> +	/*
> +	 * In the case of BE or when dealing with NAND data, alway configure
> +	 * the APB bus to LE mode before accessing the FIFO and back to BE mode
> +	 * after the access is done
> +	 */
> +	if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) || !is_param) {
> +		if (prepare)
> +			val |= IPROC_NAND_APB_LE_MODE;
> +		else
> +			val &= ~IPROC_NAND_APB_LE_MODE;
> +	} else { /* when in LE accessing the parameter page, keep APB in BE */
>  		val &= ~IPROC_NAND_APB_LE_MODE;
> +	}
>  
>  	brcmnand_writel(val, mmio);
>  

  parent reply	other threads:[~2016-08-26  7:47 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-20 21:53 [PATCH v2 0/2] Add big endian and ONFI support to iProc NAND Ray Jui
2016-07-20 21:53 ` Ray Jui
2016-07-20 21:53 ` [PATCH v2 1/2] mtd: brcmnand: iProc big endian and ONFI support Ray Jui
2016-07-20 21:53   ` Ray Jui
2016-08-10 14:24   ` Boris Brezillon
2016-08-10 14:24     ` Boris Brezillon
2016-08-19 15:14     ` Kamal Dasu
2016-08-19 15:14       ` Kamal Dasu
2016-08-22  7:44       ` Boris Brezillon
2016-08-22  7:44         ` Boris Brezillon
2016-08-22 15:42     ` Kamal Dasu
2016-08-22 15:42       ` Kamal Dasu
2016-08-26  7:47   ` Boris Brezillon [this message]
2016-08-26  7:47     ` Boris Brezillon
2016-07-20 21:53 ` [PATCH v2 2/2] arm64: dts: Updated NAND DT properties for NS2 SVK Ray Jui
2016-07-20 21:53   ` Ray Jui
2016-10-17 20:49   ` Ray Jui
2016-10-17 20:49     ` Ray Jui
2016-10-18  0:54     ` Florian Fainelli
2016-10-18  0:54       ` Florian Fainelli

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=20160826094728.1a68f443@bbrezillon \
    --to=boris.brezillon@free-electrons.com \
    --cc=bcm-kernel-feedback-list@broadcom.com \
    --cc=computersforpeace@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=kdasu.kdev@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=prafulla.kota@broadcom.com \
    --cc=ray.jui@broadcom.com \
    /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.