diff options
author | Felipe Balbi <balbi@ti.com> | 2011-09-06 05:00:39 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2011-09-09 06:03:12 -0400 |
commit | 42077b0a3328792974b232691f5d0eb9dd644768 (patch) | |
tree | d8eaa3e4bac48d2931659803b679f63f3d54bc91 /drivers/usb/dwc3/dwc3-omap.c | |
parent | dd17a6b20cd998662dc869b415800a06856fcda6 (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.c | 39 |
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 | ||