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

Commit 2ba0e0df authored by Manu Gautam's avatar Manu Gautam Committed by Stephen Boyd
Browse files

USB: serial: Add support for new composition framework



Following command needs to be given to enable SERIAL
transports. This has to be done once before selecting serial
function.
For TTY-DUN, TTY-NMEA:
 echo tty,tty >
	/sys/class/android_usb/android0/f_serial/transports

For SDIO-DUN, TTY-NMEA:
 echo sdio,tty >
	/sys/class/android_usb/android0/f_serial/transports

Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>

Conflicts:

	arch/arm/mach-msm/include/mach/usb_gadget_fserial.h
parent 4f62f5de
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include "u_data_hsic.c"
#include "u_ctrl_hsuart.c"
#include "u_data_hsuart.c"
#include "f_serial.c"
#include "f_ccid.c"
#include "f_mtp.c"
#include "f_accessory.c"
@@ -813,6 +814,79 @@ static struct android_usb_function diag_function = {
	.attributes	= diag_function_attributes,
};

/* SERIAL */
static char serial_transports[32];	/*enabled FSERIAL ports - "tty[,sdio]"*/
static ssize_t serial_transports_store(
		struct device *device, struct device_attribute *attr,
		const char *buff, size_t size)
{
	strlcpy(serial_transports, buff, sizeof(serial_transports));

	return size;
}

static DEVICE_ATTR(transports, S_IWUSR, NULL, serial_transports_store);
static struct device_attribute *serial_function_attributes[] =
					 { &dev_attr_transports, NULL };

static void serial_function_cleanup(struct android_usb_function *f)
{
	gserial_cleanup();
}

static int serial_function_bind_config(struct android_usb_function *f,
					struct usb_configuration *c)
{
	char *name;
	char buf[32], *b;
	int err = -1, i;
	static int serial_initialized = 0, ports = 0;

	if (serial_initialized)
		goto bind_config;

	serial_initialized = 1;
	strlcpy(buf, serial_transports, sizeof(buf));
	b = strim(buf);

	while (b) {
		name = strsep(&b, ",");

		if (name) {
			err = gserial_init_port(ports, name);
			if (err) {
				pr_err("serial: Cannot open port '%s'", name);
				goto out;
			}
			ports++;
		}
	}
	err = gport_setup(c);
	if (err) {
		pr_err("serial: Cannot setup transports");
		goto out;
	}

bind_config:
	for (i = 0; i < ports; i++) {
		err = gser_bind_config(c, i);
		if (err) {
			pr_err("serial: bind_config failed for port %d", i);
			goto out;
		}
	}

out:
	return err;
}

static struct android_usb_function serial_function = {
	.name		= "serial",
	.cleanup	= serial_function_cleanup,
	.bind_config	= serial_function_bind_config,
	.attributes	= serial_function_attributes,
};

/* CCID */
static int ccid_function_init(struct android_usb_function *f,
					struct usb_composite_dev *cdev)
@@ -1285,6 +1359,7 @@ static struct android_usb_function *supported_functions[] = {
	&rmnet_smd_sdio_function,
	&rmnet_function,
	&diag_function,
	&serial_function,
	&ccid_function,
	&acm_function,
	&mtp_function,