Thread (15 messages) 15 messages, 4 authors, 2012-08-21

Re: [PATCH] usb: gadget: bcm63xx UDC driver

From: Kevin Cernekee <cernekee@gmail.com>
Date: 2012-08-19 20:53:39

On Sun, Aug 19, 2012 at 1:17 PM, Sebastian Andrzej Siewior
[off-list ref] wrote:
On Sat, Aug 18, 2012 at 10:18:01AM -0700, Kevin Cernekee wrote:

This is a quick look :)
Thanks for the review.
quoted
+     for (i = 0; i < NUM_IUDMA; i++)
+             if (udc->iudma[i].irq == irq)
+                     iudma = &udc->iudma[i];
+     BUG_ON(!iudma);
This is rough. Please don't do this. Bail out in probe or print an error here
and return with IRQ_NONE and time will close this irq.
OK, I will change it to warn + return IRQ_NONE, instead of BUG().

That situation shouldn't ever happen anyway.  It would mean that our
ISR is getting called with somebody else's IRQ number, or the iudma
structs were corrupted.

Probe does bail out if any of the IRQ resources are missing.
quoted
+     for (i = 0; i < NUM_IUDMA + 1; i++) {
+             int irq = platform_get_irq(pdev, i);
+             if (irq < 0) {
+                     dev_err(dev, "missing IRQ resource #%d\n", i);
+                     goto out_uninit;
+             }
+             if (devm_request_irq(dev, irq,
+                 i ? &bcm63xx_udc_data_isr : &bcm63xx_udc_ctrl_isr,
+                 0, dev_name(dev), udc) < 0) {
+                     dev_err(dev, "error requesting IRQ #%d\n", irq);
+                     goto out_uninit;
+             }
+             if (i > 0)
+                     udc->iudma[i - 1].irq = irq;
+     }
According to this code, i in iudma[] can be in 1..5. You could have more than
one IRQ. The comment above this for loop is point less. So I think if you can
only have _one_ idma irq than you could remove the for loop in
bcm63xx_udc_data_isr().
There are 6 IUDMA channels, and each one always has a dedicated
interrupt line.  IRQ resource #0 is the control (vbus/speed/cfg/etc.)
IRQ, and IRQ resources #1-6 are the IUDMA (IN/OUT data) IRQs.  Maybe
it would be good to add a longer comment to clarify this?

An earlier iteration of the code had passed in an IRQ range, which
worked for 6328, but then it was pointed out that the IRQ numbers are
not contiguous on all platforms.  So 7 individual resources are indeed
necessary.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help