Merge tag 'usb-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB patches from Greg Kroah-Hartman: "Here's the big USB merge for 3.9-rc1 Nothing major, lots of gadget fixes, and of course, xhci stuff. All of this has been in linux-next for a while, with the exception of the last 3 patches, which were reverts of patches in the tree that caused problems, they went in yesterday." * tag 'usb-3.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (190 commits) Revert "USB: EHCI: make ehci-vt8500 a separate driver" Revert "USB: EHCI: make ehci-orion a separate driver" Revert "USB: update host controller Kconfig entries" USB: update host controller Kconfig entries USB: EHCI: make ehci-orion a separate driver USB: EHCI: make ehci-vt8500 a separate driver USB: usb-storage: unusual_devs update for Super TOP SATA bridge USB: ehci-omap: Fix autoloading of module USB: ehci-omap: Don't free gpios that we didn't request USB: option: add Huawei "ACM" devices using protocol = vendor USB: serial: fix null-pointer dereferences on disconnect USB: option: add Yota / Megafon M100-1 4g modem drivers/usb: add missing GENERIC_HARDIRQS dependencies USB: storage: properly handle the endian issues of idProduct testusb: remove all mentions of 'usbfs' usb: gadget: imx_udc: make it depend on BROKEN usb: omap_control_usb: fix compile warning ARM: OMAP: USB: Add phy binding information ARM: OMAP2: MUSB: Specify omap4 has mailbox ARM: OMAP: devices: create device for usb part of control module ...
This commit is contained in:
@@ -77,6 +77,8 @@ struct usb_configuration;
|
||||
* in interface or class descriptors; endpoints; I/O buffers; and so on.
|
||||
* @unbind: Reverses @bind; called as a side effect of unregistering the
|
||||
* driver which added this function.
|
||||
* @free_func: free the struct usb_function.
|
||||
* @mod: (internal) points to the module that created this structure.
|
||||
* @set_alt: (REQUIRED) Reconfigures altsettings; function drivers may
|
||||
* initialize usb_ep.driver data at this time (when it is used).
|
||||
* Note that setting an interface to its current altsetting resets
|
||||
@@ -116,6 +118,7 @@ struct usb_configuration;
|
||||
* two or more distinct instances within the same configuration, providing
|
||||
* several independent logical data links to a USB host.
|
||||
*/
|
||||
|
||||
struct usb_function {
|
||||
const char *name;
|
||||
struct usb_gadget_strings **strings;
|
||||
@@ -136,6 +139,8 @@ struct usb_function {
|
||||
struct usb_function *);
|
||||
void (*unbind)(struct usb_configuration *,
|
||||
struct usb_function *);
|
||||
void (*free_func)(struct usb_function *f);
|
||||
struct module *mod;
|
||||
|
||||
/* runtime state management */
|
||||
int (*set_alt)(struct usb_function *,
|
||||
@@ -156,6 +161,7 @@ struct usb_function {
|
||||
/* internals */
|
||||
struct list_head list;
|
||||
DECLARE_BITMAP(endpoints, 32);
|
||||
const struct usb_function_instance *fi;
|
||||
};
|
||||
|
||||
int usb_add_function(struct usb_configuration *, struct usb_function *);
|
||||
@@ -184,7 +190,8 @@ int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f,
|
||||
* @bConfigurationValue: Copied into configuration descriptor.
|
||||
* @iConfiguration: Copied into configuration descriptor.
|
||||
* @bmAttributes: Copied into configuration descriptor.
|
||||
* @bMaxPower: Copied into configuration descriptor.
|
||||
* @MaxPower: Power consumtion in mA. Used to compute bMaxPower in the
|
||||
* configuration descriptor after considering the bus speed.
|
||||
* @cdev: assigned by @usb_add_config() before calling @bind(); this is
|
||||
* the device associated with this configuration.
|
||||
*
|
||||
@@ -230,7 +237,7 @@ struct usb_configuration {
|
||||
u8 bConfigurationValue;
|
||||
u8 iConfiguration;
|
||||
u8 bmAttributes;
|
||||
u8 bMaxPower;
|
||||
u16 MaxPower;
|
||||
|
||||
struct usb_composite_dev *cdev;
|
||||
|
||||
@@ -316,7 +323,15 @@ struct usb_composite_driver {
|
||||
extern int usb_composite_probe(struct usb_composite_driver *driver);
|
||||
extern void usb_composite_unregister(struct usb_composite_driver *driver);
|
||||
extern void usb_composite_setup_continue(struct usb_composite_dev *cdev);
|
||||
extern int composite_dev_prepare(struct usb_composite_driver *composite,
|
||||
struct usb_composite_dev *cdev);
|
||||
void composite_dev_cleanup(struct usb_composite_dev *cdev);
|
||||
|
||||
static inline struct usb_composite_driver *to_cdriver(
|
||||
struct usb_gadget_driver *gdrv)
|
||||
{
|
||||
return container_of(gdrv, struct usb_composite_driver, gadget_driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct usb_composite_device - represents one composite usb gadget
|
||||
@@ -360,6 +375,7 @@ struct usb_composite_dev {
|
||||
unsigned int suspended:1;
|
||||
struct usb_device_descriptor desc;
|
||||
struct list_head configs;
|
||||
struct list_head gstrings;
|
||||
struct usb_composite_driver *driver;
|
||||
u8 next_string_id;
|
||||
char *def_manufacturer;
|
||||
@@ -381,8 +397,15 @@ struct usb_composite_dev {
|
||||
extern int usb_string_id(struct usb_composite_dev *c);
|
||||
extern int usb_string_ids_tab(struct usb_composite_dev *c,
|
||||
struct usb_string *str);
|
||||
extern struct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev,
|
||||
struct usb_gadget_strings **sp, unsigned n_strings);
|
||||
|
||||
extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n);
|
||||
|
||||
extern void composite_disconnect(struct usb_gadget *gadget);
|
||||
extern int composite_setup(struct usb_gadget *gadget,
|
||||
const struct usb_ctrlrequest *ctrl);
|
||||
|
||||
/*
|
||||
* Some systems will need runtime overrides for the product identifiers
|
||||
* published in the device descriptor, either numbers or strings or both.
|
||||
@@ -431,6 +454,54 @@ static inline u16 get_default_bcdDevice(void)
|
||||
return bcdDevice;
|
||||
}
|
||||
|
||||
struct usb_function_driver {
|
||||
const char *name;
|
||||
struct module *mod;
|
||||
struct list_head list;
|
||||
struct usb_function_instance *(*alloc_inst)(void);
|
||||
struct usb_function *(*alloc_func)(struct usb_function_instance *inst);
|
||||
};
|
||||
|
||||
struct usb_function_instance {
|
||||
struct usb_function_driver *fd;
|
||||
void (*free_func_inst)(struct usb_function_instance *inst);
|
||||
};
|
||||
|
||||
void usb_function_unregister(struct usb_function_driver *f);
|
||||
int usb_function_register(struct usb_function_driver *newf);
|
||||
void usb_put_function_instance(struct usb_function_instance *fi);
|
||||
void usb_put_function(struct usb_function *f);
|
||||
struct usb_function_instance *usb_get_function_instance(const char *name);
|
||||
struct usb_function *usb_get_function(struct usb_function_instance *fi);
|
||||
|
||||
struct usb_configuration *usb_get_config(struct usb_composite_dev *cdev,
|
||||
int val);
|
||||
int usb_add_config_only(struct usb_composite_dev *cdev,
|
||||
struct usb_configuration *config);
|
||||
void usb_remove_function(struct usb_configuration *c, struct usb_function *f);
|
||||
|
||||
#define DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc) \
|
||||
static struct usb_function_driver _name ## usb_func = { \
|
||||
.name = __stringify(_name), \
|
||||
.mod = THIS_MODULE, \
|
||||
.alloc_inst = _inst_alloc, \
|
||||
.alloc_func = _func_alloc, \
|
||||
}; \
|
||||
MODULE_ALIAS("usbfunc:"__stringify(_name));
|
||||
|
||||
#define DECLARE_USB_FUNCTION_INIT(_name, _inst_alloc, _func_alloc) \
|
||||
DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc) \
|
||||
static int __init _name ## mod_init(void) \
|
||||
{ \
|
||||
return usb_function_register(&_name ## usb_func); \
|
||||
} \
|
||||
static void __exit _name ## mod_exit(void) \
|
||||
{ \
|
||||
usb_function_unregister(&_name ## usb_func); \
|
||||
} \
|
||||
module_init(_name ## mod_init); \
|
||||
module_exit(_name ## mod_exit)
|
||||
|
||||
/* messaging utils */
|
||||
#define DBG(d, fmt, args...) \
|
||||
dev_dbg(&(d)->gadget->dev , fmt , ## args)
|
||||
|
30
include/linux/usb/dwc3-omap.h
Normal file
30
include/linux/usb/dwc3-omap.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (C) 2013 by Texas Instruments
|
||||
*
|
||||
* The Inventra Controller Driver for Linux 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 __DWC3_OMAP_H__
|
||||
#define __DWC3_OMAP_H__
|
||||
|
||||
enum omap_dwc3_vbus_id_status {
|
||||
OMAP_DWC3_UNKNOWN = 0,
|
||||
OMAP_DWC3_ID_GROUND,
|
||||
OMAP_DWC3_ID_FLOAT,
|
||||
OMAP_DWC3_VBUS_VALID,
|
||||
OMAP_DWC3_VBUS_OFF,
|
||||
};
|
||||
|
||||
#if (defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_DWC3_MODULE))
|
||||
extern void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status);
|
||||
#else
|
||||
static inline void dwc3_omap_mailbox(enum omap_dwc3_vbus_id_status status)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DWC3_OMAP_H__ */
|
@@ -471,12 +471,6 @@ struct usb_gadget_ops {
|
||||
struct usb_gadget_driver *);
|
||||
int (*udc_stop)(struct usb_gadget *,
|
||||
struct usb_gadget_driver *);
|
||||
|
||||
/* Those two are deprecated */
|
||||
int (*start)(struct usb_gadget_driver *,
|
||||
int (*bind)(struct usb_gadget *,
|
||||
struct usb_gadget_driver *driver));
|
||||
int (*stop)(struct usb_gadget_driver *);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -880,6 +874,8 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver);
|
||||
|
||||
extern int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget);
|
||||
extern void usb_del_gadget_udc(struct usb_gadget *gadget);
|
||||
extern int udc_attach_driver(const char *name,
|
||||
struct usb_gadget_driver *driver);
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -911,6 +907,11 @@ struct usb_gadget_strings {
|
||||
struct usb_string *strings;
|
||||
};
|
||||
|
||||
struct usb_gadget_string_container {
|
||||
struct list_head list;
|
||||
u8 *stash[0];
|
||||
};
|
||||
|
||||
/* put descriptor for string with that id into buf (buflen >= 256) */
|
||||
int usb_gadget_get_string(struct usb_gadget_strings *table, int id, u8 *buf);
|
||||
|
||||
|
@@ -99,6 +99,8 @@ struct musb_hdrc_platform_data {
|
||||
/* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
|
||||
u8 mode;
|
||||
|
||||
u8 has_mailbox:1;
|
||||
|
||||
/* for clk_get() */
|
||||
const char *clock;
|
||||
|
||||
|
92
include/linux/usb/omap_control_usb.h
Normal file
92
include/linux/usb/omap_control_usb.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* omap_control_usb.h - Header file for the USB part of control module.
|
||||
*
|
||||
* Copyright (C) 2013 Texas Instruments Incorporated - http://www.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.
|
||||
*
|
||||
* Author: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
*
|
||||
* This program is distributed in the hope that 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __OMAP_CONTROL_USB_H__
|
||||
#define __OMAP_CONTROL_USB_H__
|
||||
|
||||
struct omap_control_usb {
|
||||
struct device *dev;
|
||||
|
||||
u32 __iomem *dev_conf;
|
||||
u32 __iomem *otghs_control;
|
||||
u32 __iomem *phy_power;
|
||||
|
||||
struct clk *sys_clk;
|
||||
|
||||
u32 type;
|
||||
};
|
||||
|
||||
struct omap_control_usb_platform_data {
|
||||
u8 type;
|
||||
};
|
||||
|
||||
enum omap_control_usb_mode {
|
||||
USB_MODE_UNDEFINED = 0,
|
||||
USB_MODE_HOST,
|
||||
USB_MODE_DEVICE,
|
||||
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)
|
||||
#define OMAP_CTRL_DEV_BVALID BIT(1)
|
||||
#define OMAP_CTRL_DEV_VBUSVALID BIT(2)
|
||||
#define OMAP_CTRL_DEV_SESSEND BIT(3)
|
||||
#define OMAP_CTRL_DEV_IDDIG BIT(4)
|
||||
|
||||
#define OMAP_CTRL_USB_PWRCTL_CLK_CMD_MASK 0x003FC000
|
||||
#define OMAP_CTRL_USB_PWRCTL_CLK_CMD_SHIFT 0xE
|
||||
|
||||
#define OMAP_CTRL_USB_PWRCTL_CLK_FREQ_MASK 0xFFC00000
|
||||
#define OMAP_CTRL_USB_PWRCTL_CLK_FREQ_SHIFT 0x16
|
||||
|
||||
#define OMAP_CTRL_USB3_PHY_TX_RX_POWERON 0x3
|
||||
#define OMAP_CTRL_USB3_PHY_TX_RX_POWEROFF 0x0
|
||||
|
||||
#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)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OMAP_CONTROL_USB_H__ */
|
@@ -19,19 +19,29 @@
|
||||
#ifndef __DRIVERS_OMAP_USB2_H
|
||||
#define __DRIVERS_OMAP_USB2_H
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/usb/otg.h>
|
||||
|
||||
struct usb_dpll_params {
|
||||
u16 m;
|
||||
u8 n;
|
||||
u8 freq:3;
|
||||
u8 sd;
|
||||
u32 mf;
|
||||
};
|
||||
|
||||
struct omap_usb {
|
||||
struct usb_phy phy;
|
||||
struct phy_companion *comparator;
|
||||
void __iomem *pll_ctrl_base;
|
||||
struct device *dev;
|
||||
u32 __iomem *control_dev;
|
||||
struct device *control_dev;
|
||||
struct clk *wkupclk;
|
||||
struct clk *sys_clk;
|
||||
struct clk *optclk;
|
||||
u8 is_suspended:1;
|
||||
};
|
||||
|
||||
#define PHY_PD 0x1
|
||||
|
||||
#define phy_to_omapusb(x) container_of((x), struct omap_usb, phy)
|
||||
|
||||
#if defined(CONFIG_OMAP_USB2) || defined(CONFIG_OMAP_USB2_MODULE)
|
||||
@@ -43,4 +53,15 @@ static inline int omap_usb2_set_comparator(struct phy_companion *comparator)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline u32 omap_usb_readl(void __iomem *addr, unsigned offset)
|
||||
{
|
||||
return __raw_readl(addr + offset);
|
||||
}
|
||||
|
||||
static inline void omap_usb_writel(void __iomem *addr, unsigned offset,
|
||||
u32 data)
|
||||
{
|
||||
__raw_writel(data, addr + offset);
|
||||
}
|
||||
|
||||
#endif /* __DRIVERS_OMAP_USB_H */
|
||||
|
@@ -106,9 +106,25 @@ struct usb_phy {
|
||||
enum usb_device_speed speed);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct usb_phy_bind - represent the binding for the phy
|
||||
* @dev_name: the device name of the device that will bind to the phy
|
||||
* @phy_dev_name: the device name of the phy
|
||||
* @index: used if a single controller uses multiple phys
|
||||
* @phy: reference to the phy
|
||||
* @list: to maintain a linked list of the binding information
|
||||
*/
|
||||
struct usb_phy_bind {
|
||||
const char *dev_name;
|
||||
const char *phy_dev_name;
|
||||
u8 index;
|
||||
struct usb_phy *phy;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/* for board-specific init logic */
|
||||
extern int usb_add_phy(struct usb_phy *, enum usb_phy_type type);
|
||||
extern int usb_add_phy_dev(struct usb_phy *);
|
||||
extern void usb_remove_phy(struct usb_phy *);
|
||||
|
||||
/* helpers for direct access thru low-level io interface */
|
||||
@@ -149,8 +165,14 @@ usb_phy_shutdown(struct usb_phy *x)
|
||||
extern struct usb_phy *usb_get_phy(enum usb_phy_type type);
|
||||
extern struct usb_phy *devm_usb_get_phy(struct device *dev,
|
||||
enum usb_phy_type type);
|
||||
extern struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index);
|
||||
extern struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index);
|
||||
extern struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
|
||||
const char *phandle, u8 index);
|
||||
extern void usb_put_phy(struct usb_phy *);
|
||||
extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
|
||||
extern int usb_bind_phy(const char *dev_name, u8 index,
|
||||
const char *phy_dev_name);
|
||||
#else
|
||||
static inline struct usb_phy *usb_get_phy(enum usb_phy_type type)
|
||||
{
|
||||
@@ -163,6 +185,22 @@ static inline struct usb_phy *devm_usb_get_phy(struct device *dev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
|
||||
const char *phandle, u8 index)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void usb_put_phy(struct usb_phy *x)
|
||||
{
|
||||
}
|
||||
@@ -171,6 +209,11 @@ static inline void devm_usb_put_phy(struct device *dev, struct usb_phy *x)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int usb_bind_phy(const char *dev_name, u8 index,
|
||||
const char *phy_dev_name)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
|
16
include/linux/usb/samsung_usb_phy.h
Normal file
16
include/linux/usb/samsung_usb_phy.h
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Samsung Electronics Co.Ltd
|
||||
* http://www.samsung.com/
|
||||
*
|
||||
* Defines phy types for samsung usb phy controllers - HOST or DEIVCE.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
enum samsung_usb_phy_type {
|
||||
USB_PHY_TYPE_DEVICE,
|
||||
USB_PHY_TYPE_HOST,
|
||||
};
|
Reference in New Issue
Block a user