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:
Badhri Jagan Sridharan 2015-09-02 22:49:10 -07:00 committed by Amit Pundir
parent 73e51ffa0f
commit a781e554d6

View file

@ -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: