linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: lee.jones@linaro.org (Lee Jones)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 34/35] mtd: st_spi_fsm: Move runtime configurable msg sequences into device's struct
Date: Tue, 18 Feb 2014 14:56:01 +0000	[thread overview]
Message-ID: <1392735362-1245-35-git-send-email-lee.jones@linaro.org> (raw)
In-Reply-To: <1392735362-1245-1-git-send-email-lee.jones@linaro.org>

Until now the dynamically configurable message sequences for read, write
and enable 32bit addressing have been global. Brian makes a good point
why this should not be the case. If there are ever two FSM's located on
the same platform, we could be potentially introducing a race condition
on "needlessly shared data".

Suggested-by: Brian Norris <computersforpeace@gmail.com>
Acked-by Angus Clark <angus.clark@st.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mtd/devices/st_spi_fsm.c | 64 ++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c
index 211adf1..1fde283 100644
--- a/drivers/mtd/devices/st_spi_fsm.c
+++ b/drivers/mtd/devices/st_spi_fsm.c
@@ -273,6 +273,19 @@
 #define CFG_ERASESEC_TOGGLE_32BIT_ADDR 0x00000008
 #define CFG_S25FL_CHECK_ERROR_FLAGS    0x00000010
 
+struct stfsm_seq {
+	uint32_t data_size;
+	uint32_t addr1;
+	uint32_t addr2;
+	uint32_t addr_cfg;
+	uint32_t seq_opc[5];
+	uint32_t mode;
+	uint32_t dummy;
+	uint32_t status;
+	uint8_t  seq[16];
+	uint32_t seq_cfg;
+} __packed __aligned(4);
+
 struct stfsm {
 	struct device		*dev;
 	void __iomem		*base;
@@ -286,20 +299,11 @@ struct stfsm {
 	bool                    booted_from_spi;
 	bool                    reset_signal;
 	bool                    reset_por;
-};
 
-struct stfsm_seq {
-	uint32_t data_size;
-	uint32_t addr1;
-	uint32_t addr2;
-	uint32_t addr_cfg;
-	uint32_t seq_opc[5];
-	uint32_t mode;
-	uint32_t dummy;
-	uint32_t status;
-	uint8_t  seq[16];
-	uint32_t seq_cfg;
-} __packed __aligned(4);
+	struct stfsm_seq stfsm_seq_read;
+	struct stfsm_seq stfsm_seq_write;
+	struct stfsm_seq stfsm_seq_en_32bit_addr;
+};
 
 /* Parameters to configure a READ or WRITE FSM sequence */
 struct seq_rw_config {
@@ -587,10 +591,6 @@ static struct seq_rw_config stfsm_s25fl_write4_configs[] = {
  */
 #define W25Q_STATUS_QE			(0x1 << 9)
 
-static struct stfsm_seq stfsm_seq_read;		/* Dynamically populated */
-static struct stfsm_seq stfsm_seq_write;	/* Dynamically populated */
-static struct stfsm_seq stfsm_seq_en_32bit_addr;/* Dynamically populated */
-
 static struct stfsm_seq stfsm_seq_read_jedec = {
 	.data_size = TRANSFER_SIZE(8),
 	.seq_opc[0] = (SEQ_OPC_PADS_1 |
@@ -826,7 +826,7 @@ static int stfsm_write_fifo(struct stfsm *fsm,
 
 static int stfsm_enter_32bit_addr(struct stfsm *fsm, int enter)
 {
-	struct stfsm_seq *seq = &stfsm_seq_en_32bit_addr;
+	struct stfsm_seq *seq = &fsm->stfsm_seq_en_32bit_addr;
 	uint32_t cmd = enter ? FLASH_CMD_EN4B_ADDR : FLASH_CMD_EX4B_ADDR;
 
 	seq->seq_opc[0] = (SEQ_OPC_PADS_1 |
@@ -1101,7 +1101,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm)
 	int ret;
 
 	/* Configure 'READ' sequence */
-	ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read,
+	ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
 					  default_read_configs);
 	if (ret) {
 		dev_err(fsm->dev,
@@ -1111,7 +1111,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm)
 	}
 
 	/* Configure 'WRITE' sequence */
-	ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write,
+	ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
 					  default_write_configs);
 	if (ret) {
 		dev_err(fsm->dev,
@@ -1146,7 +1146,7 @@ static int stfsm_mx25_config(struct stfsm *fsm)
 	 */
 	if (flags & FLASH_FLAG_32BIT_ADDR) {
 		/* Configure 'enter_32bitaddr' FSM sequence */
-		stfsm_mx25_en_32bit_addr_seq(&stfsm_seq_en_32bit_addr);
+		stfsm_mx25_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr);
 
 		soc_reset = stfsm_can_handle_soc_reset(fsm);
 		if (soc_reset || !fsm->booted_from_spi) {
@@ -1169,7 +1169,7 @@ static int stfsm_mx25_config(struct stfsm *fsm)
 	}
 
 	/* For QUAD mode, set 'QE' STATUS bit */
-	data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
+	data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
 	if (data_pads == 4) {
 		stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta);
 		sta |= MX25_STATUS_QE;
@@ -1188,10 +1188,10 @@ static int stfsm_n25q_config(struct stfsm *fsm)
 
 	/* Configure 'READ' sequence */
 	if (flags & FLASH_FLAG_32BIT_ADDR)
-		ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read,
+		ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
 						  n25q_read4_configs);
 	else
-		ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read,
+		ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
 						  n25q_read3_configs);
 	if (ret) {
 		dev_err(fsm->dev,
@@ -1201,7 +1201,7 @@ static int stfsm_n25q_config(struct stfsm *fsm)
 	}
 
 	/* Configure 'WRITE' sequence (default configs) */
-	ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write,
+	ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
 					  default_write_configs);
 	if (ret) {
 		dev_err(fsm->dev,
@@ -1215,7 +1215,7 @@ static int stfsm_n25q_config(struct stfsm *fsm)
 
 	/* Configure 32-bit address support */
 	if (flags & FLASH_FLAG_32BIT_ADDR) {
-		stfsm_n25q_en_32bit_addr_seq(&stfsm_seq_en_32bit_addr);
+		stfsm_n25q_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr);
 
 		soc_reset = stfsm_can_handle_soc_reset(fsm);
 		if (soc_reset || !fsm->booted_from_spi) {
@@ -1374,12 +1374,12 @@ static int stfsm_s25fl_config(struct stfsm *fsm)
 		 * Prepare Read/Write/Erase sequences according to S25FLxxx
 		 * 32-bit address command set
 		 */
-		ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read,
+		ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
 						  stfsm_s25fl_read4_configs);
 		if (ret)
 			return ret;
 
-		ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write,
+		ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
 						  stfsm_s25fl_write4_configs);
 		if (ret)
 			return ret;
@@ -1415,7 +1415,7 @@ static int stfsm_s25fl_config(struct stfsm *fsm)
 	}
 
 	/* Check status of 'QE' bit */
-	data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
+	data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
 	stfsm_read_status(fsm, FLASH_CMD_RDSR2, &cr1);
 	if (data_pads == 4) {
 		if (!(cr1 & STFSM_S25FL_CONFIG_QE)) {
@@ -1465,7 +1465,7 @@ static int stfsm_w25q_config(struct stfsm *fsm)
 		return ret;
 
 	/* If using QUAD mode, set QE STATUS bit */
-	data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
+	data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
 	if (data_pads == 4) {
 		stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta1);
 		stfsm_read_status(fsm, FLASH_CMD_RDSR2, &sta2);
@@ -1485,7 +1485,7 @@ static int stfsm_w25q_config(struct stfsm *fsm)
 static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size,
 		      uint32_t offset)
 {
-	struct stfsm_seq *seq = &stfsm_seq_read;
+	struct stfsm_seq *seq = &fsm->stfsm_seq_read;
 	uint32_t data_pads;
 	uint32_t read_mask;
 	uint32_t size_ub;
@@ -1546,7 +1546,7 @@ static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size,
 static int stfsm_write(struct stfsm *fsm, const uint8_t *const buf,
 		       const uint32_t size, const uint32_t offset)
 {
-	struct stfsm_seq *seq = &stfsm_seq_write;
+	struct stfsm_seq *seq = &fsm->stfsm_seq_write;
 	uint32_t data_pads;
 	uint32_t write_mask;
 	uint32_t size_ub;
-- 
1.8.3.2

  parent reply	other threads:[~2014-02-18 14:56 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-18 14:55 [PATCH v5 00/35] mtd: st_spi_fsm: Add new driver Lee Jones
2014-02-18 14:55 ` [PATCH 01/35] mtd: st_spi_fsm: Allocate resources and register with MTD framework Lee Jones
2014-03-09  5:33   ` Brian Norris
2014-03-11  8:23     ` [PATCH v6 " Lee Jones
2014-03-20  7:10       ` Brian Norris
2014-02-18 14:55 ` [PATCH 02/35] mtd: st_spi_fsm: Supply all register address and bit logic defines Lee Jones
2014-02-18 14:55 ` [PATCH 03/35] mtd: st_spi_fsm: Initialise and configure the FSM for normal working conditions Lee Jones
2014-02-18 14:55 ` [PATCH 04/35] mtd: st_spi_fsm: Supply framework for device requests Lee Jones
2014-02-18 14:55 ` [PATCH 05/35] mtd: st_spi_fsm: Supply a method to read from the FSM's FIFO Lee Jones
2014-02-18 14:55 ` [PATCH 06/35] mtd: st_spi_fsm: Add support for JEDEC ID extraction Lee Jones
2014-02-18 14:55 ` [PATCH 07/35] mtd: devices: Provide header for shared OPCODEs and SFDP commands Lee Jones
2014-02-18 14:55 ` [PATCH 08/35] mtd: st_spi_fsm: Provide device look-up table Lee Jones
2014-02-18 14:55 ` [PATCH 09/35] mtd: st_spi_fsm: Dynamically setup flash device based on JEDEC ID Lee Jones
2014-02-18 14:55 ` [PATCH 10/35] mtd: st_spi_fsm: Search for preferred FSM message sequence configurations Lee Jones
2014-02-18 14:55 ` [PATCH 11/35] mtd: st_spi_fsm: Use device size to determine address width Lee Jones
2014-03-20  7:30   ` Brian Norris
2014-02-18 14:55 ` [PATCH 12/35] mtd: st_spi_fsm: Prepare the read/write FSM message sequence(s) Lee Jones
2014-02-18 14:55 ` [PATCH 13/35] mtd: st_spi_fsm: Add device-tree binding documentation Lee Jones
2014-02-18 14:55 ` [PATCH 14/35] mtd: st_spi_fsm: Fetch boot-device from mode pins Lee Jones
2014-02-18 14:55 ` [PATCH 15/35] mtd: st_spi_fsm: Provide the erase one sector sequence Lee Jones
2014-02-18 14:55 ` [PATCH 16/35] mtd: st_spi_fsm: Provide the sequence for enabling 32bit addressing mode Lee Jones
2014-02-18 14:55 ` [PATCH 17/35] mtd: st_spi_fsm: Prepare read/write sequences according to configuration Lee Jones
2014-02-18 14:55 ` [PATCH 18/35] mtd: st_spi_fsm: Add a check to if the chip can handle an SoC reset Lee Jones
2014-02-18 14:55 ` [PATCH 19/35] mtd: st_spi_fsm: Provide a method to put the chip into 32bit addressing mode Lee Jones
2014-02-18 14:55 ` [PATCH 20/35] mtd: st_spi_fsm: Update the flash Volatile Configuration Register Lee Jones
2014-02-18 14:55 ` [PATCH 21/35] mtd: st_spi_fsm: Provide the default read/write configurations Lee Jones
2014-02-18 14:55 ` [PATCH 22/35] mtd: st_spi_fsm: Supply the N25Qxxx specific read configurations Lee Jones
2014-02-18 14:55 ` [PATCH 23/35] mtd: st_spi_fsm: Supply the N25Qxxx chip specific configuration call-back Lee Jones
2014-02-18 14:55 ` [PATCH 24/35] mtd: st_spi_fsm: Prepare default sequences for read/write/erase Lee Jones
2014-02-18 14:55 ` [PATCH 25/35] mtd: st_spi_fsm: Add the ability to read from a Serial Flash device Lee Jones
2014-03-20  7:55   ` Brian Norris
2014-02-18 14:55 ` [PATCH 26/35] mtd: st_spi_fsm: Write to Flash via the FSM FIFO Lee Jones
2014-02-18 14:55 ` [PATCH 27/35] mtd: st_spi_fsm: Supply a busy wait for post-write status Lee Jones
2014-03-20  7:27   ` Brian Norris
2014-02-18 14:55 ` [PATCH 28/35] mtd: st_spi_fsm: Erase partly or as a whole a Serial Flash device Lee Jones
2014-02-18 14:55 ` [PATCH 29/35] mtd: st_spi_fsm: Add the ability to read the FSM's status Lee Jones
2014-02-18 14:55 ` [PATCH 30/35] mtd: st_spi_fsm: Add the ability to write to FSM's status register Lee Jones
2014-02-18 14:55 ` [PATCH 31/35] mtd: st_spi_fsm: Supply the MX25xxx chip specific configuration call-back Lee Jones
2014-02-18 14:55 ` [PATCH 32/35] mtd: st_spi_fsm: Supply the S25FLxxx " Lee Jones
2014-02-18 14:56 ` [PATCH 33/35] mtd: st_spi_fsm: Supply the W25Qxxx " Lee Jones
2014-02-18 14:56 ` Lee Jones [this message]
2014-02-18 14:56 ` [PATCH 35/35] ARM: STi: Add support for the FSM Serial Flash Controller Lee Jones
2014-03-20  8:06 ` [PATCH v5 00/35] mtd: st_spi_fsm: Add new driver Brian Norris

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=1392735362-1245-35-git-send-email-lee.jones@linaro.org \
    --to=lee.jones@linaro.org \
    --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).