Commit f48cf80f authored by Fabien Chouteau's avatar Fabien Chouteau Committed by Greg Kroah-Hartman

USB: Composite framework: Add suspended sysfs entry

This patch adds a sysfs entry (/sys/devices/platform/_UDC_/gadget/suspended) to
show the suspend state of an USB composite gadget.
Signed-off-by: default avatarFabien Chouteau <fabien.chouteau@barco.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 326b4810
What: /sys/devices/platform/_UDC_/gadget/suspended
Date: April 2010
Contact: Fabien Chouteau <fabien.chouteau@barco.com>
Description:
Show the suspend state of an USB composite gadget.
1 -> suspended
0 -> resumed
(_UDC_ is the name of the USB Device Controller driver)
...@@ -898,6 +898,18 @@ static void composite_disconnect(struct usb_gadget *gadget) ...@@ -898,6 +898,18 @@ static void composite_disconnect(struct usb_gadget *gadget)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static ssize_t composite_show_suspended(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct usb_gadget *gadget = dev_to_usb_gadget(dev);
struct usb_composite_dev *cdev = get_gadget_data(gadget);
return sprintf(buf, "%d\n", cdev->suspended);
}
static DEVICE_ATTR(suspended, 0444, composite_show_suspended, NULL);
static void /* __init_or_exit */ static void /* __init_or_exit */
composite_unbind(struct usb_gadget *gadget) composite_unbind(struct usb_gadget *gadget)
{ {
...@@ -944,6 +956,7 @@ composite_unbind(struct usb_gadget *gadget) ...@@ -944,6 +956,7 @@ composite_unbind(struct usb_gadget *gadget)
} }
kfree(cdev); kfree(cdev);
set_gadget_data(gadget, NULL); set_gadget_data(gadget, NULL);
device_remove_file(&gadget->dev, &dev_attr_suspended);
composite = NULL; composite = NULL;
} }
...@@ -1036,6 +1049,10 @@ static int __init composite_bind(struct usb_gadget *gadget) ...@@ -1036,6 +1049,10 @@ static int __init composite_bind(struct usb_gadget *gadget)
string_override(composite->strings, string_override(composite->strings,
cdev->desc.iSerialNumber, iSerialNumber); cdev->desc.iSerialNumber, iSerialNumber);
status = device_create_file(&gadget->dev, &dev_attr_suspended);
if (status)
goto fail;
INFO(cdev, "%s ready\n", composite->name); INFO(cdev, "%s ready\n", composite->name);
return 0; return 0;
...@@ -1064,6 +1081,8 @@ composite_suspend(struct usb_gadget *gadget) ...@@ -1064,6 +1081,8 @@ composite_suspend(struct usb_gadget *gadget)
} }
if (composite->suspend) if (composite->suspend)
composite->suspend(cdev); composite->suspend(cdev);
cdev->suspended = 1;
} }
static void static void
...@@ -1084,6 +1103,8 @@ composite_resume(struct usb_gadget *gadget) ...@@ -1084,6 +1103,8 @@ composite_resume(struct usb_gadget *gadget)
f->resume(f); f->resume(f);
} }
} }
cdev->suspended = 0;
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -326,6 +326,7 @@ struct usb_composite_dev { ...@@ -326,6 +326,7 @@ struct usb_composite_dev {
/* private: */ /* private: */
/* internals */ /* internals */
unsigned int suspended:1;
struct usb_device_descriptor desc; struct usb_device_descriptor desc;
struct list_head configs; struct list_head configs;
struct usb_composite_driver *driver; struct usb_composite_driver *driver;
......
...@@ -494,6 +494,10 @@ static inline void set_gadget_data(struct usb_gadget *gadget, void *data) ...@@ -494,6 +494,10 @@ static inline void set_gadget_data(struct usb_gadget *gadget, void *data)
{ dev_set_drvdata(&gadget->dev, data); } { dev_set_drvdata(&gadget->dev, data); }
static inline void *get_gadget_data(struct usb_gadget *gadget) static inline void *get_gadget_data(struct usb_gadget *gadget)
{ return dev_get_drvdata(&gadget->dev); } { return dev_get_drvdata(&gadget->dev); }
static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev)
{
return container_of(dev, struct usb_gadget, dev);
}
/* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */ /* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */
#define gadget_for_each_ep(tmp,gadget) \ #define gadget_for_each_ep(tmp,gadget) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment