Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: rtsx: Add dma transfer function

rtsx driver using a single function for transfer data, dma map/unmap are
placed in one fix function. We need map/unmap dma in different place(for
mmc async driver), so add three function for dma map, dma transfer and
dma unmap.

Signed-off-by: Micky Ching <micky_ching@realsil.com.cn>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Micky Ching and committed by
Lee Jones
8cd11830 cd3de83f

+54 -28
+48 -28
drivers/mfd/rtsx_pcr.c
··· 337 337 int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist, 338 338 int num_sg, bool read, int timeout) 339 339 { 340 - struct completion trans_done; 341 - u8 dir; 342 - int err = 0, i, count; 343 - long timeleft; 344 - unsigned long flags; 345 - struct scatterlist *sg; 346 - enum dma_data_direction dma_dir; 347 - u32 val; 348 - dma_addr_t addr; 349 - unsigned int len; 340 + int err = 0, count; 350 341 351 342 dev_dbg(&(pcr->pci->dev), "--> %s: num_sg = %d\n", __func__, num_sg); 343 + count = rtsx_pci_dma_map_sg(pcr, sglist, num_sg, read); 344 + if (count < 1) 345 + return -EINVAL; 346 + dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count); 352 347 353 - /* don't transfer data during abort processing */ 348 + err = rtsx_pci_dma_transfer(pcr, sglist, count, read, timeout); 349 + 350 + rtsx_pci_dma_unmap_sg(pcr, sglist, num_sg, read); 351 + 352 + return err; 353 + } 354 + EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data); 355 + 356 + int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist, 357 + int num_sg, bool read) 358 + { 359 + enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 360 + 354 361 if (pcr->remove_pci) 355 362 return -EINVAL; 356 363 357 364 if ((sglist == NULL) || (num_sg <= 0)) 358 365 return -EINVAL; 359 366 360 - if (read) { 361 - dir = DEVICE_TO_HOST; 362 - dma_dir = DMA_FROM_DEVICE; 363 - } else { 364 - dir = HOST_TO_DEVICE; 365 - dma_dir = DMA_TO_DEVICE; 366 - } 367 + return dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dir); 368 + } 369 + EXPORT_SYMBOL_GPL(rtsx_pci_dma_map_sg); 367 370 368 - count = dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir); 369 - if (count < 1) { 370 - dev_err(&(pcr->pci->dev), "scatterlist map failed\n"); 371 + void rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist, 372 + int num_sg, bool read) 373 + { 374 + enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 375 + 376 + dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dir); 377 + } 378 + EXPORT_SYMBOL_GPL(rtsx_pci_dma_unmap_sg); 379 + 380 + int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist, 381 + int count, bool read, int timeout) 382 + { 383 + struct completion trans_done; 384 + struct scatterlist *sg; 385 + dma_addr_t addr; 386 + long timeleft; 387 + unsigned long flags; 388 + unsigned int len; 389 + int i, err = 0; 390 + u32 val; 391 + u8 dir = read ? DEVICE_TO_HOST : HOST_TO_DEVICE; 392 + 393 + if (pcr->remove_pci) 394 + return -ENODEV; 395 + 396 + if ((sglist == NULL) || (count < 1)) 371 397 return -EINVAL; 372 - } 373 - dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count); 374 398 375 399 val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE; 376 400 pcr->sgi = 0; ··· 424 400 } 425 401 426 402 spin_lock_irqsave(&pcr->lock, flags); 427 - 428 403 if (pcr->trans_result == TRANS_RESULT_FAIL) 429 404 err = -EINVAL; 430 405 else if (pcr->trans_result == TRANS_NO_DEVICE) 431 406 err = -ENODEV; 432 - 433 407 spin_unlock_irqrestore(&pcr->lock, flags); 434 408 435 409 out: 436 410 spin_lock_irqsave(&pcr->lock, flags); 437 411 pcr->done = NULL; 438 412 spin_unlock_irqrestore(&pcr->lock, flags); 439 - 440 - dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir); 441 413 442 414 if ((err < 0) && (err != -ENODEV)) 443 415 rtsx_pci_stop_cmd(pcr); ··· 443 423 444 424 return err; 445 425 } 446 - EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data); 426 + EXPORT_SYMBOL_GPL(rtsx_pci_dma_transfer); 447 427 448 428 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len) 449 429 {
+6
include/linux/mfd/rtsx_pci.h
··· 943 943 int rtsx_pci_send_cmd(struct rtsx_pcr *pcr, int timeout); 944 944 int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist, 945 945 int num_sg, bool read, int timeout); 946 + int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist, 947 + int num_sg, bool read); 948 + void rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist, 949 + int num_sg, bool read); 950 + int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist, 951 + int count, bool read, int timeout); 946 952 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len); 947 953 int rtsx_pci_write_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len); 948 954 int rtsx_pci_card_pull_ctl_enable(struct rtsx_pcr *pcr, int card);