1/*
2 * Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
3 *
4 * Refer to drivers/dma/imx-sdma.c
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/init.h>
12#include <linux/types.h>
13#include <linux/mm.h>
14#include <linux/interrupt.h>
15#include <linux/clk.h>
16#include <linux/wait.h>
17#include <linux/sched.h>
18#include <linux/semaphore.h>
19#include <linux/device.h>
20#include <linux/dma-mapping.h>
21#include <linux/slab.h>
22#include <linux/platform_device.h>
23#include <linux/dmaengine.h>
24#include <linux/delay.h>
25
26#include <asm/irq.h>
27#include <mach/mxs.h>
28#include <mach/dma.h>
29#include <mach/common.h>
30
31/*
32 * NOTE: The term "PIO" throughout the mxs-dma implementation means
33 * PIO mode of mxs apbh-dma and apbx-dma.  With this working mode,
34 * dma can program the controller registers of peripheral devices.
35 */
36
37#define MXS_DMA_APBH		0
38#define MXS_DMA_APBX		1
39#define dma_is_apbh()		(mxs_dma->dev_id == MXS_DMA_APBH)
40
41#define APBH_VERSION_LATEST	3
42#define apbh_is_old()		(mxs_dma->version < APBH_VERSION_LATEST)
43
44#define HW_APBHX_CTRL0				0x000
45#define BM_APBH_CTRL0_APB_BURST8_EN		(1 << 29)
46#define BM_APBH_CTRL0_APB_BURST_EN		(1 << 28)
47#define BP_APBH_CTRL0_RESET_CHANNEL		16
48#define HW_APBHX_CTRL1				0x010
49#define HW_APBHX_CTRL2				0x020
50#define HW_APBHX_CHANNEL_CTRL			0x030
51#define BP_APBHX_CHANNEL_CTRL_RESET_CHANNEL	16
52#define HW_APBH_VERSION				(cpu_is_mx23() ? 0x3f0 : 0x800)
53#define HW_APBX_VERSION				0x800
54#define BP_APBHX_VERSION_MAJOR			24
55#define HW_APBHX_CHn_NXTCMDAR(n) \
56	(((dma_is_apbh() && apbh_is_old()) ? 0x050 : 0x110) + (n) * 0x70)
57#define HW_APBHX_CHn_SEMA(n) \
58	(((dma_is_apbh() && apbh_is_old()) ? 0x080 : 0x140) + (n) * 0x70)
59
60/*
61 * ccw bits definitions
62 *
63 * COMMAND:		0..1	(2)
64 * CHAIN:		2	(1)
65 * IRQ:			3	(1)
66 * NAND_LOCK:		4	(1) - not implemented
67 * NAND_WAIT4READY:	5	(1) - not implemented
68 * DEC_SEM:		6	(1)
69 * WAIT4END:		7	(1)
70 * HALT_ON_TERMINATE:	8	(1)
71 * TERMINATE_FLUSH:	9	(1)
72 * RESERVED:		10..11	(2)
73 * PIO_NUM:		12..15	(4)
74 */
75#define BP_CCW_COMMAND		0
76#define BM_CCW_COMMAND		(3 << 0)
77#define CCW_CHAIN		(1 << 2)
78#define CCW_IRQ			(1 << 3)
79#define CCW_DEC_SEM		(1 << 6)
80#define CCW_WAIT4END		(1 << 7)
81#define CCW_HALT_ON_TERM	(1 << 8)
82#define CCW_TERM_FLUSH		(1 << 9)
83#define BP_CCW_PIO_NUM		12
84#define BM_CCW_PIO_NUM		(0xf << 12)
85
86#define BF_CCW(value, field)	(((value) << BP_CCW_##field) & BM_CCW_##field)
87
88#define MXS_DMA_CMD_NO_XFER	0
89#define MXS_DMA_CMD_WRITE	1
90#define MXS_DMA_CMD_READ	2
91#define MXS_DMA_CMD_DMA_SENSE	3	/* not implemented */
92
93struct mxs_dma_ccw {
94	u32		next;
95	u16		bits;
96	u16		xfer_bytes;
97#define MAX_XFER_BYTES	0xff00
98	u32		bufaddr;
99#define MXS_PIO_WORDS	16
100	u32		pio_words[MXS_PIO_WORDS];
101};
102
103#define NUM_CCW	(int)(PAGE_SIZE / sizeof(struct mxs_dma_ccw))
104
105struct mxs_dma_chan {
106	struct mxs_dma_engine		*mxs_dma;
107	struct dma_chan			chan;
108	struct dma_async_tx_descriptor	desc;
109	struct tasklet_struct		tasklet;
110	int				chan_irq;
111	struct mxs_dma_ccw		*ccw;
112	dma_addr_t			ccw_phys;
113	int				desc_count;
114	dma_cookie_t			last_completed;
115	enum dma_status			status;
116	unsigned int			flags;
117#define MXS_DMA_SG_LOOP			(1 << 0)
118};
119
120#define MXS_DMA_CHANNELS		16
121#define MXS_DMA_CHANNELS_MASK		0xffff
122
123struct mxs_dma_engine {
124	int				dev_id;
125	unsigned int			version;
126	void __iomem			*base;
127	struct clk			*clk;
128	struct dma_device		dma_device;
129	struct device_dma_parameters	dma_parms;
130	struct mxs_dma_chan		mxs_chans[MXS_DMA_CHANNELS];
131};
132
133static void mxs_dma_reset_chan(struct mxs_dma_chan *mxs_chan)
134{
135	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
136	int chan_id = mxs_chan->chan.chan_id;
137
138	if (dma_is_apbh() && apbh_is_old())
139		writel(1 << (chan_id + BP_APBH_CTRL0_RESET_CHANNEL),
140			mxs_dma->base + HW_APBHX_CTRL0 + MXS_SET_ADDR);
141	else
142		writel(1 << (chan_id + BP_APBHX_CHANNEL_CTRL_RESET_CHANNEL),
143			mxs_dma->base + HW_APBHX_CHANNEL_CTRL + MXS_SET_ADDR);
144}
145
146static void mxs_dma_enable_chan(struct mxs_dma_chan *mxs_chan)
147{
148	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
149	int chan_id = mxs_chan->chan.chan_id;
150
151	/* set cmd_addr up */
152	writel(mxs_chan->ccw_phys,
153		mxs_dma->base + HW_APBHX_CHn_NXTCMDAR(chan_id));
154
155	/* write 1 to SEMA to kick off the channel */
156	writel(1, mxs_dma->base + HW_APBHX_CHn_SEMA(chan_id));
157}
158
159static void mxs_dma_disable_chan(struct mxs_dma_chan *mxs_chan)
160{
161	mxs_chan->status = DMA_SUCCESS;
162}
163
164static void mxs_dma_pause_chan(struct mxs_dma_chan *mxs_chan)
165{
166	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
167	int chan_id = mxs_chan->chan.chan_id;
168
169	/* freeze the channel */
170	if (dma_is_apbh() && apbh_is_old())
171		writel(1 << chan_id,
172			mxs_dma->base + HW_APBHX_CTRL0 + MXS_SET_ADDR);
173	else
174		writel(1 << chan_id,
175			mxs_dma->base + HW_APBHX_CHANNEL_CTRL + MXS_SET_ADDR);
176
177	mxs_chan->status = DMA_PAUSED;
178}
179
180static void mxs_dma_resume_chan(struct mxs_dma_chan *mxs_chan)
181{
182	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
183	int chan_id = mxs_chan->chan.chan_id;
184
185	/* unfreeze the channel */
186	if (dma_is_apbh() && apbh_is_old())
187		writel(1 << chan_id,
188			mxs_dma->base + HW_APBHX_CTRL0 + MXS_CLR_ADDR);
189	else
190		writel(1 << chan_id,
191			mxs_dma->base + HW_APBHX_CHANNEL_CTRL + MXS_CLR_ADDR);
192
193	mxs_chan->status = DMA_IN_PROGRESS;
194}
195
196static dma_cookie_t mxs_dma_assign_cookie(struct mxs_dma_chan *mxs_chan)
197{
198	dma_cookie_t cookie = mxs_chan->chan.cookie;
199
200	if (++cookie < 0)
201		cookie = 1;
202
203	mxs_chan->chan.cookie = cookie;
204	mxs_chan->desc.cookie = cookie;
205
206	return cookie;
207}
208
209static struct mxs_dma_chan *to_mxs_dma_chan(struct dma_chan *chan)
210{
211	return container_of(chan, struct mxs_dma_chan, chan);
212}
213
214static dma_cookie_t mxs_dma_tx_submit(struct dma_async_tx_descriptor *tx)
215{
216	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(tx->chan);
217
218	mxs_dma_enable_chan(mxs_chan);
219
220	return mxs_dma_assign_cookie(mxs_chan);
221}
222
223static void mxs_dma_tasklet(unsigned long data)
224{
225	struct mxs_dma_chan *mxs_chan = (struct mxs_dma_chan *) data;
226
227	if (mxs_chan->desc.callback)
228		mxs_chan->desc.callback(mxs_chan->desc.callback_param);
229}
230
231static irqreturn_t mxs_dma_int_handler(int irq, void *dev_id)
232{
233	struct mxs_dma_engine *mxs_dma = dev_id;
234	u32 stat1, stat2;
235
236	/* completion status */
237	stat1 = readl(mxs_dma->base + HW_APBHX_CTRL1);
238	stat1 &= MXS_DMA_CHANNELS_MASK;
239	writel(stat1, mxs_dma->base + HW_APBHX_CTRL1 + MXS_CLR_ADDR);
240
241	/* error status */
242	stat2 = readl(mxs_dma->base + HW_APBHX_CTRL2);
243	writel(stat2, mxs_dma->base + HW_APBHX_CTRL2 + MXS_CLR_ADDR);
244
245	/*
246	 * When both completion and error of termination bits set at the
247	 * same time, we do not take it as an error.  IOW, it only becomes
248	 * an error we need to handle here in case of either it's (1) a bus
249	 * error or (2) a termination error with no completion.
250	 */
251	stat2 = ((stat2 >> MXS_DMA_CHANNELS) & stat2) | /* (1) */
252		(~(stat2 >> MXS_DMA_CHANNELS) & stat2 & ~stat1); /* (2) */
253
254	/* combine error and completion status for checking */
255	stat1 = (stat2 << MXS_DMA_CHANNELS) | stat1;
256	while (stat1) {
257		int channel = fls(stat1) - 1;
258		struct mxs_dma_chan *mxs_chan =
259			&mxs_dma->mxs_chans[channel % MXS_DMA_CHANNELS];
260
261		if (channel >= MXS_DMA_CHANNELS) {
262			dev_dbg(mxs_dma->dma_device.dev,
263				"%s: error in channel %d\n", __func__,
264				channel - MXS_DMA_CHANNELS);
265			mxs_chan->status = DMA_ERROR;
266			mxs_dma_reset_chan(mxs_chan);
267		} else {
268			if (mxs_chan->flags & MXS_DMA_SG_LOOP)
269				mxs_chan->status = DMA_IN_PROGRESS;
270			else
271				mxs_chan->status = DMA_SUCCESS;
272		}
273
274		stat1 &= ~(1 << channel);
275
276		if (mxs_chan->status == DMA_SUCCESS)
277			mxs_chan->last_completed = mxs_chan->desc.cookie;
278
279		/* schedule tasklet on this channel */
280		tasklet_schedule(&mxs_chan->tasklet);
281	}
282
283	return IRQ_HANDLED;
284}
285
286static int mxs_dma_alloc_chan_resources(struct dma_chan *chan)
287{
288	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
289	struct mxs_dma_data *data = chan->private;
290	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
291	int ret;
292
293	if (!data)
294		return -EINVAL;
295
296	mxs_chan->chan_irq = data->chan_irq;
297
298	mxs_chan->ccw = dma_alloc_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
299				&mxs_chan->ccw_phys, GFP_KERNEL);
300	if (!mxs_chan->ccw) {
301		ret = -ENOMEM;
302		goto err_alloc;
303	}
304
305	memset(mxs_chan->ccw, 0, PAGE_SIZE);
306
307	if (mxs_chan->chan_irq != NO_IRQ) {
308		ret = request_irq(mxs_chan->chan_irq, mxs_dma_int_handler,
309					0, "mxs-dma", mxs_dma);
310		if (ret)
311			goto err_irq;
312	}
313
314	ret = clk_prepare_enable(mxs_dma->clk);
315	if (ret)
316		goto err_clk;
317
318	mxs_dma_reset_chan(mxs_chan);
319
320	dma_async_tx_descriptor_init(&mxs_chan->desc, chan);
321	mxs_chan->desc.tx_submit = mxs_dma_tx_submit;
322
323	/* the descriptor is ready */
324	async_tx_ack(&mxs_chan->desc);
325
326	return 0;
327
328err_clk:
329	free_irq(mxs_chan->chan_irq, mxs_dma);
330err_irq:
331	dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
332			mxs_chan->ccw, mxs_chan->ccw_phys);
333err_alloc:
334	return ret;
335}
336
337static void mxs_dma_free_chan_resources(struct dma_chan *chan)
338{
339	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
340	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
341
342	mxs_dma_disable_chan(mxs_chan);
343
344	free_irq(mxs_chan->chan_irq, mxs_dma);
345
346	dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
347			mxs_chan->ccw, mxs_chan->ccw_phys);
348
349	clk_disable_unprepare(mxs_dma->clk);
350}
351
352static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg(
353		struct dma_chan *chan, struct scatterlist *sgl,
354		unsigned int sg_len, enum dma_transfer_direction direction,
355		unsigned long append)
356{
357	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
358	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
359	struct mxs_dma_ccw *ccw;
360	struct scatterlist *sg;
361	int i, j;
362	u32 *pio;
363	int idx = append ? mxs_chan->desc_count : 0;
364
365	if (mxs_chan->status == DMA_IN_PROGRESS && !append)
366		return NULL;
367
368	if (sg_len + (append ? idx : 0) > NUM_CCW) {
369		dev_err(mxs_dma->dma_device.dev,
370				"maximum number of sg exceeded: %d > %d\n",
371				sg_len, NUM_CCW);
372		goto err_out;
373	}
374
375	mxs_chan->status = DMA_IN_PROGRESS;
376	mxs_chan->flags = 0;
377
378	/*
379	 * If the sg is prepared with append flag set, the sg
380	 * will be appended to the last prepared sg.
381	 */
382	if (append) {
383		BUG_ON(idx < 1);
384		ccw = &mxs_chan->ccw[idx - 1];
385		ccw->next = mxs_chan->ccw_phys + sizeof(*ccw) * idx;
386		ccw->bits |= CCW_CHAIN;
387		ccw->bits &= ~CCW_IRQ;
388		ccw->bits &= ~CCW_DEC_SEM;
389		ccw->bits &= ~CCW_WAIT4END;
390	} else {
391		idx = 0;
392	}
393
394	if (direction == DMA_TRANS_NONE) {
395		ccw = &mxs_chan->ccw[idx++];
396		pio = (u32 *) sgl;
397
398		for (j = 0; j < sg_len;)
399			ccw->pio_words[j++] = *pio++;
400
401		ccw->bits = 0;
402		ccw->bits |= CCW_IRQ;
403		ccw->bits |= CCW_DEC_SEM;
404		ccw->bits |= CCW_WAIT4END;
405		ccw->bits |= CCW_HALT_ON_TERM;
406		ccw->bits |= CCW_TERM_FLUSH;
407		ccw->bits |= BF_CCW(sg_len, PIO_NUM);
408		ccw->bits |= BF_CCW(MXS_DMA_CMD_NO_XFER, COMMAND);
409	} else {
410		for_each_sg(sgl, sg, sg_len, i) {
411			if (sg->length > MAX_XFER_BYTES) {
412				dev_err(mxs_dma->dma_device.dev, "maximum bytes for sg entry exceeded: %d > %d\n",
413						sg->length, MAX_XFER_BYTES);
414				goto err_out;
415			}
416
417			ccw = &mxs_chan->ccw[idx++];
418
419			ccw->next = mxs_chan->ccw_phys + sizeof(*ccw) * idx;
420			ccw->bufaddr = sg->dma_address;
421			ccw->xfer_bytes = sg->length;
422
423			ccw->bits = 0;
424			ccw->bits |= CCW_CHAIN;
425			ccw->bits |= CCW_HALT_ON_TERM;
426			ccw->bits |= CCW_TERM_FLUSH;
427			ccw->bits |= BF_CCW(direction == DMA_DEV_TO_MEM ?
428					MXS_DMA_CMD_WRITE : MXS_DMA_CMD_READ,
429					COMMAND);
430
431			if (i + 1 == sg_len) {
432				ccw->bits &= ~CCW_CHAIN;
433				ccw->bits |= CCW_IRQ;
434				ccw->bits |= CCW_DEC_SEM;
435				ccw->bits |= CCW_WAIT4END;
436			}
437		}
438	}
439	mxs_chan->desc_count = idx;
440
441	return &mxs_chan->desc;
442
443err_out:
444	mxs_chan->status = DMA_ERROR;
445	return NULL;
446}
447
448static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic(
449		struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
450		size_t period_len, enum dma_transfer_direction direction)
451{
452	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
453	struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
454	int num_periods = buf_len / period_len;
455	int i = 0, buf = 0;
456
457	if (mxs_chan->status == DMA_IN_PROGRESS)
458		return NULL;
459
460	mxs_chan->status = DMA_IN_PROGRESS;
461	mxs_chan->flags |= MXS_DMA_SG_LOOP;
462
463	if (num_periods > NUM_CCW) {
464		dev_err(mxs_dma->dma_device.dev,
465				"maximum number of sg exceeded: %d > %d\n",
466				num_periods, NUM_CCW);
467		goto err_out;
468	}
469
470	if (period_len > MAX_XFER_BYTES) {
471		dev_err(mxs_dma->dma_device.dev,
472				"maximum period size exceeded: %d > %d\n",
473				period_len, MAX_XFER_BYTES);
474		goto err_out;
475	}
476
477	while (buf < buf_len) {
478		struct mxs_dma_ccw *ccw = &mxs_chan->ccw[i];
479
480		if (i + 1 == num_periods)
481			ccw->next = mxs_chan->ccw_phys;
482		else
483			ccw->next = mxs_chan->ccw_phys + sizeof(*ccw) * (i + 1);
484
485		ccw->bufaddr = dma_addr;
486		ccw->xfer_bytes = period_len;
487
488		ccw->bits = 0;
489		ccw->bits |= CCW_CHAIN;
490		ccw->bits |= CCW_IRQ;
491		ccw->bits |= CCW_HALT_ON_TERM;
492		ccw->bits |= CCW_TERM_FLUSH;
493		ccw->bits |= BF_CCW(direction == DMA_DEV_TO_MEM ?
494				MXS_DMA_CMD_WRITE : MXS_DMA_CMD_READ, COMMAND);
495
496		dma_addr += period_len;
497		buf += period_len;
498
499		i++;
500	}
501	mxs_chan->desc_count = i;
502
503	return &mxs_chan->desc;
504
505err_out:
506	mxs_chan->status = DMA_ERROR;
507	return NULL;
508}
509
510static int mxs_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
511		unsigned long arg)
512{
513	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
514	int ret = 0;
515
516	switch (cmd) {
517	case DMA_TERMINATE_ALL:
518		mxs_dma_reset_chan(mxs_chan);
519		mxs_dma_disable_chan(mxs_chan);
520		break;
521	case DMA_PAUSE:
522		mxs_dma_pause_chan(mxs_chan);
523		break;
524	case DMA_RESUME:
525		mxs_dma_resume_chan(mxs_chan);
526		break;
527	default:
528		ret = -ENOSYS;
529	}
530
531	return ret;
532}
533
534static enum dma_status mxs_dma_tx_status(struct dma_chan *chan,
535			dma_cookie_t cookie, struct dma_tx_state *txstate)
536{
537	struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
538	dma_cookie_t last_used;
539
540	last_used = chan->cookie;
541	dma_set_tx_state(txstate, mxs_chan->last_completed, last_used, 0);
542
543	return mxs_chan->status;
544}
545
546static void mxs_dma_issue_pending(struct dma_chan *chan)
547{
548	/*
549	 * Nothing to do. We only have a single descriptor.
550	 */
551}
552
553static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma)
554{
555	int ret;
556
557	ret = clk_prepare_enable(mxs_dma->clk);
558	if (ret)
559		return ret;
560
561	ret = mxs_reset_block(mxs_dma->base);
562	if (ret)
563		goto err_out;
564
565	/* only major version matters */
566	mxs_dma->version = readl(mxs_dma->base +
567				((mxs_dma->dev_id == MXS_DMA_APBX) ?
568				HW_APBX_VERSION : HW_APBH_VERSION)) >>
569				BP_APBHX_VERSION_MAJOR;
570
571	/* enable apbh burst */
572	if (dma_is_apbh()) {
573		writel(BM_APBH_CTRL0_APB_BURST_EN,
574			mxs_dma->base + HW_APBHX_CTRL0 + MXS_SET_ADDR);
575		writel(BM_APBH_CTRL0_APB_BURST8_EN,
576			mxs_dma->base + HW_APBHX_CTRL0 + MXS_SET_ADDR);
577	}
578
579	/* enable irq for all the channels */
580	writel(MXS_DMA_CHANNELS_MASK << MXS_DMA_CHANNELS,
581		mxs_dma->base + HW_APBHX_CTRL1 + MXS_SET_ADDR);
582
583err_out:
584	clk_disable_unprepare(mxs_dma->clk);
585	return ret;
586}
587
588static int __init mxs_dma_probe(struct platform_device *pdev)
589{
590	const struct platform_device_id *id_entry =
591				platform_get_device_id(pdev);
592	struct mxs_dma_engine *mxs_dma;
593	struct resource *iores;
594	int ret, i;
595
596	mxs_dma = kzalloc(sizeof(*mxs_dma), GFP_KERNEL);
597	if (!mxs_dma)
598		return -ENOMEM;
599
600	mxs_dma->dev_id = id_entry->driver_data;
601
602	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
603
604	if (!request_mem_region(iores->start, resource_size(iores),
605				pdev->name)) {
606		ret = -EBUSY;
607		goto err_request_region;
608	}
609
610	mxs_dma->base = ioremap(iores->start, resource_size(iores));
611	if (!mxs_dma->base) {
612		ret = -ENOMEM;
613		goto err_ioremap;
614	}
615
616	mxs_dma->clk = clk_get(&pdev->dev, NULL);
617	if (IS_ERR(mxs_dma->clk)) {
618		ret = PTR_ERR(mxs_dma->clk);
619		goto err_clk;
620	}
621
622	dma_cap_set(DMA_SLAVE, mxs_dma->dma_device.cap_mask);
623	dma_cap_set(DMA_CYCLIC, mxs_dma->dma_device.cap_mask);
624
625	INIT_LIST_HEAD(&mxs_dma->dma_device.channels);
626
627	/* Initialize channel parameters */
628	for (i = 0; i < MXS_DMA_CHANNELS; i++) {
629		struct mxs_dma_chan *mxs_chan = &mxs_dma->mxs_chans[i];
630
631		mxs_chan->mxs_dma = mxs_dma;
632		mxs_chan->chan.device = &mxs_dma->dma_device;
633
634		tasklet_init(&mxs_chan->tasklet, mxs_dma_tasklet,
635			     (unsigned long) mxs_chan);
636
637
638		/* Add the channel to mxs_chan list */
639		list_add_tail(&mxs_chan->chan.device_node,
640			&mxs_dma->dma_device.channels);
641	}
642
643	ret = mxs_dma_init(mxs_dma);
644	if (ret)
645		goto err_init;
646
647	mxs_dma->dma_device.dev = &pdev->dev;
648
649	/* mxs_dma gets 65535 bytes maximum sg size */
650	mxs_dma->dma_device.dev->dma_parms = &mxs_dma->dma_parms;
651	dma_set_max_seg_size(mxs_dma->dma_device.dev, MAX_XFER_BYTES);
652
653	mxs_dma->dma_device.device_alloc_chan_resources = mxs_dma_alloc_chan_resources;
654	mxs_dma->dma_device.device_free_chan_resources = mxs_dma_free_chan_resources;
655	mxs_dma->dma_device.device_tx_status = mxs_dma_tx_status;
656	mxs_dma->dma_device.device_prep_slave_sg = mxs_dma_prep_slave_sg;
657	mxs_dma->dma_device.device_prep_dma_cyclic = mxs_dma_prep_dma_cyclic;
658	mxs_dma->dma_device.device_control = mxs_dma_control;
659	mxs_dma->dma_device.device_issue_pending = mxs_dma_issue_pending;
660
661	ret = dma_async_device_register(&mxs_dma->dma_device);
662	if (ret) {
663		dev_err(mxs_dma->dma_device.dev, "unable to register\n");
664		goto err_init;
665	}
666
667	dev_info(mxs_dma->dma_device.dev, "initialized\n");
668
669	return 0;
670
671err_init:
672	clk_put(mxs_dma->clk);
673err_clk:
674	iounmap(mxs_dma->base);
675err_ioremap:
676	release_mem_region(iores->start, resource_size(iores));
677err_request_region:
678	kfree(mxs_dma);
679	return ret;
680}
681
682static struct platform_device_id mxs_dma_type[] = {
683	{
684		.name = "mxs-dma-apbh",
685		.driver_data = MXS_DMA_APBH,
686	}, {
687		.name = "mxs-dma-apbx",
688		.driver_data = MXS_DMA_APBX,
689	}, {
690		/* end of list */
691	}
692};
693
694static struct platform_driver mxs_dma_driver = {
695	.driver		= {
696		.name	= "mxs-dma",
697	},
698	.id_table	= mxs_dma_type,
699};
700
701static int __init mxs_dma_module_init(void)
702{
703	return platform_driver_probe(&mxs_dma_driver, mxs_dma_probe);
704}
705subsys_initcall(mxs_dma_module_init);
706