1550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi/*
2550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * MUSB OTG driver - support for Mentor's DMA controller
3550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
4550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * Copyright 2005 Mentor Graphics Corporation
5550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * Copyright (C) 2005-2007 by Texas Instruments
6550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
7550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * This program is free software; you can redistribute it and/or
8550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * modify it under the terms of the GNU General Public License
9550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * version 2 as published by the Free Software Foundation.
10550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
11550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * This program is distributed in the hope that it will be useful, but
12550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * WITHOUT ANY WARRANTY; without even the implied warranty of
13550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * General Public License for more details.
15550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
16550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * You should have received a copy of the GNU General Public License
17550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * along with this program; if not, write to the Free Software
18550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * 02110-1301 USA
20550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
21550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
22550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
24550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
28550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi *
32550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi */
33550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi#include <linux/device.h>
34550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi#include <linux/interrupt.h>
35550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi#include <linux/platform_device.h>
365a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
37550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi#include "musb_core.h"
386995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu#include "musbhsdma.h"
39550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
40550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbistatic int dma_controller_start(struct dma_controller *c)
41550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
42550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	/* nothing to do */
43550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	return 0;
44550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
45550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
46458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbistatic void dma_channel_release(struct dma_channel *channel);
47550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
48550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbistatic int dma_controller_stop(struct dma_controller *c)
49550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
50458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_controller *controller = container_of(c,
51458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			struct musb_dma_controller, controller);
52458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb *musb = controller->private_data;
53458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct dma_channel *channel;
54458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 bit;
55550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
56458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	if (controller->used_channels != 0) {
57550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		dev_err(musb->controller,
58550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			"Stopping DMA controller while channel active\n");
59550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
60458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		for (bit = 0; bit < MUSB_HSDMA_CHANNELS; bit++) {
61458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			if (controller->used_channels & (1 << bit)) {
62458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				channel = &controller->channel[bit].channel;
63458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				dma_channel_release(channel);
64550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
65458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				if (!controller->used_channels)
66550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi					break;
67550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			}
68550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		}
69550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
70458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
71550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	return 0;
72550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
73550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
74550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbistatic struct dma_channel *dma_channel_allocate(struct dma_controller *c,
75550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				struct musb_hw_ep *hw_ep, u8 transmit)
76550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
77458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_controller *controller = container_of(c,
78458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			struct musb_dma_controller, controller);
79458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel = NULL;
80458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct dma_channel *channel = NULL;
81458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 bit;
82458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
83458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	for (bit = 0; bit < MUSB_HSDMA_CHANNELS; bit++) {
84458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		if (!(controller->used_channels & (1 << bit))) {
85458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			controller->used_channels |= (1 << bit);
86458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel = &(controller->channel[bit]);
87458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel->controller = controller;
88458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel->idx = bit;
89458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel->epnum = hw_ep->epnum;
90458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel->transmit = transmit;
91458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel = &(musb_channel->channel);
92458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel->private_data = musb_channel;
93458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel->status = MUSB_DMA_STATUS_FREE;
946587cc0f30cd2f27cf0677e470f18792925a23a4Anil Shetty			channel->max_len = 0x100000;
95550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			/* Tx => mode 1; Rx => mode 0 */
96458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel->desired_mode = transmit;
97458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel->actual_len = 0;
98550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			break;
99550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		}
100550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
101458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
102458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	return channel;
103550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
104550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
105458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbistatic void dma_channel_release(struct dma_channel *channel)
106550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
107458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel = channel->private_data;
108550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
109458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	channel->actual_len = 0;
110458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->start_addr = 0;
111458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->len = 0;
112550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
113458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->controller->used_channels &=
114458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		~(1 << musb_channel->idx);
115550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
116458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	channel->status = MUSB_DMA_STATUS_UNKNOWN;
117550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
118550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
119458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbistatic void configure_channel(struct dma_channel *channel,
120550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				u16 packet_sz, u8 mode,
121550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				dma_addr_t dma_addr, u32 len)
122550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
123458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel = channel->private_data;
124458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_controller *controller = musb_channel->controller;
1255c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi	struct musb *musb = controller->private_data;
126458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	void __iomem *mbase = controller->base;
127458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 bchannel = musb_channel->idx;
128550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	u16 csr = 0;
129550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
1305c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi	dev_dbg(musb->controller, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n",
131458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel, packet_sz, dma_addr, len, mode);
132550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
133550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	if (mode) {
134550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		csr |= 1 << MUSB_HSDMA_MODE1_SHIFT;
135550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		BUG_ON(len < packet_sz);
136550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
137c0f1f8e38fda8e345cad9269c559b4f036378120Hema HK	csr |= MUSB_HSDMA_BURSTMODE_INCR16
138c0f1f8e38fda8e345cad9269c559b4f036378120Hema HK				<< MUSB_HSDMA_BURSTMODE_SHIFT;
139550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
140458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	csr |= (musb_channel->epnum << MUSB_HSDMA_ENDPOINT_SHIFT)
141550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		| (1 << MUSB_HSDMA_ENABLE_SHIFT)
142550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		| (1 << MUSB_HSDMA_IRQENABLE_SHIFT)
143458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		| (musb_channel->transmit
144550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				? (1 << MUSB_HSDMA_TRANSMIT_SHIFT)
145550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				: 0);
146550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
147550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	/* address/count */
1486995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu	musb_write_hsdma_addr(mbase, bchannel, dma_addr);
1496995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu	musb_write_hsdma_count(mbase, bchannel, len);
150550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
151550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	/* control (this should start things) */
152550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	musb_writew(mbase,
153458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_CONTROL),
154550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		csr);
155550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
156550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
157458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbistatic int dma_channel_program(struct dma_channel *channel,
158550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				u16 packet_sz, u8 mode,
159550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				dma_addr_t dma_addr, u32 len)
160550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
161458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel = channel->private_data;
1626e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	struct musb_dma_controller *controller = musb_channel->controller;
1636e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	struct musb *musb = controller->private_data;
164550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
1655c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi	dev_dbg(musb->controller, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",
166458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		musb_channel->epnum,
167458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		musb_channel->transmit ? "Tx" : "Rx",
168550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		packet_sz, dma_addr, len, mode);
169550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
170458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	BUG_ON(channel->status == MUSB_DMA_STATUS_UNKNOWN ||
171458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		channel->status == MUSB_DMA_STATUS_BUSY);
172550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
173132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger	/* Let targets check/tweak the arguments */
174132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger	if (musb->ops->adjust_channel_params) {
175132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger		int ret = musb->ops->adjust_channel_params(channel,
176132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger			packet_sz, &mode, &dma_addr, &len);
177132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger		if (ret)
178132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger			return ret;
179132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger	}
180132543074af3cf1e94e3608abf162880edbdcbb3Mike Frysinger
1816e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	/*
1826e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * The DMA engine in RTL1.8 and above cannot handle
1836e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * DMA addresses that are not aligned to a 4 byte boundary.
1846e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * It ends up masking the last two bits of the address
1856e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * programmed in DMA_ADDR.
1866e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 *
1876e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * Fail such DMA transfers, so that the backup PIO mode
1886e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 * can carry out the transfer
1896e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	 */
1906e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar	if ((musb->hwvers >= MUSB_HWVERS_1800) && (dma_addr % 4))
1916e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar		return false;
1926e16edfe62eb49274c8a74dc04d1c6f315f8f82bAnand Gadiyar
193458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	channel->actual_len = 0;
194458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->start_addr = dma_addr;
195458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->len = len;
196458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	musb_channel->max_packet_sz = packet_sz;
197458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	channel->status = MUSB_DMA_STATUS_BUSY;
198550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
1998ca47c8a7621835914c053caaec74e66147dd7dcAnand Gadiyar	configure_channel(channel, packet_sz, mode, dma_addr, len);
200550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
201550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	return true;
202550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
203550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
204458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbistatic int dma_channel_abort(struct dma_channel *channel)
205550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
206458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel = channel->private_data;
207458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	void __iomem *mbase = musb_channel->controller->base;
208458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
209458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 bchannel = musb_channel->idx;
210b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov	int offset;
211550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	u16 csr;
212550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
213458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	if (channel->status == MUSB_DMA_STATUS_BUSY) {
214458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		if (musb_channel->transmit) {
215b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			offset = MUSB_EP_OFFSET(musb_channel->epnum,
216b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov						MUSB_TXCSR);
217b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov
218b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			/*
219b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			 * The programming guide says that we must clear
220b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			 * the DMAENAB bit before the DMAMODE bit...
221b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			 */
222b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			csr = musb_readw(mbase, offset);
223b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAENAB);
224b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			musb_writew(mbase, offset, csr);
225b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			csr &= ~MUSB_TXCSR_DMAMODE;
226b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			musb_writew(mbase, offset, csr);
227550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		} else {
228b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			offset = MUSB_EP_OFFSET(musb_channel->epnum,
229b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov						MUSB_RXCSR);
230b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov
231b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			csr = musb_readw(mbase, offset);
232550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			csr &= ~(MUSB_RXCSR_AUTOCLEAR |
233550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				 MUSB_RXCSR_DMAENAB |
234550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				 MUSB_RXCSR_DMAMODE);
235b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov			musb_writew(mbase, offset, csr);
236550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		}
237550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
238550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		musb_writew(mbase,
239458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_CONTROL),
240550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			0);
2416995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu		musb_write_hsdma_addr(mbase, bchannel, 0);
2426995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu		musb_write_hsdma_count(mbase, bchannel, 0);
243458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		channel->status = MUSB_DMA_STATUS_FREE;
244550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
245458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
246550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	return 0;
247550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
248550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
249550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbistatic irqreturn_t dma_controller_irq(int irq, void *private_data)
250550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
251458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_controller *controller = private_data;
252458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb *musb = controller->private_data;
253458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_channel *musb_channel;
254458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct dma_channel *channel;
255458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
256458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	void __iomem *mbase = controller->base;
257458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
258550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	irqreturn_t retval = IRQ_NONE;
259458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
260550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	unsigned long flags;
261550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
262458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 bchannel;
263458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u8 int_hsdma;
264458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
265f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar	u32 addr, count;
266458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	u16 csr;
267458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
268550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	spin_lock_irqsave(&musb->lock, flags);
269550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
270550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	int_hsdma = musb_readb(mbase, MUSB_HSDMA_INTR);
271550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
2726bd03e7b9d0f70928f9cd793326c28e4e08ffc96Cliff Cai#ifdef CONFIG_BLACKFIN
2736bd03e7b9d0f70928f9cd793326c28e4e08ffc96Cliff Cai	/* Clear DMA interrupt flags */
2746bd03e7b9d0f70928f9cd793326c28e4e08ffc96Cliff Cai	musb_writeb(mbase, MUSB_HSDMA_INTR, int_hsdma);
2756bd03e7b9d0f70928f9cd793326c28e4e08ffc96Cliff Cai#endif
2766bd03e7b9d0f70928f9cd793326c28e4e08ffc96Cliff Cai
277f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar	if (!int_hsdma) {
2785c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi		dev_dbg(musb->controller, "spurious DMA irq\n");
279f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar
280f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar		for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) {
281f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar			musb_channel = (struct musb_dma_channel *)
282f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar					&(controller->channel[bchannel]);
283f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar			channel = &musb_channel->channel;
284f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar			if (channel->status == MUSB_DMA_STATUS_BUSY) {
285f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar				count = musb_read_hsdma_count(mbase, bchannel);
286f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar
287f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar				if (count == 0)
288f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar					int_hsdma |= (1 << bchannel);
289f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar			}
290f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar		}
291f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar
2925c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi		dev_dbg(musb->controller, "int_hsdma = 0x%x\n", int_hsdma);
293f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar
294f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar		if (!int_hsdma)
295f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar			goto done;
296f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar	}
297f933a0c0fe0ea5f49a35bcd45e3e4850e0606cbaAnand Gadiyar
298458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	for (bchannel = 0; bchannel < MUSB_HSDMA_CHANNELS; bchannel++) {
299458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		if (int_hsdma & (1 << bchannel)) {
300458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			musb_channel = (struct musb_dma_channel *)
301458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					&(controller->channel[bchannel]);
302458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			channel = &musb_channel->channel;
303550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
304550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			csr = musb_readw(mbase,
305458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					MUSB_HSDMA_CHANNEL_OFFSET(bchannel,
306550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi							MUSB_HSDMA_CONTROL));
307550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
308458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			if (csr & (1 << MUSB_HSDMA_BUSERROR_SHIFT)) {
309458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				musb_channel->channel.status =
310550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi					MUSB_DMA_STATUS_BUS_ABORT;
311458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			} else {
312550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				u8 devctl;
313550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
3146995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu				addr = musb_read_hsdma_addr(mbase,
3156995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu						bchannel);
316458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				channel->actual_len = addr
317458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					- musb_channel->start_addr;
318550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
3195c8a86e10a7c164f44537fabdc169fd8b4e7a440Felipe Balbi				dev_dbg(musb->controller, "ch %p, 0x%x -> 0x%x (%zu / %d) %s\n",
320458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					channel, musb_channel->start_addr,
321458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					addr, channel->actual_len,
322458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					musb_channel->len,
323458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					(channel->actual_len
324458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi						< musb_channel->len) ?
325550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi					"=> reconfig 0" : "=> complete");
326550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
327550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				devctl = musb_readb(mbase, MUSB_DEVCTL);
328550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
329458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				channel->status = MUSB_DMA_STATUS_FREE;
330550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
331550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				/* completed */
332550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi				if ((devctl & MUSB_DEVCTL_HM)
333458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					&& (musb_channel->transmit)
334458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					&& ((channel->desired_mode == 0)
335458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					    || (channel->actual_len &
336458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi					    (musb_channel->max_packet_sz - 1)))
337b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov				    ) {
338b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					u8  epnum  = musb_channel->epnum;
339b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					int offset = MUSB_EP_OFFSET(epnum,
340b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov								    MUSB_TXCSR);
341b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					u16 txcsr;
342b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov
343b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					/*
344b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					 * The programming guide says that we
345b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					 * must clear DMAENAB before DMAMODE.
346b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					 */
347b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					musb_ep_select(mbase, epnum);
348b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					txcsr = musb_readw(mbase, offset);
349b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					txcsr &= ~(MUSB_TXCSR_DMAENAB
350b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov							| MUSB_TXCSR_AUTOSET);
351b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					musb_writew(mbase, offset, txcsr);
352550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi					/* Send out the packet */
353b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					txcsr &= ~MUSB_TXCSR_DMAMODE;
354b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					txcsr |=  MUSB_TXCSR_TXPKTRDY;
355b6e434a5404b9ce8c285ea081b6ea5c523b29db4Sergei Shtylyov					musb_writew(mbase, offset, txcsr);
356458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi				}
357c7bbc056a92476b3b3d70a8df7cc746ac5d56de7Sergei Shtylyov				musb_dma_completion(musb, musb_channel->epnum,
358c7bbc056a92476b3b3d70a8df7cc746ac5d56de7Sergei Shtylyov						    musb_channel->transmit);
359550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi			}
360550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		}
361550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
3626995eb68aab70e79eedb710d7d6d1f22d8aea4a7Bryan Wu
363550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	retval = IRQ_HANDLED;
364550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbidone:
365550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	spin_unlock_irqrestore(&musb->lock, flags);
366550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	return retval;
367550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
368550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
369550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbivoid dma_controller_destroy(struct dma_controller *c)
370550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
371458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	struct musb_dma_controller *controller = container_of(c,
372458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi			struct musb_dma_controller, controller);
373550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
374550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	if (!controller)
375550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		return;
376550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
377550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	if (controller->irq)
378550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		free_irq(controller->irq, c);
379550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
380550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	kfree(controller);
381550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
382550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
383550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbistruct dma_controller *__init
384458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbidma_controller_create(struct musb *musb, void __iomem *base)
385550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi{
386550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	struct musb_dma_controller *controller;
387550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	struct device *dev = musb->controller;
388550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	struct platform_device *pdev = to_platform_device(dev);
389fcf173e4511193b1efeccb0f22a8c641b464353bHema Kalliguddi	int irq = platform_get_irq_byname(pdev, "dma");
390550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
391550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	if (irq == 0) {
392550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		dev_err(dev, "No DMA interrupt line!\n");
393550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		return NULL;
394550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
395550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
396458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller = kzalloc(sizeof(*controller), GFP_KERNEL);
397550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	if (!controller)
398550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		return NULL;
399550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
400458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->channel_count = MUSB_HSDMA_CHANNELS;
401458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->private_data = musb;
402458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->base = base;
403550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
404458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.start = dma_controller_start;
405458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.stop = dma_controller_stop;
406458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.channel_alloc = dma_channel_allocate;
407458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.channel_release = dma_channel_release;
408458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.channel_program = dma_channel_program;
409458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	controller->controller.channel_abort = dma_channel_abort;
410550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
411b5dd18d8747010e3f3eb1cc76a49f94291938559Yong Zhang	if (request_irq(irq, dma_controller_irq, 0,
412427c4f333474f5447f62387c1fb060e586c1a781Kay Sievers			dev_name(musb->controller), &controller->controller)) {
413550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		dev_err(dev, "request_irq %d failed!\n", irq);
414458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi		dma_controller_destroy(&controller->controller);
415458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi
416550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi		return NULL;
417550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	}
418550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
419550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi	controller->irq = irq;
420550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi
421458e6a511f9dc91e5af5e64740b0a5c9650a25fbFelipe Balbi	return &controller->controller;
422550a7375fe720924241f0eb76e4a5c1a3eb8c32fFelipe Balbi}
423