First of all, can you fix your mail so that you have a proper 'From'?
That should be your real name (not bpqw), so that it gives a proper
patch author. If you can't get your mail header to have the right
'From:' line, then it also works to begin your mail with:

From: Your Name <y...@email.com>

On Thu, Nov 06, 2014 at 03:09:06AM +0000, bpqw wrote:
> This patch adds code which enables Quad I/O mode on Micron SPI NOR flashes.
> 
> For Micron SPI NOR flash,enabling or disabling quad I/O protocol is controlled
> by EVCR (Enhanced Volatile Configuration Register), Quad I/O protocol bit 7.
> When EVCR bit 7 is reset to 0,the SPI NOR flash will operate in quad I/O mode.

What's the difference between using EVCR and the ENTER QUAD I/O MODE
(35h) command I see in some of your datasheets? Are both supported on
all Micron quad I/O SPI NOR flash?

Also, which SPI NOR is this enabled for? I don't see any Micron entries
in spi_nor_ids[] which contain the SPI_NOR_QUAD_READ flag.

> Signed-off-by: bean huo <bean...@micron.com>
> Acked-by: Marek Vasut <ma...@denx.de>
> ---
>  v1-v2:
>       Modified to that capture wait_till_ready()
>       return value,if error,directly return its
>       the value.
>  v2-v3:
>       Directly use the reurning error value of
>       read_reg and write_reg,instead of -EINVAL.
>  v3-v4:
>       Modify commit logs that wraped into 80 columns 
>  v4-v5:
>       Rebuild new patch based on latest linux-mtd

Please rebase on l2-mtd.git. Sorry if that wasn't clear earlier.

>  drivers/mtd/spi-nor/spi-nor.c |   46 
> +++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/spi-nor.h   |    6 ++++++
>  2 files changed, 52 insertions(+)
> 
> diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
> index c51ee52..2a31742 100644
> --- a/drivers/mtd/spi-nor/spi-nor.c
> +++ b/drivers/mtd/spi-nor/spi-nor.c
> @@ -874,6 +874,45 @@ static int spansion_quad_enable(struct spi_nor *nor)
>       return 0;
>  }
>  
> +static int micron_quad_enable(struct spi_nor *nor)
> +{
> +     int ret, val;
> +
> +     ret = nor->read_reg(nor, SPINOR_OP_RD_EVCR, &val, 1);
> +     if (ret < 0) {
> +             dev_err(nor->dev, "error %d reading EVCR\n", ret);
> +             return ret;
> +     }
> +
> +     write_enable(nor);
> +
> +     /* set EVCR ,enable quad I/O */
> +     nor->cmd_buf[0] = val & ~EVCR_QUAD_EN_MICRON;
> +     ret = nor->write_reg(nor, SPINOR_OP_WD_EVCR, nor->cmd_buf, 1, 0);
> +     if (ret < 0) {
> +             dev_err(nor->dev,
> +                     "error while writing EVCR register\n");

Join the above two lines?

> +             return ret;
> +     }
> +
> +     ret = wait_till_ready(nor);

It's spi_nor_wait_till_ready(), now.

> +     if (ret)
> +             return ret;
> +
> +     /* read EVCR and check it */
> +     ret = nor->read_reg(nor, SPINOR_OP_RD_EVCR, &val, 1);
> +     if (ret < 0) {
> +             dev_err(nor->dev, "error %d reading EVCR\n", ret);
> +             return ret;
> +     }
> +     if (val & EVCR_QUAD_EN_MICRON) {
> +             dev_err(nor->dev, "Micron EVCR Quad bit not clear\n");
> +             return -EINVAL;
> +     }
> +
> +     return 0;
> +}
> +
>  static int set_quad_mode(struct spi_nor *nor, u32 jedec_id)
>  {
>       int status;
> @@ -886,6 +925,13 @@ static int set_quad_mode(struct spi_nor *nor, u32 
> jedec_id)
>                       return -EINVAL;
>               }
>               return status;
> +     case CFI_MFR_ST:
> +             status = micron_quad_enable(nor);
> +             if (status) {
> +                     dev_err(nor->dev, "Micron quad-read not enabled\n");
> +                     return -EINVAL;
> +             }
> +             return status;
>       default:
>               status = spansion_quad_enable(nor);
>               if (status) {
> diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h
> index 046a0a2..42e7e37 100644
> --- a/include/linux/mtd/spi-nor.h
> +++ b/include/linux/mtd/spi-nor.h
> @@ -56,6 +56,10 @@
>  /* Used for Spansion flashes only. */
>  #define SPINOR_OP_BRWR               0x17    /* Bank register write */
>  
> +/* Used for Micron flashes only. */
> +#define SPINOR_OP_RD_EVCR      0x65    /* Read EVCR register */
> +#define SPINOR_OP_WD_EVCR      0x61    /* Write EVCR register */
> +
>  /* Status Register bits. */
>  #define SR_WIP                       1       /* Write in progress */
>  #define SR_WEL                       2       /* Write enable latch */
> @@ -67,6 +71,8 @@
>  
>  #define SR_QUAD_EN_MX                0x40    /* Macronix Quad I/O */
>  
> +#define EVCR_QUAD_EN_MICRON    0x80    /* Micron Quad I/O */

Like with other register bitfields (SR, FSR), please place a comment
above to describe the register, like:

/* Enhanced Volatile Configuration Register bits */

> +
>  /* Flag Status Register bits */
>  #define FSR_READY            0x80
>  

Brian
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to