aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/usb-tusb6010.c1
-rw-r--r--drivers/usb/musb/musb_core.c37
-rw-r--r--drivers/usb/musb/musb_core.h14
-rw-r--r--drivers/usb/musb/tusb6010.h169
-rw-r--r--include/linux/usb/musb.h38
5 files changed, 51 insertions, 208 deletions
diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c
index 1607c941d95f..10ef464d6be7 100644
--- a/arch/arm/mach-omap2/usb-tusb6010.c
+++ b/arch/arm/mach-omap2/usb-tusb6010.c
@@ -317,7 +317,6 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,
317 printk(error, 6, status); 317 printk(error, 6, status);
318 return -ENODEV; 318 return -ENODEV;
319 } 319 }
320 data->multipoint = 1;
321 tusb_device.dev.platform_data = data; 320 tusb_device.dev.platform_data = data;
322 321
323 /* REVISIT let the driver know what DMA channels work */ 322 /* REVISIT let the driver know what DMA channels work */
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 462586d06da9..d68ec6daf335 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -990,12 +990,6 @@ static void musb_shutdown(struct platform_device *pdev)
990 * We don't currently use dynamic fifo setup capability to do anything 990 * We don't currently use dynamic fifo setup capability to do anything
991 * more than selecting one of a bunch of predefined configurations. 991 * more than selecting one of a bunch of predefined configurations.
992 */ 992 */
993#ifdef MUSB_C_DYNFIFO_DEF
994#define can_dynfifo() 1
995#else
996#define can_dynfifo() 0
997#endif
998
999#if defined(CONFIG_USB_TUSB6010) || \ 993#if defined(CONFIG_USB_TUSB6010) || \
1000 defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX) 994 defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
1001static ushort __initdata fifo_mode = 4; 995static ushort __initdata fifo_mode = 4;
@@ -1008,8 +1002,6 @@ module_param(fifo_mode, ushort, 0);
1008MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration"); 1002MODULE_PARM_DESC(fifo_mode, "initial endpoint configuration");
1009 1003
1010 1004
1011#define DYN_FIFO_SIZE (1<<(MUSB_C_RAM_BITS+2))
1012
1013enum fifo_style { FIFO_RXTX, FIFO_TX, FIFO_RX } __attribute__ ((packed)); 1005enum fifo_style { FIFO_RXTX, FIFO_TX, FIFO_RX } __attribute__ ((packed));
1014enum buf_mode { BUF_SINGLE, BUF_DOUBLE } __attribute__ ((packed)); 1006enum buf_mode { BUF_SINGLE, BUF_DOUBLE } __attribute__ ((packed));
1015 1007
@@ -1119,11 +1111,12 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep,
1119 1111
1120 c_size = size - 3; 1112 c_size = size - 3;
1121 if (cfg->mode == BUF_DOUBLE) { 1113 if (cfg->mode == BUF_DOUBLE) {
1122 if ((offset + (maxpacket << 1)) > DYN_FIFO_SIZE) 1114 if ((offset + (maxpacket << 1)) >
1115 (1 << (musb->config->ram_bits + 2)))
1123 return -EMSGSIZE; 1116 return -EMSGSIZE;
1124 c_size |= MUSB_FIFOSZ_DPB; 1117 c_size |= MUSB_FIFOSZ_DPB;
1125 } else { 1118 } else {
1126 if ((offset + maxpacket) > DYN_FIFO_SIZE) 1119 if ((offset + maxpacket) > (1 << (musb->config->ram_bits + 2)))
1127 return -EMSGSIZE; 1120 return -EMSGSIZE;
1128 } 1121 }
1129 1122
@@ -1219,13 +1212,13 @@ static int __init ep_config_from_table(struct musb *musb)
1219 /* assert(offset > 0) */ 1212 /* assert(offset > 0) */
1220 1213
1221 /* NOTE: for RTL versions >= 1.400 EPINFO and RAMINFO would 1214 /* NOTE: for RTL versions >= 1.400 EPINFO and RAMINFO would
1222 * be better than static MUSB_C_NUM_EPS and DYN_FIFO_SIZE... 1215 * be better than static musb->config->num_eps and DYN_FIFO_SIZE...
1223 */ 1216 */
1224 1217
1225 for (i = 0; i < n; i++) { 1218 for (i = 0; i < n; i++) {
1226 u8 epn = cfg->hw_ep_num; 1219 u8 epn = cfg->hw_ep_num;
1227 1220
1228 if (epn >= MUSB_C_NUM_EPS) { 1221 if (epn >= musb->config->num_eps) {
1229 pr_debug("%s: invalid ep %d\n", 1222 pr_debug("%s: invalid ep %d\n",
1230 musb_driver_name, epn); 1223 musb_driver_name, epn);
1231 continue; 1224 continue;
@@ -1242,8 +1235,8 @@ static int __init ep_config_from_table(struct musb *musb)
1242 1235
1243 printk(KERN_DEBUG "%s: %d/%d max ep, %d/%d memory\n", 1236 printk(KERN_DEBUG "%s: %d/%d max ep, %d/%d memory\n",
1244 musb_driver_name, 1237 musb_driver_name,
1245 n + 1, MUSB_C_NUM_EPS * 2 - 1, 1238 n + 1, musb->config->num_eps * 2 - 1,
1246 offset, DYN_FIFO_SIZE); 1239 offset, (1 << (musb->config->ram_bits + 2)));
1247 1240
1248#ifdef CONFIG_USB_MUSB_HDRC_HCD 1241#ifdef CONFIG_USB_MUSB_HDRC_HCD
1249 if (!musb->bulk_ep) { 1242 if (!musb->bulk_ep) {
@@ -1270,7 +1263,7 @@ static int __init ep_config_from_hw(struct musb *musb)
1270 1263
1271 /* FIXME pick up ep0 maxpacket size */ 1264 /* FIXME pick up ep0 maxpacket size */
1272 1265
1273 for (epnum = 1; epnum < MUSB_C_NUM_EPS; epnum++) { 1266 for (epnum = 1; epnum < musb->config->num_eps; epnum++) {
1274 musb_ep_select(mbase, epnum); 1267 musb_ep_select(mbase, epnum);
1275 hw_ep = musb->endpoints + epnum; 1268 hw_ep = musb->endpoints + epnum;
1276 1269
@@ -1424,14 +1417,14 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb)
1424 musb->epmask = 1; 1417 musb->epmask = 1;
1425 1418
1426 if (reg & MUSB_CONFIGDATA_DYNFIFO) { 1419 if (reg & MUSB_CONFIGDATA_DYNFIFO) {
1427 if (can_dynfifo()) 1420 if (musb->config->dyn_fifo)
1428 status = ep_config_from_table(musb); 1421 status = ep_config_from_table(musb);
1429 else { 1422 else {
1430 ERR("reconfigure software for Dynamic FIFOs\n"); 1423 ERR("reconfigure software for Dynamic FIFOs\n");
1431 status = -ENODEV; 1424 status = -ENODEV;
1432 } 1425 }
1433 } else { 1426 } else {
1434 if (!can_dynfifo()) 1427 if (!musb->config->dyn_fifo)
1435 status = ep_config_from_hw(musb); 1428 status = ep_config_from_hw(musb);
1436 else { 1429 else {
1437 ERR("reconfigure software for static FIFOs\n"); 1430 ERR("reconfigure software for static FIFOs\n");
@@ -1788,7 +1781,8 @@ static void musb_irq_work(struct work_struct *data)
1788 */ 1781 */
1789 1782
1790static struct musb *__init 1783static struct musb *__init
1791allocate_instance(struct device *dev, void __iomem *mbase) 1784allocate_instance(struct device *dev,
1785 struct musb_hdrc_config *config, void __iomem *mbase)
1792{ 1786{
1793 struct musb *musb; 1787 struct musb *musb;
1794 struct musb_hw_ep *ep; 1788 struct musb_hw_ep *ep;
@@ -1820,8 +1814,9 @@ allocate_instance(struct device *dev, void __iomem *mbase)
1820 musb->mregs = mbase; 1814 musb->mregs = mbase;
1821 musb->ctrl_base = mbase; 1815 musb->ctrl_base = mbase;
1822 musb->nIrq = -ENODEV; 1816 musb->nIrq = -ENODEV;
1817 musb->config = config;
1823 for (epnum = 0, ep = musb->endpoints; 1818 for (epnum = 0, ep = musb->endpoints;
1824 epnum < MUSB_C_NUM_EPS; 1819 epnum < musb->config->num_eps;
1825 epnum++, ep++) { 1820 epnum++, ep++) {
1826 1821
1827 ep->musb = musb; 1822 ep->musb = musb;
@@ -1929,7 +1924,7 @@ bad_config:
1929 } 1924 }
1930 1925
1931 /* allocate */ 1926 /* allocate */
1932 musb = allocate_instance(dev, ctrl); 1927 musb = allocate_instance(dev, plat->config, ctrl);
1933 if (!musb) 1928 if (!musb)
1934 return -ENOMEM; 1929 return -ENOMEM;
1935 1930
@@ -1987,7 +1982,7 @@ bad_config:
1987 musb_generic_disable(musb); 1982 musb_generic_disable(musb);
1988 1983
1989 /* setup musb parts of the core (especially endpoints) */ 1984 /* setup musb parts of the core (especially endpoints) */
1990 status = musb_core_init(plat->multipoint 1985 status = musb_core_init(plat->config->multipoint
1991 ? MUSB_CONTROLLER_MHDRC 1986 ? MUSB_CONTROLLER_MHDRC
1992 : MUSB_CONTROLLER_HDRC, musb); 1987 : MUSB_CONTROLLER_HDRC, musb);
1993 if (status < 0) 1988 if (status < 0)
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 90035c12ab5f..eade46d81708 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -56,18 +56,6 @@ struct musb_ep;
56#include "musb_debug.h" 56#include "musb_debug.h"
57#include "musb_dma.h" 57#include "musb_dma.h"
58 58
59#ifdef CONFIG_USB_MUSB_SOC
60/*
61 * Get core configuration from a header converted (by cfg_conv)
62 * from the Verilog config file generated by the core config utility
63 *
64 * For now we assume that header is provided along with other
65 * arch-specific files. Discrete chips will need a build tweak.
66 * So will using AHB IDs from silicon that provides them.
67 */
68#include <asm/arch/hdrc_cnf.h>
69#endif
70
71#include "musb_io.h" 59#include "musb_io.h"
72#include "musb_regs.h" 60#include "musb_regs.h"
73 61
@@ -440,6 +428,8 @@ struct musb {
440 struct usb_gadget_driver *gadget_driver; /* its driver */ 428 struct usb_gadget_driver *gadget_driver; /* its driver */
441#endif 429#endif
442 430
431 struct musb_hdrc_config *config;
432
443#ifdef MUSB_CONFIG_PROC_FS 433#ifdef MUSB_CONFIG_PROC_FS
444 struct proc_dir_entry *proc_entry; 434 struct proc_dir_entry *proc_entry;
445#endif 435#endif
diff --git a/drivers/usb/musb/tusb6010.h b/drivers/usb/musb/tusb6010.h
index db6dad0750ae..ab8c96286ce6 100644
--- a/drivers/usb/musb/tusb6010.h
+++ b/drivers/usb/musb/tusb6010.h
@@ -230,173 +230,4 @@ extern u8 tusb_get_revision(struct musb *musb);
230#define TUSB_REV_30 0x30 230#define TUSB_REV_30 0x30
231#define TUSB_REV_31 0x31 231#define TUSB_REV_31 0x31
232 232
233/*----------------------------------------------------------------------------*/
234
235#ifdef CONFIG_USB_TUSB6010
236
237/* configuration parameters specific to this silicon */
238
239/* Number of Tx endpoints. Legal values are 1 - 16 (this value includes EP0) */
240#define MUSB_C_NUM_EPT 16
241
242/* Number of Rx endpoints. Legal values are 1 - 16 (this value includes EP0) */
243#define MUSB_C_NUM_EPR 16
244
245/* Endpoint 1 to 15 direction types. C_EP1_DEF is defined if either Tx endpoint
246 * 1 or Rx endpoint 1 are used.
247 */
248#define MUSB_C_EP1_DEF
249
250/* C_EP1_TX_DEF is defined if Tx endpoint 1 is used */
251#define MUSB_C_EP1_TX_DEF
252
253/* C_EP1_RX_DEF is defined if Rx endpoint 1 is used */
254#define MUSB_C_EP1_RX_DEF
255
256/* C_EP1_TOR_DEF is defined if Tx endpoint 1 and Rx endpoint 1 share a FIFO */
257/* #define C_EP1_TOR_DEF */
258
259/* C_EP1_TAR_DEF is defined if both Tx endpoint 1 and Rx endpoint 1 are used
260 * and do not share a FIFO.
261 */
262#define MUSB_C_EP1_TAR_DEF
263
264/* Similarly for all other used endpoints */
265#define MUSB_C_EP2_DEF
266#define MUSB_C_EP2_TX_DEF
267#define MUSB_C_EP2_RX_DEF
268#define MUSB_C_EP2_TAR_DEF
269#define MUSB_C_EP3_DEF
270#define MUSB_C_EP3_TX_DEF
271#define MUSB_C_EP3_RX_DEF
272#define MUSB_C_EP3_TAR_DEF
273#define MUSB_C_EP4_DEF
274#define MUSB_C_EP4_TX_DEF
275#define MUSB_C_EP4_RX_DEF
276#define MUSB_C_EP4_TAR_DEF
277
278/* Endpoint 1 to 15 FIFO address bits. Legal values are 3 to 13 - corresponding
279 * to FIFO sizes of 8 to 8192 bytes. If an Tx endpoint shares a FIFO with an Rx
280 * endpoint then the Rx FIFO size must be the same as the Tx FIFO size. All
281 * endpoints 1 to 15 must be defined, unused endpoints should be set to 2.
282 */
283#define MUSB_C_EP1T_BITS 5
284#define MUSB_C_EP1R_BITS 5
285#define MUSB_C_EP2T_BITS 5
286#define MUSB_C_EP2R_BITS 5
287#define MUSB_C_EP3T_BITS 3
288#define MUSB_C_EP3R_BITS 3
289#define MUSB_C_EP4T_BITS 3
290#define MUSB_C_EP4R_BITS 3
291
292#define MUSB_C_EP5T_BITS 2
293#define MUSB_C_EP5R_BITS 2
294#define MUSB_C_EP6T_BITS 2
295#define MUSB_C_EP6R_BITS 2
296#define MUSB_C_EP7T_BITS 2
297#define MUSB_C_EP7R_BITS 2
298#define MUSB_C_EP8T_BITS 2
299#define MUSB_C_EP8R_BITS 2
300#define MUSB_C_EP9T_BITS 2
301#define MUSB_C_EP9R_BITS 2
302#define MUSB_C_EP10T_BITS 2
303#define MUSB_C_EP10R_BITS 2
304#define MUSB_C_EP11T_BITS 2
305#define MUSB_C_EP11R_BITS 2
306#define MUSB_C_EP12T_BITS 2
307#define MUSB_C_EP12R_BITS 2
308#define MUSB_C_EP13T_BITS 2
309#define MUSB_C_EP13R_BITS 2
310#define MUSB_C_EP14T_BITS 2
311#define MUSB_C_EP14R_BITS 2
312#define MUSB_C_EP15T_BITS 2
313#define MUSB_C_EP15R_BITS 2
314
315/* Define the following constant if the USB2.0 Transceiver Macrocell data width
316 * is 16-bits.
317 */
318/* #define C_UTM_16 */
319
320/* Define this constant if the CPU uses big-endian byte ordering. */
321/* #define C_BIGEND */
322
323/* Define the following constant if any Tx endpoint is required to support
324 * multiple bulk packets.
325 */
326/* #define C_MP_TX */
327
328/* Define the following constant if any Rx endpoint is required to support
329 * multiple bulk packets.
330 */
331/* #define C_MP_RX */
332
333/* Define the following constant if any Tx endpoint is required to support high
334 * bandwidth ISO.
335 */
336/* #define C_HB_TX */
337
338/* Define the following constant if any Rx endpoint is required to support high
339 * bandwidth ISO.
340 */
341/* #define C_HB_RX */
342
343/* Define the following constant if software connect/disconnect control is
344 * required.
345 */
346#define MUSB_C_SOFT_CON
347
348/* Define the following constant if Vendor Control Registers are required. */
349/* #define C_VEND_REG */
350
351/* Vendor control register widths. */
352#define MUSB_C_VCTL_BITS 4
353#define MUSB_C_VSTAT_BITS 8
354
355/* Define the following constant to include a DMA controller. */
356/* #define C_DMA */
357
358/* Define the following constant if 2 or more DMA channels are required. */
359/* #define C_DMA2 */
360
361/* Define the following constant if 3 or more DMA channels are required. */
362/* #define C_DMA3 */
363
364/* Define the following constant if 4 or more DMA channels are required. */
365/* #define C_DMA4 */
366
367/* Define the following constant if 5 or more DMA channels are required. */
368/* #define C_DMA5 */
369
370/* Define the following constant if 6 or more DMA channels are required. */
371/* #define C_DMA6 */
372
373/* Define the following constant if 7 or more DMA channels are required. */
374/* #define C_DMA7 */
375
376/* Define the following constant if 8 or more DMA channels are required. */
377/* #define C_DMA8 */
378
379/* Enable Dynamic FIFO Sizing */
380#define MUSB_C_DYNFIFO_DEF
381
382/* Derived constants. The following constants are derived from the previous
383 * configuration constants
384 */
385
386/* Total number of endpoints. Legal values are 2 - 16. This must be equal to
387 * the larger of C_NUM_EPT, C_NUM_EPR
388 */
389/* #define MUSB_C_NUM_EPS 5 */
390
391/* C_EPMAX_BITS is equal to the largest endpoint FIFO word address bits */
392#define MUSB_C_EPMAX_BITS 11
393
394/* C_RAM_BITS is the number of address bits required to address the RAM (32-bit
395 * addresses). It is defined as log2 of the sum of 2** of all the endpoint FIFO
396 * dword address bits (rounded up).
397 */
398#define MUSB_C_RAM_BITS 12
399
400#endif /* CONFIG_USB_TUSB6010 */
401
402#endif /* __TUSB6010_H__ */ 233#endif /* __TUSB6010_H__ */
diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h
index d325a0d5bf4f..630962c04ca4 100644
--- a/include/linux/usb/musb.h
+++ b/include/linux/usb/musb.h
@@ -19,6 +19,36 @@ enum musb_mode {
19 19
20struct clk; 20struct clk;
21 21
22struct musb_hdrc_eps_bits {
23 const char name[16];
24 u8 bits;
25};
26
27struct musb_hdrc_config {
28 /* MUSB configuration-specific details */
29 unsigned multipoint:1; /* multipoint device */
30 unsigned dyn_fifo:1; /* supports dynamic fifo sizing */
31 unsigned soft_con:1; /* soft connect required */
32 unsigned utm_16:1; /* utm data witdh is 16 bits */
33 unsigned big_endian:1; /* true if CPU uses big-endian */
34 unsigned mult_bulk_tx:1; /* Tx ep required for multbulk pkts */
35 unsigned mult_bulk_rx:1; /* Rx ep required for multbulk pkts */
36 unsigned high_iso_tx:1; /* Tx ep required for HB iso */
37 unsigned high_iso_rx:1; /* Rx ep required for HD iso */
38 unsigned dma:1; /* supports DMA */
39 unsigned vendor_req:1; /* vendor registers required */
40
41 u8 num_eps; /* number of endpoints _with_ ep0 */
42 u8 dma_channels; /* number of dma channels */
43 u8 dyn_fifo_size; /* dynamic size in bytes */
44 u8 vendor_ctrl; /* vendor control reg width */
45 u8 vendor_stat; /* vendor status reg witdh */
46 u8 dma_req_chan; /* bitmask for required dma channels */
47 u8 ram_bits; /* ram address size */
48
49 struct musb_hdrc_eps_bits *eps_bits;
50};
51
22struct musb_hdrc_platform_data { 52struct musb_hdrc_platform_data {
23 /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */ 53 /* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
24 u8 mode; 54 u8 mode;
@@ -38,16 +68,14 @@ struct musb_hdrc_platform_data {
38 /* (HOST or OTG) msec/2 after VBUS on till power good */ 68 /* (HOST or OTG) msec/2 after VBUS on till power good */
39 u8 potpgt; 69 u8 potpgt;
40 70
41 /* TBD: chip defaults should probably go someplace else,
42 * e.g. number of tx/rx endpoints, etc
43 */
44 unsigned multipoint:1;
45
46 /* Power the device on or off */ 71 /* Power the device on or off */
47 int (*set_power)(int state); 72 int (*set_power)(int state);
48 73
49 /* Turn device clock on or off */ 74 /* Turn device clock on or off */
50 int (*set_clock)(struct clk *clock, int is_on); 75 int (*set_clock)(struct clk *clock, int is_on);
76
77 /* MUSB configuration-specific details */
78 struct musb_hdrc_config *config;
51}; 79};
52 80
53 81