Lines Matching +full:ata +full:- +full:generic

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Generic PXA PATA driver
11 #include <linux/ata.h>
20 #include <linux/platform_data/ata-pxa.h>
39 status = dmaengine_tx_status(pd->dma_chan, pd->dma_cookie, NULL); in pxa_ata_dma_irq()
41 complete(&pd->dma_done); in pxa_ata_dma_irq()
49 struct pata_pxa_data *pd = qc->ap->private_data; in pxa_qc_prep()
53 if (!(qc->flags & ATA_QCFLAG_DMAMAP)) in pxa_qc_prep()
56 dir = (qc->dma_dir == DMA_TO_DEVICE ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM); in pxa_qc_prep()
57 tx = dmaengine_prep_slave_sg(pd->dma_chan, qc->sg, qc->n_elem, dir, in pxa_qc_prep()
60 ata_dev_err(qc->dev, "prep_slave_sg() failed\n"); in pxa_qc_prep()
63 tx->callback = pxa_ata_dma_irq; in pxa_qc_prep()
64 tx->callback_param = pd; in pxa_qc_prep()
65 pd->dma_cookie = dmaengine_submit(tx); in pxa_qc_prep()
72 * DMA controller yet. Only issue the ATA command.
76 qc->ap->ops->sff_exec_command(qc->ap, &qc->tf); in pxa_bmdma_setup()
84 struct pata_pxa_data *pd = qc->ap->private_data; in pxa_bmdma_start()
85 init_completion(&pd->dma_done); in pxa_bmdma_start()
86 dma_async_issue_pending(pd->dma_chan); in pxa_bmdma_start()
94 struct pata_pxa_data *pd = qc->ap->private_data; in pxa_bmdma_stop()
97 status = dmaengine_tx_status(pd->dma_chan, pd->dma_cookie, NULL); in pxa_bmdma_stop()
99 wait_for_completion_timeout(&pd->dma_done, HZ)) in pxa_bmdma_stop()
100 ata_dev_err(qc->dev, "Timeout waiting for DMA completion!"); in pxa_bmdma_stop()
102 dmaengine_terminate_all(pd->dma_chan); in pxa_bmdma_stop()
107 * DMA transfer so we always have DMA-complete interrupt here.
111 struct pata_pxa_data *pd = ap->private_data; in pxa_bmdma_status()
116 status = dmaengine_tx_status(pd->dma_chan, pd->dma_cookie, &state); in pxa_bmdma_status()
136 return -EOPNOTSUPP; in pxa_check_atapi_dma()
167 struct pata_pxa_pdata *pdata = dev_get_platdata(&pdev->dev); in pxa_ata_probe()
174 * - CMD port base address in pxa_ata_probe()
175 * - CTL port base address in pxa_ata_probe()
176 * - DMA port base address in pxa_ata_probe()
177 * - IRQ pin in pxa_ata_probe()
179 if (pdev->num_resources != 4) { in pxa_ata_probe()
180 dev_err(&pdev->dev, "invalid number of resources\n"); in pxa_ata_probe()
181 return -EINVAL; in pxa_ata_probe()
189 return -EINVAL; in pxa_ata_probe()
196 return -EINVAL; in pxa_ata_probe()
203 return -EINVAL; in pxa_ata_probe()
215 host = ata_host_alloc(&pdev->dev, 1); in pxa_ata_probe()
217 return -ENOMEM; in pxa_ata_probe()
219 ap = host->ports[0]; in pxa_ata_probe()
220 ap->ops = &pxa_ata_port_ops; in pxa_ata_probe()
221 ap->pio_mask = ATA_PIO4; in pxa_ata_probe()
222 ap->mwdma_mask = ATA_MWDMA2; in pxa_ata_probe()
224 ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, cmd_res->start, in pxa_ata_probe()
226 ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start, in pxa_ata_probe()
228 ap->ioaddr.bmdma_addr = devm_ioremap(&pdev->dev, dma_res->start, in pxa_ata_probe()
234 ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; in pxa_ata_probe()
235 ap->ioaddr.data_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
236 (ATA_REG_DATA << pdata->reg_shift); in pxa_ata_probe()
237 ap->ioaddr.error_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
238 (ATA_REG_ERR << pdata->reg_shift); in pxa_ata_probe()
239 ap->ioaddr.feature_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
240 (ATA_REG_FEATURE << pdata->reg_shift); in pxa_ata_probe()
241 ap->ioaddr.nsect_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
242 (ATA_REG_NSECT << pdata->reg_shift); in pxa_ata_probe()
243 ap->ioaddr.lbal_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
244 (ATA_REG_LBAL << pdata->reg_shift); in pxa_ata_probe()
245 ap->ioaddr.lbam_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
246 (ATA_REG_LBAM << pdata->reg_shift); in pxa_ata_probe()
247 ap->ioaddr.lbah_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
248 (ATA_REG_LBAH << pdata->reg_shift); in pxa_ata_probe()
249 ap->ioaddr.device_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
250 (ATA_REG_DEVICE << pdata->reg_shift); in pxa_ata_probe()
251 ap->ioaddr.status_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
252 (ATA_REG_STATUS << pdata->reg_shift); in pxa_ata_probe()
253 ap->ioaddr.command_addr = ap->ioaddr.cmd_addr + in pxa_ata_probe()
254 (ATA_REG_CMD << pdata->reg_shift); in pxa_ata_probe()
259 data = devm_kzalloc(&pdev->dev, sizeof(struct pata_pxa_data), in pxa_ata_probe()
262 return -ENOMEM; in pxa_ata_probe()
264 ap->private_data = data; in pxa_ata_probe()
269 config.src_addr = dma_res->start; in pxa_ata_probe()
270 config.dst_addr = dma_res->start; in pxa_ata_probe()
277 data->dma_chan = dma_request_chan(&pdev->dev, "data"); in pxa_ata_probe()
278 if (IS_ERR(data->dma_chan)) in pxa_ata_probe()
279 return PTR_ERR(data->dma_chan); in pxa_ata_probe()
280 ret = dmaengine_slave_config(data->dma_chan, &config); in pxa_ata_probe()
282 dev_err(&pdev->dev, "dma configuration failed: %d\n", ret); in pxa_ata_probe()
287 * Activate the ATA host in pxa_ata_probe()
290 pdata->irq_flags, &pxa_ata_sht); in pxa_ata_probe()
292 dma_release_channel(data->dma_chan); in pxa_ata_probe()
300 struct pata_pxa_data *data = host->ports[0]->private_data; in pxa_ata_remove()
302 dma_release_channel(data->dma_chan); in pxa_ata_remove()
318 MODULE_DESCRIPTION("DMA-capable driver for PATA on PXA CPU");