Commit 8115240c authored by Badhri Jagan Sridharan's avatar Badhri Jagan Sridharan Committed by Greg Kroah-Hartman
Browse files

usb: typec: tcpm: Refactor logic for new-source-frs-typec-current



New source's current capability is now defined as string based
device tree property through new-source-frs-typec-current.
Refactor tcpm code to parse new-source-frs-typec-current and
infer local port's new source current capability during frs.

Signed-off-by: default avatarBadhri Jagan Sridharan <badhri@google.com>
Link: https://lore.kernel.org/r/20201029063138.1429760-4-badhri@google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a0ccdc4a
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -363,8 +363,8 @@ struct tcpm_port {
	/* port belongs to a self powered device */
	bool self_powered;

	/* FRS */
	enum frs_typec_current frs_current;
	/* Sink FRS */
	enum frs_typec_current new_source_frs_current;

	/* Sink caps have been queried */
	bool sink_cap_done;
@@ -1713,7 +1713,7 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
	unsigned int cnt = pd_header_cnt_le(msg->header);
	unsigned int rev = pd_header_rev_le(msg->header);
	unsigned int i;
	enum frs_typec_current frs_current;
	enum frs_typec_current partner_frs_current;
	bool frs_enable;
	int ret;

@@ -1786,12 +1786,13 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
		for (i = 0; i < cnt; i++)
			port->sink_caps[i] = le32_to_cpu(msg->payload[i]);

		frs_current = (port->sink_caps[0] & PDO_FIXED_FRS_CURR_MASK) >>
		partner_frs_current = (port->sink_caps[0] & PDO_FIXED_FRS_CURR_MASK) >>
			PDO_FIXED_FRS_CURR_SHIFT;
		frs_enable = frs_current && (frs_current <= port->frs_current);
		frs_enable = partner_frs_current && (partner_frs_current <=
						     port->new_source_frs_current);
		tcpm_log(port,
			 "Port partner FRS capable partner_frs_current:%u port_frs_current:%u enable:%c",
			 frs_current, port->frs_current, frs_enable ? 'y' : 'n');
			 partner_frs_current, port->new_source_frs_current, frs_enable ? 'y' : 'n');
		if (frs_enable) {
			ret  = port->tcpc->enable_frs(port->tcpc, true);
			tcpm_log(port, "Enable FRS %s, ret:%d\n", ret ? "fail" : "success", ret);
@@ -4808,9 +4809,10 @@ static int tcpm_fw_get_caps(struct tcpm_port *port,

	/* FRS can only be supported byb DRP ports */
	if (port->port_type == TYPEC_PORT_DRP) {
		ret = fwnode_property_read_u32(fwnode, "frs-typec-current", &frs_current);
		ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current",
					       &frs_current);
		if (ret >= 0 && frs_current <= FRS_5V_3A)
			port->frs_current = frs_current;
			port->new_source_frs_current = frs_current;
	}

	return 0;