aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2014-09-10 03:26:16 -0400
committerBrian Norris <computersforpeace@gmail.com>2014-11-05 05:01:32 -0500
commit51983b7dcf3a50f4fdf6353235cd520e6c946e5a (patch)
treef7fc5ac39a0468a40c0a4c24607702b7cb55311b /drivers/mtd
parente76064464e814bdfe12d0f73d859488e28578946 (diff)
mtd: spi-nor: eliminate duplicate spi_nor_wait_till_{, fsr}_ready() code
These functions were near-carbon-copies due to a small per-flash quirk. Let's add a new spi_nor::flags bitfield to support these types of quirks. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Reviewed-by: Marek Vasut <marex@denx.de> Cc: Graham Moore <grmoore@altera.com> Cc: Huang Shijie <shijie8@gmail.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c66
1 files changed, 34 insertions, 32 deletions
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index ea6516d120e7..c66de2fc89d6 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -165,48 +165,51 @@ static inline int set_4byte(struct spi_nor *nor, u32 jedec_id, int enable)
165 return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1, 0); 165 return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1, 0);
166 } 166 }
167} 167}
168 168static inline int spi_nor_sr_ready(struct spi_nor *nor)
169static int spi_nor_wait_till_ready(struct spi_nor *nor)
170{ 169{
171 unsigned long deadline; 170 int sr = read_sr(nor);
172 int sr; 171 if (sr < 0)
173 172 return sr;
174 deadline = jiffies + MAX_READY_WAIT_JIFFIES; 173 else
175 174 return !(sr & SR_WIP);
176 do { 175}
177 cond_resched();
178 176
179 sr = read_sr(nor); 177static inline int spi_nor_fsr_ready(struct spi_nor *nor)
180 if (sr < 0) 178{
181 break; 179 int fsr = read_fsr(nor);
182 else if (!(sr & SR_WIP)) 180 if (fsr < 0)
183 return 0; 181 return fsr;
184 } while (!time_after_eq(jiffies, deadline)); 182 else
183 return fsr & FSR_READY;
184}
185 185
186 return -ETIMEDOUT; 186static int spi_nor_ready(struct spi_nor *nor)
187{
188 int sr, fsr;
189 sr = spi_nor_sr_ready(nor);
190 if (sr < 0)
191 return sr;
192 fsr = nor->flags & SNOR_F_USE_FSR ? spi_nor_fsr_ready(nor) : 1;
193 if (fsr < 0)
194 return fsr;
195 return sr && fsr;
187} 196}
188 197
189static int spi_nor_wait_till_fsr_ready(struct spi_nor *nor) 198static int spi_nor_wait_till_ready(struct spi_nor *nor)
190{ 199{
191 unsigned long deadline; 200 unsigned long deadline;
192 int sr; 201 int ret;
193 int fsr;
194 202
195 deadline = jiffies + MAX_READY_WAIT_JIFFIES; 203 deadline = jiffies + MAX_READY_WAIT_JIFFIES;
196 204
197 do { 205 do {
198 cond_resched(); 206 cond_resched();
199 207
200 sr = read_sr(nor); 208 ret = spi_nor_ready(nor);
201 if (sr < 0) { 209 if (ret < 0)
202 break; 210 return ret;
203 } else if (!(sr & SR_WIP)) { 211 if (ret)
204 fsr = read_fsr(nor); 212 return 0;
205 if (fsr < 0)
206 break;
207 if (fsr & FSR_READY)
208 return 0;
209 }
210 } while (!time_after_eq(jiffies, deadline)); 213 } while (!time_after_eq(jiffies, deadline));
211 214
212 return -ETIMEDOUT; 215 return -ETIMEDOUT;
@@ -986,9 +989,8 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
986 else 989 else
987 mtd->_write = spi_nor_write; 990 mtd->_write = spi_nor_write;
988 991
989 if ((info->flags & USE_FSR) && 992 if (info->flags & USE_FSR)
990 nor->wait_till_ready == spi_nor_wait_till_ready) 993 nor->flags |= SNOR_F_USE_FSR;
991 nor->wait_till_ready = spi_nor_wait_till_fsr_ready;
992 994
993#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS 995#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
994 /* prefer "small sector" erase if possible */ 996 /* prefer "small sector" erase if possible */