linux-ti33x-psp 3.2: backport PM and USB fixes from PSP
[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-ti33x-psp-3.2 / psp / 0008-usb-musb-update-babble-workaround-fix.patch
1 From 6573dac17629de93ca32dca7fb656c550a4af00d Mon Sep 17 00:00:00 2001
2 From: Ajay Kumar Gupta <ajay.gupta@ti.com>
3 Date: Thu, 24 May 2012 10:37:27 +0530
4 Subject: [PATCH 08/18] usb: musb: update babble workaround fix
6 Resetting of usb controller also resets the tx and rx fifo addresses of
7 each endpoints and hence tx and rx fifo addresses need to be reconfigured.
9 Signed-off-by: Ravi B <ravibabu@ti.com>
10 ---
11  drivers/usb/musb/musb_core.c   |   19 ++++++++++---------
12  drivers/usb/musb/musb_core.h   |    1 +
13  drivers/usb/musb/musb_procfs.c |    1 +
14  drivers/usb/musb/ti81xx.c      |   11 +++++------
15  4 files changed, 17 insertions(+), 15 deletions(-)
17 diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
18 index db5afeb..5850889 100644
19 --- a/drivers/usb/musb/musb_core.c
20 +++ b/drivers/usb/musb/musb_core.c
21 @@ -1067,7 +1067,7 @@ static void musb_shutdown(struct platform_device *pdev)
22   */
23  
24  /* mode 0 - fits in 2KB */
25 -static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = {
26 +static struct musb_fifo_cfg mode_0_cfg[] = {
27  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, },
28  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, },
29  { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, },
30 @@ -1076,7 +1076,7 @@ static struct musb_fifo_cfg __devinitdata mode_0_cfg[] = {
31  };
32  
33  /* mode 1 - fits in 4KB */
34 -static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = {
35 +static struct musb_fifo_cfg mode_1_cfg[] = {
36  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
37  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
38  { .hw_ep_num = 2, .style = FIFO_RXTX, .maxpacket = 512, .mode = BUF_DOUBLE, },
39 @@ -1085,7 +1085,7 @@ static struct musb_fifo_cfg __devinitdata mode_1_cfg[] = {
40  };
41  
42  /* mode 2 - fits in 4KB */
43 -static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = {
44 +static struct musb_fifo_cfg mode_2_cfg[] = {
45  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, },
46  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, },
47  { .hw_ep_num = 2, .style = FIFO_TX,   .maxpacket = 512, },
48 @@ -1095,7 +1095,7 @@ static struct musb_fifo_cfg __devinitdata mode_2_cfg[] = {
49  };
50  
51  /* mode 3 - fits in 4KB */
52 -static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = {
53 +static struct musb_fifo_cfg mode_3_cfg[] = {
54  { .hw_ep_num = 1, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
55  { .hw_ep_num = 1, .style = FIFO_RX,   .maxpacket = 512, .mode = BUF_DOUBLE, },
56  { .hw_ep_num = 2, .style = FIFO_TX,   .maxpacket = 512, },
57 @@ -1105,7 +1105,7 @@ static struct musb_fifo_cfg __devinitdata mode_3_cfg[] = {
58  };
59  
60  /* mode 4 - fits in 16KB */
61 -static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = {
62 +static struct musb_fifo_cfg mode_4_cfg[] = {
63  { .hw_ep_num =  1, .style = FIFO_TX,   .maxpacket = 512,},
64  { .hw_ep_num =  1, .style = FIFO_RX,   .maxpacket = 512,},
65  { .hw_ep_num =  2, .style = FIFO_TX,   .maxpacket = 512,},
66 @@ -1137,7 +1137,7 @@ static struct musb_fifo_cfg __devinitdata mode_4_cfg[] = {
67  
68  
69  /* mode 5 - fits in 8KB */
70 -static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = {
71 +static struct musb_fifo_cfg mode_5_cfg[] = {
72  { .hw_ep_num =  1, .style = FIFO_TX,   .maxpacket = 512, },
73  { .hw_ep_num =  1, .style = FIFO_RX,   .maxpacket = 512, },
74  { .hw_ep_num =  2, .style = FIFO_TX,   .maxpacket = 512, },
75 @@ -1168,7 +1168,7 @@ static struct musb_fifo_cfg __devinitdata mode_5_cfg[] = {
76  };
77  
78  /* mode 6 - fits in 32KB */
79 -static struct musb_fifo_cfg __devinitdata mode_6_cfg[] = {
80 +static struct musb_fifo_cfg mode_6_cfg[] = {
81  { .hw_ep_num =  1, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE,},
82  { .hw_ep_num =  1, .style = FIFO_RX,   .maxpacket = 512, .mode = BUF_DOUBLE,},
83  { .hw_ep_num =  2, .style = FIFO_TX,   .maxpacket = 512, .mode = BUF_DOUBLE,},
84 @@ -1275,11 +1275,11 @@ fifo_setup(struct musb *musb, struct musb_hw_ep  *hw_ep,
85         return offset + (maxpacket << ((c_size & MUSB_FIFOSZ_DPB) ? 1 : 0));
86  }
87  
88 -static struct musb_fifo_cfg __devinitdata ep0_cfg = {
89 +static struct musb_fifo_cfg ep0_cfg = {
90         .style = FIFO_RXTX, .maxpacket = 64,
91  };
92  
93 -static int __devinit ep_config_from_table(struct musb *musb)
94 +int ep_config_from_table(struct musb *musb)
95  {
96         const struct musb_fifo_cfg      *cfg;
97         unsigned                i, n;
98 @@ -1370,6 +1370,7 @@ done:
99  
100         return 0;
101  }
102 +EXPORT_SYMBOL(ep_config_from_table);
103  
104  /*
105   * ep_config_from_hw - when MUSB_C_DYNFIFO_DEF is false
106 diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
107 index 87b6ff0..184c043 100644
108 --- a/drivers/usb/musb/musb_core.h
109 +++ b/drivers/usb/musb/musb_core.h
110 @@ -652,6 +652,7 @@ static inline const char *get_dma_name(struct musb *musb)
111                 return "?dma?";
112  #endif
113  }
114 +extern int ep_config_from_table(struct musb *musb);
115  
116  extern void musb_gb_work(struct work_struct *data);
117  /*-------------------------- ProcFS definitions ---------------------*/
118 diff --git a/drivers/usb/musb/musb_procfs.c b/drivers/usb/musb/musb_procfs.c
119 index e3aa42f..2db7eac 100644
120 --- a/drivers/usb/musb/musb_procfs.c
121 +++ b/drivers/usb/musb/musb_procfs.c
122 @@ -719,6 +719,7 @@ static int musb_proc_write(struct file *file, const char __user *buffer,
123                 INFO("T: start sending TEST_PACKET\n");
124                 INFO("D: set/read dbug level\n");
125                 INFO("K/k: enable/disable babble workaround\n");
126 +               INFO("b: generate software babble interrupt\n");
127                 break;
128  
129         default:
130 diff --git a/drivers/usb/musb/ti81xx.c b/drivers/usb/musb/ti81xx.c
131 index d76a693..e3cf38b 100644
132 --- a/drivers/usb/musb/ti81xx.c
133 +++ b/drivers/usb/musb/ti81xx.c
134 @@ -813,8 +813,7 @@ int musb_simulate_babble(struct musb *musb)
135         mdelay(100);
136  
137         /* generate s/w babble interrupt */
138 -       musb_writel(reg_base, USB_IRQ_STATUS_RAW_1,
139 -               MUSB_INTR_BABBLE);
140 +       musb_writel(reg_base, USB_IRQ_STATUS_RAW_1, MUSB_INTR_BABBLE);
141         return 0;
142  }
143  EXPORT_SYMBOL(musb_simulate_babble);
144 @@ -828,7 +827,8 @@ void musb_babble_workaround(struct musb *musb)
145  
146         /* Reset the controller */
147         musb_writel(reg_base, USB_CTRL_REG, USB_SOFT_RESET_MASK);
148 -       udelay(100);
149 +       while ((musb_readl(reg_base, USB_CTRL_REG) & 0x1))
150 +               cpu_relax();
151  
152         /* Shutdown the on-chip PHY and its PLL. */
153         if (data->set_phy_power)
154 @@ -843,9 +843,8 @@ void musb_babble_workaround(struct musb *musb)
155                 data->set_phy_power(musb->id, 1);
156         mdelay(100);
157  
158 -       /* save the usbotgss register contents */
159 -       musb_platform_enable(musb);
161 +       /* re-setup the endpoint fifo addresses */
162 +       ep_config_from_table(musb);
163         musb_start(musb);
164  }
165  
166 -- 
167 1.7.7.6