mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
ata: pata_ep93xx: add device tree support
- add OF ID match table - drop platform DMA and filters - change DMA setup to OF, so we can defer probe Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me> Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru> Acked-by: Damien Le Moal <dlemoal@kernel.org> Acked-by: Vinod Koul <vkoul@kernel.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
f4da2b6055
commit
9963113e3a
@ -44,8 +44,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
#include <linux/platform_data/dma-ep93xx.h>
|
||||
#include <linux/soc/cirrus/ep93xx.h>
|
||||
|
||||
#define DRV_NAME "ep93xx-ide"
|
||||
@ -126,7 +126,7 @@ enum {
|
||||
};
|
||||
|
||||
struct ep93xx_pata_data {
|
||||
const struct platform_device *pdev;
|
||||
struct platform_device *pdev;
|
||||
void __iomem *ide_base;
|
||||
struct ata_timing t;
|
||||
bool iordy;
|
||||
@ -135,9 +135,7 @@ struct ep93xx_pata_data {
|
||||
unsigned long udma_out_phys;
|
||||
|
||||
struct dma_chan *dma_rx_channel;
|
||||
struct ep93xx_dma_data dma_rx_data;
|
||||
struct dma_chan *dma_tx_channel;
|
||||
struct ep93xx_dma_data dma_tx_data;
|
||||
};
|
||||
|
||||
static void ep93xx_pata_clear_regs(void __iomem *base)
|
||||
@ -637,20 +635,13 @@ static void ep93xx_pata_release_dma(struct ep93xx_pata_data *drv_data)
|
||||
}
|
||||
}
|
||||
|
||||
static bool ep93xx_pata_dma_filter(struct dma_chan *chan, void *filter_param)
|
||||
static int ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
{
|
||||
if (ep93xx_dma_chan_is_m2p(chan))
|
||||
return false;
|
||||
|
||||
chan->private = filter_param;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
{
|
||||
const struct platform_device *pdev = drv_data->pdev;
|
||||
struct platform_device *pdev = drv_data->pdev;
|
||||
struct device *dev = &pdev->dev;
|
||||
dma_cap_mask_t mask;
|
||||
struct dma_slave_config conf;
|
||||
int ret;
|
||||
|
||||
dma_cap_zero(mask);
|
||||
dma_cap_set(DMA_SLAVE, mask);
|
||||
@ -660,22 +651,16 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
* to request only one channel, and reprogram it's direction at
|
||||
* start of new transfer.
|
||||
*/
|
||||
drv_data->dma_rx_data.port = EP93XX_DMA_IDE;
|
||||
drv_data->dma_rx_data.direction = DMA_DEV_TO_MEM;
|
||||
drv_data->dma_rx_data.name = "ep93xx-pata-rx";
|
||||
drv_data->dma_rx_channel = dma_request_channel(mask,
|
||||
ep93xx_pata_dma_filter, &drv_data->dma_rx_data);
|
||||
if (!drv_data->dma_rx_channel)
|
||||
return;
|
||||
drv_data->dma_rx_channel = dma_request_chan(dev, "rx");
|
||||
if (IS_ERR(drv_data->dma_rx_channel))
|
||||
return dev_err_probe(dev, PTR_ERR(drv_data->dma_rx_channel),
|
||||
"rx DMA setup failed\n");
|
||||
|
||||
drv_data->dma_tx_data.port = EP93XX_DMA_IDE;
|
||||
drv_data->dma_tx_data.direction = DMA_MEM_TO_DEV;
|
||||
drv_data->dma_tx_data.name = "ep93xx-pata-tx";
|
||||
drv_data->dma_tx_channel = dma_request_channel(mask,
|
||||
ep93xx_pata_dma_filter, &drv_data->dma_tx_data);
|
||||
if (!drv_data->dma_tx_channel) {
|
||||
dma_release_channel(drv_data->dma_rx_channel);
|
||||
return;
|
||||
drv_data->dma_tx_channel = dma_request_chan(&pdev->dev, "tx");
|
||||
if (IS_ERR(drv_data->dma_tx_channel)) {
|
||||
ret = dev_err_probe(dev, PTR_ERR(drv_data->dma_tx_channel),
|
||||
"tx DMA setup failed\n");
|
||||
goto fail_release_rx;
|
||||
}
|
||||
|
||||
/* Configure receive channel direction and source address */
|
||||
@ -683,10 +668,10 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
conf.direction = DMA_DEV_TO_MEM;
|
||||
conf.src_addr = drv_data->udma_in_phys;
|
||||
conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
if (dmaengine_slave_config(drv_data->dma_rx_channel, &conf)) {
|
||||
dev_err(&pdev->dev, "failed to configure rx dma channel\n");
|
||||
ep93xx_pata_release_dma(drv_data);
|
||||
return;
|
||||
ret = dmaengine_slave_config(drv_data->dma_rx_channel, &conf);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "failed to configure rx dma channel");
|
||||
goto fail_release_dma;
|
||||
}
|
||||
|
||||
/* Configure transmit channel direction and destination address */
|
||||
@ -694,10 +679,20 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
conf.direction = DMA_MEM_TO_DEV;
|
||||
conf.dst_addr = drv_data->udma_out_phys;
|
||||
conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
if (dmaengine_slave_config(drv_data->dma_tx_channel, &conf)) {
|
||||
dev_err(&pdev->dev, "failed to configure tx dma channel\n");
|
||||
ep93xx_pata_release_dma(drv_data);
|
||||
ret = dmaengine_slave_config(drv_data->dma_tx_channel, &conf);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "failed to configure tx dma channel");
|
||||
goto fail_release_dma;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail_release_rx:
|
||||
dma_release_channel(drv_data->dma_rx_channel);
|
||||
fail_release_dma:
|
||||
ep93xx_pata_release_dma(drv_data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ep93xx_pata_dma_start(struct ata_queued_cmd *qc)
|
||||
@ -954,7 +949,9 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
||||
drv_data->ide_base = ide_base;
|
||||
drv_data->udma_in_phys = mem_res->start + IDEUDMADATAIN;
|
||||
drv_data->udma_out_phys = mem_res->start + IDEUDMADATAOUT;
|
||||
ep93xx_pata_dma_init(drv_data);
|
||||
err = ep93xx_pata_dma_init(drv_data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* allocate host */
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
@ -1021,9 +1018,16 @@ static void ep93xx_pata_remove(struct platform_device *pdev)
|
||||
ep93xx_ide_release_gpio(pdev);
|
||||
}
|
||||
|
||||
static const struct of_device_id ep93xx_pata_of_ids[] = {
|
||||
{ .compatible = "cirrus,ep9312-pata" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ep93xx_pata_of_ids);
|
||||
|
||||
static struct platform_driver ep93xx_pata_platform_driver = {
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = ep93xx_pata_of_ids,
|
||||
},
|
||||
.probe = ep93xx_pata_probe,
|
||||
.remove_new = ep93xx_pata_remove,
|
||||
|
Loading…
Reference in New Issue
Block a user