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