On Fri, 29 Apr 2011 11:21:08 -0700
Kristen Carlson Accardi <[email protected]> wrote:

> The OTG device can receive device interrupts while
> suspended (such as for a hot add or remove).  So we
> need to resume the hardware in the interrupt handler
> before touching it.  Because this needs to be done
> synchronously, we need to switch the irq handler to
> a threaded one.
> 
> Signed-off-by:  Kristen Carlson Accardi <[email protected]>
> Index: linux-2.6.37/drivers/usb/otg/langwell_otg.c
> ===================================================================
> --- linux-2.6.37.orig/drivers/usb/otg/langwell_otg.c
> +++ linux-2.6.37/drivers/usb/otg/langwell_otg.c
> @@ -785,11 +785,15 @@ static irqreturn_t otg_irq(int irq, void
>       u32                             int_mask = 0;
>       int                             flag = 0;
>  
> +     pm_runtime_get_sync(lnw->dev);
> +
>       int_sts = readl(lnw->iotg.base + CI_OTGSC);
>       int_en = (int_sts & OTGSC_INTEN_MASK) >> 8;
>       int_mask = int_sts & int_en;
> -     if (int_mask == 0)
> +     if (int_mask == 0) {
> +             pm_runtime_put(lnw->dev);
>               return IRQ_NONE;
> +     }
>  
>       if (int_mask & OTGSC_IDIS) {
>               dev_dbg(lnw->dev, "%s: id change int\n", __func__);
> @@ -839,6 +843,8 @@ static irqreturn_t otg_irq(int irq, void
>       if (flag)
>               langwell_update_transceiver();
>  
> +     pm_runtime_put(lnw->dev);
> +
>       return IRQ_HANDLED;
>  }
>  
> @@ -2094,7 +2100,7 @@ static int langwell_otg_probe(struct pci
>               goto err;
>       }
>  
> -     if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
> +     if (request_threaded_irq(pdev->irq, NULL, &otg_irq,
should it be otg_irq?

> IRQF_SHARED, driver_name, lnw) != 0) {
>               dev_dbg(lnw->dev, "request interrupt %d failed\n",
> pdev->irq); retval = -EBUSY;
> @@ -2338,7 +2344,7 @@ static int langwell_otg_resume(struct pc
>               goto error;
>       }
>  
> -     if (request_irq(pdev->irq, otg_irq, IRQF_SHARED,
> +     if (request_threaded_irq(pdev->irq, NULL, otg_irq,
> IRQF_SHARED, driver_name, lnw) != 0) {
>               dev_dbg(&pdev->dev, "request interrupt %d failed\n",
> pdev->irq); ret = -EBUSY;
> _______________________________________________
> MeeGo-kernel mailing list
> [email protected]
> http://lists.meego.com/listinfo/meego-kernel

[jacob pan]


-- 
Thanks

Jacob

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to