From: angus.clark@st.com (Angus Clark)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 0/4] mtd: spi-nor: add a new framework for SPI NOR
Date: Fri, 29 Nov 2013 14:52:19 +0000 [thread overview]
Message-ID: <5298AA23.7080404@st.com> (raw)
In-Reply-To: <20131127043253.GA9468@ld-irv-0074.broadcom.com>
Hi Huang Shijie,
On 11/27/2013 04:32 AM, Brian Norris wrote:
> + Lee Jones, others
>
> I'd like to keep a similar CC list for the various conversations going
> on about SPI NOR frameworks.
>
> On Tue, Nov 26, 2013 at 02:32:51PM +0800, Huang Shijie wrote:
>> 1.) Why add a new framework for SPI NOR?
>> The SPI-NOR controller such as Freescale's Quadspi controller is working
>> in a different way from the SPI bus. It should knows the NOR commands to
>> find the right LUT sequence. Unfortunately, the current code can not meet
>> this requirement.
I fully support your argument for introducing a new framework to support Serial
Flash controllers. Reiterating my previous comment:
"The kernel offers many examples of others who have struggled with the same
problem. Some have chosen to write self-contained drivers (e.g.
drivers/mtd/devices/spear_smi.c and drivers/mtd/devices/sst251.c) duplicating
much of m25p80.c, while others have attempted to squeeze into the SPI framework
(e.g. drivers/spi/spi-tegra20-sflash.c and drivers/spi/spi-falcon.c), relying on
fragile heuristics to recreate the semantics of m25p80 that is lost over the ,
current circumstances SPI framework ."
However, having now been through your proposed framework, it would not seem to
provide a generally applicable solution. Indeed, other than making the Serial
Flash commands and the device table available, it is not obvious how it improves
the situation for your own specific controller either; the
read/write/read_reg/write_reg callbacks do not offer a great deal more than
spi_read_then_write(). (Perhaps all will become clear when you submit the
fsl-quadspi driver.)
As I see it, the main problem with the current support is that dedicated Serial
Flash Controllers require a level of semantics that cannot be conveyed over the
generic SPI framework. With this in mind, I would start by defining something
along the lines of a "Serial Flash transfer". Some initial ramblings of my mind:
/**
* struct spi_nor_xfer_cfg - Structure for defining a Serial Flash transfer
* @wren: command for "Write Enable", or 0x00 for not required
* @cmd: command for operation
* @cmd_pins: number of pins to send @cmd (1, 2, 4)
* @addr: address for operation
* @addr_pins: number of pins to send @addr (1, 2, 4)
* @addr_width: number of address bytes (3,4, or 0 for address not required)
* @mode: mode data
* @mode_pins: number of pins to send @mode (1, 2, 4)
* @mode_cycles: number of mode cycles (0 for mode not required)
* @dummy_cycles: number of dummy cycles (0 for dummy not required)
*/
struct spi_nor_xfer_cfg {
uint8_t wren;
uint8_t cmd;
int cmd_pins;
uint32_t addr;
int addr_pins;
int addr_width;
uint32_t mode;
int mode_pins;
int mode_cycles;
int dummy_cycles;
};
We could then build up layers of functionality, based on two fundamental primitives:
int (*read_xfer)(struct spi_nor_info *info,
struct spi_nor_xfer_cfg *cfg,
uint8_t *buf, size_t len);
int (*write_xfer)(struct spi_nor_info *info,
struct spi_nor_xfer_cfg *cfg,
uint8_t *buf, size_t len);
Default implementations for standard operations could follow:
int (*read_reg)(struct spi_nor_info *info,
uint8_t cmd, uint8_t *reg, int len);
int (*write_reg)(struct spi_nor_info *info,
uint8_t cmd, uint8_t *reg, int len,
int wren, int wtr);
int (*readid)(struct spi_nor_info *info, uint8_t *readid);
int (*wait_till_ready)(struct spi_nor_info *info);
int (*read)(struct spi_nor_info *info, uint8_t buf, off_t offs, size_t len);
int (*write)(struct spi_nor_info *info, off_t offs, size_t len);
int (*erase_sector)(struct spi_nor_info *info, off_t offs);
Each driver would be required to implement read_xfer() and write_xfer(), and
then free to either use the default implementations, or override with
driver-optimised implementations.
In the case of a pure SPI Controller, read_xfer() and write_xfer() would simply
flatten to spi_messages. The key benefit is that dedicated Serial Flash
Controllers would be able to take advantage of the richer semantics offered by
the 'spi_nor_xfer_cfg' data.
I would also expect the spi-nor framework to provide the following services,
applicable to all Serial Flash drivers:
- determine devices properties at runtime, based on the READID data (and
perhaps SFDP, if and when it matures!). This should include supported opcodes
(e.g. READ_1_1_4, READ_1_4_4, READ4B_1_1_4...), operating frequencies, mode and
dummy requirements, means of setting Quad Enable, entering/exiting 4-byte
addressing etc.
- provide optimal read, write and erase configurations, based on the combined
capabilities of the Serial Flash device and the H/W Controller.
- device specific configuration (e.g. setting QE, unlock BPx bits, DYB unlocking).
Getting back to reality, I realise undertaking such a task would be a huge
commitment. I would be keen to put forward my own proposal, but current
circumstances mean that that is unlikely to happen any time soon.
I guess in summary, while I am pleased that this area is being looked at, my own
feeling is that proposed framework needs to be reworked for it to be generally
applicable to other Serial Flash controllers. Of course, another option would
be to stick with what is currently offered, and make do.
Cheers,
Angus
next prev parent reply other threads:[~2013-11-29 14:52 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-26 6:32 [PATCH 0/4] mtd: spi-nor: add a new framework for SPI NOR Huang Shijie
2013-11-26 6:32 ` [PATCH 1/4] mtd: spi-nor: move the SPI NOR commands to a new header file Huang Shijie
2013-11-26 7:42 ` Gupta, Pekon
2013-11-26 8:53 ` Huang Shijie
2013-11-26 14:48 ` Angus Clark
2013-11-26 6:32 ` [PATCH 2/4] mtd: spi-nor: add a new data structrue spi_nor{} Huang Shijie
2013-11-26 11:42 ` Gupta, Pekon
2013-11-27 4:35 ` Huang Shijie
2013-11-27 9:32 ` Marek Vasut
2013-11-27 10:24 ` Huang Shijie
2013-11-27 10:27 ` Marek Vasut
2013-11-26 6:32 ` [PATCH 3/4] mtd: spi-nor: add the framework for SPI NOR Huang Shijie
2013-11-26 10:03 ` Gupta, Pekon
2013-11-27 9:39 ` Marek Vasut
2013-11-26 6:32 ` [PATCH 4/4] mtd: m25p80: use the new spi-nor APIs Huang Shijie
2013-11-26 12:57 ` [PATCH 0/4] mtd: spi-nor: add a new framework for SPI NOR Angus Clark
2013-11-27 4:32 ` Brian Norris
2013-11-27 4:39 ` Huang Shijie
2013-11-29 14:52 ` Angus Clark [this message]
2013-12-02 10:06 ` Huang Shijie
2013-12-02 11:01 ` Gupta, Pekon
2013-12-02 11:19 ` Angus Clark
2013-12-03 6:20 ` Huang Shijie
2013-12-03 8:23 ` Lee Jones
2013-12-10 8:25 ` Brian Norris
2013-12-10 10:00 ` Lee Jones
2013-12-03 0:32 ` Marek Vasut
2013-12-03 10:36 ` Huang Shijie
2013-12-03 14:51 ` David Woodhouse
2013-12-04 18:44 ` Brian Norris
2013-12-05 7:12 ` Huang Shijie
2013-12-05 8:11 ` Brian Norris
2013-12-05 7:59 ` Huang Shijie
2013-12-05 9:20 ` Brian Norris
2013-12-06 3:07 ` Huang Shijie
2013-12-05 14:35 ` Angus Clark
2013-12-06 8:18 ` Huang Shijie
2013-12-10 9:08 ` Brian Norris
2013-12-04 2:46 ` Huang Shijie
2013-12-04 6:58 ` Angus Clark
2013-12-04 7:19 ` Gupta, Pekon
2013-12-04 8:21 ` Angus Clark
2013-12-04 15:36 ` Marek Vasut
2013-12-05 2:42 ` Huang Shijie
2013-12-05 5:43 ` Gupta, Pekon
2013-12-05 7:33 ` Huang Shijie
2013-11-27 9:27 ` Marek Vasut
2013-11-27 9:47 ` Sourav Poddar
2013-11-27 10:06 ` Marek Vasut
2013-11-27 10:56 ` Sourav Poddar
2013-12-02 23:59 ` Marek Vasut
2013-12-03 10:01 ` Sourav Poddar
2013-12-03 13:42 ` Marek Vasut
2013-12-03 13:50 ` Sourav Poddar
2013-12-03 14:19 ` Marek Vasut
2013-12-03 14:31 ` Sourav Poddar
2013-12-03 15:09 ` Marek Vasut
2013-12-03 15:16 ` Sourav Poddar
2013-12-03 15:35 ` Marek Vasut
2013-12-03 15:23 ` David Woodhouse
2013-12-03 18:28 ` Brian Norris
2013-12-03 23:41 ` Marek Vasut
2013-11-27 10:19 ` Huang Shijie
2013-12-03 0:00 ` Marek Vasut
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=5298AA23.7080404@st.com \
--to=angus.clark@st.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).