Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 354637
b: refs/heads/master
c: 544aca3
h: refs/heads/master
i:
  354635: 468d180
v: v3
  • Loading branch information
Sebastian Andrzej Siewior authored and Felipe Balbi committed Jan 21, 2013
1 parent 271e97b commit 0cd049e
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 26 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 32b8666589d5c274cea0ea4b07e202422bf975b1
refs/heads/master: 544aca39e670421c2daae4b6706f1e405b19ba72
70 changes: 45 additions & 25 deletions trunk/drivers/usb/gadget/f_sourcesink.c
Original file line number Diff line number Diff line change
Expand Up @@ -449,11 +449,14 @@ sourcesink_bind(struct usb_configuration *c, struct usb_function *f)
return 0;
}

static struct usb_function *global_ss_func;

static void
sourcesink_unbind(struct usb_configuration *c, struct usb_function *f)
{
usb_free_all_descriptors(f);
kfree(func_to_ss(f));
global_ss_func = NULL;
}

/* optionally require specific source/sink data patterns */
Expand Down Expand Up @@ -756,32 +759,10 @@ static void sourcesink_disable(struct usb_function *f)
}

/*-------------------------------------------------------------------------*/

static int __init sourcesink_bind_config(struct usb_configuration *c)
{
struct f_sourcesink *ss;
int status;

ss = kzalloc(sizeof *ss, GFP_KERNEL);
if (!ss)
return -ENOMEM;

ss->function.name = "source/sink";
ss->function.bind = sourcesink_bind;
ss->function.unbind = sourcesink_unbind;
ss->function.set_alt = sourcesink_set_alt;
ss->function.get_alt = sourcesink_get_alt;
ss->function.disable = sourcesink_disable;

status = usb_add_function(c, &ss->function);
if (status)
kfree(ss);
return status;
}

static int sourcesink_setup(struct usb_configuration *c,
static int sourcesink_setup(struct usb_function *f,
const struct usb_ctrlrequest *ctrl)
{
struct usb_configuration *c = f->config;
struct usb_request *req = c->cdev->req;
int value = -EOPNOTSUPP;
u16 w_index = le16_to_cpu(ctrl->wIndex);
Expand Down Expand Up @@ -850,10 +831,49 @@ static int sourcesink_setup(struct usb_configuration *c,
return value;
}

static int __init sourcesink_bind_config(struct usb_configuration *c)
{
struct f_sourcesink *ss;
int status;

ss = kzalloc(sizeof(*ss), GFP_KERNEL);
if (!ss)
return -ENOMEM;

global_ss_func = &ss->function;

ss->function.name = "source/sink";
ss->function.bind = sourcesink_bind;
ss->function.unbind = sourcesink_unbind;
ss->function.set_alt = sourcesink_set_alt;
ss->function.get_alt = sourcesink_get_alt;
ss->function.disable = sourcesink_disable;
ss->function.setup = sourcesink_setup;

status = usb_add_function(c, &ss->function);
if (status)
kfree(ss);
return status;
}

static int ss_config_setup(struct usb_configuration *c,
const struct usb_ctrlrequest *ctrl)
{
if (!global_ss_func)
return -EOPNOTSUPP;
switch (ctrl->bRequest) {
case 0x5b:
case 0x5c:
return global_ss_func->setup(global_ss_func, ctrl);
default:
return -EOPNOTSUPP;
}
}

static struct usb_configuration sourcesink_driver = {
.label = "source/sink",
.strings = sourcesink_strings,
.setup = sourcesink_setup,
.setup = ss_config_setup,
.bConfigurationValue = 3,
.bmAttributes = USB_CONFIG_ATT_SELFPOWER,
/* .iConfiguration = DYNAMIC */
Expand Down

0 comments on commit 0cd049e

Please sign in to comment.