Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 10955d22 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  USB: ftdi_sio - really enable EM1010PC
  USB: remove incorrect struct class_device from the printer gadget
  USB: pxa2xx_udc: fix misuse of clock enable/disable calls
  USB: ftdi_sio: Workaround for broken Matrix Orbital serial port
  USB: Add support for AXESSTEL MV110H CDMA modem
  usb-storage: update earlier scatter-gather bug fix
  USB: isp116x: fix enumeration on boot
  USB: ehci: handle large bulk URBs correctly (again)
  USB: spruce up the device blacklist
  USB: fix comment of struct usb_interface
  USB: update Kconfig entry for USB_SUSPEND
  usb: Add support for the mos7820/7840-based B&B USB/RS485 converter to mos7840.c
parents b2a5cd69 4ae897df
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -87,12 +87,13 @@ config USB_DYNAMIC_MINORS
	  If you are unsure about this, say N here.

config USB_SUSPEND
	bool "USB selective suspend/resume and wakeup (EXPERIMENTAL)"
	depends on USB && PM && EXPERIMENTAL
	bool "USB selective suspend/resume and wakeup"
	depends on USB && PM
	help
	  If you say Y here, you can use driver calls or the sysfs
	  "power/state" file to suspend or resume individual USB
	  peripherals.
	  "power/level" file to suspend or resume individual USB
	  peripherals and to enable or disable autosuspend (see
	  Documentation/usb/power-management.txt for more details).

	  Also, USB "remote wakeup" signaling is supported, whereby some
	  USB devices (like keyboards and network adapters) can wake up
+12 −9
Original line number Diff line number Diff line
@@ -28,35 +28,38 @@
 * devices is broken...
 */
static const struct usb_device_id usb_quirk_list[] = {
	/* Action Semiconductor flash disk */
	{ USB_DEVICE(0x10d6, 0x2200), .driver_info = USB_QUIRK_STRING_FETCH_255},

	/* CBM - Flash disk */
	{ USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },

	/* HP 5300/5370C scanner */
	{ USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 },
	{ USB_DEVICE(0x03f0, 0x0701), .driver_info =
			USB_QUIRK_STRING_FETCH_255 },

	/* Creative SB Audigy 2 NX */
	{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },

	/* Philips PSC805 audio device */
	{ USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },

	/* Roland SC-8820 */
	{ USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },

	/* Edirol SD-20 */
	{ USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },

	/* INTEL VALUE SSD */
	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },

	/* M-Systems Flash Disk Pioneers */
	{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },

	/* Philips PSC805 audio device */
	{ USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },
	/* Action Semiconductor flash disk */
	{ USB_DEVICE(0x10d6, 0x2200), .driver_info =
			USB_QUIRK_STRING_FETCH_255 },

	/* SKYMEDI USB_DRIVE */
	{ USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME },

	/* INTEL VALUE SSD */
	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },

	{ }  /* terminating entry must be last */
};

+0 −1
Original line number Diff line number Diff line
@@ -92,7 +92,6 @@ struct printer_dev {
	u8			*current_rx_buf;
	u8			printer_status;
	u8			reset_printer;
	struct class_device	*printer_class_dev;
	struct cdev		printer_cdev;
	struct device		*pdev;
	u8			printer_cdev_open;
+50 −38
Original line number Diff line number Diff line
@@ -103,6 +103,12 @@ static const char ep0name [] = "ep0";
#error "Can't configure both IXP and PXA"
#endif

/* IXP doesn't yet support <linux/clk.h> */
#define clk_get(dev,name)	NULL
#define clk_enable(clk)		do { } while (0)
#define clk_disable(clk)	do { } while (0)
#define clk_put(clk)		do { } while (0)

#endif

#include "pxa2xx_udc.h"
@@ -934,13 +940,19 @@ static void udc_disable(struct pxa2xx_udc *);
/* We disable the UDC -- and its 48 MHz clock -- whenever it's not
 * in active use.
 */
static int pullup(struct pxa2xx_udc *udc, int is_active)
static int pullup(struct pxa2xx_udc *udc)
{
	is_active = is_active && udc->vbus && udc->pullup;
	int is_active = udc->vbus && udc->pullup && !udc->suspended;
	DMSG("%s\n", is_active ? "active" : "inactive");
	if (is_active)
	if (is_active) {
		if (!udc->active) {
			udc->active = 1;
			/* Enable clock for USB device */
			clk_enable(udc->clk);
			udc_enable(udc);
	else {
		}
	} else {
		if (udc->active) {
			if (udc->gadget.speed != USB_SPEED_UNKNOWN) {
				DMSG("disconnect %s\n", udc->driver
					? udc->driver->driver.name
@@ -948,6 +960,11 @@ static int pullup(struct pxa2xx_udc *udc, int is_active)
				stop_activity(udc, udc->driver);
			}
			udc_disable(udc);
			/* Disable clock for USB device */
			clk_disable(udc->clk);
			udc->active = 0;
		}

	}
	return 0;
}
@@ -958,9 +975,9 @@ static int pxa2xx_udc_vbus_session(struct usb_gadget *_gadget, int is_active)
	struct pxa2xx_udc	*udc;

	udc = container_of(_gadget, struct pxa2xx_udc, gadget);
	udc->vbus = is_active = (is_active != 0);
	udc->vbus = (is_active != 0);
	DMSG("vbus %s\n", is_active ? "supplied" : "inactive");
	pullup(udc, is_active);
	pullup(udc);
	return 0;
}

@@ -975,9 +992,8 @@ static int pxa2xx_udc_pullup(struct usb_gadget *_gadget, int is_active)
	if (!udc->mach->gpio_pullup && !udc->mach->udc_command)
		return -EOPNOTSUPP;

	is_active = (is_active != 0);
	udc->pullup = is_active;
	pullup(udc, is_active);
	udc->pullup = (is_active != 0);
	pullup(udc);
	return 0;
}

@@ -997,7 +1013,7 @@ static const struct usb_gadget_ops pxa2xx_udc_ops = {
#ifdef CONFIG_USB_GADGET_DEBUG_FS

static int
udc_seq_show(struct seq_file *m, void *d)
udc_seq_show(struct seq_file *m, void *_d)
{
	struct pxa2xx_udc	*dev = m->private;
	unsigned long		flags;
@@ -1146,11 +1162,6 @@ static void udc_disable(struct pxa2xx_udc *dev)

	udc_clear_mask_UDCCR(UDCCR_UDE);

#ifdef	CONFIG_ARCH_PXA
        /* Disable clock for USB device */
	clk_disable(dev->clk);
#endif

	ep0_idle (dev);
	dev->gadget.speed = USB_SPEED_UNKNOWN;
}
@@ -1191,11 +1202,6 @@ static void udc_enable (struct pxa2xx_udc *dev)
{
	udc_clear_mask_UDCCR(UDCCR_UDE);

#ifdef	CONFIG_ARCH_PXA
        /* Enable clock for USB device */
	clk_enable(dev->clk);
#endif

	/* try to clear these bits before we enable the udc */
	udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR);

@@ -1286,7 +1292,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	 * for set_configuration as well as eventual disconnect.
	 */
	DMSG("registered gadget driver '%s'\n", driver->driver.name);
	pullup(dev, 1);
	pullup(dev);
	dump_state(dev);
	return 0;
}
@@ -1329,7 +1335,8 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
		return -EINVAL;

	local_irq_disable();
	pullup(dev, 0);
	dev->pullup = 0;
	pullup(dev);
	stop_activity(dev, driver);
	local_irq_enable();

@@ -2131,13 +2138,11 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev)
	if (irq < 0)
		return -ENODEV;

#ifdef	CONFIG_ARCH_PXA
	dev->clk = clk_get(&pdev->dev, "UDCCLK");
	if (IS_ERR(dev->clk)) {
		retval = PTR_ERR(dev->clk);
		goto err_clk;
	}
#endif

	pr_debug("%s: IRQ %d%s%s\n", driver_name, irq,
		dev->has_cfr ? "" : " (!cfr)",
@@ -2250,10 +2255,8 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev)
	if (dev->mach->gpio_vbus)
		gpio_free(dev->mach->gpio_vbus);
 err_gpio_vbus:
#ifdef	CONFIG_ARCH_PXA
	clk_put(dev->clk);
 err_clk:
#endif
	return retval;
}

@@ -2269,7 +2272,9 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
	if (dev->driver)
		return -EBUSY;

	udc_disable(dev);
	dev->pullup = 0;
	pullup(dev);

	remove_debug_files(dev);

	if (dev->got_irq) {
@@ -2289,9 +2294,7 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
	if (dev->mach->gpio_pullup)
		gpio_free(dev->mach->gpio_pullup);

#ifdef	CONFIG_ARCH_PXA
	clk_put(dev->clk);
#endif

	platform_set_drvdata(pdev, NULL);
	the_controller = NULL;
@@ -2317,10 +2320,15 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state)
{
	struct pxa2xx_udc	*udc = platform_get_drvdata(dev);
	unsigned long flags;

	if (!udc->mach->gpio_pullup && !udc->mach->udc_command)
		WARN("USB host won't detect disconnect!\n");
	pullup(udc, 0);
	udc->suspended = 1;

	local_irq_save(flags);
	pullup(udc);
	local_irq_restore(flags);

	return 0;
}
@@ -2328,8 +2336,12 @@ static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state)
static int pxa2xx_udc_resume(struct platform_device *dev)
{
	struct pxa2xx_udc	*udc = platform_get_drvdata(dev);
	unsigned long flags;

	pullup(udc, 1);
	udc->suspended = 0;
	local_irq_save(flags);
	pullup(udc);
	local_irq_restore(flags);

	return 0;
}
+3 −1
Original line number Diff line number Diff line
@@ -119,7 +119,9 @@ struct pxa2xx_udc {
						has_cfr : 1,
						req_pending : 1,
						req_std : 1,
						req_config : 1;
						req_config : 1,
						suspended : 1,
						active : 1;

#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200))
	struct timer_list			timer;
Loading