summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorKe Qinghua <qinghua.ke@freescale.com>2014-07-07 10:25:24 +0800
committerKe Qinghua <qinghua.ke@freescale.com>2014-07-07 10:42:34 +0800
commitebb76d62a59ddb38f8a1bf89ee298667a27296c8 (patch)
tree43b2dfd258677c49210be4e3c0599975dd8b250d /drivers
parent33e30fb38c578c9db7400fd605ac84994a2a1dba (diff)
parent7bd8af01b6e51cf86afd453777d095fd4991261b (diff)
Merge remote-tracking branch 'remotes/fsl-linux-sdk/imx_3.10.31_1.1.0_beta' into imx_3.10.y_android
Conflicts: arch/arm/boot/dts/imx6sx.dtsi drivers/usb/gadget/udc-core.c
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/can/m_can.c20
-rw-r--r--drivers/usb/chipidea/core.c9
-rw-r--r--drivers/usb/gadget/acm_ms.c6
-rw-r--r--drivers/usb/gadget/audio.c6
-rw-r--r--drivers/usb/gadget/cdc2.c6
-rw-r--r--drivers/usb/gadget/dbgp.c4
-rw-r--r--drivers/usb/gadget/ether.c8
-rw-r--r--drivers/usb/gadget/f_eem.c26
-rw-r--r--drivers/usb/gadget/f_hid.c6
-rw-r--r--drivers/usb/gadget/f_midi.c12
-rw-r--r--drivers/usb/gadget/f_ncm.c36
-rw-r--r--drivers/usb/gadget/f_uac1.c12
-rw-r--r--drivers/usb/gadget/f_uac2.c2
-rw-r--r--drivers/usb/gadget/f_uvc.c28
-rw-r--r--drivers/usb/gadget/gmidi.c6
-rw-r--r--drivers/usb/gadget/hid.c8
-rw-r--r--drivers/usb/gadget/mass_storage.c4
-rw-r--r--drivers/usb/gadget/multi.c6
-rw-r--r--drivers/usb/gadget/ncm.c6
-rw-r--r--drivers/usb/gadget/nokia.c6
-rw-r--r--drivers/usb/gadget/printer.c8
-rw-r--r--drivers/usb/gadget/serial.c4
-rw-r--r--drivers/usb/gadget/u_uac1.c2
-rw-r--r--drivers/usb/gadget/udc-core.c39
-rw-r--r--drivers/usb/gadget/webcam.c6
-rw-r--r--drivers/usb/gadget/zero.c4
26 files changed, 125 insertions, 155 deletions
diff --git a/drivers/net/can/m_can.c b/drivers/net/can/m_can.c
index ed6d86bfdd02..aa1f722f2b31 100644
--- a/drivers/net/can/m_can.c
+++ b/drivers/net/can/m_can.c
@@ -682,21 +682,19 @@ static void m_can_chip_config(struct net_device *dev)
m_can_write(priv, M_CAN_GFC, 0x0);
/* only support one Tx Buffer currently */
- m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_OFF) |
- (priv->mram_off + priv->txb_off));
+ m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_OFF) | priv->txb_off);
/* only support 8 bytes firstly */
m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_8BYTES);
- m_can_write(priv, M_CAN_TXEFC, 0x00010000 |
- (priv->mram_off + priv->txe_off));
+ m_can_write(priv, M_CAN_TXEFC, 0x00010000 | priv->txe_off);
/* rx fifo configuration, blocking mode, fifo size 1 */
m_can_write(priv, M_CAN_RXF0C, (priv->rxf0_elems << RXFC_FS_OFF) |
- RXFC_FWM_1 | (priv->mram_off + priv->rxf0_off));
+ RXFC_FWM_1 | priv->rxf0_off);
m_can_write(priv, M_CAN_RXF1C, (priv->rxf1_elems << RXFC_FS_OFF) |
- RXFC_FWM_1 | (priv->mram_off + priv->rxf1_off));
+ RXFC_FWM_1 | priv->rxf1_off);
cccr = m_can_read(priv, M_CAN_CCCR);
cccr &= ~(CCCR_TEST | CCCR_MON);
@@ -868,14 +866,12 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
}
/* message ram configuration */
- writel(id | flags,
- priv->mram_base + priv->mram_off + priv->txb_off);
- writel(frame->can_dlc << 16,
- priv->mram_base + priv->mram_off + priv->txb_off + 0x4);
+ writel(id | flags, priv->mram_base + priv->txb_off);
+ writel(frame->can_dlc << 16, priv->mram_base + priv->txb_off + 0x4);
writel(*(u32 *)(frame->data + 0),
- priv->mram_base + priv->mram_off + priv->txb_off + 0x8);
+ priv->mram_base + priv->txb_off + 0x8);
writel(*(u32 *)(frame->data + 4),
- priv->mram_base + priv->mram_off + priv->txb_off + 0xc);
+ priv->mram_base + priv->txb_off + 0xc);
can_put_echo_skb(skb, dev, 0);
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index b6c57161985c..be6afb3042ff 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -933,6 +933,15 @@ static int ci_suspend(struct device *dev)
struct ci_hdrc *ci = dev_get_drvdata(dev);
int ret;
+ /*
+ * Controller needs to be active during suspend, otherwise the core
+ * may run resume when the parent is at suspend if other driver's
+ * suspend fails, it occurs before parent's suspend has not started,
+ * but the core suspend has finished.
+ */
+ if (ci->in_lpm)
+ pm_runtime_resume(dev);
+
ret = ci_controller_suspend(dev);
if (ret)
return ret;
diff --git a/drivers/usb/gadget/acm_ms.c b/drivers/usb/gadget/acm_ms.c
index 9907a255e693..d7129623cb4b 100644
--- a/drivers/usb/gadget/acm_ms.c
+++ b/drivers/usb/gadget/acm_ms.c
@@ -114,7 +114,7 @@ static struct usb_function_instance *f_acm_inst;
/*
* We _always_ have both ACM and mass storage functions.
*/
-static int acm_ms_do_config(struct usb_configuration *c)
+static int __init acm_ms_do_config(struct usb_configuration *c)
{
int status;
@@ -160,7 +160,7 @@ static struct usb_configuration acm_ms_config_driver = {
/*-------------------------------------------------------------------------*/
-static int acm_ms_bind(struct usb_composite_dev *cdev)
+static int __init acm_ms_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
int status;
@@ -224,7 +224,7 @@ static int __init init(void)
{
return usb_composite_probe(&acm_ms_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/audio.c b/drivers/usb/gadget/audio.c
index f2a47e9aef79..04345a46692f 100644
--- a/drivers/usb/gadget/audio.c
+++ b/drivers/usb/gadget/audio.c
@@ -107,7 +107,7 @@ static const struct usb_descriptor_header *otg_desc[] = {
/*-------------------------------------------------------------------------*/
-static int audio_do_config(struct usb_configuration *c)
+static int __init audio_do_config(struct usb_configuration *c)
{
/* FIXME alloc iConfiguration string, set it in c->strings */
@@ -133,7 +133,7 @@ static struct usb_configuration audio_config_driver = {
/*-------------------------------------------------------------------------*/
-static int audio_bind(struct usb_composite_dev *cdev)
+static int __init audio_bind(struct usb_composite_dev *cdev)
{
int status;
@@ -176,7 +176,7 @@ static int __init init(void)
{
return usb_composite_probe(&audio_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/cdc2.c b/drivers/usb/gadget/cdc2.c
index 21bd230fef1e..35e19eb16f87 100644
--- a/drivers/usb/gadget/cdc2.c
+++ b/drivers/usb/gadget/cdc2.c
@@ -111,7 +111,7 @@ static struct usb_function_instance *fi_serial;
/*
* We _always_ have both CDC ECM and CDC ACM functions.
*/
-static int cdc_do_config(struct usb_configuration *c)
+static int __init cdc_do_config(struct usb_configuration *c)
{
int status;
@@ -154,7 +154,7 @@ static struct usb_configuration cdc_config_driver = {
/*-------------------------------------------------------------------------*/
-static int cdc_bind(struct usb_composite_dev *cdev)
+static int __init cdc_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
int status;
@@ -221,7 +221,7 @@ static int __init init(void)
{
return usb_composite_probe(&cdc_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/dbgp.c b/drivers/usb/gadget/dbgp.c
index b96e86e17de0..986fc511a2ed 100644
--- a/drivers/usb/gadget/dbgp.c
+++ b/drivers/usb/gadget/dbgp.c
@@ -235,7 +235,7 @@ static void dbgp_unbind(struct usb_gadget *gadget)
static unsigned char tty_line;
#endif
-static int dbgp_configure_endpoints(struct usb_gadget *gadget)
+static int __init dbgp_configure_endpoints(struct usb_gadget *gadget)
{
int stp;
@@ -291,7 +291,7 @@ fail_1:
return -ENODEV;
}
-static int dbgp_bind(struct usb_gadget *gadget,
+static int __init dbgp_bind(struct usb_gadget *gadget,
struct usb_gadget_driver *driver)
{
int err, stp;
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index ea9dfe4af7d1..2cc7e6668900 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -215,7 +215,7 @@ static struct eth_dev *the_dev;
* the first one present. That's to make Microsoft's drivers happy,
* and to follow DOCSIS 1.0 (cable modem standard).
*/
-static int rndis_do_config(struct usb_configuration *c)
+static int __init rndis_do_config(struct usb_configuration *c)
{
/* FIXME alloc iConfiguration string, set it in c->strings */
@@ -247,7 +247,7 @@ MODULE_PARM_DESC(use_eem, "use CDC EEM mode");
/*
* We _always_ have an ECM, CDC Subset, or EEM configuration.
*/
-static int eth_do_config(struct usb_configuration *c)
+static int __init eth_do_config(struct usb_configuration *c)
{
/* FIXME alloc iConfiguration string, set it in c->strings */
@@ -273,7 +273,7 @@ static struct usb_configuration eth_config_driver = {
/*-------------------------------------------------------------------------*/
-static int eth_bind(struct usb_composite_dev *cdev)
+static int __init eth_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
int status;
@@ -365,7 +365,7 @@ static int __init init(void)
{
return usb_composite_probe(&eth_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c
index 82281cb69308..f4e0bbef602a 100644
--- a/drivers/usb/gadget/f_eem.c
+++ b/drivers/usb/gadget/f_eem.c
@@ -40,7 +40,7 @@ static inline struct f_eem *func_to_eem(struct usb_function *f)
/* interface descriptor: */
-static struct usb_interface_descriptor eem_intf = {
+static struct usb_interface_descriptor eem_intf __initdata = {
.bLength = sizeof eem_intf,
.bDescriptorType = USB_DT_INTERFACE,
@@ -54,7 +54,7 @@ static struct usb_interface_descriptor eem_intf = {
/* full speed support: */
-static struct usb_endpoint_descriptor eem_fs_in_desc = {
+static struct usb_endpoint_descriptor eem_fs_in_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -62,7 +62,7 @@ static struct usb_endpoint_descriptor eem_fs_in_desc = {
.bmAttributes = USB_ENDPOINT_XFER_BULK,
};
-static struct usb_endpoint_descriptor eem_fs_out_desc = {
+static struct usb_endpoint_descriptor eem_fs_out_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -70,7 +70,7 @@ static struct usb_endpoint_descriptor eem_fs_out_desc = {
.bmAttributes = USB_ENDPOINT_XFER_BULK,
};
-static struct usb_descriptor_header *eem_fs_function[] = {
+static struct usb_descriptor_header *eem_fs_function[] __initdata = {
/* CDC EEM control descriptors */
(struct usb_descriptor_header *) &eem_intf,
(struct usb_descriptor_header *) &eem_fs_in_desc,
@@ -80,7 +80,7 @@ static struct usb_descriptor_header *eem_fs_function[] = {
/* high speed support: */
-static struct usb_endpoint_descriptor eem_hs_in_desc = {
+static struct usb_endpoint_descriptor eem_hs_in_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -89,7 +89,7 @@ static struct usb_endpoint_descriptor eem_hs_in_desc = {
.wMaxPacketSize = cpu_to_le16(512),
};
-static struct usb_endpoint_descriptor eem_hs_out_desc = {
+static struct usb_endpoint_descriptor eem_hs_out_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -98,7 +98,7 @@ static struct usb_endpoint_descriptor eem_hs_out_desc = {
.wMaxPacketSize = cpu_to_le16(512),
};
-static struct usb_descriptor_header *eem_hs_function[] = {
+static struct usb_descriptor_header *eem_hs_function[] __initdata = {
/* CDC EEM control descriptors */
(struct usb_descriptor_header *) &eem_intf,
(struct usb_descriptor_header *) &eem_hs_in_desc,
@@ -108,7 +108,7 @@ static struct usb_descriptor_header *eem_hs_function[] = {
/* super speed support: */
-static struct usb_endpoint_descriptor eem_ss_in_desc = {
+static struct usb_endpoint_descriptor eem_ss_in_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -117,7 +117,7 @@ static struct usb_endpoint_descriptor eem_ss_in_desc = {
.wMaxPacketSize = cpu_to_le16(1024),
};
-static struct usb_endpoint_descriptor eem_ss_out_desc = {
+static struct usb_endpoint_descriptor eem_ss_out_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -126,7 +126,7 @@ static struct usb_endpoint_descriptor eem_ss_out_desc = {
.wMaxPacketSize = cpu_to_le16(1024),
};
-static struct usb_ss_ep_comp_descriptor eem_ss_bulk_comp_desc = {
+static struct usb_ss_ep_comp_descriptor eem_ss_bulk_comp_desc __initdata = {
.bLength = sizeof eem_ss_bulk_comp_desc,
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
@@ -135,7 +135,7 @@ static struct usb_ss_ep_comp_descriptor eem_ss_bulk_comp_desc = {
/* .bmAttributes = 0, */
};
-static struct usb_descriptor_header *eem_ss_function[] = {
+static struct usb_descriptor_header *eem_ss_function[] __initdata = {
/* CDC EEM control descriptors */
(struct usb_descriptor_header *) &eem_intf,
(struct usb_descriptor_header *) &eem_ss_in_desc,
@@ -242,7 +242,7 @@ static void eem_disable(struct usb_function *f)
/* EEM function driver setup/binding */
-static int
+static int __init
eem_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_composite_dev *cdev = c->cdev;
@@ -528,7 +528,7 @@ error:
* Caller must have called @gether_setup(). Caller is also responsible
* for calling @gether_cleanup() before module unload.
*/
-int eem_bind_config(struct usb_configuration *c, struct eth_dev *dev)
+int __init eem_bind_config(struct usb_configuration *c, struct eth_dev *dev)
{
struct f_eem *eem;
int status;
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c
index 991320e14f0b..6e69a8e8d22a 100644
--- a/drivers/usb/gadget/f_hid.c
+++ b/drivers/usb/gadget/f_hid.c
@@ -560,7 +560,7 @@ const struct file_operations f_hidg_fops = {
.llseek = noop_llseek,
};
-static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
+static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_ep *ep;
struct f_hidg *hidg = func_to_hidg(f);
@@ -689,7 +689,7 @@ static struct usb_gadget_strings *ct_func_strings[] = {
/*-------------------------------------------------------------------------*/
/* usb_configuration */
-int hidg_bind_config(struct usb_configuration *c,
+int __init hidg_bind_config(struct usb_configuration *c,
struct hidg_func_descriptor *fdesc, int index)
{
struct f_hidg *hidg;
@@ -743,7 +743,7 @@ int hidg_bind_config(struct usb_configuration *c,
return status;
}
-int ghid_setup(struct usb_gadget *g, int count)
+int __init ghid_setup(struct usb_gadget *g, int count)
{
int status;
dev_t dev;
diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c
index c28e0a74c102..263e721c2694 100644
--- a/drivers/usb/gadget/f_midi.c
+++ b/drivers/usb/gadget/f_midi.c
@@ -97,7 +97,7 @@ DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(1);
DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(16);
/* B.3.1 Standard AC Interface Descriptor */
-static struct usb_interface_descriptor ac_interface_desc = {
+static struct usb_interface_descriptor ac_interface_desc __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */
@@ -108,7 +108,7 @@ static struct usb_interface_descriptor ac_interface_desc = {
};
/* B.3.2 Class-Specific AC Interface Descriptor */
-static struct uac1_ac_header_descriptor_1 ac_header_desc = {
+static struct uac1_ac_header_descriptor_1 ac_header_desc __initdata = {
.bLength = UAC_DT_AC_HEADER_SIZE(1),
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = USB_MS_HEADER,
@@ -119,7 +119,7 @@ static struct uac1_ac_header_descriptor_1 ac_header_desc = {
};
/* B.4.1 Standard MS Interface Descriptor */
-static struct usb_interface_descriptor ms_interface_desc = {
+static struct usb_interface_descriptor ms_interface_desc __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
/* .bInterfaceNumber = DYNAMIC */
@@ -130,7 +130,7 @@ static struct usb_interface_descriptor ms_interface_desc = {
};
/* B.4.2 Class-Specific MS Interface Descriptor */
-static struct usb_ms_header_descriptor ms_header_desc = {
+static struct usb_ms_header_descriptor ms_header_desc __initdata = {
.bLength = USB_DT_MS_HEADER_SIZE,
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubtype = USB_MS_HEADER,
@@ -733,7 +733,7 @@ fail:
/* MIDI function driver setup/binding */
-static int
+static int __init
f_midi_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_descriptor_header **midi_function;
@@ -923,7 +923,7 @@ fail:
*
* Returns zero on success, else negative errno.
*/
-int f_midi_bind_config(struct usb_configuration *c,
+int __init f_midi_bind_config(struct usb_configuration *c,
int index, char *id,
unsigned int in_ports,
unsigned int out_ports,
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c
index d65e49ceca44..ee19bc8d0040 100644
--- a/drivers/usb/gadget/f_ncm.c
+++ b/drivers/usb/gadget/f_ncm.c
@@ -125,7 +125,7 @@ static struct usb_cdc_ncm_ntb_parameters ntb_parameters = {
#define NCM_STATUS_INTERVAL_MS 32
#define NCM_STATUS_BYTECOUNT 16 /* 8 byte header + data */
-static struct usb_interface_assoc_descriptor ncm_iad_desc = {
+static struct usb_interface_assoc_descriptor ncm_iad_desc __initdata = {
.bLength = sizeof ncm_iad_desc,
.bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
@@ -139,7 +139,7 @@ static struct usb_interface_assoc_descriptor ncm_iad_desc = {
/* interface descriptor: */
-static struct usb_interface_descriptor ncm_control_intf = {
+static struct usb_interface_descriptor ncm_control_intf __initdata = {
.bLength = sizeof ncm_control_intf,
.bDescriptorType = USB_DT_INTERFACE,
@@ -151,7 +151,7 @@ static struct usb_interface_descriptor ncm_control_intf = {
/* .iInterface = DYNAMIC */
};
-static struct usb_cdc_header_desc ncm_header_desc = {
+static struct usb_cdc_header_desc ncm_header_desc __initdata = {
.bLength = sizeof ncm_header_desc,
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_HEADER_TYPE,
@@ -159,7 +159,7 @@ static struct usb_cdc_header_desc ncm_header_desc = {
.bcdCDC = cpu_to_le16(0x0110),
};
-static struct usb_cdc_union_desc ncm_union_desc = {
+static struct usb_cdc_union_desc ncm_union_desc __initdata = {
.bLength = sizeof(ncm_union_desc),
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_UNION_TYPE,
@@ -167,7 +167,7 @@ static struct usb_cdc_union_desc ncm_union_desc = {
/* .bSlaveInterface0 = DYNAMIC */
};
-static struct usb_cdc_ether_desc ecm_desc = {
+static struct usb_cdc_ether_desc ecm_desc __initdata = {
.bLength = sizeof ecm_desc,
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_ETHERNET_TYPE,
@@ -182,7 +182,7 @@ static struct usb_cdc_ether_desc ecm_desc = {
#define NCAPS (USB_CDC_NCM_NCAP_ETH_FILTER | USB_CDC_NCM_NCAP_CRC_MODE)
-static struct usb_cdc_ncm_desc ncm_desc = {
+static struct usb_cdc_ncm_desc ncm_desc __initdata = {
.bLength = sizeof ncm_desc,
.bDescriptorType = USB_DT_CS_INTERFACE,
.bDescriptorSubType = USB_CDC_NCM_TYPE,
@@ -194,7 +194,7 @@ static struct usb_cdc_ncm_desc ncm_desc = {
/* the default data interface has no endpoints ... */
-static struct usb_interface_descriptor ncm_data_nop_intf = {
+static struct usb_interface_descriptor ncm_data_nop_intf __initdata = {
.bLength = sizeof ncm_data_nop_intf,
.bDescriptorType = USB_DT_INTERFACE,
@@ -209,7 +209,7 @@ static struct usb_interface_descriptor ncm_data_nop_intf = {
/* ... but the "real" data interface has two bulk endpoints */
-static struct usb_interface_descriptor ncm_data_intf = {
+static struct usb_interface_descriptor ncm_data_intf __initdata = {
.bLength = sizeof ncm_data_intf,
.bDescriptorType = USB_DT_INTERFACE,
@@ -224,7 +224,7 @@ static struct usb_interface_descriptor ncm_data_intf = {
/* full speed support: */
-static struct usb_endpoint_descriptor fs_ncm_notify_desc = {
+static struct usb_endpoint_descriptor fs_ncm_notify_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -234,7 +234,7 @@ static struct usb_endpoint_descriptor fs_ncm_notify_desc = {
.bInterval = NCM_STATUS_INTERVAL_MS,
};
-static struct usb_endpoint_descriptor fs_ncm_in_desc = {
+static struct usb_endpoint_descriptor fs_ncm_in_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -242,7 +242,7 @@ static struct usb_endpoint_descriptor fs_ncm_in_desc = {
.bmAttributes = USB_ENDPOINT_XFER_BULK,
};
-static struct usb_endpoint_descriptor fs_ncm_out_desc = {
+static struct usb_endpoint_descriptor fs_ncm_out_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -250,7 +250,7 @@ static struct usb_endpoint_descriptor fs_ncm_out_desc = {
.bmAttributes = USB_ENDPOINT_XFER_BULK,
};
-static struct usb_descriptor_header *ncm_fs_function[] = {
+static struct usb_descriptor_header *ncm_fs_function[] __initdata = {
(struct usb_descriptor_header *) &ncm_iad_desc,
/* CDC NCM control descriptors */
(struct usb_descriptor_header *) &ncm_control_intf,
@@ -269,7 +269,7 @@ static struct usb_descriptor_header *ncm_fs_function[] = {
/* high speed support: */
-static struct usb_endpoint_descriptor hs_ncm_notify_desc = {
+static struct usb_endpoint_descriptor hs_ncm_notify_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -278,7 +278,7 @@ static struct usb_endpoint_descriptor hs_ncm_notify_desc = {
.wMaxPacketSize = cpu_to_le16(NCM_STATUS_BYTECOUNT),
.bInterval = USB_MS_TO_HS_INTERVAL(NCM_STATUS_INTERVAL_MS),
};
-static struct usb_endpoint_descriptor hs_ncm_in_desc = {
+static struct usb_endpoint_descriptor hs_ncm_in_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -287,7 +287,7 @@ static struct usb_endpoint_descriptor hs_ncm_in_desc = {
.wMaxPacketSize = cpu_to_le16(512),
};
-static struct usb_endpoint_descriptor hs_ncm_out_desc = {
+static struct usb_endpoint_descriptor hs_ncm_out_desc __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -296,7 +296,7 @@ static struct usb_endpoint_descriptor hs_ncm_out_desc = {
.wMaxPacketSize = cpu_to_le16(512),
};
-static struct usb_descriptor_header *ncm_hs_function[] = {
+static struct usb_descriptor_header *ncm_hs_function[] __initdata = {
(struct usb_descriptor_header *) &ncm_iad_desc,
/* CDC NCM control descriptors */
(struct usb_descriptor_header *) &ncm_control_intf,
@@ -1152,7 +1152,7 @@ static void ncm_close(struct gether *geth)
/* ethernet function driver setup/binding */
-static int
+static int __init
ncm_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_composite_dev *cdev = c->cdev;
@@ -1287,7 +1287,7 @@ ncm_unbind(struct usb_configuration *c, struct usb_function *f)
* Caller must have called @gether_setup(). Caller is also responsible
* for calling @gether_cleanup() before module unload.
*/
-int ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
struct eth_dev *dev)
{
struct f_ncm *ncm;
diff --git a/drivers/usb/gadget/f_uac1.c b/drivers/usb/gadget/f_uac1.c
index e11f6cdbe27f..fa8ea4ea00c1 100644
--- a/drivers/usb/gadget/f_uac1.c
+++ b/drivers/usb/gadget/f_uac1.c
@@ -46,7 +46,7 @@ static int generic_get_cmd(struct usb_audio_control *con, u8 cmd);
#define F_AUDIO_NUM_INTERFACES 2
/* B.3.1 Standard AC Interface Descriptor */
-static struct usb_interface_descriptor ac_interface_desc = {
+static struct usb_interface_descriptor ac_interface_desc __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bNumEndpoints = 0,
@@ -188,7 +188,7 @@ static struct usb_endpoint_descriptor as_out_ep_desc = {
};
/* Class-specific AS ISO OUT Endpoint Descriptor */
-static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
+static struct uac_iso_endpoint_descriptor as_iso_out_desc __initdata = {
.bLength = UAC_ISO_ENDPOINT_DESC_SIZE,
.bDescriptorType = USB_DT_CS_ENDPOINT,
.bDescriptorSubtype = UAC_EP_GENERAL,
@@ -197,7 +197,7 @@ static struct uac_iso_endpoint_descriptor as_iso_out_desc = {
.wLockDelay = __constant_cpu_to_le16(1),
};
-static struct usb_descriptor_header *f_audio_desc[] = {
+static struct usb_descriptor_header *f_audio_desc[] __initdata = {
(struct usb_descriptor_header *)&ac_interface_desc,
(struct usb_descriptor_header *)&ac_header_desc,
@@ -625,7 +625,7 @@ static void f_audio_build_desc(struct f_audio *audio)
}
/* audio function driver setup/binding */
-static int
+static int __init
f_audio_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_composite_dev *cdev = c->cdev;
@@ -695,7 +695,7 @@ static int generic_get_cmd(struct usb_audio_control *con, u8 cmd)
}
/* Todo: add more control selecotor dynamically */
-int control_selector_init(struct f_audio *audio)
+int __init control_selector_init(struct f_audio *audio)
{
INIT_LIST_HEAD(&audio->cs);
list_add(&feature_unit.list, &audio->cs);
@@ -719,7 +719,7 @@ int control_selector_init(struct f_audio *audio)
*
* Returns zero on success, else negative errno.
*/
-int audio_bind_config(struct usb_configuration *c)
+int __init audio_bind_config(struct usb_configuration *c)
{
struct f_audio *audio;
int status;
diff --git a/drivers/usb/gadget/f_uac2.c b/drivers/usb/gadget/f_uac2.c
index 346700c7d4b2..03c1fb686644 100644
--- a/drivers/usb/gadget/f_uac2.c
+++ b/drivers/usb/gadget/f_uac2.c
@@ -912,7 +912,7 @@ free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep)
"%s:%d Error!\n", __func__, __LINE__);
}
-static int
+static int __init
afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
{
struct audio_dev *agdev = func_to_agdev(fn);
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c
index 9a2e96919c12..38dcedddc52c 100644
--- a/drivers/usb/gadget/f_uvc.c
+++ b/drivers/usb/gadget/f_uvc.c
@@ -75,7 +75,7 @@ static struct usb_gadget_strings *uvc_function_strings[] = {
#define UVC_STATUS_MAX_PACKET_SIZE 16 /* 16 bytes status */
-static struct usb_interface_assoc_descriptor uvc_iad = {
+static struct usb_interface_assoc_descriptor uvc_iad __initdata = {
.bLength = sizeof(uvc_iad),
.bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
.bFirstInterface = 0,
@@ -86,7 +86,7 @@ static struct usb_interface_assoc_descriptor uvc_iad = {
.iFunction = 0,
};
-static struct usb_interface_descriptor uvc_control_intf = {
+static struct usb_interface_descriptor uvc_control_intf __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = UVC_INTF_VIDEO_CONTROL,
@@ -98,7 +98,7 @@ static struct usb_interface_descriptor uvc_control_intf = {
.iInterface = 0,
};
-static struct usb_endpoint_descriptor uvc_control_ep = {
+static struct usb_endpoint_descriptor uvc_control_ep __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN,
@@ -107,7 +107,7 @@ static struct usb_endpoint_descriptor uvc_control_ep = {
.bInterval = 8,
};
-static struct usb_ss_ep_comp_descriptor uvc_ss_control_comp = {
+static struct usb_ss_ep_comp_descriptor uvc_ss_control_comp __initdata = {
.bLength = sizeof(uvc_ss_control_comp),
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
/* The following 3 values can be tweaked if necessary. */
@@ -116,14 +116,14 @@ static struct usb_ss_ep_comp_descriptor uvc_ss_control_comp = {
.wBytesPerInterval = cpu_to_le16(UVC_STATUS_MAX_PACKET_SIZE),
};
-static struct uvc_control_endpoint_descriptor uvc_control_cs_ep = {
+static struct uvc_control_endpoint_descriptor uvc_control_cs_ep __initdata = {
.bLength = UVC_DT_CONTROL_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_CS_ENDPOINT,
.bDescriptorSubType = UVC_EP_INTERRUPT,
.wMaxTransferSize = cpu_to_le16(UVC_STATUS_MAX_PACKET_SIZE),
};
-static struct usb_interface_descriptor uvc_streaming_intf_alt0 = {
+static struct usb_interface_descriptor uvc_streaming_intf_alt0 __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = UVC_INTF_VIDEO_STREAMING,
@@ -135,7 +135,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt0 = {
.iInterface = 0,
};
-static struct usb_interface_descriptor uvc_streaming_intf_alt1 = {
+static struct usb_interface_descriptor uvc_streaming_intf_alt1 __initdata = {
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = UVC_INTF_VIDEO_STREAMING,
@@ -147,7 +147,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt1 = {
.iInterface = 0,
};
-static struct usb_endpoint_descriptor uvc_fs_streaming_ep = {
+static struct usb_endpoint_descriptor uvc_fs_streaming_ep __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN,
@@ -160,7 +160,7 @@ static struct usb_endpoint_descriptor uvc_fs_streaming_ep = {
.bInterval = 0,
};
-static struct usb_endpoint_descriptor uvc_hs_streaming_ep = {
+static struct usb_endpoint_descriptor uvc_hs_streaming_ep __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = USB_DIR_IN,
@@ -173,7 +173,7 @@ static struct usb_endpoint_descriptor uvc_hs_streaming_ep = {
.bInterval = 0,
};
-static struct usb_endpoint_descriptor uvc_ss_streaming_ep = {
+static struct usb_endpoint_descriptor uvc_ss_streaming_ep __initdata = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -187,7 +187,7 @@ static struct usb_endpoint_descriptor uvc_ss_streaming_ep = {
.bInterval = 0,
};
-static struct usb_ss_ep_comp_descriptor uvc_ss_streaming_comp = {
+static struct usb_ss_ep_comp_descriptor uvc_ss_streaming_comp __initdata = {
.bLength = sizeof(uvc_ss_streaming_comp),
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
/* The following 3 values can be tweaked if necessary. */
@@ -441,7 +441,7 @@ uvc_register_video(struct uvc_device *uvc)
} \
} while (0)
-static struct usb_descriptor_header **
+static struct usb_descriptor_header ** __init
uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
{
struct uvc_input_header_descriptor *uvc_streaming_header;
@@ -582,7 +582,7 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f)
kfree(uvc);
}
-static int
+static int __init
uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
{
struct usb_composite_dev *cdev = c->cdev;
@@ -743,7 +743,7 @@ error:
* Caller must have called @uvc_setup(). Caller is also responsible for
* calling @uvc_cleanup() before module unload.
*/
-int
+int __init
uvc_bind_config(struct usb_configuration *c,
const struct uvc_descriptor_header * const *fs_control,
const struct uvc_descriptor_header * const *ss_control,
diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c
index f42afefa7b35..67bd00ade722 100644
--- a/drivers/usb/gadget/gmidi.c
+++ b/drivers/usb/gadget/gmidi.c
@@ -128,14 +128,14 @@ static struct usb_configuration midi_config = {
.MaxPower = CONFIG_USB_GADGET_VBUS_DRAW,
};
-static int midi_bind_config(struct usb_configuration *c)
+static int __init midi_bind_config(struct usb_configuration *c)
{
return f_midi_bind_config(c, index, id,
in_ports, out_ports,
buflen, qlen);
}
-static int midi_bind(struct usb_composite_dev *cdev)
+static int __init midi_bind(struct usb_composite_dev *cdev)
{
int status;
@@ -167,7 +167,7 @@ static int __init midi_init(void)
{
return usb_composite_probe(&midi_driver);
}
-module_init(midi_init);
+late_initcall(midi_init);
static void __exit midi_cleanup(void)
{
diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c
index dc70b1585e45..2371a7425680 100644
--- a/drivers/usb/gadget/hid.c
+++ b/drivers/usb/gadget/hid.c
@@ -111,7 +111,7 @@ static struct usb_gadget_strings *dev_strings[] = {
/****************************** Configurations ******************************/
-static int do_config(struct usb_configuration *c)
+static int __init do_config(struct usb_configuration *c)
{
struct hidg_func_node *e;
int func = 0, status = 0;
@@ -139,7 +139,7 @@ static struct usb_configuration config_driver = {
/****************************** Gadget Bind ******************************/
-static int hid_bind(struct usb_composite_dev *cdev)
+static int __init hid_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
struct list_head *tmp;
@@ -183,7 +183,7 @@ static int __exit hid_unbind(struct usb_composite_dev *cdev)
return 0;
}
-static int hidg_plat_driver_probe(struct platform_device *pdev)
+static int __init hidg_plat_driver_probe(struct platform_device *pdev)
{
struct hidg_func_descriptor *func = pdev->dev.platform_data;
struct hidg_func_node *entry;
@@ -256,7 +256,7 @@ static int __init hidg_init(void)
return status;
}
-module_init(hidg_init);
+late_initcall(hidg_init);
static void __exit hidg_cleanup(void)
{
diff --git a/drivers/usb/gadget/mass_storage.c b/drivers/usb/gadget/mass_storage.c
index 9f6025cd1a63..fd26fc84919b 100644
--- a/drivers/usb/gadget/mass_storage.c
+++ b/drivers/usb/gadget/mass_storage.c
@@ -113,7 +113,7 @@ static int msg_thread_exits(struct fsg_common *common)
return 0;
}
-static int msg_do_config(struct usb_configuration *c)
+static int __init msg_do_config(struct usb_configuration *c)
{
static const struct fsg_operations ops = {
.thread_exits = msg_thread_exits,
@@ -150,7 +150,7 @@ static struct usb_configuration msg_config_driver = {
/****************************** Gadget Bind ******************************/
-static int msg_bind(struct usb_composite_dev *cdev)
+static int __init msg_bind(struct usb_composite_dev *cdev)
{
int status;
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index fcc536671b9c..fbce0d5060cf 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -143,7 +143,7 @@ static struct eth_dev *the_dev;
#ifdef USB_ETH_RNDIS
static struct usb_function *f_acm_rndis;
-static int rndis_do_config(struct usb_configuration *c)
+static __init int rndis_do_config(struct usb_configuration *c)
{
int ret;
@@ -207,7 +207,7 @@ static int rndis_config_register(struct usb_composite_dev *cdev)
#ifdef CONFIG_USB_G_MULTI_CDC
static struct usb_function *f_acm_multi;
-static int cdc_do_config(struct usb_configuration *c)
+static __init int cdc_do_config(struct usb_configuration *c)
{
int ret;
@@ -365,7 +365,7 @@ static int __init multi_init(void)
{
return usb_composite_probe(&multi_driver);
}
-module_init(multi_init);
+late_initcall(multi_init);
static void __exit multi_exit(void)
{
diff --git a/drivers/usb/gadget/ncm.c b/drivers/usb/gadget/ncm.c
index 9a7c859388d5..513c384ac7c5 100644
--- a/drivers/usb/gadget/ncm.c
+++ b/drivers/usb/gadget/ncm.c
@@ -116,7 +116,7 @@ static u8 hostaddr[ETH_ALEN];
/*-------------------------------------------------------------------------*/
-static int ncm_do_config(struct usb_configuration *c)
+static int __init ncm_do_config(struct usb_configuration *c)
{
/* FIXME alloc iConfiguration string, set it in c->strings */
@@ -138,7 +138,7 @@ static struct usb_configuration ncm_config_driver = {
/*-------------------------------------------------------------------------*/
-static int gncm_bind(struct usb_composite_dev *cdev)
+static int __init gncm_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
int status;
@@ -196,7 +196,7 @@ static int __init init(void)
{
return usb_composite_probe(&ncm_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/nokia.c b/drivers/usb/gadget/nokia.c
index 6f860b8dc648..ac159956453f 100644
--- a/drivers/usb/gadget/nokia.c
+++ b/drivers/usb/gadget/nokia.c
@@ -127,7 +127,7 @@ static struct usb_configuration nokia_config_100ma_driver = {
static struct usb_function_instance *fi_acm;
-static int nokia_bind_config(struct usb_configuration *c)
+static int __init nokia_bind_config(struct usb_configuration *c)
{
struct usb_function *f_acm;
int status = 0;
@@ -170,7 +170,7 @@ err_conf:
return status;
}
-static int nokia_bind(struct usb_composite_dev *cdev)
+static int __init nokia_bind(struct usb_composite_dev *cdev)
{
struct usb_gadget *gadget = cdev->gadget;
int status;
@@ -270,7 +270,7 @@ static int __init nokia_init(void)
{
return usb_composite_probe(&nokia_driver);
}
-module_init(nokia_init);
+late_initcall(nokia_init);
static void __exit nokia_cleanup(void)
{
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c
index 2ecf3b1a112b..1b54f049112d 100644
--- a/drivers/usb/gadget/printer.c
+++ b/drivers/usb/gadget/printer.c
@@ -978,7 +978,7 @@ unknown:
return value;
}
-static int printer_func_bind(struct usb_configuration *c,
+static int __init printer_func_bind(struct usb_configuration *c,
struct usb_function *f)
{
struct printer_dev *dev = container_of(f, struct printer_dev, function);
@@ -1104,7 +1104,7 @@ static struct usb_configuration printer_cfg_driver = {
.bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
};
-static int printer_bind_config(struct usb_configuration *c)
+static int __init printer_bind_config(struct usb_configuration *c)
{
struct usb_gadget *gadget = c->cdev->gadget;
struct printer_dev *dev;
@@ -1225,7 +1225,7 @@ static int printer_unbind(struct usb_composite_dev *cdev)
return 0;
}
-static int printer_bind(struct usb_composite_dev *cdev)
+static int __init printer_bind(struct usb_composite_dev *cdev)
{
int ret;
@@ -1281,7 +1281,7 @@ init(void)
return status;
}
-module_init(init);
+late_initcall(init);
static void __exit
cleanup(void)
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c
index 812780fe209f..0c7b826e46fc 100644
--- a/drivers/usb/gadget/serial.c
+++ b/drivers/usb/gadget/serial.c
@@ -174,7 +174,7 @@ out:
return ret;
}
-static int gs_bind(struct usb_composite_dev *cdev)
+static int __init gs_bind(struct usb_composite_dev *cdev)
{
int status;
@@ -267,7 +267,7 @@ static int __init init(void)
return usb_composite_probe(&gserial_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{
diff --git a/drivers/usb/gadget/u_uac1.c b/drivers/usb/gadget/u_uac1.c
index bca223082867..c7d460f43390 100644
--- a/drivers/usb/gadget/u_uac1.c
+++ b/drivers/usb/gadget/u_uac1.c
@@ -301,7 +301,7 @@ static struct gaudio *the_card;
*
* Returns negative errno, or zero on success
*/
-int gaudio_setup(struct gaudio *card)
+int __init gaudio_setup(struct gaudio *card)
{
int ret;
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index 189efa9c8d54..752fd147ce35 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -47,7 +47,6 @@ struct usb_udc {
static struct class *udc_class;
static LIST_HEAD(udc_list);
-static LIST_HEAD(driver_list);
static DEFINE_MUTEX(udc_lock);
/* ------------------------------------------------------------------------- */
@@ -181,9 +180,6 @@ static void usb_udc_nop_release(struct device *dev)
dev_vdbg(dev, "%s\n", __func__);
}
-static int udc_bind_to_driver(struct usb_udc *udc,
- struct usb_gadget_driver *driver);
-
/**
* usb_add_gadget_udc_release - adds a new gadget to the udc class driver list
* @parent: the parent device to this udc. Usually the controller driver's
@@ -240,20 +236,6 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED);
- if (!list_empty(&driver_list)) {
- struct usb_gadget_driver *driver;
- list_for_each_entry(driver, &driver_list, list) {
- if (driver->attached)
- continue;
- ret = udc_bind_to_driver(udc, driver);
- if (ret)
- goto err4;
- else
- break;
- }
-
- }
-
mutex_unlock(&udc_lock);
return 0;
@@ -363,16 +345,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri
driver->unbind(udc->gadget);
goto err1;
}
- /*
- * HACK: The Android gadget driver disconnects the gadget
- * on bind and expects the gadget to stay disconnected until
- * it calls usb_gadget_connect when userspace is ready. Remove
- * the call to usb_gadget_connect bellow to avoid enabling the
- * pullup before userspace is ready.
- *
- * usb_gadget_connect(udc->gadget);
- */
- driver->attached = true;
+ usb_gadget_connect(udc->gadget);
kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
return 0;
@@ -428,13 +401,8 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
pr_debug("couldn't find an available UDC\n");
mutex_unlock(&udc_lock);
-
- driver->attached = false;
- list_add_tail(&driver->list, &driver_list);
-
- return 0;
+ return -ENODEV;
found:
- list_add_tail(&driver->list, &driver_list);
ret = udc_bind_to_driver(udc, driver);
mutex_unlock(&udc_lock);
return ret;
@@ -459,9 +427,6 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
break;
}
- driver->attached = false;
- list_del(&driver->list);
-
mutex_unlock(&udc_lock);
return ret;
}
diff --git a/drivers/usb/gadget/webcam.c b/drivers/usb/gadget/webcam.c
index c79a654f4b07..79655b9e23af 100644
--- a/drivers/usb/gadget/webcam.c
+++ b/drivers/usb/gadget/webcam.c
@@ -323,7 +323,7 @@ static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = {
* USB configuration
*/
-static int
+static int __init
webcam_config_bind(struct usb_configuration *c)
{
return uvc_bind_config(c, uvc_fs_control_cls, uvc_ss_control_cls,
@@ -345,7 +345,7 @@ webcam_unbind(struct usb_composite_dev *cdev)
return 0;
}
-static int
+static int __init
webcam_bind(struct usb_composite_dev *cdev)
{
int ret;
@@ -402,7 +402,7 @@ webcam_cleanup(void)
usb_composite_unregister(&webcam_driver);
}
-module_init(webcam_init);
+late_initcall(webcam_init);
module_exit(webcam_cleanup);
MODULE_AUTHOR("Laurent Pinchart");
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c
index 69ebb4a9c38c..4cce2585c9d0 100644
--- a/drivers/usb/gadget/zero.c
+++ b/drivers/usb/gadget/zero.c
@@ -272,7 +272,7 @@ static struct usb_function_instance *func_inst_lb;
module_param_named(qlen, gzero_options.qlen, uint, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(qlen, "depth of loopback queue");
-static int zero_bind(struct usb_composite_dev *cdev)
+static int __init zero_bind(struct usb_composite_dev *cdev)
{
struct f_ss_opts *ss_opts;
struct f_lb_opts *lb_opts;
@@ -418,7 +418,7 @@ static int __init init(void)
{
return usb_composite_probe(&zero_driver);
}
-module_init(init);
+late_initcall(init);
static void __exit cleanup(void)
{