Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * MUSB OTG driver - support for Mentor's DMA controller
  3 *
  4 * Copyright 2005 Mentor Graphics Corporation
  5 * Copyright (C) 2005-2007 by Texas Instruments
  6 *
  7 * This program is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU General Public License
  9 * version 2 as published by the Free Software Foundation.
 10 *
 11 * This program is distributed in the hope that it will be useful, but
 12 * WITHOUT ANY WARRANTY; without even the implied warranty of
 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14 * General Public License for more details.
 15 *
 16 * You should have received a copy of the GNU General Public License
 17 * along with this program; if not, write to the Free Software
 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 19 * 02110-1301 USA
 20 *
 21 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
 24 * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 28 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 31 *
 32 */
 33
 34#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
 35#include "omap2430.h"
 36#endif
 37
 38#ifndef CONFIG_BLACKFIN
 39
 40#define MUSB_HSDMA_BASE		0x200
 41#define MUSB_HSDMA_INTR		(MUSB_HSDMA_BASE + 0)
 42#define MUSB_HSDMA_CONTROL		0x4
 43#define MUSB_HSDMA_ADDRESS		0x8
 44#define MUSB_HSDMA_COUNT		0xc
 45
 46#define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)		\
 47		(MUSB_HSDMA_BASE + (_bchannel << 4) + _offset)
 48
 49#define musb_read_hsdma_addr(mbase, bchannel)	\
 50	musb_readl(mbase,	\
 51		   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS))
 52
 53#define musb_write_hsdma_addr(mbase, bchannel, addr) \
 54	musb_writel(mbase, \
 55		    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS), \
 56		    addr)
 57
 58#define musb_read_hsdma_count(mbase, bchannel)	\
 59	musb_readl(mbase,	\
 60		   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT))
 61
 62#define musb_write_hsdma_count(mbase, bchannel, len) \
 63	musb_writel(mbase, \
 64		    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT), \
 65		    len)
 66#else
 67
 68#define MUSB_HSDMA_BASE		0x400
 69#define MUSB_HSDMA_INTR		(MUSB_HSDMA_BASE + 0)
 70#define MUSB_HSDMA_CONTROL		0x04
 71#define MUSB_HSDMA_ADDR_LOW		0x08
 72#define MUSB_HSDMA_ADDR_HIGH		0x0C
 73#define MUSB_HSDMA_COUNT_LOW		0x10
 74#define MUSB_HSDMA_COUNT_HIGH		0x14
 75
 76#define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)		\
 77		(MUSB_HSDMA_BASE + (_bchannel * 0x20) + _offset)
 78
 79static inline u32 musb_read_hsdma_addr(void __iomem *mbase, u8 bchannel)
 80{
 81	u32 addr = musb_readw(mbase,
 82		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_HIGH));
 83
 84	addr = addr << 16;
 85
 86	addr |= musb_readw(mbase,
 87		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_LOW));
 88
 89	return addr;
 90}
 91
 92static inline void musb_write_hsdma_addr(void __iomem *mbase,
 93				u8 bchannel, dma_addr_t dma_addr)
 94{
 95	musb_writew(mbase,
 96		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_LOW),
 97		dma_addr);
 98	musb_writew(mbase,
 99		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_HIGH),
100		(dma_addr >> 16));
101}
102
103static inline u32 musb_read_hsdma_count(void __iomem *mbase, u8 bchannel)
104{
105	u32 count = musb_readw(mbase,
106		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_HIGH));
107
108	count = count << 16;
109
110	count |= musb_readw(mbase,
111		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_LOW));
112
113	return count;
114}
115
116static inline void musb_write_hsdma_count(void __iomem *mbase,
117				u8 bchannel, u32 len)
118{
119	musb_writew(mbase,
120		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_LOW),len);
121	musb_writew(mbase,
122		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_HIGH),
123		(len >> 16));
124}
125
126#endif /* CONFIG_BLACKFIN */
127
128/* control register (16-bit): */
129#define MUSB_HSDMA_ENABLE_SHIFT		0
130#define MUSB_HSDMA_TRANSMIT_SHIFT	1
131#define MUSB_HSDMA_MODE1_SHIFT		2
132#define MUSB_HSDMA_IRQENABLE_SHIFT	3
133#define MUSB_HSDMA_ENDPOINT_SHIFT	4
134#define MUSB_HSDMA_BUSERROR_SHIFT	8
135#define MUSB_HSDMA_BURSTMODE_SHIFT	9
136#define MUSB_HSDMA_BURSTMODE		(3 << MUSB_HSDMA_BURSTMODE_SHIFT)
137#define MUSB_HSDMA_BURSTMODE_UNSPEC	0
138#define MUSB_HSDMA_BURSTMODE_INCR4	1
139#define MUSB_HSDMA_BURSTMODE_INCR8	2
140#define MUSB_HSDMA_BURSTMODE_INCR16	3
141
142#define MUSB_HSDMA_CHANNELS		8
143
144struct musb_dma_controller;
145
146struct musb_dma_channel {
147	struct dma_channel		channel;
148	struct musb_dma_controller	*controller;
149	u32				start_addr;
150	u32				len;
151	u16				max_packet_sz;
152	u8				idx;
153	u8				epnum;
154	u8				transmit;
155};
156
157struct musb_dma_controller {
158	struct dma_controller		controller;
159	struct musb_dma_channel		channel[MUSB_HSDMA_CHANNELS];
160	void				*private_data;
161	void __iomem			*base;
162	u8				channel_count;
163	u8				used_channels;
164	u8				irq;
165};
v3.5.6
  1/*
  2 * MUSB OTG driver - support for Mentor's DMA controller
  3 *
  4 * Copyright 2005 Mentor Graphics Corporation
  5 * Copyright (C) 2005-2007 by Texas Instruments
  6 *
  7 * This program is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU General Public License
  9 * version 2 as published by the Free Software Foundation.
 10 *
 11 * This program is distributed in the hope that it will be useful, but
 12 * WITHOUT ANY WARRANTY; without even the implied warranty of
 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14 * General Public License for more details.
 15 *
 16 * You should have received a copy of the GNU General Public License
 17 * along with this program; if not, write to the Free Software
 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 19 * 02110-1301 USA
 20 *
 21 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
 24 * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 28 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 31 *
 32 */
 33
 34#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
 35#include "omap2430.h"
 36#endif
 37
 38#ifndef CONFIG_BLACKFIN
 39
 40#define MUSB_HSDMA_BASE		0x200
 41#define MUSB_HSDMA_INTR		(MUSB_HSDMA_BASE + 0)
 42#define MUSB_HSDMA_CONTROL		0x4
 43#define MUSB_HSDMA_ADDRESS		0x8
 44#define MUSB_HSDMA_COUNT		0xc
 45
 46#define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)		\
 47		(MUSB_HSDMA_BASE + (_bchannel << 4) + _offset)
 48
 49#define musb_read_hsdma_addr(mbase, bchannel)	\
 50	musb_readl(mbase,	\
 51		   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS))
 52
 53#define musb_write_hsdma_addr(mbase, bchannel, addr) \
 54	musb_writel(mbase, \
 55		    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDRESS), \
 56		    addr)
 57
 58#define musb_read_hsdma_count(mbase, bchannel)	\
 59	musb_readl(mbase,	\
 60		   MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT))
 61
 62#define musb_write_hsdma_count(mbase, bchannel, len) \
 63	musb_writel(mbase, \
 64		    MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT), \
 65		    len)
 66#else
 67
 68#define MUSB_HSDMA_BASE		0x400
 69#define MUSB_HSDMA_INTR		(MUSB_HSDMA_BASE + 0)
 70#define MUSB_HSDMA_CONTROL		0x04
 71#define MUSB_HSDMA_ADDR_LOW		0x08
 72#define MUSB_HSDMA_ADDR_HIGH		0x0C
 73#define MUSB_HSDMA_COUNT_LOW		0x10
 74#define MUSB_HSDMA_COUNT_HIGH		0x14
 75
 76#define MUSB_HSDMA_CHANNEL_OFFSET(_bchannel, _offset)		\
 77		(MUSB_HSDMA_BASE + (_bchannel * 0x20) + _offset)
 78
 79static inline u32 musb_read_hsdma_addr(void __iomem *mbase, u8 bchannel)
 80{
 81	u32 addr = musb_readw(mbase,
 82		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_HIGH));
 83
 84	addr = addr << 16;
 85
 86	addr |= musb_readw(mbase,
 87		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_LOW));
 88
 89	return addr;
 90}
 91
 92static inline void musb_write_hsdma_addr(void __iomem *mbase,
 93				u8 bchannel, dma_addr_t dma_addr)
 94{
 95	musb_writew(mbase,
 96		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_LOW),
 97		dma_addr);
 98	musb_writew(mbase,
 99		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_ADDR_HIGH),
100		(dma_addr >> 16));
101}
102
103static inline u32 musb_read_hsdma_count(void __iomem *mbase, u8 bchannel)
104{
105	u32 count = musb_readw(mbase,
106		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_HIGH));
107
108	count = count << 16;
109
110	count |= musb_readw(mbase,
111		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_LOW));
112
113	return count;
114}
115
116static inline void musb_write_hsdma_count(void __iomem *mbase,
117				u8 bchannel, u32 len)
118{
119	musb_writew(mbase,
120		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_LOW),len);
121	musb_writew(mbase,
122		MUSB_HSDMA_CHANNEL_OFFSET(bchannel, MUSB_HSDMA_COUNT_HIGH),
123		(len >> 16));
124}
125
126#endif /* CONFIG_BLACKFIN */
127
128/* control register (16-bit): */
129#define MUSB_HSDMA_ENABLE_SHIFT		0
130#define MUSB_HSDMA_TRANSMIT_SHIFT	1
131#define MUSB_HSDMA_MODE1_SHIFT		2
132#define MUSB_HSDMA_IRQENABLE_SHIFT	3
133#define MUSB_HSDMA_ENDPOINT_SHIFT	4
134#define MUSB_HSDMA_BUSERROR_SHIFT	8
135#define MUSB_HSDMA_BURSTMODE_SHIFT	9
136#define MUSB_HSDMA_BURSTMODE		(3 << MUSB_HSDMA_BURSTMODE_SHIFT)
137#define MUSB_HSDMA_BURSTMODE_UNSPEC	0
138#define MUSB_HSDMA_BURSTMODE_INCR4	1
139#define MUSB_HSDMA_BURSTMODE_INCR8	2
140#define MUSB_HSDMA_BURSTMODE_INCR16	3
141
142#define MUSB_HSDMA_CHANNELS		8
143
144struct musb_dma_controller;
145
146struct musb_dma_channel {
147	struct dma_channel		channel;
148	struct musb_dma_controller	*controller;
149	u32				start_addr;
150	u32				len;
151	u16				max_packet_sz;
152	u8				idx;
153	u8				epnum;
154	u8				transmit;
155};
156
157struct musb_dma_controller {
158	struct dma_controller		controller;
159	struct musb_dma_channel		channel[MUSB_HSDMA_CHANNELS];
160	void				*private_data;
161	void __iomem			*base;
162	u8				channel_count;
163	u8				used_channels;
164	u8				irq;
165};