1 #include <linux/kernel.h>
2 #include <linux/module.h>
3 #include <linux/slab.h>
4 #include <linux/delay.h>
5 #include <linux/mtd/mtd.h>
6 #include <linux/platform_device.h>
7 #include <linux/bcma/bcma.h>
9 #include "bcm47xxsflash.h"
11 MODULE_LICENSE("GPL");
12 MODULE_DESCRIPTION("Serial flash driver for BCMA bus");
14 static const char * const probes
[] = { "bcm47xxpart", NULL
};
16 /**************************************************
18 **************************************************/
20 static void bcm47xxsflash_cmd(struct bcm47xxsflash
*b47s
, u32 opcode
)
24 b47s
->cc_write(b47s
, BCMA_CC_FLASHCTL
, BCMA_CC_FLASHCTL_START
| opcode
);
25 for (i
= 0; i
< 1000; i
++) {
26 if (!(b47s
->cc_read(b47s
, BCMA_CC_FLASHCTL
) &
27 BCMA_CC_FLASHCTL_BUSY
))
31 pr_err("Control command failed (timeout)!\n");
34 static int bcm47xxsflash_poll(struct bcm47xxsflash
*b47s
, int timeout
)
36 unsigned long deadline
= jiffies
+ timeout
;
40 case BCM47XXSFLASH_TYPE_ST
:
41 bcm47xxsflash_cmd(b47s
, OPCODE_ST_RDSR
);
42 if (!(b47s
->cc_read(b47s
, BCMA_CC_FLASHDATA
) &
46 case BCM47XXSFLASH_TYPE_ATMEL
:
47 bcm47xxsflash_cmd(b47s
, OPCODE_AT_STATUS
);
48 if (b47s
->cc_read(b47s
, BCMA_CC_FLASHDATA
) &
56 } while (!time_after_eq(jiffies
, deadline
));
58 pr_err("Timeout waiting for flash to be ready!\n");
63 /**************************************************
65 **************************************************/
67 static int bcm47xxsflash_erase(struct mtd_info
*mtd
, struct erase_info
*erase
)
69 struct bcm47xxsflash
*b47s
= mtd
->priv
;
73 case BCM47XXSFLASH_TYPE_ST
:
74 bcm47xxsflash_cmd(b47s
, OPCODE_ST_WREN
);
75 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, erase
->addr
);
76 /* Newer flashes have "sub-sectors" which can be erased
77 * independently with a new command: ST_SSE. The ST_SE command
78 * erases 64KB just as before.
80 if (b47s
->blocksize
< (64 * 1024))
81 bcm47xxsflash_cmd(b47s
, OPCODE_ST_SSE
);
83 bcm47xxsflash_cmd(b47s
, OPCODE_ST_SE
);
85 case BCM47XXSFLASH_TYPE_ATMEL
:
86 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, erase
->addr
<< 1);
87 bcm47xxsflash_cmd(b47s
, OPCODE_AT_PAGE_ERASE
);
91 err
= bcm47xxsflash_poll(b47s
, HZ
);
93 erase
->state
= MTD_ERASE_FAILED
;
95 erase
->state
= MTD_ERASE_DONE
;
98 erase
->callback(erase
);
103 static int bcm47xxsflash_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
104 size_t *retlen
, u_char
*buf
)
106 struct bcm47xxsflash
*b47s
= mtd
->priv
;
108 /* Check address range */
109 if ((from
+ len
) > mtd
->size
)
112 memcpy_fromio(buf
, (void __iomem
*)KSEG0ADDR(b47s
->window
+ from
),
119 static int bcm47xxsflash_write_st(struct mtd_info
*mtd
, u32 offset
, size_t len
,
122 struct bcm47xxsflash
*b47s
= mtd
->priv
;
126 bcm47xxsflash_cmd(b47s
, OPCODE_ST_WREN
);
128 /* Write first byte */
129 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, offset
);
130 b47s
->cc_write(b47s
, BCMA_CC_FLASHDATA
, *buf
++);
133 if (b47s
->bcma_cc
->core
->id
.rev
< 20) {
134 bcm47xxsflash_cmd(b47s
, OPCODE_ST_PP
);
135 return 1; /* 1B written */
138 /* Program page and set CSA (on newer chips we can continue writing) */
139 bcm47xxsflash_cmd(b47s
, OPCODE_ST_CSA
| OPCODE_ST_PP
);
145 /* Page boundary, another function call is needed */
146 if ((offset
& 0xFF) == 0)
149 bcm47xxsflash_cmd(b47s
, OPCODE_ST_CSA
| *buf
++);
155 /* All done, drop CSA & poll */
156 b47s
->cc_write(b47s
, BCMA_CC_FLASHCTL
, 0);
158 if (bcm47xxsflash_poll(b47s
, HZ
/ 10))
159 pr_err("Flash rejected dropping CSA\n");
164 static int bcm47xxsflash_write_at(struct mtd_info
*mtd
, u32 offset
, size_t len
,
167 struct bcm47xxsflash
*b47s
= mtd
->priv
;
168 u32 mask
= b47s
->blocksize
- 1;
169 u32 page
= (offset
& ~mask
) << 1;
170 u32 byte
= offset
& mask
;
173 /* If we don't overwrite whole page, read it to the buffer first */
174 if (byte
|| (len
< b47s
->blocksize
)) {
177 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, page
);
178 bcm47xxsflash_cmd(b47s
, OPCODE_AT_BUF1_LOAD
);
179 /* 250 us for AT45DB321B */
180 err
= bcm47xxsflash_poll(b47s
, HZ
/ 1000);
182 pr_err("Timeout reading page 0x%X info buffer\n", page
);
187 /* Change buffer content with our data */
189 /* Page boundary, another function call is needed */
190 if (byte
== b47s
->blocksize
)
193 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, byte
++);
194 b47s
->cc_write(b47s
, BCMA_CC_FLASHDATA
, *buf
++);
195 bcm47xxsflash_cmd(b47s
, OPCODE_AT_BUF1_WRITE
);
200 /* Program page with the buffer content */
201 b47s
->cc_write(b47s
, BCMA_CC_FLASHADDR
, page
);
202 bcm47xxsflash_cmd(b47s
, OPCODE_AT_BUF1_PROGRAM
);
207 static int bcm47xxsflash_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
208 size_t *retlen
, const u_char
*buf
)
210 struct bcm47xxsflash
*b47s
= mtd
->priv
;
213 /* Writing functions can return without writing all passed data, for
214 * example when the hardware is too old or when we git page boundary.
217 switch (b47s
->type
) {
218 case BCM47XXSFLASH_TYPE_ST
:
219 written
= bcm47xxsflash_write_st(mtd
, to
, len
, buf
);
221 case BCM47XXSFLASH_TYPE_ATMEL
:
222 written
= bcm47xxsflash_write_at(mtd
, to
, len
, buf
);
228 pr_err("Error writing at offset 0x%llX\n", to
);
231 to
+= (loff_t
)written
;
240 static void bcm47xxsflash_fill_mtd(struct bcm47xxsflash
*b47s
)
242 struct mtd_info
*mtd
= &b47s
->mtd
;
245 mtd
->name
= "bcm47xxsflash";
246 mtd
->owner
= THIS_MODULE
;
248 mtd
->type
= MTD_NORFLASH
;
249 mtd
->flags
= MTD_CAP_NORFLASH
;
250 mtd
->size
= b47s
->size
;
251 mtd
->erasesize
= b47s
->blocksize
;
253 mtd
->writebufsize
= 1;
255 mtd
->_erase
= bcm47xxsflash_erase
;
256 mtd
->_read
= bcm47xxsflash_read
;
257 mtd
->_write
= bcm47xxsflash_write
;
260 /**************************************************
262 **************************************************/
264 static int bcm47xxsflash_bcma_cc_read(struct bcm47xxsflash
*b47s
, u16 offset
)
266 return bcma_cc_read32(b47s
->bcma_cc
, offset
);
269 static void bcm47xxsflash_bcma_cc_write(struct bcm47xxsflash
*b47s
, u16 offset
,
272 bcma_cc_write32(b47s
->bcma_cc
, offset
, value
);
275 static int bcm47xxsflash_bcma_probe(struct platform_device
*pdev
)
277 struct bcma_sflash
*sflash
= dev_get_platdata(&pdev
->dev
);
278 struct bcm47xxsflash
*b47s
;
281 b47s
= devm_kzalloc(&pdev
->dev
, sizeof(*b47s
), GFP_KERNEL
);
286 b47s
->bcma_cc
= container_of(sflash
, struct bcma_drv_cc
, sflash
);
287 b47s
->cc_read
= bcm47xxsflash_bcma_cc_read
;
288 b47s
->cc_write
= bcm47xxsflash_bcma_cc_write
;
290 switch (b47s
->bcma_cc
->capabilities
& BCMA_CC_CAP_FLASHT
) {
291 case BCMA_CC_FLASHT_STSER
:
292 b47s
->type
= BCM47XXSFLASH_TYPE_ST
;
294 case BCMA_CC_FLASHT_ATSER
:
295 b47s
->type
= BCM47XXSFLASH_TYPE_ATMEL
;
299 b47s
->window
= sflash
->window
;
300 b47s
->blocksize
= sflash
->blocksize
;
301 b47s
->numblocks
= sflash
->numblocks
;
302 b47s
->size
= sflash
->size
;
303 bcm47xxsflash_fill_mtd(b47s
);
305 err
= mtd_device_parse_register(&b47s
->mtd
, probes
, NULL
, NULL
, 0);
307 pr_err("Failed to register MTD device: %d\n", err
);
311 if (bcm47xxsflash_poll(b47s
, HZ
/ 10))
312 pr_warn("Serial flash busy\n");
317 static int bcm47xxsflash_bcma_remove(struct platform_device
*pdev
)
319 struct bcma_sflash
*sflash
= dev_get_platdata(&pdev
->dev
);
320 struct bcm47xxsflash
*b47s
= sflash
->priv
;
322 mtd_device_unregister(&b47s
->mtd
);
327 static struct platform_driver bcma_sflash_driver
= {
328 .probe
= bcm47xxsflash_bcma_probe
,
329 .remove
= bcm47xxsflash_bcma_remove
,
331 .name
= "bcma_sflash",
332 .owner
= THIS_MODULE
,
336 /**************************************************
338 **************************************************/
340 module_platform_driver(bcma_sflash_driver
);