Commit 17a3be34 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (30 commits)
  USB: Fix a bug on appledisplay.c regarding signedness
  USB: option: support hi speed for modem Haier CE100
  USB: audio gadget: free alsa devices when unloading
  USB: audio gadget: fix wTotalLength calculation
  usb: otg: isp1301_omap: fix compile error
  USB: musb: workaround Blackfin FIFO anomalies
  USB: musb: Fix array index out of bounds issue
  USB: musb: Fix null pointer dereference issue
  USB: musb: correct DMA address for tx
  USB: musb: gadget_ep0: avoid SetupEnd interrupt
  USB: musb: fix for crash in DM646x USB when (CPPI)DMA is enabled
  USB: musb: do not work if no gadget driver is loaded
  USB: musb: gadget: set otg tranceiver to idle when registering gadget
  USB: musb: Populate the VBUS GPIO with the correct GPIO number
  USB: musb: MAINTAINERS: Fix my tree's address
  USB: musb: fix compiling warning with min() macro
  USB: musb: move musb_remove to __exit
  USB: musb_gadget: fix kernel oops in txstate()
  USB: ftdi_sio: sort PID/VID entries in new ftdi_sio_ids.h header
  USB: ftdi_sio: isolate all device IDs to new ftdi_sio_ids.h header
  ...
parents f793067e 37e9066b
...@@ -21,25 +21,27 @@ Contact: Alan Stern <stern@rowland.harvard.edu> ...@@ -21,25 +21,27 @@ Contact: Alan Stern <stern@rowland.harvard.edu>
Description: Description:
Each USB device directory will contain a file named Each USB device directory will contain a file named
power/level. This file holds a power-level setting for power/level. This file holds a power-level setting for
the device, one of "on", "auto", or "suspend". the device, either "on" or "auto".
"on" means that the device is not allowed to autosuspend, "on" means that the device is not allowed to autosuspend,
although normal suspends for system sleep will still although normal suspends for system sleep will still
be honored. "auto" means the device will autosuspend be honored. "auto" means the device will autosuspend
and autoresume in the usual manner, according to the and autoresume in the usual manner, according to the
capabilities of its driver. "suspend" means the device capabilities of its driver.
is forced into a suspended state and it will not autoresume
in response to I/O requests. However remote-wakeup requests
from the device may still be enabled (the remote-wakeup
setting is controlled separately by the power/wakeup
attribute).
During normal use, devices should be left in the "auto" During normal use, devices should be left in the "auto"
level. The other levels are meant for administrative uses. level. The "on" level is meant for administrative uses.
If you want to suspend a device immediately but leave it If you want to suspend a device immediately but leave it
free to wake up in response to I/O requests, you should free to wake up in response to I/O requests, you should
write "0" to power/autosuspend. write "0" to power/autosuspend.
Device not capable of proper suspend and resume should be
left in the "on" level. Although the USB spec requires
devices to support suspend/resume, many of them do not.
In fact so many don't that by default, the USB core
initializes all non-hub devices in the "on" level. Some
drivers may change this setting when they are bound.
What: /sys/bus/usb/devices/.../power/persist What: /sys/bus/usb/devices/.../power/persist
Date: May 2007 Date: May 2007
KernelVersion: 2.6.23 KernelVersion: 2.6.23
......
...@@ -71,12 +71,10 @@ being accessed through sysfs, then it definitely is idle. ...@@ -71,12 +71,10 @@ being accessed through sysfs, then it definitely is idle.
Forms of dynamic PM Forms of dynamic PM
------------------- -------------------
Dynamic suspends can occur in two ways: manual and automatic. Dynamic suspends occur when the kernel decides to suspend an idle
"Manual" means that the user has told the kernel to suspend a device, device. This is called "autosuspend" for short. In general, a device
whereas "automatic" means that the kernel has decided all by itself to won't be autosuspended unless it has been idle for some minimum period
suspend a device. Automatic suspend is called "autosuspend" for of time, the so-called idle-delay time.
short. In general, a device won't be autosuspended unless it has been
idle for some minimum period of time, the so-called idle-delay time.
Of course, nothing the kernel does on its own initiative should Of course, nothing the kernel does on its own initiative should
prevent the computer or its devices from working properly. If a prevent the computer or its devices from working properly. If a
...@@ -96,10 +94,11 @@ idle. ...@@ -96,10 +94,11 @@ idle.
We can categorize power management events in two broad classes: We can categorize power management events in two broad classes:
external and internal. External events are those triggered by some external and internal. External events are those triggered by some
agent outside the USB stack: system suspend/resume (triggered by agent outside the USB stack: system suspend/resume (triggered by
userspace), manual dynamic suspend/resume (also triggered by userspace), manual dynamic resume (also triggered by userspace), and
userspace), and remote wakeup (triggered by the device). Internal remote wakeup (triggered by the device). Internal events are those
events are those triggered within the USB stack: autosuspend and triggered within the USB stack: autosuspend and autoresume. Note that
autoresume. all dynamic suspend events are internal; external agents are not
allowed to issue dynamic suspends.
The user interface for dynamic PM The user interface for dynamic PM
...@@ -145,9 +144,9 @@ relevant attribute files are: wakeup, level, and autosuspend. ...@@ -145,9 +144,9 @@ relevant attribute files are: wakeup, level, and autosuspend.
number of seconds the device should remain idle before number of seconds the device should remain idle before
the kernel will autosuspend it (the idle-delay time). the kernel will autosuspend it (the idle-delay time).
The default is 2. 0 means to autosuspend as soon as The default is 2. 0 means to autosuspend as soon as
the device becomes idle, and -1 means never to the device becomes idle, and negative values mean
autosuspend. You can write a number to the file to never to autosuspend. You can write a number to the
change the autosuspend idle-delay time. file to change the autosuspend idle-delay time.
Writing "-1" to power/autosuspend and writing "on" to power/level do Writing "-1" to power/autosuspend and writing "on" to power/level do
essentially the same thing -- they both prevent the device from being essentially the same thing -- they both prevent the device from being
...@@ -377,9 +376,9 @@ the device hasn't been idle for long enough, a delayed workqueue ...@@ -377,9 +376,9 @@ the device hasn't been idle for long enough, a delayed workqueue
routine is automatically set up to carry out the operation when the routine is automatically set up to carry out the operation when the
autosuspend idle-delay has expired. autosuspend idle-delay has expired.
Autoresume attempts also can fail. This will happen if power/level is Autoresume attempts also can fail, although failure would mean that
set to "suspend" or if the device doesn't manage to resume properly. the device is no longer present or operating properly. Unlike
Unlike autosuspend, there's no delay for an autoresume. autosuspend, there's no delay for an autoresume.
Other parts of the driver interface Other parts of the driver interface
...@@ -527,13 +526,3 @@ succeed, it may still remain active and thus cause the system to ...@@ -527,13 +526,3 @@ succeed, it may still remain active and thus cause the system to
resume as soon as the system suspend is complete. Or the remote resume as soon as the system suspend is complete. Or the remote
wakeup may fail and get lost. Which outcome occurs depends on timing wakeup may fail and get lost. Which outcome occurs depends on timing
and on the hardware and firmware design. and on the hardware and firmware design.
More interestingly, a device might undergo a manual resume or
autoresume during system suspend. With current kernels this shouldn't
happen, because manual resumes must be initiated by userspace and
autoresumes happen in response to I/O requests, but all user processes
and I/O should be quiescent during a system suspend -- thanks to the
freezer. However there are plans to do away with the freezer, which
would mean these things would become possible. If and when this comes
about, the USB core will carefully arrange matters so that either type
of resume will block until the entire system has resumed.
...@@ -3679,7 +3679,7 @@ F: include/linux/isicom.h ...@@ -3679,7 +3679,7 @@ F: include/linux/isicom.h
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
M: Felipe Balbi <felipe.balbi@nokia.com> M: Felipe Balbi <felipe.balbi@nokia.com>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
T: git git://gitorious.org/musb/mainline.git T: git git://gitorious.org/usb/usb.git
S: Maintained S: Maintained
F: drivers/usb/musb/ F: drivers/usb/musb/
......
...@@ -44,5 +44,3 @@ obj-y += early/ ...@@ -44,5 +44,3 @@ obj-y += early/
obj-$(CONFIG_USB_ATM) += atm/ obj-$(CONFIG_USB_ATM) += atm/
obj-$(CONFIG_USB_SPEEDTOUCH) += atm/ obj-$(CONFIG_USB_SPEEDTOUCH) += atm/
obj-$(CONFIG_USB_ULPI) += otg/
...@@ -1597,7 +1597,9 @@ void usb_hcd_flush_endpoint(struct usb_device *udev, ...@@ -1597,7 +1597,9 @@ void usb_hcd_flush_endpoint(struct usb_device *udev,
} }
/** /**
* Check whether a new bandwidth setting exceeds the bus bandwidth. * usb_hcd_alloc_bandwidth - check whether a new bandwidth setting exceeds
* the bus bandwidth
* @udev: target &usb_device
* @new_config: new configuration to install * @new_config: new configuration to install
* @cur_alt: the current alternate interface setting * @cur_alt: the current alternate interface setting
* @new_alt: alternate interface setting that is being installed * @new_alt: alternate interface setting that is being installed
......
...@@ -1658,12 +1658,12 @@ static inline void announce_device(struct usb_device *udev) { } ...@@ -1658,12 +1658,12 @@ static inline void announce_device(struct usb_device *udev) { }
#endif #endif
/** /**
* usb_configure_device_otg - FIXME (usbcore-internal) * usb_enumerate_device_otg - FIXME (usbcore-internal)
* @udev: newly addressed device (in ADDRESS state) * @udev: newly addressed device (in ADDRESS state)
* *
* Do configuration for On-The-Go devices * Finish enumeration for On-The-Go devices
*/ */
static int usb_configure_device_otg(struct usb_device *udev) static int usb_enumerate_device_otg(struct usb_device *udev)
{ {
int err = 0; int err = 0;
...@@ -1734,7 +1734,7 @@ static int usb_configure_device_otg(struct usb_device *udev) ...@@ -1734,7 +1734,7 @@ static int usb_configure_device_otg(struct usb_device *udev)
/** /**
* usb_configure_device - Detect and probe device intfs/otg (usbcore-internal) * usb_enumerate_device - Read device configs/intfs/otg (usbcore-internal)
* @udev: newly addressed device (in ADDRESS state) * @udev: newly addressed device (in ADDRESS state)
* *
* This is only called by usb_new_device() and usb_authorize_device() * This is only called by usb_new_device() and usb_authorize_device()
...@@ -1745,7 +1745,7 @@ static int usb_configure_device_otg(struct usb_device *udev) ...@@ -1745,7 +1745,7 @@ static int usb_configure_device_otg(struct usb_device *udev)
* the string descriptors, as they will be errored out by the device * the string descriptors, as they will be errored out by the device
* until it has been authorized. * until it has been authorized.
*/ */
static int usb_configure_device(struct usb_device *udev) static int usb_enumerate_device(struct usb_device *udev)
{ {
int err; int err;
...@@ -1769,7 +1769,7 @@ static int usb_configure_device(struct usb_device *udev) ...@@ -1769,7 +1769,7 @@ static int usb_configure_device(struct usb_device *udev)
udev->descriptor.iManufacturer); udev->descriptor.iManufacturer);
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
} }
err = usb_configure_device_otg(udev); err = usb_enumerate_device_otg(udev);
fail: fail:
return err; return err;
} }
...@@ -1779,8 +1779,8 @@ static int usb_configure_device(struct usb_device *udev) ...@@ -1779,8 +1779,8 @@ static int usb_configure_device(struct usb_device *udev)
* usb_new_device - perform initial device setup (usbcore-internal) * usb_new_device - perform initial device setup (usbcore-internal)
* @udev: newly addressed device (in ADDRESS state) * @udev: newly addressed device (in ADDRESS state)
* *
* This is called with devices which have been enumerated, but not yet * This is called with devices which have been detected but not fully
* configured. The device descriptor is available, but not descriptors * enumerated. The device descriptor is available, but not descriptors
* for any device configuration. The caller must have locked either * for any device configuration. The caller must have locked either
* the parent hub (if udev is a normal device) or else the * the parent hub (if udev is a normal device) or else the
* usb_bus_list_lock (if udev is a root hub). The parent's pointer to * usb_bus_list_lock (if udev is a root hub). The parent's pointer to
...@@ -1803,8 +1803,8 @@ int usb_new_device(struct usb_device *udev) ...@@ -1803,8 +1803,8 @@ int usb_new_device(struct usb_device *udev)
if (udev->parent) if (udev->parent)
usb_autoresume_device(udev->parent); usb_autoresume_device(udev->parent);
usb_detect_quirks(udev); /* Determine quirks */ usb_detect_quirks(udev);
err = usb_configure_device(udev); /* detect & probe dev/intfs */ err = usb_enumerate_device(udev); /* Read descriptors */
if (err < 0) if (err < 0)
goto fail; goto fail;
dev_dbg(&udev->dev, "udev %d, busnum %d, minor = %d\n", dev_dbg(&udev->dev, "udev %d, busnum %d, minor = %d\n",
...@@ -1849,21 +1849,23 @@ int usb_new_device(struct usb_device *udev) ...@@ -1849,21 +1849,23 @@ int usb_new_device(struct usb_device *udev)
*/ */
int usb_deauthorize_device(struct usb_device *usb_dev) int usb_deauthorize_device(struct usb_device *usb_dev)
{ {
unsigned cnt;
usb_lock_device(usb_dev); usb_lock_device(usb_dev);
if (usb_dev->authorized == 0) if (usb_dev->authorized == 0)
goto out_unauthorized; goto out_unauthorized;
usb_dev->authorized = 0; usb_dev->authorized = 0;
usb_set_configuration(usb_dev, -1); usb_set_configuration(usb_dev, -1);
kfree(usb_dev->product);
usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
kfree(usb_dev->manufacturer);
usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
kfree(usb_dev->serial);
usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
kfree(usb_dev->config);
usb_dev->config = NULL; usb_destroy_configuration(usb_dev);
for (cnt = 0; cnt < usb_dev->descriptor.bNumConfigurations; cnt++)
kfree(usb_dev->rawdescriptors[cnt]);
usb_dev->descriptor.bNumConfigurations = 0; usb_dev->descriptor.bNumConfigurations = 0;
kfree(usb_dev->rawdescriptors);
out_unauthorized: out_unauthorized:
usb_unlock_device(usb_dev); usb_unlock_device(usb_dev);
return 0; return 0;
...@@ -1873,15 +1875,11 @@ int usb_deauthorize_device(struct usb_device *usb_dev) ...@@ -1873,15 +1875,11 @@ int usb_deauthorize_device(struct usb_device *usb_dev)
int usb_authorize_device(struct usb_device *usb_dev) int usb_authorize_device(struct usb_device *usb_dev)
{ {
int result = 0, c; int result = 0, c;
usb_lock_device(usb_dev); usb_lock_device(usb_dev);
if (usb_dev->authorized == 1) if (usb_dev->authorized == 1)
goto out_authorized; goto out_authorized;
kfree(usb_dev->product);
usb_dev->product = NULL;
kfree(usb_dev->manufacturer);
usb_dev->manufacturer = NULL;
kfree(usb_dev->serial);
usb_dev->serial = NULL;
result = usb_autoresume_device(usb_dev); result = usb_autoresume_device(usb_dev);
if (result < 0) { if (result < 0) {
dev_err(&usb_dev->dev, dev_err(&usb_dev->dev,
...@@ -1894,10 +1892,18 @@ int usb_authorize_device(struct usb_device *usb_dev) ...@@ -1894,10 +1892,18 @@ int usb_authorize_device(struct usb_device *usb_dev)
"authorization: %d\n", result); "authorization: %d\n", result);
goto error_device_descriptor; goto error_device_descriptor;
} }
kfree(usb_dev->product);
usb_dev->product = NULL;
kfree(usb_dev->manufacturer);
usb_dev->manufacturer = NULL;
kfree(usb_dev->serial);
usb_dev->serial = NULL;
usb_dev->authorized = 1; usb_dev->authorized = 1;
result = usb_configure_device(usb_dev); result = usb_enumerate_device(usb_dev);
if (result < 0) if (result < 0)
goto error_configure; goto error_enumerate;
/* Choose and set the configuration. This registers the interfaces /* Choose and set the configuration. This registers the interfaces
* with the driver core and lets interface drivers bind to them. * with the driver core and lets interface drivers bind to them.
*/ */
...@@ -1912,8 +1918,10 @@ int usb_authorize_device(struct usb_device *usb_dev) ...@@ -1912,8 +1918,10 @@ int usb_authorize_device(struct usb_device *usb_dev)
} }
} }
dev_info(&usb_dev->dev, "authorized to connect\n"); dev_info(&usb_dev->dev, "authorized to connect\n");
error_configure:
error_enumerate:
error_device_descriptor: error_device_descriptor:
usb_autosuspend_device(usb_dev);
error_autoresume: error_autoresume:
out_authorized: out_authorized:
usb_unlock_device(usb_dev); // complements locktree usb_unlock_device(usb_dev); // complements locktree
......
...@@ -82,9 +82,13 @@ static ssize_t show_##name(struct device *dev, \ ...@@ -82,9 +82,13 @@ static ssize_t show_##name(struct device *dev, \
struct device_attribute *attr, char *buf) \ struct device_attribute *attr, char *buf) \
{ \ { \
struct usb_device *udev; \ struct usb_device *udev; \
int retval; \
\ \
udev = to_usb_device(dev); \ udev = to_usb_device(dev); \
return sprintf(buf, "%s\n", udev->name); \ usb_lock_device(udev); \
retval = sprintf(buf, "%s\n", udev->name); \
usb_unlock_device(udev); \
return retval; \
} \ } \
static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL); static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
......
...@@ -66,9 +66,9 @@ MODULE_PARM_DESC(autosuspend, "default autosuspend delay"); ...@@ -66,9 +66,9 @@ MODULE_PARM_DESC(autosuspend, "default autosuspend delay");
/** /**
* usb_find_alt_setting() - Given a configuration, find the alternate setting * usb_find_alt_setting() - Given a configuration, find the alternate setting
* for the given interface. * for the given interface.
* @config - the configuration to search (not necessarily the current config). * @config: the configuration to search (not necessarily the current config).
* @iface_num - interface number to search in * @iface_num: interface number to search in
* @alt_num - alternate interface setting number to search for. * @alt_num: alternate interface setting number to search for.
* *
* Search the configuration's interface cache for the given alt setting. * Search the configuration's interface cache for the given alt setting.
*/ */
......
...@@ -613,7 +613,7 @@ int dbgp_external_startup(void) ...@@ -613,7 +613,7 @@ int dbgp_external_startup(void)
} }
EXPORT_SYMBOL_GPL(dbgp_external_startup); EXPORT_SYMBOL_GPL(dbgp_external_startup);
static int __init ehci_reset_port(int port) static int ehci_reset_port(int port)
{ {
u32 portsc; u32 portsc;
u32 delay_time, delay; u32 delay_time, delay;
......
...@@ -158,6 +158,7 @@ static int __init audio_bind(struct usb_composite_dev *cdev) ...@@ -158,6 +158,7 @@ static int __init audio_bind(struct usb_composite_dev *cdev)
static int __exit audio_unbind(struct usb_composite_dev *cdev) static int __exit audio_unbind(struct usb_composite_dev *cdev)
{ {
gaudio_cleanup();
return 0; return 0;
} }
......
...@@ -56,13 +56,16 @@ static struct usb_interface_descriptor ac_interface_desc __initdata = { ...@@ -56,13 +56,16 @@ static struct usb_interface_descriptor ac_interface_desc __initdata = {
DECLARE_UAC_AC_HEADER_DESCRIPTOR(2); DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);
#define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES) #define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
/* 1 input terminal, 1 output terminal and 1 feature unit */
#define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH + UAC_DT_INPUT_TERMINAL_SIZE \
+ UAC_DT_OUTPUT_TERMINAL_SIZE + UAC_DT_FEATURE_UNIT_SIZE(0))
/* B.3.2 Class-Specific AC Interface Descriptor */ /* B.3.2 Class-Specific AC Interface Descriptor */
static struct uac_ac_header_descriptor_2 ac_header_desc = { static struct uac_ac_header_descriptor_2 ac_header_desc = {
.bLength = UAC_DT_AC_HEADER_LENGTH, .bLength = UAC_DT_AC_HEADER_LENGTH,
.bDescriptorType = USB_DT_CS_INTERFACE, .bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = UAC_HEADER, .bDescriptorSubtype = UAC_HEADER,
.bcdADC = __constant_cpu_to_le16(0x0100), .bcdADC = __constant_cpu_to_le16(0x0100),
.wTotalLength = __constant_cpu_to_le16(UAC_DT_AC_HEADER_LENGTH), .wTotalLength = __constant_cpu_to_le16(UAC_DT_TOTAL_LENGTH),
.bInCollection = F_AUDIO_NUM_INTERFACES, .bInCollection = F_AUDIO_NUM_INTERFACES,
.baInterfaceNr = { .baInterfaceNr = {
[0] = F_AUDIO_AC_INTERFACE, [0] = F_AUDIO_AC_INTERFACE,
...@@ -252,12 +255,12 @@ static struct f_audio_buf *f_audio_buffer_alloc(int buf_size) ...@@ -252,12 +255,12 @@ static struct f_audio_buf *f_audio_buffer_alloc(int buf_size)
copy_buf = kzalloc(sizeof *copy_buf, GFP_ATOMIC); copy_buf = kzalloc(sizeof *copy_buf, GFP_ATOMIC);
if (!copy_buf) if (!copy_buf)
return (struct f_audio_buf *)-ENOMEM; return ERR_PTR(-ENOMEM);
copy_buf->buf = kzalloc(buf_size, GFP_ATOMIC); copy_buf->buf = kzalloc(buf_size, GFP_ATOMIC);
if (!copy_buf->buf) { if (!copy_buf->buf) {
kfree(copy_buf); kfree(copy_buf);
return (struct f_audio_buf *)-ENOMEM; return ERR_PTR(-ENOMEM);
} }
return copy_buf; return copy_buf;
...@@ -332,7 +335,7 @@ static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req) ...@@ -332,7 +335,7 @@ static int f_audio_out_ep_complete(struct usb_ep *ep, struct usb_request *req)
list_add_tail(&copy_buf->list, &audio->play_queue); list_add_tail(&copy_buf->list, &audio->play_queue);
schedule_work(&audio->playback_work); schedule_work(&audio->playback_work);
copy_buf = f_audio_buffer_alloc(audio_buf_size); copy_buf = f_audio_buffer_alloc(audio_buf_size);
if (copy_buf < 0) if (IS_ERR(copy_buf))
return -ENOMEM; return -ENOMEM;
} }
...@@ -576,6 +579,8 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ...@@ -576,6 +579,8 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
usb_ep_enable(out_ep, audio->out_desc); usb_ep_enable(out_ep, audio->out_desc);
out_ep->driver_data = audio; out_ep->driver_data = audio;
audio->copy_buf = f_audio_buffer_alloc(audio_buf_size); audio->copy_buf = f_audio_buffer_alloc(audio_buf_size);
if (IS_ERR(audio->copy_buf))
return -ENOMEM;
/* /*
* allocate a bunch of read buffers * allocate a bunch of read buffers
...@@ -787,7 +792,7 @@ int __init audio_bind_config(struct usb_configuration *c) ...@@ -787,7 +792,7 @@ int __init audio_bind_config(struct usb_configuration *c)
return status; return status;
add_fail: add_fail:
gaudio_cleanup(&audio->card); gaudio_cleanup();
setup_fail: setup_fail:
kfree(audio); kfree(audio);
return status; return status;
......
...@@ -288,6 +288,7 @@ static int gaudio_close_snd_dev(struct gaudio *gau) ...@@ -288,6 +288,7 @@ static int gaudio_close_snd_dev(struct gaudio *gau)
return 0; return 0;
} }
static struct gaudio *the_card;
/** /**
* gaudio_setup - setup ALSA interface and preparing for USB transfer * gaudio_setup - setup ALSA interface and preparing for USB transfer
* *
...@@ -303,6 +304,9 @@ int __init gaudio_setup(struct gaudio *card) ...@@ -303,6 +304,9 @@ int __init gaudio_setup(struct gaudio *card)
if (ret) if (ret)
ERROR(card, "we need at least one control device\n"); ERROR(card, "we need at least one control device\n");
if (!the_card)
the_card = card;
return ret; return ret;
} }
...@@ -312,9 +316,11 @@ int __init gaudio_setup(struct gaudio *card) ...@@ -312,9 +316,11 @@ int __init gaudio_setup(struct gaudio *card)
* *
* This is called to free all resources allocated by @gaudio_setup(). * This is called to free all resources allocated by @gaudio_setup().
*/ */
void gaudio_cleanup(struct gaudio *card) void gaudio_cleanup(void)
{ {
if (card) if (the_card) {
gaudio_close_snd_dev(card); gaudio_close_snd_dev(the_card);
the_card = NULL;
}
} }
...@@ -51,6 +51,6 @@ struct gaudio { ...@@ -51,6 +51,6 @@ struct gaudio {
}; };
int gaudio_setup(struct gaudio *card); int gaudio_setup(struct gaudio *card);
void gaudio_cleanup(struct gaudio *card); void gaudio_cleanup(void);
#endif /* __U_AUDIO_H */ #endif /* __U_AUDIO_H */
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
static struct usb_device_id appledisplay_table [] = { static struct usb_device_id appledisplay_table [] = {
{ APPLEDISPLAY_DEVICE(0x9218) }, { APPLEDISPLAY_DEVICE(0x9218) },
{ APPLEDISPLAY_DEVICE(0x9219) }, { APPLEDISPLAY_DEVICE(0x9219) },
{ APPLEDISPLAY_DEVICE(0x921c) },
{ APPLEDISPLAY_DEVICE(0x921d) }, { APPLEDISPLAY_DEVICE(0x921d) },
/* Terminating entry */ /* Terminating entry */
...@@ -72,8 +73,8 @@ struct appledisplay { ...@@ -72,8 +73,8 @@ struct appledisplay {
struct usb_device *udev; /* usb device */ struct usb_device *udev; /* usb device */
struct urb *urb; /* usb request block */ struct urb *urb; /* usb request block */
struct backlight_device *bd; /* backlight device */ struct backlight_device *bd; /* backlight device */
char *urbdata; /* interrupt URB data buffer */ u8 *urbdata; /* interrupt URB data buffer */
char *msgdata; /* control message data buffer */ u8 *msgdata; /* control message data buffer */
struct delayed_work work; struct delayed_work work;
int button_pressed; int button_pressed;
......
...@@ -167,7 +167,7 @@ static int emi62_load_firmware (struct usb_device *dev) ...@@ -167,7 +167,7 @@ static int emi62_load_firmware (struct usb_device *dev)
err("%s - error loading firmware: error = %d", __func__, err); err("%s - error loading firmware: error = %d", __func__, err);
goto wraperr; goto wraperr;
} }
} while (i > 0); } while (rec);
/* Assert reset (stop the CPU in the EMI) */ /* Assert reset (stop the CPU in the EMI) */
err = emi62_set_reset(dev,1); err = emi62_set_reset(dev,1);
......
...@@ -29,6 +29,8 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) ...@@ -29,6 +29,8 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
{ {
void __iomem *fifo = hw_ep->fifo; void __iomem *fifo = hw_ep->fifo;
void __iomem *epio = hw_ep->regs; void __iomem *epio = hw_ep->regs;
u8 epnum = hw_ep->epnum;
u16 dma_reg = 0;
prefetch((u8 *)src); prefetch((u8 *)src);
...@@ -39,25 +41,63 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) ...@@ -39,25 +41,63 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src)
dump_fifo_data(src, len); dump_fifo_data(src, len);
if (!ANOMALY_05000380 && epnum != 0) {
flush_dcache_range((unsigned int)src,
(unsigned int)(src + len));
/* Setup DMA address register */
dma_reg = (u16) ((u32) src & 0xFFFF);
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_ADDR_LOW), dma_reg);
SSYNC();
dma_reg = (u16) (((u32) src >> 16) & 0xFFFF);
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_ADDR_HIGH), dma_reg);
SSYNC();
/* Setup DMA count register */
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_COUNT_LOW), len);
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_COUNT_HIGH), 0);
SSYNC();
/* Enable the DMA */
dma_reg = (epnum << 4) | DMA_ENA | INT_ENA | DIRECTION;
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), dma_reg);
SSYNC();
/* Wait for compelete */
while (!(bfin_read_USB_DMA_INTERRUPT() & (1 << epnum)))
cpu_relax();
/* acknowledge dma interrupt */
bfin_write_USB_DMA_INTERRUPT(1 << epnum);
SSYNC();
/* Reset DMA */
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0);
SSYNC();
} else {
SSYNC();
if (unlikely((unsigned long)src & 0x01)) if (unlikely((unsigned long)src & 0x01))
outsw_8((unsigned long)fifo, src, outsw_8((unsigned long)fifo, src,
len & 0x01 ? (len >> 1) + 1 : len >> 1); len & 0x01 ? (len >> 1) + 1 : len >> 1);
else else
outsw((unsigned long)fifo, src, outsw((unsigned long)fifo, src,
len & 0x01 ? (len >> 1) + 1 : len >> 1); len & 0x01 ? (len >> 1) + 1 : len >> 1);
}
}
}
/* /*
* Unload an endpoint's FIFO * Unload an endpoint's FIFO
*/ */
void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
{ {
void __iomem *fifo = hw_ep->fifo; void __iomem *fifo = hw_ep->fifo;
#ifdef CONFIG_BF52x
u8 epnum = hw_ep->epnum; u8 epnum = hw_ep->epnum;
u16 dma_reg = 0; u16 dma_reg = 0;
if (ANOMALY_05000467 && epnum != 0) {
invalidate_dcache_range((unsigned int)dst, invalidate_dcache_range((unsigned int)dst,
(unsigned int)(dst + len)); (unsigned int)(dst + len));
...@@ -91,15 +131,23 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) ...@@ -91,15 +131,23 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
/* Reset DMA */ /* Reset DMA */
bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0); bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), 0);
SSYNC(); SSYNC();
#else } else {
SSYNC();
/* Read the last byte of packet with odd size from address fifo + 4
* to trigger 1 byte access to EP0 FIFO.
*/
if (len == 1)
*dst = (u8)inw((unsigned long)fifo + 4);
else {
if (unlikely((unsigned long)dst & 0x01)) if (unlikely((unsigned long)dst & 0x01))
insw_8((unsigned long)fifo, dst, insw_8((unsigned long)fifo, dst, len >> 1);
len & 0x01 ? (len >> 1) + 1 : len >> 1);
else else
insw((unsigned long)fifo, dst, insw((unsigned long)fifo, dst, len >> 1);
len & 0x01 ? (len >> 1) + 1 : len >> 1);
#endif
if (len & 0x01)
*(dst + len - 1) = (u8)inw((unsigned long)fifo + 4);
}
}
DBG(4, "%cX ep%d fifo %p count %d buf %p\n", DBG(4, "%cX ep%d fifo %p count %d buf %p\n",
'R', hw_ep->epnum, fifo, len, dst); 'R', hw_ep->epnum, fifo, len, dst);
......
...@@ -69,7 +69,6 @@ static void dump_fifo_data(u8 *buf, u16 len) ...@@ -69,7 +69,6 @@ static void dump_fifo_data(u8 *buf, u16 len)
#define dump_fifo_data(buf, len) do {} while (0) #define dump_fifo_data(buf, len) do {} while (0)
#endif #endif
#ifdef CONFIG_BF52x
#define USB_DMA_BASE USB_DMA_INTERRUPT #define USB_DMA_BASE USB_DMA_INTERRUPT
#define USB_DMAx_CTRL 0x04 #define USB_DMAx_CTRL 0x04
...@@ -79,7 +78,6 @@ static void dump_fifo_data(u8 *buf, u16 len) ...@@ -79,7 +78,6 @@ static void dump_fifo_data(u8 *buf, u16 len)
#define USB_DMAx_COUNT_HIGH 0x14 #define USB_DMAx_COUNT_HIGH 0x14
#define USB_DMA_REG(ep, reg) (USB_DMA_BASE + 0x20 * ep + reg) #define USB_DMA_REG(ep, reg) (USB_DMA_BASE + 0x20 * ep + reg)
#endif
/* Almost 1 second */ /* Almost 1 second */
#define TIMER_DELAY (1 * HZ) #define TIMER_DELAY (1 * HZ)
......
...@@ -1154,8 +1154,11 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) ...@@ -1154,8 +1154,11 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id)
struct musb_hw_ep *hw_ep = NULL; struct musb_hw_ep *hw_ep = NULL;
u32 rx, tx; u32 rx, tx;
int i, index; int i, index;
unsigned long flags;
cppi = container_of(musb->dma_controller, struct cppi, controller); cppi = container_of(musb->dma_controller, struct cppi, controller);
if (cppi->irq)
spin_lock_irqsave(&musb->lock, flags);
tibase = musb->ctrl_base; tibase = musb->ctrl_base;
...@@ -1285,6 +1288,9 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id) ...@@ -1285,6 +1288,9 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id)
/* write to CPPI EOI register to re-enable interrupts */ /* write to CPPI EOI register to re-enable interrupts */
musb_writel(tibase, DAVINCI_CPPI_EOI_REG, 0); musb_writel(tibase, DAVINCI_CPPI_EOI_REG, 0);
if (cppi->irq)
spin_unlock_irqrestore(&musb->lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#include "musb_core.h" #include "musb_core.h"
#ifdef CONFIG_MACH_DAVINCI_EVM #ifdef CONFIG_MACH_DAVINCI_EVM
#define GPIO_nVBUS_DRV 144 #define GPIO_nVBUS_DRV 160
#endif #endif
#include "davinci.h" #include "davinci.h"
......
...@@ -1319,7 +1319,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) ...@@ -1319,7 +1319,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb)
#endif #endif
u8 reg; u8 reg;
char *type; char *type;
char aInfo[78], aRevision[32], aDate[12]; char aInfo[90], aRevision[32], aDate[12];
void __iomem *mbase = musb->mregs; void __iomem *mbase = musb->mregs;
int status = 0; int status = 0;
int i; int i;
...@@ -1521,6 +1521,14 @@ irqreturn_t musb_interrupt(struct musb *musb) ...@@ -1521,6 +1521,14 @@ irqreturn_t musb_interrupt(struct musb *musb)
(devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral", (devctl & MUSB_DEVCTL_HM) ? "host" : "peripheral",
musb->int_usb, musb->int_tx, musb->int_rx); musb->int_usb, musb->int_tx, musb->int_rx);
#ifdef CONFIG_USB_GADGET_MUSB_HDRC
if (is_otg_enabled(musb) || is_peripheral_enabled(musb))
if (!musb->gadget_driver) {
DBG(5, "No gadget driver loaded\n");
return IRQ_HANDLED;
}
#endif
/* the core can interrupt us for multiple reasons; docs have /* the core can interrupt us for multiple reasons; docs have
* a generic interrupt flowchart to follow * a generic interrupt flowchart to follow
*/ */
...@@ -2139,7 +2147,7 @@ static int __init musb_probe(struct platform_device *pdev) ...@@ -2139,7 +2147,7 @@ static int __init musb_probe(struct platform_device *pdev)
return musb_init_controller(dev, irq, base); return musb_init_controller(dev, irq, base);
} }
static int __devexit musb_remove(struct platform_device *pdev) static int __exit musb_remove(struct platform_device *pdev)
{ {
struct musb *musb = dev_to_musb(&pdev->dev); struct musb *musb = dev_to_musb(&pdev->dev);
void __iomem *ctrl_base = musb->ctrl_base; void __iomem *ctrl_base = musb->ctrl_base;
...@@ -2231,7 +2239,7 @@ static struct platform_driver musb_driver = { ...@@ -2231,7 +2239,7 @@ static struct platform_driver musb_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = MUSB_DEV_PM_OPS, .pm = MUSB_DEV_PM_OPS,
}, },
.remove = __devexit_p(musb_remove), .remove = __exit_p(musb_remove),
.shutdown = musb_shutdown, .shutdown = musb_shutdown,
}; };
......
...@@ -309,7 +309,7 @@ static void txstate(struct musb *musb, struct musb_request *req) ...@@ -309,7 +309,7 @@ static void txstate(struct musb *musb, struct musb_request *req)
size_t request_size; size_t request_size;
/* setup DMA, then program endpoint CSR */ /* setup DMA, then program endpoint CSR */
request_size = min(request->length, request_size = min_t(size_t, request->length,
musb_ep->dma->max_len); musb_ep->dma->max_len);
if (request_size < musb_ep->packet_sz) if (request_size < musb_ep->packet_sz)
musb_ep->dma->desired_mode = 0; musb_ep->dma->desired_mode = 0;
...@@ -319,7 +319,7 @@ static void txstate(struct musb *musb, struct musb_request *req) ...@@ -319,7 +319,7 @@ static void txstate(struct musb *musb, struct musb_request *req)
use_dma = use_dma && c->channel_program( use_dma = use_dma && c->channel_program(
musb_ep->dma, musb_ep->packet_sz, musb_ep->dma, musb_ep->packet_sz,
musb_ep->dma->desired_mode, musb_ep->dma->desired_mode,
request->dma, request_size); request->dma + request->actual, request_size);
if (use_dma) { if (use_dma) {
if (musb_ep->dma->desired_mode == 0) { if (musb_ep->dma->desired_mode == 0) {
/* /*
...@@ -515,12 +515,12 @@ void musb_g_tx(struct musb *musb, u8 epnum) ...@@ -515,12 +515,12 @@ void musb_g_tx(struct musb *musb, u8 epnum)
if (csr & MUSB_TXCSR_FIFONOTEMPTY) if (csr & MUSB_TXCSR_FIFONOTEMPTY)
return; return;
if (!musb_ep->desc) { request = musb_ep->desc ? next_request(musb_ep) : NULL;
if (!request) {
DBG(4, "%s idle now\n", DBG(4, "%s idle now\n",
musb_ep->end_point.name); musb_ep->end_point.name);
return; return;
} else }
request = next_request(musb_ep);
} }
txstate(musb, to_musb_request(request)); txstate(musb, to_musb_request(request));
...@@ -746,6 +746,8 @@ void musb_g_rx(struct musb *musb, u8 epnum) ...@@ -746,6 +746,8 @@ void musb_g_rx(struct musb *musb, u8 epnum)
musb_ep_select(mbase, epnum); musb_ep_select(mbase, epnum);
request = next_request(musb_ep); request = next_request(musb_ep);
if (!request)
return;
csr = musb_readw(epio, MUSB_RXCSR); csr = musb_readw(epio, MUSB_RXCSR);
dma = is_dma_capable() ? musb_ep->dma : NULL; dma = is_dma_capable() ? musb_ep->dma : NULL;
...@@ -1731,6 +1733,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) ...@@ -1731,6 +1733,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
spin_lock_irqsave(&musb->lock, flags); spin_lock_irqsave(&musb->lock, flags);
otg_set_peripheral(musb->xceiv, &musb->g); otg_set_peripheral(musb->xceiv, &musb->g);
musb->xceiv->state = OTG_STATE_B_IDLE;
musb->is_active = 1; musb->is_active = 1;
/* FIXME this ignores the softconnect flag. Drivers are /* FIXME this ignores the softconnect flag. Drivers are
......
...@@ -664,7 +664,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) ...@@ -664,7 +664,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
break; break;
default: default:
ERR("SetupEnd came in a wrong ep0stage %s", ERR("SetupEnd came in a wrong ep0stage %s\n",
decode_ep0stage(musb->ep0_state)); decode_ep0stage(musb->ep0_state));
} }
csr = musb_readw(regs, MUSB_CSR0); csr = musb_readw(regs, MUSB_CSR0);
...@@ -787,12 +787,18 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) ...@@ -787,12 +787,18 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
handled = service_zero_data_request( handled = service_zero_data_request(
musb, &setup); musb, &setup);
/* status stage might be immediate */ /*
if (handled > 0) { * We're expecting no data in any case, so
* always set the DATAEND bit -- doing this
* here helps avoid SetupEnd interrupt coming
* in the idle stage when we're stalling...
*/
musb->ackpend |= MUSB_CSR0_P_DATAEND; musb->ackpend |= MUSB_CSR0_P_DATAEND;
/* status stage might be immediate */
if (handled > 0)
musb->ep0_state = musb->ep0_state =
MUSB_EP0_STAGE_STATUSIN; MUSB_EP0_STAGE_STATUSIN;
}
break; break;
/* sequence #1 (IN to host), includes GET_STATUS /* sequence #1 (IN to host), includes GET_STATUS
......
...@@ -843,7 +843,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp) ...@@ -843,7 +843,7 @@ static irqreturn_t omap_otg_irq(int irq, void *_isp)
static struct platform_device *otg_dev; static struct platform_device *otg_dev;
static int otg_init(struct isp1301 *isp) static int isp1301_otg_init(struct isp1301 *isp)
{ {
u32 l; u32 l;
...@@ -1275,7 +1275,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c) ...@@ -1275,7 +1275,7 @@ static int __exit isp1301_remove(struct i2c_client *i2c)
static int isp1301_otg_enable(struct isp1301 *isp) static int isp1301_otg_enable(struct isp1301 *isp)
{ {
power_up(isp); power_up(isp);
otg_init(isp); isp1301_otg_init(isp);
/* NOTE: since we don't change this, this provides /* NOTE: since we don't change this, this provides
* a few more interrupts than are strictly needed. * a few more interrupts than are strictly needed.
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include <linux/serial.h> #include <linux/serial.h>
#include <linux/usb/serial.h> #include <linux/usb/serial.h>
#include "ftdi_sio.h" #include "ftdi_sio.h"
#include "ftdi_sio_ids.h"
/* /*
* Version Information * Version Information
......
This diff is collapsed.
This diff is collapsed.
...@@ -129,6 +129,7 @@ ...@@ -129,6 +129,7 @@
#define BANDB_DEVICE_ID_USPTL4_4 0xAC32 #define BANDB_DEVICE_ID_USPTL4_4 0xAC32
#define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 #define BANDB_DEVICE_ID_USOPTL4_2 0xAC42
#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 #define BANDB_DEVICE_ID_USOPTL4_4 0xAC44
#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24
/* This driver also supports /* This driver also supports
* ATEN UC2324 device using Moschip MCS7840 * ATEN UC2324 device using Moschip MCS7840
...@@ -191,6 +192,7 @@ static struct usb_device_id moschip_port_id_table[] = { ...@@ -191,6 +192,7 @@ static struct usb_device_id moschip_port_id_table[] = {
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},
{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},
{} /* terminating entry */ {} /* terminating entry */
...@@ -207,6 +209,7 @@ static __devinitdata struct usb_device_id moschip_id_table_combined[] = { ...@@ -207,6 +209,7 @@ static __devinitdata struct usb_device_id moschip_id_table_combined[] = {
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},
{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},
{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},
{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},
{} /* terminating entry */ {} /* terminating entry */
......
...@@ -340,6 +340,10 @@ static int option_resume(struct usb_serial *serial); ...@@ -340,6 +340,10 @@ static int option_resume(struct usb_serial *serial);
#define FOUR_G_SYSTEMS_VENDOR_ID 0x1c9e #define FOUR_G_SYSTEMS_VENDOR_ID 0x1c9e
#define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603
/* Haier products */
#define HAIER_VENDOR_ID 0x201e
#define HAIER_PRODUCT_CE100 0x2009
static struct usb_device_id option_ids[] = { static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
...@@ -641,6 +645,7 @@ static struct usb_device_id option_ids[] = { ...@@ -641,6 +645,7 @@ static struct usb_device_id option_ids[] = {
{ USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) },
{ USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) },
{ USB_DEVICE(FOUR_G_SYSTEMS_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14) }, { USB_DEVICE(FOUR_G_SYSTEMS_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14) },
{ USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
MODULE_DEVICE_TABLE(usb, option_ids); MODULE_DEVICE_TABLE(usb, option_ids);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment