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: (122 commits) USB: mos7840: add device IDs for B&B electronics devices USB: ftdi_sio: add USB device ID's for B&B Electronics line USB: musb: musb_host: fix sparse warning USB: musb: musb_gadget: fix sparse warning USB: musb: omap2430: fix sparse warning USB: core: message: fix sparse warning USB: core: hub: fix sparse warning USB: core: fix sparse warning for static function USB: Added USB_ETH_RNDIS to use instead of CONFIG_USB_ETH_RNDIS USB: Check bandwidth when switching alt settings. USB: Refactor code to find alternate interface settings. USB: xhci: Fix command completion after a drop endpoint. USB: xhci: Make reverting an alt setting "unfailable". USB: usbtmc: Use usb_clear_halt() instead of custom code. USB: xhci: Add correct email and files to MAINTAINERS entry. USB: ehci-omap.c: introduce missing kfree USB: xhci-mem.c: introduce missing kfree USB: add remove_id sysfs attr for usb drivers USB: g_multi kconfig: fix depends and help text USB: option: add pid for ZTE ...
This commit is contained in:
@@ -331,6 +331,7 @@ struct usb_bus {
|
||||
u8 otg_port; /* 0, or number of OTG/HNP port */
|
||||
unsigned is_b_host:1; /* true during some HNP roleswitches */
|
||||
unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */
|
||||
unsigned sg_tablesize; /* 0 or largest number of sg list entries */
|
||||
|
||||
int devnum_next; /* Next open device number in
|
||||
* round-robin allocation */
|
||||
@@ -428,11 +429,9 @@ struct usb_tt;
|
||||
* @last_busy: time of last use
|
||||
* @autosuspend_delay: in jiffies
|
||||
* @connect_time: time device was first connected
|
||||
* @auto_pm: autosuspend/resume in progress
|
||||
* @do_remote_wakeup: remote wakeup should be enabled
|
||||
* @reset_resume: needs reset instead of resume
|
||||
* @autosuspend_disabled: autosuspend disabled by the user
|
||||
* @autoresume_disabled: autoresume disabled by the user
|
||||
* @skip_sys_resume: skip the next system resume
|
||||
* @wusb_dev: if this is a Wireless USB device, link to the WUSB
|
||||
* specific data for the device.
|
||||
@@ -513,11 +512,9 @@ struct usb_device {
|
||||
int autosuspend_delay;
|
||||
unsigned long connect_time;
|
||||
|
||||
unsigned auto_pm:1;
|
||||
unsigned do_remote_wakeup:1;
|
||||
unsigned reset_resume:1;
|
||||
unsigned autosuspend_disabled:1;
|
||||
unsigned autoresume_disabled:1;
|
||||
unsigned skip_sys_resume:1;
|
||||
#endif
|
||||
struct wusb_dev *wusb_dev;
|
||||
@@ -543,22 +540,20 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);
|
||||
|
||||
/* USB autosuspend and autoresume */
|
||||
#ifdef CONFIG_USB_SUSPEND
|
||||
extern int usb_autopm_set_interface(struct usb_interface *intf);
|
||||
extern int usb_autopm_get_interface(struct usb_interface *intf);
|
||||
extern void usb_autopm_put_interface(struct usb_interface *intf);
|
||||
extern int usb_autopm_get_interface_async(struct usb_interface *intf);
|
||||
extern void usb_autopm_put_interface_async(struct usb_interface *intf);
|
||||
|
||||
static inline void usb_autopm_enable(struct usb_interface *intf)
|
||||
static inline void usb_autopm_get_interface_no_resume(
|
||||
struct usb_interface *intf)
|
||||
{
|
||||
atomic_set(&intf->pm_usage_cnt, 0);
|
||||
usb_autopm_set_interface(intf);
|
||||
atomic_inc(&intf->pm_usage_cnt);
|
||||
}
|
||||
|
||||
static inline void usb_autopm_disable(struct usb_interface *intf)
|
||||
static inline void usb_autopm_put_interface_no_suspend(
|
||||
struct usb_interface *intf)
|
||||
{
|
||||
atomic_set(&intf->pm_usage_cnt, 1);
|
||||
usb_autopm_set_interface(intf);
|
||||
atomic_dec(&intf->pm_usage_cnt);
|
||||
}
|
||||
|
||||
static inline void usb_mark_last_busy(struct usb_device *udev)
|
||||
@@ -568,12 +563,8 @@ static inline void usb_mark_last_busy(struct usb_device *udev)
|
||||
|
||||
#else
|
||||
|
||||
static inline int usb_autopm_set_interface(struct usb_interface *intf)
|
||||
{ return 0; }
|
||||
|
||||
static inline int usb_autopm_get_interface(struct usb_interface *intf)
|
||||
{ return 0; }
|
||||
|
||||
static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
|
||||
{ return 0; }
|
||||
|
||||
@@ -581,9 +572,11 @@ static inline void usb_autopm_put_interface(struct usb_interface *intf)
|
||||
{ }
|
||||
static inline void usb_autopm_put_interface_async(struct usb_interface *intf)
|
||||
{ }
|
||||
static inline void usb_autopm_enable(struct usb_interface *intf)
|
||||
static inline void usb_autopm_get_interface_no_resume(
|
||||
struct usb_interface *intf)
|
||||
{ }
|
||||
static inline void usb_autopm_disable(struct usb_interface *intf)
|
||||
static inline void usb_autopm_put_interface_no_suspend(
|
||||
struct usb_interface *intf)
|
||||
{ }
|
||||
static inline void usb_mark_last_busy(struct usb_device *udev)
|
||||
{ }
|
||||
@@ -626,6 +619,10 @@ extern struct usb_interface *usb_ifnum_to_if(const struct usb_device *dev,
|
||||
unsigned ifnum);
|
||||
extern struct usb_host_interface *usb_altnum_to_altsetting(
|
||||
const struct usb_interface *intf, unsigned int altnum);
|
||||
extern struct usb_host_interface *usb_find_alt_setting(
|
||||
struct usb_host_config *config,
|
||||
unsigned int iface_num,
|
||||
unsigned int alt_num);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -127,6 +127,7 @@ struct usb_function {
|
||||
/* private: */
|
||||
/* internals */
|
||||
struct list_head list;
|
||||
DECLARE_BITMAP(endpoints, 32);
|
||||
};
|
||||
|
||||
int usb_add_function(struct usb_configuration *, struct usb_function *);
|
||||
|
||||
@@ -33,6 +33,23 @@ enum usb_otg_state {
|
||||
OTG_STATE_A_VBUS_ERR,
|
||||
};
|
||||
|
||||
#define USB_OTG_PULLUP_ID (1 << 0)
|
||||
#define USB_OTG_PULLDOWN_DP (1 << 1)
|
||||
#define USB_OTG_PULLDOWN_DM (1 << 2)
|
||||
#define USB_OTG_EXT_VBUS_INDICATOR (1 << 3)
|
||||
#define USB_OTG_DRV_VBUS (1 << 4)
|
||||
#define USB_OTG_DRV_VBUS_EXT (1 << 5)
|
||||
|
||||
struct otg_transceiver;
|
||||
|
||||
/* for transceivers connected thru an ULPI interface, the user must
|
||||
* provide access ops
|
||||
*/
|
||||
struct otg_io_access_ops {
|
||||
int (*read)(struct otg_transceiver *otg, u32 reg);
|
||||
int (*write)(struct otg_transceiver *otg, u32 val, u32 reg);
|
||||
};
|
||||
|
||||
/*
|
||||
* the otg driver needs to interact with both device side and host side
|
||||
* usb controllers. it decides which controller is active at a given
|
||||
@@ -42,6 +59,7 @@ enum usb_otg_state {
|
||||
struct otg_transceiver {
|
||||
struct device *dev;
|
||||
const char *label;
|
||||
unsigned int flags;
|
||||
|
||||
u8 default_a;
|
||||
enum usb_otg_state state;
|
||||
@@ -49,10 +67,17 @@ struct otg_transceiver {
|
||||
struct usb_bus *host;
|
||||
struct usb_gadget *gadget;
|
||||
|
||||
struct otg_io_access_ops *io_ops;
|
||||
void __iomem *io_priv;
|
||||
|
||||
/* to pass extra port status to the root hub */
|
||||
u16 port_status;
|
||||
u16 port_change;
|
||||
|
||||
/* initialize/shutdown the OTG controller */
|
||||
int (*init)(struct otg_transceiver *otg);
|
||||
void (*shutdown)(struct otg_transceiver *otg);
|
||||
|
||||
/* bind/unbind the host controller */
|
||||
int (*set_host)(struct otg_transceiver *otg,
|
||||
struct usb_bus *host);
|
||||
@@ -65,6 +90,10 @@ struct otg_transceiver {
|
||||
int (*set_power)(struct otg_transceiver *otg,
|
||||
unsigned mA);
|
||||
|
||||
/* effective for A-peripheral, ignored for B devices */
|
||||
int (*set_vbus)(struct otg_transceiver *otg,
|
||||
bool enabled);
|
||||
|
||||
/* for non-OTG B devices: set transceiver into suspend mode */
|
||||
int (*set_suspend)(struct otg_transceiver *otg,
|
||||
int suspend);
|
||||
@@ -85,6 +114,38 @@ extern int otg_set_transceiver(struct otg_transceiver *);
|
||||
extern void usb_nop_xceiv_register(void);
|
||||
extern void usb_nop_xceiv_unregister(void);
|
||||
|
||||
/* helpers for direct access thru low-level io interface */
|
||||
static inline int otg_io_read(struct otg_transceiver *otg, u32 reg)
|
||||
{
|
||||
if (otg->io_ops && otg->io_ops->read)
|
||||
return otg->io_ops->read(otg, reg);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int otg_io_write(struct otg_transceiver *otg, u32 reg, u32 val)
|
||||
{
|
||||
if (otg->io_ops && otg->io_ops->write)
|
||||
return otg->io_ops->write(otg, reg, val);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int
|
||||
otg_init(struct otg_transceiver *otg)
|
||||
{
|
||||
if (otg->init)
|
||||
return otg->init(otg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
otg_shutdown(struct otg_transceiver *otg)
|
||||
{
|
||||
if (otg->shutdown)
|
||||
otg->shutdown(otg);
|
||||
}
|
||||
|
||||
/* for usb host and peripheral controller drivers */
|
||||
extern struct otg_transceiver *otg_get_transceiver(void);
|
||||
@@ -97,6 +158,12 @@ otg_start_hnp(struct otg_transceiver *otg)
|
||||
return otg->start_hnp(otg);
|
||||
}
|
||||
|
||||
/* Context: can sleep */
|
||||
static inline int
|
||||
otg_set_vbus(struct otg_transceiver *otg, bool enabled)
|
||||
{
|
||||
return otg->set_vbus(otg, enabled);
|
||||
}
|
||||
|
||||
/* for HCDs */
|
||||
static inline int
|
||||
@@ -105,7 +172,6 @@ otg_set_host(struct otg_transceiver *otg, struct usb_bus *host)
|
||||
return otg->set_host(otg, host);
|
||||
}
|
||||
|
||||
|
||||
/* for usb peripheral controller drivers */
|
||||
|
||||
/* Context: can sleep */
|
||||
|
||||
7
include/linux/usb/ulpi.h
Normal file
7
include/linux/usb/ulpi.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef __LINUX_USB_ULPI_H
|
||||
#define __LINUX_USB_ULPI_H
|
||||
|
||||
struct otg_transceiver *otg_ulpi_create(struct otg_io_access_ops *ops,
|
||||
unsigned int flags);
|
||||
|
||||
#endif /* __LINUX_USB_ULPI_H */
|
||||
@@ -56,7 +56,9 @@
|
||||
US_FLAG(SANE_SENSE, 0x00008000) \
|
||||
/* Sane Sense (> 18 bytes) */ \
|
||||
US_FLAG(CAPACITY_OK, 0x00010000) \
|
||||
/* READ CAPACITY response is correct */
|
||||
/* READ CAPACITY response is correct */ \
|
||||
US_FLAG(BAD_SENSE, 0x00020000) \
|
||||
/* Bad Sense (never more than 18 bytes) */
|
||||
|
||||
#define US_FLAG(name, value) US_FL_##name = value ,
|
||||
enum { US_DO_ALL_FLAGS };
|
||||
|
||||
Reference in New Issue
Block a user