Merge "defconfig: automatic update" into msm-3.4
diff --git a/drivers/tty/smux_ctl.c b/drivers/tty/smux_ctl.c
index 2b8f028..0078b04 100644
--- a/drivers/tty/smux_ctl.c
+++ b/drivers/tty/smux_ctl.c
@@ -52,6 +52,7 @@
 };
 
 #define SMUX_CTL_NUM_CHANNELS ARRAY_SIZE(smux_ctl_ch_id)
+#define DEFAULT_OPEN_TIMEOUT 5
 
 struct smux_ctl_dev {
 	int id;
@@ -64,6 +65,7 @@
 	int is_channel_reset;
 	int is_high_wm;
 	int write_pending;
+	unsigned open_timeout_val;
 
 	struct mutex rx_lock;
 	uint32_t read_avail;
@@ -149,6 +151,52 @@
 #define SMUXCTL_SET_LOOPBACK(lcid) do {} while (0)
 #endif
 
+static ssize_t open_timeout_store(struct device *d,
+		struct device_attribute *attr,
+		const char *buf,
+		size_t n)
+{
+	int i;
+	unsigned long tmp;
+	for (i = 0; i < SMUX_CTL_NUM_CHANNELS; ++i) {
+		if (smux_ctl_devp[i]->devicep == d)
+			break;
+	}
+	if (i >= SMUX_CTL_NUM_CHANNELS) {
+		pr_err("%s: unable to match device to valid smux ctl port\n",
+				__func__);
+		return -EINVAL;
+	}
+	if (!kstrtoul(buf, 10, &tmp)) {
+		smux_ctl_devp[i]->open_timeout_val = tmp;
+		return n;
+	} else {
+		pr_err("%s: unable to convert: %s to an int\n", __func__,
+				buf);
+		return -EINVAL;
+	}
+}
+
+static ssize_t open_timeout_show(struct device *d,
+		struct device_attribute *attr,
+		char *buf)
+{
+	int i;
+	for (i = 0; i < SMUX_CTL_NUM_CHANNELS; ++i) {
+		if (smux_ctl_devp[i]->devicep == d)
+			break;
+	}
+	if (i >= SMUX_CTL_NUM_CHANNELS) {
+		pr_err("%s: unable to match device to valid smux ctl port\n",
+				__func__);
+		return -EINVAL;
+	}
+	return snprintf(buf, PAGE_SIZE, "%d\n",
+			smux_ctl_devp[i]->open_timeout_val);
+}
+
+static DEVICE_ATTR(open_timeout, 0664, open_timeout_show, open_timeout_store);
+
 static int get_ctl_dev_index(int id)
 {
 	int dev_index;
@@ -323,6 +371,7 @@
 {
 	int r = 0;
 	struct smux_ctl_dev *devp;
+	unsigned wait_time = DEFAULT_OPEN_TIMEOUT * HZ;
 
 	if (!smux_ctl_inited)
 		return -EIO;
@@ -349,11 +398,14 @@
 			return r;
 		}
 
+		if (devp->open_timeout_val)
+			wait_time = devp->open_timeout_val * HZ;
+
 		r = wait_event_interruptible_timeout(
 				devp->write_wait_queue,
 				(devp->state == SMUX_CONNECTED ||
-				 devp->abort_wait),
-				(5 * HZ));
+				devp->abort_wait),
+				wait_time);
 		if (r == 0)
 			r = -ETIMEDOUT;
 
@@ -822,6 +874,11 @@
 			kfree(smux_ctl_devp[i]);
 			goto error2;
 		}
+		if (device_create_file(smux_ctl_devp[i]->devicep,
+				&dev_attr_open_timeout))
+			pr_err("%s: unable to create device attr for" \
+				" smux ctl dev id:%d\n", __func__, i);
+
 	}
 
 	smux_ctl_inited = 1;