[PATCH v7 1/3] mtd: spi-nor: spansion: Add support for Read/Write Any Register

Pratyush Yadav p.yadav at ti.com
Fri Jan 28 08:20:56 PST 2022


On 28/01/22 09:43AM, Tudor.Ambarus at microchip.com wrote:
> On 7/19/21 11:03, tkuw584924 at gmail.com wrote:
> > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> > 
> > From: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
> > 
> > Some of Spansion/Cypress chips support Read/Write Any Register commands.
> > These commands are mainly used to write volatile registers.
> > 
> > The Read Any Register instruction (65h) is followed by register address
> > and dummy cycles, then the selected register byte is returned.
> > 
> > The Write Any Register instruction (71h) is followed by register address
> > and register byte to write.
> > 
> > Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
> > ---
> > Changes in v7:
> >   - No change
> > 
> > Changes in v6:
> >   - Add helper functions for controller_ops
> >   - Add 'reg_addr_width' parameter to spansion_read/write_any_reg()
> >   - Remove spi_nor_write_enable() from spansion_write_any_reg() and modified
> >     function header comment
> > 
> > Changes in v5:
> >   - Fix 'if (ret == 1)' to 'if (ret < 0)' in spansion_read_any_reg()
> > 
> > Changes in v4:
> >   - Fix dummy cycle calculation in spansion_read_any_reg()
> >   - Modify comment for spansion_write_any_reg()
> > 
> > Changes in v3:
> >   - Cleanup implementation
> > 
> >  drivers/mtd/spi-nor/spansion.c | 142 +++++++++++++++++++++++++++++++++
> >  1 file changed, 142 insertions(+)
> > 
> > +/**
> > + * spansion_read_any_reg() - Read Any Register.
> > + * @nor:               pointer to a 'struct spi_nor'
> > + * @reg_addr:          register address
> > + * @reg_addr_width:    number of address bytes
> > + * @reg_dummy:         number of dummy cycles for register read
> > + * @reg_val:           pointer to a buffer where the register value is copied
> > + *
> > + * Return: 0 on success, -errno otherwise.
> > + */
> > +static int spansion_read_any_reg(struct spi_nor *nor, u32 reg_addr,
> > +                                u8 reg_addr_width, u8 reg_dummy, u8 *reg_val)
> 
> how about making this a generic core method? I'm sure there are other SPI NOR
> vendors that use registers indexed by address. How about introducing:
> 
> struct spi_nor_reg {
> 	u32 addr;
> 	u8 addr_width;
> 	u8 dummy;
> 	u8 opcode;
> 	u8 val;
> };
> 
> and passing a pointer to this struct as argument.

Wouldn't it be simpler if they fill it in a struct spi_mem_op, and then 
just pass that in as a "template"?

> 
> > +{
> > +       if (nor->spimem) {
> > +               struct spi_mem_op op =
> > +                       SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RD_ANY_REG, 0),
> > +                                  SPI_MEM_OP_ADDR(reg_addr_width, reg_addr, 0),
> > +                                  SPI_MEM_OP_DUMMY(reg_dummy, 0),
> > +                                  SPI_MEM_OP_DATA_IN(1, reg_val, 0));
> > +
> > +               spi_nor_spimem_setup_op(nor, &op, nor->reg_proto);
> > +
> > +               /* convert the dummy cycles to the number of bytes */
> > +               op.dummy.nbytes = (reg_dummy * op.dummy.buswidth) / 8;
> > +               if (spi_nor_protocol_is_dtr(nor->reg_proto))
> > +                       op.dummy.nbytes *= 2;
> > +
> > +               return spi_mem_exec_op(nor->spimem, &op);
> > +       }
> > +
> else
> 	return -EOPNOTSUPP;
> 
> we'd like to move all the SPI NOR controller drivers under SPI MEM, let's
> not add support for them.

Sounds good to me.

> 
> > +       return controller_ops_read_any_reg(nor, reg_addr, reg_addr_width,
> > +                                          reg_dummy, reg_val);
> > +}

-- 
Regards,
Pratyush Yadav
Texas Instruments Inc.



More information about the linux-mtd mailing list