Commit 1007dda3 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Greg Kroah-Hartman

usb: typec: tps6598x: Start using struct typec_operations

Supplying the operation callbacks as part of a struct
typec_operations instead of as part of struct
typec_capability during port registration. After this there
is not need to keep the capabilities stored anywhere in the
driver.
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20191104142435.29960-6-heikki.krogerus@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 00ec21e5
...@@ -94,7 +94,6 @@ struct tps6598x { ...@@ -94,7 +94,6 @@ struct tps6598x {
struct typec_port *port; struct typec_port *port;
struct typec_partner *partner; struct typec_partner *partner;
struct usb_pd_identity partner_identity; struct usb_pd_identity partner_identity;
struct typec_capability typec_cap;
}; };
/* /*
...@@ -307,11 +306,10 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd, ...@@ -307,11 +306,10 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd,
return 0; return 0;
} }
static int static int tps6598x_dr_set(struct typec_port *port, enum typec_data_role role)
tps6598x_dr_set(const struct typec_capability *cap, enum typec_data_role role)
{ {
struct tps6598x *tps = container_of(cap, struct tps6598x, typec_cap);
const char *cmd = (role == TYPEC_DEVICE) ? "SWUF" : "SWDF"; const char *cmd = (role == TYPEC_DEVICE) ? "SWUF" : "SWDF";
struct tps6598x *tps = typec_get_drvdata(port);
u32 status; u32 status;
int ret; int ret;
...@@ -338,11 +336,10 @@ tps6598x_dr_set(const struct typec_capability *cap, enum typec_data_role role) ...@@ -338,11 +336,10 @@ tps6598x_dr_set(const struct typec_capability *cap, enum typec_data_role role)
return ret; return ret;
} }
static int static int tps6598x_pr_set(struct typec_port *port, enum typec_role role)
tps6598x_pr_set(const struct typec_capability *cap, enum typec_role role)
{ {
struct tps6598x *tps = container_of(cap, struct tps6598x, typec_cap);
const char *cmd = (role == TYPEC_SINK) ? "SWSk" : "SWSr"; const char *cmd = (role == TYPEC_SINK) ? "SWSk" : "SWSr";
struct tps6598x *tps = typec_get_drvdata(port);
u32 status; u32 status;
int ret; int ret;
...@@ -369,6 +366,11 @@ tps6598x_pr_set(const struct typec_capability *cap, enum typec_role role) ...@@ -369,6 +366,11 @@ tps6598x_pr_set(const struct typec_capability *cap, enum typec_role role)
return ret; return ret;
} }
static const struct typec_operations tps6598x_ops = {
.dr_set = tps6598x_dr_set,
.pr_set = tps6598x_pr_set,
};
static irqreturn_t tps6598x_interrupt(int irq, void *data) static irqreturn_t tps6598x_interrupt(int irq, void *data)
{ {
struct tps6598x *tps = data; struct tps6598x *tps = data;
...@@ -448,6 +450,7 @@ static const struct regmap_config tps6598x_regmap_config = { ...@@ -448,6 +450,7 @@ static const struct regmap_config tps6598x_regmap_config = {
static int tps6598x_probe(struct i2c_client *client) static int tps6598x_probe(struct i2c_client *client)
{ {
struct typec_capability typec_cap = { };
struct tps6598x *tps; struct tps6598x *tps;
u32 status; u32 status;
u32 conf; u32 conf;
...@@ -492,40 +495,40 @@ static int tps6598x_probe(struct i2c_client *client) ...@@ -492,40 +495,40 @@ static int tps6598x_probe(struct i2c_client *client)
if (ret < 0) if (ret < 0)
return ret; return ret;
tps->typec_cap.revision = USB_TYPEC_REV_1_2; typec_cap.revision = USB_TYPEC_REV_1_2;
tps->typec_cap.pd_revision = 0x200; typec_cap.pd_revision = 0x200;
tps->typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE; typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
tps->typec_cap.pr_set = tps6598x_pr_set; typec_cap.driver_data = tps;
tps->typec_cap.dr_set = tps6598x_dr_set; typec_cap.ops = &tps6598x_ops;
switch (TPS_SYSCONF_PORTINFO(conf)) { switch (TPS_SYSCONF_PORTINFO(conf)) {
case TPS_PORTINFO_SINK_ACCESSORY: case TPS_PORTINFO_SINK_ACCESSORY:
case TPS_PORTINFO_SINK: case TPS_PORTINFO_SINK:
tps->typec_cap.type = TYPEC_PORT_SNK; typec_cap.type = TYPEC_PORT_SNK;
tps->typec_cap.data = TYPEC_PORT_UFP; typec_cap.data = TYPEC_PORT_UFP;
break; break;
case TPS_PORTINFO_DRP_UFP_DRD: case TPS_PORTINFO_DRP_UFP_DRD:
case TPS_PORTINFO_DRP_DFP_DRD: case TPS_PORTINFO_DRP_DFP_DRD:
tps->typec_cap.type = TYPEC_PORT_DRP; typec_cap.type = TYPEC_PORT_DRP;
tps->typec_cap.data = TYPEC_PORT_DRD; typec_cap.data = TYPEC_PORT_DRD;
break; break;
case TPS_PORTINFO_DRP_UFP: case TPS_PORTINFO_DRP_UFP:
tps->typec_cap.type = TYPEC_PORT_DRP; typec_cap.type = TYPEC_PORT_DRP;
tps->typec_cap.data = TYPEC_PORT_UFP; typec_cap.data = TYPEC_PORT_UFP;
break; break;
case TPS_PORTINFO_DRP_DFP: case TPS_PORTINFO_DRP_DFP:
tps->typec_cap.type = TYPEC_PORT_DRP; typec_cap.type = TYPEC_PORT_DRP;
tps->typec_cap.data = TYPEC_PORT_DFP; typec_cap.data = TYPEC_PORT_DFP;
break; break;
case TPS_PORTINFO_SOURCE: case TPS_PORTINFO_SOURCE:
tps->typec_cap.type = TYPEC_PORT_SRC; typec_cap.type = TYPEC_PORT_SRC;
tps->typec_cap.data = TYPEC_PORT_DFP; typec_cap.data = TYPEC_PORT_DFP;
break; break;
default: default:
return -ENODEV; return -ENODEV;
} }
tps->port = typec_register_port(&client->dev, &tps->typec_cap); tps->port = typec_register_port(&client->dev, &typec_cap);
if (IS_ERR(tps->port)) if (IS_ERR(tps->port))
return PTR_ERR(tps->port); return PTR_ERR(tps->port);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment