From 4b2308ce699b9c599dd6e6acf57ac11f483381d9 Mon Sep 17 00:00:00 2001 From: Dorian Snyder Date: Wed, 12 Jun 2013 02:24:45 -0700 Subject: d710: initial support for the Epic 4G Touch (SPH-D710) Change-Id: Iafbd9fb45253b02d539ac0ba114f57b3bf9eeed4 --- drivers/usb/core/quirks.c | 6 ++++-- drivers/usb/core/sec-dock.h | 7 +++++-- drivers/usb/gadget/epautoconf.c | 5 +++++ drivers/usb/gadget/s3c_udc.h | 2 +- drivers/usb/gadget/s3c_udc_otg.c | 19 ++++++++++++------- drivers/usb/host/ehci-s5p.c | 2 ++ drivers/usb/host/ohci-s5p.c | 13 +++++++++---- 7 files changed, 38 insertions(+), 16 deletions(-) (limited to 'drivers/usb') diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index df6cfa4..5da45eb 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -173,9 +173,11 @@ static const struct usb_device_id usb_quirk_list[] = { { USB_DEVICE(0x04cc, 0x2333), .driver_info = USB_QUIRK_HSIC_TUNE }, /* Qualcomm MDM9x15 */ - { USB_DEVICE(0x05c6, 0x9048), .driver_info = USB_QUIRK_HSIC_TUNE }, + { USB_DEVICE(0x05c6, 0x9048), + .driver_info = USB_QUIRK_HSIC_TUNE | USB_QUIRK_NO_DPM_RESUME}, - { USB_DEVICE(0x05c6, 0x904C), .driver_info = USB_QUIRK_HSIC_TUNE }, + { USB_DEVICE(0x05c6, 0x904C), + .driver_info = USB_QUIRK_HSIC_TUNE | USB_QUIRK_NO_DPM_RESUME}, { } /* terminating entry must be last */ }; diff --git a/drivers/usb/core/sec-dock.h b/drivers/usb/core/sec-dock.h index 73c4ea6..4fdf351 100644 --- a/drivers/usb/core/sec-dock.h +++ b/drivers/usb/core/sec-dock.h @@ -23,7 +23,8 @@ static struct usb_device_id battery_notify_exception_table[] = { { USB_DEVICE(0x1519, 0x0020), }, /* HSIC Device */ { USB_DEVICE(0x05c6, 0x904c), }, /* Qualcomm modem */ { USB_DEVICE(0x05c6, 0x9008), }, /* Qualcomm modem */ -{ USB_DEVICE(0x08bb, 0x27c4), }, /* TI USB Audio DAC */ +{ USB_DEVICE(0x08bb, 0x2704), }, /* TI USB Audio DAC 1 */ +{ USB_DEVICE(0x08bb, 0x27c4), }, /* TI USB Audio DAC 2 */ { } /* Terminating entry */ }; @@ -79,7 +80,9 @@ static int call_battery_notify(struct usb_device *dev, bool bOnOff) /* Smart Dock hub must be skipped */ if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a40 && - le16_to_cpu(dev->descriptor.idProduct) == 0x0101)) { + le16_to_cpu(dev->descriptor.idProduct) == 0x0101) || + (le16_to_cpu(dev->descriptor.idVendor) == 0x0424 && + le16_to_cpu(dev->descriptor.idProduct) == 0x2514)) { if (bOnOff) is_smartdock = 1; else diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index 212f8fc..da8482e 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c @@ -345,6 +345,11 @@ struct usb_ep *usb_ep_autoconfig ( #endif if (ep && ep_matches (gadget, ep, desc)) return ep; + } else if (USB_ENDPOINT_XFER_ISOC == type + && (USB_DIR_IN & desc->bEndpointAddress)) { + ep = find_ep(gadget, "ep15-iso"); + if (ep && ep_matches(gadget, ep, desc)) + return ep; } } diff --git a/drivers/usb/gadget/s3c_udc.h b/drivers/usb/gadget/s3c_udc.h index c6bf986..03ee411 100644 --- a/drivers/usb/gadget/s3c_udc.h +++ b/drivers/usb/gadget/s3c_udc.h @@ -92,7 +92,7 @@ */ typedef enum ep_type { - ep_control, ep_bulk_in, ep_bulk_out, ep_interrupt + ep_control, ep_bulk_in, ep_bulk_out, ep_interrupt, ep_iso_in } ep_type_t; struct s3c_ep { diff --git a/drivers/usb/gadget/s3c_udc_otg.c b/drivers/usb/gadget/s3c_udc_otg.c index a4f33cd..6a28e4f 100644 --- a/drivers/usb/gadget/s3c_udc_otg.c +++ b/drivers/usb/gadget/s3c_udc_otg.c @@ -672,13 +672,17 @@ static void set_max_pktsize(struct s3c_udc *dev, enum usb_device_speed speed) } else { ep0_fifo_size = 64; ep_fifo_size = 64; - ep_fifo_size2 = 64; + ep_fifo_size2 = 1023; dev->gadget.speed = USB_SPEED_FULL; } dev->ep[0].ep.maxpacket = ep0_fifo_size; - for (i = 1; i < S3C_MAX_ENDPOINTS; i++) - dev->ep[i].ep.maxpacket = ep_fifo_size; + for (i = 1; i < S3C_MAX_ENDPOINTS; i++) { + if (dev->ep[i].bmAttributes == USB_ENDPOINT_XFER_ISOC) + dev->ep[i].ep.maxpacket = ep_fifo_size2; + else + dev->ep[i].ep.maxpacket = ep_fifo_size; + } /* EP0 - Control IN (64 bytes)*/ ep_ctrl = __raw_readl(dev->regs + S3C_UDC_OTG_DIEPCTL(EP0_CON)); @@ -710,6 +714,7 @@ static int s3c_ep_enable(struct usb_ep *_ep, /* xfer types must match, except that interrupt ~= bulk */ if (ep->bmAttributes != desc->bmAttributes && ep->bmAttributes != USB_ENDPOINT_XFER_BULK + && ep->bmAttributes != USB_ENDPOINT_XFER_ISOC && desc->bmAttributes != USB_ENDPOINT_XFER_INT) { DEBUG("%s: %s type mismatch\n", __func__, _ep->name); @@ -1176,16 +1181,16 @@ static struct s3c_udc memory = { }, .ep[15] = { .ep = { - .name = "ep15-int", + .name = "ep15-iso", .ops = &s3c_ep_ops, - .maxpacket = EP_FIFO_SIZE, + .maxpacket = EP_FIFO_SIZE2, }, .dev = &memory, .bEndpointAddress = USB_DIR_IN | 15, - .bmAttributes = USB_ENDPOINT_XFER_INT, + .bmAttributes = USB_ENDPOINT_XFER_ISOC, - .ep_type = ep_interrupt, + .ep_type = ep_iso_in, .fifo = (unsigned int) S3C_UDC_OTG_EP15_FIFO, }, }; diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index 78399c2..3ef4856 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c @@ -375,6 +375,8 @@ static int s5p_ehci_runtime_resume(struct device *dev) usb_root_hub_lost_power(hcd->self.root_hub); ehci_writel(ehci, FLAG_CF, &ehci->regs->configured_flag); + ehci_writel(ehci, INTR_MASK, &ehci->regs->intr_enable); + (void)ehci_readl(ehci, &ehci->regs->intr_enable); /* here we "know" root ports should always stay powered */ ehci_port_power(ehci, 1); diff --git a/drivers/usb/host/ohci-s5p.c b/drivers/usb/host/ohci-s5p.c index 641e40c..68eecfd 100644 --- a/drivers/usb/host/ohci-s5p.c +++ b/drivers/usb/host/ohci-s5p.c @@ -173,16 +173,18 @@ static int ohci_hcd_s5p_drv_runtime_resume(struct device *dev) struct s5p_ohci_platdata *pdata = pdev->dev.platform_data; struct s5p_ohci_hcd *s5p_ohci = platform_get_drvdata(pdev); struct usb_hcd *hcd = s5p_ohci->hcd; + int ret = 0; if (dev->power.is_suspended) return 0; if (pdata->phy_resume) - pdata->phy_resume(pdev, S5P_USB_PHY_HOST); - /* Mark hardware accessible again as we are out of D3 state by now */ - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + ret = pdata->phy_resume(pdev, S5P_USB_PHY_HOST); - ohci_finish_controller_resume(hcd); + if (!ret) { + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + ohci_finish_controller_resume(hcd); + } return 0; } @@ -473,6 +475,9 @@ static void ohci_hcd_s5p_drv_shutdown(struct platform_device *pdev) if (hcd->driver->shutdown) hcd->driver->shutdown(hcd); + + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + } static const struct dev_pm_ops ohci_s5p_pm_ops = { -- cgit v1.1