Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4599fbc authored by Badhri Jagan Sridharan's avatar Badhri Jagan Sridharan Committed by Alistair Strachan
Browse files

ANDROID: usb: gadget: f_midi: create F_midi device



Android frameworks relies on the alsa
config reported by the f_midi device.

Bug: 111003288
Bug: 120441124
Change-Id: I0695e00b166fd953f50acea93802245b0d5a5240
[badhri: The framework should be moved away from this]
Signed-off-by: default avatarBadhri Jagan Sridharan <badhri@google.com>
parent 9315c6a6
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -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: