aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/dwc3-omap.c
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2011-09-06 05:00:39 -0400
committerFelipe Balbi <balbi@ti.com>2011-09-09 06:03:12 -0400
commit42077b0a3328792974b232691f5d0eb9dd644768 (patch)
treed8eaa3e4bac48d2931659803b679f63f3d54bc91 /drivers/usb/dwc3/dwc3-omap.c
parentdd17a6b20cd998662dc869b415800a06856fcda6 (diff)
usb: dwc3: omap: fix IRQ handling
In order to ACK the IRQ we must write back to the same register the bits we read. Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3/dwc3-omap.c')
-rw-r--r--drivers/usb/dwc3/dwc3-omap.c39
1 files changed, 12 insertions, 27 deletions
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c
index 8b9a3d850bef..421b5db2dfe6 100644
--- a/drivers/usb/dwc3/dwc3-omap.c
+++ b/drivers/usb/dwc3/dwc3-omap.c
@@ -131,12 +131,10 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
131{ 131{
132 struct dwc3_omap *omap = _omap; 132 struct dwc3_omap *omap = _omap;
133 u32 reg; 133 u32 reg;
134 u32 ctrl;
135 134
136 spin_lock(&omap->lock); 135 spin_lock(&omap->lock);
137 136
138 reg = dwc3_readl(omap->base, USBOTGSS_IRQSTATUS_1); 137 reg = dwc3_readl(omap->base, USBOTGSS_IRQSTATUS_1);
139 ctrl = dwc3_readl(omap->base, USBOTGSS_UTMI_OTG_CTRL);
140 138
141 if (reg & USBOTGSS_IRQ1_DMADISABLECLR) { 139 if (reg & USBOTGSS_IRQ1_DMADISABLECLR) {
142 dev_dbg(omap->dev, "DMA Disable was Cleared\n"); 140 dev_dbg(omap->dev, "DMA Disable was Cleared\n");
@@ -146,47 +144,34 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
146 if (reg & USBOTGSS_IRQ1_OEVT) 144 if (reg & USBOTGSS_IRQ1_OEVT)
147 dev_dbg(omap->dev, "OTG Event\n"); 145 dev_dbg(omap->dev, "OTG Event\n");
148 146
149 if (reg & USBOTGSS_IRQ1_DRVVBUS_RISE) { 147 if (reg & USBOTGSS_IRQ1_DRVVBUS_RISE)
150 dev_dbg(omap->dev, "DRVVBUS Rise\n"); 148 dev_dbg(omap->dev, "DRVVBUS Rise\n");
151 ctrl |= USBOTGSS_UTMI_OTG_CTRL_DRVVBUS;
152 }
153 149
154 if (reg & USBOTGSS_IRQ1_CHRGVBUS_RISE) { 150 if (reg & USBOTGSS_IRQ1_CHRGVBUS_RISE)
155 dev_dbg(omap->dev, "CHRGVBUS Rise\n"); 151 dev_dbg(omap->dev, "CHRGVBUS Rise\n");
156 ctrl |= USBOTGSS_UTMI_OTG_CTRL_CHRGVBUS;
157 }
158 152
159 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_RISE) { 153 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_RISE)
160 dev_dbg(omap->dev, "DISCHRGVBUS Rise\n"); 154 dev_dbg(omap->dev, "DISCHRGVBUS Rise\n");
161 ctrl |= USBOTGSS_UTMI_OTG_CTRL_DISCHRGVBUS;
162 }
163 155
164 if (reg & USBOTGSS_IRQ1_IDPULLUP_RISE) { 156 if (reg & USBOTGSS_IRQ1_IDPULLUP_RISE)
165 dev_dbg(omap->dev, "IDPULLUP Rise\n"); 157 dev_dbg(omap->dev, "IDPULLUP Rise\n");
166 ctrl |= USBOTGSS_UTMI_OTG_CTRL_IDPULLUP;
167 }
168 158
169 if (reg & USBOTGSS_IRQ1_DRVVBUS_FALL) { 159 if (reg & USBOTGSS_IRQ1_DRVVBUS_FALL)
170 dev_dbg(omap->dev, "DRVVBUS Fall\n"); 160 dev_dbg(omap->dev, "DRVVBUS Fall\n");
171 ctrl &= ~USBOTGSS_UTMI_OTG_CTRL_DRVVBUS;
172 }
173 161
174 if (reg & USBOTGSS_IRQ1_CHRGVBUS_FALL) { 162 if (reg & USBOTGSS_IRQ1_CHRGVBUS_FALL)
175 dev_dbg(omap->dev, "CHRGVBUS Fall\n"); 163 dev_dbg(omap->dev, "CHRGVBUS Fall\n");
176 ctrl &= ~USBOTGSS_UTMI_OTG_CTRL_CHRGVBUS;
177 }
178 164
179 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_FALL) { 165 if (reg & USBOTGSS_IRQ1_DISCHRGVBUS_FALL)
180 dev_dbg(omap->dev, "DISCHRGVBUS Fall\n"); 166 dev_dbg(omap->dev, "DISCHRGVBUS Fall\n");
181 ctrl &= ~USBOTGSS_UTMI_OTG_CTRL_DISCHRGVBUS;
182 }
183 167
184 if (reg & USBOTGSS_IRQ1_IDPULLUP_FALL) { 168 if (reg & USBOTGSS_IRQ1_IDPULLUP_FALL)
185 dev_dbg(omap->dev, "IDPULLUP Fall\n"); 169 dev_dbg(omap->dev, "IDPULLUP Fall\n");
186 ctrl &= ~USBOTGSS_UTMI_OTG_CTRL_IDPULLUP;
187 }
188 170
189 dwc3_writel(omap->base, USBOTGSS_UTMI_OTG_CTRL, ctrl); 171 dwc3_writel(omap->base, USBOTGSS_IRQSTATUS_1, reg);
172
173 reg = dwc3_readl(omap->base, USBOTGSS_IRQSTATUS_0);
174 dwc3_writel(omap->base, USBOTGSS_IRQSTATUS_0, reg);
190 175
191 spin_unlock(&omap->lock); 176 spin_unlock(&omap->lock);
192 177