mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 14:13:01 -04:00
USB driver update for 3.13-rc1
Here's the big USB driver update for 3.13-rc1. It includes the usual xhci changes, EHCI updates to get the scheduling of USB transactions working better, and a raft of gadget and musb updates as well. All of this has been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iEYEABECAAYFAlJ6xycACgkQMUfUDdst+ymO+gCgxXdQXSU23i9ykc2CKBemdEBH w6IAoKcokITcdN1IxxkfiMxOEld2hgZm =3kbb -----END PGP SIGNATURE----- Merge tag 'usb-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB driver update from Greg KH: "Here's the big USB driver update for 3.13-rc1. It includes the usual xhci changes, EHCI updates to get the scheduling of USB transactions working better, and a raft of gadget and musb updates as well. All of this has been in linux-next for a while with no reported issues" * tag 'usb-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (305 commits) USB: Maintainers change for usb serial drivers usb: usbtest: support container id descriptor test usb: usbtest: support superspeed device capbility descriptor test usb: usbtest: support usb2 extension descriptor test usb: chipidea: only get vbus regulator for non-peripheral mode USB: ehci-atmel: add usb_clk for transition to CCF usb: cdc-wdm: ignore speed change notifications USB: cdc-wdm: support back-to-back USB_CDC_NOTIFY_RESPONSE_AVAILABLE notifications usbatm: Fix dynamic_debug / ratelimited atm_dbg and atm_rldbg macros printk: pr_debug_ratelimited: check state first to reduce "callbacks suppressed" messages usb: usbtest: support bos descriptor test for usb 3.0 USB: phy: samsung: Support multiple PHYs of same type usb: wusbcore: change WA_SEGS_MAX to a legal value usb: wusbcore: add a quirk for Alereon HWA device isoc behavior usb: wusbcore: combine multiple isoc frames in a single transfer request. usb: wusbcore: set the RPIPE wMaxPacketSize value correctly usb: chipidea: host: more enhancement when ci->hcd is NULL usb: ohci: remove ep93xx bus glue platform driver usb: usbtest: fix checkpatch warning as sizeof code style UWB: clean up attribute use by using ATTRIBUTE_GROUPS() ...
This commit is contained in:
commit
c287322c3a
217 changed files with 9032 additions and 4950 deletions
|
|
@ -26,6 +26,7 @@
|
|||
#define __TWL_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
|
||||
/*
|
||||
|
|
@ -615,6 +616,7 @@ enum twl4030_usb_mode {
|
|||
struct twl4030_usb_data {
|
||||
enum twl4030_usb_mode usb_mode;
|
||||
unsigned long features;
|
||||
struct phy_init_data *init_data;
|
||||
|
||||
int (*phy_init)(struct device *dev);
|
||||
int (*phy_exit)(struct device *dev);
|
||||
|
|
|
|||
270
include/linux/phy/phy.h
Normal file
270
include/linux/phy/phy.h
Normal file
|
|
@ -0,0 +1,270 @@
|
|||
/*
|
||||
* phy.h -- generic phy header file
|
||||
*
|
||||
* Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
|
||||
*
|
||||
* Author: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __DRIVERS_PHY_H
|
||||
#define __DRIVERS_PHY_H
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
struct phy;
|
||||
|
||||
/**
|
||||
* struct phy_ops - set of function pointers for performing phy operations
|
||||
* @init: operation to be performed for initializing phy
|
||||
* @exit: operation to be performed while exiting
|
||||
* @power_on: powering on the phy
|
||||
* @power_off: powering off the phy
|
||||
* @owner: the module owner containing the ops
|
||||
*/
|
||||
struct phy_ops {
|
||||
int (*init)(struct phy *phy);
|
||||
int (*exit)(struct phy *phy);
|
||||
int (*power_on)(struct phy *phy);
|
||||
int (*power_off)(struct phy *phy);
|
||||
struct module *owner;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct phy - represents the phy device
|
||||
* @dev: phy device
|
||||
* @id: id of the phy device
|
||||
* @ops: function pointers for performing phy operations
|
||||
* @init_data: list of PHY consumers (non-dt only)
|
||||
* @mutex: mutex to protect phy_ops
|
||||
* @init_count: used to protect when the PHY is used by multiple consumers
|
||||
* @power_count: used to protect when the PHY is used by multiple consumers
|
||||
*/
|
||||
struct phy {
|
||||
struct device dev;
|
||||
int id;
|
||||
const struct phy_ops *ops;
|
||||
struct phy_init_data *init_data;
|
||||
struct mutex mutex;
|
||||
int init_count;
|
||||
int power_count;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct phy_provider - represents the phy provider
|
||||
* @dev: phy provider device
|
||||
* @owner: the module owner having of_xlate
|
||||
* @of_xlate: function pointer to obtain phy instance from phy pointer
|
||||
* @list: to maintain a linked list of PHY providers
|
||||
*/
|
||||
struct phy_provider {
|
||||
struct device *dev;
|
||||
struct module *owner;
|
||||
struct list_head list;
|
||||
struct phy * (*of_xlate)(struct device *dev,
|
||||
struct of_phandle_args *args);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct phy_consumer - represents the phy consumer
|
||||
* @dev_name: the device name of the controller that will use this PHY device
|
||||
* @port: name given to the consumer port
|
||||
*/
|
||||
struct phy_consumer {
|
||||
const char *dev_name;
|
||||
const char *port;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct phy_init_data - contains the list of PHY consumers
|
||||
* @num_consumers: number of consumers for this PHY device
|
||||
* @consumers: list of PHY consumers
|
||||
*/
|
||||
struct phy_init_data {
|
||||
unsigned int num_consumers;
|
||||
struct phy_consumer *consumers;
|
||||
};
|
||||
|
||||
#define PHY_CONSUMER(_dev_name, _port) \
|
||||
{ \
|
||||
.dev_name = _dev_name, \
|
||||
.port = _port, \
|
||||
}
|
||||
|
||||
#define to_phy(dev) (container_of((dev), struct phy, dev))
|
||||
|
||||
#define of_phy_provider_register(dev, xlate) \
|
||||
__of_phy_provider_register((dev), THIS_MODULE, (xlate))
|
||||
|
||||
#define devm_of_phy_provider_register(dev, xlate) \
|
||||
__devm_of_phy_provider_register((dev), THIS_MODULE, (xlate))
|
||||
|
||||
static inline void phy_set_drvdata(struct phy *phy, void *data)
|
||||
{
|
||||
dev_set_drvdata(&phy->dev, data);
|
||||
}
|
||||
|
||||
static inline void *phy_get_drvdata(struct phy *phy)
|
||||
{
|
||||
return dev_get_drvdata(&phy->dev);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_GENERIC_PHY)
|
||||
int phy_pm_runtime_get(struct phy *phy);
|
||||
int phy_pm_runtime_get_sync(struct phy *phy);
|
||||
int phy_pm_runtime_put(struct phy *phy);
|
||||
int phy_pm_runtime_put_sync(struct phy *phy);
|
||||
void phy_pm_runtime_allow(struct phy *phy);
|
||||
void phy_pm_runtime_forbid(struct phy *phy);
|
||||
int phy_init(struct phy *phy);
|
||||
int phy_exit(struct phy *phy);
|
||||
int phy_power_on(struct phy *phy);
|
||||
int phy_power_off(struct phy *phy);
|
||||
struct phy *phy_get(struct device *dev, const char *string);
|
||||
struct phy *devm_phy_get(struct device *dev, const char *string);
|
||||
void phy_put(struct phy *phy);
|
||||
void devm_phy_put(struct device *dev, struct phy *phy);
|
||||
struct phy *of_phy_simple_xlate(struct device *dev,
|
||||
struct of_phandle_args *args);
|
||||
struct phy *phy_create(struct device *dev, const struct phy_ops *ops,
|
||||
struct phy_init_data *init_data);
|
||||
struct phy *devm_phy_create(struct device *dev,
|
||||
const struct phy_ops *ops, struct phy_init_data *init_data);
|
||||
void phy_destroy(struct phy *phy);
|
||||
void devm_phy_destroy(struct device *dev, struct phy *phy);
|
||||
struct phy_provider *__of_phy_provider_register(struct device *dev,
|
||||
struct module *owner, struct phy * (*of_xlate)(struct device *dev,
|
||||
struct of_phandle_args *args));
|
||||
struct phy_provider *__devm_of_phy_provider_register(struct device *dev,
|
||||
struct module *owner, struct phy * (*of_xlate)(struct device *dev,
|
||||
struct of_phandle_args *args));
|
||||
void of_phy_provider_unregister(struct phy_provider *phy_provider);
|
||||
void devm_of_phy_provider_unregister(struct device *dev,
|
||||
struct phy_provider *phy_provider);
|
||||
#else
|
||||
static inline int phy_pm_runtime_get(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_pm_runtime_get_sync(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_pm_runtime_put(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_pm_runtime_put_sync(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline void phy_pm_runtime_allow(struct phy *phy)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void phy_pm_runtime_forbid(struct phy *phy)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int phy_init(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_exit(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_power_on(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int phy_power_off(struct phy *phy)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline struct phy *phy_get(struct device *dev, const char *string)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline struct phy *devm_phy_get(struct device *dev, const char *string)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline void phy_put(struct phy *phy)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devm_phy_put(struct device *dev, struct phy *phy)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct phy *of_phy_simple_xlate(struct device *dev,
|
||||
struct of_phandle_args *args)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline struct phy *phy_create(struct device *dev,
|
||||
const struct phy_ops *ops, struct phy_init_data *init_data)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline struct phy *devm_phy_create(struct device *dev,
|
||||
const struct phy_ops *ops, struct phy_init_data *init_data)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline void phy_destroy(struct phy *phy)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devm_phy_destroy(struct device *dev, struct phy *phy)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct phy_provider *__of_phy_provider_register(
|
||||
struct device *dev, struct module *owner, struct phy * (*of_xlate)(
|
||||
struct device *dev, struct of_phandle_args *args))
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline struct phy_provider *__devm_of_phy_provider_register(struct device
|
||||
*dev, struct module *owner, struct phy * (*of_xlate)(struct device *dev,
|
||||
struct of_phandle_args *args))
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
|
||||
static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void devm_of_phy_provider_unregister(struct device *dev,
|
||||
struct phy_provider *phy_provider)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DRIVERS_PHY_H */
|
||||
|
|
@ -25,13 +25,4 @@ struct s5p_platform_mipi_csis {
|
|||
u8 hs_settle;
|
||||
};
|
||||
|
||||
/**
|
||||
* s5p_csis_phy_enable - global MIPI-CSI receiver D-PHY control
|
||||
* @id: MIPI-CSIS harware instance index (0...1)
|
||||
* @on: true to enable D-PHY and deassert its reset
|
||||
* false to disable D-PHY
|
||||
* @return: 0 on success, or negative error code on failure
|
||||
*/
|
||||
int s5p_csis_phy_enable(int id, bool on);
|
||||
|
||||
#endif /* __PLAT_SAMSUNG_MIPI_CSIS_H_ */
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Samsung Electronics Co.Ltd
|
||||
* Author: Joonyoung Shim <jy0922.shim@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __PLAT_SAMSUNG_EHCI_H
|
||||
#define __PLAT_SAMSUNG_EHCI_H __FILE__
|
||||
|
||||
struct s5p_ehci_platdata {
|
||||
int (*phy_init)(struct platform_device *pdev, int type);
|
||||
int (*phy_exit)(struct platform_device *pdev, int type);
|
||||
};
|
||||
|
||||
extern void s5p_ehci_set_platdata(struct s5p_ehci_platdata *pd);
|
||||
|
||||
#endif /* __PLAT_SAMSUNG_EHCI_H */
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Samsung Electronics Co.Ltd
|
||||
* http://www.samsung.com/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_EXYNOS_OHCI_H
|
||||
#define __MACH_EXYNOS_OHCI_H
|
||||
|
||||
struct exynos4_ohci_platdata {
|
||||
int (*phy_init)(struct platform_device *pdev, int type);
|
||||
int (*phy_exit)(struct platform_device *pdev, int type);
|
||||
};
|
||||
|
||||
extern void exynos4_ohci_set_platdata(struct exynos4_ohci_platdata *pd);
|
||||
|
||||
#endif /* __MACH_EXYNOS_OHCI_H */
|
||||
22
include/linux/platform_data/usb-rcar-gen2-phy.h
Normal file
22
include/linux/platform_data/usb-rcar-gen2-phy.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright (C) 2013 Renesas Solutions Corp.
|
||||
* Copyright (C) 2013 Cogent Embedded, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __USB_RCAR_GEN2_PHY_H
|
||||
#define __USB_RCAR_GEN2_PHY_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct rcar_gen2_phy_platform_data {
|
||||
/* USB channel 0 configuration */
|
||||
bool chan0_pci:1; /* true: PCI USB host 0, false: USBHS */
|
||||
/* USB channel 2 configuration */
|
||||
bool chan2_pci:1; /* true: PCI USB host 2, false: USBSS */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -233,6 +233,8 @@ extern asmlinkage void dump_stack(void) __cold;
|
|||
no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#include <linux/dynamic_debug.h>
|
||||
|
||||
/* If you are writing a driver, please use dev_dbg instead */
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */
|
||||
|
|
@ -343,7 +345,19 @@ extern asmlinkage void dump_stack(void) __cold;
|
|||
#endif
|
||||
|
||||
/* If you are writing a driver, please use dev_dbg instead */
|
||||
#if defined(DEBUG)
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
/* descriptor check is first to prevent flooding with "callbacks suppressed" */
|
||||
#define pr_debug_ratelimited(fmt, ...) \
|
||||
do { \
|
||||
static DEFINE_RATELIMIT_STATE(_rs, \
|
||||
DEFAULT_RATELIMIT_INTERVAL, \
|
||||
DEFAULT_RATELIMIT_BURST); \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT) && \
|
||||
__ratelimit(&_rs)) \
|
||||
__dynamic_pr_debug(&descriptor, fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
#elif defined(DEBUG)
|
||||
#define pr_debug_ratelimited(fmt, ...) \
|
||||
printk_ratelimited(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -475,7 +475,8 @@ struct usb3_lpm_parameters {
|
|||
* @lpm_capable: device supports LPM
|
||||
* @usb2_hw_lpm_capable: device can perform USB2 hardware LPM
|
||||
* @usb2_hw_lpm_besl_capable: device can perform USB2 hardware BESL LPM
|
||||
* @usb2_hw_lpm_enabled: USB2 hardware LPM enabled
|
||||
* @usb2_hw_lpm_enabled: USB2 hardware LPM is enabled
|
||||
* @usb2_hw_lpm_allowed: Userspace allows USB 2.0 LPM to be enabled
|
||||
* @usb3_lpm_enabled: USB3 hardware LPM enabled
|
||||
* @string_langid: language ID for strings
|
||||
* @product: iProduct string, if present (static)
|
||||
|
|
@ -548,6 +549,7 @@ struct usb_device {
|
|||
unsigned usb2_hw_lpm_capable:1;
|
||||
unsigned usb2_hw_lpm_besl_capable:1;
|
||||
unsigned usb2_hw_lpm_enabled:1;
|
||||
unsigned usb2_hw_lpm_allowed:1;
|
||||
unsigned usb3_lpm_enabled:1;
|
||||
int string_langid;
|
||||
|
||||
|
|
@ -702,7 +704,7 @@ extern int usb_alloc_streams(struct usb_interface *interface,
|
|||
unsigned int num_streams, gfp_t mem_flags);
|
||||
|
||||
/* Reverts a group of bulk endpoints back to not using stream IDs. */
|
||||
extern void usb_free_streams(struct usb_interface *interface,
|
||||
extern int usb_free_streams(struct usb_interface *interface,
|
||||
struct usb_host_endpoint **eps, unsigned int num_eps,
|
||||
gfp_t mem_flags);
|
||||
|
||||
|
|
@ -1209,11 +1211,13 @@ struct usb_anchor {
|
|||
struct list_head urb_list;
|
||||
wait_queue_head_t wait;
|
||||
spinlock_t lock;
|
||||
atomic_t suspend_wakeups;
|
||||
unsigned int poisoned:1;
|
||||
};
|
||||
|
||||
static inline void init_usb_anchor(struct usb_anchor *anchor)
|
||||
{
|
||||
memset(anchor, 0, sizeof(*anchor));
|
||||
INIT_LIST_HEAD(&anchor->urb_list);
|
||||
init_waitqueue_head(&anchor->wait);
|
||||
spin_lock_init(&anchor->lock);
|
||||
|
|
@ -1574,6 +1578,8 @@ extern void usb_kill_anchored_urbs(struct usb_anchor *anchor);
|
|||
extern void usb_poison_anchored_urbs(struct usb_anchor *anchor);
|
||||
extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor);
|
||||
extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor);
|
||||
extern void usb_anchor_suspend_wakeups(struct usb_anchor *anchor);
|
||||
extern void usb_anchor_resume_wakeups(struct usb_anchor *anchor);
|
||||
extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor);
|
||||
extern void usb_unanchor_urb(struct urb *urb);
|
||||
extern int usb_wait_anchor_empty_timeout(struct usb_anchor *anchor,
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ struct giveback_urb_bh {
|
|||
spinlock_t lock;
|
||||
struct list_head head;
|
||||
struct tasklet_struct bh;
|
||||
struct usb_host_endpoint *completing_ep;
|
||||
};
|
||||
|
||||
struct usb_hcd {
|
||||
|
|
@ -140,6 +141,7 @@ struct usb_hcd {
|
|||
unsigned wireless:1; /* Wireless USB HCD */
|
||||
unsigned authorized_default:1;
|
||||
unsigned has_tt:1; /* Integrated TT in root hub */
|
||||
unsigned amd_resume_bug:1; /* AMD remote wakeup quirk */
|
||||
|
||||
unsigned int irq; /* irq allocated */
|
||||
void __iomem *regs; /* device memory/io */
|
||||
|
|
@ -378,6 +380,12 @@ static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd)
|
|||
return hcd->driver->flags & HCD_BH;
|
||||
}
|
||||
|
||||
static inline bool hcd_periodic_completion_in_progress(struct usb_hcd *hcd,
|
||||
struct usb_host_endpoint *ep)
|
||||
{
|
||||
return hcd->high_prio_bh.completing_ep == ep;
|
||||
}
|
||||
|
||||
extern int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb);
|
||||
extern int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb,
|
||||
int status);
|
||||
|
|
@ -428,6 +436,8 @@ extern int usb_hcd_pci_probe(struct pci_dev *dev,
|
|||
extern void usb_hcd_pci_remove(struct pci_dev *dev);
|
||||
extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
|
||||
|
||||
extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
extern const struct dev_pm_ops usb_hcd_pci_pm_ops;
|
||||
#endif
|
||||
|
|
@ -496,6 +506,7 @@ struct usb_tt {
|
|||
struct usb_device *hub; /* upstream highspeed hub */
|
||||
int multi; /* true means one TT per port */
|
||||
unsigned think_time; /* think time in ns */
|
||||
void *hcpriv; /* HCD private data */
|
||||
|
||||
/* for control/bulk error recovery (CLEAR_TT_BUFFER) */
|
||||
spinlock_t lock;
|
||||
|
|
@ -554,9 +565,8 @@ extern void usb_ep0_reinit(struct usb_device *);
|
|||
* of (7/6 * 8 * bytecount) = 9.33 * bytecount */
|
||||
/* bytecount = data payload byte count */
|
||||
|
||||
#define NS_TO_US(ns) ((ns + 500L) / 1000L)
|
||||
/* convert & round nanoseconds to microseconds */
|
||||
|
||||
#define NS_TO_US(ns) DIV_ROUND_UP(ns, 1000L)
|
||||
/* convert nanoseconds to microseconds, rounding up */
|
||||
|
||||
/*
|
||||
* Full/low speed bandwidth allocation constants/support.
|
||||
|
|
|
|||
|
|
@ -1,180 +0,0 @@
|
|||
/*
|
||||
* Intel MID (Langwell/Penwell) USB OTG Transceiver driver
|
||||
* Copyright (C) 2008 - 2010, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_MID_OTG_H
|
||||
#define __INTEL_MID_OTG_H
|
||||
|
||||
#include <linux/pm.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
struct intel_mid_otg_xceiv;
|
||||
|
||||
/* This is a common data structure for Intel MID platform to
|
||||
* save values of the OTG state machine */
|
||||
struct otg_hsm {
|
||||
/* Input */
|
||||
int a_bus_resume;
|
||||
int a_bus_suspend;
|
||||
int a_conn;
|
||||
int a_sess_vld;
|
||||
int a_srp_det;
|
||||
int a_vbus_vld;
|
||||
int b_bus_resume;
|
||||
int b_bus_suspend;
|
||||
int b_conn;
|
||||
int b_se0_srp;
|
||||
int b_ssend_srp;
|
||||
int b_sess_end;
|
||||
int b_sess_vld;
|
||||
int id;
|
||||
/* id values */
|
||||
#define ID_B 0x05
|
||||
#define ID_A 0x04
|
||||
#define ID_ACA_C 0x03
|
||||
#define ID_ACA_B 0x02
|
||||
#define ID_ACA_A 0x01
|
||||
int power_up;
|
||||
int adp_change;
|
||||
int test_device;
|
||||
|
||||
/* Internal variables */
|
||||
int a_set_b_hnp_en;
|
||||
int b_srp_done;
|
||||
int b_hnp_enable;
|
||||
int hnp_poll_enable;
|
||||
|
||||
/* Timeout indicator for timers */
|
||||
int a_wait_vrise_tmout;
|
||||
int a_wait_bcon_tmout;
|
||||
int a_aidl_bdis_tmout;
|
||||
int a_bidl_adis_tmout;
|
||||
int a_bidl_adis_tmr;
|
||||
int a_wait_vfall_tmout;
|
||||
int b_ase0_brst_tmout;
|
||||
int b_bus_suspend_tmout;
|
||||
int b_srp_init_tmout;
|
||||
int b_srp_fail_tmout;
|
||||
int b_srp_fail_tmr;
|
||||
int b_adp_sense_tmout;
|
||||
|
||||
/* Informative variables */
|
||||
int a_bus_drop;
|
||||
int a_bus_req;
|
||||
int a_clr_err;
|
||||
int b_bus_req;
|
||||
int a_suspend_req;
|
||||
int b_bus_suspend_vld;
|
||||
|
||||
/* Output */
|
||||
int drv_vbus;
|
||||
int loc_conn;
|
||||
int loc_sof;
|
||||
|
||||
/* Others */
|
||||
int vbus_srp_up;
|
||||
};
|
||||
|
||||
/* must provide ULPI access function to read/write registers implemented in
|
||||
* ULPI address space */
|
||||
struct iotg_ulpi_access_ops {
|
||||
int (*read)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 *val);
|
||||
int (*write)(struct intel_mid_otg_xceiv *iotg, u8 reg, u8 val);
|
||||
};
|
||||
|
||||
#define OTG_A_DEVICE 0x0
|
||||
#define OTG_B_DEVICE 0x1
|
||||
|
||||
/*
|
||||
* the Intel MID (Langwell/Penwell) otg transceiver driver needs to interact
|
||||
* with device and host drivers to implement the USB OTG related feature. More
|
||||
* function members are added based on usb_phy data structure for this
|
||||
* purpose.
|
||||
*/
|
||||
struct intel_mid_otg_xceiv {
|
||||
struct usb_phy otg;
|
||||
struct otg_hsm hsm;
|
||||
|
||||
/* base address */
|
||||
void __iomem *base;
|
||||
|
||||
/* ops to access ulpi */
|
||||
struct iotg_ulpi_access_ops ulpi_ops;
|
||||
|
||||
/* atomic notifier for interrupt context */
|
||||
struct atomic_notifier_head iotg_notifier;
|
||||
|
||||
/* start/stop USB Host function */
|
||||
int (*start_host)(struct intel_mid_otg_xceiv *iotg);
|
||||
int (*stop_host)(struct intel_mid_otg_xceiv *iotg);
|
||||
|
||||
/* start/stop USB Peripheral function */
|
||||
int (*start_peripheral)(struct intel_mid_otg_xceiv *iotg);
|
||||
int (*stop_peripheral)(struct intel_mid_otg_xceiv *iotg);
|
||||
|
||||
/* start/stop ADP sense/probe function */
|
||||
int (*set_adp_probe)(struct intel_mid_otg_xceiv *iotg,
|
||||
bool enabled, int dev);
|
||||
int (*set_adp_sense)(struct intel_mid_otg_xceiv *iotg,
|
||||
bool enabled);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/* suspend/resume USB host function */
|
||||
int (*suspend_host)(struct intel_mid_otg_xceiv *iotg,
|
||||
pm_message_t message);
|
||||
int (*resume_host)(struct intel_mid_otg_xceiv *iotg);
|
||||
|
||||
int (*suspend_peripheral)(struct intel_mid_otg_xceiv *iotg,
|
||||
pm_message_t message);
|
||||
int (*resume_peripheral)(struct intel_mid_otg_xceiv *iotg);
|
||||
#endif
|
||||
|
||||
};
|
||||
static inline
|
||||
struct intel_mid_otg_xceiv *otg_to_mid_xceiv(struct usb_phy *otg)
|
||||
{
|
||||
return container_of(otg, struct intel_mid_otg_xceiv, otg);
|
||||
}
|
||||
|
||||
#define MID_OTG_NOTIFY_CONNECT 0x0001
|
||||
#define MID_OTG_NOTIFY_DISCONN 0x0002
|
||||
#define MID_OTG_NOTIFY_HSUSPEND 0x0003
|
||||
#define MID_OTG_NOTIFY_HRESUME 0x0004
|
||||
#define MID_OTG_NOTIFY_CSUSPEND 0x0005
|
||||
#define MID_OTG_NOTIFY_CRESUME 0x0006
|
||||
#define MID_OTG_NOTIFY_HOSTADD 0x0007
|
||||
#define MID_OTG_NOTIFY_HOSTREMOVE 0x0008
|
||||
#define MID_OTG_NOTIFY_CLIENTADD 0x0009
|
||||
#define MID_OTG_NOTIFY_CLIENTREMOVE 0x000a
|
||||
|
||||
static inline int
|
||||
intel_mid_otg_register_notifier(struct intel_mid_otg_xceiv *iotg,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return atomic_notifier_chain_register(&iotg->iotg_notifier, nb);
|
||||
}
|
||||
|
||||
static inline void
|
||||
intel_mid_otg_unregister_notifier(struct intel_mid_otg_xceiv *iotg,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
atomic_notifier_chain_unregister(&iotg->iotg_notifier, nb);
|
||||
}
|
||||
|
||||
#endif /* __INTEL_MID_OTG_H */
|
||||
|
|
@ -99,8 +99,6 @@ struct musb_hdrc_platform_data {
|
|||
/* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
|
||||
u8 mode;
|
||||
|
||||
u8 has_mailbox:1;
|
||||
|
||||
/* for clk_get() */
|
||||
const char *clock;
|
||||
|
||||
|
|
|
|||
|
|
@ -19,20 +19,23 @@
|
|||
#ifndef __OMAP_CONTROL_USB_H__
|
||||
#define __OMAP_CONTROL_USB_H__
|
||||
|
||||
enum omap_control_usb_type {
|
||||
OMAP_CTRL_TYPE_OTGHS = 1, /* Mailbox OTGHS_CONTROL */
|
||||
OMAP_CTRL_TYPE_USB2, /* USB2_PHY, power down in CONTROL_DEV_CONF */
|
||||
OMAP_CTRL_TYPE_PIPE3, /* PIPE3 PHY, DPLL & seperate Rx/Tx power */
|
||||
OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */
|
||||
};
|
||||
|
||||
struct omap_control_usb {
|
||||
struct device *dev;
|
||||
|
||||
u32 __iomem *dev_conf;
|
||||
u32 __iomem *otghs_control;
|
||||
u32 __iomem *phy_power;
|
||||
u32 __iomem *power;
|
||||
u32 __iomem *power_aux;
|
||||
|
||||
struct clk *sys_clk;
|
||||
|
||||
u32 type;
|
||||
};
|
||||
|
||||
struct omap_control_usb_platform_data {
|
||||
u8 type;
|
||||
enum omap_control_usb_type type;
|
||||
};
|
||||
|
||||
enum omap_control_usb_mode {
|
||||
|
|
@ -42,10 +45,6 @@ enum omap_control_usb_mode {
|
|||
USB_MODE_DISCONNECT,
|
||||
};
|
||||
|
||||
/* To differentiate ctrl module IP having either mailbox or USB3 PHY power */
|
||||
#define OMAP_CTRL_DEV_TYPE1 0x1
|
||||
#define OMAP_CTRL_DEV_TYPE2 0x2
|
||||
|
||||
#define OMAP_CTRL_DEV_PHY_PD BIT(0)
|
||||
|
||||
#define OMAP_CTRL_DEV_AVALID BIT(0)
|
||||
|
|
@ -63,26 +62,18 @@ enum omap_control_usb_mode {
|
|||
#define OMAP_CTRL_USB3_PHY_TX_RX_POWERON 0x3
|
||||
#define OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF 0x0
|
||||
|
||||
#define OMAP_CTRL_USB2_PHY_PD BIT(28)
|
||||
|
||||
#if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
|
||||
extern struct device *omap_get_control_dev(void);
|
||||
extern void omap_control_usb_phy_power(struct device *dev, int on);
|
||||
extern void omap_control_usb3_phy_power(struct device *dev, bool on);
|
||||
extern void omap_control_usb_set_mode(struct device *dev,
|
||||
enum omap_control_usb_mode mode);
|
||||
#else
|
||||
static inline struct device *omap_get_control_dev(void)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline void omap_control_usb_phy_power(struct device *dev, int on)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void omap_control_usb3_phy_power(struct device *dev, int on)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void omap_control_usb_set_mode(struct device *dev,
|
||||
enum omap_control_usb_mode mode)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -320,6 +320,8 @@ extern struct usb_serial_port *usb_serial_port_get_by_minor(unsigned int minor);
|
|||
extern void usb_serial_put(struct usb_serial *serial);
|
||||
extern int usb_serial_generic_open(struct tty_struct *tty,
|
||||
struct usb_serial_port *port);
|
||||
extern int usb_serial_generic_write_start(struct usb_serial_port *port,
|
||||
gfp_t mem_flags);
|
||||
extern int usb_serial_generic_write(struct tty_struct *tty,
|
||||
struct usb_serial_port *port, const unsigned char *buf, int count);
|
||||
extern void usb_serial_generic_close(struct usb_serial_port *port);
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ struct usb_phy_gen_xceiv_platform_data {
|
|||
|
||||
/* if set fails with -EPROBE_DEFER if can't get regulator */
|
||||
unsigned int needs_vcc:1;
|
||||
unsigned int needs_reset:1;
|
||||
unsigned int needs_reset:1; /* deprecated */
|
||||
int gpio_reset;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ enum wa_notif_type {
|
|||
struct wa_notif_hdr {
|
||||
u8 bLength;
|
||||
u8 bNotifyType; /* enum wa_notif_type */
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* HWA DN Received notification [(WUSB] section 8.5.4.2)
|
||||
|
|
@ -158,7 +158,7 @@ struct hwa_notif_dn {
|
|||
u8 bSourceDeviceAddr; /* from errata 2005/07 */
|
||||
u8 bmAttributes;
|
||||
struct wusb_dn_hdr dndata[];
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/* [WUSB] section 8.3.3 */
|
||||
enum wa_xfer_type {
|
||||
|
|
@ -167,6 +167,8 @@ enum wa_xfer_type {
|
|||
WA_XFER_TYPE_ISO = 0x82,
|
||||
WA_XFER_RESULT = 0x83,
|
||||
WA_XFER_ABORT = 0x84,
|
||||
WA_XFER_ISO_PACKET_INFO = 0xA0,
|
||||
WA_XFER_ISO_PACKET_STATUS = 0xA1,
|
||||
};
|
||||
|
||||
/* [WUSB] section 8.3.3 */
|
||||
|
|
@ -177,28 +179,47 @@ struct wa_xfer_hdr {
|
|||
__le32 dwTransferID; /* Host-assigned ID */
|
||||
__le32 dwTransferLength; /* Length of data to xfer */
|
||||
u8 bTransferSegment;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct wa_xfer_ctl {
|
||||
struct wa_xfer_hdr hdr;
|
||||
u8 bmAttribute;
|
||||
__le16 wReserved;
|
||||
struct usb_ctrlrequest baSetupData;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct wa_xfer_bi {
|
||||
struct wa_xfer_hdr hdr;
|
||||
u8 bReserved;
|
||||
__le16 wReserved;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/* [WUSB] section 8.5.5 */
|
||||
struct wa_xfer_hwaiso {
|
||||
struct wa_xfer_hdr hdr;
|
||||
u8 bReserved;
|
||||
__le16 wPresentationTime;
|
||||
__le32 dwNumOfPackets;
|
||||
/* FIXME: u8 pktdata[]? */
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
struct wa_xfer_packet_info_hwaiso {
|
||||
__le16 wLength;
|
||||
u8 bPacketType;
|
||||
u8 bReserved;
|
||||
__le16 PacketLength[0];
|
||||
} __packed;
|
||||
|
||||
struct wa_xfer_packet_status_len_hwaiso {
|
||||
__le16 PacketLength;
|
||||
__le16 PacketStatus;
|
||||
} __packed;
|
||||
|
||||
struct wa_xfer_packet_status_hwaiso {
|
||||
__le16 wLength;
|
||||
u8 bPacketType;
|
||||
u8 bReserved;
|
||||
struct wa_xfer_packet_status_len_hwaiso PacketStatus[0];
|
||||
} __packed;
|
||||
|
||||
/* [WUSB] section 8.3.3.5 */
|
||||
struct wa_xfer_abort {
|
||||
|
|
@ -206,7 +227,7 @@ struct wa_xfer_abort {
|
|||
u8 bRequestType;
|
||||
__le16 wRPipe; /* RPipe index */
|
||||
__le32 dwTransferID; /* Host-assigned ID */
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* WA Transfer Complete notification ([WUSB] section 8.3.3.3)
|
||||
|
|
@ -216,7 +237,7 @@ struct wa_notif_xfer {
|
|||
struct wa_notif_hdr hdr;
|
||||
u8 bEndpoint;
|
||||
u8 Reserved;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/** Transfer result basic codes [WUSB] table 8-15 */
|
||||
enum {
|
||||
|
|
@ -243,7 +264,7 @@ struct wa_xfer_result {
|
|||
u8 bTransferSegment;
|
||||
u8 bTransferStatus;
|
||||
__le32 dwNumOfPackets;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* Wire Adapter Class Descriptor ([WUSB] section 8.5.2.7).
|
||||
|
|
@ -258,16 +279,16 @@ struct wa_xfer_result {
|
|||
struct usb_wa_descriptor {
|
||||
u8 bLength;
|
||||
u8 bDescriptorType;
|
||||
u16 bcdWAVersion;
|
||||
__le16 bcdWAVersion;
|
||||
u8 bNumPorts; /* don't use!! */
|
||||
u8 bmAttributes; /* Reserved == 0 */
|
||||
u16 wNumRPipes;
|
||||
u16 wRPipeMaxBlock;
|
||||
__le16 wNumRPipes;
|
||||
__le16 wRPipeMaxBlock;
|
||||
u8 bRPipeBlockSize;
|
||||
u8 bPwrOn2PwrGood;
|
||||
u8 bNumMMCIEs;
|
||||
u8 DeviceRemovable; /* FIXME: in DWA this is up to 16 bytes */
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* HWA Device Information Buffer (WUSB1.0[T8.54])
|
||||
|
|
@ -277,6 +298,6 @@ struct hwa_dev_info {
|
|||
u8 bDeviceAddress;
|
||||
__le16 wPHYRates;
|
||||
u8 bmDeviceAttribute;
|
||||
} __attribute__((packed));
|
||||
} __packed;
|
||||
|
||||
#endif /* #ifndef __LINUX_USB_WUSB_WA_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue