Skip to content

Commit cf6e06c

Browse files
Heikki Krogerusgregkh
authored andcommitted
usb: typec: Start using ERR_PTR
In order to allow the USB Type-C Class driver take care of things like muxes and other possible dependencies for the port drivers, returning ERR_PTR instead of NULL from the registration functions in case of failure. The reason for taking over control of the muxes for example is because handling them in the port drivers would be just boilerplate. Signed-off-by: Heikki Krogerus <[email protected]> Reviewed-by: Hans de Goede <[email protected]> Reviewed-by: Guenter Roeck <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Signed-off-by: Hans de Goede <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent ad70f93 commit cf6e06c

File tree

4 files changed

+58
-48
lines changed

4 files changed

+58
-48
lines changed

drivers/usb/typec/tcpm.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
10331033
break;
10341034
case CMDT_RSP_ACK:
10351035
/* silently drop message if we are not connected */
1036-
if (!port->partner)
1036+
if (IS_ERR_OR_NULL(port->partner))
10371037
break;
10381038

10391039
switch (cmd) {
@@ -3732,8 +3732,8 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
37323732
port->port_type = tcpc->config->type;
37333733

37343734
port->typec_port = typec_register_port(port->dev, &port->typec_caps);
3735-
if (!port->typec_port) {
3736-
err = -ENOMEM;
3735+
if (IS_ERR(port->typec_port)) {
3736+
err = PTR_ERR(port->typec_port);
37373737
goto out_destroy_wq;
37383738
}
37393739

@@ -3742,15 +3742,17 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
37423742

37433743
i = 0;
37443744
while (paltmode->svid && i < ARRAY_SIZE(port->port_altmode)) {
3745-
port->port_altmode[i] =
3746-
typec_port_register_altmode(port->typec_port,
3747-
paltmode);
3748-
if (!port->port_altmode[i]) {
3745+
struct typec_altmode *alt;
3746+
3747+
alt = typec_port_register_altmode(port->typec_port,
3748+
paltmode);
3749+
if (IS_ERR(alt)) {
37493750
tcpm_log(port,
37503751
"%s: failed to register port alternate mode 0x%x",
37513752
dev_name(dev), paltmode->svid);
37523753
break;
37533754
}
3755+
port->port_altmode[i] = alt;
37543756
i++;
37553757
paltmode++;
37563758
}

drivers/usb/typec/tps6598x.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ static int tps6598x_connect(struct tps6598x *tps, u32 status)
158158
desc.identity = &tps->partner_identity;
159159
}
160160

161-
tps->partner = typec_register_partner(tps->port, &desc);
162-
if (!tps->partner)
163-
return -ENODEV;
164-
165161
typec_set_pwr_opmode(tps->port, mode);
166162
typec_set_pwr_role(tps->port, TPS_STATUS_PORTROLE(status));
167163
typec_set_vconn_role(tps->port, TPS_STATUS_VCONN(status));
168164
typec_set_data_role(tps->port, TPS_STATUS_DATAROLE(status));
169165

166+
tps->partner = typec_register_partner(tps->port, &desc);
167+
if (IS_ERR(tps->partner))
168+
return PTR_ERR(tps->partner);
169+
170170
if (desc.identity)
171171
typec_partner_set_identity(tps->partner);
172172

@@ -175,7 +175,8 @@ static int tps6598x_connect(struct tps6598x *tps, u32 status)
175175

176176
static void tps6598x_disconnect(struct tps6598x *tps, u32 status)
177177
{
178-
typec_unregister_partner(tps->partner);
178+
if (!IS_ERR(tps->partner))
179+
typec_unregister_partner(tps->partner);
179180
tps->partner = NULL;
180181
typec_set_pwr_opmode(tps->port, TYPEC_PWR_MODE_USB);
181182
typec_set_pwr_role(tps->port, TPS_STATUS_PORTROLE(status));
@@ -418,8 +419,8 @@ static int tps6598x_probe(struct i2c_client *client)
418419
tps->typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
419420

420421
tps->port = typec_register_port(&client->dev, &tps->typec_cap);
421-
if (!tps->port)
422-
return -ENODEV;
422+
if (IS_ERR(tps->port))
423+
return PTR_ERR(tps->port);
423424

424425
if (status & TPS_STATUS_PLUG_PRESENT) {
425426
ret = tps6598x_connect(tps, status);

drivers/usb/typec/typec.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ typec_register_altmode(struct device *parent,
386386

387387
alt = kzalloc(sizeof(*alt), GFP_KERNEL);
388388
if (!alt)
389-
return NULL;
389+
return ERR_PTR(-ENOMEM);
390390

391391
alt->svid = desc->svid;
392392
alt->n_modes = desc->n_modes;
@@ -402,7 +402,7 @@ typec_register_altmode(struct device *parent,
402402
dev_err(parent, "failed to register alternate mode (%d)\n",
403403
ret);
404404
put_device(&alt->dev);
405-
return NULL;
405+
return ERR_PTR(ret);
406406
}
407407

408408
return alt;
@@ -417,7 +417,7 @@ typec_register_altmode(struct device *parent,
417417
*/
418418
void typec_unregister_altmode(struct typec_altmode *alt)
419419
{
420-
if (alt)
420+
if (!IS_ERR_OR_NULL(alt))
421421
device_unregister(&alt->dev);
422422
}
423423
EXPORT_SYMBOL_GPL(typec_unregister_altmode);
@@ -509,7 +509,7 @@ EXPORT_SYMBOL_GPL(typec_partner_register_altmode);
509509
*
510510
* Registers a device for USB Type-C Partner described in @desc.
511511
*
512-
* Returns handle to the partner on success or NULL on failure.
512+
* Returns handle to the partner on success or ERR_PTR on failure.
513513
*/
514514
struct typec_partner *typec_register_partner(struct typec_port *port,
515515
struct typec_partner_desc *desc)
@@ -519,7 +519,7 @@ struct typec_partner *typec_register_partner(struct typec_port *port,
519519

520520
partner = kzalloc(sizeof(*partner), GFP_KERNEL);
521521
if (!partner)
522-
return NULL;
522+
return ERR_PTR(-ENOMEM);
523523

524524
partner->usb_pd = desc->usb_pd;
525525
partner->accessory = desc->accessory;
@@ -542,7 +542,7 @@ struct typec_partner *typec_register_partner(struct typec_port *port,
542542
if (ret) {
543543
dev_err(&port->dev, "failed to register partner (%d)\n", ret);
544544
put_device(&partner->dev);
545-
return NULL;
545+
return ERR_PTR(ret);
546546
}
547547

548548
return partner;
@@ -557,7 +557,7 @@ EXPORT_SYMBOL_GPL(typec_register_partner);
557557
*/
558558
void typec_unregister_partner(struct typec_partner *partner)
559559
{
560-
if (partner)
560+
if (!IS_ERR_OR_NULL(partner))
561561
device_unregister(&partner->dev);
562562
}
563563
EXPORT_SYMBOL_GPL(typec_unregister_partner);
@@ -587,7 +587,7 @@ static const struct device_type typec_plug_dev_type = {
587587
* the plug lists in response to Discover Modes command need to be listed in an
588588
* array in @desc.
589589
*
590-
* Returns handle to the alternate mode on success or NULL on failure.
590+
* Returns handle to the alternate mode on success or ERR_PTR on failure.
591591
*/
592592
struct typec_altmode *
593593
typec_plug_register_altmode(struct typec_plug *plug,
@@ -606,7 +606,7 @@ EXPORT_SYMBOL_GPL(typec_plug_register_altmode);
606606
* Cable Plug represents a plug with electronics in it that can response to USB
607607
* Power Delivery SOP Prime or SOP Double Prime packages.
608608
*
609-
* Returns handle to the cable plug on success or NULL on failure.
609+
* Returns handle to the cable plug on success or ERR_PTR on failure.
610610
*/
611611
struct typec_plug *typec_register_plug(struct typec_cable *cable,
612612
struct typec_plug_desc *desc)
@@ -617,7 +617,7 @@ struct typec_plug *typec_register_plug(struct typec_cable *cable,
617617

618618
plug = kzalloc(sizeof(*plug), GFP_KERNEL);
619619
if (!plug)
620-
return NULL;
620+
return ERR_PTR(-ENOMEM);
621621

622622
sprintf(name, "plug%d", desc->index);
623623

@@ -631,7 +631,7 @@ struct typec_plug *typec_register_plug(struct typec_cable *cable,
631631
if (ret) {
632632
dev_err(&cable->dev, "failed to register plug (%d)\n", ret);
633633
put_device(&plug->dev);
634-
return NULL;
634+
return ERR_PTR(ret);
635635
}
636636

637637
return plug;
@@ -646,7 +646,7 @@ EXPORT_SYMBOL_GPL(typec_register_plug);
646646
*/
647647
void typec_unregister_plug(struct typec_plug *plug)
648648
{
649-
if (plug)
649+
if (!IS_ERR_OR_NULL(plug))
650650
device_unregister(&plug->dev);
651651
}
652652
EXPORT_SYMBOL_GPL(typec_unregister_plug);
@@ -724,7 +724,7 @@ EXPORT_SYMBOL_GPL(typec_cable_set_identity);
724724
* Registers a device for USB Type-C Cable described in @desc. The cable will be
725725
* parent for the optional cable plug devises.
726726
*
727-
* Returns handle to the cable on success or NULL on failure.
727+
* Returns handle to the cable on success or ERR_PTR on failure.
728728
*/
729729
struct typec_cable *typec_register_cable(struct typec_port *port,
730730
struct typec_cable_desc *desc)
@@ -734,7 +734,7 @@ struct typec_cable *typec_register_cable(struct typec_port *port,
734734

735735
cable = kzalloc(sizeof(*cable), GFP_KERNEL);
736736
if (!cable)
737-
return NULL;
737+
return ERR_PTR(-ENOMEM);
738738

739739
cable->type = desc->type;
740740
cable->active = desc->active;
@@ -757,7 +757,7 @@ struct typec_cable *typec_register_cable(struct typec_port *port,
757757
if (ret) {
758758
dev_err(&port->dev, "failed to register cable (%d)\n", ret);
759759
put_device(&cable->dev);
760-
return NULL;
760+
return ERR_PTR(ret);
761761
}
762762

763763
return cable;
@@ -772,7 +772,7 @@ EXPORT_SYMBOL_GPL(typec_register_cable);
772772
*/
773773
void typec_unregister_cable(struct typec_cable *cable)
774774
{
775-
if (cable)
775+
if (!IS_ERR_OR_NULL(cable))
776776
device_unregister(&cable->dev);
777777
}
778778
EXPORT_SYMBOL_GPL(typec_unregister_cable);
@@ -1256,7 +1256,7 @@ EXPORT_SYMBOL_GPL(typec_set_pwr_opmode);
12561256
* This routine is used to register an alternate mode that @port is capable of
12571257
* supporting.
12581258
*
1259-
* Returns handle to the alternate mode on success or NULL on failure.
1259+
* Returns handle to the alternate mode on success or ERR_PTR on failure.
12601260
*/
12611261
struct typec_altmode *
12621262
typec_port_register_altmode(struct typec_port *port,
@@ -1273,7 +1273,7 @@ EXPORT_SYMBOL_GPL(typec_port_register_altmode);
12731273
*
12741274
* Registers a device for USB Type-C Port described in @cap.
12751275
*
1276-
* Returns handle to the port on success or NULL on failure.
1276+
* Returns handle to the port on success or ERR_PTR on failure.
12771277
*/
12781278
struct typec_port *typec_register_port(struct device *parent,
12791279
const struct typec_capability *cap)
@@ -1285,12 +1285,12 @@ struct typec_port *typec_register_port(struct device *parent,
12851285

12861286
port = kzalloc(sizeof(*port), GFP_KERNEL);
12871287
if (!port)
1288-
return NULL;
1288+
return ERR_PTR(-ENOMEM);
12891289

12901290
id = ida_simple_get(&typec_index_ida, 0, 0, GFP_KERNEL);
12911291
if (id < 0) {
12921292
kfree(port);
1293-
return NULL;
1293+
return ERR_PTR(id);
12941294
}
12951295

12961296
if (cap->type == TYPEC_PORT_DFP)
@@ -1326,7 +1326,7 @@ struct typec_port *typec_register_port(struct device *parent,
13261326
if (ret) {
13271327
dev_err(parent, "failed to register port (%d)\n", ret);
13281328
put_device(&port->dev);
1329-
return NULL;
1329+
return ERR_PTR(ret);
13301330
}
13311331

13321332
return port;
@@ -1341,7 +1341,7 @@ EXPORT_SYMBOL_GPL(typec_register_port);
13411341
*/
13421342
void typec_unregister_port(struct typec_port *port)
13431343
{
1344-
if (port)
1344+
if (!IS_ERR_OR_NULL(port))
13451345
device_unregister(&port->dev);
13461346
}
13471347
EXPORT_SYMBOL_GPL(typec_unregister_port);

drivers/usb/typec/ucsi/ucsi.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -260,38 +260,45 @@ static void ucsi_pwr_opmode_change(struct ucsi_connector *con)
260260

261261
static int ucsi_register_partner(struct ucsi_connector *con)
262262
{
263-
struct typec_partner_desc partner;
263+
struct typec_partner_desc desc;
264+
struct typec_partner *partner;
264265

265266
if (con->partner)
266267
return 0;
267268

268-
memset(&partner, 0, sizeof(partner));
269+
memset(&desc, 0, sizeof(desc));
269270

270271
switch (con->status.partner_type) {
271272
case UCSI_CONSTAT_PARTNER_TYPE_DEBUG:
272-
partner.accessory = TYPEC_ACCESSORY_DEBUG;
273+
desc.accessory = TYPEC_ACCESSORY_DEBUG;
273274
break;
274275
case UCSI_CONSTAT_PARTNER_TYPE_AUDIO:
275-
partner.accessory = TYPEC_ACCESSORY_AUDIO;
276+
desc.accessory = TYPEC_ACCESSORY_AUDIO;
276277
break;
277278
default:
278279
break;
279280
}
280281

281-
partner.usb_pd = con->status.pwr_op_mode == UCSI_CONSTAT_PWR_OPMODE_PD;
282+
desc.usb_pd = con->status.pwr_op_mode == UCSI_CONSTAT_PWR_OPMODE_PD;
282283

283-
con->partner = typec_register_partner(con->port, &partner);
284-
if (!con->partner) {
285-
dev_err(con->ucsi->dev, "con%d: failed to register partner\n",
286-
con->num);
287-
return -ENODEV;
284+
partner = typec_register_partner(con->port, &desc);
285+
if (IS_ERR(partner)) {
286+
dev_err(con->ucsi->dev,
287+
"con%d: failed to register partner (%ld)\n", con->num,
288+
PTR_ERR(partner));
289+
return PTR_ERR(partner);
288290
}
289291

292+
con->partner = partner;
293+
290294
return 0;
291295
}
292296

293297
static void ucsi_unregister_partner(struct ucsi_connector *con)
294298
{
299+
if (!con->partner)
300+
return;
301+
295302
typec_unregister_partner(con->partner);
296303
con->partner = NULL;
297304
}
@@ -606,8 +613,8 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
606613

607614
/* Register the connector */
608615
con->port = typec_register_port(ucsi->dev, cap);
609-
if (!con->port)
610-
return -ENODEV;
616+
if (IS_ERR(con->port))
617+
return PTR_ERR(con->port);
611618

612619
/* Get the status */
613620
UCSI_CMD_GET_CONNECTOR_STATUS(ctrl, con->num);

0 commit comments

Comments
 (0)