ANDROID: usb: gadget: f_midi: create F_midi device
Android frameworks relies on the alsa config reported by the f_midi device. Signed-off-by: Badhri Jagan Sridharan <Badhri@google.com> Change-Id: I0695e00b166fd953f50acea93802245b0d5a5240
This commit is contained in:
parent
73e51ffa0f
commit
a781e554d6
1 changed files with 65 additions and 0 deletions
|
@ -1216,6 +1216,65 @@ static void f_midi_free_inst(struct usb_function_instance *f)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USB_CONFIGFS_UEVENT
|
||||
extern struct device *create_function_device(char *name);
|
||||
static ssize_t alsa_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct usb_function_instance *fi_midi = dev_get_drvdata(dev);
|
||||
struct f_midi *midi;
|
||||
|
||||
if (!fi_midi->f)
|
||||
dev_warn(dev, "f_midi: function not set\n");
|
||||
|
||||
if (fi_midi && fi_midi->f) {
|
||||
midi = func_to_midi(fi_midi->f);
|
||||
if (midi->rmidi && midi->rmidi->card)
|
||||
return sprintf(buf, "%d %d\n",
|
||||
midi->rmidi->card->number, midi->rmidi->device);
|
||||
}
|
||||
|
||||
/* print PCM card and device numbers */
|
||||
return sprintf(buf, "%d %d\n", -1, -1);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(alsa, S_IRUGO, alsa_show, NULL);
|
||||
|
||||
static struct device_attribute *alsa_function_attributes[] = {
|
||||
&dev_attr_alsa,
|
||||
NULL
|
||||
};
|
||||
|
||||
static int create_alsa_device(struct usb_function_instance *fi)
|
||||
{
|
||||
struct device *dev;
|
||||
struct device_attribute **attrs;
|
||||
struct device_attribute *attr;
|
||||
int err = 0;
|
||||
|
||||
dev = create_function_device("f_midi");
|
||||
if (IS_ERR(dev))
|
||||
return PTR_ERR(dev);
|
||||
|
||||
attrs = alsa_function_attributes;
|
||||
if (attrs) {
|
||||
while ((attr = *attrs++) && !err)
|
||||
err = device_create_file(dev, attr);
|
||||
if (err) {
|
||||
device_destroy(dev->class, dev->devt);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
dev_set_drvdata(dev, fi);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int create_alsa_device(struct usb_function_instance *fi)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct usb_function_instance *f_midi_alloc_inst(void)
|
||||
{
|
||||
struct f_midi_opts *opts;
|
||||
|
@ -1234,6 +1293,11 @@ static struct usb_function_instance *f_midi_alloc_inst(void)
|
|||
opts->out_ports = 1;
|
||||
opts->refcnt = 1;
|
||||
|
||||
if (create_alsa_device(&opts->func_inst)) {
|
||||
kfree(opts);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
config_group_init_type_name(&opts->func_inst.group, "",
|
||||
&midi_func_type);
|
||||
|
||||
|
@ -1341,6 +1405,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi)
|
|||
midi->func.disable = f_midi_disable;
|
||||
midi->func.free_func = f_midi_free;
|
||||
|
||||
fi->f = &midi->func;
|
||||
return &midi->func;
|
||||
|
||||
setup_fail:
|
||||
|
|
Loading…
Add table
Reference in a new issue