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

Commit 17f11218 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ANDROID: usb: gadget: configfs: Support multiple android instances"

parents 6c527785 636046c4
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ void acc_disconnect(void);
static struct class *android_class;
static struct device *android_device;
static int index;
static int gadget_index;

struct device *create_function_device(char *name)
{
@@ -1433,22 +1434,19 @@ static void android_work(struct work_struct *data)
	spin_unlock_irqrestore(&cdev->lock, flags);

	if (status[0]) {
		kobject_uevent_env(&android_device->kobj,
					KOBJ_CHANGE, connected);
		kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, connected);
		pr_info("%s: sent uevent %s\n", __func__, connected[0]);
		uevent_sent = true;
	}

	if (status[1]) {
		kobject_uevent_env(&android_device->kobj,
					KOBJ_CHANGE, configured);
		kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, configured);
		pr_info("%s: sent uevent %s\n", __func__, configured[0]);
		uevent_sent = true;
	}

	if (status[2]) {
		kobject_uevent_env(&android_device->kobj,
					KOBJ_CHANGE, disconnected);
		kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, disconnected);
		pr_info("%s: sent uevent %s\n", __func__, disconnected[0]);
		uevent_sent = true;
	}
@@ -1715,21 +1713,23 @@ static int android_device_create(struct gadget_info *gi)
	struct device_attribute *attr;

	INIT_WORK(&gi->work, android_work);
	android_device = device_create(android_class, NULL,
				MKDEV(0, 0), NULL, "android0");
	if (IS_ERR(android_device))
		return PTR_ERR(android_device);
	gi->dev = device_create(android_class, NULL,
			MKDEV(0, 0), NULL, "android%d", gadget_index++);
	if (IS_ERR(gi->dev))
		return PTR_ERR(gi->dev);

	dev_set_drvdata(android_device, gi);
	dev_set_drvdata(gi->dev, gi);
	if (!android_device)
		android_device = gi->dev;

	attrs = android_usb_attributes;
	while ((attr = *attrs++)) {
		int err;

		err = device_create_file(android_device, attr);
		err = device_create_file(gi->dev, attr);
		if (err) {
			device_destroy(android_device->class,
				       android_device->devt);
			device_destroy(gi->dev->class,
				       gi->dev->devt);
			return err;
		}
	}
@@ -1737,15 +1737,15 @@ static int android_device_create(struct gadget_info *gi)
	return 0;
}

static void android_device_destroy(void)
static void android_device_destroy(struct gadget_info *gi)
{
	struct device_attribute **attrs;
	struct device_attribute *attr;

	attrs = android_usb_attributes;
	while ((attr = *attrs++))
		device_remove_file(android_device, attr);
	device_destroy(android_device->class, android_device->devt);
		device_remove_file(gi->dev, attr);
	device_destroy(gi->dev->class, gi->dev->devt);
}
#else
static inline int android_device_create(struct gadget_info *gi)
@@ -1753,7 +1753,7 @@ static inline int android_device_create(struct gadget_info *gi)
	return 0;
}

static inline void android_device_destroy(void)
static inline void android_device_destroy(struct gadget_info *gi)
{
}
#endif
@@ -1821,8 +1821,11 @@ static struct config_group *gadgets_make(

static void gadgets_drop(struct config_group *group, struct config_item *item)
{
	struct gadget_info *gi;

	gi = container_of(to_config_group(item), struct gadget_info, group);
	config_item_put(item);
	android_device_destroy();
	android_device_destroy(gi);
}

static struct configfs_group_operations gadgets_ops = {