/*-------------------------------------------------------------------------*/
-static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct usb_function *f = dev_get_drvdata(dev);
- return sprintf(buf, "%d\n", !f->hidden);
-}
-
-static ssize_t enable_store(
- struct device *dev, struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct usb_function *f = dev_get_drvdata(dev);
- struct usb_composite_driver *driver = f->config->cdev->driver;
- int value;
-
- sscanf(buf, "%d", &value);
- if (driver->enable_function)
- driver->enable_function(f, value);
- else
- f->hidden = !value;
-
- return size;
-}
-
-static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, enable_show, enable_store);
-
-
/**
* usb_add_function() - add a function to a configuration
* @config: the configuration
int __init usb_add_function(struct usb_configuration *config,
struct usb_function *function)
{
- struct usb_composite_dev *cdev = config->cdev;
int value = -EINVAL;
- int index;
- DBG(cdev, "adding '%s'/%p to config '%s'/%p\n",
+ DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n",
function->name, function,
config->label, config);
if (!function->set_alt || !function->disable)
goto done;
- index = atomic_inc_return(&cdev->driver->function_count);
- function->dev = device_create(cdev->driver->class, NULL,
- MKDEV(0, index), NULL, function->name);
- if (IS_ERR(function->dev))
- return PTR_ERR(function->dev);
-
- value = device_create_file(function->dev, &dev_attr_enable);
- if (value < 0) {
- device_destroy(cdev->driver->class, MKDEV(0, index));
- return value;
- }
- dev_set_drvdata(function->dev, function);
-
function->config = config;
list_add_tail(&function->list, &config->functions);
done:
if (value)
- DBG(cdev, "adding '%s'/%p --> %d\n",
+ DBG(config->cdev, "adding '%s'/%p --> %d\n",
function->name, function, value);
return value;
}
composite_driver.driver.name = driver->name;
composite = driver;
- driver->class = class_create(THIS_MODULE, "usb_composite");
- if (IS_ERR(driver->class))
- return PTR_ERR(driver->class);
-
return usb_gadget_register_driver(&composite_driver);
}
/* private: */
/* internals */
struct list_head list;
- struct device *dev;
};
int usb_add_function(struct usb_configuration *, struct usb_function *);
const struct usb_device_descriptor *dev;
struct usb_gadget_strings **strings;
- struct class *class;
- atomic_t function_count;
-
/* REVISIT: bind() functions can be marked __init, which
* makes trouble for section mismatch analysis. See if
* we can't restructure things to avoid mismatching...
/* global suspend hooks */
void (*suspend)(struct usb_composite_dev *);
void (*resume)(struct usb_composite_dev *);
-
- void (*enable_function)(struct usb_function *f, int enable);
};
extern int usb_composite_register(struct usb_composite_driver *);