]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/usb/gadget/udc/renesas_usb3.c
Merge tag 'usb-for-v5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb...
[linux.git] / drivers / usb / gadget / udc / renesas_usb3.c
index 1f4c3fbd1df8b37d1d2f8cd82470171be2ae9985..c5c3c14df67acdd97903a2706c3b7777982fa7c8 100644 (file)
@@ -775,6 +775,18 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3)
        usb3_transition_to_default_state(usb3, false);
 }
 
+static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3)
+{
+       usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND);
+
+       if (usb3->gadget.speed != USB_SPEED_UNKNOWN &&
+           usb3->gadget.state != USB_STATE_NOTATTACHED) {
+               if (usb3->driver && usb3->driver->suspend)
+                       usb3->driver->suspend(&usb3->gadget);
+               usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED);
+       }
+}
+
 static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3)
 {
        usb3_stop_usb3_connection(usb3);
@@ -860,6 +872,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1)
        if (int_sta_1 & USB_INT_1_B2_RSUM)
                usb3_irq_epc_int_1_resume(usb3);
 
+       if (int_sta_1 & USB_INT_1_B2_SPND)
+               usb3_irq_epc_int_1_suspend(usb3);
+
        if (int_sta_1 & USB_INT_1_SPEED)
                usb3_irq_epc_int_1_speed(usb3);
 
@@ -1544,10 +1559,10 @@ static void usb3_set_device_address(struct renesas_usb3 *usb3, u16 addr)
 static bool usb3_std_req_set_address(struct renesas_usb3 *usb3,
                                     struct usb_ctrlrequest *ctrl)
 {
-       if (ctrl->wValue >= 128)
+       if (le16_to_cpu(ctrl->wValue) >= 128)
                return true;    /* stall */
 
-       usb3_set_device_address(usb3, ctrl->wValue);
+       usb3_set_device_address(usb3, le16_to_cpu(ctrl->wValue));
        usb3_set_p0_con_for_no_data(usb3);
 
        return false;
@@ -1582,6 +1597,7 @@ static bool usb3_std_req_get_status(struct renesas_usb3 *usb3,
        struct renesas_usb3_ep *usb3_ep;
        int num;
        u16 status = 0;
+       __le16 tx_data;
 
        switch (ctrl->bRequestType & USB_RECIP_MASK) {
        case USB_RECIP_DEVICE:
@@ -1604,10 +1620,10 @@ static bool usb3_std_req_get_status(struct renesas_usb3 *usb3,
        }
 
        if (!stall) {
-               status = cpu_to_le16(status);
+               tx_data = cpu_to_le16(status);
                dev_dbg(usb3_to_dev(usb3), "get_status: req = %p\n",
                        usb_req_to_usb3_req(usb3->ep0_req));
-               usb3_pipe0_internal_xfer(usb3, &status, sizeof(status),
+               usb3_pipe0_internal_xfer(usb3, &tx_data, sizeof(tx_data),
                                         usb3_pipe0_get_status_completion);
        }
 
@@ -1772,7 +1788,7 @@ static bool usb3_std_req_set_sel(struct renesas_usb3 *usb3,
 static bool usb3_std_req_set_configuration(struct renesas_usb3 *usb3,
                                           struct usb_ctrlrequest *ctrl)
 {
-       if (ctrl->wValue > 0)
+       if (le16_to_cpu(ctrl->wValue) > 0)
                usb3_set_bit(usb3, USB_COM_CON_CONF, USB3_USB_COM_CON);
        else
                usb3_clear_bit(usb3, USB_COM_CON_CONF, USB3_USB_COM_CON);
@@ -2535,7 +2551,7 @@ static const struct file_operations renesas_usb3_b_device_fops = {
 static void renesas_usb3_debugfs_init(struct renesas_usb3 *usb3,
                                      struct device *dev)
 {
-       usb3->dentry = debugfs_create_dir(dev_name(dev), NULL);
+       usb3->dentry = debugfs_create_dir(dev_name(dev), usb_debug_root);
 
        debugfs_create_file("b_device", 0644, usb3->dentry, usb3,
                            &renesas_usb3_b_device_fops);
@@ -2732,7 +2748,6 @@ static struct usb_role_switch_desc renesas_usb3_role_switch_desc = {
 static int renesas_usb3_probe(struct platform_device *pdev)
 {
        struct renesas_usb3 *usb3;
-       struct resource *res;
        int irq, ret;
        const struct renesas_usb3_priv *priv;
        const struct soc_device_attribute *attr;
@@ -2744,17 +2759,14 @@ static int renesas_usb3_probe(struct platform_device *pdev)
                priv = of_device_get_match_data(&pdev->dev);
 
        irq = platform_get_irq(pdev, 0);
-       if (irq < 0) {
-               dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq);
+       if (irq < 0)
                return irq;
-       }
 
        usb3 = devm_kzalloc(&pdev->dev, sizeof(*usb3), GFP_KERNEL);
        if (!usb3)
                return -ENOMEM;
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       usb3->reg = devm_ioremap_resource(&pdev->dev, res);
+       usb3->reg = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(usb3->reg))
                return PTR_ERR(usb3->reg);