mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
orion dt for v3.8
- ehci-orion dt binding
- gpio-poweroff
- use dt regulators
- move mpp to DT/pinctrl
Depends on:
- orion/boards
- merge conflicts
- keep all 'select's in Kconfig
- remove all #includes in board-*.c
- pinctrl/devel up to:
- 06763c7 pinctrl: mvebu: move to its own directory
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)
iQEcBAABAgAGBQJQsEfdAAoJEAi3KVZQDZAeBd8IAIAkBGIJyUJSmQJEWkZ/9ezq
UOLec1t/TnLhAQ1Sk8g4C41wmHKYNqmZSVaAXC+QP6Yw+Gdhlw+V6YBjOYDzA7Y4
k8ljw3SFbvS+AIx0qK26j6Tf6En2H5lMXsdlKoarCV+G+MxAHsQO7jL6y7BFwTlX
QnwJFz+NRzMFxaPiCS+43oZuxIIzkHe8wKMb0y7nSiNQYUUv8TdKvyK+ekFuszOp
v6uo/MI1p1/xdUxDbEKxOwmUjAy7x+t0LUFi1dsWuiDHdrG+BVT4NkJuFaD8Ui13
VoUD1ogyWHQZV2hq0dfj+9Hed5NEgl6toAzGN9LPLmsuVUXCnB2CdBprhuDv5F8=
=yaX1
-----END PGP SIGNATURE-----
Merge tag 'orion_dt_for_3.8' of git://git.infradead.org/users/jcooper/linux into next/dt
From Jason Cooper:
orion dt for v3.8
- ehci-orion dt binding
- gpio-poweroff
- use dt regulators
- move mpp to DT/pinctrl
Depends on:
- orion/boards
- merge conflicts
- keep all 'select's in Kconfig
- remove all #includes in board-*.c
- pinctrl/devel up to:
- 06763c7 pinctrl: mvebu: move to its own directory
* tag 'orion_dt_for_3.8' of git://git.infradead.org/users/jcooper/linux: (211 commits)
ARM: Kirkwood: remove kirkwood_ehci_init() from new boards
ARM: Kirkwood: Add support LED of OpenBlocks A6
ARM: Kirkwood: Convert to EHCI via DT for OpenBlocks A6
ARM: kirkwood: Add NAND partiton map for OpenBlocks A6
ARM: kirkwood: Add support second I2C bus and RTC on OpenBlocks A6
ARM: kirkwood: Add support DT of second I2C bus
ARM: kirkwood: Convert mplcec4 board to pinctrl
ARM: Kirkwood: Convert km_kirkwood to pinctrl
ARM: Kirkwood: support 98DX412x kirkwoods with pinctrl
ARM: Kirkwood: Convert IX2-200 to pinctrl.
ARM: Kirkwood: Convert lsxl boards to pinctrl.
ARM: Kirkwood: Convert ib62x0 to pinctrl.
ARM: Kirkwood: Convert GoFlex Net to pinctrl.
ARM: Kirkwood: Convert dreamplug to pinctrl.
ARM: Kirkwood: Convert dockstar to pinctrl.
ARM: Kirkwood: Convert dnskw to pinctrl
ARM: Kirkwood: Convert iConnect to pinctrl.
ARM: Kirkwood: Convert TS219 to pinctrl.
ARM: Kirkwood: Add DTSI files for pinctrl
ARM: Kirkwood: Make use of mvebu pincltl and gpio drivers
...
Signed-off-by: Olof Johansson <[email protected]>
This commit is contained in:
commit
0dfeada909
271 changed files with 5821 additions and 1952 deletions
|
|
@ -2151,8 +2151,15 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum);
|
|||
irqreturn_t usb_hcd_irq (int irq, void *__hcd)
|
||||
{
|
||||
struct usb_hcd *hcd = __hcd;
|
||||
unsigned long flags;
|
||||
irqreturn_t rc;
|
||||
|
||||
/* IRQF_DISABLED doesn't work correctly with shared IRQs
|
||||
* when the first handler doesn't use it. So let's just
|
||||
* assume it's never used.
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
|
||||
if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd)))
|
||||
rc = IRQ_NONE;
|
||||
else if (hcd->driver->irq(hcd) == IRQ_NONE)
|
||||
|
|
@ -2160,6 +2167,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
|
|||
else
|
||||
rc = IRQ_HANDLED;
|
||||
|
||||
local_irq_restore(flags);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_hcd_irq);
|
||||
|
|
@ -2347,6 +2355,14 @@ static int usb_hcd_request_irqs(struct usb_hcd *hcd,
|
|||
int retval;
|
||||
|
||||
if (hcd->driver->irq) {
|
||||
|
||||
/* IRQF_DISABLED doesn't work as advertised when used together
|
||||
* with IRQF_SHARED. As usb_hcd_irq() will always disable
|
||||
* interrupts we can remove it here.
|
||||
*/
|
||||
if (irqflags & IRQF_SHARED)
|
||||
irqflags &= ~IRQF_DISABLED;
|
||||
|
||||
snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d",
|
||||
hcd->driver->description, hcd->self.busnum);
|
||||
retval = request_irq(irqnum, &usb_hcd_irq, irqflags,
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/usb/ehci_def.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/kconfig.h>
|
||||
#include <linux/kgdb.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <asm/io.h>
|
||||
|
|
@ -614,12 +615,6 @@ err:
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
int dbgp_external_startup(struct usb_hcd *hcd)
|
||||
{
|
||||
return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dbgp_external_startup);
|
||||
|
||||
static int ehci_reset_port(int port)
|
||||
{
|
||||
u32 portsc;
|
||||
|
|
@ -979,6 +974,7 @@ struct console early_dbgp_console = {
|
|||
.index = -1,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_EHCI_HCD)
|
||||
int dbgp_reset_prep(struct usb_hcd *hcd)
|
||||
{
|
||||
int ret = xen_dbgp_reset_prep(hcd);
|
||||
|
|
@ -1007,6 +1003,13 @@ int dbgp_reset_prep(struct usb_hcd *hcd)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dbgp_reset_prep);
|
||||
|
||||
int dbgp_external_startup(struct usb_hcd *hcd)
|
||||
{
|
||||
return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dbgp_external_startup);
|
||||
#endif /* USB_EHCI_HCD */
|
||||
|
||||
#ifdef CONFIG_KGDB
|
||||
|
||||
static char kgdbdbgp_buf[DBGP_MAX_PACKET];
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ static int ehci_hcd_ls1x_probe(struct platform_device *pdev)
|
|||
goto err_put_hcd;
|
||||
}
|
||||
|
||||
ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
|
||||
ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
|
||||
if (ret)
|
||||
goto err_put_hcd;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,9 @@
|
|||
#include <linux/mbus.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_data/usb-ehci-orion.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
#define rdl(off) __raw_readl(hcd->regs + (off))
|
||||
#define wrl(off, val) __raw_writel((val), hcd->regs + (off))
|
||||
|
|
@ -181,6 +184,8 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
|
|||
}
|
||||
}
|
||||
|
||||
static u64 ehci_orion_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct orion_ehci_data *pd = pdev->dev.platform_data;
|
||||
|
|
@ -191,13 +196,17 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
|
|||
struct clk *clk;
|
||||
void __iomem *regs;
|
||||
int irq, err;
|
||||
enum orion_ehci_phy_ver phy_version;
|
||||
|
||||
if (usb_disabled())
|
||||
return -ENODEV;
|
||||
|
||||
pr_debug("Initializing Orion-SoC USB Host Controller\n");
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (pdev->dev.of_node)
|
||||
irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
|
||||
else
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq <= 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"Found HC with no IRQ. Check %s setup!\n",
|
||||
|
|
@ -215,6 +224,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
|
|||
goto err1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Right now device-tree probed devices don't get dma_mask
|
||||
* set. 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 = &ehci_orion_dma_mask;
|
||||
|
||||
if (!request_mem_region(res->start, resource_size(res),
|
||||
ehci_orion_hc_driver.description)) {
|
||||
dev_dbg(&pdev->dev, "controller already in use\n");
|
||||
|
|
@ -262,7 +279,12 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
|
|||
/*
|
||||
* setup Orion USB controller.
|
||||
*/
|
||||
switch (pd->phy_version) {
|
||||
if (pdev->dev.of_node)
|
||||
phy_version = EHCI_PHY_NA;
|
||||
else
|
||||
phy_version = pd->phy_version;
|
||||
|
||||
switch (phy_version) {
|
||||
case EHCI_PHY_NA: /* dont change USB phy settings */
|
||||
break;
|
||||
case EHCI_PHY_ORION:
|
||||
|
|
@ -317,9 +339,19 @@ static int __exit ehci_orion_drv_remove(struct platform_device *pdev)
|
|||
|
||||
MODULE_ALIAS("platform:orion-ehci");
|
||||
|
||||
static const struct of_device_id ehci_orion_dt_ids[] __devinitdata = {
|
||||
{ .compatible = "marvell,orion-ehci", },
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids);
|
||||
|
||||
static struct platform_driver ehci_orion_driver = {
|
||||
.probe = ehci_orion_drv_probe,
|
||||
.remove = __exit_p(ehci_orion_drv_remove),
|
||||
.shutdown = usb_hcd_platform_shutdown,
|
||||
.driver.name = "orion-ehci",
|
||||
.driver = {
|
||||
.name = "orion-ehci",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(ehci_orion_dt_ids),
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ static int ohci_xls_probe_internal(const struct hc_driver *driver,
|
|||
goto err3;
|
||||
}
|
||||
|
||||
retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
|
||||
retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
|
||||
if (retval != 0)
|
||||
goto err4;
|
||||
return retval;
|
||||
|
|
|
|||
|
|
@ -707,11 +707,12 @@ static void rxstate(struct musb *musb, struct musb_request *req)
|
|||
fifo_count = musb_readw(epio, MUSB_RXCOUNT);
|
||||
|
||||
/*
|
||||
* use mode 1 only if we expect data of at least ep packet_sz
|
||||
* and have not yet received a short packet
|
||||
* Enable Mode 1 on RX transfers only when short_not_ok flag
|
||||
* is set. Currently short_not_ok flag is set only from
|
||||
* file_storage and f_mass_storage drivers
|
||||
*/
|
||||
if ((request->length - request->actual >= musb_ep->packet_sz) &&
|
||||
(fifo_count >= musb_ep->packet_sz))
|
||||
|
||||
if (request->short_not_ok && fifo_count == musb_ep->packet_sz)
|
||||
use_mode_1 = 1;
|
||||
else
|
||||
use_mode_1 = 0;
|
||||
|
|
@ -727,6 +728,27 @@ static void rxstate(struct musb *musb, struct musb_request *req)
|
|||
c = musb->dma_controller;
|
||||
channel = musb_ep->dma;
|
||||
|
||||
/* We use DMA Req mode 0 in rx_csr, and DMA controller operates in
|
||||
* mode 0 only. So we do not get endpoint interrupts due to DMA
|
||||
* completion. We only get interrupts from DMA controller.
|
||||
*
|
||||
* We could operate in DMA mode 1 if we knew the size of the tranfer
|
||||
* in advance. For mass storage class, request->length = what the host
|
||||
* sends, so that'd work. But for pretty much everything else,
|
||||
* request->length is routinely more than what the host sends. For
|
||||
* most these gadgets, end of is signified either by a short packet,
|
||||
* or filling the last byte of the buffer. (Sending extra data in
|
||||
* that last pckate should trigger an overflow fault.) But in mode 1,
|
||||
* we don't get DMA completion interrupt for short packets.
|
||||
*
|
||||
* Theoretically, we could enable DMAReq irq (MUSB_RXCSR_DMAMODE = 1),
|
||||
* to get endpoint interrupt on every DMA req, but that didn't seem
|
||||
* to work reliably.
|
||||
*
|
||||
* REVISIT an updated g_file_storage can set req->short_not_ok, which
|
||||
* then becomes usable as a runtime "use mode 1" hint...
|
||||
*/
|
||||
|
||||
/* Experimental: Mode1 works with mass storage use cases */
|
||||
if (use_mode_1) {
|
||||
csr |= MUSB_RXCSR_AUTOCLEAR;
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ static int __devinit ux500_probe(struct platform_device *pdev)
|
|||
struct platform_device *musb;
|
||||
struct ux500_glue *glue;
|
||||
struct clk *clk;
|
||||
|
||||
int musbid;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ config USB_ULPI_VIEWPORT
|
|||
|
||||
config TWL4030_USB
|
||||
tristate "TWL4030 USB Transceiver Driver"
|
||||
depends on TWL4030_CORE && REGULATOR_TWL4030
|
||||
depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
Enable this to support the USB OTG transceiver on TWL4030
|
||||
|
|
@ -68,7 +68,7 @@ config TWL4030_USB
|
|||
|
||||
config TWL6030_USB
|
||||
tristate "TWL6030 USB Transceiver Driver"
|
||||
depends on TWL4030_CORE && OMAP_USB2
|
||||
depends on TWL4030_CORE && OMAP_USB2 && USB_MUSB_OMAP2PLUS
|
||||
select USB_OTG_UTILS
|
||||
help
|
||||
Enable this to support the USB OTG transceiver on TWL6030
|
||||
|
|
|
|||
|
|
@ -2430,7 +2430,7 @@ static void keyspan_release(struct usb_serial *serial)
|
|||
static int keyspan_port_probe(struct usb_serial_port *port)
|
||||
{
|
||||
struct usb_serial *serial = port->serial;
|
||||
struct keyspan_port_private *s_priv;
|
||||
struct keyspan_serial_private *s_priv;
|
||||
struct keyspan_port_private *p_priv;
|
||||
const struct keyspan_device_details *d_details;
|
||||
struct callbacks *cback;
|
||||
|
|
@ -2445,7 +2445,6 @@ static int keyspan_port_probe(struct usb_serial_port *port)
|
|||
if (!p_priv)
|
||||
return -ENOMEM;
|
||||
|
||||
s_priv = usb_get_serial_data(port->serial);
|
||||
p_priv->device_details = d_details;
|
||||
|
||||
/* Setup values for the various callback routines */
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ static void option_instat_callback(struct urb *urb);
|
|||
#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED 0x8001
|
||||
#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED 0x9000
|
||||
#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED 0x9001
|
||||
#define NOVATELWIRELESS_PRODUCT_E362 0x9010
|
||||
#define NOVATELWIRELESS_PRODUCT_G1 0xA001
|
||||
#define NOVATELWIRELESS_PRODUCT_G1_M 0xA002
|
||||
#define NOVATELWIRELESS_PRODUCT_G2 0xA010
|
||||
|
|
@ -193,6 +194,9 @@ static void option_instat_callback(struct urb *urb);
|
|||
#define DELL_PRODUCT_5730_MINICARD_TELUS 0x8181
|
||||
#define DELL_PRODUCT_5730_MINICARD_VZW 0x8182
|
||||
|
||||
#define DELL_PRODUCT_5800_MINICARD_VZW 0x8195 /* Novatel E362 */
|
||||
#define DELL_PRODUCT_5800_V2_MINICARD_VZW 0x8196 /* Novatel E362 */
|
||||
|
||||
#define KYOCERA_VENDOR_ID 0x0c88
|
||||
#define KYOCERA_PRODUCT_KPC650 0x17da
|
||||
#define KYOCERA_PRODUCT_KPC680 0x180a
|
||||
|
|
@ -283,6 +287,7 @@ static void option_instat_callback(struct urb *urb);
|
|||
/* ALCATEL PRODUCTS */
|
||||
#define ALCATEL_VENDOR_ID 0x1bbb
|
||||
#define ALCATEL_PRODUCT_X060S_X200 0x0000
|
||||
#define ALCATEL_PRODUCT_X220_X500D 0x0017
|
||||
|
||||
#define PIRELLI_VENDOR_ID 0x1266
|
||||
#define PIRELLI_PRODUCT_C100_1 0x1002
|
||||
|
|
@ -706,6 +711,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_G2) },
|
||||
/* Novatel Ovation MC551 a.k.a. Verizon USB551L */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC551, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E362, 0xff, 0xff, 0xff) },
|
||||
|
||||
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
|
||||
{ USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
|
||||
|
|
@ -728,6 +734,8 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
|
||||
{ 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(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) },
|
||||
|
|
@ -1157,6 +1165,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
||||
.driver_info = (kernel_ulong_t)&alcatel_x200_blacklist
|
||||
},
|
||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) },
|
||||
{ USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
|
||||
{ USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
|
||||
{ USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
|
||||
|
|
|
|||
|
|
@ -455,9 +455,6 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
|
|||
struct usb_serial *serial = port->serial;
|
||||
struct urb *urb;
|
||||
|
||||
if (endpoint == -1)
|
||||
return NULL; /* endpoint not needed */
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
|
||||
if (urb == NULL) {
|
||||
dev_dbg(&serial->interface->dev,
|
||||
|
|
@ -489,6 +486,9 @@ int usb_wwan_port_probe(struct usb_serial_port *port)
|
|||
init_usb_anchor(&portdata->delayed);
|
||||
|
||||
for (i = 0; i < N_IN_URB; i++) {
|
||||
if (!port->bulk_in_size)
|
||||
break;
|
||||
|
||||
buffer = (u8 *)__get_free_page(GFP_KERNEL);
|
||||
if (!buffer)
|
||||
goto bail_out_error;
|
||||
|
|
@ -502,8 +502,8 @@ int usb_wwan_port_probe(struct usb_serial_port *port)
|
|||
}
|
||||
|
||||
for (i = 0; i < N_OUT_URB; i++) {
|
||||
if (port->bulk_out_endpointAddress == -1)
|
||||
continue;
|
||||
if (!port->bulk_out_size)
|
||||
break;
|
||||
|
||||
buffer = kmalloc(OUT_BUFLEN, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
|
|
|
|||
Loading…
Reference in a new issue