#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/blkdev.h>
#include <linux/libata.h>
#include <linux/platform_device.h>
#include <linux/dmaengine.h>
#include <linux/completion.h>
#include <scsi/scsi_host.h>
#include <linux/platform_data/ata-pxa.h>
#define DRV_NAME "pata_pxa"
#define DRV_VERSION "0.1"
struct dma_chan *dma_chan;
struct completion dma_done;
static void pxa_ata_dma_irq(void *d)
struct pata_pxa_data *pd = d;
status = dmaengine_tx_status(pd->dma_chan, pd->dma_cookie, NULL);
if (status == DMA_ERROR || status == DMA_COMPLETE)
static void pxa_qc_prep(struct ata_queued_cmd *qc)
struct pata_pxa_data *pd = qc->ap->private_data;
struct dma_async_tx_descriptor *tx;
enum dma_transfer_direction dir;
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM);
tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir,
ata_dev_err(qc->dev, "prep_slave_sg() failed\n");
tx->callback = pxa_ata_dma_irq;
pd->dma_cookie = dmaengine_submit(tx);
static void pxa_bmdma_setup(struct ata_queued_cmd *qc)
qc->ap->ops->sff_exec_command(qc->ap, &qc->tf);