xref: /linux/drivers/mtd/nand/qpic_common.c (revision 68a052239fc4b351e961f698b824f7654a346091)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2016, The Linux Foundation. All rights reserved.
4  * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved
5  */
6 #include <linux/clk.h>
7 #include <linux/delay.h>
8 #include <linux/dmaengine.h>
9 #include <linux/dma-mapping.h>
10 #include <linux/dma/qcom_adm.h>
11 #include <linux/dma/qcom_bam_dma.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <linux/platform_device.h>
15 #include <linux/slab.h>
16 #include <linux/mtd/nand-qpic-common.h>
17 
18 /**
19  * qcom_free_bam_transaction() - Frees the BAM transaction memory
20  * @nandc: qpic nand controller
21  *
22  * This function frees the bam transaction memory
23  */
24 void qcom_free_bam_transaction(struct qcom_nand_controller *nandc)
25 {
26 	struct bam_transaction *bam_txn = nandc->bam_txn;
27 
28 	kfree(bam_txn);
29 }
30 EXPORT_SYMBOL(qcom_free_bam_transaction);
31 
32 /**
33  * qcom_alloc_bam_transaction() - allocate BAM transaction
34  * @nandc: qpic nand controller
35  *
36  * This function will allocate and initialize the BAM transaction structure
37  */
38 struct bam_transaction *
39 qcom_alloc_bam_transaction(struct qcom_nand_controller *nandc)
40 {
41 	struct bam_transaction *bam_txn;
42 	size_t bam_txn_size;
43 	unsigned int num_cw = nandc->max_cwperpage;
44 	void *bam_txn_buf;
45 
46 	bam_txn_size =
47 		sizeof(*bam_txn) + num_cw *
48 		((sizeof(*bam_txn->bam_ce) * QPIC_PER_CW_CMD_ELEMENTS) +
49 		(sizeof(*bam_txn->cmd_sgl) * QPIC_PER_CW_CMD_SGL) +
50 		(sizeof(*bam_txn->data_sgl) * QPIC_PER_CW_DATA_SGL));
51 
52 	bam_txn_buf = kzalloc(bam_txn_size, GFP_KERNEL);
53 	if (!bam_txn_buf)
54 		return NULL;
55 
56 	bam_txn = bam_txn_buf;
57 	bam_txn_buf += sizeof(*bam_txn);
58 
59 	bam_txn->bam_ce = bam_txn_buf;
60 	bam_txn->bam_ce_nitems = QPIC_PER_CW_CMD_ELEMENTS * num_cw;
61 	bam_txn_buf += sizeof(*bam_txn->bam_ce) * bam_txn->bam_ce_nitems;
62 
63 	bam_txn->cmd_sgl = bam_txn_buf;
64 	bam_txn->cmd_sgl_nitems = QPIC_PER_CW_CMD_SGL * num_cw;
65 	bam_txn_buf += sizeof(*bam_txn->cmd_sgl) * bam_txn->cmd_sgl_nitems;
66 
67 	bam_txn->data_sgl = bam_txn_buf;
68 	bam_txn->data_sgl_nitems = QPIC_PER_CW_DATA_SGL * num_cw;
69 
70 	init_completion(&bam_txn->txn_done);
71 
72 	return bam_txn;
73 }
74 EXPORT_SYMBOL(qcom_alloc_bam_transaction);
75 
76 /**
77  * qcom_clear_bam_transaction() - Clears the BAM transaction
78  * @nandc: qpic nand controller
79  *
80  * This function will clear the BAM transaction indexes.
81  */
82 void qcom_clear_bam_transaction(struct qcom_nand_controller *nandc)
83 {
84 	struct bam_transaction *bam_txn = nandc->bam_txn;
85 
86 	if (!nandc->props->supports_bam)
87 		return;
88 
89 	memset(&bam_txn->bam_positions, 0, sizeof(bam_txn->bam_positions));
90 	bam_txn->last_data_desc = NULL;
91 
92 	sg_init_table(bam_txn->cmd_sgl, bam_txn->cmd_sgl_nitems);
93 	sg_init_table(bam_txn->data_sgl, bam_txn->data_sgl_nitems);
94 
95 	reinit_completion(&bam_txn->txn_done);
96 }
97 EXPORT_SYMBOL(qcom_clear_bam_transaction);
98 
99 /**
100  * qcom_qpic_bam_dma_done() - Callback for DMA descriptor completion
101  * @data: data pointer
102  *
103  * This function is a callback for DMA descriptor completion
104  */
105 void qcom_qpic_bam_dma_done(void *data)
106 {
107 	struct bam_transaction *bam_txn = data;
108 
109 	complete(&bam_txn->txn_done);
110 }
111 EXPORT_SYMBOL(qcom_qpic_bam_dma_done);
112 
113 /**
114  * qcom_nandc_dev_to_mem() - Check for dma sync for cpu or device
115  * @nandc: qpic nand controller
116  * @is_cpu: cpu or Device
117  *
118  * This function will check for dma sync for cpu or device
119  */
120 inline void qcom_nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
121 {
122 	if (!nandc->props->supports_bam)
123 		return;
124 
125 	if (is_cpu)
126 		dma_sync_single_for_cpu(nandc->dev, nandc->reg_read_dma,
127 					MAX_REG_RD *
128 					sizeof(*nandc->reg_read_buf),
129 					DMA_FROM_DEVICE);
130 	else
131 		dma_sync_single_for_device(nandc->dev, nandc->reg_read_dma,
132 					   MAX_REG_RD *
133 					   sizeof(*nandc->reg_read_buf),
134 					   DMA_FROM_DEVICE);
135 }
136 EXPORT_SYMBOL(qcom_nandc_dev_to_mem);
137 
138 /**
139  * qcom_prepare_bam_async_desc() - Prepare DMA descriptor
140  * @nandc: qpic nand controller
141  * @chan: dma channel
142  * @flags: flags to control DMA descriptor preparation
143  *
144  * This function maps the scatter gather list for DMA transfer and forms the
145  * DMA descriptor for BAM.This descriptor will be added in the NAND DMA
146  * descriptor queue which will be submitted to DMA engine.
147  */
148 int qcom_prepare_bam_async_desc(struct qcom_nand_controller *nandc,
149 				struct dma_chan *chan, unsigned long flags)
150 {
151 	struct desc_info *desc;
152 	struct scatterlist *sgl;
153 	unsigned int sgl_cnt;
154 	int ret;
155 	struct bam_transaction *bam_txn = nandc->bam_txn;
156 	enum dma_transfer_direction dir_eng;
157 	struct dma_async_tx_descriptor *dma_desc;
158 
159 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
160 	if (!desc)
161 		return -ENOMEM;
162 
163 	if (chan == nandc->cmd_chan) {
164 		sgl = &bam_txn->cmd_sgl[bam_txn->cmd_sgl_start];
165 		sgl_cnt = bam_txn->cmd_sgl_pos - bam_txn->cmd_sgl_start;
166 		bam_txn->cmd_sgl_start = bam_txn->cmd_sgl_pos;
167 		dir_eng = DMA_MEM_TO_DEV;
168 		desc->dir = DMA_TO_DEVICE;
169 	} else if (chan == nandc->tx_chan) {
170 		sgl = &bam_txn->data_sgl[bam_txn->tx_sgl_start];
171 		sgl_cnt = bam_txn->tx_sgl_pos - bam_txn->tx_sgl_start;
172 		bam_txn->tx_sgl_start = bam_txn->tx_sgl_pos;
173 		dir_eng = DMA_MEM_TO_DEV;
174 		desc->dir = DMA_TO_DEVICE;
175 	} else {
176 		sgl = &bam_txn->data_sgl[bam_txn->rx_sgl_start];
177 		sgl_cnt = bam_txn->rx_sgl_pos - bam_txn->rx_sgl_start;
178 		bam_txn->rx_sgl_start = bam_txn->rx_sgl_pos;
179 		dir_eng = DMA_DEV_TO_MEM;
180 		desc->dir = DMA_FROM_DEVICE;
181 	}
182 
183 	sg_mark_end(sgl + sgl_cnt - 1);
184 	ret = dma_map_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
185 	if (ret == 0) {
186 		dev_err(nandc->dev, "failure in mapping desc\n");
187 		kfree(desc);
188 		return -ENOMEM;
189 	}
190 
191 	desc->sgl_cnt = sgl_cnt;
192 	desc->bam_sgl = sgl;
193 
194 	dma_desc = dmaengine_prep_slave_sg(chan, sgl, sgl_cnt, dir_eng,
195 					   flags);
196 
197 	if (!dma_desc) {
198 		dev_err(nandc->dev, "failure in prep desc\n");
199 		dma_unmap_sg(nandc->dev, sgl, sgl_cnt, desc->dir);
200 		kfree(desc);
201 		return -EINVAL;
202 	}
203 
204 	desc->dma_desc = dma_desc;
205 
206 	/* update last data/command descriptor */
207 	if (chan == nandc->cmd_chan)
208 		bam_txn->last_cmd_desc = dma_desc;
209 	else
210 		bam_txn->last_data_desc = dma_desc;
211 
212 	list_add_tail(&desc->node, &nandc->desc_list);
213 
214 	return 0;
215 }
216 EXPORT_SYMBOL(qcom_prepare_bam_async_desc);
217 
218 /**
219  * qcom_prep_bam_dma_desc_cmd() - Prepares the command descriptor for BAM DMA
220  * @nandc: qpic nand controller
221  * @read: read or write type
222  * @reg_off: offset within the controller's data buffer
223  * @vaddr: virtual address of the buffer we want to write to
224  * @size: DMA transaction size in bytes
225  * @flags: flags to control DMA descriptor preparation
226  *
227  * This function will prepares the command descriptor for BAM DMA
228  * which will be used for NAND register reads and writes.
229  */
230 int qcom_prep_bam_dma_desc_cmd(struct qcom_nand_controller *nandc, bool read,
231 			       int reg_off, const void *vaddr,
232 			       int size, unsigned int flags)
233 {
234 	int bam_ce_size;
235 	int i, ret;
236 	struct bam_cmd_element *bam_ce_buffer;
237 	struct bam_transaction *bam_txn = nandc->bam_txn;
238 	u32 offset;
239 
240 	if (bam_txn->bam_ce_pos + size > bam_txn->bam_ce_nitems) {
241 		dev_err(nandc->dev, "BAM %s array is full\n", "CE");
242 		return -EINVAL;
243 	}
244 
245 	bam_ce_buffer = &bam_txn->bam_ce[bam_txn->bam_ce_pos];
246 
247 	/* fill the command desc */
248 	for (i = 0; i < size; i++) {
249 		offset = nandc->props->bam_offset + reg_off + 4 * i;
250 		if (read)
251 			bam_prep_ce(&bam_ce_buffer[i],
252 				    offset, BAM_READ_COMMAND,
253 				    reg_buf_dma_addr(nandc,
254 						     (__le32 *)vaddr + i));
255 		else
256 			bam_prep_ce_le32(&bam_ce_buffer[i],
257 					 offset, BAM_WRITE_COMMAND,
258 					 *((__le32 *)vaddr + i));
259 	}
260 
261 	bam_txn->bam_ce_pos += size;
262 
263 	/* use the separate sgl after this command */
264 	if (flags & NAND_BAM_NEXT_SGL) {
265 		if (bam_txn->cmd_sgl_pos >= bam_txn->cmd_sgl_nitems) {
266 			dev_err(nandc->dev, "BAM %s array is full\n",
267 				"CMD sgl");
268 			return -EINVAL;
269 		}
270 
271 		bam_ce_buffer = &bam_txn->bam_ce[bam_txn->bam_ce_start];
272 		bam_ce_size = (bam_txn->bam_ce_pos -
273 				bam_txn->bam_ce_start) *
274 				sizeof(struct bam_cmd_element);
275 		sg_set_buf(&bam_txn->cmd_sgl[bam_txn->cmd_sgl_pos],
276 			   bam_ce_buffer, bam_ce_size);
277 		bam_txn->cmd_sgl_pos++;
278 		bam_txn->bam_ce_start = bam_txn->bam_ce_pos;
279 
280 		if (flags & NAND_BAM_NWD) {
281 			ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
282 							  DMA_PREP_FENCE | DMA_PREP_CMD);
283 			if (ret)
284 				return ret;
285 		}
286 	}
287 
288 	return 0;
289 }
290 EXPORT_SYMBOL(qcom_prep_bam_dma_desc_cmd);
291 
292 /**
293  * qcom_prep_bam_dma_desc_data() - Prepares the data descriptor for BAM DMA
294  * @nandc: qpic nand controller
295  * @read: read or write type
296  * @vaddr: virtual address of the buffer we want to write to
297  * @size: DMA transaction size in bytes
298  * @flags: flags to control DMA descriptor preparation
299  *
300  * This function will prepares the data descriptor for BAM DMA which
301  * will be used for NAND data reads and writes.
302  */
303 int qcom_prep_bam_dma_desc_data(struct qcom_nand_controller *nandc, bool read,
304 				const void *vaddr, int size, unsigned int flags)
305 {
306 	int ret;
307 	struct bam_transaction *bam_txn = nandc->bam_txn;
308 
309 	if (read) {
310 		if (bam_txn->rx_sgl_pos >= bam_txn->data_sgl_nitems) {
311 			dev_err(nandc->dev, "BAM %s array is full\n", "RX sgl");
312 			return -EINVAL;
313 		}
314 
315 		sg_set_buf(&bam_txn->data_sgl[bam_txn->rx_sgl_pos],
316 			   vaddr, size);
317 		bam_txn->rx_sgl_pos++;
318 	} else {
319 		if (bam_txn->tx_sgl_pos >= bam_txn->data_sgl_nitems) {
320 			dev_err(nandc->dev, "BAM %s array is full\n", "TX sgl");
321 			return -EINVAL;
322 		}
323 
324 		sg_set_buf(&bam_txn->data_sgl[bam_txn->tx_sgl_pos],
325 			   vaddr, size);
326 		bam_txn->tx_sgl_pos++;
327 
328 		/*
329 		 * BAM will only set EOT for DMA_PREP_INTERRUPT so if this flag
330 		 * is not set, form the DMA descriptor
331 		 */
332 		if (!(flags & NAND_BAM_NO_EOT)) {
333 			ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
334 							  DMA_PREP_INTERRUPT);
335 			if (ret)
336 				return ret;
337 		}
338 	}
339 
340 	return 0;
341 }
342 EXPORT_SYMBOL(qcom_prep_bam_dma_desc_data);
343 
344 /**
345  * qcom_prep_adm_dma_desc() - Prepare descriptor for adma
346  * @nandc: qpic nand controller
347  * @read: read or write type
348  * @reg_off: offset within the controller's data buffer
349  * @vaddr: virtual address of the buffer we want to write to
350  * @size: adm dma transaction size in bytes
351  * @flow_control: flow controller
352  *
353  * This function will prepare descriptor for adma
354  */
355 int qcom_prep_adm_dma_desc(struct qcom_nand_controller *nandc, bool read,
356 			   int reg_off, const void *vaddr, int size,
357 			   bool flow_control)
358 {
359 	struct qcom_adm_peripheral_config periph_conf = {};
360 	struct dma_async_tx_descriptor *dma_desc;
361 	struct dma_slave_config slave_conf = {0};
362 	enum dma_transfer_direction dir_eng;
363 	struct desc_info *desc;
364 	struct scatterlist *sgl;
365 	int ret;
366 
367 	desc = kzalloc(sizeof(*desc), GFP_KERNEL);
368 	if (!desc)
369 		return -ENOMEM;
370 
371 	sgl = &desc->adm_sgl;
372 
373 	sg_init_one(sgl, vaddr, size);
374 
375 	if (read) {
376 		dir_eng = DMA_DEV_TO_MEM;
377 		desc->dir = DMA_FROM_DEVICE;
378 	} else {
379 		dir_eng = DMA_MEM_TO_DEV;
380 		desc->dir = DMA_TO_DEVICE;
381 	}
382 
383 	ret = dma_map_sg(nandc->dev, sgl, 1, desc->dir);
384 	if (!ret) {
385 		ret = -ENOMEM;
386 		goto err;
387 	}
388 
389 	slave_conf.device_fc = flow_control;
390 	if (read) {
391 		slave_conf.src_maxburst = 16;
392 		slave_conf.src_addr = nandc->base_dma + reg_off;
393 		if (nandc->data_crci) {
394 			periph_conf.crci = nandc->data_crci;
395 			slave_conf.peripheral_config = &periph_conf;
396 			slave_conf.peripheral_size = sizeof(periph_conf);
397 		}
398 	} else {
399 		slave_conf.dst_maxburst = 16;
400 		slave_conf.dst_addr = nandc->base_dma + reg_off;
401 		if (nandc->cmd_crci) {
402 			periph_conf.crci = nandc->cmd_crci;
403 			slave_conf.peripheral_config = &periph_conf;
404 			slave_conf.peripheral_size = sizeof(periph_conf);
405 		}
406 	}
407 
408 	ret = dmaengine_slave_config(nandc->chan, &slave_conf);
409 	if (ret) {
410 		dev_err(nandc->dev, "failed to configure dma channel\n");
411 		goto err;
412 	}
413 
414 	dma_desc = dmaengine_prep_slave_sg(nandc->chan, sgl, 1, dir_eng, 0);
415 	if (!dma_desc) {
416 		dev_err(nandc->dev, "failed to prepare desc\n");
417 		ret = -EINVAL;
418 		goto err;
419 	}
420 
421 	desc->dma_desc = dma_desc;
422 
423 	list_add_tail(&desc->node, &nandc->desc_list);
424 
425 	return 0;
426 err:
427 	kfree(desc);
428 
429 	return ret;
430 }
431 EXPORT_SYMBOL(qcom_prep_adm_dma_desc);
432 
433 /**
434  * qcom_read_reg_dma() - read a given number of registers to the reg_read_buf pointer
435  * @nandc: qpic nand controller
436  * @first: offset of the first register in the contiguous block
437  * @num_regs: number of registers to read
438  * @flags: flags to control DMA descriptor preparation
439  *
440  * This function will prepares a descriptor to read a given number of
441  * contiguous registers to the reg_read_buf pointer.
442  */
443 int qcom_read_reg_dma(struct qcom_nand_controller *nandc, int first,
444 		      int num_regs, unsigned int flags)
445 {
446 	bool flow_control = false;
447 	void *vaddr;
448 
449 	vaddr = nandc->reg_read_buf + nandc->reg_read_pos;
450 	nandc->reg_read_pos += num_regs;
451 
452 	if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
453 		first = dev_cmd_reg_addr(nandc, first);
454 
455 	if (nandc->props->supports_bam)
456 		return qcom_prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
457 					     num_regs, flags);
458 
459 	if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
460 		flow_control = true;
461 
462 	return qcom_prep_adm_dma_desc(nandc, true, first, vaddr,
463 				      num_regs * sizeof(u32), flow_control);
464 }
465 EXPORT_SYMBOL(qcom_read_reg_dma);
466 
467 /**
468  * qcom_write_reg_dma() - write a given number of registers
469  * @nandc: qpic nand controller
470  * @vaddr: contiguous memory from where register value will
471  *	   be written
472  * @first: offset of the first register in the contiguous block
473  * @num_regs: number of registers to write
474  * @flags: flags to control DMA descriptor preparation
475  *
476  * This function will prepares a descriptor to write a given number of
477  * contiguous registers
478  */
479 int qcom_write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
480 		       int first, int num_regs, unsigned int flags)
481 {
482 	bool flow_control = false;
483 
484 	if (first == NAND_EXEC_CMD)
485 		flags |= NAND_BAM_NWD;
486 
487 	if (first == NAND_DEV_CMD1_RESTORE || first == NAND_DEV_CMD1)
488 		first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD1);
489 
490 	if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
491 		first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
492 
493 	if (nandc->props->supports_bam)
494 		return qcom_prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
495 						  num_regs, flags);
496 
497 	if (first == NAND_FLASH_CMD)
498 		flow_control = true;
499 
500 	return qcom_prep_adm_dma_desc(nandc, false, first, vaddr,
501 				      num_regs * sizeof(u32), flow_control);
502 }
503 EXPORT_SYMBOL(qcom_write_reg_dma);
504 
505 /**
506  * qcom_read_data_dma() - transfer data
507  * @nandc: qpic nand controller
508  * @reg_off: offset within the controller's data buffer
509  * @vaddr: virtual address of the buffer we want to write to
510  * @size: DMA transaction size in bytes
511  * @flags: flags to control DMA descriptor preparation
512  *
513  * This function will prepares a DMA descriptor to transfer data from the
514  * controller's internal buffer to the buffer 'vaddr'
515  */
516 int qcom_read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
517 		       const u8 *vaddr, int size, unsigned int flags)
518 {
519 	if (nandc->props->supports_bam)
520 		return qcom_prep_bam_dma_desc_data(nandc, true, vaddr, size, flags);
521 
522 	return qcom_prep_adm_dma_desc(nandc, true, reg_off, vaddr, size, false);
523 }
524 EXPORT_SYMBOL(qcom_read_data_dma);
525 
526 /**
527  * qcom_write_data_dma() - transfer data
528  * @nandc: qpic nand controller
529  * @reg_off: offset within the controller's data buffer
530  * @vaddr: virtual address of the buffer we want to read from
531  * @size: DMA transaction size in bytes
532  * @flags: flags to control DMA descriptor preparation
533  *
534  * This function will prepares a DMA descriptor to transfer data from
535  * 'vaddr' to the controller's internal buffer
536  */
537 int qcom_write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
538 			const u8 *vaddr, int size, unsigned int flags)
539 {
540 	if (nandc->props->supports_bam)
541 		return qcom_prep_bam_dma_desc_data(nandc, false, vaddr, size, flags);
542 
543 	return qcom_prep_adm_dma_desc(nandc, false, reg_off, vaddr, size, false);
544 }
545 EXPORT_SYMBOL(qcom_write_data_dma);
546 
547 /**
548  * qcom_submit_descs() - submit dma descriptor
549  * @nandc: qpic nand controller
550  *
551  * This function will submit all the prepared dma descriptor
552  * cmd or data descriptor
553  */
554 int qcom_submit_descs(struct qcom_nand_controller *nandc)
555 {
556 	struct desc_info *desc, *n;
557 	dma_cookie_t cookie = 0;
558 	struct bam_transaction *bam_txn = nandc->bam_txn;
559 	int ret = 0;
560 
561 	if (nandc->props->supports_bam) {
562 		if (bam_txn->rx_sgl_pos > bam_txn->rx_sgl_start) {
563 			ret = qcom_prepare_bam_async_desc(nandc, nandc->rx_chan, 0);
564 			if (ret)
565 				goto err_unmap_free_desc;
566 		}
567 
568 		if (bam_txn->tx_sgl_pos > bam_txn->tx_sgl_start) {
569 			ret = qcom_prepare_bam_async_desc(nandc, nandc->tx_chan,
570 							  DMA_PREP_INTERRUPT);
571 			if (ret)
572 				goto err_unmap_free_desc;
573 		}
574 
575 		if (bam_txn->cmd_sgl_pos > bam_txn->cmd_sgl_start) {
576 			ret = qcom_prepare_bam_async_desc(nandc, nandc->cmd_chan,
577 							  DMA_PREP_CMD);
578 			if (ret)
579 				goto err_unmap_free_desc;
580 		}
581 	}
582 
583 	list_for_each_entry(desc, &nandc->desc_list, node)
584 		cookie = dmaengine_submit(desc->dma_desc);
585 
586 	if (nandc->props->supports_bam) {
587 		bam_txn->last_cmd_desc->callback = qcom_qpic_bam_dma_done;
588 		bam_txn->last_cmd_desc->callback_param = bam_txn;
589 
590 		dma_async_issue_pending(nandc->tx_chan);
591 		dma_async_issue_pending(nandc->rx_chan);
592 		dma_async_issue_pending(nandc->cmd_chan);
593 
594 		if (!wait_for_completion_timeout(&bam_txn->txn_done,
595 						 QPIC_NAND_COMPLETION_TIMEOUT))
596 			ret = -ETIMEDOUT;
597 	} else {
598 		if (dma_sync_wait(nandc->chan, cookie) != DMA_COMPLETE)
599 			ret = -ETIMEDOUT;
600 	}
601 
602 err_unmap_free_desc:
603 	/*
604 	 * Unmap the dma sg_list and free the desc allocated by both
605 	 * qcom_prepare_bam_async_desc() and qcom_prep_adm_dma_desc() functions.
606 	 */
607 	list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
608 		list_del(&desc->node);
609 
610 		if (nandc->props->supports_bam)
611 			dma_unmap_sg(nandc->dev, desc->bam_sgl,
612 				     desc->sgl_cnt, desc->dir);
613 		else
614 			dma_unmap_sg(nandc->dev, &desc->adm_sgl, 1,
615 				     desc->dir);
616 
617 		kfree(desc);
618 	}
619 
620 	return ret;
621 }
622 EXPORT_SYMBOL(qcom_submit_descs);
623 
624 /**
625  * qcom_clear_read_regs() - reset the read register buffer
626  * @nandc: qpic nand controller
627  *
628  * This function reset the register read buffer for next NAND operation
629  */
630 void qcom_clear_read_regs(struct qcom_nand_controller *nandc)
631 {
632 	nandc->reg_read_pos = 0;
633 	qcom_nandc_dev_to_mem(nandc, false);
634 }
635 EXPORT_SYMBOL(qcom_clear_read_regs);
636 
637 /**
638  * qcom_nandc_unalloc() - unallocate qpic nand controller
639  * @nandc: qpic nand controller
640  *
641  * This function will unallocate memory alloacted for qpic nand controller
642  */
643 void qcom_nandc_unalloc(struct qcom_nand_controller *nandc)
644 {
645 	if (nandc->props->supports_bam) {
646 		if (!dma_mapping_error(nandc->dev, nandc->reg_read_dma))
647 			dma_unmap_single(nandc->dev, nandc->reg_read_dma,
648 					 MAX_REG_RD *
649 					 sizeof(*nandc->reg_read_buf),
650 					 DMA_FROM_DEVICE);
651 
652 		if (nandc->tx_chan)
653 			dma_release_channel(nandc->tx_chan);
654 
655 		if (nandc->rx_chan)
656 			dma_release_channel(nandc->rx_chan);
657 
658 		if (nandc->cmd_chan)
659 			dma_release_channel(nandc->cmd_chan);
660 	} else {
661 		if (nandc->chan)
662 			dma_release_channel(nandc->chan);
663 	}
664 }
665 EXPORT_SYMBOL(qcom_nandc_unalloc);
666 
667 /**
668  * qcom_nandc_alloc() - Allocate qpic nand controller
669  * @nandc: qpic nand controller
670  *
671  * This function will allocate memory for qpic nand controller
672  */
673 int qcom_nandc_alloc(struct qcom_nand_controller *nandc)
674 {
675 	int ret;
676 
677 	ret = dma_set_coherent_mask(nandc->dev, DMA_BIT_MASK(32));
678 	if (ret) {
679 		dev_err(nandc->dev, "failed to set DMA mask\n");
680 		return ret;
681 	}
682 
683 	/*
684 	 * we use the internal buffer for reading ONFI params, reading small
685 	 * data like ID and status, and preforming read-copy-write operations
686 	 * when writing to a codeword partially. 532 is the maximum possible
687 	 * size of a codeword for our nand controller
688 	 */
689 	nandc->buf_size = 532;
690 
691 	nandc->data_buffer = devm_kzalloc(nandc->dev, nandc->buf_size, GFP_KERNEL);
692 	if (!nandc->data_buffer)
693 		return -ENOMEM;
694 
695 	nandc->regs = devm_kzalloc(nandc->dev, sizeof(*nandc->regs), GFP_KERNEL);
696 	if (!nandc->regs)
697 		return -ENOMEM;
698 
699 	nandc->reg_read_buf = devm_kcalloc(nandc->dev, MAX_REG_RD,
700 					   sizeof(*nandc->reg_read_buf),
701 					   GFP_KERNEL);
702 	if (!nandc->reg_read_buf)
703 		return -ENOMEM;
704 
705 	if (nandc->props->supports_bam) {
706 		nandc->reg_read_dma =
707 			dma_map_single(nandc->dev, nandc->reg_read_buf,
708 				       MAX_REG_RD *
709 				       sizeof(*nandc->reg_read_buf),
710 				       DMA_FROM_DEVICE);
711 		if (dma_mapping_error(nandc->dev, nandc->reg_read_dma)) {
712 			dev_err(nandc->dev, "failed to DMA MAP reg buffer\n");
713 			return -EIO;
714 		}
715 
716 		nandc->tx_chan = dma_request_chan(nandc->dev, "tx");
717 		if (IS_ERR(nandc->tx_chan)) {
718 			ret = PTR_ERR(nandc->tx_chan);
719 			nandc->tx_chan = NULL;
720 			dev_err_probe(nandc->dev, ret,
721 				      "tx DMA channel request failed\n");
722 			goto unalloc;
723 		}
724 
725 		nandc->rx_chan = dma_request_chan(nandc->dev, "rx");
726 		if (IS_ERR(nandc->rx_chan)) {
727 			ret = PTR_ERR(nandc->rx_chan);
728 			nandc->rx_chan = NULL;
729 			dev_err_probe(nandc->dev, ret,
730 				      "rx DMA channel request failed\n");
731 			goto unalloc;
732 		}
733 
734 		nandc->cmd_chan = dma_request_chan(nandc->dev, "cmd");
735 		if (IS_ERR(nandc->cmd_chan)) {
736 			ret = PTR_ERR(nandc->cmd_chan);
737 			nandc->cmd_chan = NULL;
738 			dev_err_probe(nandc->dev, ret,
739 				      "cmd DMA channel request failed\n");
740 			goto unalloc;
741 		}
742 
743 		/*
744 		 * Initially allocate BAM transaction to read ONFI param page.
745 		 * After detecting all the devices, this BAM transaction will
746 		 * be freed and the next BAM transaction will be allocated with
747 		 * maximum codeword size
748 		 */
749 		nandc->max_cwperpage = 1;
750 		nandc->bam_txn = qcom_alloc_bam_transaction(nandc);
751 		if (!nandc->bam_txn) {
752 			dev_err(nandc->dev,
753 				"failed to allocate bam transaction\n");
754 			ret = -ENOMEM;
755 			goto unalloc;
756 		}
757 	} else {
758 		nandc->chan = dma_request_chan(nandc->dev, "rxtx");
759 		if (IS_ERR(nandc->chan)) {
760 			ret = PTR_ERR(nandc->chan);
761 			nandc->chan = NULL;
762 			dev_err_probe(nandc->dev, ret,
763 				      "rxtx DMA channel request failed\n");
764 			return ret;
765 		}
766 	}
767 
768 	INIT_LIST_HEAD(&nandc->desc_list);
769 	INIT_LIST_HEAD(&nandc->host_list);
770 
771 	return 0;
772 unalloc:
773 	qcom_nandc_unalloc(nandc);
774 	return ret;
775 }
776 EXPORT_SYMBOL(qcom_nandc_alloc);
777 
778 MODULE_DESCRIPTION("QPIC controller common api");
779 MODULE_LICENSE("GPL");
780