]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/usb/musb/tusb6010.c
Merge tag 'musb-for-v3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi...
[mirror_ubuntu-jammy-kernel.git] / drivers / usb / musb / tusb6010.c
index 1a1bd9cf40c5ce7c1d6f7ef1ac46360d0b6884a4..dc4d75ea13adb4059a6aba4cad92f269279b8ce4 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/irq.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
+#include <linux/usb/nop-usb-xceiv.h>
 
 #include "musb_core.h"
 
@@ -153,7 +154,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len)
 }
 
 static inline void tusb_fifo_read_unaligned(void __iomem *fifo,
-                                               void __iomem *buf, u16 len)
+                                               void *buf, u16 len)
 {
        u32             val;
        int             i;
@@ -437,14 +438,13 @@ static void musb_do_idle(unsigned long _musb)
                if (is_host_active(musb) && (musb->port1_status >> 16))
                        goto done;
 
-               if (is_peripheral_enabled(musb) && !musb->gadget_driver) {
+               if (!musb->gadget_driver) {
                        wakeups = 0;
                } else {
                        wakeups = TUSB_PRCM_WHOSTDISCON
                                | TUSB_PRCM_WBUS
                                        | TUSB_PRCM_WVBUS;
-                       if (is_otg_enabled(musb))
-                               wakeups |= TUSB_PRCM_WID;
+                       wakeups |= TUSB_PRCM_WID;
                }
                tusb_allow_idle(musb, wakeups);
        }
@@ -582,21 +582,12 @@ static void tusb_musb_set_vbus(struct musb *musb, int is_on)
  *
  * Note that if a mini-A cable is plugged in the ID line will stay down as
  * the weak ID pull-up is not able to pull the ID up.
- *
- * REVISIT: It would be possible to add support for changing between host
- * and peripheral modes in non-OTG configurations by reconfiguring hardware
- * and then setting musb->board_mode. For now, only support OTG mode.
  */
 static int tusb_musb_set_mode(struct musb *musb, u8 musb_mode)
 {
        void __iomem    *tbase = musb->ctrl_base;
        u32             otg_stat, phy_otg_ctrl, phy_otg_ena, dev_conf;
 
-       if (musb->board_mode != MUSB_OTG) {
-               ERR("Changing mode currently only supported in OTG mode\n");
-               return -EINVAL;
-       }
-
        otg_stat = musb_readl(tbase, TUSB_DEV_OTG_STAT);
        phy_otg_ctrl = musb_readl(tbase, TUSB_PHY_OTG_CTRL);
        phy_otg_ena = musb_readl(tbase, TUSB_PHY_OTG_CTRL_ENABLE);
@@ -652,10 +643,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
        if ((int_src & TUSB_INT_SRC_ID_STATUS_CHNG)) {
                int     default_a;
 
-               if (is_otg_enabled(musb))
-                       default_a = !(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS);
-               else
-                       default_a = is_host_enabled(musb);
+               default_a = !(otg_stat & TUSB_DEV_OTG_STAT_ID_STATUS);
                dev_dbg(musb->controller, "Default-%c\n", default_a ? 'A' : 'B');
                otg->default_a = default_a;
                tusb_musb_set_vbus(musb, default_a);
@@ -669,8 +657,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
        if (int_src & TUSB_INT_SRC_VBUS_SENSE_CHNG) {
 
                /* B-dev state machine:  no vbus ~= disconnect */
-               if ((is_otg_enabled(musb) && !otg->default_a)
-                               || !is_host_enabled(musb)) {
+               if (!otg->default_a) {
                        /* ? musb_root_disconnect(musb); */
                        musb->port1_status &=
                                ~(USB_PORT_STAT_CONNECTION
@@ -1119,10 +1106,8 @@ static int tusb_musb_init(struct musb *musb)
        }
        musb->isr = tusb_musb_interrupt;
 
-       if (is_peripheral_enabled(musb)) {
-               musb->xceiv->set_power = tusb_draw_power;
-               the_musb = musb;
-       }
+       musb->xceiv->set_power = tusb_draw_power;
+       the_musb = musb;
 
        setup_timer(&musb_idle_timer, musb_do_idle, (unsigned long) musb);
 
@@ -1175,6 +1160,7 @@ 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) {
@@ -1182,12 +1168,21 @@ static int __devinit tusb_probe(struct platform_device *pdev)
                goto err0;
        }
 
-       musb = platform_device_alloc("musb-hdrc", -1);
+       /* 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);
        if (!musb) {
                dev_err(&pdev->dev, "failed to allocate musb device\n");
-               goto err1;
+               goto err2;
        }
 
+       musb->id                        = musbid;
        musb->dev.parent                = &pdev->dev;
        musb->dev.dma_mask              = &tusb_dmamask;
        musb->dev.coherent_dma_mask     = tusb_dmamask;
@@ -1203,26 +1198,29 @@ static int __devinit tusb_probe(struct platform_device *pdev)
                        pdev->num_resources);
        if (ret) {
                dev_err(&pdev->dev, "failed to add resources\n");
-               goto err2;
+               goto err3;
        }
 
        ret = platform_device_add_data(musb, pdata, sizeof(*pdata));
        if (ret) {
                dev_err(&pdev->dev, "failed to add platform_data\n");
-               goto err2;
+               goto err3;
        }
 
        ret = platform_device_add(musb);
        if (ret) {
                dev_err(&pdev->dev, "failed to register musb device\n");
-               goto err1;
+               goto err3;
        }
 
        return 0;
 
-err2:
+err3:
        platform_device_put(musb);
 
+err2:
+       musb_put_id(&pdev->dev, musbid);
+
 err1:
        kfree(glue);
 
@@ -1234,6 +1232,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);
        kfree(glue);