diff options
author | Brian Norris <computersforpeace@gmail.com> | 2014-09-10 03:26:16 -0400 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2014-11-05 05:01:32 -0500 |
commit | 51983b7dcf3a50f4fdf6353235cd520e6c946e5a (patch) | |
tree | f7fc5ac39a0468a40c0a4c24607702b7cb55311b /drivers/mtd | |
parent | e76064464e814bdfe12d0f73d859488e28578946 (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.c | 66 |
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 | 168 | static inline int spi_nor_sr_ready(struct spi_nor *nor) | |
169 | static 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); | 177 | static 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; | 186 | static 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 | ||
189 | static int spi_nor_wait_till_fsr_ready(struct spi_nor *nor) | 198 | static 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 */ |