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;
};