1/*
2 * BCM47XX NAND flash driver
3 *
4 * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11
12#include "bcm47xxnflash.h"
13
14#include <linux/module.h>
15#include <linux/kernel.h>
16#include <linux/slab.h>
17#include <linux/delay.h>
18#include <linux/bcma/bcma.h>
19
20/* Broadcom uses 1'000'000 but it seems to be too many. Tests on WNDR4500 has
21 * shown ~1000 retries as maxiumum. */
22#define NFLASH_READY_RETRIES		10000
23
24#define NFLASH_SECTOR_SIZE		512
25
26#define NCTL_CMD0			0x00010000
27#define NCTL_COL			0x00020000	/* Update column with value from BCMA_CC_NFLASH_COL_ADDR */
28#define NCTL_ROW			0x00040000	/* Update row (page) with value from BCMA_CC_NFLASH_ROW_ADDR */
29#define NCTL_CMD1W			0x00080000
30#define NCTL_READ			0x00100000
31#define NCTL_WRITE			0x00200000
32#define NCTL_SPECADDR			0x01000000
33#define NCTL_READY			0x04000000
34#define NCTL_ERR			0x08000000
35#define NCTL_CSA			0x40000000
36#define NCTL_START			0x80000000
37
38/**************************************************
39 * Various helpers
40 **************************************************/
41
42static inline u8 bcm47xxnflash_ops_bcm4706_ns_to_cycle(u16 ns, u16 clock)
43{
44	return ((ns * 1000 * clock) / 1000000) + 1;
45}
46
47static int bcm47xxnflash_ops_bcm4706_ctl_cmd(struct bcma_drv_cc *cc, u32 code)
48{
49	int i = 0;
50
51	bcma_cc_write32(cc, BCMA_CC_NFLASH_CTL, NCTL_START | code);
52	for (i = 0; i < NFLASH_READY_RETRIES; i++) {
53		if (!(bcma_cc_read32(cc, BCMA_CC_NFLASH_CTL) & NCTL_START)) {
54			i = 0;
55			break;
56		}
57	}
58	if (i) {
59		pr_err("NFLASH control command not ready!\n");
60		return -EBUSY;
61	}
62	return 0;
63}
64
65static int bcm47xxnflash_ops_bcm4706_poll(struct bcma_drv_cc *cc)
66{
67	int i;
68
69	for (i = 0; i < NFLASH_READY_RETRIES; i++) {
70		if (bcma_cc_read32(cc, BCMA_CC_NFLASH_CTL) & NCTL_READY) {
71			if (bcma_cc_read32(cc, BCMA_CC_NFLASH_CTL) &
72			    BCMA_CC_NFLASH_CTL_ERR) {
73				pr_err("Error on polling\n");
74				return -EBUSY;
75			} else {
76				return 0;
77			}
78		}
79	}
80
81	pr_err("Polling timeout!\n");
82	return -EBUSY;
83}
84
85/**************************************************
86 * R/W
87 **************************************************/
88
89static void bcm47xxnflash_ops_bcm4706_read(struct mtd_info *mtd, uint8_t *buf,
90					   int len)
91{
92	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
93	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
94
95	u32 ctlcode;
96	u32 *dest = (u32 *)buf;
97	int i;
98	int toread;
99
100	BUG_ON(b47n->curr_page_addr & ~nand_chip->pagemask);
101	/* Don't validate column using nand_chip->page_shift, it may be bigger
102	 * when accessing OOB */
103
104	while (len) {
105		/* We can read maximum of 0x200 bytes at once */
106		toread = min(len, 0x200);
107
108		/* Set page and column */
109		bcma_cc_write32(b47n->cc, BCMA_CC_NFLASH_COL_ADDR,
110				b47n->curr_column);
111		bcma_cc_write32(b47n->cc, BCMA_CC_NFLASH_ROW_ADDR,
112				b47n->curr_page_addr);
113
114		/* Prepare to read */
115		ctlcode = NCTL_CSA | NCTL_CMD1W | NCTL_ROW | NCTL_COL |
116			  NCTL_CMD0;
117		ctlcode |= NAND_CMD_READSTART << 8;
118		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc, ctlcode))
119			return;
120		if (bcm47xxnflash_ops_bcm4706_poll(b47n->cc))
121			return;
122
123		/* Eventually read some data :) */
124		for (i = 0; i < toread; i += 4, dest++) {
125			ctlcode = NCTL_CSA | 0x30000000 | NCTL_READ;
126			if (i == toread - 4) /* Last read goes without that */
127				ctlcode &= ~NCTL_CSA;
128			if (bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc,
129							      ctlcode))
130				return;
131			*dest = bcma_cc_read32(b47n->cc, BCMA_CC_NFLASH_DATA);
132		}
133
134		b47n->curr_column += toread;
135		len -= toread;
136	}
137}
138
139static void bcm47xxnflash_ops_bcm4706_write(struct mtd_info *mtd,
140					    const uint8_t *buf, int len)
141{
142	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
143	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
144	struct bcma_drv_cc *cc = b47n->cc;
145
146	u32 ctlcode;
147	const u32 *data = (u32 *)buf;
148	int i;
149
150	BUG_ON(b47n->curr_page_addr & ~nand_chip->pagemask);
151	/* Don't validate column using nand_chip->page_shift, it may be bigger
152	 * when accessing OOB */
153
154	for (i = 0; i < len; i += 4, data++) {
155		bcma_cc_write32(cc, BCMA_CC_NFLASH_DATA, *data);
156
157		ctlcode = NCTL_CSA | 0x30000000 | NCTL_WRITE;
158		if (i == len - 4) /* Last read goes without that */
159			ctlcode &= ~NCTL_CSA;
160		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, ctlcode)) {
161			pr_err("%s ctl_cmd didn't work!\n", __func__);
162			return;
163		}
164	}
165
166	b47n->curr_column += len;
167}
168
169/**************************************************
170 * NAND chip ops
171 **************************************************/
172
173static void bcm47xxnflash_ops_bcm4706_cmd_ctrl(struct mtd_info *mtd, int cmd,
174					       unsigned int ctrl)
175{
176	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
177	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
178	u32 code = 0;
179
180	if (cmd == NAND_CMD_NONE)
181		return;
182
183	if (cmd & NAND_CTRL_CLE)
184		code = cmd | NCTL_CMD0;
185
186	/* nCS is not needed for reset command */
187	if (cmd != NAND_CMD_RESET)
188		code |= NCTL_CSA;
189
190	bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc, code);
191}
192
193/* Default nand_select_chip calls cmd_ctrl, which is not used in BCM4706 */
194static void bcm47xxnflash_ops_bcm4706_select_chip(struct mtd_info *mtd,
195						  int chip)
196{
197	return;
198}
199
200static int bcm47xxnflash_ops_bcm4706_dev_ready(struct mtd_info *mtd)
201{
202	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
203	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
204
205	return !!(bcma_cc_read32(b47n->cc, BCMA_CC_NFLASH_CTL) & NCTL_READY);
206}
207
208/*
209 * Default nand_command and nand_command_lp don't match BCM4706 hardware layout.
210 * For example, reading chip id is performed in a non-standard way.
211 * Setting column and page is also handled differently, we use a special
212 * registers of ChipCommon core. Hacking cmd_ctrl to understand and convert
213 * standard commands would be much more complicated.
214 */
215static void bcm47xxnflash_ops_bcm4706_cmdfunc(struct mtd_info *mtd,
216					      unsigned command, int column,
217					      int page_addr)
218{
219	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
220	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
221	struct bcma_drv_cc *cc = b47n->cc;
222	u32 ctlcode;
223	int i;
224
225	if (column != -1)
226		b47n->curr_column = column;
227	if (page_addr != -1)
228		b47n->curr_page_addr = page_addr;
229
230	switch (command) {
231	case NAND_CMD_RESET:
232		nand_chip->cmd_ctrl(mtd, command, NAND_CTRL_CLE);
233
234		ndelay(100);
235		nand_wait_ready(mtd);
236		break;
237	case NAND_CMD_READID:
238		ctlcode = NCTL_CSA | 0x01000000 | NCTL_CMD1W | NCTL_CMD0;
239		ctlcode |= NAND_CMD_READID;
240		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc, ctlcode)) {
241			pr_err("READID error\n");
242			break;
243		}
244
245		/*
246		 * Reading is specific, last one has to go without NCTL_CSA
247		 * bit. We don't know how many reads NAND subsystem is going
248		 * to perform, so cache everything.
249		 */
250		for (i = 0; i < ARRAY_SIZE(b47n->id_data); i++) {
251			ctlcode = NCTL_CSA | NCTL_READ;
252			if (i == ARRAY_SIZE(b47n->id_data) - 1)
253				ctlcode &= ~NCTL_CSA;
254			if (bcm47xxnflash_ops_bcm4706_ctl_cmd(b47n->cc,
255							      ctlcode)) {
256				pr_err("READID error\n");
257				break;
258			}
259			b47n->id_data[i] =
260				bcma_cc_read32(b47n->cc, BCMA_CC_NFLASH_DATA)
261				& 0xFF;
262		}
263
264		break;
265	case NAND_CMD_STATUS:
266		ctlcode = NCTL_CSA | NCTL_CMD0 | NAND_CMD_STATUS;
267		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, ctlcode))
268			pr_err("STATUS command error\n");
269		break;
270	case NAND_CMD_READ0:
271		break;
272	case NAND_CMD_READOOB:
273		if (page_addr != -1)
274			b47n->curr_column += mtd->writesize;
275		break;
276	case NAND_CMD_ERASE1:
277		bcma_cc_write32(cc, BCMA_CC_NFLASH_ROW_ADDR,
278				b47n->curr_page_addr);
279		ctlcode = NCTL_ROW | NCTL_CMD1W | NCTL_CMD0 |
280			  NAND_CMD_ERASE1 | (NAND_CMD_ERASE2 << 8);
281		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, ctlcode))
282			pr_err("ERASE1 failed\n");
283		break;
284	case NAND_CMD_ERASE2:
285		break;
286	case NAND_CMD_SEQIN:
287		/* Set page and column */
288		bcma_cc_write32(cc, BCMA_CC_NFLASH_COL_ADDR,
289				b47n->curr_column);
290		bcma_cc_write32(cc, BCMA_CC_NFLASH_ROW_ADDR,
291				b47n->curr_page_addr);
292
293		/* Prepare to write */
294		ctlcode = 0x40000000 | NCTL_ROW | NCTL_COL | NCTL_CMD0;
295		ctlcode |= NAND_CMD_SEQIN;
296		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, ctlcode))
297			pr_err("SEQIN failed\n");
298		break;
299	case NAND_CMD_PAGEPROG:
300		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, NCTL_CMD0 |
301							  NAND_CMD_PAGEPROG))
302			pr_err("PAGEPROG failed\n");
303		if (bcm47xxnflash_ops_bcm4706_poll(cc))
304			pr_err("PAGEPROG not ready\n");
305		break;
306	default:
307		pr_err("Command 0x%X unsupported\n", command);
308		break;
309	}
310	b47n->curr_command = command;
311}
312
313static u8 bcm47xxnflash_ops_bcm4706_read_byte(struct mtd_info *mtd)
314{
315	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
316	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
317	struct bcma_drv_cc *cc = b47n->cc;
318	u32 tmp = 0;
319
320	switch (b47n->curr_command) {
321	case NAND_CMD_READID:
322		if (b47n->curr_column >= ARRAY_SIZE(b47n->id_data)) {
323			pr_err("Requested invalid id_data: %d\n",
324			       b47n->curr_column);
325			return 0;
326		}
327		return b47n->id_data[b47n->curr_column++];
328	case NAND_CMD_STATUS:
329		if (bcm47xxnflash_ops_bcm4706_ctl_cmd(cc, NCTL_READ))
330			return 0;
331		return bcma_cc_read32(cc, BCMA_CC_NFLASH_DATA) & 0xff;
332	case NAND_CMD_READOOB:
333		bcm47xxnflash_ops_bcm4706_read(mtd, (u8 *)&tmp, 4);
334		return tmp & 0xFF;
335	}
336
337	pr_err("Invalid command for byte read: 0x%X\n", b47n->curr_command);
338	return 0;
339}
340
341static void bcm47xxnflash_ops_bcm4706_read_buf(struct mtd_info *mtd,
342					       uint8_t *buf, int len)
343{
344	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
345	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
346
347	switch (b47n->curr_command) {
348	case NAND_CMD_READ0:
349	case NAND_CMD_READOOB:
350		bcm47xxnflash_ops_bcm4706_read(mtd, buf, len);
351		return;
352	}
353
354	pr_err("Invalid command for buf read: 0x%X\n", b47n->curr_command);
355}
356
357static void bcm47xxnflash_ops_bcm4706_write_buf(struct mtd_info *mtd,
358						const uint8_t *buf, int len)
359{
360	struct nand_chip *nand_chip = (struct nand_chip *)mtd->priv;
361	struct bcm47xxnflash *b47n = (struct bcm47xxnflash *)nand_chip->priv;
362
363	switch (b47n->curr_command) {
364	case NAND_CMD_SEQIN:
365		bcm47xxnflash_ops_bcm4706_write(mtd, buf, len);
366		return;
367	}
368
369	pr_err("Invalid command for buf write: 0x%X\n", b47n->curr_command);
370}
371
372/**************************************************
373 * Init
374 **************************************************/
375
376int bcm47xxnflash_ops_bcm4706_init(struct bcm47xxnflash *b47n)
377{
378	struct nand_chip *nand_chip = (struct nand_chip *)&b47n->nand_chip;
379	int err;
380	u32 freq;
381	u16 clock;
382	u8 w0, w1, w2, w3, w4;
383
384	unsigned long chipsize; /* MiB */
385	u8 tbits, col_bits, col_size, row_bits, row_bsize;
386	u32 val;
387
388	b47n->nand_chip.select_chip = bcm47xxnflash_ops_bcm4706_select_chip;
389	nand_chip->cmd_ctrl = bcm47xxnflash_ops_bcm4706_cmd_ctrl;
390	nand_chip->dev_ready = bcm47xxnflash_ops_bcm4706_dev_ready;
391	b47n->nand_chip.cmdfunc = bcm47xxnflash_ops_bcm4706_cmdfunc;
392	b47n->nand_chip.read_byte = bcm47xxnflash_ops_bcm4706_read_byte;
393	b47n->nand_chip.read_buf = bcm47xxnflash_ops_bcm4706_read_buf;
394	b47n->nand_chip.write_buf = bcm47xxnflash_ops_bcm4706_write_buf;
395
396	nand_chip->chip_delay = 50;
397	b47n->nand_chip.bbt_options = NAND_BBT_USE_FLASH;
398	b47n->nand_chip.ecc.mode = NAND_ECC_NONE; /* TODO: implement ECC */
399
400	/* Enable NAND flash access */
401	bcma_cc_set32(b47n->cc, BCMA_CC_4706_FLASHSCFG,
402		      BCMA_CC_4706_FLASHSCFG_NF1);
403
404	/* Configure wait counters */
405	if (b47n->cc->status & BCMA_CC_CHIPST_4706_PKG_OPTION) {
406		/* 400 MHz */
407		freq = 400000000 / 4;
408	} else {
409		freq = bcma_chipco_pll_read(b47n->cc, 4);
410		freq = (freq & 0xFFF) >> 3;
411		/* Fixed reference clock 25 MHz and m = 2 */
412		freq = (freq * 25000000 / 2) / 4;
413	}
414	clock = freq / 1000000;
415	w0 = bcm47xxnflash_ops_bcm4706_ns_to_cycle(15, clock);
416	w1 = bcm47xxnflash_ops_bcm4706_ns_to_cycle(20, clock);
417	w2 = bcm47xxnflash_ops_bcm4706_ns_to_cycle(10, clock);
418	w3 = bcm47xxnflash_ops_bcm4706_ns_to_cycle(10, clock);
419	w4 = bcm47xxnflash_ops_bcm4706_ns_to_cycle(100, clock);
420	bcma_cc_write32(b47n->cc, BCMA_CC_NFLASH_WAITCNT0,
421			(w4 << 24 | w3 << 18 | w2 << 12 | w1 << 6 | w0));
422
423	/* Scan NAND */
424	err = nand_scan(&b47n->mtd, 1);
425	if (err) {
426		pr_err("Could not scan NAND flash: %d\n", err);
427		goto exit;
428	}
429
430	/* Configure FLASH */
431	chipsize = b47n->nand_chip.chipsize >> 20;
432	tbits = ffs(chipsize); /* find first bit set */
433	if (!tbits || tbits != fls(chipsize)) {
434		pr_err("Invalid flash size: 0x%lX\n", chipsize);
435		err = -ENOTSUPP;
436		goto exit;
437	}
438	tbits += 19; /* Broadcom increases *index* by 20, we increase *pos* */
439
440	col_bits = b47n->nand_chip.page_shift + 1;
441	col_size = (col_bits + 7) / 8;
442
443	row_bits = tbits - col_bits + 1;
444	row_bsize = (row_bits + 7) / 8;
445
446	val = ((row_bsize - 1) << 6) | ((col_size - 1) << 4) | 2;
447	bcma_cc_write32(b47n->cc, BCMA_CC_NFLASH_CONF, val);
448
449exit:
450	if (err)
451		bcma_cc_mask32(b47n->cc, BCMA_CC_4706_FLASHSCFG,
452			       ~BCMA_CC_4706_FLASHSCFG_NF1);
453	return err;
454}
455