Revert "usb: typec: ucsi: Retrieve all the PDOs instead of just the first 4"

This reverts commit e5366bea02 as it
breaks the kernel abi at the moment.  It will be restored at a later
point in time.

Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>

Change-Id: I1a91bb1044c7006c9fa9f49639ac364af1c7510f
This commit is contained in:
Greg Kroah-Hartman
2021-05-19 16:33:51 +02:00
parent 59870a78d4
commit 4940c943b4
2 changed files with 11 additions and 36 deletions

View File

@@ -495,8 +495,7 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
}
}
static int ucsi_get_pdos(struct ucsi_connector *con, int is_partner,
u32 *pdos, int offset, int num_pdos)
static void ucsi_get_pdos(struct ucsi_connector *con, int is_partner)
{
struct ucsi *ucsi = con->ucsi;
u64 command;
@@ -504,39 +503,17 @@ static int ucsi_get_pdos(struct ucsi_connector *con, int is_partner,
command = UCSI_COMMAND(UCSI_GET_PDOS) | UCSI_CONNECTOR_NUMBER(con->num);
command |= UCSI_GET_PDOS_PARTNER_PDO(is_partner);
command |= UCSI_GET_PDOS_PDO_OFFSET(offset);
command |= UCSI_GET_PDOS_NUM_PDOS(num_pdos - 1);
command |= UCSI_GET_PDOS_NUM_PDOS(UCSI_MAX_PDOS - 1);
command |= UCSI_GET_PDOS_SRC_PDOS;
ret = ucsi_send_command(ucsi, command, pdos + offset,
num_pdos * sizeof(u32));
if (ret < 0)
ret = ucsi_send_command(ucsi, command, con->src_pdos,
sizeof(con->src_pdos));
if (ret < 0) {
dev_err(ucsi->dev, "UCSI_GET_PDOS failed (%d)\n", ret);
if (ret == 0 && offset == 0)
dev_warn(ucsi->dev, "UCSI_GET_PDOS returned 0 bytes\n");
return ret;
}
static void ucsi_get_src_pdos(struct ucsi_connector *con, int is_partner)
{
int ret;
/* UCSI max payload means only getting at most 4 PDOs at a time */
ret = ucsi_get_pdos(con, 1, con->src_pdos, 0, UCSI_MAX_PDOS);
if (ret < 0)
return;
}
con->num_pdos = ret / sizeof(u32); /* number of bytes to 32-bit PDOs */
if (con->num_pdos < UCSI_MAX_PDOS)
return;
/* get the remaining PDOs, if any */
ret = ucsi_get_pdos(con, 1, con->src_pdos, UCSI_MAX_PDOS,
PDO_MAX_OBJECTS - UCSI_MAX_PDOS);
if (ret < 0)
return;
con->num_pdos += ret / sizeof(u32);
if (ret == 0)
dev_warn(ucsi->dev, "UCSI_GET_PDOS returned 0 bytes\n");
}
static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
@@ -545,7 +522,7 @@ static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
case UCSI_CONSTAT_PWR_OPMODE_PD:
con->rdo = con->status.request_data_obj;
typec_set_pwr_opmode(con->port, TYPEC_PWR_MODE_PD);
ucsi_get_src_pdos(con, 1);
ucsi_get_pdos(con, 1);
break;
case UCSI_CONSTAT_PWR_OPMODE_TYPEC1_5:
con->rdo = 0;

View File

@@ -9,7 +9,6 @@
#include <linux/types.h>
#include <linux/usb/typec.h>
#include <linux/usb/role.h>
#include <linux/usb/pd.h>
/* -------------------------------------------------------------------------- */
@@ -135,9 +134,7 @@ void ucsi_connector_change(struct ucsi *ucsi, u8 num);
/* GET_PDOS command bits */
#define UCSI_GET_PDOS_PARTNER_PDO(_r_) ((u64)(_r_) << 23)
#define UCSI_GET_PDOS_PDO_OFFSET(_r_) ((u64)(_r_) << 24)
#define UCSI_GET_PDOS_NUM_PDOS(_r_) ((u64)(_r_) << 32)
#define UCSI_MAX_PDOS (4)
#define UCSI_GET_PDOS_SRC_PDOS ((u64)1 << 34)
/* -------------------------------------------------------------------------- */
@@ -305,6 +302,7 @@ struct ucsi {
#define UCSI_MAX_SVID 5
#define UCSI_MAX_ALTMODES (UCSI_MAX_SVID * 6)
#define UCSI_MAX_PDOS (4)
#define UCSI_TYPEC_VSAFE5V 5000
#define UCSI_TYPEC_1_5_CURRENT 1500
@@ -332,7 +330,7 @@ struct ucsi_connector {
struct power_supply *psy;
struct power_supply_desc psy_desc;
u32 rdo;
u32 src_pdos[PDO_MAX_OBJECTS];
u32 src_pdos[UCSI_MAX_PDOS];
int num_pdos;
struct usb_role_switch *usb_role_sw;