Commit 4217efa3 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

parport_ip32: pass struct device to DMA API functions



The DMA API generally relies on a struct device to work properly, and
only barely works without one for legacy reasons.  Pass the easily
available struct device from the platform_device to remedy this.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent c13edf81
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -568,6 +568,7 @@ static irqreturn_t parport_ip32_merr_interrupt(int irq, void *dev_id)

/**
 * parport_ip32_dma_start - begins a DMA transfer
 * @p:		partport to work on
 * @dir:	DMA direction: DMA_TO_DEVICE or DMA_FROM_DEVICE
 * @addr:	pointer to data buffer
 * @count:	buffer size
@@ -575,8 +576,8 @@ static irqreturn_t parport_ip32_merr_interrupt(int irq, void *dev_id)
 * Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be
 * correctly balanced.
 */
static int parport_ip32_dma_start(enum dma_data_direction dir,
				  void *addr, size_t count)
static int parport_ip32_dma_start(struct parport *p,
		enum dma_data_direction dir, void *addr, size_t count)
{
	unsigned int limit;
	u64 ctrl;
@@ -601,7 +602,7 @@ static int parport_ip32_dma_start(enum dma_data_direction dir,

	/* Prepare DMA pointers */
	parport_ip32_dma.dir = dir;
	parport_ip32_dma.buf = dma_map_single(NULL, addr, count, dir);
	parport_ip32_dma.buf = dma_map_single(&p->bus_dev, addr, count, dir);
	parport_ip32_dma.len = count;
	parport_ip32_dma.next = parport_ip32_dma.buf;
	parport_ip32_dma.left = parport_ip32_dma.len;
@@ -625,11 +626,12 @@ static int parport_ip32_dma_start(enum dma_data_direction dir,

/**
 * parport_ip32_dma_stop - ends a running DMA transfer
 * @p:		partport to work on
 *
 * Calls to parport_ip32_dma_start() and parport_ip32_dma_stop() must be
 * correctly balanced.
 */
static void parport_ip32_dma_stop(void)
static void parport_ip32_dma_stop(struct parport *p)
{
	u64 ctx_a;
	u64 ctx_b;
@@ -685,8 +687,8 @@ static void parport_ip32_dma_stop(void)
	enable_irq(MACEISA_PAR_CTXB_IRQ);
	parport_ip32_dma.irq_on = 1;

	dma_unmap_single(NULL, parport_ip32_dma.buf, parport_ip32_dma.len,
			 parport_ip32_dma.dir);
	dma_unmap_single(&p->bus_dev, parport_ip32_dma.buf,
			 parport_ip32_dma.len, parport_ip32_dma.dir);
}

/**
@@ -1445,7 +1447,7 @@ static size_t parport_ip32_fifo_write_block_dma(struct parport *p,

	priv->irq_mode = PARPORT_IP32_IRQ_HERE;

	parport_ip32_dma_start(DMA_TO_DEVICE, (void *)buf, len);
	parport_ip32_dma_start(p, DMA_TO_DEVICE, (void *)buf, len);
	reinit_completion(&priv->irq_complete);
	parport_ip32_frob_econtrol(p, ECR_DMAEN | ECR_SERVINTR, ECR_DMAEN);

@@ -1461,7 +1463,7 @@ static size_t parport_ip32_fifo_write_block_dma(struct parport *p,
		if (ecr & ECR_SERVINTR)
			break;	/* DMA transfer just finished */
	}
	parport_ip32_dma_stop();
	parport_ip32_dma_stop(p);
	written = len - parport_ip32_dma_get_residue();

	priv->irq_mode = PARPORT_IP32_IRQ_FWD;