kernel-power v45 -> kernel-bfs
[kernel-bfs] / kernel-bfs-2.6.28 / debian / patches / usbhostmode.diff
1 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/usb-musb.c
2 +++ kernel-power-2.6.28/arch/arm/mach-omap2/usb-musb.c
3 @@ -141,10 +141,13 @@
4         .config         = &musb_config,
5  
6         /* REVISIT charge pump on TWL4030 can supply up to
7 -        * 100 mA ... but this value is board-specific, like
8 +        * 200 mA ... but this value is board-specific, like
9          * "mode", and should be passed to usb_musb_init().
10 +         *
11 +         * Since the power can come from a Y-cable, let the user
12 +         * decide on power constraints and not limit anything here.
13          */
14 -       .power          = 50,                   /* up to 100 mA */
15 +       .power          = 0,                    /* use default of 500 mA */
16  };
17  
18  static u64 musb_dmamask = DMA_32BIT_MASK;
19 --- kernel-power-2.6.28.orig/drivers/usb/core/otg_whitelist.h
20 +++ kernel-power-2.6.28/drivers/usb/core/otg_whitelist.h
21 @@ -14,7 +14,7 @@
22  #else
23  static inline int is_targeted(struct usb_device *d)
24  {
25 -       return 0;
26 +       return 1;
27  }
28  #endif
29  
30 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.c
31 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.c
32 @@ -230,6 +230,8 @@
33          * change it unless you really know what you're doing
34          */
35  
36 +       DBG(4, "Some asshole called musb_charger_detect!");
37 +
38         switch(musb->xceiv->state) {
39                 case OTG_STATE_B_IDLE:
40                         /* we always reset transceiver */
41 @@ -349,7 +351,7 @@
42  
43         prefetch((u8 *)src);
44  
45 -       DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
46 +       DBG_nonverb(4, "%cX ep%d fifo %p count %d buf %p\n",
47                         'T', hw_ep->epnum, fifo, len, src);
48  
49         /* we can't assume unaligned reads work */
50 @@ -387,7 +389,7 @@
51  {
52         void __iomem *fifo = hw_ep->fifo;
53  
54 -       DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
55 +       DBG_nonverb(4, "%cX ep%d fifo %p count %d buf %p\n",
56                         'R', hw_ep->epnum, fifo, len, dst);
57  
58         /* we can't assume unaligned writes work */
59 @@ -576,8 +578,8 @@
60         void __iomem *mbase = musb->mregs;
61         u8 r;
62  
63 -       DBG(3, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
64 -               int_usb);
65 +        DBG(3, "<== State=%s Power=%02x, DevCtl=%02x, int_usb=0x%x\n",
66 +                otg_state_string(musb), power, devctl, int_usb);
67  
68         /* in host mode, the peripheral may issue remote wakeup.
69          * in peripheral mode, the host may resume the link.
70 @@ -2028,12 +2030,16 @@
71         int             status;
72  
73         mutex_lock(&musb->mutex);
74 -       if (sysfs_streq(buf, "host"))
75 -               status = musb_platform_set_mode(musb, MUSB_HOST);
76 +        if (sysfs_streq(buf, "hostl"))
77 +                status = musb_platform_set_mode(musb, MUSB_HOST, 0);
78 +        else if (sysfs_streq(buf, "hostf"))
79 +                status = musb_platform_set_mode(musb, MUSB_HOST, 1);
80 +        else if (sysfs_streq(buf, "hosth"))
81 +                status = musb_platform_set_mode(musb, MUSB_HOST, 2);
82         else if (sysfs_streq(buf, "peripheral"))
83 -               status = musb_platform_set_mode(musb, MUSB_PERIPHERAL);
84 +               status = musb_platform_set_mode(musb, MUSB_PERIPHERAL, 0);
85         else if (sysfs_streq(buf, "otg"))
86 -               status = musb_platform_set_mode(musb, MUSB_OTG);
87 +               status = musb_platform_set_mode(musb, MUSB_OTG, 0);
88         else
89                 status = -EINVAL;
90         mutex_unlock(&musb->mutex);
91 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_core.h
92 +++ kernel-power-2.6.28/drivers/usb/musb/musb_core.h
93 @@ -63,6 +63,9 @@
94  #include "../core/hcd.h"
95  #include "musb_host.h"
96  
97 +/* This is the version of forced hostmode userspace<->kernelspace API.
98 + * Do not update to the build date, bump only on API changes */
99 +#define MUSB_VERSION_HOSTMODE  "20101110"
100  
101  #ifdef CONFIG_USB_MUSB_OTG
102  
103 @@ -591,7 +594,7 @@
104  
105  extern void musb_hnp_stop(struct musb *musb);
106  
107 -extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode);
108 +extern int musb_platform_set_mode(struct musb *musb, u8 musb_mode, u8 hostspeed);
109  
110  #if defined(CONFIG_USB_TUSB6010) || defined(CONFIG_BLACKFIN) || \
111         defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP34XX)
112 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_debug.h
113 +++ kernel-power-2.6.28/drivers/usb/musb/musb_debug.h
114 @@ -46,6 +46,21 @@
115  
116  #ifdef CONFIG_USB_MUSB_DEBUG
117  
118 +#define xprintk_verb(level, facility, format, args...) do { \
119 +        if (_dbg_level(level)) { \
120 +                        u8 testmode, devctl, power/*, otg_ctrl, func_ctrl, isp_debug*/; \
121 +                        testmode = musb_readb(musb->mregs, MUSB_TESTMODE); \
122 +                        devctl = musb_readb(musb->mregs, MUSB_DEVCTL); \
123 +                        power = musb_readb(musb->mregs, MUSB_POWER); \
124 +                        /*otg_ctrl = musb_ulpi_readb(musb->mregs, ISP1704_OTG_CTRL); \
125 +                        func_ctrl = musb_ulpi_readb(musb->mregs, ISP1704_FUNC_CTRL); \
126 +                        isp_debug = musb_ulpi_readb(musb->mregs, ISP1704_DEBUG); */ \
127 +                        printk(facility "State=%s Testmode=%02x Power=%02x, DevCtl=%02x\n", \
128 +                                otg_state_string(musb), testmode, power, devctl/*, otg_ctrl, func_ctrl, isp_debug*/); \
129 +                        printk(facility "%-20s %4d: " format , \
130 +                                __func__, __LINE__ , ## args); \
131 +        } } while (0)
132 +
133  #define xprintk(level, facility, format, args...) do { \
134         if (_dbg_level(level)) { \
135                 printk(facility "%-20s %4d: " format , \
136 @@ -58,7 +73,8 @@
137  {
138         return musb_debug >= l;
139  }
140 -#define DBG(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args)
141 +#define DBG(level, fmt, args...) xprintk_verb(level, KERN_DEBUG, fmt, ## args)
142 +#define DBG_nonverb(level, fmt, args...) xprintk(level, KERN_DEBUG, fmt, ## args)
143  #else
144  #define DBG(level, fmt, args...)       do {} while(0)
145  #endif /* CONFIG_USB_MUSB_DEBUG */
146 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_gadget.c
147 +++ kernel-power-2.6.28/drivers/usb/musb/musb_gadget.c
148 @@ -816,12 +816,12 @@
149         if (!ep || !desc)
150                 return -EINVAL;
151  
152 +        musb_ep = to_musb_ep(ep);
153 +        musb = musb_ep->musb;
154         DBG(1, "===> enabling %s\n", ep->name);
155  
156 -       musb_ep = to_musb_ep(ep);
157         hw_ep = musb_ep->hw_ep;
158         regs = hw_ep->regs;
159 -       musb = musb_ep->musb;
160         mbase = musb->mregs;
161         epnum = musb_ep->current_epnum;
162  
163 @@ -949,8 +949,8 @@
164         int             status = 0;
165  
166         musb_ep = to_musb_ep(ep);
167 -       DBG(4, "disabling %s\n", musb_ep->name);
168         musb = musb_ep->musb;
169 +       DBG(4, "disabling %s\n", musb_ep->name);
170         epnum = musb_ep->current_epnum;
171         epio = musb->endpoints[epnum].regs;
172  
173 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_host.c
174 +++ kernel-power-2.6.28/drivers/usb/musb/musb_host.c
175 @@ -118,7 +118,7 @@
176         csr = musb_readw(epio, MUSB_TXCSR);
177         while (csr & MUSB_TXCSR_FIFONOTEMPTY) {
178                 if (csr != lastcsr)
179 -                       DBG(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
180 +                       DBG_nonverb(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
181                 lastcsr = csr;
182                 csr |= MUSB_TXCSR_FLUSHFIFO;
183                 musb_writew(epio, MUSB_TXCSR, csr);
184 @@ -2036,7 +2036,7 @@
185                 dma = is_in ? ep->rx_channel : ep->tx_channel;
186                 if (dma) {
187                         status = ep->musb->dma_controller->channel_abort(dma);
188 -                       DBG(status ? 1 : 3,
189 +                       DBG_nonverb(status ? 1 : 3,
190                                 "abort %cX%d DMA for urb %p --> %d\n",
191                                 is_in ? 'R' : 'T', ep->epnum,
192                                 urb, status);
193 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_procfs.c
194 +++ kernel-power-2.6.28/drivers/usb/musb/musb_procfs.c
195 @@ -479,7 +479,8 @@
196  #elif defined(CONFIG_USB_MUSB_HDRC_HCD)
197                         "host"
198  #endif
199 -                       ", debug=%d [eps=%d]\n",
200 +                       ", debug=%d [eps=%d]"
201 +                       ", version_hostmode=" MUSB_VERSION_HOSTMODE "\n",
202                 musb_debug,
203                 musb->nr_endpoints);
204         if (code <= 0)
205 @@ -651,6 +652,75 @@
206                 reg = musb_readb(mbase, MUSB_DEVCTL);
207                 reg |= MUSB_DEVCTL_SESSION;
208                 musb_writeb(mbase, MUSB_DEVCTL, reg);
209 +
210 +               /* Pretend there's a session request */
211 +               musb->ep0_stage = MUSB_EP0_START;
212 +               musb->xceiv->state = OTG_STATE_A_IDLE;
213 +               MUSB_HST_MODE(musb);
214 +               musb_set_vbus(musb, 1);
215 +
216 +               /* Connect request */
217 +               {
218 +               struct usb_hcd *hcd = musb_to_hcd(musb);
219 +               u8 testmode, line;
220 +
221 +               musb->is_active = 1;
222 +               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
223 +
224 +               musb->ep0_stage = MUSB_EP0_START;
225 +
226 +#ifdef CONFIG_USB_MUSB_OTG
227 +               /* flush endpoints when transitioning from Device Mode */
228 +               if (is_peripheral_active(musb)) {
229 +                       /* REVISIT HNP; just force disconnect */
230 +               }
231 +               musb_writew(mbase, MUSB_INTRTXE, musb->epmask);
232 +               musb_writew(mbase, MUSB_INTRRXE, musb->epmask & 0xfffe);
233 +               musb_writeb(mbase, MUSB_INTRUSBE, 0xf7);
234 +#endif
235 +               musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
236 +                                       |USB_PORT_STAT_HIGH_SPEED
237 +                                       |USB_PORT_STAT_ENABLE
238 +                                       );
239 +               musb->port1_status |= USB_PORT_STAT_CONNECTION
240 +                                       |(USB_PORT_STAT_C_CONNECTION << 16);
241 +
242 +               line = musb_ulpi_readb(mbase, ISP1704_DEBUG);
243 +               testmode = musb_readb(mbase, MUSB_TESTMODE);
244 +
245 +               switch (line) {
246 +               case 1: /* pullup indicates a full/high-speed device */
247 +                       if (!(testmode & (MUSB_TEST_FORCE_FS | MUSB_TEST_FORCE_HS)))
248 +                               pr_err("Forced hostmode error: a full/high-speed device attached but low-speed mode selected\n"); 
249 +                       break;
250 +               case 2: /* pullup indicates a low-speed device */
251 +                       if (testmode & (MUSB_TEST_FORCE_FS | MUSB_TEST_FORCE_HS))
252 +                               pr_err("Forced hostmode error: a low-speed device attached but full/high-speed mode selected\n"); 
253 +                       break;
254 +               default:
255 +                       pr_err("Forced hostmode error: no device attached\n");
256 +               }
257
258 +               if (!(testmode & (MUSB_TEST_FORCE_FS | MUSB_TEST_FORCE_HS)))
259 +                       musb->port1_status |= USB_PORT_STAT_LOW_SPEED;
260 +
261 +               if (hcd->status_urb)
262 +                       usb_hcd_poll_rh_status(hcd);
263 +               else
264 +                       usb_hcd_resume_root_hub(hcd);
265 +
266 +               MUSB_HST_MODE(musb);
267 +
268 +               /* indicate new connection to OTG machine */
269 +               switch (musb->xceiv->state) {
270 +               default:
271 +                               musb->xceiv->state = OTG_STATE_A_HOST;
272 +                               hcd->self.is_b_host = 0;
273 +                       break;
274 +               }
275 +               DBG(1, "CONNECT (%s) devctl %02x\n",
276 +                               otg_state_string(musb), devctl);
277 +               }
278                 break;
279  
280         case 'H':
281 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_regs.h
282 +++ kernel-power-2.6.28/drivers/usb/musb/musb_regs.h
283 @@ -330,7 +330,7 @@
284         while (!(musb_readb(addr, ULPI_REG_CONTROL) & ULPI_REG_CMPLT)) {
285                 i++;
286                 if (i == 10000) {
287 -                       DBG(3, "ULPI read timed out\n");
288 +                       DBG_nonverb(3, "ULPI read timed out\n");
289                         return 0;
290                 }
291  
292 @@ -355,7 +355,7 @@
293         while(!(musb_readb(addr, ULPI_REG_CONTROL) & ULPI_REG_CMPLT)) {
294                 i++;
295                 if (i == 10000) {
296 -                       DBG(3, "ULPI write timed out\n");
297 +                       DBG_nonverb(3, "ULPI write timed out\n");
298                         return;
299                 }
300         }
301 --- kernel-power-2.6.28.orig/drivers/usb/musb/musbhsdma.c
302 +++ kernel-power-2.6.28/drivers/usb/musb/musbhsdma.c
303 @@ -131,7 +131,7 @@
304         u8 bchannel = musb_channel->idx;
305         u16 csr = 0;
306  
307 -       DBG(4, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n",
308 +       DBG_nonverb(4, "%p, pkt_sz %d, addr 0x%x, len %d, mode %d\n",
309                         channel, packet_sz, dma_addr, len, mode);
310  
311         if (mode)
312 @@ -167,7 +167,7 @@
313  {
314         struct musb_dma_channel *musb_channel = channel->private_data;
315  
316 -       DBG(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",
317 +       DBG_nonverb(2, "ep%d-%s pkt_sz %d, dma_addr 0x%x length %d, mode %d\n",
318                 musb_channel->epnum,
319                 musb_channel->transmit ? "Tx" : "Rx",
320                 packet_sz, dma_addr, len, mode);
321 --- kernel-power-2.6.28.orig/drivers/usb/musb/omap2430.c
322 +++ kernel-power-2.6.28/drivers/usb/musb/omap2430.c
323 @@ -73,6 +73,8 @@
324  
325         spin_lock_irqsave(&musb->lock, flags);
326  
327 +       DBG(3, "%s\n", otg_state_string(musb));
328 +
329         devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
330  
331         switch (musb->xceiv->state) {
332 @@ -211,15 +213,12 @@
333  
334  static int musb_platform_resume(struct musb *musb);
335  
336 -int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
337 +int musb_platform_set_mode(struct musb *musb, u8 musb_mode, u8 hostspeed)
338  {
339         struct usb_hcd  *hcd;
340         struct usb_bus  *host;
341         u8              devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
342  
343 -       devctl |= MUSB_DEVCTL_SESSION;
344 -       musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
345 -
346         switch (musb_mode) {
347  #ifdef CONFIG_USB_MUSB_HDRC_HCD
348         case MUSB_HOST:
349 @@ -227,10 +226,36 @@
350                 host = hcd_to_bus(hcd);
351  
352                 otg_set_host(musb->xceiv, host);
353
354 +                if (machine_is_nokia_rx51()) {
355 +                        u8 testmode;
356
357 +                        musb_platform_resume(musb);
358
359 +                        devctl |= MUSB_DEVCTL_SESSION;
360 +                        musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
361
362 +                        testmode = MUSB_TEST_FORCE_HOST;
363 +                        if (hostspeed == 1)
364 +                                testmode |= MUSB_TEST_FORCE_FS;
365 +                        else if (hostspeed == 2)
366 +                                testmode |= MUSB_TEST_FORCE_HS;
367 +                        musb_writeb(musb->mregs, MUSB_TESTMODE, testmode);
368 +                }
369                 break;
370  #endif
371  #ifdef CONFIG_USB_GADGET_MUSB_HDRC
372         case MUSB_PERIPHERAL:
373 +                if (machine_is_nokia_rx51()) {
374 +                        musb_platform_resume(musb);
375 +                        musb_set_vbus(musb, 0);
376
377 +                        devctl &= ~MUSB_DEVCTL_SESSION;
378 +                        musb_writeb(musb->mregs, MUSB_DEVCTL, devctl);
379
380 +                        musb_writeb(musb->mregs, MUSB_TESTMODE, 0);
381 +                }
382
383                 otg_set_peripheral(musb->xceiv, &musb->g);
384                 break;
385  #endif
386 --- kernel-power-2.6.28.orig/drivers/usb/otg/twl4030-usb.c
387 +++ kernel-power-2.6.28/drivers/usb/otg/twl4030-usb.c
388 @@ -371,6 +371,7 @@
389  
390         spin_lock_irq(&twl->lock);
391         twl->linkstat = linkstat;
392 +#if 0
393         if (linkstat == USB_LINK_ID) {
394                 twl->otg.default_a = true;
395                 twl->otg.state = OTG_STATE_A_IDLE;
396 @@ -378,6 +379,7 @@
397                 twl->otg.default_a = false;
398                 twl->otg.state = OTG_STATE_B_IDLE;
399         }
400 +#endif
401         spin_unlock_irq(&twl->lock);
402  
403         return linkstat;
404 --- kernel-power-2.6.28.orig/drivers/usb/musb/musb_virthub.c
405 +++ kernel-power-2.6.28/drivers/usb/musb/musb_virthub.c
406 @@ -112,7 +112,7 @@
407  
408  static void musb_port_reset(struct musb *musb, bool do_reset)
409  {
410 -       u8              power;
411 +       u8              power, testmode;
412         void __iomem    *mbase = musb->mregs;
413  
414  #ifdef CONFIG_USB_MUSB_OTG
415 @@ -162,10 +162,16 @@
416  
417                 musb->ignore_disconnect = false;
418  
419 +               testmode = musb_readb(mbase, MUSB_TESTMODE);
420                 power = musb_readb(mbase, MUSB_POWER);
421                 if (power & MUSB_POWER_HSMODE) {
422                         DBG(4, "high-speed device connected\n");
423                         musb->port1_status |= USB_PORT_STAT_HIGH_SPEED;
424 +                       if (!(testmode & MUSB_TEST_FORCE_HS))
425 +                               pr_err("Forced hostmode error: a high-speed device attached but not high-speed mode selected\n"); 
426 +               } else {
427 +                       if (testmode & MUSB_TEST_FORCE_HS)
428 +                               pr_err("Forced hostmode error: a full/low-speed device attached but high-speed mode selected\n"); 
429                 }
430  
431                 musb->port1_status &= ~USB_PORT_STAT_RESET;