crypto: omap-des - Use dma_request_chan() for requesting DMA channel
With the new dma_request_chan() the client driver does not need to look for the DMA resource and it does not need to pass filter_fn anymore. By switching to the new API the driver can now support deferred probing against DMA. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> CC: Herbert Xu <herbert@gondor.apana.org.au> CC: David S. Miller <davem@davemloft.net> CC: Lokesh Vutla <lokeshvutla@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
da8b29a6c1
commit
2f6f0680c7
|
@ -29,7 +29,6 @@
|
||||||
#include <linux/scatterlist.h>
|
#include <linux/scatterlist.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
#include <linux/omap-dma.h>
|
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
@ -155,9 +154,7 @@ struct omap_des_dev {
|
||||||
|
|
||||||
struct scatter_walk in_walk;
|
struct scatter_walk in_walk;
|
||||||
struct scatter_walk out_walk;
|
struct scatter_walk out_walk;
|
||||||
int dma_in;
|
|
||||||
struct dma_chan *dma_lch_in;
|
struct dma_chan *dma_lch_in;
|
||||||
int dma_out;
|
|
||||||
struct dma_chan *dma_lch_out;
|
struct dma_chan *dma_lch_out;
|
||||||
int in_sg_len;
|
int in_sg_len;
|
||||||
int out_sg_len;
|
int out_sg_len;
|
||||||
|
@ -337,30 +334,21 @@ static void omap_des_dma_out_callback(void *data)
|
||||||
|
|
||||||
static int omap_des_dma_init(struct omap_des_dev *dd)
|
static int omap_des_dma_init(struct omap_des_dev *dd)
|
||||||
{
|
{
|
||||||
int err = -ENOMEM;
|
int err;
|
||||||
dma_cap_mask_t mask;
|
|
||||||
|
|
||||||
dd->dma_lch_out = NULL;
|
dd->dma_lch_out = NULL;
|
||||||
dd->dma_lch_in = NULL;
|
dd->dma_lch_in = NULL;
|
||||||
|
|
||||||
dma_cap_zero(mask);
|
dd->dma_lch_in = dma_request_chan(dd->dev, "rx");
|
||||||
dma_cap_set(DMA_SLAVE, mask);
|
if (IS_ERR(dd->dma_lch_in)) {
|
||||||
|
|
||||||
dd->dma_lch_in = dma_request_slave_channel_compat(mask,
|
|
||||||
omap_dma_filter_fn,
|
|
||||||
&dd->dma_in,
|
|
||||||
dd->dev, "rx");
|
|
||||||
if (!dd->dma_lch_in) {
|
|
||||||
dev_err(dd->dev, "Unable to request in DMA channel\n");
|
dev_err(dd->dev, "Unable to request in DMA channel\n");
|
||||||
goto err_dma_in;
|
return PTR_ERR(dd->dma_lch_in);
|
||||||
}
|
}
|
||||||
|
|
||||||
dd->dma_lch_out = dma_request_slave_channel_compat(mask,
|
dd->dma_lch_out = dma_request_chan(dd->dev, "tx");
|
||||||
omap_dma_filter_fn,
|
if (IS_ERR(dd->dma_lch_out)) {
|
||||||
&dd->dma_out,
|
|
||||||
dd->dev, "tx");
|
|
||||||
if (!dd->dma_lch_out) {
|
|
||||||
dev_err(dd->dev, "Unable to request out DMA channel\n");
|
dev_err(dd->dev, "Unable to request out DMA channel\n");
|
||||||
|
err = PTR_ERR(dd->dma_lch_out);
|
||||||
goto err_dma_out;
|
goto err_dma_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,14 +356,15 @@ static int omap_des_dma_init(struct omap_des_dev *dd)
|
||||||
|
|
||||||
err_dma_out:
|
err_dma_out:
|
||||||
dma_release_channel(dd->dma_lch_in);
|
dma_release_channel(dd->dma_lch_in);
|
||||||
err_dma_in:
|
|
||||||
if (err)
|
|
||||||
pr_err("error: %d\n", err);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void omap_des_dma_cleanup(struct omap_des_dev *dd)
|
static void omap_des_dma_cleanup(struct omap_des_dev *dd)
|
||||||
{
|
{
|
||||||
|
if (dd->pio_only)
|
||||||
|
return;
|
||||||
|
|
||||||
dma_release_channel(dd->dma_lch_out);
|
dma_release_channel(dd->dma_lch_out);
|
||||||
dma_release_channel(dd->dma_lch_in);
|
dma_release_channel(dd->dma_lch_in);
|
||||||
}
|
}
|
||||||
|
@ -980,8 +969,6 @@ static int omap_des_get_of(struct omap_des_dev *dd,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dd->dma_out = -1; /* Dummy value that's unused */
|
|
||||||
dd->dma_in = -1; /* Dummy value that's unused */
|
|
||||||
dd->pdata = match->data;
|
dd->pdata = match->data;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -997,33 +984,10 @@ static int omap_des_get_of(struct omap_des_dev *dd,
|
||||||
static int omap_des_get_pdev(struct omap_des_dev *dd,
|
static int omap_des_get_pdev(struct omap_des_dev *dd,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
|
||||||
struct resource *r;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
/* Get the DMA out channel */
|
|
||||||
r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
|
||||||
if (!r) {
|
|
||||||
dev_err(dev, "no DMA out resource info\n");
|
|
||||||
err = -ENODEV;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
dd->dma_out = r->start;
|
|
||||||
|
|
||||||
/* Get the DMA in channel */
|
|
||||||
r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
|
||||||
if (!r) {
|
|
||||||
dev_err(dev, "no DMA in resource info\n");
|
|
||||||
err = -ENODEV;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
dd->dma_in = r->start;
|
|
||||||
|
|
||||||
/* non-DT devices get pdata from pdev */
|
/* non-DT devices get pdata from pdev */
|
||||||
dd->pdata = pdev->dev.platform_data;
|
dd->pdata = pdev->dev.platform_data;
|
||||||
|
|
||||||
err:
|
return 0;
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int omap_des_probe(struct platform_device *pdev)
|
static int omap_des_probe(struct platform_device *pdev)
|
||||||
|
@ -1083,7 +1047,9 @@ static int omap_des_probe(struct platform_device *pdev)
|
||||||
tasklet_init(&dd->done_task, omap_des_done_task, (unsigned long)dd);
|
tasklet_init(&dd->done_task, omap_des_done_task, (unsigned long)dd);
|
||||||
|
|
||||||
err = omap_des_dma_init(dd);
|
err = omap_des_dma_init(dd);
|
||||||
if (err && DES_REG_IRQ_STATUS(dd) && DES_REG_IRQ_ENABLE(dd)) {
|
if (err == -EPROBE_DEFER) {
|
||||||
|
goto err_irq;
|
||||||
|
} else if (err && DES_REG_IRQ_STATUS(dd) && DES_REG_IRQ_ENABLE(dd)) {
|
||||||
dd->pio_only = 1;
|
dd->pio_only = 1;
|
||||||
|
|
||||||
irq = platform_get_irq(pdev, 0);
|
irq = platform_get_irq(pdev, 0);
|
||||||
|
@ -1141,8 +1107,8 @@ err_algs:
|
||||||
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
|
for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
|
||||||
crypto_unregister_alg(
|
crypto_unregister_alg(
|
||||||
&dd->pdata->algs_info[i].algs_list[j]);
|
&dd->pdata->algs_info[i].algs_list[j]);
|
||||||
if (!dd->pio_only)
|
|
||||||
omap_des_dma_cleanup(dd);
|
omap_des_dma_cleanup(dd);
|
||||||
err_irq:
|
err_irq:
|
||||||
tasklet_kill(&dd->done_task);
|
tasklet_kill(&dd->done_task);
|
||||||
err_get:
|
err_get:
|
||||||
|
|
Loading…
Reference in New Issue