Commit 2f6f0680 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Herbert Xu

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: default avatarPeter 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: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent da8b29a6
...@@ -29,7 +29,6 @@ ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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,7 +1107,7 @@ static int omap_des_probe(struct platform_device *pdev) ...@@ -1141,7 +1107,7 @@ static int omap_des_probe(struct platform_device *pdev)
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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment