USB fixes for 3.10-rc2
Here are a number of tiny USB bugfixes / new device ids for 3.10-rc2 The majority of these are USB gadget fixes, but they are all small. Other than that, some USB host controller fixes, and USB serial driver fixes for problems reported with them. Also hopefully a fixed up USB_OTG Kconfig dependancy, that one seems to be almost impossible to get right for all of the different platforms these days. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAlGeP/gACgkQMUfUDdst+ykXygCfeIL5/HMREhUSHQgb6IiIDR81 QHAAn0zJfRAyWUz4AtbrRsLSVfk3Q9vm =DQIq -----END PGP SIGNATURE----- Merge tag 'usb-3.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg Kroah-Hartman: "Here are a number of tiny USB bugfixes / new device ids for 3.10-rc2 The majority of these are USB gadget fixes, but they are all small. Other than that, some USB host controller fixes, and USB serial driver fixes for problems reported with them. Also hopefully a fixed up USB_OTG Kconfig dependancy, that one seems to be almost impossible to get right for all of the different platforms these days." * tag 'usb-3.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (56 commits) USB: cxacru: potential underflow in cxacru_cm_get_array() USB: ftdi_sio: Add support for Newport CONEX motor drivers USB: option: add device IDs for Dell 5804 (Novatel E371) WWAN card usb: ohci: fix goto wrong tag in err case usb: isp1760-if: fix memleak when platform_get_resource fail usb: ehci-s5p: fix memleak when fallback to pdata USB: serial: clean up chars_in_buffer USB: ti_usb_3410_5052: fix chars_in_buffer overhead USB: io_ti: fix chars_in_buffer overhead USB: ftdi_sio: fix chars_in_buffer overhead USB: ftdi_sio: clean up get_modem_status USB: serial: add generic wait_until_sent implementation USB: serial: add wait_until_sent operation USB: set device dma_mask without reference to global data USB: Blacklisted Cinterion's PLxx WWAN Interface usb: option: Add Telewell TW-LTE 4G USB: EHCI: remove bogus #error USB: reset resume quirk needed by a hub USB: usb-stor: realtek_cr: Fix compile error usb, chipidea: fix link error when USB_EHCI_HCD is a module ...
This commit is contained in:
commit
b64194068b
|
@ -199,7 +199,6 @@ CONFIG_USB_PHY=y
|
|||
CONFIG_USB_DEBUG=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
|
|
|
@ -204,7 +204,6 @@ CONFIG_USB=y
|
|||
CONFIG_USB_DEBUG=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_WDM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
|
|
|
@ -228,7 +228,6 @@ CONFIG_HIDRAW=y
|
|||
CONFIG_USB_HID=y
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
CONFIG_USB_EHCI_TT_NEWSCHED=y
|
||||
|
|
|
@ -344,7 +344,6 @@ CONFIG_UHID=y
|
|||
CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DYNAMIC_MINORS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD_PLATFORM=y
|
||||
CONFIG_USB_EHCI_ROOT_HUB_TT=y
|
||||
|
|
|
@ -300,7 +300,6 @@ CONFIG_USB=y
|
|||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
CONFIG_USB_DYNAMIC_MINORS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_OTG_WHITELIST=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
|
|
|
@ -136,7 +136,6 @@ CONFIG_HID_SMARTJOYPLUS=m
|
|||
CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB=m
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_MON=m
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
# CONFIG_USB_EHCI_HCD_PPC_OF is not set
|
||||
|
|
|
@ -1477,7 +1477,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
|||
|
||||
/* usbnet already took usb runtime pm, so have to enable the feature
|
||||
* for usb interface, otherwise usb_autopm_get_interface may return
|
||||
* failure if USB_SUSPEND(RUNTIME_PM) is enabled.
|
||||
* failure if RUNTIME_PM is enabled.
|
||||
*/
|
||||
if (!driver->supports_autosuspend) {
|
||||
driver->supports_autosuspend = 1;
|
||||
|
|
|
@ -2,7 +2,6 @@ config USB_DWC2
|
|||
tristate "DesignWare USB2 DRD Core Support"
|
||||
depends on USB
|
||||
depends on VIRT_TO_BUS
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
Say Y or M here if your system has a Dual Role HighSpeed
|
||||
USB controller based on the DesignWare HSOTG IP Core.
|
||||
|
|
|
@ -39,7 +39,7 @@ if WIMAX_GDM72XX_USB
|
|||
|
||||
config WIMAX_GDM72XX_USB_PM
|
||||
bool "Enable power managerment support"
|
||||
depends on USB_SUSPEND
|
||||
depends on PM_RUNTIME
|
||||
|
||||
endif # WIMAX_GDM72XX_USB
|
||||
|
||||
|
|
|
@ -686,7 +686,8 @@ static int cxacru_cm_get_array(struct cxacru_data *instance, enum cxacru_cm_requ
|
|||
{
|
||||
int ret, len;
|
||||
__le32 *buf;
|
||||
int offb, offd;
|
||||
int offb;
|
||||
unsigned int offd;
|
||||
const int stride = CMD_PACKET_SIZE / (4 * 2) - 1;
|
||||
int buflen = ((size - 1) / stride + 1 + size * 2) * 4;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ config USB_CHIPIDEA_UDC
|
|||
config USB_CHIPIDEA_HOST
|
||||
bool "ChipIdea host controller"
|
||||
depends on USB=y || USB=USB_CHIPIDEA
|
||||
depends on USB_EHCI_HCD
|
||||
depends on USB_EHCI_HCD=y
|
||||
select USB_EHCI_ROOT_HUB_TT
|
||||
help
|
||||
Say Y here to enable host controller functionality of the
|
||||
|
|
|
@ -173,17 +173,10 @@ static int ci13xxx_imx_probe(struct platform_device *pdev)
|
|||
|
||||
ci13xxx_imx_platdata.phy = data->phy;
|
||||
|
||||
if (!pdev->dev.dma_mask) {
|
||||
pdev->dev.dma_mask = devm_kzalloc(&pdev->dev,
|
||||
sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
|
||||
if (!pdev->dev.dma_mask) {
|
||||
ret = -ENOMEM;
|
||||
dev_err(&pdev->dev, "Failed to alloc dma_mask!\n");
|
||||
goto err;
|
||||
}
|
||||
*pdev->dev.dma_mask = DMA_BIT_MASK(32);
|
||||
dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
|
||||
}
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
if (usbmisc_ops && usbmisc_ops->init) {
|
||||
ret = usbmisc_ops->init(&pdev->dev);
|
||||
|
|
|
@ -51,7 +51,7 @@ config USB_DYNAMIC_MINORS
|
|||
|
||||
config USB_OTG
|
||||
bool "OTG support"
|
||||
depends on USB_SUSPEND
|
||||
depends on PM_RUNTIME
|
||||
default n
|
||||
help
|
||||
The most notable feature of USB OTG is support for a
|
||||
|
|
|
@ -88,6 +88,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* Edirol SD-20 */
|
||||
{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Alcor Micro Corp. Hub */
|
||||
{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* appletouch */
|
||||
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
|
|
|
@ -19,21 +19,21 @@ choice
|
|||
|
||||
config USB_DWC3_HOST
|
||||
bool "Host only mode"
|
||||
depends on USB
|
||||
depends on USB=y || USB=USB_DWC3
|
||||
help
|
||||
Select this when you want to use DWC3 in host mode only,
|
||||
thereby the gadget feature will be regressed.
|
||||
|
||||
config USB_DWC3_GADGET
|
||||
bool "Gadget only mode"
|
||||
depends on USB_GADGET
|
||||
depends on USB_GADGET=y || USB_GADGET=USB_DWC3
|
||||
help
|
||||
Select this when you want to use DWC3 in gadget mode only,
|
||||
thereby the host feature will be regressed.
|
||||
|
||||
config USB_DWC3_DUAL_ROLE
|
||||
bool "Dual Role mode"
|
||||
depends on (USB && USB_GADGET)
|
||||
depends on ((USB=y || USB=USB_DWC3) && (USB_GADGET=y || USB_GADGET=USB_DWC3))
|
||||
help
|
||||
This is the default mode of working of DWC3 controller where
|
||||
both host and gadget features are enabled.
|
||||
|
|
|
@ -95,8 +95,6 @@ static int dwc3_exynos_remove_child(struct device *dev, void *unused)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u64 dwc3_exynos_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int dwc3_exynos_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct dwc3_exynos *exynos;
|
||||
|
@ -118,7 +116,9 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
|
|||
* Once we move to full device tree support this will vanish off.
|
||||
*/
|
||||
if (!dev->dma_mask)
|
||||
dev->dma_mask = &dwc3_exynos_dma_mask;
|
||||
dev->dma_mask = &dev->coherent_dma_mask;
|
||||
if (!dev->coherent_dma_mask)
|
||||
dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
platform_set_drvdata(pdev, exynos);
|
||||
|
||||
|
|
|
@ -146,7 +146,6 @@ config USB_LPC32XX
|
|||
depends on ARCH_LPC32XX
|
||||
depends on USB_PHY
|
||||
select USB_ISP1301
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
This option selects the USB device controller in the LPC32xx SoC.
|
||||
|
||||
|
|
|
@ -1992,8 +1992,6 @@ static int __init usba_udc_probe(struct platform_device *pdev)
|
|||
err_get_hclk:
|
||||
clk_put(pclk);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -2410,7 +2410,6 @@ static int bcm63xx_udc_remove(struct platform_device *pdev)
|
|||
usb_del_gadget_udc(&udc->gadget);
|
||||
BUG_ON(udc->driver);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
bcm63xx_uninit_udc_hw(udc);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -821,8 +821,10 @@ static int configfs_composite_bind(struct usb_gadget *gadget,
|
|||
gi->gstrings[i] = NULL;
|
||||
s = usb_gstrings_attach(&gi->cdev, gi->gstrings,
|
||||
USB_GADGET_FIRST_AVAIL_IDX);
|
||||
if (IS_ERR(s))
|
||||
if (IS_ERR(s)) {
|
||||
ret = PTR_ERR(s);
|
||||
goto err_comp_cleanup;
|
||||
}
|
||||
|
||||
gi->cdev.desc.iManufacturer = s[USB_GADGET_MANUFACTURER_IDX].id;
|
||||
gi->cdev.desc.iProduct = s[USB_GADGET_PRODUCT_IDX].id;
|
||||
|
@ -847,8 +849,10 @@ static int configfs_composite_bind(struct usb_gadget *gadget,
|
|||
}
|
||||
cfg->gstrings[i] = NULL;
|
||||
s = usb_gstrings_attach(&gi->cdev, cfg->gstrings, 1);
|
||||
if (IS_ERR(s))
|
||||
if (IS_ERR(s)) {
|
||||
ret = PTR_ERR(s);
|
||||
goto err_comp_cleanup;
|
||||
}
|
||||
c->iConfiguration = s[0].id;
|
||||
}
|
||||
|
||||
|
|
|
@ -1001,7 +1001,6 @@ static int dummy_udc_remove(struct platform_device *pdev)
|
|||
struct dummy *dum = platform_get_drvdata(pdev);
|
||||
|
||||
usb_del_gadget_udc(&dum->gadget);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
device_remove_file(&dum->gadget.dev, &dev_attr_function);
|
||||
return 0;
|
||||
}
|
||||
|
@ -2661,8 +2660,10 @@ static int __init init(void)
|
|||
}
|
||||
for (i = 0; i < mod_data.num; i++) {
|
||||
dum[i] = kzalloc(sizeof(struct dummy), GFP_KERNEL);
|
||||
if (!dum[i])
|
||||
if (!dum[i]) {
|
||||
retval = -ENOMEM;
|
||||
goto err_add_pdata;
|
||||
}
|
||||
retval = platform_device_add_data(the_hcd_pdev[i], &dum[i],
|
||||
sizeof(void *));
|
||||
if (retval)
|
||||
|
|
|
@ -816,6 +816,7 @@ ecm_unbind(struct usb_configuration *c, struct usb_function *f)
|
|||
* @c: the configuration to support the network link
|
||||
* @ethaddr: a buffer in which the ethernet address of the host side
|
||||
* side of the link was recorded
|
||||
* @dev: eth_dev structure
|
||||
* Context: single threaded during gadget setup
|
||||
*
|
||||
* Returns zero on success, else negative errno.
|
||||
|
|
|
@ -373,6 +373,7 @@ geth_unbind(struct usb_configuration *c, struct usb_function *f)
|
|||
* @c: the configuration to support the network link
|
||||
* @ethaddr: a buffer in which the ethernet address of the host side
|
||||
* side of the link was recorded
|
||||
* @dev: eth_dev structure
|
||||
* Context: single threaded during gadget setup
|
||||
*
|
||||
* Returns zero on success, else negative errno.
|
||||
|
|
|
@ -456,8 +456,6 @@ static int snd_uac2_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct snd_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
if (card)
|
||||
return snd_card_free(card);
|
||||
|
||||
|
|
|
@ -1461,8 +1461,10 @@ static int __init fusb300_probe(struct platform_device *pdev)
|
|||
|
||||
fusb300->ep0_req = fusb300_alloc_request(&fusb300->ep[0]->ep,
|
||||
GFP_KERNEL);
|
||||
if (fusb300->ep0_req == NULL)
|
||||
if (fusb300->ep0_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto clean_up3;
|
||||
}
|
||||
|
||||
init_controller(fusb300);
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &fusb300->gadget);
|
||||
|
|
|
@ -1511,8 +1511,6 @@ static int __exit imx_udc_remove(struct platform_device *pdev)
|
|||
if (pdata->exit)
|
||||
pdata->exit(&pdev->dev);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1660,8 +1660,10 @@ static int __init m66592_probe(struct platform_device *pdev)
|
|||
m66592->epaddr2ep[0] = &m66592->ep[0];
|
||||
|
||||
m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL);
|
||||
if (m66592->ep0_req == NULL)
|
||||
if (m66592->ep0_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto clean_up3;
|
||||
}
|
||||
m66592->ep0_req->complete = nop_completion;
|
||||
|
||||
init_controller(m66592);
|
||||
|
|
|
@ -2236,7 +2236,6 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev)
|
|||
dev->transceiver = NULL;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
the_controller = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1977,8 +1977,10 @@ static int __init r8a66597_probe(struct platform_device *pdev)
|
|||
|
||||
r8a66597->ep0_req = r8a66597_alloc_request(&r8a66597->ep[0].ep,
|
||||
GFP_KERNEL);
|
||||
if (r8a66597->ep0_req == NULL)
|
||||
if (r8a66597->ep0_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto clean_up3;
|
||||
}
|
||||
r8a66597->ep0_req->complete = nop_completion;
|
||||
|
||||
ret = usb_add_gadget_udc(&pdev->dev, &r8a66597->gadget);
|
||||
|
|
|
@ -437,7 +437,7 @@ static void s3c_hsotg_unmap_dma(struct s3c_hsotg *hsotg,
|
|||
if (hs_req->req.length == 0)
|
||||
return;
|
||||
|
||||
usb_gadget_unmap_request(&hsotg->gadget, hs_req, hs_ep->dir_in);
|
||||
usb_gadget_unmap_request(&hsotg->gadget, req, hs_ep->dir_in);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1851,6 +1851,7 @@ static int s3c2410_udc_probe(struct platform_device *pdev)
|
|||
irq = gpio_to_irq(udc_info->vbus_pin);
|
||||
if (irq < 0) {
|
||||
dev_err(dev, "no irq for gpio vbus pin\n");
|
||||
retval = irq;
|
||||
goto err_gpio_claim;
|
||||
}
|
||||
|
||||
|
@ -1948,8 +1949,6 @@ static int s3c2410_udc_remove(struct platform_device *pdev)
|
|||
iounmap(base_addr);
|
||||
release_mem_region(rsrc_start, rsrc_len);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
if (!IS_ERR(udc_clock) && udc_clock != NULL) {
|
||||
clk_disable(udc_clock);
|
||||
clk_put(udc_clock);
|
||||
|
|
|
@ -284,12 +284,16 @@ static int __init zero_bind(struct usb_composite_dev *cdev)
|
|||
ss_opts->bulk_buflen = gzero_options.bulk_buflen;
|
||||
|
||||
func_ss = usb_get_function(func_inst_ss);
|
||||
if (IS_ERR(func_ss))
|
||||
if (IS_ERR(func_ss)) {
|
||||
status = PTR_ERR(func_ss);
|
||||
goto err_put_func_inst_ss;
|
||||
}
|
||||
|
||||
func_inst_lb = usb_get_function_instance("Loopback");
|
||||
if (IS_ERR(func_inst_lb))
|
||||
if (IS_ERR(func_inst_lb)) {
|
||||
status = PTR_ERR(func_inst_lb);
|
||||
goto err_put_func_ss;
|
||||
}
|
||||
|
||||
lb_opts = container_of(func_inst_lb, struct f_lb_opts, func_inst);
|
||||
lb_opts->bulk_buflen = gzero_options.bulk_buflen;
|
||||
|
|
|
@ -507,7 +507,7 @@ endif # USB_OHCI_HCD
|
|||
|
||||
config USB_UHCI_HCD
|
||||
tristate "UHCI HCD (most Intel and VIA) support"
|
||||
depends on PCI || SPARC_LEON || ARCH_VT8500
|
||||
depends on PCI || USB_UHCI_SUPPORT_NON_PCI_HC
|
||||
---help---
|
||||
The Universal Host Controller Interface is a standard by Intel for
|
||||
accessing the USB hardware in the PC (which is also called the USB
|
||||
|
@ -524,26 +524,19 @@ config USB_UHCI_HCD
|
|||
|
||||
config USB_UHCI_SUPPORT_NON_PCI_HC
|
||||
bool
|
||||
depends on USB_UHCI_HCD
|
||||
default y if (SPARC_LEON || ARCH_VT8500)
|
||||
default y if (SPARC_LEON || USB_UHCI_PLATFORM)
|
||||
|
||||
config USB_UHCI_PLATFORM
|
||||
bool "Generic UHCI Platform Driver support"
|
||||
depends on USB_UHCI_SUPPORT_NON_PCI_HC
|
||||
bool
|
||||
default y if ARCH_VT8500
|
||||
---help---
|
||||
Enable support for generic UHCI platform devices that require no
|
||||
additional configuration.
|
||||
|
||||
config USB_UHCI_BIG_ENDIAN_MMIO
|
||||
bool
|
||||
depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON
|
||||
default y
|
||||
default y if SPARC_LEON
|
||||
|
||||
config USB_UHCI_BIG_ENDIAN_DESC
|
||||
bool
|
||||
depends on USB_UHCI_SUPPORT_NON_PCI_HC && SPARC_LEON
|
||||
default y
|
||||
default y if SPARC_LEON
|
||||
|
||||
config USB_FHCI_HCD
|
||||
tristate "Freescale QE USB Host Controller support"
|
||||
|
|
|
@ -63,8 +63,6 @@ static void atmel_stop_ehci(struct platform_device *pdev)
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static u64 at91_ehci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int ehci_atmel_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct usb_hcd *hcd;
|
||||
|
@ -93,7 +91,9 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &at91_ehci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev));
|
||||
if (!hcd) {
|
||||
|
|
|
@ -1286,23 +1286,6 @@ MODULE_LICENSE ("GPL");
|
|||
#define PLATFORM_DRIVER ehci_hcd_sead3_driver
|
||||
#endif
|
||||
|
||||
#if !IS_ENABLED(CONFIG_USB_EHCI_PCI) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_HCD_PLATFORM) && \
|
||||
!IS_ENABLED(CONFIG_USB_CHIPIDEA_HOST) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_MXC) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_HCD_OMAP) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_HCD_ORION) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_HCD_SPEAR) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_S5P) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_HCD_AT91) && \
|
||||
!IS_ENABLED(CONFIG_USB_EHCI_MSM) && \
|
||||
!defined(PLATFORM_DRIVER) && \
|
||||
!defined(PS3_SYSTEM_BUS_DRIVER) && \
|
||||
!defined(OF_PLATFORM_DRIVER) && \
|
||||
!defined(XILINX_OF_PLATFORM_DRIVER)
|
||||
#error "missing bus glue for ehci-hcd"
|
||||
#endif
|
||||
|
||||
static int __init ehci_hcd_init(void)
|
||||
{
|
||||
int retval = 0;
|
||||
|
|
|
@ -90,8 +90,6 @@ static const struct ehci_driver_overrides ehci_omap_overrides __initdata = {
|
|||
.extra_priv_size = sizeof(struct omap_hcd),
|
||||
};
|
||||
|
||||
static u64 omap_ehci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
/**
|
||||
* ehci_hcd_omap_probe - initialize TI-based HCDs
|
||||
*
|
||||
|
@ -146,8 +144,10 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
|
|||
* Since shared usb code relies on it, set it here for now.
|
||||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &omap_ehci_dma_mask;
|
||||
if (!dev->dma_mask)
|
||||
dev->dma_mask = &dev->coherent_dma_mask;
|
||||
if (!dev->coherent_dma_mask)
|
||||
dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
hcd = usb_create_hcd(&ehci_omap_hc_driver, dev,
|
||||
dev_name(dev));
|
||||
|
|
|
@ -137,8 +137,6 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
|
|||
}
|
||||
}
|
||||
|
||||
static u64 ehci_orion_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int ehci_orion_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct orion_ehci_data *pd = pdev->dev.platform_data;
|
||||
|
@ -183,7 +181,9 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
|
|||
* now. Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &ehci_orion_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
if (!request_mem_region(res->start, resource_size(res),
|
||||
ehci_orion_hc_driver.description)) {
|
||||
|
|
|
@ -71,8 +71,6 @@ static void s5p_setup_vbus_gpio(struct platform_device *pdev)
|
|||
dev_err(dev, "can't request ehci vbus gpio %d", gpio);
|
||||
}
|
||||
|
||||
static u64 ehci_s5p_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int s5p_ehci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct s5p_ehci_platdata *pdata = pdev->dev.platform_data;
|
||||
|
@ -90,7 +88,7 @@ static int s5p_ehci_probe(struct platform_device *pdev)
|
|||
* Once we move to full device tree support this will vanish off.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &ehci_s5p_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
|
@ -107,6 +105,7 @@ static int s5p_ehci_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(phy)) {
|
||||
/* Fallback to pdata */
|
||||
if (!pdata) {
|
||||
usb_put_hcd(hcd);
|
||||
dev_warn(&pdev->dev, "no platform data or transceiver defined\n");
|
||||
return -EPROBE_DEFER;
|
||||
} else {
|
||||
|
|
|
@ -58,8 +58,6 @@ static int ehci_spear_drv_resume(struct device *dev)
|
|||
static SIMPLE_DEV_PM_OPS(ehci_spear_pm_ops, ehci_spear_drv_suspend,
|
||||
ehci_spear_drv_resume);
|
||||
|
||||
static u64 spear_ehci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct usb_hcd *hcd ;
|
||||
|
@ -84,7 +82,9 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &spear_ehci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
usbh_clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(usbh_clk)) {
|
||||
|
|
|
@ -637,8 +637,6 @@ static void tegra_ehci_set_phcd(struct usb_phy *x, bool enable)
|
|||
writel(val, base + TEGRA_USB_PORTSC1);
|
||||
}
|
||||
|
||||
static u64 tegra_ehci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int tegra_ehci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
|
@ -661,7 +659,9 @@ static int tegra_ehci_probe(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &tegra_ehci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
setup_vbus_gpio(pdev, pdata);
|
||||
|
||||
|
|
|
@ -1739,7 +1739,7 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||
int retval = 1;
|
||||
unsigned long flags;
|
||||
|
||||
/* if !USB_SUSPEND, root hub timers won't get shut down ... */
|
||||
/* if !PM_RUNTIME, root hub timers won't get shut down ... */
|
||||
if (!HC_IS_RUNNING(hcd->state))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -373,8 +373,10 @@ static int isp1760_plat_probe(struct platform_device *pdev)
|
|||
irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (!irq_res) {
|
||||
pr_warning("isp1760: IRQ resource not available\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
irqflags |= irq_res->flags & IRQF_TRIGGER_MASK;
|
||||
|
||||
if (priv) {
|
||||
|
|
|
@ -504,8 +504,6 @@ static const struct of_device_id at91_ohci_dt_ids[] = {
|
|||
|
||||
MODULE_DEVICE_TABLE(of, at91_ohci_dt_ids);
|
||||
|
||||
static u64 at91_ohci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int ohci_at91_of_init(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
@ -522,7 +520,9 @@ static int ohci_at91_of_init(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &at91_ohci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
|
|
|
@ -98,8 +98,6 @@ static const struct hc_driver exynos_ohci_hc_driver = {
|
|||
.start_port_reset = ohci_start_port_reset,
|
||||
};
|
||||
|
||||
static u64 ohci_exynos_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int exynos_ohci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct exynos4_ohci_platdata *pdata = pdev->dev.platform_data;
|
||||
|
@ -117,7 +115,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
|
|||
* Once we move to full device tree support this will vanish off.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &ohci_exynos_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
|
|
|
@ -233,14 +233,14 @@ static int ohci_urb_enqueue (
|
|||
urb->start_frame = frame;
|
||||
}
|
||||
} else if (ed->type == PIPE_ISOCHRONOUS) {
|
||||
u16 next = ohci_frame_no(ohci) + 2;
|
||||
u16 next = ohci_frame_no(ohci) + 1;
|
||||
u16 frame = ed->last_iso + ed->interval;
|
||||
|
||||
/* Behind the scheduling threshold? */
|
||||
if (unlikely(tick_before(frame, next))) {
|
||||
|
||||
/* USB_ISO_ASAP: Round up to the first available slot */
|
||||
if (urb->transfer_flags & URB_ISO_ASAP)
|
||||
if (urb->transfer_flags & URB_ISO_ASAP) {
|
||||
frame += (next - frame + ed->interval - 1) &
|
||||
-ed->interval;
|
||||
|
||||
|
@ -248,21 +248,25 @@ static int ohci_urb_enqueue (
|
|||
* Not ASAP: Use the next slot in the stream. If
|
||||
* the entire URB falls before the threshold, fail.
|
||||
*/
|
||||
else if (tick_before(frame + ed->interval *
|
||||
} else {
|
||||
if (tick_before(frame + ed->interval *
|
||||
(urb->number_of_packets - 1), next)) {
|
||||
retval = -EXDEV;
|
||||
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||
goto fail;
|
||||
}
|
||||
retval = -EXDEV;
|
||||
usb_hcd_unlink_urb_from_ep(hcd, urb);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some OHCI hardware doesn't handle late TDs
|
||||
* correctly. After retiring them it proceeds to
|
||||
* the next ED instead of the next TD. Therefore
|
||||
* we have to omit the late TDs entirely.
|
||||
*/
|
||||
urb_priv->td_cnt = DIV_ROUND_UP(next - frame,
|
||||
ed->interval);
|
||||
/*
|
||||
* Some OHCI hardware doesn't handle late TDs
|
||||
* correctly. After retiring them it proceeds
|
||||
* to the next ED instead of the next TD.
|
||||
* Therefore we have to omit the late TDs
|
||||
* entirely.
|
||||
*/
|
||||
urb_priv->td_cnt = DIV_ROUND_UP(
|
||||
(u16) (next - frame),
|
||||
ed->interval);
|
||||
}
|
||||
}
|
||||
urb->start_frame = frame;
|
||||
}
|
||||
|
|
|
@ -223,8 +223,7 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
|
||||
isp1301_i2c_client = isp1301_get_client(isp1301_node);
|
||||
if (!isp1301_i2c_client) {
|
||||
ret = -EPROBE_DEFER;
|
||||
goto out;
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
@ -234,7 +233,7 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
if (usb_disabled()) {
|
||||
dev_err(&pdev->dev, "USB is disabled\n");
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
goto fail_disable;
|
||||
}
|
||||
|
||||
/* Enable AHB slave USB clock, needed for further USB clock control */
|
||||
|
@ -245,19 +244,19 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(usb_pll_clk)) {
|
||||
dev_err(&pdev->dev, "failed to acquire USB PLL\n");
|
||||
ret = PTR_ERR(usb_pll_clk);
|
||||
goto out1;
|
||||
goto fail_pll;
|
||||
}
|
||||
|
||||
ret = clk_enable(usb_pll_clk);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to start USB PLL\n");
|
||||
goto out2;
|
||||
goto fail_pllen;
|
||||
}
|
||||
|
||||
ret = clk_set_rate(usb_pll_clk, 48000);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to set USB clock rate\n");
|
||||
goto out3;
|
||||
goto fail_rate;
|
||||
}
|
||||
|
||||
/* Enable USB device clock */
|
||||
|
@ -265,13 +264,13 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(usb_dev_clk)) {
|
||||
dev_err(&pdev->dev, "failed to acquire USB DEV Clock\n");
|
||||
ret = PTR_ERR(usb_dev_clk);
|
||||
goto out4;
|
||||
goto fail_dev;
|
||||
}
|
||||
|
||||
ret = clk_enable(usb_dev_clk);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to start USB DEV Clock\n");
|
||||
goto out5;
|
||||
goto fail_deven;
|
||||
}
|
||||
|
||||
/* Enable USB otg clocks */
|
||||
|
@ -279,7 +278,7 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(usb_otg_clk)) {
|
||||
dev_err(&pdev->dev, "failed to acquire USB DEV Clock\n");
|
||||
ret = PTR_ERR(usb_otg_clk);
|
||||
goto out6;
|
||||
goto fail_otg;
|
||||
}
|
||||
|
||||
__raw_writel(__raw_readl(USB_CTRL) | USB_HOST_NEED_CLK_EN, USB_CTRL);
|
||||
|
@ -287,7 +286,7 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
ret = clk_enable(usb_otg_clk);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to start USB DEV Clock\n");
|
||||
goto out7;
|
||||
goto fail_otgen;
|
||||
}
|
||||
|
||||
isp1301_configure();
|
||||
|
@ -296,14 +295,14 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
if (!hcd) {
|
||||
dev_err(&pdev->dev, "Failed to allocate HC buffer\n");
|
||||
ret = -ENOMEM;
|
||||
goto out8;
|
||||
goto fail_hcd;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
hcd->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(hcd->regs)) {
|
||||
ret = PTR_ERR(hcd->regs);
|
||||
goto out8;
|
||||
goto fail_resource;
|
||||
}
|
||||
hcd->rsrc_start = res->start;
|
||||
hcd->rsrc_len = resource_size(res);
|
||||
|
@ -311,7 +310,7 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0) {
|
||||
ret = -ENXIO;
|
||||
goto out8;
|
||||
goto fail_resource;
|
||||
}
|
||||
|
||||
nxp_start_hc();
|
||||
|
@ -325,23 +324,24 @@ static int usb_hcd_nxp_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
|
||||
nxp_stop_hc();
|
||||
out8:
|
||||
fail_resource:
|
||||
usb_put_hcd(hcd);
|
||||
out7:
|
||||
fail_hcd:
|
||||
clk_disable(usb_otg_clk);
|
||||
out6:
|
||||
fail_otgen:
|
||||
clk_put(usb_otg_clk);
|
||||
out5:
|
||||
fail_otg:
|
||||
clk_disable(usb_dev_clk);
|
||||
out4:
|
||||
fail_deven:
|
||||
clk_put(usb_dev_clk);
|
||||
out3:
|
||||
fail_dev:
|
||||
fail_rate:
|
||||
clk_disable(usb_pll_clk);
|
||||
out2:
|
||||
fail_pllen:
|
||||
clk_put(usb_pll_clk);
|
||||
out1:
|
||||
fail_pll:
|
||||
fail_disable:
|
||||
isp1301_i2c_client = NULL;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -114,8 +114,6 @@ static const struct hc_driver ohci_omap3_hc_driver = {
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static u64 omap_ohci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
/*
|
||||
* configure so an HC device and id are always provided
|
||||
* always called with process context; sleeping is OK
|
||||
|
@ -168,8 +166,10 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev)
|
|||
* Since shared usb code relies on it, set it here for now.
|
||||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &omap_ohci_dma_mask;
|
||||
if (!dev->dma_mask)
|
||||
dev->dma_mask = &dev->coherent_dma_mask;
|
||||
if (!dev->coherent_dma_mask)
|
||||
dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
hcd = usb_create_hcd(&ohci_omap3_hc_driver, dev,
|
||||
dev_name(dev));
|
||||
|
|
|
@ -282,8 +282,6 @@ static const struct of_device_id pxa_ohci_dt_ids[] = {
|
|||
|
||||
MODULE_DEVICE_TABLE(of, pxa_ohci_dt_ids);
|
||||
|
||||
static u64 pxa_ohci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int ohci_pxa_of_init(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
|
@ -298,7 +296,9 @@ static int ohci_pxa_of_init(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &pxa_ohci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata)
|
||||
|
|
|
@ -91,8 +91,6 @@ static const struct hc_driver ohci_spear_hc_driver = {
|
|||
.start_port_reset = ohci_start_port_reset,
|
||||
};
|
||||
|
||||
static u64 spear_ohci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int spear_ohci_hcd_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct hc_driver *driver = &ohci_spear_hc_driver;
|
||||
|
@ -114,7 +112,9 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &spear_ohci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
usbh_clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(usbh_clk)) {
|
||||
|
|
|
@ -3084,7 +3084,7 @@ static int oxu_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||
int ports, i, retval = 1;
|
||||
unsigned long flags;
|
||||
|
||||
/* if !USB_SUSPEND, root hub timers won't get shut down ... */
|
||||
/* if !PM_RUNTIME, root hub timers won't get shut down ... */
|
||||
if (!HC_IS_RUNNING(hcd->state))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* and usb-storage.
|
||||
*
|
||||
* TODO:
|
||||
* - usb suspend/resume triggered by sl811 (with USB_SUSPEND)
|
||||
* - usb suspend/resume triggered by sl811 (with PM_RUNTIME)
|
||||
* - various issues noted in the code
|
||||
* - performance work; use both register banks; ...
|
||||
* - use urb->iso_frame_desc[] with ISO transfers
|
||||
|
|
|
@ -225,7 +225,8 @@ static int uhci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||
/* auto-stop if nothing connected for 1 second */
|
||||
if (any_ports_active(uhci))
|
||||
uhci->rh_state = UHCI_RH_RUNNING;
|
||||
else if (time_after_eq(jiffies, uhci->auto_stop_time))
|
||||
else if (time_after_eq(jiffies, uhci->auto_stop_time) &&
|
||||
!uhci->wait_for_hp)
|
||||
suspend_rh(uhci, UHCI_RH_AUTO_STOPPED);
|
||||
break;
|
||||
|
||||
|
|
|
@ -60,8 +60,6 @@ static const struct hc_driver uhci_platform_hc_driver = {
|
|||
.hub_control = uhci_hub_control,
|
||||
};
|
||||
|
||||
static u64 platform_uhci_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int uhci_hcd_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct usb_hcd *hcd;
|
||||
|
@ -78,7 +76,9 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev)
|
|||
* Once we have dma capability bindings this can go away.
|
||||
*/
|
||||
if (!pdev->dev.dma_mask)
|
||||
pdev->dev.dma_mask = &platform_uhci_dma_mask;
|
||||
pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
|
||||
if (!pdev->dev.coherent_dma_mask)
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
hcd = usb_create_hcd(&uhci_platform_hc_driver, &pdev->dev,
|
||||
pdev->name);
|
||||
|
|
|
@ -1287,7 +1287,7 @@ static int uhci_submit_isochronous(struct uhci_hcd *uhci, struct urb *urb,
|
|||
return -EINVAL; /* Can't change the period */
|
||||
|
||||
} else {
|
||||
next = uhci->frame_number + 2;
|
||||
next = uhci->frame_number + 1;
|
||||
|
||||
/* Find the next unused frame */
|
||||
if (list_empty(&qh->queue)) {
|
||||
|
|
|
@ -1423,15 +1423,17 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
|
|||
ep_ctx->ep_info2 |= cpu_to_le32(xhci_get_endpoint_type(udev, ep));
|
||||
|
||||
/* Set the max packet size and max burst */
|
||||
max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
|
||||
max_burst = 0;
|
||||
switch (udev->speed) {
|
||||
case USB_SPEED_SUPER:
|
||||
max_packet = usb_endpoint_maxp(&ep->desc);
|
||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet));
|
||||
/* dig out max burst from ep companion desc */
|
||||
max_packet = ep->ss_ep_comp.bMaxBurst;
|
||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet));
|
||||
max_burst = ep->ss_ep_comp.bMaxBurst;
|
||||
break;
|
||||
case USB_SPEED_HIGH:
|
||||
/* Some devices get this wrong */
|
||||
if (usb_endpoint_xfer_bulk(&ep->desc))
|
||||
max_packet = 512;
|
||||
/* bits 11:12 specify the number of additional transaction
|
||||
* opportunities per microframe (USB 2.0, section 9.6.6)
|
||||
*/
|
||||
|
@ -1439,17 +1441,16 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
|
|||
usb_endpoint_xfer_int(&ep->desc)) {
|
||||
max_burst = (usb_endpoint_maxp(&ep->desc)
|
||||
& 0x1800) >> 11;
|
||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_burst));
|
||||
}
|
||||
/* Fall through */
|
||||
break;
|
||||
case USB_SPEED_FULL:
|
||||
case USB_SPEED_LOW:
|
||||
max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
|
||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet));
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet) |
|
||||
MAX_BURST(max_burst));
|
||||
max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep);
|
||||
ep_ctx->tx_info = cpu_to_le32(MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload));
|
||||
|
||||
|
|
|
@ -560,6 +560,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, u8 id)
|
|||
if (!config) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to allocate musb hdrc config\n");
|
||||
ret = -ENOMEM;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
|
|
|
@ -549,7 +549,8 @@ static int omap2430_probe(struct platform_device *pdev)
|
|||
glue->control_otghs = omap_get_control_dev();
|
||||
if (IS_ERR(glue->control_otghs)) {
|
||||
dev_vdbg(&pdev->dev, "Failed to get control device\n");
|
||||
return -ENODEV;
|
||||
ret = PTR_ERR(glue->control_otghs);
|
||||
goto err2;
|
||||
}
|
||||
} else {
|
||||
glue->control_otghs = ERR_PTR(-ENODEV);
|
||||
|
|
|
@ -25,7 +25,7 @@ config AB8500_USB
|
|||
|
||||
config FSL_USB2_OTG
|
||||
bool "Freescale USB OTG Transceiver Driver"
|
||||
depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_SUSPEND
|
||||
depends on USB_EHCI_FSL && USB_FSL_USB2 && PM_RUNTIME
|
||||
select USB_OTG
|
||||
help
|
||||
Enable this to support Freescale USB OTG transceiver.
|
||||
|
@ -139,7 +139,6 @@ config USB_ISP1301
|
|||
tristate "NXP ISP1301 USB transceiver support"
|
||||
depends on USB || USB_GADGET
|
||||
depends on I2C
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
Say Y here to add support for the NXP ISP1301 USB transceiver driver.
|
||||
This chip is typically used as USB transceiver for USB host, gadget
|
||||
|
@ -162,7 +161,7 @@ config USB_MSM_OTG
|
|||
|
||||
config USB_MV_OTG
|
||||
tristate "Marvell USB OTG support"
|
||||
depends on USB_EHCI_MV && USB_MV_UDC && USB_SUSPEND
|
||||
depends on USB_EHCI_MV && USB_MV_UDC && PM_RUNTIME
|
||||
select USB_OTG
|
||||
help
|
||||
Say Y here if you want to build Marvell USB OTG transciever
|
||||
|
|
|
@ -892,8 +892,6 @@ static int ab8500_usb_remove(struct platform_device *pdev)
|
|||
else if (ab->mode == USB_PERIPHERAL)
|
||||
ab8500_usb_peri_phy_dis(ab);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -799,6 +799,7 @@ static int fsl_otg_conf(struct platform_device *pdev)
|
|||
|
||||
/* initialize the otg structure */
|
||||
fsl_otg_tc->phy.label = DRIVER_DESC;
|
||||
fsl_otg_tc->phy.dev = &pdev->dev;
|
||||
fsl_otg_tc->phy.set_power = fsl_otg_set_power;
|
||||
|
||||
fsl_otg_tc->phy.otg->phy = &fsl_otg_tc->phy;
|
||||
|
|
|
@ -266,6 +266,7 @@ static int __init gpio_vbus_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, gpio_vbus);
|
||||
gpio_vbus->dev = &pdev->dev;
|
||||
gpio_vbus->phy.label = "gpio-vbus";
|
||||
gpio_vbus->phy.dev = gpio_vbus->dev;
|
||||
gpio_vbus->phy.set_power = gpio_vbus_set_power;
|
||||
gpio_vbus->phy.set_suspend = gpio_vbus_set_suspend;
|
||||
gpio_vbus->phy.state = OTG_STATE_UNDEFINED;
|
||||
|
@ -343,7 +344,6 @@ static int __init gpio_vbus_probe(struct platform_device *pdev)
|
|||
gpio_free(pdata->gpio_pullup);
|
||||
gpio_free(pdata->gpio_vbus);
|
||||
err_gpio:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(gpio_vbus->phy.otg);
|
||||
kfree(gpio_vbus);
|
||||
return err;
|
||||
|
@ -365,7 +365,6 @@ static int __exit gpio_vbus_remove(struct platform_device *pdev)
|
|||
if (gpio_is_valid(pdata->gpio_pullup))
|
||||
gpio_free(pdata->gpio_pullup);
|
||||
gpio_free(gpio);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(gpio_vbus->phy.otg);
|
||||
kfree(gpio_vbus);
|
||||
|
||||
|
|
|
@ -102,6 +102,7 @@ static int isp1301_probe(struct i2c_client *client,
|
|||
mutex_init(&isp->mutex);
|
||||
|
||||
phy = &isp->phy;
|
||||
phy->dev = &client->dev;
|
||||
phy->label = DRV_NAME;
|
||||
phy->init = isp1301_phy_init;
|
||||
phy->set_vbus = isp1301_phy_set_vbus;
|
||||
|
|
|
@ -667,7 +667,6 @@ int mv_otg_remove(struct platform_device *pdev)
|
|||
mv_otg_disable(mvotg);
|
||||
|
||||
usb_remove_phy(&mvotg->phy);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -850,8 +849,6 @@ static int mv_otg_probe(struct platform_device *pdev)
|
|||
flush_workqueue(mvotg->qwork);
|
||||
destroy_workqueue(mvotg->qwork);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -155,6 +155,7 @@ static int mxs_phy_probe(struct platform_device *pdev)
|
|||
mxs_phy->phy.set_suspend = mxs_phy_suspend;
|
||||
mxs_phy->phy.notify_connect = mxs_phy_on_connect;
|
||||
mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect;
|
||||
mxs_phy->phy.type = USB_PHY_TYPE_USB2;
|
||||
|
||||
ATOMIC_INIT_NOTIFIER_HEAD(&mxs_phy->phy.notifier);
|
||||
|
||||
|
@ -175,8 +176,6 @@ static int mxs_phy_remove(struct platform_device *pdev)
|
|||
|
||||
usb_remove_phy(&mxs_phy->phy);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -254,8 +254,6 @@ static int nop_usb_xceiv_remove(struct platform_device *pdev)
|
|||
|
||||
usb_remove_phy(&nop->phy);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -189,6 +189,8 @@ static struct usb_device_id id_table_combined [] = {
|
|||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_BOOST_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_CC_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_CONEX_AGP_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
|
||||
|
@ -924,8 +926,8 @@ static int ftdi_tiocmset(struct tty_struct *tty,
|
|||
static int ftdi_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
|
||||
static int ftdi_chars_in_buffer(struct tty_struct *tty);
|
||||
static int ftdi_get_modem_status(struct tty_struct *tty,
|
||||
static bool ftdi_tx_empty(struct usb_serial_port *port);
|
||||
static int ftdi_get_modem_status(struct usb_serial_port *port,
|
||||
unsigned char status[2]);
|
||||
|
||||
static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
|
||||
|
@ -961,7 +963,7 @@ static struct usb_serial_driver ftdi_sio_device = {
|
|||
.ioctl = ftdi_ioctl,
|
||||
.set_termios = ftdi_set_termios,
|
||||
.break_ctl = ftdi_break_ctl,
|
||||
.chars_in_buffer = ftdi_chars_in_buffer,
|
||||
.tx_empty = ftdi_tx_empty,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
|
@ -2056,27 +2058,18 @@ static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
|
|||
|
||||
}
|
||||
|
||||
static int ftdi_chars_in_buffer(struct tty_struct *tty)
|
||||
static bool ftdi_tx_empty(struct usb_serial_port *port)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
int chars;
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
chars = usb_serial_generic_chars_in_buffer(tty);
|
||||
if (chars)
|
||||
goto out;
|
||||
|
||||
/* Check if hardware buffer is empty. */
|
||||
ret = ftdi_get_modem_status(tty, buf);
|
||||
ret = ftdi_get_modem_status(port, buf);
|
||||
if (ret == 2) {
|
||||
if (!(buf[1] & FTDI_RS_TEMT))
|
||||
chars = 1;
|
||||
return false;
|
||||
}
|
||||
out:
|
||||
dev_dbg(&port->dev, "%s - %d\n", __func__, chars);
|
||||
|
||||
return chars;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* old_termios contains the original termios settings and tty->termios contains
|
||||
|
@ -2268,10 +2261,9 @@ static void ftdi_set_termios(struct tty_struct *tty,
|
|||
* Returns the number of status bytes retrieved (device dependant), or
|
||||
* negative error code.
|
||||
*/
|
||||
static int ftdi_get_modem_status(struct tty_struct *tty,
|
||||
static int ftdi_get_modem_status(struct usb_serial_port *port,
|
||||
unsigned char status[2])
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned char *buf;
|
||||
int len;
|
||||
|
@ -2336,7 +2328,7 @@ static int ftdi_tiocmget(struct tty_struct *tty)
|
|||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
ret = ftdi_get_modem_status(tty, buf);
|
||||
ret = ftdi_get_modem_status(port, buf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -772,6 +772,8 @@
|
|||
*/
|
||||
#define NEWPORT_VID 0x104D
|
||||
#define NEWPORT_AGILIS_PID 0x3000
|
||||
#define NEWPORT_CONEX_CC_PID 0x3002
|
||||
#define NEWPORT_CONEX_AGP_PID 0x3006
|
||||
|
||||
/* Interbiometrics USB I/O Board */
|
||||
/* Developed for Interbiometrics by Rudolf Gugler */
|
||||
|
|
|
@ -253,6 +253,37 @@ int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer);
|
||||
|
||||
void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
unsigned int bps;
|
||||
unsigned long period;
|
||||
unsigned long expire;
|
||||
|
||||
bps = tty_get_baud_rate(tty);
|
||||
if (!bps)
|
||||
bps = 9600; /* B0 */
|
||||
/*
|
||||
* Use a poll-period of roughly the time it takes to send one
|
||||
* character or at least one jiffy.
|
||||
*/
|
||||
period = max_t(unsigned long, (10 * HZ / bps), 1);
|
||||
period = min_t(unsigned long, period, timeout);
|
||||
|
||||
dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n",
|
||||
__func__, jiffies_to_msecs(timeout),
|
||||
jiffies_to_msecs(period));
|
||||
expire = jiffies + timeout;
|
||||
while (!port->serial->type->tx_empty(port)) {
|
||||
schedule_timeout_interruptible(period);
|
||||
if (signal_pending(current))
|
||||
break;
|
||||
if (time_after(jiffies, expire))
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_serial_generic_wait_until_sent);
|
||||
|
||||
static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
|
||||
int index, gfp_t mem_flags)
|
||||
{
|
||||
|
|
|
@ -2019,8 +2019,6 @@ static int edge_chars_in_buffer(struct tty_struct *tty)
|
|||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
int chars = 0;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
if (edge_port == NULL)
|
||||
return 0;
|
||||
|
||||
|
@ -2028,16 +2026,22 @@ static int edge_chars_in_buffer(struct tty_struct *tty)
|
|||
chars = kfifo_len(&edge_port->write_fifo);
|
||||
spin_unlock_irqrestore(&edge_port->ep_lock, flags);
|
||||
|
||||
if (!chars) {
|
||||
ret = tx_active(edge_port);
|
||||
if (ret > 0)
|
||||
chars = ret;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
|
||||
return chars;
|
||||
}
|
||||
|
||||
static bool edge_tx_empty(struct usb_serial_port *port)
|
||||
{
|
||||
struct edgeport_port *edge_port = usb_get_serial_port_data(port);
|
||||
int ret;
|
||||
|
||||
ret = tx_active(edge_port);
|
||||
if (ret > 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void edge_throttle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
|
@ -2557,6 +2561,7 @@ static struct usb_serial_driver edgeport_1port_device = {
|
|||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.tx_empty = edge_tx_empty,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
|
@ -2589,6 +2594,7 @@ static struct usb_serial_driver edgeport_2port_device = {
|
|||
.write = edge_write,
|
||||
.write_room = edge_write_room,
|
||||
.chars_in_buffer = edge_chars_in_buffer,
|
||||
.tx_empty = edge_tx_empty,
|
||||
.break_ctl = edge_break,
|
||||
.read_int_callback = edge_interrupt_callback,
|
||||
.read_bulk_callback = edge_bulk_in_callback,
|
||||
|
|
|
@ -196,6 +196,7 @@ static void option_instat_callback(struct urb *urb);
|
|||
|
||||
#define DELL_PRODUCT_5800_MINICARD_VZW 0x8195 /* Novatel E362 */
|
||||
#define DELL_PRODUCT_5800_V2_MINICARD_VZW 0x8196 /* Novatel E362 */
|
||||
#define DELL_PRODUCT_5804_MINICARD_ATT 0x819b /* Novatel E371 */
|
||||
|
||||
#define KYOCERA_VENDOR_ID 0x0c88
|
||||
#define KYOCERA_PRODUCT_KPC650 0x17da
|
||||
|
@ -341,8 +342,8 @@ static void option_instat_callback(struct urb *urb);
|
|||
#define CINTERION_PRODUCT_EU3_E 0x0051
|
||||
#define CINTERION_PRODUCT_EU3_P 0x0052
|
||||
#define CINTERION_PRODUCT_PH8 0x0053
|
||||
#define CINTERION_PRODUCT_AH6 0x0055
|
||||
#define CINTERION_PRODUCT_PLS8 0x0060
|
||||
#define CINTERION_PRODUCT_AHXX 0x0055
|
||||
#define CINTERION_PRODUCT_PLXX 0x0060
|
||||
|
||||
/* Olivetti products */
|
||||
#define OLIVETTI_VENDOR_ID 0x0b3c
|
||||
|
@ -771,6 +772,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5800_V2_MINICARD_VZW, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, DELL_PRODUCT_5804_MINICARD_ATT, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
||||
|
@ -966,6 +968,8 @@ static const struct usb_device_id option_ids[] = {
|
|||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0412, 0xff, 0xff, 0xff), /* Telewell TW-LTE 4G */
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff),
|
||||
|
@ -1264,8 +1268,9 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AH6) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLS8) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
|
||||
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
|
||||
|
|
|
@ -101,6 +101,7 @@ static int ti_write(struct tty_struct *tty, struct usb_serial_port *port,
|
|||
const unsigned char *data, int count);
|
||||
static int ti_write_room(struct tty_struct *tty);
|
||||
static int ti_chars_in_buffer(struct tty_struct *tty);
|
||||
static bool ti_tx_empty(struct usb_serial_port *port);
|
||||
static void ti_throttle(struct tty_struct *tty);
|
||||
static void ti_unthrottle(struct tty_struct *tty);
|
||||
static int ti_ioctl(struct tty_struct *tty,
|
||||
|
@ -222,6 +223,7 @@ static struct usb_serial_driver ti_1port_device = {
|
|||
.write = ti_write,
|
||||
.write_room = ti_write_room,
|
||||
.chars_in_buffer = ti_chars_in_buffer,
|
||||
.tx_empty = ti_tx_empty,
|
||||
.throttle = ti_throttle,
|
||||
.unthrottle = ti_unthrottle,
|
||||
.ioctl = ti_ioctl,
|
||||
|
@ -253,6 +255,7 @@ static struct usb_serial_driver ti_2port_device = {
|
|||
.write = ti_write,
|
||||
.write_room = ti_write_room,
|
||||
.chars_in_buffer = ti_chars_in_buffer,
|
||||
.tx_empty = ti_tx_empty,
|
||||
.throttle = ti_throttle,
|
||||
.unthrottle = ti_unthrottle,
|
||||
.ioctl = ti_ioctl,
|
||||
|
@ -684,8 +687,6 @@ static int ti_chars_in_buffer(struct tty_struct *tty)
|
|||
struct ti_port *tport = usb_get_serial_port_data(port);
|
||||
int chars = 0;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
u8 lsr;
|
||||
|
||||
if (tport == NULL)
|
||||
return 0;
|
||||
|
@ -694,16 +695,22 @@ static int ti_chars_in_buffer(struct tty_struct *tty)
|
|||
chars = kfifo_len(&tport->write_fifo);
|
||||
spin_unlock_irqrestore(&tport->tp_lock, flags);
|
||||
|
||||
if (!chars) {
|
||||
ret = ti_get_lsr(tport, &lsr);
|
||||
if (!ret && !(lsr & TI_LSR_TX_EMPTY))
|
||||
chars = 1;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
|
||||
return chars;
|
||||
}
|
||||
|
||||
static bool ti_tx_empty(struct usb_serial_port *port)
|
||||
{
|
||||
struct ti_port *tport = usb_get_serial_port_data(port);
|
||||
int ret;
|
||||
u8 lsr;
|
||||
|
||||
ret = ti_get_lsr(tport, &lsr);
|
||||
if (!ret && !(lsr & TI_LSR_TX_EMPTY))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void ti_throttle(struct tty_struct *tty)
|
||||
{
|
||||
|
|
|
@ -359,20 +359,29 @@ static int serial_chars_in_buffer(struct tty_struct *tty)
|
|||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct usb_serial *serial = port->serial;
|
||||
int count = 0;
|
||||
|
||||
dev_dbg(tty->dev, "%s\n", __func__);
|
||||
|
||||
mutex_lock(&serial->disc_mutex);
|
||||
/* if the device was unplugged then any remaining characters
|
||||
fell out of the connector ;) */
|
||||
if (serial->disconnected)
|
||||
count = 0;
|
||||
else
|
||||
count = serial->type->chars_in_buffer(tty);
|
||||
mutex_unlock(&serial->disc_mutex);
|
||||
return 0;
|
||||
|
||||
return count;
|
||||
return serial->type->chars_in_buffer(tty);
|
||||
}
|
||||
|
||||
static void serial_wait_until_sent(struct tty_struct *tty, int timeout)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct usb_serial *serial = port->serial;
|
||||
|
||||
dev_dbg(tty->dev, "%s\n", __func__);
|
||||
|
||||
if (!port->serial->type->wait_until_sent)
|
||||
return;
|
||||
|
||||
mutex_lock(&serial->disc_mutex);
|
||||
if (!serial->disconnected)
|
||||
port->serial->type->wait_until_sent(tty, timeout);
|
||||
mutex_unlock(&serial->disc_mutex);
|
||||
}
|
||||
|
||||
static void serial_throttle(struct tty_struct *tty)
|
||||
|
@ -1191,6 +1200,7 @@ static const struct tty_operations serial_ops = {
|
|||
.unthrottle = serial_unthrottle,
|
||||
.break_ctl = serial_break,
|
||||
.chars_in_buffer = serial_chars_in_buffer,
|
||||
.wait_until_sent = serial_wait_until_sent,
|
||||
.tiocmget = serial_tiocmget,
|
||||
.tiocmset = serial_tiocmset,
|
||||
.get_icount = serial_get_icount,
|
||||
|
@ -1316,6 +1326,8 @@ static void usb_serial_operations_init(struct usb_serial_driver *device)
|
|||
set_to_generic_if_null(device, close);
|
||||
set_to_generic_if_null(device, write_room);
|
||||
set_to_generic_if_null(device, chars_in_buffer);
|
||||
if (device->tx_empty)
|
||||
set_to_generic_if_null(device, wait_until_sent);
|
||||
set_to_generic_if_null(device, read_bulk_callback);
|
||||
set_to_generic_if_null(device, write_bulk_callback);
|
||||
set_to_generic_if_null(device, process_read_urb);
|
||||
|
|
|
@ -105,8 +105,9 @@ struct rts51x_chip {
|
|||
int status_len;
|
||||
|
||||
u32 flag;
|
||||
#ifdef CONFIG_REALTEK_AUTOPM
|
||||
struct us_data *us;
|
||||
|
||||
#ifdef CONFIG_REALTEK_AUTOPM
|
||||
struct timer_list rts51x_suspend_timer;
|
||||
unsigned long timer_expires;
|
||||
int pwr_state;
|
||||
|
@ -988,6 +989,7 @@ static int init_realtek_cr(struct us_data *us)
|
|||
us->extra = chip;
|
||||
us->extra_destructor = realtek_cr_destructor;
|
||||
us->max_lun = chip->max_lun = rts51x_get_max_lun(us);
|
||||
chip->us = us;
|
||||
|
||||
usb_stor_dbg(us, "chip->max_lun = %d\n", chip->max_lun);
|
||||
|
||||
|
@ -1010,10 +1012,8 @@ static int init_realtek_cr(struct us_data *us)
|
|||
SET_AUTO_DELINK(chip);
|
||||
}
|
||||
#ifdef CONFIG_REALTEK_AUTOPM
|
||||
if (ss_en) {
|
||||
chip->us = us;
|
||||
if (ss_en)
|
||||
realtek_cr_autosuspend_setup(us);
|
||||
}
|
||||
#endif
|
||||
|
||||
usb_stor_dbg(us, "chip->flag = 0x%x\n", chip->flag);
|
||||
|
|
|
@ -563,9 +563,8 @@ static inline int gadget_is_dualspeed(struct usb_gadget *g)
|
|||
}
|
||||
|
||||
/**
|
||||
* gadget_is_superspeed() - return true if the hardware handles
|
||||
* supperspeed
|
||||
* @g: controller that might support supper speed
|
||||
* gadget_is_superspeed() - return true if the hardware handles superspeed
|
||||
* @g: controller that might support superspeed
|
||||
*/
|
||||
static inline int gadget_is_superspeed(struct usb_gadget *g)
|
||||
{
|
||||
|
|
|
@ -268,6 +268,8 @@ struct usb_serial_driver {
|
|||
struct usb_serial_port *port, struct ktermios *old);
|
||||
void (*break_ctl)(struct tty_struct *tty, int break_state);
|
||||
int (*chars_in_buffer)(struct tty_struct *tty);
|
||||
void (*wait_until_sent)(struct tty_struct *tty, long timeout);
|
||||
bool (*tx_empty)(struct usb_serial_port *port);
|
||||
void (*throttle)(struct tty_struct *tty);
|
||||
void (*unthrottle)(struct tty_struct *tty);
|
||||
int (*tiocmget)(struct tty_struct *tty);
|
||||
|
@ -327,6 +329,8 @@ extern void usb_serial_generic_close(struct usb_serial_port *port);
|
|||
extern int usb_serial_generic_resume(struct usb_serial *serial);
|
||||
extern int usb_serial_generic_write_room(struct tty_struct *tty);
|
||||
extern int usb_serial_generic_chars_in_buffer(struct tty_struct *tty);
|
||||
extern void usb_serial_generic_wait_until_sent(struct tty_struct *tty,
|
||||
long timeout);
|
||||
extern void usb_serial_generic_read_bulk_callback(struct urb *urb);
|
||||
extern void usb_serial_generic_write_bulk_callback(struct urb *urb);
|
||||
extern void usb_serial_generic_throttle(struct tty_struct *tty);
|
||||
|
|
Loading…
Reference in New Issue
Block a user