Linux Audio

Check our new training course

Loading...
v5.9
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * SA11x0 DMAengine support
   4 *
   5 * Copyright (C) 2012 Russell King
   6 *   Derived in part from arch/arm/mach-sa1100/dma.c,
   7 *   Copyright (C) 2000, 2001 by Nicolas Pitre
 
 
 
 
   8 */
   9#include <linux/sched.h>
  10#include <linux/device.h>
  11#include <linux/dmaengine.h>
  12#include <linux/init.h>
  13#include <linux/interrupt.h>
  14#include <linux/kernel.h>
  15#include <linux/module.h>
  16#include <linux/platform_device.h>
 
  17#include <linux/slab.h>
  18#include <linux/spinlock.h>
  19
  20#include "virt-dma.h"
  21
  22#define NR_PHY_CHAN	6
  23#define DMA_ALIGN	3
  24#define DMA_MAX_SIZE	0x1fff
  25#define DMA_CHUNK_SIZE	0x1000
  26
  27#define DMA_DDAR	0x00
  28#define DMA_DCSR_S	0x04
  29#define DMA_DCSR_C	0x08
  30#define DMA_DCSR_R	0x0c
  31#define DMA_DBSA	0x10
  32#define DMA_DBTA	0x14
  33#define DMA_DBSB	0x18
  34#define DMA_DBTB	0x1c
  35#define DMA_SIZE	0x20
  36
  37#define DCSR_RUN	(1 << 0)
  38#define DCSR_IE		(1 << 1)
  39#define DCSR_ERROR	(1 << 2)
  40#define DCSR_DONEA	(1 << 3)
  41#define DCSR_STRTA	(1 << 4)
  42#define DCSR_DONEB	(1 << 5)
  43#define DCSR_STRTB	(1 << 6)
  44#define DCSR_BIU	(1 << 7)
  45
  46#define DDAR_RW		(1 << 0)	/* 0 = W, 1 = R */
  47#define DDAR_E		(1 << 1)	/* 0 = LE, 1 = BE */
  48#define DDAR_BS		(1 << 2)	/* 0 = BS4, 1 = BS8 */
  49#define DDAR_DW		(1 << 3)	/* 0 = 8b, 1 = 16b */
  50#define DDAR_Ser0UDCTr	(0x0 << 4)
  51#define DDAR_Ser0UDCRc	(0x1 << 4)
  52#define DDAR_Ser1SDLCTr	(0x2 << 4)
  53#define DDAR_Ser1SDLCRc	(0x3 << 4)
  54#define DDAR_Ser1UARTTr	(0x4 << 4)
  55#define DDAR_Ser1UARTRc	(0x5 << 4)
  56#define DDAR_Ser2ICPTr	(0x6 << 4)
  57#define DDAR_Ser2ICPRc	(0x7 << 4)
  58#define DDAR_Ser3UARTTr	(0x8 << 4)
  59#define DDAR_Ser3UARTRc	(0x9 << 4)
  60#define DDAR_Ser4MCP0Tr	(0xa << 4)
  61#define DDAR_Ser4MCP0Rc	(0xb << 4)
  62#define DDAR_Ser4MCP1Tr	(0xc << 4)
  63#define DDAR_Ser4MCP1Rc	(0xd << 4)
  64#define DDAR_Ser4SSPTr	(0xe << 4)
  65#define DDAR_Ser4SSPRc	(0xf << 4)
  66
  67struct sa11x0_dma_sg {
  68	u32			addr;
  69	u32			len;
  70};
  71
  72struct sa11x0_dma_desc {
  73	struct virt_dma_desc	vd;
  74
  75	u32			ddar;
  76	size_t			size;
  77	unsigned		period;
  78	bool			cyclic;
  79
  80	unsigned		sglen;
  81	struct sa11x0_dma_sg	sg[];
  82};
  83
  84struct sa11x0_dma_phy;
  85
  86struct sa11x0_dma_chan {
  87	struct virt_dma_chan	vc;
  88
  89	/* protected by c->vc.lock */
  90	struct sa11x0_dma_phy	*phy;
  91	enum dma_status		status;
  92
  93	/* protected by d->lock */
  94	struct list_head	node;
  95
  96	u32			ddar;
  97	const char		*name;
  98};
  99
 100struct sa11x0_dma_phy {
 101	void __iomem		*base;
 102	struct sa11x0_dma_dev	*dev;
 103	unsigned		num;
 104
 105	struct sa11x0_dma_chan	*vchan;
 106
 107	/* Protected by c->vc.lock */
 108	unsigned		sg_load;
 109	struct sa11x0_dma_desc	*txd_load;
 110	unsigned		sg_done;
 111	struct sa11x0_dma_desc	*txd_done;
 112	u32			dbs[2];
 113	u32			dbt[2];
 114	u32			dcsr;
 115};
 116
 117struct sa11x0_dma_dev {
 118	struct dma_device	slave;
 119	void __iomem		*base;
 120	spinlock_t		lock;
 121	struct tasklet_struct	task;
 122	struct list_head	chan_pending;
 123	struct sa11x0_dma_phy	phy[NR_PHY_CHAN];
 124};
 125
 126static struct sa11x0_dma_chan *to_sa11x0_dma_chan(struct dma_chan *chan)
 127{
 128	return container_of(chan, struct sa11x0_dma_chan, vc.chan);
 129}
 130
 131static struct sa11x0_dma_dev *to_sa11x0_dma(struct dma_device *dmadev)
 132{
 133	return container_of(dmadev, struct sa11x0_dma_dev, slave);
 134}
 135
 136static struct sa11x0_dma_desc *sa11x0_dma_next_desc(struct sa11x0_dma_chan *c)
 137{
 138	struct virt_dma_desc *vd = vchan_next_desc(&c->vc);
 139
 140	return vd ? container_of(vd, struct sa11x0_dma_desc, vd) : NULL;
 141}
 142
 143static void sa11x0_dma_free_desc(struct virt_dma_desc *vd)
 144{
 145	kfree(container_of(vd, struct sa11x0_dma_desc, vd));
 146}
 147
 148static void sa11x0_dma_start_desc(struct sa11x0_dma_phy *p, struct sa11x0_dma_desc *txd)
 149{
 150	list_del(&txd->vd.node);
 151	p->txd_load = txd;
 152	p->sg_load = 0;
 153
 154	dev_vdbg(p->dev->slave.dev, "pchan %u: txd %p[%x]: starting: DDAR:%x\n",
 155		p->num, &txd->vd, txd->vd.tx.cookie, txd->ddar);
 156}
 157
 158static void noinline sa11x0_dma_start_sg(struct sa11x0_dma_phy *p,
 159	struct sa11x0_dma_chan *c)
 160{
 161	struct sa11x0_dma_desc *txd = p->txd_load;
 162	struct sa11x0_dma_sg *sg;
 163	void __iomem *base = p->base;
 164	unsigned dbsx, dbtx;
 165	u32 dcsr;
 166
 167	if (!txd)
 168		return;
 169
 170	dcsr = readl_relaxed(base + DMA_DCSR_R);
 171
 172	/* Don't try to load the next transfer if both buffers are started */
 173	if ((dcsr & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB))
 174		return;
 175
 176	if (p->sg_load == txd->sglen) {
 177		if (!txd->cyclic) {
 178			struct sa11x0_dma_desc *txn = sa11x0_dma_next_desc(c);
 179
 180			/*
 181			 * We have reached the end of the current descriptor.
 182			 * Peek at the next descriptor, and if compatible with
 183			 * the current, start processing it.
 184			 */
 185			if (txn && txn->ddar == txd->ddar) {
 186				txd = txn;
 187				sa11x0_dma_start_desc(p, txn);
 188			} else {
 189				p->txd_load = NULL;
 190				return;
 191			}
 192		} else {
 193			/* Cyclic: reset back to beginning */
 194			p->sg_load = 0;
 195		}
 196	}
 197
 198	sg = &txd->sg[p->sg_load++];
 199
 200	/* Select buffer to load according to channel status */
 201	if (((dcsr & (DCSR_BIU | DCSR_STRTB)) == (DCSR_BIU | DCSR_STRTB)) ||
 202	    ((dcsr & (DCSR_BIU | DCSR_STRTA)) == 0)) {
 203		dbsx = DMA_DBSA;
 204		dbtx = DMA_DBTA;
 205		dcsr = DCSR_STRTA | DCSR_IE | DCSR_RUN;
 206	} else {
 207		dbsx = DMA_DBSB;
 208		dbtx = DMA_DBTB;
 209		dcsr = DCSR_STRTB | DCSR_IE | DCSR_RUN;
 210	}
 211
 212	writel_relaxed(sg->addr, base + dbsx);
 213	writel_relaxed(sg->len, base + dbtx);
 214	writel(dcsr, base + DMA_DCSR_S);
 215
 216	dev_dbg(p->dev->slave.dev, "pchan %u: load: DCSR:%02x DBS%c:%08x DBT%c:%08x\n",
 217		p->num, dcsr,
 218		'A' + (dbsx == DMA_DBSB), sg->addr,
 219		'A' + (dbtx == DMA_DBTB), sg->len);
 220}
 221
 222static void noinline sa11x0_dma_complete(struct sa11x0_dma_phy *p,
 223	struct sa11x0_dma_chan *c)
 224{
 225	struct sa11x0_dma_desc *txd = p->txd_done;
 226
 227	if (++p->sg_done == txd->sglen) {
 228		if (!txd->cyclic) {
 229			vchan_cookie_complete(&txd->vd);
 230
 231			p->sg_done = 0;
 232			p->txd_done = p->txd_load;
 233
 234			if (!p->txd_done)
 235				tasklet_schedule(&p->dev->task);
 236		} else {
 237			if ((p->sg_done % txd->period) == 0)
 238				vchan_cyclic_callback(&txd->vd);
 239
 240			/* Cyclic: reset back to beginning */
 241			p->sg_done = 0;
 242		}
 243	}
 244
 245	sa11x0_dma_start_sg(p, c);
 246}
 247
 248static irqreturn_t sa11x0_dma_irq(int irq, void *dev_id)
 249{
 250	struct sa11x0_dma_phy *p = dev_id;
 251	struct sa11x0_dma_dev *d = p->dev;
 252	struct sa11x0_dma_chan *c;
 253	u32 dcsr;
 254
 255	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
 256	if (!(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB)))
 257		return IRQ_NONE;
 258
 259	/* Clear reported status bits */
 260	writel_relaxed(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB),
 261		p->base + DMA_DCSR_C);
 262
 263	dev_dbg(d->slave.dev, "pchan %u: irq: DCSR:%02x\n", p->num, dcsr);
 264
 265	if (dcsr & DCSR_ERROR) {
 266		dev_err(d->slave.dev, "pchan %u: error. DCSR:%02x DDAR:%08x DBSA:%08x DBTA:%08x DBSB:%08x DBTB:%08x\n",
 267			p->num, dcsr,
 268			readl_relaxed(p->base + DMA_DDAR),
 269			readl_relaxed(p->base + DMA_DBSA),
 270			readl_relaxed(p->base + DMA_DBTA),
 271			readl_relaxed(p->base + DMA_DBSB),
 272			readl_relaxed(p->base + DMA_DBTB));
 273	}
 274
 275	c = p->vchan;
 276	if (c) {
 277		unsigned long flags;
 278
 279		spin_lock_irqsave(&c->vc.lock, flags);
 280		/*
 281		 * Now that we're holding the lock, check that the vchan
 282		 * really is associated with this pchan before touching the
 283		 * hardware.  This should always succeed, because we won't
 284		 * change p->vchan or c->phy while the channel is actively
 285		 * transferring.
 286		 */
 287		if (c->phy == p) {
 288			if (dcsr & DCSR_DONEA)
 289				sa11x0_dma_complete(p, c);
 290			if (dcsr & DCSR_DONEB)
 291				sa11x0_dma_complete(p, c);
 292		}
 293		spin_unlock_irqrestore(&c->vc.lock, flags);
 294	}
 295
 296	return IRQ_HANDLED;
 297}
 298
 299static void sa11x0_dma_start_txd(struct sa11x0_dma_chan *c)
 300{
 301	struct sa11x0_dma_desc *txd = sa11x0_dma_next_desc(c);
 302
 303	/* If the issued list is empty, we have no further txds to process */
 304	if (txd) {
 305		struct sa11x0_dma_phy *p = c->phy;
 306
 307		sa11x0_dma_start_desc(p, txd);
 308		p->txd_done = txd;
 309		p->sg_done = 0;
 310
 311		/* The channel should not have any transfers started */
 312		WARN_ON(readl_relaxed(p->base + DMA_DCSR_R) &
 313				      (DCSR_STRTA | DCSR_STRTB));
 314
 315		/* Clear the run and start bits before changing DDAR */
 316		writel_relaxed(DCSR_RUN | DCSR_STRTA | DCSR_STRTB,
 317			       p->base + DMA_DCSR_C);
 318		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
 319
 320		/* Try to start both buffers */
 321		sa11x0_dma_start_sg(p, c);
 322		sa11x0_dma_start_sg(p, c);
 323	}
 324}
 325
 326static void sa11x0_dma_tasklet(unsigned long arg)
 327{
 328	struct sa11x0_dma_dev *d = (struct sa11x0_dma_dev *)arg;
 329	struct sa11x0_dma_phy *p;
 330	struct sa11x0_dma_chan *c;
 331	unsigned pch, pch_alloc = 0;
 332
 333	dev_dbg(d->slave.dev, "tasklet enter\n");
 334
 335	list_for_each_entry(c, &d->slave.channels, vc.chan.device_node) {
 336		spin_lock_irq(&c->vc.lock);
 337		p = c->phy;
 338		if (p && !p->txd_done) {
 339			sa11x0_dma_start_txd(c);
 340			if (!p->txd_done) {
 341				/* No current txd associated with this channel */
 342				dev_dbg(d->slave.dev, "pchan %u: free\n", p->num);
 343
 344				/* Mark this channel free */
 345				c->phy = NULL;
 346				p->vchan = NULL;
 347			}
 348		}
 349		spin_unlock_irq(&c->vc.lock);
 350	}
 351
 352	spin_lock_irq(&d->lock);
 353	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
 354		p = &d->phy[pch];
 355
 356		if (p->vchan == NULL && !list_empty(&d->chan_pending)) {
 357			c = list_first_entry(&d->chan_pending,
 358				struct sa11x0_dma_chan, node);
 359			list_del_init(&c->node);
 360
 361			pch_alloc |= 1 << pch;
 362
 363			/* Mark this channel allocated */
 364			p->vchan = c;
 365
 366			dev_dbg(d->slave.dev, "pchan %u: alloc vchan %p\n", pch, &c->vc);
 367		}
 368	}
 369	spin_unlock_irq(&d->lock);
 370
 371	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
 372		if (pch_alloc & (1 << pch)) {
 373			p = &d->phy[pch];
 374			c = p->vchan;
 375
 376			spin_lock_irq(&c->vc.lock);
 377			c->phy = p;
 378
 379			sa11x0_dma_start_txd(c);
 380			spin_unlock_irq(&c->vc.lock);
 381		}
 382	}
 383
 384	dev_dbg(d->slave.dev, "tasklet exit\n");
 385}
 386
 387
 388static void sa11x0_dma_free_chan_resources(struct dma_chan *chan)
 389{
 390	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 391	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 392	unsigned long flags;
 393
 394	spin_lock_irqsave(&d->lock, flags);
 395	list_del_init(&c->node);
 396	spin_unlock_irqrestore(&d->lock, flags);
 397
 398	vchan_free_chan_resources(&c->vc);
 399}
 400
 401static dma_addr_t sa11x0_dma_pos(struct sa11x0_dma_phy *p)
 402{
 403	unsigned reg;
 404	u32 dcsr;
 405
 406	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
 407
 408	if ((dcsr & (DCSR_BIU | DCSR_STRTA)) == DCSR_STRTA ||
 409	    (dcsr & (DCSR_BIU | DCSR_STRTB)) == DCSR_BIU)
 410		reg = DMA_DBSA;
 411	else
 412		reg = DMA_DBSB;
 413
 414	return readl_relaxed(p->base + reg);
 415}
 416
 417static enum dma_status sa11x0_dma_tx_status(struct dma_chan *chan,
 418	dma_cookie_t cookie, struct dma_tx_state *state)
 419{
 420	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 421	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 422	struct sa11x0_dma_phy *p;
 423	struct virt_dma_desc *vd;
 424	unsigned long flags;
 425	enum dma_status ret;
 426
 427	ret = dma_cookie_status(&c->vc.chan, cookie, state);
 428	if (ret == DMA_COMPLETE)
 429		return ret;
 430
 431	if (!state)
 432		return c->status;
 433
 434	spin_lock_irqsave(&c->vc.lock, flags);
 435	p = c->phy;
 436
 437	/*
 438	 * If the cookie is on our issue queue, then the residue is
 439	 * its total size.
 440	 */
 441	vd = vchan_find_desc(&c->vc, cookie);
 442	if (vd) {
 443		state->residue = container_of(vd, struct sa11x0_dma_desc, vd)->size;
 444	} else if (!p) {
 445		state->residue = 0;
 446	} else {
 447		struct sa11x0_dma_desc *txd;
 448		size_t bytes = 0;
 449
 450		if (p->txd_done && p->txd_done->vd.tx.cookie == cookie)
 451			txd = p->txd_done;
 452		else if (p->txd_load && p->txd_load->vd.tx.cookie == cookie)
 453			txd = p->txd_load;
 454		else
 455			txd = NULL;
 456
 457		ret = c->status;
 458		if (txd) {
 459			dma_addr_t addr = sa11x0_dma_pos(p);
 460			unsigned i;
 461
 462			dev_vdbg(d->slave.dev, "tx_status: addr:%pad\n", &addr);
 463
 464			for (i = 0; i < txd->sglen; i++) {
 465				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x\n",
 466					i, txd->sg[i].addr, txd->sg[i].len);
 467				if (addr >= txd->sg[i].addr &&
 468				    addr < txd->sg[i].addr + txd->sg[i].len) {
 469					unsigned len;
 470
 471					len = txd->sg[i].len -
 472						(addr - txd->sg[i].addr);
 473					dev_vdbg(d->slave.dev, "tx_status: [%u] +%x\n",
 474						i, len);
 475					bytes += len;
 476					i++;
 477					break;
 478				}
 479			}
 480			for (; i < txd->sglen; i++) {
 481				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x ++\n",
 482					i, txd->sg[i].addr, txd->sg[i].len);
 483				bytes += txd->sg[i].len;
 484			}
 485		}
 486		state->residue = bytes;
 487	}
 488	spin_unlock_irqrestore(&c->vc.lock, flags);
 489
 490	dev_vdbg(d->slave.dev, "tx_status: bytes 0x%x\n", state->residue);
 491
 492	return ret;
 493}
 494
 495/*
 496 * Move pending txds to the issued list, and re-init pending list.
 497 * If not already pending, add this channel to the list of pending
 498 * channels and trigger the tasklet to run.
 499 */
 500static void sa11x0_dma_issue_pending(struct dma_chan *chan)
 501{
 502	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 503	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 504	unsigned long flags;
 505
 506	spin_lock_irqsave(&c->vc.lock, flags);
 507	if (vchan_issue_pending(&c->vc)) {
 508		if (!c->phy) {
 509			spin_lock(&d->lock);
 510			if (list_empty(&c->node)) {
 511				list_add_tail(&c->node, &d->chan_pending);
 512				tasklet_schedule(&d->task);
 513				dev_dbg(d->slave.dev, "vchan %p: issued\n", &c->vc);
 514			}
 515			spin_unlock(&d->lock);
 516		}
 517	} else
 518		dev_dbg(d->slave.dev, "vchan %p: nothing to issue\n", &c->vc);
 519	spin_unlock_irqrestore(&c->vc.lock, flags);
 520}
 521
 522static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
 523	struct dma_chan *chan, struct scatterlist *sg, unsigned int sglen,
 524	enum dma_transfer_direction dir, unsigned long flags, void *context)
 525{
 526	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 527	struct sa11x0_dma_desc *txd;
 528	struct scatterlist *sgent;
 529	unsigned i, j = sglen;
 530	size_t size = 0;
 531
 532	/* SA11x0 channels can only operate in their native direction */
 533	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
 534		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
 535			&c->vc, c->ddar, dir);
 536		return NULL;
 537	}
 538
 539	/* Do not allow zero-sized txds */
 540	if (sglen == 0)
 541		return NULL;
 542
 543	for_each_sg(sg, sgent, sglen, i) {
 544		dma_addr_t addr = sg_dma_address(sgent);
 545		unsigned int len = sg_dma_len(sgent);
 546
 547		if (len > DMA_MAX_SIZE)
 548			j += DIV_ROUND_UP(len, DMA_MAX_SIZE & ~DMA_ALIGN) - 1;
 549		if (addr & DMA_ALIGN) {
 550			dev_dbg(chan->device->dev, "vchan %p: bad buffer alignment: %pad\n",
 551				&c->vc, &addr);
 552			return NULL;
 553		}
 554	}
 555
 556	txd = kzalloc(struct_size(txd, sg, j), GFP_ATOMIC);
 557	if (!txd) {
 558		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
 559		return NULL;
 560	}
 561
 562	j = 0;
 563	for_each_sg(sg, sgent, sglen, i) {
 564		dma_addr_t addr = sg_dma_address(sgent);
 565		unsigned len = sg_dma_len(sgent);
 566
 567		size += len;
 568
 569		do {
 570			unsigned tlen = len;
 571
 572			/*
 573			 * Check whether the transfer will fit.  If not, try
 574			 * to split the transfer up such that we end up with
 575			 * equal chunks - but make sure that we preserve the
 576			 * alignment.  This avoids small segments.
 577			 */
 578			if (tlen > DMA_MAX_SIZE) {
 579				unsigned mult = DIV_ROUND_UP(tlen,
 580					DMA_MAX_SIZE & ~DMA_ALIGN);
 581
 582				tlen = (tlen / mult) & ~DMA_ALIGN;
 583			}
 584
 585			txd->sg[j].addr = addr;
 586			txd->sg[j].len = tlen;
 587
 588			addr += tlen;
 589			len -= tlen;
 590			j++;
 591		} while (len);
 592	}
 593
 594	txd->ddar = c->ddar;
 595	txd->size = size;
 596	txd->sglen = j;
 597
 598	dev_dbg(chan->device->dev, "vchan %p: txd %p: size %zu nr %u\n",
 599		&c->vc, &txd->vd, txd->size, txd->sglen);
 600
 601	return vchan_tx_prep(&c->vc, &txd->vd, flags);
 602}
 603
 604static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
 605	struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
 606	enum dma_transfer_direction dir, unsigned long flags)
 607{
 608	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 609	struct sa11x0_dma_desc *txd;
 610	unsigned i, j, k, sglen, sgperiod;
 611
 612	/* SA11x0 channels can only operate in their native direction */
 613	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
 614		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
 615			&c->vc, c->ddar, dir);
 616		return NULL;
 617	}
 618
 619	sgperiod = DIV_ROUND_UP(period, DMA_MAX_SIZE & ~DMA_ALIGN);
 620	sglen = size * sgperiod / period;
 621
 622	/* Do not allow zero-sized txds */
 623	if (sglen == 0)
 624		return NULL;
 625
 626	txd = kzalloc(struct_size(txd, sg, sglen), GFP_ATOMIC);
 627	if (!txd) {
 628		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
 629		return NULL;
 630	}
 631
 632	for (i = k = 0; i < size / period; i++) {
 633		size_t tlen, len = period;
 634
 635		for (j = 0; j < sgperiod; j++, k++) {
 636			tlen = len;
 637
 638			if (tlen > DMA_MAX_SIZE) {
 639				unsigned mult = DIV_ROUND_UP(tlen, DMA_MAX_SIZE & ~DMA_ALIGN);
 640				tlen = (tlen / mult) & ~DMA_ALIGN;
 641			}
 642
 643			txd->sg[k].addr = addr;
 644			txd->sg[k].len = tlen;
 645			addr += tlen;
 646			len -= tlen;
 647		}
 648
 649		WARN_ON(len != 0);
 650	}
 651
 652	WARN_ON(k != sglen);
 653
 654	txd->ddar = c->ddar;
 655	txd->size = size;
 656	txd->sglen = sglen;
 657	txd->cyclic = 1;
 658	txd->period = sgperiod;
 659
 660	return vchan_tx_prep(&c->vc, &txd->vd, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 661}
 662
 663static int sa11x0_dma_device_config(struct dma_chan *chan,
 664				    struct dma_slave_config *cfg)
 665{
 666	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 667	u32 ddar = c->ddar & ((0xf << 4) | DDAR_RW);
 668	dma_addr_t addr;
 669	enum dma_slave_buswidth width;
 670	u32 maxburst;
 671
 672	if (ddar & DDAR_RW) {
 673		addr = cfg->src_addr;
 674		width = cfg->src_addr_width;
 675		maxburst = cfg->src_maxburst;
 676	} else {
 677		addr = cfg->dst_addr;
 678		width = cfg->dst_addr_width;
 679		maxburst = cfg->dst_maxburst;
 680	}
 681
 682	if ((width != DMA_SLAVE_BUSWIDTH_1_BYTE &&
 683	     width != DMA_SLAVE_BUSWIDTH_2_BYTES) ||
 684	    (maxburst != 4 && maxburst != 8))
 685		return -EINVAL;
 686
 687	if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
 688		ddar |= DDAR_DW;
 689	if (maxburst == 8)
 690		ddar |= DDAR_BS;
 691
 692	dev_dbg(c->vc.chan.device->dev, "vchan %p: dma_slave_config addr %pad width %u burst %u\n",
 693		&c->vc, &addr, width, maxburst);
 694
 695	c->ddar = ddar | (addr & 0xf0000000) | (addr & 0x003ffffc) << 6;
 696
 697	return 0;
 698}
 699
 700static int sa11x0_dma_device_pause(struct dma_chan *chan)
 701{
 702	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 703	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 704	struct sa11x0_dma_phy *p;
 
 705	unsigned long flags;
 706
 707	dev_dbg(d->slave.dev, "vchan %p: pause\n", &c->vc);
 708	spin_lock_irqsave(&c->vc.lock, flags);
 709	if (c->status == DMA_IN_PROGRESS) {
 710		c->status = DMA_PAUSED;
 711
 712		p = c->phy;
 713		if (p) {
 714			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
 715		} else {
 716			spin_lock(&d->lock);
 717			list_del_init(&c->node);
 718			spin_unlock(&d->lock);
 719		}
 720	}
 721	spin_unlock_irqrestore(&c->vc.lock, flags);
 722
 723	return 0;
 724}
 725
 726static int sa11x0_dma_device_resume(struct dma_chan *chan)
 727{
 728	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 729	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 730	struct sa11x0_dma_phy *p;
 
 731	unsigned long flags;
 732
 733	dev_dbg(d->slave.dev, "vchan %p: resume\n", &c->vc);
 734	spin_lock_irqsave(&c->vc.lock, flags);
 735	if (c->status == DMA_PAUSED) {
 736		c->status = DMA_IN_PROGRESS;
 737
 738		p = c->phy;
 739		if (p) {
 740			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_S);
 741		} else if (!list_empty(&c->vc.desc_issued)) {
 742			spin_lock(&d->lock);
 743			list_add_tail(&c->node, &d->chan_pending);
 744			spin_unlock(&d->lock);
 745		}
 746	}
 747	spin_unlock_irqrestore(&c->vc.lock, flags);
 748
 749	return 0;
 750}
 751
 752static int sa11x0_dma_device_terminate_all(struct dma_chan *chan)
 753{
 754	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 755	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 756	struct sa11x0_dma_phy *p;
 757	LIST_HEAD(head);
 758	unsigned long flags;
 759
 760	dev_dbg(d->slave.dev, "vchan %p: terminate all\n", &c->vc);
 761	/* Clear the tx descriptor lists */
 762	spin_lock_irqsave(&c->vc.lock, flags);
 763	vchan_get_all_descriptors(&c->vc, &head);
 764
 765	p = c->phy;
 766	if (p) {
 767		dev_dbg(d->slave.dev, "pchan %u: terminating\n", p->num);
 768		/* vchan is assigned to a pchan - stop the channel */
 769		writel(DCSR_RUN | DCSR_IE |
 770		       DCSR_STRTA | DCSR_DONEA |
 771		       DCSR_STRTB | DCSR_DONEB,
 772		       p->base + DMA_DCSR_C);
 773
 774		if (p->txd_load) {
 775			if (p->txd_load != p->txd_done)
 776				list_add_tail(&p->txd_load->vd.node, &head);
 777			p->txd_load = NULL;
 778		}
 779		if (p->txd_done) {
 780			list_add_tail(&p->txd_done->vd.node, &head);
 781			p->txd_done = NULL;
 782		}
 783		c->phy = NULL;
 784		spin_lock(&d->lock);
 785		p->vchan = NULL;
 786		spin_unlock(&d->lock);
 787		tasklet_schedule(&d->task);
 788	}
 789	spin_unlock_irqrestore(&c->vc.lock, flags);
 790	vchan_dma_desc_free_list(&c->vc, &head);
 791
 792	return 0;
 793}
 794
 795struct sa11x0_dma_channel_desc {
 796	u32 ddar;
 797	const char *name;
 798};
 799
 800#define CD(d1, d2) { .ddar = DDAR_##d1 | d2, .name = #d1 }
 801static const struct sa11x0_dma_channel_desc chan_desc[] = {
 802	CD(Ser0UDCTr, 0),
 803	CD(Ser0UDCRc, DDAR_RW),
 804	CD(Ser1SDLCTr, 0),
 805	CD(Ser1SDLCRc, DDAR_RW),
 806	CD(Ser1UARTTr, 0),
 807	CD(Ser1UARTRc, DDAR_RW),
 808	CD(Ser2ICPTr, 0),
 809	CD(Ser2ICPRc, DDAR_RW),
 810	CD(Ser3UARTTr, 0),
 811	CD(Ser3UARTRc, DDAR_RW),
 812	CD(Ser4MCP0Tr, 0),
 813	CD(Ser4MCP0Rc, DDAR_RW),
 814	CD(Ser4MCP1Tr, 0),
 815	CD(Ser4MCP1Rc, DDAR_RW),
 816	CD(Ser4SSPTr, 0),
 817	CD(Ser4SSPRc, DDAR_RW),
 818};
 819
 820static const struct dma_slave_map sa11x0_dma_map[] = {
 821	{ "sa11x0-ir", "tx", "Ser2ICPTr" },
 822	{ "sa11x0-ir", "rx", "Ser2ICPRc" },
 823	{ "sa11x0-ssp", "tx", "Ser4SSPTr" },
 824	{ "sa11x0-ssp", "rx", "Ser4SSPRc" },
 825};
 826
 827static bool sa11x0_dma_filter_fn(struct dma_chan *chan, void *param)
 828{
 829	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 830	const char *p = param;
 831
 832	return !strcmp(c->name, p);
 833}
 834
 835static int sa11x0_dma_init_dmadev(struct dma_device *dmadev,
 836	struct device *dev)
 837{
 838	unsigned i;
 839
 840	INIT_LIST_HEAD(&dmadev->channels);
 841	dmadev->dev = dev;
 842	dmadev->device_free_chan_resources = sa11x0_dma_free_chan_resources;
 843	dmadev->device_config = sa11x0_dma_device_config;
 844	dmadev->device_pause = sa11x0_dma_device_pause;
 845	dmadev->device_resume = sa11x0_dma_device_resume;
 846	dmadev->device_terminate_all = sa11x0_dma_device_terminate_all;
 847	dmadev->device_tx_status = sa11x0_dma_tx_status;
 848	dmadev->device_issue_pending = sa11x0_dma_issue_pending;
 849
 850	for (i = 0; i < ARRAY_SIZE(chan_desc); i++) {
 851		struct sa11x0_dma_chan *c;
 852
 853		c = kzalloc(sizeof(*c), GFP_KERNEL);
 854		if (!c) {
 855			dev_err(dev, "no memory for channel %u\n", i);
 856			return -ENOMEM;
 857		}
 858
 859		c->status = DMA_IN_PROGRESS;
 860		c->ddar = chan_desc[i].ddar;
 861		c->name = chan_desc[i].name;
 862		INIT_LIST_HEAD(&c->node);
 863
 864		c->vc.desc_free = sa11x0_dma_free_desc;
 865		vchan_init(&c->vc, dmadev);
 866	}
 867
 868	return dma_async_device_register(dmadev);
 869}
 870
 871static int sa11x0_dma_request_irq(struct platform_device *pdev, int nr,
 872	void *data)
 873{
 874	int irq = platform_get_irq(pdev, nr);
 875
 876	if (irq <= 0)
 877		return -ENXIO;
 878
 879	return request_irq(irq, sa11x0_dma_irq, 0, dev_name(&pdev->dev), data);
 880}
 881
 882static void sa11x0_dma_free_irq(struct platform_device *pdev, int nr,
 883	void *data)
 884{
 885	int irq = platform_get_irq(pdev, nr);
 886	if (irq > 0)
 887		free_irq(irq, data);
 888}
 889
 890static void sa11x0_dma_free_channels(struct dma_device *dmadev)
 891{
 892	struct sa11x0_dma_chan *c, *cn;
 893
 894	list_for_each_entry_safe(c, cn, &dmadev->channels, vc.chan.device_node) {
 895		list_del(&c->vc.chan.device_node);
 896		tasklet_kill(&c->vc.task);
 897		kfree(c);
 898	}
 899}
 900
 901static int sa11x0_dma_probe(struct platform_device *pdev)
 902{
 903	struct sa11x0_dma_dev *d;
 904	struct resource *res;
 905	unsigned i;
 906	int ret;
 907
 908	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 909	if (!res)
 910		return -ENXIO;
 911
 912	d = kzalloc(sizeof(*d), GFP_KERNEL);
 913	if (!d) {
 914		ret = -ENOMEM;
 915		goto err_alloc;
 916	}
 917
 918	spin_lock_init(&d->lock);
 919	INIT_LIST_HEAD(&d->chan_pending);
 920
 921	d->slave.filter.fn = sa11x0_dma_filter_fn;
 922	d->slave.filter.mapcnt = ARRAY_SIZE(sa11x0_dma_map);
 923	d->slave.filter.map = sa11x0_dma_map;
 924
 925	d->base = ioremap(res->start, resource_size(res));
 926	if (!d->base) {
 927		ret = -ENOMEM;
 928		goto err_ioremap;
 929	}
 930
 931	tasklet_init(&d->task, sa11x0_dma_tasklet, (unsigned long)d);
 932
 933	for (i = 0; i < NR_PHY_CHAN; i++) {
 934		struct sa11x0_dma_phy *p = &d->phy[i];
 935
 936		p->dev = d;
 937		p->num = i;
 938		p->base = d->base + i * DMA_SIZE;
 939		writel_relaxed(DCSR_RUN | DCSR_IE | DCSR_ERROR |
 940			DCSR_DONEA | DCSR_STRTA | DCSR_DONEB | DCSR_STRTB,
 941			p->base + DMA_DCSR_C);
 942		writel_relaxed(0, p->base + DMA_DDAR);
 943
 944		ret = sa11x0_dma_request_irq(pdev, i, p);
 945		if (ret) {
 946			while (i) {
 947				i--;
 948				sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
 949			}
 950			goto err_irq;
 951		}
 952	}
 953
 954	dma_cap_set(DMA_SLAVE, d->slave.cap_mask);
 955	dma_cap_set(DMA_CYCLIC, d->slave.cap_mask);
 956	d->slave.device_prep_slave_sg = sa11x0_dma_prep_slave_sg;
 957	d->slave.device_prep_dma_cyclic = sa11x0_dma_prep_dma_cyclic;
 958	d->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
 959	d->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
 960	d->slave.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
 961				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
 962	d->slave.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
 963				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
 964	ret = sa11x0_dma_init_dmadev(&d->slave, &pdev->dev);
 965	if (ret) {
 966		dev_warn(d->slave.dev, "failed to register slave async device: %d\n",
 967			ret);
 968		goto err_slave_reg;
 969	}
 970
 971	platform_set_drvdata(pdev, d);
 972	return 0;
 973
 974 err_slave_reg:
 975	sa11x0_dma_free_channels(&d->slave);
 976	for (i = 0; i < NR_PHY_CHAN; i++)
 977		sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
 978 err_irq:
 979	tasklet_kill(&d->task);
 980	iounmap(d->base);
 981 err_ioremap:
 982	kfree(d);
 983 err_alloc:
 984	return ret;
 985}
 986
 987static int sa11x0_dma_remove(struct platform_device *pdev)
 988{
 989	struct sa11x0_dma_dev *d = platform_get_drvdata(pdev);
 990	unsigned pch;
 991
 992	dma_async_device_unregister(&d->slave);
 993
 994	sa11x0_dma_free_channels(&d->slave);
 995	for (pch = 0; pch < NR_PHY_CHAN; pch++)
 996		sa11x0_dma_free_irq(pdev, pch, &d->phy[pch]);
 997	tasklet_kill(&d->task);
 998	iounmap(d->base);
 999	kfree(d);
1000
1001	return 0;
1002}
1003
1004static int sa11x0_dma_suspend(struct device *dev)
1005{
1006	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
1007	unsigned pch;
1008
1009	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
1010		struct sa11x0_dma_phy *p = &d->phy[pch];
1011		u32 dcsr, saved_dcsr;
1012
1013		dcsr = saved_dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1014		if (dcsr & DCSR_RUN) {
1015			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
1016			dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1017		}
1018
1019		saved_dcsr &= DCSR_RUN | DCSR_IE;
1020		if (dcsr & DCSR_BIU) {
1021			p->dbs[0] = readl_relaxed(p->base + DMA_DBSB);
1022			p->dbt[0] = readl_relaxed(p->base + DMA_DBTB);
1023			p->dbs[1] = readl_relaxed(p->base + DMA_DBSA);
1024			p->dbt[1] = readl_relaxed(p->base + DMA_DBTA);
1025			saved_dcsr |= (dcsr & DCSR_STRTA ? DCSR_STRTB : 0) |
1026				      (dcsr & DCSR_STRTB ? DCSR_STRTA : 0);
1027		} else {
1028			p->dbs[0] = readl_relaxed(p->base + DMA_DBSA);
1029			p->dbt[0] = readl_relaxed(p->base + DMA_DBTA);
1030			p->dbs[1] = readl_relaxed(p->base + DMA_DBSB);
1031			p->dbt[1] = readl_relaxed(p->base + DMA_DBTB);
1032			saved_dcsr |= dcsr & (DCSR_STRTA | DCSR_STRTB);
1033		}
1034		p->dcsr = saved_dcsr;
1035
1036		writel(DCSR_STRTA | DCSR_STRTB, p->base + DMA_DCSR_C);
1037	}
1038
1039	return 0;
1040}
1041
1042static int sa11x0_dma_resume(struct device *dev)
1043{
1044	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
1045	unsigned pch;
1046
1047	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
1048		struct sa11x0_dma_phy *p = &d->phy[pch];
1049		struct sa11x0_dma_desc *txd = NULL;
1050		u32 dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1051
1052		WARN_ON(dcsr & (DCSR_BIU | DCSR_STRTA | DCSR_STRTB | DCSR_RUN));
1053
1054		if (p->txd_done)
1055			txd = p->txd_done;
1056		else if (p->txd_load)
1057			txd = p->txd_load;
1058
1059		if (!txd)
1060			continue;
1061
1062		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
1063
1064		writel_relaxed(p->dbs[0], p->base + DMA_DBSA);
1065		writel_relaxed(p->dbt[0], p->base + DMA_DBTA);
1066		writel_relaxed(p->dbs[1], p->base + DMA_DBSB);
1067		writel_relaxed(p->dbt[1], p->base + DMA_DBTB);
1068		writel_relaxed(p->dcsr, p->base + DMA_DCSR_S);
1069	}
1070
1071	return 0;
1072}
1073
1074static const struct dev_pm_ops sa11x0_dma_pm_ops = {
1075	.suspend_noirq = sa11x0_dma_suspend,
1076	.resume_noirq = sa11x0_dma_resume,
1077	.freeze_noirq = sa11x0_dma_suspend,
1078	.thaw_noirq = sa11x0_dma_resume,
1079	.poweroff_noirq = sa11x0_dma_suspend,
1080	.restore_noirq = sa11x0_dma_resume,
1081};
1082
1083static struct platform_driver sa11x0_dma_driver = {
1084	.driver = {
1085		.name	= "sa11x0-dma",
1086		.pm	= &sa11x0_dma_pm_ops,
1087	},
1088	.probe		= sa11x0_dma_probe,
1089	.remove		= sa11x0_dma_remove,
1090};
 
 
 
 
 
 
 
 
 
 
 
 
1091
1092static int __init sa11x0_dma_init(void)
1093{
1094	return platform_driver_register(&sa11x0_dma_driver);
1095}
1096subsys_initcall(sa11x0_dma_init);
1097
1098static void __exit sa11x0_dma_exit(void)
1099{
1100	platform_driver_unregister(&sa11x0_dma_driver);
1101}
1102module_exit(sa11x0_dma_exit);
1103
1104MODULE_AUTHOR("Russell King");
1105MODULE_DESCRIPTION("SA-11x0 DMA driver");
1106MODULE_LICENSE("GPL v2");
1107MODULE_ALIAS("platform:sa11x0-dma");
v4.10.11
 
   1/*
   2 * SA11x0 DMAengine support
   3 *
   4 * Copyright (C) 2012 Russell King
   5 *   Derived in part from arch/arm/mach-sa1100/dma.c,
   6 *   Copyright (C) 2000, 2001 by Nicolas Pitre
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 */
  12#include <linux/sched.h>
  13#include <linux/device.h>
  14#include <linux/dmaengine.h>
  15#include <linux/init.h>
  16#include <linux/interrupt.h>
  17#include <linux/kernel.h>
  18#include <linux/module.h>
  19#include <linux/platform_device.h>
  20#include <linux/sa11x0-dma.h>
  21#include <linux/slab.h>
  22#include <linux/spinlock.h>
  23
  24#include "virt-dma.h"
  25
  26#define NR_PHY_CHAN	6
  27#define DMA_ALIGN	3
  28#define DMA_MAX_SIZE	0x1fff
  29#define DMA_CHUNK_SIZE	0x1000
  30
  31#define DMA_DDAR	0x00
  32#define DMA_DCSR_S	0x04
  33#define DMA_DCSR_C	0x08
  34#define DMA_DCSR_R	0x0c
  35#define DMA_DBSA	0x10
  36#define DMA_DBTA	0x14
  37#define DMA_DBSB	0x18
  38#define DMA_DBTB	0x1c
  39#define DMA_SIZE	0x20
  40
  41#define DCSR_RUN	(1 << 0)
  42#define DCSR_IE		(1 << 1)
  43#define DCSR_ERROR	(1 << 2)
  44#define DCSR_DONEA	(1 << 3)
  45#define DCSR_STRTA	(1 << 4)
  46#define DCSR_DONEB	(1 << 5)
  47#define DCSR_STRTB	(1 << 6)
  48#define DCSR_BIU	(1 << 7)
  49
  50#define DDAR_RW		(1 << 0)	/* 0 = W, 1 = R */
  51#define DDAR_E		(1 << 1)	/* 0 = LE, 1 = BE */
  52#define DDAR_BS		(1 << 2)	/* 0 = BS4, 1 = BS8 */
  53#define DDAR_DW		(1 << 3)	/* 0 = 8b, 1 = 16b */
  54#define DDAR_Ser0UDCTr	(0x0 << 4)
  55#define DDAR_Ser0UDCRc	(0x1 << 4)
  56#define DDAR_Ser1SDLCTr	(0x2 << 4)
  57#define DDAR_Ser1SDLCRc	(0x3 << 4)
  58#define DDAR_Ser1UARTTr	(0x4 << 4)
  59#define DDAR_Ser1UARTRc	(0x5 << 4)
  60#define DDAR_Ser2ICPTr	(0x6 << 4)
  61#define DDAR_Ser2ICPRc	(0x7 << 4)
  62#define DDAR_Ser3UARTTr	(0x8 << 4)
  63#define DDAR_Ser3UARTRc	(0x9 << 4)
  64#define DDAR_Ser4MCP0Tr	(0xa << 4)
  65#define DDAR_Ser4MCP0Rc	(0xb << 4)
  66#define DDAR_Ser4MCP1Tr	(0xc << 4)
  67#define DDAR_Ser4MCP1Rc	(0xd << 4)
  68#define DDAR_Ser4SSPTr	(0xe << 4)
  69#define DDAR_Ser4SSPRc	(0xf << 4)
  70
  71struct sa11x0_dma_sg {
  72	u32			addr;
  73	u32			len;
  74};
  75
  76struct sa11x0_dma_desc {
  77	struct virt_dma_desc	vd;
  78
  79	u32			ddar;
  80	size_t			size;
  81	unsigned		period;
  82	bool			cyclic;
  83
  84	unsigned		sglen;
  85	struct sa11x0_dma_sg	sg[0];
  86};
  87
  88struct sa11x0_dma_phy;
  89
  90struct sa11x0_dma_chan {
  91	struct virt_dma_chan	vc;
  92
  93	/* protected by c->vc.lock */
  94	struct sa11x0_dma_phy	*phy;
  95	enum dma_status		status;
  96
  97	/* protected by d->lock */
  98	struct list_head	node;
  99
 100	u32			ddar;
 101	const char		*name;
 102};
 103
 104struct sa11x0_dma_phy {
 105	void __iomem		*base;
 106	struct sa11x0_dma_dev	*dev;
 107	unsigned		num;
 108
 109	struct sa11x0_dma_chan	*vchan;
 110
 111	/* Protected by c->vc.lock */
 112	unsigned		sg_load;
 113	struct sa11x0_dma_desc	*txd_load;
 114	unsigned		sg_done;
 115	struct sa11x0_dma_desc	*txd_done;
 116	u32			dbs[2];
 117	u32			dbt[2];
 118	u32			dcsr;
 119};
 120
 121struct sa11x0_dma_dev {
 122	struct dma_device	slave;
 123	void __iomem		*base;
 124	spinlock_t		lock;
 125	struct tasklet_struct	task;
 126	struct list_head	chan_pending;
 127	struct sa11x0_dma_phy	phy[NR_PHY_CHAN];
 128};
 129
 130static struct sa11x0_dma_chan *to_sa11x0_dma_chan(struct dma_chan *chan)
 131{
 132	return container_of(chan, struct sa11x0_dma_chan, vc.chan);
 133}
 134
 135static struct sa11x0_dma_dev *to_sa11x0_dma(struct dma_device *dmadev)
 136{
 137	return container_of(dmadev, struct sa11x0_dma_dev, slave);
 138}
 139
 140static struct sa11x0_dma_desc *sa11x0_dma_next_desc(struct sa11x0_dma_chan *c)
 141{
 142	struct virt_dma_desc *vd = vchan_next_desc(&c->vc);
 143
 144	return vd ? container_of(vd, struct sa11x0_dma_desc, vd) : NULL;
 145}
 146
 147static void sa11x0_dma_free_desc(struct virt_dma_desc *vd)
 148{
 149	kfree(container_of(vd, struct sa11x0_dma_desc, vd));
 150}
 151
 152static void sa11x0_dma_start_desc(struct sa11x0_dma_phy *p, struct sa11x0_dma_desc *txd)
 153{
 154	list_del(&txd->vd.node);
 155	p->txd_load = txd;
 156	p->sg_load = 0;
 157
 158	dev_vdbg(p->dev->slave.dev, "pchan %u: txd %p[%x]: starting: DDAR:%x\n",
 159		p->num, &txd->vd, txd->vd.tx.cookie, txd->ddar);
 160}
 161
 162static void noinline sa11x0_dma_start_sg(struct sa11x0_dma_phy *p,
 163	struct sa11x0_dma_chan *c)
 164{
 165	struct sa11x0_dma_desc *txd = p->txd_load;
 166	struct sa11x0_dma_sg *sg;
 167	void __iomem *base = p->base;
 168	unsigned dbsx, dbtx;
 169	u32 dcsr;
 170
 171	if (!txd)
 172		return;
 173
 174	dcsr = readl_relaxed(base + DMA_DCSR_R);
 175
 176	/* Don't try to load the next transfer if both buffers are started */
 177	if ((dcsr & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB))
 178		return;
 179
 180	if (p->sg_load == txd->sglen) {
 181		if (!txd->cyclic) {
 182			struct sa11x0_dma_desc *txn = sa11x0_dma_next_desc(c);
 183
 184			/*
 185			 * We have reached the end of the current descriptor.
 186			 * Peek at the next descriptor, and if compatible with
 187			 * the current, start processing it.
 188			 */
 189			if (txn && txn->ddar == txd->ddar) {
 190				txd = txn;
 191				sa11x0_dma_start_desc(p, txn);
 192			} else {
 193				p->txd_load = NULL;
 194				return;
 195			}
 196		} else {
 197			/* Cyclic: reset back to beginning */
 198			p->sg_load = 0;
 199		}
 200	}
 201
 202	sg = &txd->sg[p->sg_load++];
 203
 204	/* Select buffer to load according to channel status */
 205	if (((dcsr & (DCSR_BIU | DCSR_STRTB)) == (DCSR_BIU | DCSR_STRTB)) ||
 206	    ((dcsr & (DCSR_BIU | DCSR_STRTA)) == 0)) {
 207		dbsx = DMA_DBSA;
 208		dbtx = DMA_DBTA;
 209		dcsr = DCSR_STRTA | DCSR_IE | DCSR_RUN;
 210	} else {
 211		dbsx = DMA_DBSB;
 212		dbtx = DMA_DBTB;
 213		dcsr = DCSR_STRTB | DCSR_IE | DCSR_RUN;
 214	}
 215
 216	writel_relaxed(sg->addr, base + dbsx);
 217	writel_relaxed(sg->len, base + dbtx);
 218	writel(dcsr, base + DMA_DCSR_S);
 219
 220	dev_dbg(p->dev->slave.dev, "pchan %u: load: DCSR:%02x DBS%c:%08x DBT%c:%08x\n",
 221		p->num, dcsr,
 222		'A' + (dbsx == DMA_DBSB), sg->addr,
 223		'A' + (dbtx == DMA_DBTB), sg->len);
 224}
 225
 226static void noinline sa11x0_dma_complete(struct sa11x0_dma_phy *p,
 227	struct sa11x0_dma_chan *c)
 228{
 229	struct sa11x0_dma_desc *txd = p->txd_done;
 230
 231	if (++p->sg_done == txd->sglen) {
 232		if (!txd->cyclic) {
 233			vchan_cookie_complete(&txd->vd);
 234
 235			p->sg_done = 0;
 236			p->txd_done = p->txd_load;
 237
 238			if (!p->txd_done)
 239				tasklet_schedule(&p->dev->task);
 240		} else {
 241			if ((p->sg_done % txd->period) == 0)
 242				vchan_cyclic_callback(&txd->vd);
 243
 244			/* Cyclic: reset back to beginning */
 245			p->sg_done = 0;
 246		}
 247	}
 248
 249	sa11x0_dma_start_sg(p, c);
 250}
 251
 252static irqreturn_t sa11x0_dma_irq(int irq, void *dev_id)
 253{
 254	struct sa11x0_dma_phy *p = dev_id;
 255	struct sa11x0_dma_dev *d = p->dev;
 256	struct sa11x0_dma_chan *c;
 257	u32 dcsr;
 258
 259	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
 260	if (!(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB)))
 261		return IRQ_NONE;
 262
 263	/* Clear reported status bits */
 264	writel_relaxed(dcsr & (DCSR_ERROR | DCSR_DONEA | DCSR_DONEB),
 265		p->base + DMA_DCSR_C);
 266
 267	dev_dbg(d->slave.dev, "pchan %u: irq: DCSR:%02x\n", p->num, dcsr);
 268
 269	if (dcsr & DCSR_ERROR) {
 270		dev_err(d->slave.dev, "pchan %u: error. DCSR:%02x DDAR:%08x DBSA:%08x DBTA:%08x DBSB:%08x DBTB:%08x\n",
 271			p->num, dcsr,
 272			readl_relaxed(p->base + DMA_DDAR),
 273			readl_relaxed(p->base + DMA_DBSA),
 274			readl_relaxed(p->base + DMA_DBTA),
 275			readl_relaxed(p->base + DMA_DBSB),
 276			readl_relaxed(p->base + DMA_DBTB));
 277	}
 278
 279	c = p->vchan;
 280	if (c) {
 281		unsigned long flags;
 282
 283		spin_lock_irqsave(&c->vc.lock, flags);
 284		/*
 285		 * Now that we're holding the lock, check that the vchan
 286		 * really is associated with this pchan before touching the
 287		 * hardware.  This should always succeed, because we won't
 288		 * change p->vchan or c->phy while the channel is actively
 289		 * transferring.
 290		 */
 291		if (c->phy == p) {
 292			if (dcsr & DCSR_DONEA)
 293				sa11x0_dma_complete(p, c);
 294			if (dcsr & DCSR_DONEB)
 295				sa11x0_dma_complete(p, c);
 296		}
 297		spin_unlock_irqrestore(&c->vc.lock, flags);
 298	}
 299
 300	return IRQ_HANDLED;
 301}
 302
 303static void sa11x0_dma_start_txd(struct sa11x0_dma_chan *c)
 304{
 305	struct sa11x0_dma_desc *txd = sa11x0_dma_next_desc(c);
 306
 307	/* If the issued list is empty, we have no further txds to process */
 308	if (txd) {
 309		struct sa11x0_dma_phy *p = c->phy;
 310
 311		sa11x0_dma_start_desc(p, txd);
 312		p->txd_done = txd;
 313		p->sg_done = 0;
 314
 315		/* The channel should not have any transfers started */
 316		WARN_ON(readl_relaxed(p->base + DMA_DCSR_R) &
 317				      (DCSR_STRTA | DCSR_STRTB));
 318
 319		/* Clear the run and start bits before changing DDAR */
 320		writel_relaxed(DCSR_RUN | DCSR_STRTA | DCSR_STRTB,
 321			       p->base + DMA_DCSR_C);
 322		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
 323
 324		/* Try to start both buffers */
 325		sa11x0_dma_start_sg(p, c);
 326		sa11x0_dma_start_sg(p, c);
 327	}
 328}
 329
 330static void sa11x0_dma_tasklet(unsigned long arg)
 331{
 332	struct sa11x0_dma_dev *d = (struct sa11x0_dma_dev *)arg;
 333	struct sa11x0_dma_phy *p;
 334	struct sa11x0_dma_chan *c;
 335	unsigned pch, pch_alloc = 0;
 336
 337	dev_dbg(d->slave.dev, "tasklet enter\n");
 338
 339	list_for_each_entry(c, &d->slave.channels, vc.chan.device_node) {
 340		spin_lock_irq(&c->vc.lock);
 341		p = c->phy;
 342		if (p && !p->txd_done) {
 343			sa11x0_dma_start_txd(c);
 344			if (!p->txd_done) {
 345				/* No current txd associated with this channel */
 346				dev_dbg(d->slave.dev, "pchan %u: free\n", p->num);
 347
 348				/* Mark this channel free */
 349				c->phy = NULL;
 350				p->vchan = NULL;
 351			}
 352		}
 353		spin_unlock_irq(&c->vc.lock);
 354	}
 355
 356	spin_lock_irq(&d->lock);
 357	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
 358		p = &d->phy[pch];
 359
 360		if (p->vchan == NULL && !list_empty(&d->chan_pending)) {
 361			c = list_first_entry(&d->chan_pending,
 362				struct sa11x0_dma_chan, node);
 363			list_del_init(&c->node);
 364
 365			pch_alloc |= 1 << pch;
 366
 367			/* Mark this channel allocated */
 368			p->vchan = c;
 369
 370			dev_dbg(d->slave.dev, "pchan %u: alloc vchan %p\n", pch, &c->vc);
 371		}
 372	}
 373	spin_unlock_irq(&d->lock);
 374
 375	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
 376		if (pch_alloc & (1 << pch)) {
 377			p = &d->phy[pch];
 378			c = p->vchan;
 379
 380			spin_lock_irq(&c->vc.lock);
 381			c->phy = p;
 382
 383			sa11x0_dma_start_txd(c);
 384			spin_unlock_irq(&c->vc.lock);
 385		}
 386	}
 387
 388	dev_dbg(d->slave.dev, "tasklet exit\n");
 389}
 390
 391
 392static void sa11x0_dma_free_chan_resources(struct dma_chan *chan)
 393{
 394	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 395	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 396	unsigned long flags;
 397
 398	spin_lock_irqsave(&d->lock, flags);
 399	list_del_init(&c->node);
 400	spin_unlock_irqrestore(&d->lock, flags);
 401
 402	vchan_free_chan_resources(&c->vc);
 403}
 404
 405static dma_addr_t sa11x0_dma_pos(struct sa11x0_dma_phy *p)
 406{
 407	unsigned reg;
 408	u32 dcsr;
 409
 410	dcsr = readl_relaxed(p->base + DMA_DCSR_R);
 411
 412	if ((dcsr & (DCSR_BIU | DCSR_STRTA)) == DCSR_STRTA ||
 413	    (dcsr & (DCSR_BIU | DCSR_STRTB)) == DCSR_BIU)
 414		reg = DMA_DBSA;
 415	else
 416		reg = DMA_DBSB;
 417
 418	return readl_relaxed(p->base + reg);
 419}
 420
 421static enum dma_status sa11x0_dma_tx_status(struct dma_chan *chan,
 422	dma_cookie_t cookie, struct dma_tx_state *state)
 423{
 424	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 425	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 426	struct sa11x0_dma_phy *p;
 427	struct virt_dma_desc *vd;
 428	unsigned long flags;
 429	enum dma_status ret;
 430
 431	ret = dma_cookie_status(&c->vc.chan, cookie, state);
 432	if (ret == DMA_COMPLETE)
 433		return ret;
 434
 435	if (!state)
 436		return c->status;
 437
 438	spin_lock_irqsave(&c->vc.lock, flags);
 439	p = c->phy;
 440
 441	/*
 442	 * If the cookie is on our issue queue, then the residue is
 443	 * its total size.
 444	 */
 445	vd = vchan_find_desc(&c->vc, cookie);
 446	if (vd) {
 447		state->residue = container_of(vd, struct sa11x0_dma_desc, vd)->size;
 448	} else if (!p) {
 449		state->residue = 0;
 450	} else {
 451		struct sa11x0_dma_desc *txd;
 452		size_t bytes = 0;
 453
 454		if (p->txd_done && p->txd_done->vd.tx.cookie == cookie)
 455			txd = p->txd_done;
 456		else if (p->txd_load && p->txd_load->vd.tx.cookie == cookie)
 457			txd = p->txd_load;
 458		else
 459			txd = NULL;
 460
 461		ret = c->status;
 462		if (txd) {
 463			dma_addr_t addr = sa11x0_dma_pos(p);
 464			unsigned i;
 465
 466			dev_vdbg(d->slave.dev, "tx_status: addr:%pad\n", &addr);
 467
 468			for (i = 0; i < txd->sglen; i++) {
 469				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x\n",
 470					i, txd->sg[i].addr, txd->sg[i].len);
 471				if (addr >= txd->sg[i].addr &&
 472				    addr < txd->sg[i].addr + txd->sg[i].len) {
 473					unsigned len;
 474
 475					len = txd->sg[i].len -
 476						(addr - txd->sg[i].addr);
 477					dev_vdbg(d->slave.dev, "tx_status: [%u] +%x\n",
 478						i, len);
 479					bytes += len;
 480					i++;
 481					break;
 482				}
 483			}
 484			for (; i < txd->sglen; i++) {
 485				dev_vdbg(d->slave.dev, "tx_status: [%u] %x+%x ++\n",
 486					i, txd->sg[i].addr, txd->sg[i].len);
 487				bytes += txd->sg[i].len;
 488			}
 489		}
 490		state->residue = bytes;
 491	}
 492	spin_unlock_irqrestore(&c->vc.lock, flags);
 493
 494	dev_vdbg(d->slave.dev, "tx_status: bytes 0x%x\n", state->residue);
 495
 496	return ret;
 497}
 498
 499/*
 500 * Move pending txds to the issued list, and re-init pending list.
 501 * If not already pending, add this channel to the list of pending
 502 * channels and trigger the tasklet to run.
 503 */
 504static void sa11x0_dma_issue_pending(struct dma_chan *chan)
 505{
 506	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 507	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 508	unsigned long flags;
 509
 510	spin_lock_irqsave(&c->vc.lock, flags);
 511	if (vchan_issue_pending(&c->vc)) {
 512		if (!c->phy) {
 513			spin_lock(&d->lock);
 514			if (list_empty(&c->node)) {
 515				list_add_tail(&c->node, &d->chan_pending);
 516				tasklet_schedule(&d->task);
 517				dev_dbg(d->slave.dev, "vchan %p: issued\n", &c->vc);
 518			}
 519			spin_unlock(&d->lock);
 520		}
 521	} else
 522		dev_dbg(d->slave.dev, "vchan %p: nothing to issue\n", &c->vc);
 523	spin_unlock_irqrestore(&c->vc.lock, flags);
 524}
 525
 526static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
 527	struct dma_chan *chan, struct scatterlist *sg, unsigned int sglen,
 528	enum dma_transfer_direction dir, unsigned long flags, void *context)
 529{
 530	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 531	struct sa11x0_dma_desc *txd;
 532	struct scatterlist *sgent;
 533	unsigned i, j = sglen;
 534	size_t size = 0;
 535
 536	/* SA11x0 channels can only operate in their native direction */
 537	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
 538		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
 539			&c->vc, c->ddar, dir);
 540		return NULL;
 541	}
 542
 543	/* Do not allow zero-sized txds */
 544	if (sglen == 0)
 545		return NULL;
 546
 547	for_each_sg(sg, sgent, sglen, i) {
 548		dma_addr_t addr = sg_dma_address(sgent);
 549		unsigned int len = sg_dma_len(sgent);
 550
 551		if (len > DMA_MAX_SIZE)
 552			j += DIV_ROUND_UP(len, DMA_MAX_SIZE & ~DMA_ALIGN) - 1;
 553		if (addr & DMA_ALIGN) {
 554			dev_dbg(chan->device->dev, "vchan %p: bad buffer alignment: %pad\n",
 555				&c->vc, &addr);
 556			return NULL;
 557		}
 558	}
 559
 560	txd = kzalloc(sizeof(*txd) + j * sizeof(txd->sg[0]), GFP_ATOMIC);
 561	if (!txd) {
 562		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
 563		return NULL;
 564	}
 565
 566	j = 0;
 567	for_each_sg(sg, sgent, sglen, i) {
 568		dma_addr_t addr = sg_dma_address(sgent);
 569		unsigned len = sg_dma_len(sgent);
 570
 571		size += len;
 572
 573		do {
 574			unsigned tlen = len;
 575
 576			/*
 577			 * Check whether the transfer will fit.  If not, try
 578			 * to split the transfer up such that we end up with
 579			 * equal chunks - but make sure that we preserve the
 580			 * alignment.  This avoids small segments.
 581			 */
 582			if (tlen > DMA_MAX_SIZE) {
 583				unsigned mult = DIV_ROUND_UP(tlen,
 584					DMA_MAX_SIZE & ~DMA_ALIGN);
 585
 586				tlen = (tlen / mult) & ~DMA_ALIGN;
 587			}
 588
 589			txd->sg[j].addr = addr;
 590			txd->sg[j].len = tlen;
 591
 592			addr += tlen;
 593			len -= tlen;
 594			j++;
 595		} while (len);
 596	}
 597
 598	txd->ddar = c->ddar;
 599	txd->size = size;
 600	txd->sglen = j;
 601
 602	dev_dbg(chan->device->dev, "vchan %p: txd %p: size %zu nr %u\n",
 603		&c->vc, &txd->vd, txd->size, txd->sglen);
 604
 605	return vchan_tx_prep(&c->vc, &txd->vd, flags);
 606}
 607
 608static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
 609	struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
 610	enum dma_transfer_direction dir, unsigned long flags)
 611{
 612	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 613	struct sa11x0_dma_desc *txd;
 614	unsigned i, j, k, sglen, sgperiod;
 615
 616	/* SA11x0 channels can only operate in their native direction */
 617	if (dir != (c->ddar & DDAR_RW ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV)) {
 618		dev_err(chan->device->dev, "vchan %p: bad DMA direction: DDAR:%08x dir:%u\n",
 619			&c->vc, c->ddar, dir);
 620		return NULL;
 621	}
 622
 623	sgperiod = DIV_ROUND_UP(period, DMA_MAX_SIZE & ~DMA_ALIGN);
 624	sglen = size * sgperiod / period;
 625
 626	/* Do not allow zero-sized txds */
 627	if (sglen == 0)
 628		return NULL;
 629
 630	txd = kzalloc(sizeof(*txd) + sglen * sizeof(txd->sg[0]), GFP_ATOMIC);
 631	if (!txd) {
 632		dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
 633		return NULL;
 634	}
 635
 636	for (i = k = 0; i < size / period; i++) {
 637		size_t tlen, len = period;
 638
 639		for (j = 0; j < sgperiod; j++, k++) {
 640			tlen = len;
 641
 642			if (tlen > DMA_MAX_SIZE) {
 643				unsigned mult = DIV_ROUND_UP(tlen, DMA_MAX_SIZE & ~DMA_ALIGN);
 644				tlen = (tlen / mult) & ~DMA_ALIGN;
 645			}
 646
 647			txd->sg[k].addr = addr;
 648			txd->sg[k].len = tlen;
 649			addr += tlen;
 650			len -= tlen;
 651		}
 652
 653		WARN_ON(len != 0);
 654	}
 655
 656	WARN_ON(k != sglen);
 657
 658	txd->ddar = c->ddar;
 659	txd->size = size;
 660	txd->sglen = sglen;
 661	txd->cyclic = 1;
 662	txd->period = sgperiod;
 663
 664	return vchan_tx_prep(&c->vc, &txd->vd, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 665}
 666
 667static int sa11x0_dma_device_config(struct dma_chan *chan,
 668				    struct dma_slave_config *cfg)
 669{
 670	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 671	u32 ddar = c->ddar & ((0xf << 4) | DDAR_RW);
 672	dma_addr_t addr;
 673	enum dma_slave_buswidth width;
 674	u32 maxburst;
 675
 676	if (ddar & DDAR_RW) {
 677		addr = cfg->src_addr;
 678		width = cfg->src_addr_width;
 679		maxburst = cfg->src_maxburst;
 680	} else {
 681		addr = cfg->dst_addr;
 682		width = cfg->dst_addr_width;
 683		maxburst = cfg->dst_maxburst;
 684	}
 685
 686	if ((width != DMA_SLAVE_BUSWIDTH_1_BYTE &&
 687	     width != DMA_SLAVE_BUSWIDTH_2_BYTES) ||
 688	    (maxburst != 4 && maxburst != 8))
 689		return -EINVAL;
 690
 691	if (width == DMA_SLAVE_BUSWIDTH_2_BYTES)
 692		ddar |= DDAR_DW;
 693	if (maxburst == 8)
 694		ddar |= DDAR_BS;
 695
 696	dev_dbg(c->vc.chan.device->dev, "vchan %p: dma_slave_config addr %pad width %u burst %u\n",
 697		&c->vc, &addr, width, maxburst);
 698
 699	c->ddar = ddar | (addr & 0xf0000000) | (addr & 0x003ffffc) << 6;
 700
 701	return 0;
 702}
 703
 704static int sa11x0_dma_device_pause(struct dma_chan *chan)
 705{
 706	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 707	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 708	struct sa11x0_dma_phy *p;
 709	LIST_HEAD(head);
 710	unsigned long flags;
 711
 712	dev_dbg(d->slave.dev, "vchan %p: pause\n", &c->vc);
 713	spin_lock_irqsave(&c->vc.lock, flags);
 714	if (c->status == DMA_IN_PROGRESS) {
 715		c->status = DMA_PAUSED;
 716
 717		p = c->phy;
 718		if (p) {
 719			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
 720		} else {
 721			spin_lock(&d->lock);
 722			list_del_init(&c->node);
 723			spin_unlock(&d->lock);
 724		}
 725	}
 726	spin_unlock_irqrestore(&c->vc.lock, flags);
 727
 728	return 0;
 729}
 730
 731static int sa11x0_dma_device_resume(struct dma_chan *chan)
 732{
 733	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 734	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 735	struct sa11x0_dma_phy *p;
 736	LIST_HEAD(head);
 737	unsigned long flags;
 738
 739	dev_dbg(d->slave.dev, "vchan %p: resume\n", &c->vc);
 740	spin_lock_irqsave(&c->vc.lock, flags);
 741	if (c->status == DMA_PAUSED) {
 742		c->status = DMA_IN_PROGRESS;
 743
 744		p = c->phy;
 745		if (p) {
 746			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_S);
 747		} else if (!list_empty(&c->vc.desc_issued)) {
 748			spin_lock(&d->lock);
 749			list_add_tail(&c->node, &d->chan_pending);
 750			spin_unlock(&d->lock);
 751		}
 752	}
 753	spin_unlock_irqrestore(&c->vc.lock, flags);
 754
 755	return 0;
 756}
 757
 758static int sa11x0_dma_device_terminate_all(struct dma_chan *chan)
 759{
 760	struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
 761	struct sa11x0_dma_dev *d = to_sa11x0_dma(chan->device);
 762	struct sa11x0_dma_phy *p;
 763	LIST_HEAD(head);
 764	unsigned long flags;
 765
 766	dev_dbg(d->slave.dev, "vchan %p: terminate all\n", &c->vc);
 767	/* Clear the tx descriptor lists */
 768	spin_lock_irqsave(&c->vc.lock, flags);
 769	vchan_get_all_descriptors(&c->vc, &head);
 770
 771	p = c->phy;
 772	if (p) {
 773		dev_dbg(d->slave.dev, "pchan %u: terminating\n", p->num);
 774		/* vchan is assigned to a pchan - stop the channel */
 775		writel(DCSR_RUN | DCSR_IE |
 776		       DCSR_STRTA | DCSR_DONEA |
 777		       DCSR_STRTB | DCSR_DONEB,
 778		       p->base + DMA_DCSR_C);
 779
 780		if (p->txd_load) {
 781			if (p->txd_load != p->txd_done)
 782				list_add_tail(&p->txd_load->vd.node, &head);
 783			p->txd_load = NULL;
 784		}
 785		if (p->txd_done) {
 786			list_add_tail(&p->txd_done->vd.node, &head);
 787			p->txd_done = NULL;
 788		}
 789		c->phy = NULL;
 790		spin_lock(&d->lock);
 791		p->vchan = NULL;
 792		spin_unlock(&d->lock);
 793		tasklet_schedule(&d->task);
 794	}
 795	spin_unlock_irqrestore(&c->vc.lock, flags);
 796	vchan_dma_desc_free_list(&c->vc, &head);
 797
 798	return 0;
 799}
 800
 801struct sa11x0_dma_channel_desc {
 802	u32 ddar;
 803	const char *name;
 804};
 805
 806#define CD(d1, d2) { .ddar = DDAR_##d1 | d2, .name = #d1 }
 807static const struct sa11x0_dma_channel_desc chan_desc[] = {
 808	CD(Ser0UDCTr, 0),
 809	CD(Ser0UDCRc, DDAR_RW),
 810	CD(Ser1SDLCTr, 0),
 811	CD(Ser1SDLCRc, DDAR_RW),
 812	CD(Ser1UARTTr, 0),
 813	CD(Ser1UARTRc, DDAR_RW),
 814	CD(Ser2ICPTr, 0),
 815	CD(Ser2ICPRc, DDAR_RW),
 816	CD(Ser3UARTTr, 0),
 817	CD(Ser3UARTRc, DDAR_RW),
 818	CD(Ser4MCP0Tr, 0),
 819	CD(Ser4MCP0Rc, DDAR_RW),
 820	CD(Ser4MCP1Tr, 0),
 821	CD(Ser4MCP1Rc, DDAR_RW),
 822	CD(Ser4SSPTr, 0),
 823	CD(Ser4SSPRc, DDAR_RW),
 824};
 825
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 826static int sa11x0_dma_init_dmadev(struct dma_device *dmadev,
 827	struct device *dev)
 828{
 829	unsigned i;
 830
 831	INIT_LIST_HEAD(&dmadev->channels);
 832	dmadev->dev = dev;
 833	dmadev->device_free_chan_resources = sa11x0_dma_free_chan_resources;
 834	dmadev->device_config = sa11x0_dma_device_config;
 835	dmadev->device_pause = sa11x0_dma_device_pause;
 836	dmadev->device_resume = sa11x0_dma_device_resume;
 837	dmadev->device_terminate_all = sa11x0_dma_device_terminate_all;
 838	dmadev->device_tx_status = sa11x0_dma_tx_status;
 839	dmadev->device_issue_pending = sa11x0_dma_issue_pending;
 840
 841	for (i = 0; i < ARRAY_SIZE(chan_desc); i++) {
 842		struct sa11x0_dma_chan *c;
 843
 844		c = kzalloc(sizeof(*c), GFP_KERNEL);
 845		if (!c) {
 846			dev_err(dev, "no memory for channel %u\n", i);
 847			return -ENOMEM;
 848		}
 849
 850		c->status = DMA_IN_PROGRESS;
 851		c->ddar = chan_desc[i].ddar;
 852		c->name = chan_desc[i].name;
 853		INIT_LIST_HEAD(&c->node);
 854
 855		c->vc.desc_free = sa11x0_dma_free_desc;
 856		vchan_init(&c->vc, dmadev);
 857	}
 858
 859	return dma_async_device_register(dmadev);
 860}
 861
 862static int sa11x0_dma_request_irq(struct platform_device *pdev, int nr,
 863	void *data)
 864{
 865	int irq = platform_get_irq(pdev, nr);
 866
 867	if (irq <= 0)
 868		return -ENXIO;
 869
 870	return request_irq(irq, sa11x0_dma_irq, 0, dev_name(&pdev->dev), data);
 871}
 872
 873static void sa11x0_dma_free_irq(struct platform_device *pdev, int nr,
 874	void *data)
 875{
 876	int irq = platform_get_irq(pdev, nr);
 877	if (irq > 0)
 878		free_irq(irq, data);
 879}
 880
 881static void sa11x0_dma_free_channels(struct dma_device *dmadev)
 882{
 883	struct sa11x0_dma_chan *c, *cn;
 884
 885	list_for_each_entry_safe(c, cn, &dmadev->channels, vc.chan.device_node) {
 886		list_del(&c->vc.chan.device_node);
 887		tasklet_kill(&c->vc.task);
 888		kfree(c);
 889	}
 890}
 891
 892static int sa11x0_dma_probe(struct platform_device *pdev)
 893{
 894	struct sa11x0_dma_dev *d;
 895	struct resource *res;
 896	unsigned i;
 897	int ret;
 898
 899	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 900	if (!res)
 901		return -ENXIO;
 902
 903	d = kzalloc(sizeof(*d), GFP_KERNEL);
 904	if (!d) {
 905		ret = -ENOMEM;
 906		goto err_alloc;
 907	}
 908
 909	spin_lock_init(&d->lock);
 910	INIT_LIST_HEAD(&d->chan_pending);
 911
 
 
 
 
 912	d->base = ioremap(res->start, resource_size(res));
 913	if (!d->base) {
 914		ret = -ENOMEM;
 915		goto err_ioremap;
 916	}
 917
 918	tasklet_init(&d->task, sa11x0_dma_tasklet, (unsigned long)d);
 919
 920	for (i = 0; i < NR_PHY_CHAN; i++) {
 921		struct sa11x0_dma_phy *p = &d->phy[i];
 922
 923		p->dev = d;
 924		p->num = i;
 925		p->base = d->base + i * DMA_SIZE;
 926		writel_relaxed(DCSR_RUN | DCSR_IE | DCSR_ERROR |
 927			DCSR_DONEA | DCSR_STRTA | DCSR_DONEB | DCSR_STRTB,
 928			p->base + DMA_DCSR_C);
 929		writel_relaxed(0, p->base + DMA_DDAR);
 930
 931		ret = sa11x0_dma_request_irq(pdev, i, p);
 932		if (ret) {
 933			while (i) {
 934				i--;
 935				sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
 936			}
 937			goto err_irq;
 938		}
 939	}
 940
 941	dma_cap_set(DMA_SLAVE, d->slave.cap_mask);
 942	dma_cap_set(DMA_CYCLIC, d->slave.cap_mask);
 943	d->slave.device_prep_slave_sg = sa11x0_dma_prep_slave_sg;
 944	d->slave.device_prep_dma_cyclic = sa11x0_dma_prep_dma_cyclic;
 945	d->slave.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
 946	d->slave.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;
 947	d->slave.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
 948				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
 949	d->slave.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) |
 950				   BIT(DMA_SLAVE_BUSWIDTH_2_BYTES);
 951	ret = sa11x0_dma_init_dmadev(&d->slave, &pdev->dev);
 952	if (ret) {
 953		dev_warn(d->slave.dev, "failed to register slave async device: %d\n",
 954			ret);
 955		goto err_slave_reg;
 956	}
 957
 958	platform_set_drvdata(pdev, d);
 959	return 0;
 960
 961 err_slave_reg:
 962	sa11x0_dma_free_channels(&d->slave);
 963	for (i = 0; i < NR_PHY_CHAN; i++)
 964		sa11x0_dma_free_irq(pdev, i, &d->phy[i]);
 965 err_irq:
 966	tasklet_kill(&d->task);
 967	iounmap(d->base);
 968 err_ioremap:
 969	kfree(d);
 970 err_alloc:
 971	return ret;
 972}
 973
 974static int sa11x0_dma_remove(struct platform_device *pdev)
 975{
 976	struct sa11x0_dma_dev *d = platform_get_drvdata(pdev);
 977	unsigned pch;
 978
 979	dma_async_device_unregister(&d->slave);
 980
 981	sa11x0_dma_free_channels(&d->slave);
 982	for (pch = 0; pch < NR_PHY_CHAN; pch++)
 983		sa11x0_dma_free_irq(pdev, pch, &d->phy[pch]);
 984	tasklet_kill(&d->task);
 985	iounmap(d->base);
 986	kfree(d);
 987
 988	return 0;
 989}
 990
 991static int sa11x0_dma_suspend(struct device *dev)
 992{
 993	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
 994	unsigned pch;
 995
 996	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
 997		struct sa11x0_dma_phy *p = &d->phy[pch];
 998		u32 dcsr, saved_dcsr;
 999
1000		dcsr = saved_dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1001		if (dcsr & DCSR_RUN) {
1002			writel(DCSR_RUN | DCSR_IE, p->base + DMA_DCSR_C);
1003			dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1004		}
1005
1006		saved_dcsr &= DCSR_RUN | DCSR_IE;
1007		if (dcsr & DCSR_BIU) {
1008			p->dbs[0] = readl_relaxed(p->base + DMA_DBSB);
1009			p->dbt[0] = readl_relaxed(p->base + DMA_DBTB);
1010			p->dbs[1] = readl_relaxed(p->base + DMA_DBSA);
1011			p->dbt[1] = readl_relaxed(p->base + DMA_DBTA);
1012			saved_dcsr |= (dcsr & DCSR_STRTA ? DCSR_STRTB : 0) |
1013				      (dcsr & DCSR_STRTB ? DCSR_STRTA : 0);
1014		} else {
1015			p->dbs[0] = readl_relaxed(p->base + DMA_DBSA);
1016			p->dbt[0] = readl_relaxed(p->base + DMA_DBTA);
1017			p->dbs[1] = readl_relaxed(p->base + DMA_DBSB);
1018			p->dbt[1] = readl_relaxed(p->base + DMA_DBTB);
1019			saved_dcsr |= dcsr & (DCSR_STRTA | DCSR_STRTB);
1020		}
1021		p->dcsr = saved_dcsr;
1022
1023		writel(DCSR_STRTA | DCSR_STRTB, p->base + DMA_DCSR_C);
1024	}
1025
1026	return 0;
1027}
1028
1029static int sa11x0_dma_resume(struct device *dev)
1030{
1031	struct sa11x0_dma_dev *d = dev_get_drvdata(dev);
1032	unsigned pch;
1033
1034	for (pch = 0; pch < NR_PHY_CHAN; pch++) {
1035		struct sa11x0_dma_phy *p = &d->phy[pch];
1036		struct sa11x0_dma_desc *txd = NULL;
1037		u32 dcsr = readl_relaxed(p->base + DMA_DCSR_R);
1038
1039		WARN_ON(dcsr & (DCSR_BIU | DCSR_STRTA | DCSR_STRTB | DCSR_RUN));
1040
1041		if (p->txd_done)
1042			txd = p->txd_done;
1043		else if (p->txd_load)
1044			txd = p->txd_load;
1045
1046		if (!txd)
1047			continue;
1048
1049		writel_relaxed(txd->ddar, p->base + DMA_DDAR);
1050
1051		writel_relaxed(p->dbs[0], p->base + DMA_DBSA);
1052		writel_relaxed(p->dbt[0], p->base + DMA_DBTA);
1053		writel_relaxed(p->dbs[1], p->base + DMA_DBSB);
1054		writel_relaxed(p->dbt[1], p->base + DMA_DBTB);
1055		writel_relaxed(p->dcsr, p->base + DMA_DCSR_S);
1056	}
1057
1058	return 0;
1059}
1060
1061static const struct dev_pm_ops sa11x0_dma_pm_ops = {
1062	.suspend_noirq = sa11x0_dma_suspend,
1063	.resume_noirq = sa11x0_dma_resume,
1064	.freeze_noirq = sa11x0_dma_suspend,
1065	.thaw_noirq = sa11x0_dma_resume,
1066	.poweroff_noirq = sa11x0_dma_suspend,
1067	.restore_noirq = sa11x0_dma_resume,
1068};
1069
1070static struct platform_driver sa11x0_dma_driver = {
1071	.driver = {
1072		.name	= "sa11x0-dma",
1073		.pm	= &sa11x0_dma_pm_ops,
1074	},
1075	.probe		= sa11x0_dma_probe,
1076	.remove		= sa11x0_dma_remove,
1077};
1078
1079bool sa11x0_dma_filter_fn(struct dma_chan *chan, void *param)
1080{
1081	if (chan->device->dev->driver == &sa11x0_dma_driver.driver) {
1082		struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
1083		const char *p = param;
1084
1085		return !strcmp(c->name, p);
1086	}
1087	return false;
1088}
1089EXPORT_SYMBOL(sa11x0_dma_filter_fn);
1090
1091static int __init sa11x0_dma_init(void)
1092{
1093	return platform_driver_register(&sa11x0_dma_driver);
1094}
1095subsys_initcall(sa11x0_dma_init);
1096
1097static void __exit sa11x0_dma_exit(void)
1098{
1099	platform_driver_unregister(&sa11x0_dma_driver);
1100}
1101module_exit(sa11x0_dma_exit);
1102
1103MODULE_AUTHOR("Russell King");
1104MODULE_DESCRIPTION("SA-11x0 DMA driver");
1105MODULE_LICENSE("GPL v2");
1106MODULE_ALIAS("platform:sa11x0-dma");