lkml.org 
[lkml]   [2020]   [May]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 12/19] mtd: spi-nor: core: enable octal DTR mode when possible
    Date
    Allow flashes to specify a hook to enable octal DTR mode. Use this hook
    whenever possible to get optimal transfer speeds.

    Signed-off-by: Pratyush Yadav <p.yadav@ti.com>
    ---
    drivers/mtd/spi-nor/core.c | 35 +++++++++++++++++++++++++++++++++++
    drivers/mtd/spi-nor/core.h | 2 ++
    2 files changed, 37 insertions(+)

    diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
    index 5cb7e391cd29..a94376344be5 100644
    --- a/drivers/mtd/spi-nor/core.c
    +++ b/drivers/mtd/spi-nor/core.c
    @@ -3097,6 +3097,35 @@ static int spi_nor_init_params(struct spi_nor *nor)
    return 0;
    }

    +/** spi_nor_octal_dtr_enable() - enable Octal DTR I/O if needed
    + * @nor: pointer to a 'struct spi_nor'
    + * @enable: whether to enable or disable Octal DTR
    + *
    + * Return: 0 on success, -errno otherwise.
    + */
    +static int spi_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
    +{
    + int ret;
    +
    + if (!nor->params->octal_dtr_enable)
    + return 0;
    +
    + if (!(nor->read_proto == SNOR_PROTO_8_8_8_DTR &&
    + nor->write_proto == SNOR_PROTO_8_8_8_DTR))
    + return 0;
    +
    + ret = nor->params->octal_dtr_enable(nor, enable);
    + if (ret)
    + return ret;
    +
    + if (enable)
    + nor->reg_proto = SNOR_PROTO_8_8_8_DTR;
    + else
    + nor->reg_proto = SNOR_PROTO_1_1_1;
    +
    + return 0;
    +}
    +
    /**
    * spi_nor_quad_enable() - enable Quad I/O if needed.
    * @nor: pointer to a 'struct spi_nor'
    @@ -3136,6 +3165,12 @@ static int spi_nor_init(struct spi_nor *nor)
    {
    int err;

    + err = spi_nor_octal_dtr_enable(nor, true);
    + if (err) {
    + dev_dbg(nor->dev, "octal mode not supported\n");
    + return err;
    + }
    +
    err = spi_nor_quad_enable(nor);
    if (err) {
    dev_dbg(nor->dev, "quad mode not supported\n");
    diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
    index 7e6df8322da0..6338d32a0d77 100644
    --- a/drivers/mtd/spi-nor/core.h
    +++ b/drivers/mtd/spi-nor/core.h
    @@ -203,6 +203,7 @@ struct spi_nor_locking_ops {
    * higher index in the array, the higher priority.
    * @erase_map: the erase map parsed from the SFDP Sector Map Parameter
    * Table.
    + * @octal_dtr_enable: enables SPI NOR octal DTR mode.
    * @quad_enable: enables SPI NOR quad mode.
    * @set_4byte_addr_mode: puts the SPI NOR in 4 byte addressing mode.
    * @convert_addr: converts an absolute address into something the flash
    @@ -226,6 +227,7 @@ struct spi_nor_flash_parameter {

    struct spi_nor_erase_map erase_map;

    + int (*octal_dtr_enable)(struct spi_nor *nor, bool enable);
    int (*quad_enable)(struct spi_nor *nor);
    int (*set_4byte_addr_mode)(struct spi_nor *nor, bool enable);
    u32 (*convert_addr)(struct spi_nor *nor, u32 addr);
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-05-19 16:28    [W:4.413 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site