Merge branch 'android-msm-wahoo-4.4-pi' into android-msm-wahoo-4.4-pi-qpr1

Bug: 112376366
Change-Id: Ia5a0b9f736d8c3cfc82e8dcfe69f2e842d4ffa46
Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
diff --git a/drivers/input/touchscreen/synaptics_dsx_htc/synaptics_dsx_rmi_dev_htc.c b/drivers/input/touchscreen/synaptics_dsx_htc/synaptics_dsx_rmi_dev_htc.c
index bf3a18f..085de4a 100644
--- a/drivers/input/touchscreen/synaptics_dsx_htc/synaptics_dsx_rmi_dev_htc.c
+++ b/drivers/input/touchscreen/synaptics_dsx_htc/synaptics_dsx_rmi_dev_htc.c
@@ -573,10 +573,10 @@
 
 	address = (unsigned short)(*f_pos);
 
-	rmidev_allocate_buffer(count);
-
 	mutex_lock(&(dev_data->file_mutex));
 
+	rmidev_allocate_buffer(count);
+
 	retval = synaptics_rmi4_reg_read(rmidev->rmi4_data,
 			*f_pos,
 			rmidev->tmpbuf,
@@ -642,12 +642,14 @@
 	if (count > (REG_ADDR_LIMIT - *f_pos))
 		count = REG_ADDR_LIMIT - *f_pos;
 
+	mutex_lock(&(dev_data->file_mutex));
+
 	rmidev_allocate_buffer(count);
 
-	if (copy_from_user(rmidev->tmpbuf, buf, count))
-		return -EFAULT;
-
-	mutex_lock(&(dev_data->file_mutex));
+	if (copy_from_user(rmidev->tmpbuf, buf, count)) {
+		retval = -EFAULT;
+		goto err_copy_user;
+	}
 
 	retval = synaptics_rmi4_reg_write(rmidev->rmi4_data,
 			*f_pos,
@@ -656,6 +658,7 @@
 	if (retval >= 0)
 		*f_pos += retval;
 
+err_copy_user:
 	mutex_unlock(&(dev_data->file_mutex));
 
 	return retval;
diff --git a/drivers/usb/pd/pd_engine.c b/drivers/usb/pd/pd_engine.c
index e50e857..ba1fadb 100644
--- a/drivers/usb/pd/pd_engine.c
+++ b/drivers/usb/pd/pd_engine.c
@@ -1513,6 +1513,7 @@
 
 	/* TODO: parse alt mode from DT */
 	config->alt_modes = NULL;
+	config->self_powered = true;
 
 	return 0;
 }
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index 250c953..69123f6 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -288,6 +288,12 @@
 	struct typec_altmode *partner_altmode[SVID_DISCOVERY_MAX];
 	struct typec_altmode *port_altmode[SVID_DISCOVERY_MAX];
 
+	/* Deadline in jiffies to exit src_try_wait state */
+	unsigned long max_wait;
+
+	/* port belongs to a self powered device */
+	bool self_powered;
+
 #ifdef CONFIG_DEBUG_FS
 	struct dentry *dentry;
 	struct mutex logbuffer_lock;	/* log buffer access lock */
@@ -2682,7 +2688,8 @@
 	case SRC_HARD_RESET_VBUS_OFF:
 		tcpm_set_vconn(port, true);
 		tcpm_set_vbus(port, false);
-		tcpm_set_roles(port, false, TYPEC_SOURCE, TYPEC_HOST);
+		tcpm_set_roles(port, port->self_powered, TYPEC_SOURCE,
+			       TYPEC_HOST);
 		tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SRC_RECOVER);
 		break;
 	case SRC_HARD_RESET_VBUS_ON:
@@ -2693,8 +2700,10 @@
 		break;
 	case SNK_HARD_RESET_SINK_OFF:
 		tcpm_set_vconn(port, false);
-		tcpm_set_charge(port, false);
-		tcpm_set_roles(port, false, TYPEC_SINK, TYPEC_DEVICE);
+		if (port->pd_capable)
+			tcpm_set_charge(port, false);
+		tcpm_set_roles(port, port->self_powered, TYPEC_SINK,
+			       TYPEC_DEVICE);
 		/*
 		 * VBUS may or may not toggle, depending on the adapter.
 		 * If it doesn't toggle, transition to SNK_HARD_RESET_SINK_ON
@@ -2724,6 +2733,12 @@
 		 * Similar, dual-mode ports in source mode should transition
 		 * to PE_SNK_Transition_to_default.
 		 */
+		if (port->pd_capable) {
+			tcpm_set_current_limit(port,
+					       tcpm_get_current_limit(port),
+					       5000);
+			tcpm_set_charge(port, true);
+		}
 		tcpm_set_attached_state(port, true);
 		tcpm_set_state(port, SNK_STARTUP, 0);
 		break;
@@ -3785,6 +3800,7 @@
 	port->typec_caps.vconn_set = tcpm_vconn_set;
 	port->typec_caps.try_role = tcpm_try_role;
 	port->typec_caps.port_type_set = tcpm_port_type_set;
+	port->self_powered = tcpc->config->self_powered;
 
 	port->partner_desc.identity = &port->partner_ident;
 	port->port_type = tcpc->config->type;
diff --git a/drivers/usb/typec/tcpm.h b/drivers/usb/typec/tcpm.h
index 234f07b..3822464 100644
--- a/drivers/usb/typec/tcpm.h
+++ b/drivers/usb/typec/tcpm.h
@@ -72,6 +72,7 @@
 	enum typec_port_type type;
 	enum typec_role default_role;
 	bool try_role_hw;	/* try.{src,snk} implemented in hardware */
+	bool self_powered;	/* port belongs to a self powered device */
 
 	struct typec_altmode_desc *alt_modes;
 };