]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge tag 'musb-for-v3.8' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 12 Nov 2012 01:12:27 +0000 (17:12 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 12 Nov 2012 01:13:16 +0000 (17:13 -0800)
USB musb merge from Felipe:

"usb: musb: patches for v3.8 merge window

We have here the usual set of cleanups for the MUSB driver; a
big set of patches converting platform_device_del() and
platform_device_put() into platform_device_unregister().

Another big set was applied converting to module_platform_driver()
macro in order to reduce some boilerplate code from all glue
layers.

Other than that, we had a series fixing one known silicon errata
where we couldn't read a few registers. In order to fix that
we're now using shadow variables for reads and only writing
to the registers which are known to break functionality when
read."

16 files changed:
Documentation/devicetree/bindings/usb/am33xx-usb.txt
drivers/usb/musb/am35x.c
drivers/usb/musb/blackfin.c
drivers/usb/musb/cppi_dma.c
drivers/usb/musb/da8xx.c
drivers/usb/musb/davinci.c
drivers/usb/musb/musb_core.c
drivers/usb/musb/musb_core.h
drivers/usb/musb/musb_dsps.c
drivers/usb/musb/musb_gadget.c
drivers/usb/musb/musb_gadget_ep0.c
drivers/usb/musb/musb_host.c
drivers/usb/musb/musbhsdma.h
drivers/usb/musb/omap2430.c
drivers/usb/musb/tusb6010.c
drivers/usb/musb/ux500.c

index ca8fa56e9f03e6d5f6ad4a0f35885e9fb4fa66ed..a92250512a4efa43fc39d9a00e9a50954a388dc8 100644 (file)
@@ -3,12 +3,12 @@ AM33XX MUSB GLUE
  - ti,hwmods : must be "usb_otg_hs"
  - multipoint : Should be "1" indicating the musb controller supports
    multipoint. This is a MUSB configuration-specific setting.
- - num_eps : Specifies the number of endpoints. This is also a
+ - num-eps : Specifies the number of endpoints. This is also a
    MUSB configuration-specific setting. Should be set to "16"
- - ram_bits : Specifies the ram address size. Should be set to "12"
- - port0_mode : Should be "3" to represent OTG. "1" signifies HOST and "2"
+ - ram-bits : Specifies the ram address size. Should be set to "12"
+ - port0-mode : Should be "3" to represent OTG. "1" signifies HOST and "2"
    represents PERIPHERAL.
- - port1_mode : Should be "1" to represent HOST. "3" signifies OTG and "2"
+ - port1-mode : Should be "1" to represent HOST. "3" signifies OTG and "2"
    represents PERIPHERAL.
  - power : Should be "250". This signifies the controller can supply upto
    500mA when operating in host mode.
index c964d6af178bd0196e20a80bd482529c38369900..3baccf7654188c80bda9853bab8c5959cfe5e06f 100644 (file)
@@ -465,7 +465,6 @@ static int __devinit am35x_probe(struct platform_device *pdev)
        struct clk                      *clk;
 
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -473,18 +472,10 @@ static int __devinit am35x_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
        phy_clk = clk_get(&pdev->dev, "fck");
@@ -513,7 +504,6 @@ static int __devinit am35x_probe(struct platform_device *pdev)
                goto err6;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &am35x_dmamask;
        musb->dev.coherent_dma_mask     = am35x_dmamask;
@@ -563,9 +553,6 @@ err4:
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -577,9 +564,7 @@ static int __devexit am35x_remove(struct platform_device *pdev)
 {
        struct am35x_glue       *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        clk_disable(glue->clk);
        clk_disable(glue->phy_clk);
        clk_put(glue->clk);
@@ -654,15 +639,4 @@ static struct platform_driver am35x_driver = {
 MODULE_DESCRIPTION("AM35x MUSB Glue Layer");
 MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>");
 MODULE_LICENSE("GPL v2");
-
-static int __init am35x_init(void)
-{
-       return platform_driver_register(&am35x_driver);
-}
-module_init(am35x_init);
-
-static void __exit am35x_exit(void)
-{
-       platform_driver_unregister(&am35x_driver);
-}
-module_exit(am35x_exit);
+module_platform_driver(am35x_driver);
index e8cff9bb9d230a57c811573d58d101f1351ace27..7e4d60a41728090e35f7eba33b7cdd62887fd2b8 100644 (file)
@@ -455,7 +455,6 @@ static int __devinit bfin_probe(struct platform_device *pdev)
        struct bfin_glue                *glue;
 
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -463,21 +462,12 @@ static int __devinit bfin_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &bfin_dmamask;
        musb->dev.coherent_dma_mask     = bfin_dmamask;
@@ -513,9 +503,6 @@ static int __devinit bfin_probe(struct platform_device *pdev)
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -527,9 +514,7 @@ static int __devexit bfin_remove(struct platform_device *pdev)
 {
        struct bfin_glue                *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        kfree(glue);
 
        return 0;
@@ -585,15 +570,4 @@ static struct platform_driver bfin_driver = {
 MODULE_DESCRIPTION("Blackfin MUSB Glue Layer");
 MODULE_AUTHOR("Bryan Wy <cooloney@kernel.org>");
 MODULE_LICENSE("GPL v2");
-
-static int __init bfin_init(void)
-{
-       return platform_driver_register(&bfin_driver);
-}
-module_init(bfin_init);
-
-static void __exit bfin_exit(void)
-{
-       platform_driver_unregister(&bfin_driver);
-}
-module_exit(bfin_exit);
+module_platform_driver(bfin_driver);
index e19da82b478248bd81633875115ffaa9d1d0d50f..3a6c2fd1f913d1a3dbc75953c1103ebbdeff9b62 100644 (file)
@@ -1314,6 +1314,7 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id)
 
        return IRQ_HANDLED;
 }
+EXPORT_SYMBOL_GPL(cppi_interrupt);
 
 /* Instantiate a software object representing a DMA controller. */
 struct dma_controller *__devinit
index 8bc44b76eec2b3cd78e2d78c24e79568880d5b07..67b8ae704e9a93ac45536ba4820515e44725ed5d 100644 (file)
@@ -480,7 +480,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
        struct clk                      *clk;
 
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -488,18 +487,10 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
        clk = clk_get(&pdev->dev, "usb20");
@@ -515,7 +506,6 @@ static int __devinit da8xx_probe(struct platform_device *pdev)
                goto err4;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &da8xx_dmamask;
        musb->dev.coherent_dma_mask     = da8xx_dmamask;
@@ -558,9 +548,6 @@ err4:
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -572,9 +559,7 @@ static int __devexit da8xx_remove(struct platform_device *pdev)
 {
        struct da8xx_glue               *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        clk_disable(glue->clk);
        clk_put(glue->clk);
        kfree(glue);
@@ -593,15 +578,4 @@ static struct platform_driver da8xx_driver = {
 MODULE_DESCRIPTION("DA8xx/OMAP-L1x MUSB Glue Layer");
 MODULE_AUTHOR("Sergei Shtylyov <sshtylyov@ru.mvista.com>");
 MODULE_LICENSE("GPL v2");
-
-static int __init da8xx_init(void)
-{
-       return platform_driver_register(&da8xx_driver);
-}
-module_init(da8xx_init);
-
-static void __exit da8xx_exit(void)
-{
-       platform_driver_unregister(&da8xx_driver);
-}
-module_exit(da8xx_exit);
+module_platform_driver(da8xx_driver);
index 606bfd00cde6abe726ccf64b6b1f10a68e9ed1de..b3c0a943950c63c10f50979d8d4b1f4ac7afca75 100644 (file)
@@ -512,7 +512,6 @@ static int __devinit davinci_probe(struct platform_device *pdev)
        struct clk                      *clk;
 
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -520,18 +519,10 @@ static int __devinit davinci_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
        clk = clk_get(&pdev->dev, "usb");
@@ -547,7 +538,6 @@ static int __devinit davinci_probe(struct platform_device *pdev)
                goto err4;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &davinci_dmamask;
        musb->dev.coherent_dma_mask     = davinci_dmamask;
@@ -590,9 +580,6 @@ err4:
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -604,9 +591,7 @@ static int __devexit davinci_remove(struct platform_device *pdev)
 {
        struct davinci_glue             *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        clk_disable(glue->clk);
        clk_put(glue->clk);
        kfree(glue);
@@ -625,15 +610,4 @@ static struct platform_driver davinci_driver = {
 MODULE_DESCRIPTION("DaVinci MUSB Glue Layer");
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
 MODULE_LICENSE("GPL v2");
-
-static int __init davinci_init(void)
-{
-       return platform_driver_register(&davinci_driver);
-}
-module_init(davinci_init);
-
-static void __exit davinci_exit(void)
-{
-       platform_driver_unregister(&davinci_driver);
-}
-module_exit(davinci_exit);
+module_platform_driver(davinci_driver);
index bb56a0e8b23bf5620f0a5030e94e0f556e5da985..774d8154a28602ece397e96dca3a44821bca837d 100644 (file)
 
 #define MUSB_DRIVER_NAME "musb-hdrc"
 const char musb_driver_name[] = MUSB_DRIVER_NAME;
-static DEFINE_IDA(musb_ida);
 
 MODULE_DESCRIPTION(DRIVER_INFO);
 MODULE_AUTHOR(DRIVER_AUTHOR);
@@ -133,35 +132,6 @@ static inline struct musb *dev_to_musb(struct device *dev)
 
 /*-------------------------------------------------------------------------*/
 
-int musb_get_id(struct device *dev, gfp_t gfp_mask)
-{
-       int ret;
-       int id;
-
-       ret = ida_pre_get(&musb_ida, gfp_mask);
-       if (!ret) {
-               dev_err(dev, "failed to reserve resource for id\n");
-               return -ENOMEM;
-       }
-
-       ret = ida_get_new(&musb_ida, &id);
-       if (ret < 0) {
-               dev_err(dev, "failed to allocate a new id\n");
-               return ret;
-       }
-
-       return id;
-}
-EXPORT_SYMBOL_GPL(musb_get_id);
-
-void musb_put_id(struct device *dev, int id)
-{
-
-       dev_dbg(dev, "removing id %d\n", id);
-       ida_remove(&musb_ida, id);
-}
-EXPORT_SYMBOL_GPL(musb_put_id);
-
 #ifndef CONFIG_BLACKFIN
 static int musb_ulpi_read(struct usb_phy *phy, u32 offset)
 {
@@ -467,12 +437,12 @@ void musb_hnp_stop(struct musb *musb)
  */
 
 static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
-                               u8 devctl, u8 power)
+                               u8 devctl)
 {
        struct usb_otg *otg = musb->xceiv->otg;
        irqreturn_t handled = IRQ_NONE;
 
-       dev_dbg(musb->controller, "<== Power=%02x, DevCtl=%02x, int_usb=0x%x\n", power, devctl,
+       dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl,
                int_usb);
 
        /* in host mode, the peripheral may issue remote wakeup.
@@ -485,6 +455,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
 
                if (devctl & MUSB_DEVCTL_HM) {
                        void __iomem *mbase = musb->mregs;
+                       u8 power;
 
                        switch (musb->xceiv->state) {
                        case OTG_STATE_A_SUSPEND:
@@ -492,6 +463,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
                                 * will stop RESUME signaling
                                 */
 
+                               power = musb_readb(musb->mregs, MUSB_POWER);
                                if (power & MUSB_POWER_SUSPENDM) {
                                        /* spurious */
                                        musb->int_usb &= ~MUSB_INTR_SUSPEND;
@@ -655,8 +627,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
        }
 
        if (int_usb & MUSB_INTR_SUSPEND) {
-               dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x power %02x\n",
-                       otg_state_string(musb->xceiv->state), devctl, power);
+               dev_dbg(musb->controller, "SUSPEND (%s) devctl %02x\n",
+                       otg_state_string(musb->xceiv->state), devctl);
                handled = IRQ_HANDLED;
 
                switch (musb->xceiv->state) {
@@ -722,8 +694,10 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
                if (is_peripheral_active(musb)) {
                        /* REVISIT HNP; just force disconnect */
                }
-               musb_writew(musb->mregs, MUSB_INTRTXE, musb->epmask);
-               musb_writew(musb->mregs, MUSB_INTRRXE, musb->epmask & 0xfffe);
+               musb->intrtxe = musb->epmask;
+               musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe);
+               musb->intrrxe = musb->epmask & 0xfffe;
+               musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe);
                musb_writeb(musb->mregs, MUSB_INTRUSBE, 0xf7);
                musb->port1_status &= ~(USB_PORT_STAT_LOW_SPEED
                                        |USB_PORT_STAT_HIGH_SPEED
@@ -944,8 +918,10 @@ void musb_start(struct musb *musb)
        dev_dbg(musb->controller, "<== devctl %02x\n", devctl);
 
        /*  Set INT enable registers, enable interrupts */
-       musb_writew(regs, MUSB_INTRTXE, musb->epmask);
-       musb_writew(regs, MUSB_INTRRXE, musb->epmask & 0xfffe);
+       musb->intrtxe = musb->epmask;
+       musb_writew(regs, MUSB_INTRTXE, musb->intrtxe);
+       musb->intrrxe = musb->epmask & 0xfffe;
+       musb_writew(regs, MUSB_INTRRXE, musb->intrrxe);
        musb_writeb(regs, MUSB_INTRUSBE, 0xf7);
 
        musb_writeb(regs, MUSB_TESTMODE, 0);
@@ -983,7 +959,9 @@ static void musb_generic_disable(struct musb *musb)
 
        /* disable interrupts */
        musb_writeb(mbase, MUSB_INTRUSBE, 0);
+       musb->intrtxe = 0;
        musb_writew(mbase, MUSB_INTRTXE, 0);
+       musb->intrrxe = 0;
        musb_writew(mbase, MUSB_INTRRXE, 0);
 
        /* off */
@@ -1523,33 +1501,6 @@ static int __devinit musb_core_init(u16 musb_type, struct musb *musb)
 
 /*-------------------------------------------------------------------------*/
 
-#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430) || \
-       defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_ARCH_U8500)
-
-static irqreturn_t generic_interrupt(int irq, void *__hci)
-{
-       unsigned long   flags;
-       irqreturn_t     retval = IRQ_NONE;
-       struct musb     *musb = __hci;
-
-       spin_lock_irqsave(&musb->lock, flags);
-
-       musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
-       musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
-       musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
-
-       if (musb->int_usb || musb->int_tx || musb->int_rx)
-               retval = musb_interrupt(musb);
-
-       spin_unlock_irqrestore(&musb->lock, flags);
-
-       return retval;
-}
-
-#else
-#define generic_interrupt      NULL
-#endif
-
 /*
  * handle all the irqs defined by the HDRC core. for now we expect:  other
  * irq sources (phy, dma, etc) will be handled first, musb->int_* values
@@ -1560,12 +1511,11 @@ static irqreturn_t generic_interrupt(int irq, void *__hci)
 irqreturn_t musb_interrupt(struct musb *musb)
 {
        irqreturn_t     retval = IRQ_NONE;
-       u8              devctl, power;
+       u8              devctl;
        int             ep_num;
        u32             reg;
 
        devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
-       power = musb_readb(musb->mregs, MUSB_POWER);
 
        dev_dbg(musb->controller, "** IRQ %s usb%04x tx%04x rx%04x\n",
                (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral",
@@ -1576,7 +1526,7 @@ irqreturn_t musb_interrupt(struct musb *musb)
         */
        if (musb->int_usb)
                retval |= musb_stage0_irq(musb, musb->int_usb,
-                               devctl, power);
+                               devctl);
 
        /* "stage 1" is handling endpoint irqs */
 
@@ -1919,7 +1869,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
        musb->ops = plat->platform_ops;
 
        /* The musb_platform_init() call:
-        *   - adjusts musb->mregs and musb->isr if needed,
+        *   - adjusts musb->mregs
+        *   - sets the musb->isr
         *   - may initialize an integrated tranceiver
         *   - initializes musb->xceiv, usually by otg_get_phy()
         *   - stops powering VBUS
@@ -1929,7 +1880,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
         * external/discrete ones in various flavors (twl4030 family,
         * isp1504, non-OTG, etc) mostly hooking up through ULPI.
         */
-       musb->isr = generic_interrupt;
        status = musb_platform_init(musb);
        if (status < 0)
                goto fail1;
@@ -2120,8 +2070,6 @@ static void musb_save_context(struct musb *musb)
        musb->context.testmode = musb_readb(musb_base, MUSB_TESTMODE);
        musb->context.busctl = musb_read_ulpi_buscontrol(musb->mregs);
        musb->context.power = musb_readb(musb_base, MUSB_POWER);
-       musb->context.intrtxe = musb_readw(musb_base, MUSB_INTRTXE);
-       musb->context.intrrxe = musb_readw(musb_base, MUSB_INTRRXE);
        musb->context.intrusbe = musb_readb(musb_base, MUSB_INTRUSBE);
        musb->context.index = musb_readb(musb_base, MUSB_INDEX);
        musb->context.devctl = musb_readb(musb_base, MUSB_DEVCTL);
@@ -2194,8 +2142,8 @@ static void musb_restore_context(struct musb *musb)
        musb_writeb(musb_base, MUSB_TESTMODE, musb->context.testmode);
        musb_write_ulpi_buscontrol(musb->mregs, musb->context.busctl);
        musb_writeb(musb_base, MUSB_POWER, musb->context.power);
-       musb_writew(musb_base, MUSB_INTRTXE, musb->context.intrtxe);
-       musb_writew(musb_base, MUSB_INTRRXE, musb->context.intrrxe);
+       musb_writew(musb_base, MUSB_INTRTXE, musb->intrtxe);
+       musb_writew(musb_base, MUSB_INTRRXE, musb->intrrxe);
        musb_writeb(musb_base, MUSB_INTRUSBE, musb->context.intrusbe);
        musb_writeb(musb_base, MUSB_DEVCTL, musb->context.devctl);
 
index c158aacd6de881c8fea326e59ba93a89f5a096da..7fb4819a6f115f54d097ef09eb131fb820994d05 100644 (file)
@@ -288,7 +288,6 @@ struct musb_csr_regs {
 struct musb_context_registers {
 
        u8 power;
-       u16 intrtxe, intrrxe;
        u8 intrusbe;
        u16 frame;
        u8 index, testmode;
@@ -313,6 +312,8 @@ struct musb {
        struct work_struct      irq_work;
        u16                     hwvers;
 
+       u16                     intrrxe;
+       u16                     intrtxe;
 /* this hub status bit is reserved by USB 2.0 and not seen by usbcore */
 #define MUSB_PORT_STAT_RESUME  (1 << 31)
 
@@ -521,8 +522,6 @@ extern const char musb_driver_name[];
 
 extern void musb_start(struct musb *musb);
 extern void musb_stop(struct musb *musb);
-extern int musb_get_id(struct device *dev, gfp_t gfp_mask);
-extern void musb_put_id(struct device *dev, int id);
 
 extern void musb_write_fifo(struct musb_hw_ep *ep, u16 len, const u8 *src);
 extern void musb_read_fifo(struct musb_hw_ep *ep, u16 len, u8 *dst);
index ff5f112053d28f114e4d90844b7aa2172f3856d4..cf08966af5c217efe72624d0e893e30ab50df118 100644 (file)
@@ -124,8 +124,44 @@ struct dsps_glue {
        const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
        struct timer_list timer[2];     /* otg_workaround timer */
        unsigned long last_timer[2];    /* last timer data for each instance */
+       u32 __iomem *usb_ctrl[2];
 };
 
+#define        DSPS_AM33XX_CONTROL_MODULE_PHYS_0       0x44e10620
+#define        DSPS_AM33XX_CONTROL_MODULE_PHYS_1       0x44e10628
+
+static const resource_size_t dsps_control_module_phys[] = {
+       DSPS_AM33XX_CONTROL_MODULE_PHYS_0,
+       DSPS_AM33XX_CONTROL_MODULE_PHYS_1,
+};
+
+/**
+ * musb_dsps_phy_control - phy on/off
+ * @glue: struct dsps_glue *
+ * @id: musb instance
+ * @on: flag for phy to be switched on or off
+ *
+ * This is to enable the PHY using usb_ctrl register in system control
+ * module space.
+ *
+ * XXX: This function will be removed once we have a seperate driver for
+ * control module
+ */
+static void musb_dsps_phy_control(struct dsps_glue *glue, u8 id, u8 on)
+{
+       u32 usbphycfg;
+
+       usbphycfg = readl(glue->usb_ctrl[id]);
+
+       if (on) {
+               usbphycfg &= ~(USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN);
+               usbphycfg |= USBPHY_OTGVDET_EN | USBPHY_OTGSESSEND_EN;
+       } else {
+               usbphycfg |= USBPHY_CM_PWRDN | USBPHY_OTG_PWRDN;
+       }
+
+       writel(usbphycfg, glue->usb_ctrl[id]);
+}
 /**
  * dsps_musb_enable - enable interrupts
  */
@@ -365,11 +401,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci)
 static int dsps_musb_init(struct musb *musb)
 {
        struct device *dev = musb->controller;
-       struct musb_hdrc_platform_data *plat = dev->platform_data;
        struct platform_device *pdev = to_platform_device(dev);
        struct dsps_glue *glue = dev_get_drvdata(dev->parent);
        const struct dsps_musb_wrapper *wrp = glue->wrp;
-       struct omap_musb_board_data *data = plat->board_data;
        void __iomem *reg_base = musb->ctrl_base;
        u32 rev, val;
        int status;
@@ -377,7 +411,8 @@ static int dsps_musb_init(struct musb *musb)
        /* mentor core register starts at offset of 0x400 from musb base */
        musb->mregs += wrp->musb_core_offset;
 
-       /* Get the NOP PHY */
+       /* NOP driver needs change if supporting dual instance */
+       usb_nop_xceiv_register();
        musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
        if (IS_ERR_OR_NULL(musb->xceiv))
                return -ENODEV;
@@ -395,8 +430,7 @@ static int dsps_musb_init(struct musb *musb)
        dsps_writel(reg_base, wrp->control, (1 << wrp->reset));
 
        /* Start the on-chip PHY and its PLL. */
-       if (data->set_phy_power)
-               data->set_phy_power(1);
+       musb_dsps_phy_control(glue, pdev->id, 1);
 
        musb->isr = dsps_interrupt;
 
@@ -418,16 +452,13 @@ err0:
 static int dsps_musb_exit(struct musb *musb)
 {
        struct device *dev = musb->controller;
-       struct musb_hdrc_platform_data *plat = dev->platform_data;
-       struct omap_musb_board_data *data = plat->board_data;
        struct platform_device *pdev = to_platform_device(dev);
        struct dsps_glue *glue = dev_get_drvdata(dev->parent);
 
        del_timer_sync(&glue->timer[pdev->id]);
 
        /* Shutdown the on-chip PHY and its PLL. */
-       if (data->set_phy_power)
-               data->set_phy_power(0);
+       musb_dsps_phy_control(glue, pdev->id, 0);
 
        /* NOP driver needs change if supporting dual instance */
        usb_put_phy(musb->xceiv);
@@ -459,24 +490,33 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
        struct resource *res;
        struct resource resources[2];
        char res_name[11];
-       int ret, musbid;
+       int ret;
 
-       /* get memory resource */
-       snprintf(res_name, sizeof(res_name), "musb%d", id);
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, res_name);
+       resources[0].start = dsps_control_module_phys[id];
+       resources[0].end = resources[0].start + SZ_4 - 1;
+       resources[0].flags = IORESOURCE_MEM;
+
+       glue->usb_ctrl[id] = devm_request_and_ioremap(&pdev->dev, resources);
+       if (glue->usb_ctrl[id] == NULL) {
+               dev_err(dev, "Failed to obtain usb_ctrl%d memory\n", id);
+               ret = -ENODEV;
+               goto err0;
+       }
+
+       /* first resource is for usbss, so start index from 1 */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, id + 1);
        if (!res) {
-               dev_err(dev, "%s get mem resource failed\n", res_name);
+               dev_err(dev, "failed to get memory for instance %d\n", id);
                ret = -ENODEV;
                goto err0;
        }
        res->parent = NULL;
        resources[0] = *res;
 
-       /* get irq resource */
-       snprintf(res_name, sizeof(res_name), "musb%d-irq", id);
-       res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, res_name);
+       /* first resource is for usbss, so start index from 1 */
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, id + 1);
        if (!res) {
-               dev_err(dev, "%s get irq resource failed\n", res_name);
+               dev_err(dev, "failed to get irq for instance %d\n", id);
                ret = -ENODEV;
                goto err0;
        }
@@ -484,22 +524,14 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
        resources[1] = *res;
        resources[1].name = "mc";
 
-       /* get the musb id */
-       musbid = musb_get_id(dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err0;
-       }
        /* allocate the child platform device */
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(dev, "failed to allocate musb device\n");
                ret = -ENOMEM;
-               goto err1;
+               goto err0;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = dev;
        musb->dev.dma_mask              = &musb_dmamask;
        musb->dev.coherent_dma_mask     = musb_dmamask;
@@ -556,19 +588,10 @@ static int __devinit dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
 
 err2:
        platform_device_put(musb);
-err1:
-       musb_put_id(dev, musbid);
 err0:
        return ret;
 }
 
-static void dsps_delete_musb_pdev(struct dsps_glue *glue, u8 id)
-{
-       musb_put_id(glue->dev, glue->musb[id]->id);
-       platform_device_del(glue->musb[id]);
-       platform_device_put(glue->musb[id]);
-}
-
 static int __devinit dsps_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -628,7 +651,7 @@ static int __devinit dsps_probe(struct platform_device *pdev)
                        dev_err(&pdev->dev, "failed to create child pdev\n");
                        /* release resources of previously created instances */
                        for (i--; i >= 0 ; i--)
-                               dsps_delete_musb_pdev(glue, i);
+                               platform_device_unregister(glue->musb[i]);
                        goto err3;
                }
        }
@@ -653,7 +676,7 @@ static int __devexit dsps_remove(struct platform_device *pdev)
 
        /* delete the child platform device */
        for (i = 0; i < wrp->instances ; i++)
-               dsps_delete_musb_pdev(glue, i);
+               platform_device_unregister(glue->musb[i]);
 
        /* disable usbss clocks */
        pm_runtime_put(&pdev->dev);
@@ -666,24 +689,26 @@ static int __devexit dsps_remove(struct platform_device *pdev)
 #ifdef CONFIG_PM_SLEEP
 static int dsps_suspend(struct device *dev)
 {
-       struct musb_hdrc_platform_data *plat = dev->platform_data;
-       struct omap_musb_board_data *data = plat->board_data;
+       struct platform_device *pdev = to_platform_device(dev->parent);
+       struct dsps_glue *glue = platform_get_drvdata(pdev);
+       const struct dsps_musb_wrapper *wrp = glue->wrp;
+       int i;
 
-       /* Shutdown the on-chip PHY and its PLL. */
-       if (data->set_phy_power)
-               data->set_phy_power(0);
+       for (i = 0; i < wrp->instances; i++)
+               musb_dsps_phy_control(glue, i, 0);
 
        return 0;
 }
 
 static int dsps_resume(struct device *dev)
 {
-       struct musb_hdrc_platform_data *plat = dev->platform_data;
-       struct omap_musb_board_data *data = plat->board_data;
+       struct platform_device *pdev = to_platform_device(dev->parent);
+       struct dsps_glue *glue = platform_get_drvdata(pdev);
+       const struct dsps_musb_wrapper *wrp = glue->wrp;
+       int i;
 
-       /* Start the on-chip PHY and its PLL. */
-       if (data->set_phy_power)
-               data->set_phy_power(1);
+       for (i = 0; i < wrp->instances; i++)
+               musb_dsps_phy_control(glue, i, 1);
 
        return 0;
 }
@@ -719,7 +744,7 @@ static const struct dsps_musb_wrapper ti81xx_driver_data __devinitconst = {
        .rxep_bitmap            = (0xfffe << 16),
        .musb_core_offset       = 0x400,
        .poll_seconds           = 2,
-       .instances              = 2,
+       .instances              = 1,
 };
 
 static const struct platform_device_id musb_dsps_id_table[] __devinitconst = {
index d0b87e7b4abfd98b232c135df7661d6dbe0bfe90..28b9790e84ea9f225b59f36d226529716571778f 100644 (file)
@@ -1068,7 +1068,6 @@ static int musb_gadget_enable(struct usb_ep *ep,
         */
        musb_ep_select(mbase, epnum);
        if (usb_endpoint_dir_in(desc)) {
-               u16 int_txe = musb_readw(mbase, MUSB_INTRTXE);
 
                if (hw_ep->is_shared_fifo)
                        musb_ep->is_in = 1;
@@ -1080,8 +1079,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
                        goto fail;
                }
 
-               int_txe |= (1 << epnum);
-               musb_writew(mbase, MUSB_INTRTXE, int_txe);
+               musb->intrtxe |= (1 << epnum);
+               musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe);
 
                /* REVISIT if can_bulk_split(), use by updating "tmp";
                 * likewise high bandwidth periodic tx
@@ -1108,7 +1107,6 @@ static int musb_gadget_enable(struct usb_ep *ep,
                musb_writew(regs, MUSB_TXCSR, csr);
 
        } else {
-               u16 int_rxe = musb_readw(mbase, MUSB_INTRRXE);
 
                if (hw_ep->is_shared_fifo)
                        musb_ep->is_in = 0;
@@ -1120,8 +1118,8 @@ static int musb_gadget_enable(struct usb_ep *ep,
                        goto fail;
                }
 
-               int_rxe |= (1 << epnum);
-               musb_writew(mbase, MUSB_INTRRXE, int_rxe);
+               musb->intrrxe |= (1 << epnum);
+               musb_writew(mbase, MUSB_INTRRXE, musb->intrrxe);
 
                /* REVISIT if can_bulk_combine() use by updating "tmp"
                 * likewise high bandwidth periodic rx
@@ -1209,14 +1207,12 @@ static int musb_gadget_disable(struct usb_ep *ep)
 
        /* zero the endpoint sizes */
        if (musb_ep->is_in) {
-               u16 int_txe = musb_readw(musb->mregs, MUSB_INTRTXE);
-               int_txe &= ~(1 << epnum);
-               musb_writew(musb->mregs, MUSB_INTRTXE, int_txe);
+               musb->intrtxe &= ~(1 << epnum);
+               musb_writew(musb->mregs, MUSB_INTRTXE, musb->intrtxe);
                musb_writew(epio, MUSB_TXMAXP, 0);
        } else {
-               u16 int_rxe = musb_readw(musb->mregs, MUSB_INTRRXE);
-               int_rxe &= ~(1 << epnum);
-               musb_writew(musb->mregs, MUSB_INTRRXE, int_rxe);
+               musb->intrrxe &= ~(1 << epnum);
+               musb_writew(musb->mregs, MUSB_INTRRXE, musb->intrrxe);
                musb_writew(epio, MUSB_RXMAXP, 0);
        }
 
@@ -1532,7 +1528,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
        void __iomem    *epio = musb->endpoints[epnum].regs;
        void __iomem    *mbase;
        unsigned long   flags;
-       u16             csr, int_txe;
+       u16             csr;
 
        mbase = musb->mregs;
 
@@ -1540,8 +1536,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
        musb_ep_select(mbase, (u8) epnum);
 
        /* disable interrupts */
-       int_txe = musb_readw(mbase, MUSB_INTRTXE);
-       musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum));
+       musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe & ~(1 << epnum));
 
        if (musb_ep->is_in) {
                csr = musb_readw(epio, MUSB_TXCSR);
@@ -1565,7 +1560,7 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep)
        }
 
        /* re-enable interrupt */
-       musb_writew(mbase, MUSB_INTRTXE, int_txe);
+       musb_writew(mbase, MUSB_INTRTXE, musb->intrtxe);
        spin_unlock_irqrestore(&musb->lock, flags);
 }
 
@@ -2154,10 +2149,9 @@ __acquires(musb->lock)
        u8              devctl = musb_readb(mbase, MUSB_DEVCTL);
        u8              power;
 
-       dev_dbg(musb->controller, "<== %s addr=%x driver '%s'\n",
+       dev_dbg(musb->controller, "<== %s driver '%s'\n",
                        (devctl & MUSB_DEVCTL_BDEVICE)
                                ? "B-Device" : "A-Device",
-                       musb_readb(mbase, MUSB_FADDR),
                        musb->gadget_driver
                                ? musb->gadget_driver->driver.name
                                : NULL
index e40d7647caf1c636a52d6e539f53c78360062a62..c9c1ac4e075f758ae01eaf0a79b738ee41da0611 100644 (file)
@@ -673,10 +673,8 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
        csr = musb_readw(regs, MUSB_CSR0);
        len = musb_readb(regs, MUSB_COUNT0);
 
-       dev_dbg(musb->controller, "csr %04x, count %d, myaddr %d, ep0stage %s\n",
-                       csr, len,
-                       musb_readb(mbase, MUSB_FADDR),
-                       decode_ep0stage(musb->ep0_state));
+       dev_dbg(musb->controller, "csr %04x, count %d, ep0stage %s\n",
+                       csr, len, decode_ep0stage(musb->ep0_state));
 
        if (csr & MUSB_CSR0_P_DATAEND) {
                /*
index 3df6a76b851dbefc91c6d5488570f9d53813a59b..e9f0fd9ddd2d05284283ee3448785984cc760c10 100644 (file)
@@ -740,7 +740,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
                csr = musb_readw(epio, MUSB_TXCSR);
 
                /* disable interrupt in case we flush */
-               int_txe = musb_readw(mbase, MUSB_INTRTXE);
+               int_txe = musb->intrtxe;
                musb_writew(mbase, MUSB_INTRTXE, int_txe & ~(1 << epnum));
 
                /* general endpoint setup */
index 320fd4afb93f7cd31b05e26e125819ae03af95c2..f7b13fd252574f848e7984905cbaef4478c2e90a 100644 (file)
  *
  */
 
-#if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
-#include "omap2430.h"
-#endif
-
 #ifndef CONFIG_BLACKFIN
 
 #define MUSB_HSDMA_BASE                0x200
index a538fe17a966b0932400a3be02087be1aec5f26c..32f531e7a2e6ff48db2b4f5d9a8f8f4c1572d65a 100644 (file)
@@ -333,6 +333,26 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work)
        omap_musb_set_mailbox(glue);
 }
 
+static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci)
+{
+       unsigned long   flags;
+       irqreturn_t     retval = IRQ_NONE;
+       struct musb     *musb = __hci;
+
+       spin_lock_irqsave(&musb->lock, flags);
+
+       musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
+       musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
+       musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
+
+       if (musb->int_usb || musb->int_tx || musb->int_rx)
+               retval = musb_interrupt(musb);
+
+       spin_unlock_irqrestore(&musb->lock, flags);
+
+       return retval;
+}
+
 static int omap2430_musb_init(struct musb *musb)
 {
        u32 l;
@@ -352,6 +372,8 @@ static int omap2430_musb_init(struct musb *musb)
                return -ENODEV;
        }
 
+       musb->isr = omap2430_musb_interrupt;
+
        status = pm_runtime_get_sync(dev);
        if (status < 0) {
                dev_err(dev, "pm_runtime_get_sync FAILED %d\n", status);
@@ -478,7 +500,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
        struct musb_hdrc_config         *config;
        struct resource                 *res;
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -486,21 +507,12 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err0;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err1;
+               goto err0;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &omap2430_dmamask;
        musb->dev.coherent_dma_mask     = omap2430_dmamask;
@@ -521,7 +533,7 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
                        dev_err(&pdev->dev,
                                "failed to allocate musb platfrom data\n");
                        ret = -ENOMEM;
-                       goto err1;
+                       goto err2;
                }
 
                data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
@@ -529,14 +541,14 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
                        dev_err(&pdev->dev,
                                        "failed to allocate musb board data\n");
                        ret = -ENOMEM;
-                       goto err1;
+                       goto err2;
                }
 
                config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
                if (!data) {
                        dev_err(&pdev->dev,
                                "failed to allocate musb hdrc config\n");
-                       goto err1;
+                       goto err2;
                }
 
                of_property_read_u32(np, "mode", (u32 *)&pdata->mode);
@@ -589,9 +601,6 @@ static int __devinit omap2430_probe(struct platform_device *pdev)
 err2:
        platform_device_put(musb);
 
-err1:
-       musb_put_id(&pdev->dev, musbid);
-
 err0:
        return ret;
 }
@@ -601,7 +610,6 @@ static int __devexit omap2430_remove(struct platform_device *pdev)
        struct omap2430_glue            *glue = platform_get_drvdata(pdev);
 
        cancel_work_sync(&glue->omap_musb_mailbox_work);
-       musb_put_id(&pdev->dev, glue->musb->id);
        platform_device_unregister(glue->musb);
 
        return 0;
index dc4d75ea13adb4059a6aba4cad92f269279b8ce4..812719b683d1a858a976f31aa4efd4af6f3ad494 100644 (file)
@@ -1160,7 +1160,6 @@ static int __devinit tusb_probe(struct platform_device *pdev)
        struct tusb6010_glue            *glue;
 
        int                             ret = -ENOMEM;
-       int                             musbid;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
        if (!glue) {
@@ -1168,21 +1167,12 @@ static int __devinit tusb_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &tusb_dmamask;
        musb->dev.coherent_dma_mask     = tusb_dmamask;
@@ -1218,9 +1208,6 @@ static int __devinit tusb_probe(struct platform_device *pdev)
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -1232,9 +1219,7 @@ static int __devexit tusb_remove(struct platform_device *pdev)
 {
        struct tusb6010_glue            *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        kfree(glue);
 
        return 0;
@@ -1251,15 +1236,4 @@ static struct platform_driver tusb_driver = {
 MODULE_DESCRIPTION("TUSB6010 MUSB Glue Layer");
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
 MODULE_LICENSE("GPL v2");
-
-static int __init tusb_init(void)
-{
-       return platform_driver_register(&tusb_driver);
-}
-module_init(tusb_init);
-
-static void __exit tusb_exit(void)
-{
-       platform_driver_unregister(&tusb_driver);
-}
-module_exit(tusb_exit);
+module_platform_driver(tusb_driver);
index d62a91fedc221c02774de2c8b9c9e66c3a880ade..286f1be6594acd8c56a5e55e010c69e853adab6a 100644 (file)
@@ -36,6 +36,26 @@ struct ux500_glue {
 };
 #define glue_to_musb(g)        platform_get_drvdata(g->musb)
 
+static irqreturn_t ux500_musb_interrupt(int irq, void *__hci)
+{
+       unsigned long   flags;
+       irqreturn_t     retval = IRQ_NONE;
+       struct musb     *musb = __hci;
+
+       spin_lock_irqsave(&musb->lock, flags);
+
+       musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB);
+       musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX);
+       musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX);
+
+       if (musb->int_usb || musb->int_tx || musb->int_rx)
+               retval = musb_interrupt(musb);
+
+       spin_unlock_irqrestore(&musb->lock, flags);
+
+       return retval;
+}
+
 static int ux500_musb_init(struct musb *musb)
 {
        musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
@@ -44,6 +64,8 @@ static int ux500_musb_init(struct musb *musb)
                return -ENODEV;
        }
 
+       musb->isr = ux500_musb_interrupt;
+
        return 0;
 }
 
@@ -65,7 +87,6 @@ static int __devinit ux500_probe(struct platform_device *pdev)
        struct platform_device          *musb;
        struct ux500_glue               *glue;
        struct clk                      *clk;
-
        int                             ret = -ENOMEM;
 
        glue = kzalloc(sizeof(*glue), GFP_KERNEL);
@@ -74,18 +95,10 @@ static int __devinit ux500_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       /* get the musb id */
-       musbid = musb_get_id(&pdev->dev, GFP_KERNEL);
-       if (musbid < 0) {
-               dev_err(&pdev->dev, "failed to allocate musb id\n");
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       musb = platform_device_alloc("musb-hdrc", musbid);
+       musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err2;
+               goto err1;
        }
 
        clk = clk_get(&pdev->dev, "usb");
@@ -101,7 +114,6 @@ static int __devinit ux500_probe(struct platform_device *pdev)
                goto err4;
        }
 
-       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = pdev->dev.dma_mask;
        musb->dev.coherent_dma_mask     = pdev->dev.coherent_dma_mask;
@@ -144,9 +156,6 @@ err4:
 err3:
        platform_device_put(musb);
 
-err2:
-       musb_put_id(&pdev->dev, musbid);
-
 err1:
        kfree(glue);
 
@@ -158,9 +167,7 @@ static int __devexit ux500_remove(struct platform_device *pdev)
 {
        struct ux500_glue       *glue = platform_get_drvdata(pdev);
 
-       musb_put_id(&pdev->dev, glue->musb->id);
-       platform_device_del(glue->musb);
-       platform_device_put(glue->musb);
+       platform_device_unregister(glue->musb);
        clk_disable(glue->clk);
        clk_put(glue->clk);
        kfree(glue);
@@ -219,15 +226,4 @@ static struct platform_driver ux500_driver = {
 MODULE_DESCRIPTION("UX500 MUSB Glue Layer");
 MODULE_AUTHOR("Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>");
 MODULE_LICENSE("GPL v2");
-
-static int __init ux500_init(void)
-{
-       return platform_driver_register(&ux500_driver);
-}
-module_init(ux500_init);
-
-static void __exit ux500_exit(void)
-{
-       platform_driver_unregister(&ux500_driver);
-}
-module_exit(ux500_exit);
+module_platform_driver(ux500_driver);