From: Mike Lockwood Date: Mon, 28 Jun 2010 00:05:55 +0000 (-0400) Subject: USB: gadget: composite: Move switch_set_state calls to a work queue X-Git-Tag: firefly_0821_release~7613^2~806 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8da4cc8f77b0d291fa33a5474d69b12b534cb5f4;p=firefly-linux-kernel-4.4.55.git USB: gadget: composite: Move switch_set_state calls to a work queue Signed-off-by: Mike Lockwood --- diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 03b02876ba18..bf555327937f 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -545,7 +545,7 @@ static int set_config(struct usb_composite_dev *cdev, done: usb_gadget_vbus_draw(gadget, power); - switch_set_state(&cdev->sdev, number); + schedule_work(&cdev->switch_work); if (result >= 0 && cdev->delayed_status) result = USB_GADGET_DELAYED_STATUS; @@ -1118,7 +1118,7 @@ static void composite_disconnect(struct usb_gadget *gadget) composite->disconnect(cdev); spin_unlock_irqrestore(&cdev->lock, flags); - switch_set_state(&cdev->sdev, 0); + schedule_work(&cdev->switch_work); } /*-------------------------------------------------------------------------*/ @@ -1199,6 +1199,19 @@ static u8 override_id(struct usb_composite_dev *cdev, u8 *desc) return *desc; } +static void +composite_switch_work(struct work_struct *data) +{ + struct usb_composite_dev *cdev = + container_of(data, struct usb_composite_dev, switch_work); + struct usb_configuration *config = cdev->config; + + if (config) + switch_set_state(&cdev->sdev, config->bConfigurationValue); + else + switch_set_state(&cdev->sdev, 0); +} + static int composite_bind(struct usb_gadget *gadget) { struct usb_composite_dev *cdev; @@ -1252,6 +1265,7 @@ static int composite_bind(struct usb_gadget *gadget) status = switch_dev_register(&cdev->sdev); if (status < 0) goto fail; + INIT_WORK(&cdev->switch_work, composite_switch_work); cdev->desc = *composite->dev; cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket; diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 0b2d2919edb2..4cc46801652b 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -372,6 +372,7 @@ struct usb_composite_dev { spinlock_t lock; struct switch_dev sdev; + struct work_struct switch_work; }; extern int usb_string_id(struct usb_composite_dev *c);