Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd49a69e authored by Mark A. Greer's avatar Mark A. Greer Committed by Herbert Xu
Browse files

crypto: omap-sham - Remove usage of private DMA API



Remove usage of the private OMAP DMA API.
The dmaengine API will be used instead.

CC: Russell King <rmk+kernel@arm.linux.org.uk>
CC: Dmitry Kasatkin <dmitry.kasatkin@intel.com>
Signed-off-by: default avatarMark A. Greer <mgreer@animalcreek.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent dfd061d5
Loading
Loading
Loading
Loading
+0 −109
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@
 * Some ideas are from old omap-sha1-md5.c driver.
 */

#define OMAP_SHAM_DMA_PRIVATE

#define pr_fmt(fmt) "%s: " fmt, __func__

#include <linux/err.h>
@@ -113,9 +111,7 @@ struct omap_sham_reqctx {

	/* walk state */
	struct scatterlist	*sg;
#ifndef OMAP_SHAM_DMA_PRIVATE
	struct scatterlist	sgl;
#endif
	unsigned int		offset;	/* offset in current sg */
	unsigned int		total;	/* total request */

@@ -149,12 +145,7 @@ struct omap_sham_dev {
	int			irq;
	spinlock_t		lock;
	int			err;
#ifdef OMAP_SHAM_DMA_PRIVATE
	int			dma;
	int			dma_lch;
#else
	struct dma_chan		*dma_lch;
#endif
	struct tasklet_struct	done_task;

	unsigned long		flags;
@@ -324,7 +315,6 @@ static int omap_sham_xmit_cpu(struct omap_sham_dev *dd, const u8 *buf,
	return -EINPROGRESS;
}

#ifndef OMAP_SHAM_DMA_PRIVATE
static void omap_sham_dma_callback(void *param)
{
	struct omap_sham_dev *dd = param;
@@ -332,34 +322,18 @@ static void omap_sham_dma_callback(void *param)
	set_bit(FLAGS_DMA_READY, &dd->flags);
	tasklet_schedule(&dd->done_task);
}
#endif

static int omap_sham_xmit_dma(struct omap_sham_dev *dd, dma_addr_t dma_addr,
			      size_t length, int final, int is_sg)
{
	struct omap_sham_reqctx *ctx = ahash_request_ctx(dd->req);
#ifdef OMAP_SHAM_DMA_PRIVATE
	int len32;
#else
	struct dma_async_tx_descriptor *tx;
	struct dma_slave_config cfg;
	int len32, ret;
#endif

	dev_dbg(dd->dev, "xmit_dma: digcnt: %d, length: %d, final: %d\n",
						ctx->digcnt, length, final);

#ifdef OMAP_SHAM_DMA_PRIVATE
	len32 = DIV_ROUND_UP(length, sizeof(u32));

	omap_set_dma_transfer_params(dd->dma_lch, OMAP_DMA_DATA_TYPE_S32, len32,
			1, OMAP_DMA_SYNC_PACKET, dd->dma,
				OMAP_DMA_DST_SYNC_PREFETCH);

	omap_set_dma_src_params(dd->dma_lch, 0, OMAP_DMA_AMODE_POST_INC,
				dma_addr, 0, 0);

#else
	memset(&cfg, 0, sizeof(cfg));

	cfg.dst_addr = dd->phys_base + SHA_REG_DIN(0);
@@ -401,7 +375,6 @@ static int omap_sham_xmit_dma(struct omap_sham_dev *dd, dma_addr_t dma_addr,

	tx->callback = omap_sham_dma_callback;
	tx->callback_param = dd;
#endif

	omap_sham_write_ctrl(dd, length, final, 1);

@@ -412,12 +385,8 @@ static int omap_sham_xmit_dma(struct omap_sham_dev *dd, dma_addr_t dma_addr,

	set_bit(FLAGS_DMA_ACTIVE, &dd->flags);

#ifdef OMAP_SHAM_DMA_PRIVATE
	omap_start_dma(dd->dma_lch);
#else
	dmaengine_submit(tx);
	dma_async_issue_pending(dd->dma_lch);
#endif

	return -EINPROGRESS;
}
@@ -523,7 +492,6 @@ static int omap_sham_update_dma_start(struct omap_sham_dev *dd)
	if (ctx->bufcnt || ctx->offset)
		return omap_sham_update_dma_slow(dd);

#ifndef OMAP_SHAM_DMA_PRIVATE
	/*
	 * Don't use the sg interface when the transfer size is less
	 * than the number of elements in a DMA frame.  Otherwise,
@@ -532,7 +500,6 @@ static int omap_sham_update_dma_start(struct omap_sham_dev *dd)
	 */
	if (ctx->total < (DST_MAXBURST * sizeof(u32)))
		return omap_sham_update_dma_slow(dd);
#endif

	dev_dbg(dd->dev, "fast: digcnt: %d, bufcnt: %u, total: %u\n",
			ctx->digcnt, ctx->bufcnt, ctx->total);
@@ -594,11 +561,7 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)
{
	struct omap_sham_reqctx *ctx = ahash_request_ctx(dd->req);

#ifdef OMAP_SHAM_DMA_PRIVATE
	omap_stop_dma(dd->dma_lch);
#else
	dmaengine_terminate_all(dd->dma_lch);
#endif

	if (ctx->flags & BIT(FLAGS_SG)) {
		dma_unmap_sg(dd->dev, ctx->sg, 1, DMA_TO_DEVICE);
@@ -802,18 +765,6 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
	if (err)
		goto err1;

#ifdef OMAP_SHAM_DMA_PRIVATE
	omap_set_dma_dest_params(dd->dma_lch, 0,
			OMAP_DMA_AMODE_CONSTANT,
			dd->phys_base + SHA_REG_DIN(0), 0, 16);

	omap_set_dma_dest_burst_mode(dd->dma_lch,
			OMAP_DMA_DATA_BURST_16);

	omap_set_dma_src_burst_mode(dd->dma_lch,
			OMAP_DMA_DATA_BURST_4);
#endif

	if (ctx->digcnt)
		/* request has changed - restore hash */
		omap_sham_copy_hash(req, 0);
@@ -1204,55 +1155,13 @@ static irqreturn_t omap_sham_irq(int irq, void *dev_id)
	return IRQ_HANDLED;
}

#ifdef OMAP_SHAM_DMA_PRIVATE
static void omap_sham_dma_callback(int lch, u16 ch_status, void *data)
{
	struct omap_sham_dev *dd = data;

	if (ch_status != OMAP_DMA_BLOCK_IRQ) {
		pr_err("omap-sham DMA error status: 0x%hx\n", ch_status);
		dd->err = -EIO;
		clear_bit(FLAGS_INIT, &dd->flags);/* request to re-initialize */
	}

	set_bit(FLAGS_DMA_READY, &dd->flags);
	tasklet_schedule(&dd->done_task);
}

static int omap_sham_dma_init(struct omap_sham_dev *dd)
{
	int err;

	dd->dma_lch = -1;

	err = omap_request_dma(dd->dma, dev_name(dd->dev),
			omap_sham_dma_callback, dd, &dd->dma_lch);
	if (err) {
		dev_err(dd->dev, "Unable to request DMA channel\n");
		return err;
	}

	return 0;
}

static void omap_sham_dma_cleanup(struct omap_sham_dev *dd)
{
	if (dd->dma_lch >= 0) {
		omap_free_dma(dd->dma_lch);
		dd->dma_lch = -1;
	}
}
#endif

static int __devinit omap_sham_probe(struct platform_device *pdev)
{
	struct omap_sham_dev *dd;
	struct device *dev = &pdev->dev;
	struct resource *res;
#ifndef OMAP_SHAM_DMA_PRIVATE
	dma_cap_mask_t mask;
	unsigned dma_chan;
#endif
	int err, i, j;

	dd = kzalloc(sizeof(struct omap_sham_dev), GFP_KERNEL);
@@ -1287,11 +1196,7 @@ static int __devinit omap_sham_probe(struct platform_device *pdev)
		err = -ENODEV;
		goto res_err;
	}
#ifdef OMAP_SHAM_DMA_PRIVATE
	dd->dma = res->start;
#else
	dma_chan = res->start;
#endif

	/* Get the IRQ */
	dd->irq = platform_get_irq(pdev,  0);
@@ -1308,11 +1213,6 @@ static int __devinit omap_sham_probe(struct platform_device *pdev)
		goto res_err;
	}

#ifdef OMAP_SHAM_DMA_PRIVATE
	err = omap_sham_dma_init(dd);
	if (err)
		goto dma_err;
#else
	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

@@ -1323,7 +1223,6 @@ static int __devinit omap_sham_probe(struct platform_device *pdev)
		err = -ENXIO;
		goto dma_err;
	}
#endif

	dd->io_base = ioremap(dd->phys_base, SZ_4K);
	if (!dd->io_base) {
@@ -1359,11 +1258,7 @@ static int __devinit omap_sham_probe(struct platform_device *pdev)
	iounmap(dd->io_base);
	pm_runtime_disable(dev);
io_err:
#ifdef OMAP_SHAM_DMA_PRIVATE
	omap_sham_dma_cleanup(dd);
#else
	dma_release_channel(dd->dma_lch);
#endif
dma_err:
	if (dd->irq >= 0)
		free_irq(dd->irq, dd);
@@ -1392,11 +1287,7 @@ static int __devexit omap_sham_remove(struct platform_device *pdev)
	tasklet_kill(&dd->done_task);
	iounmap(dd->io_base);
	pm_runtime_disable(&pdev->dev);
#ifdef OMAP_SHAM_DMA_PRIVATE
	omap_sham_dma_cleanup(dd);
#else
	dma_release_channel(dd->dma_lch);
#endif
	if (dd->irq >= 0)
		free_irq(dd->irq, dd);
	kfree(dd);