CC: [email protected] BCC: [email protected] CC: [email protected] TO: Xin Ji <[email protected]> CC: "Greg Kroah-Hartman" <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing head: c76d09da77d69d7f737540985912ad2bca654713 commit: fe6d8a9c8e6456f8e7ba6b4ee528460beaf65a71 [43/55] usb: typec: anx7411: Add Analogix PD ANX7411 support :::::: branch date: 2 days ago :::::: commit date: 3 days ago config: xtensa-randconfig-m041-20220715 (https://download.01.org/0day-ci/archive/20220717/[email protected]/config) compiler: xtensa-linux-gcc (GCC) 12.1.0 If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> New smatch warnings: drivers/usb/typec/anx7411.c:387 anx7411_register_partner() warn: passing zero to 'PTR_ERR' drivers/usb/typec/anx7411.c:573 anx7411_typec_register_altmode() warn: passing a valid pointer to 'PTR_ERR' drivers/usb/typec/anx7411.c:996 anx7411_register_i2c_dummy_clients() error: buffer overflow 'anx7411_i2c_addr' 4 <= 7 drivers/usb/typec/anx7411.c:1484 anx7411_i2c_probe() warn: missing error code 'ret' Old smatch warnings: drivers/usb/typec/anx7411.c:997 anx7411_register_i2c_dummy_clients() error: buffer overflow 'anx7411_i2c_addr' 4 <= 7 vim +/PTR_ERR +387 drivers/usb/typec/anx7411.c fe6d8a9c8e6456 Xin Ji 2022-07-14 372 fe6d8a9c8e6456 Xin Ji 2022-07-14 373 static int anx7411_register_partner(struct anx7411_data *ctx, fe6d8a9c8e6456 Xin Ji 2022-07-14 374 int pd, int accessory) fe6d8a9c8e6456 Xin Ji 2022-07-14 375 { fe6d8a9c8e6456 Xin Ji 2022-07-14 376 struct typec_partner_desc desc; fe6d8a9c8e6456 Xin Ji 2022-07-14 377 fe6d8a9c8e6456 Xin Ji 2022-07-14 378 if (ctx->typec.partner) fe6d8a9c8e6456 Xin Ji 2022-07-14 379 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 380 fe6d8a9c8e6456 Xin Ji 2022-07-14 381 desc.usb_pd = pd; fe6d8a9c8e6456 Xin Ji 2022-07-14 382 desc.accessory = accessory; fe6d8a9c8e6456 Xin Ji 2022-07-14 383 desc.identity = NULL; fe6d8a9c8e6456 Xin Ji 2022-07-14 384 ctx->typec.partner = typec_register_partner(ctx->typec.port, &desc); fe6d8a9c8e6456 Xin Ji 2022-07-14 385 if (IS_ERR(ctx->typec.partner)) { fe6d8a9c8e6456 Xin Ji 2022-07-14 386 ctx->typec.partner = NULL; fe6d8a9c8e6456 Xin Ji 2022-07-14 @387 return PTR_ERR(ctx->typec.partner); fe6d8a9c8e6456 Xin Ji 2022-07-14 388 } fe6d8a9c8e6456 Xin Ji 2022-07-14 389 fe6d8a9c8e6456 Xin Ji 2022-07-14 390 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 391 } fe6d8a9c8e6456 Xin Ji 2022-07-14 392 fe6d8a9c8e6456 Xin Ji 2022-07-14 393 static int anx7411_detect_cc_orientation(struct anx7411_data *ctx) fe6d8a9c8e6456 Xin Ji 2022-07-14 394 { fe6d8a9c8e6456 Xin Ji 2022-07-14 395 struct device *dev = &ctx->spi_client->dev; fe6d8a9c8e6456 Xin Ji 2022-07-14 396 int ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 397 int cc1_rd, cc2_rd; fe6d8a9c8e6456 Xin Ji 2022-07-14 398 int cc1_ra, cc2_ra; fe6d8a9c8e6456 Xin Ji 2022-07-14 399 int cc1_rp, cc2_rp; fe6d8a9c8e6456 Xin Ji 2022-07-14 400 fe6d8a9c8e6456 Xin Ji 2022-07-14 401 ret = anx7411_reg_read(ctx->spi_client, CC_STATUS); fe6d8a9c8e6456 Xin Ji 2022-07-14 402 if (ret < 0) fe6d8a9c8e6456 Xin Ji 2022-07-14 403 return ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 404 fe6d8a9c8e6456 Xin Ji 2022-07-14 405 ctx->typec.cc_status = ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 406 fe6d8a9c8e6456 Xin Ji 2022-07-14 407 cc1_rd = ret & CC1_RD ? 1 : 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 408 cc2_rd = ret & CC2_RD ? 1 : 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 409 cc1_ra = ret & CC1_RA ? 1 : 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 410 cc2_ra = ret & CC2_RA ? 1 : 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 411 cc1_rp = CC1_RP(ret); fe6d8a9c8e6456 Xin Ji 2022-07-14 412 cc2_rp = CC2_RP(ret); fe6d8a9c8e6456 Xin Ji 2022-07-14 413 fe6d8a9c8e6456 Xin Ji 2022-07-14 414 /* Debug cable, nothing to do */ fe6d8a9c8e6456 Xin Ji 2022-07-14 415 if (cc1_rd && cc2_rd) { fe6d8a9c8e6456 Xin Ji 2022-07-14 416 ctx->typec.cc_orientation_valid = 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 417 return anx7411_register_partner(ctx, 0, TYPEC_ACCESSORY_DEBUG); fe6d8a9c8e6456 Xin Ji 2022-07-14 418 } fe6d8a9c8e6456 Xin Ji 2022-07-14 419 fe6d8a9c8e6456 Xin Ji 2022-07-14 420 if (cc1_ra && cc2_ra) { fe6d8a9c8e6456 Xin Ji 2022-07-14 421 ctx->typec.cc_orientation_valid = 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 422 return anx7411_register_partner(ctx, 0, TYPEC_ACCESSORY_AUDIO); fe6d8a9c8e6456 Xin Ji 2022-07-14 423 } fe6d8a9c8e6456 Xin Ji 2022-07-14 424 fe6d8a9c8e6456 Xin Ji 2022-07-14 425 ctx->typec.cc_orientation_valid = 1; fe6d8a9c8e6456 Xin Ji 2022-07-14 426 fe6d8a9c8e6456 Xin Ji 2022-07-14 427 ret = anx7411_register_partner(ctx, 1, TYPEC_ACCESSORY_NONE); fe6d8a9c8e6456 Xin Ji 2022-07-14 428 if (ret) { fe6d8a9c8e6456 Xin Ji 2022-07-14 429 dev_err(dev, "register partner\n"); fe6d8a9c8e6456 Xin Ji 2022-07-14 430 return ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 431 } fe6d8a9c8e6456 Xin Ji 2022-07-14 432 fe6d8a9c8e6456 Xin Ji 2022-07-14 433 if (cc1_rd || cc1_rp) { fe6d8a9c8e6456 Xin Ji 2022-07-14 434 typec_set_orientation(ctx->typec.port, TYPEC_ORIENTATION_NORMAL); fe6d8a9c8e6456 Xin Ji 2022-07-14 435 ctx->typec.cc_connect = CC1_CONNECTED; fe6d8a9c8e6456 Xin Ji 2022-07-14 436 } fe6d8a9c8e6456 Xin Ji 2022-07-14 437 fe6d8a9c8e6456 Xin Ji 2022-07-14 438 if (cc2_rd || cc2_rp) { fe6d8a9c8e6456 Xin Ji 2022-07-14 439 typec_set_orientation(ctx->typec.port, TYPEC_ORIENTATION_REVERSE); fe6d8a9c8e6456 Xin Ji 2022-07-14 440 ctx->typec.cc_connect = CC2_CONNECTED; fe6d8a9c8e6456 Xin Ji 2022-07-14 441 } fe6d8a9c8e6456 Xin Ji 2022-07-14 442 fe6d8a9c8e6456 Xin Ji 2022-07-14 443 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 444 } fe6d8a9c8e6456 Xin Ji 2022-07-14 445 fe6d8a9c8e6456 Xin Ji 2022-07-14 446 static int anx7411_set_mux(struct anx7411_data *ctx, int pin_assignment) fe6d8a9c8e6456 Xin Ji 2022-07-14 447 { fe6d8a9c8e6456 Xin Ji 2022-07-14 448 int mode = TYPEC_STATE_SAFE; fe6d8a9c8e6456 Xin Ji 2022-07-14 449 fe6d8a9c8e6456 Xin Ji 2022-07-14 450 switch (pin_assignment) { fe6d8a9c8e6456 Xin Ji 2022-07-14 451 case SELECT_PIN_ASSIGMENT_U: fe6d8a9c8e6456 Xin Ji 2022-07-14 452 /* default 4 line USB 3.1 */ fe6d8a9c8e6456 Xin Ji 2022-07-14 453 mode = TYPEC_STATE_MODAL; fe6d8a9c8e6456 Xin Ji 2022-07-14 454 break; fe6d8a9c8e6456 Xin Ji 2022-07-14 455 case SELECT_PIN_ASSIGMENT_C: fe6d8a9c8e6456 Xin Ji 2022-07-14 456 case SELECT_PIN_ASSIGMENT_E: fe6d8a9c8e6456 Xin Ji 2022-07-14 457 /* 4 line DP */ fe6d8a9c8e6456 Xin Ji 2022-07-14 458 mode = TYPEC_STATE_SAFE; fe6d8a9c8e6456 Xin Ji 2022-07-14 459 break; fe6d8a9c8e6456 Xin Ji 2022-07-14 460 case SELECT_PIN_ASSIGMENT_D: fe6d8a9c8e6456 Xin Ji 2022-07-14 461 /* 2 line DP, 2 line USB */ fe6d8a9c8e6456 Xin Ji 2022-07-14 462 mode = TYPEC_MODE_USB3; fe6d8a9c8e6456 Xin Ji 2022-07-14 463 break; fe6d8a9c8e6456 Xin Ji 2022-07-14 464 default: fe6d8a9c8e6456 Xin Ji 2022-07-14 465 mode = TYPEC_STATE_SAFE; fe6d8a9c8e6456 Xin Ji 2022-07-14 466 break; fe6d8a9c8e6456 Xin Ji 2022-07-14 467 } fe6d8a9c8e6456 Xin Ji 2022-07-14 468 fe6d8a9c8e6456 Xin Ji 2022-07-14 469 ctx->typec.pin_assignment = pin_assignment; fe6d8a9c8e6456 Xin Ji 2022-07-14 470 fe6d8a9c8e6456 Xin Ji 2022-07-14 471 return typec_set_mode(ctx->typec.port, mode); fe6d8a9c8e6456 Xin Ji 2022-07-14 472 } fe6d8a9c8e6456 Xin Ji 2022-07-14 473 fe6d8a9c8e6456 Xin Ji 2022-07-14 474 static int anx7411_set_usb_role(struct anx7411_data *ctx, enum usb_role role) fe6d8a9c8e6456 Xin Ji 2022-07-14 475 { fe6d8a9c8e6456 Xin Ji 2022-07-14 476 if (!ctx->typec.role_sw) fe6d8a9c8e6456 Xin Ji 2022-07-14 477 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 478 fe6d8a9c8e6456 Xin Ji 2022-07-14 479 return usb_role_switch_set_role(ctx->typec.role_sw, role); fe6d8a9c8e6456 Xin Ji 2022-07-14 480 } fe6d8a9c8e6456 Xin Ji 2022-07-14 481 fe6d8a9c8e6456 Xin Ji 2022-07-14 482 static int anx7411_data_role_detect(struct anx7411_data *ctx) fe6d8a9c8e6456 Xin Ji 2022-07-14 483 { fe6d8a9c8e6456 Xin Ji 2022-07-14 484 int ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 485 fe6d8a9c8e6456 Xin Ji 2022-07-14 486 ret = anx7411_reg_read(ctx->spi_client, SYSTEM_STSTUS); fe6d8a9c8e6456 Xin Ji 2022-07-14 487 if (ret < 0) fe6d8a9c8e6456 Xin Ji 2022-07-14 488 return ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 489 fe6d8a9c8e6456 Xin Ji 2022-07-14 490 ctx->typec.data_role = (ret & DATA_ROLE) ? TYPEC_HOST : TYPEC_DEVICE; fe6d8a9c8e6456 Xin Ji 2022-07-14 491 ctx->typec.vconn_role = (ret & VCONN_STATUS) ? TYPEC_SOURCE : TYPEC_SINK; fe6d8a9c8e6456 Xin Ji 2022-07-14 492 fe6d8a9c8e6456 Xin Ji 2022-07-14 493 typec_set_data_role(ctx->typec.port, ctx->typec.data_role); fe6d8a9c8e6456 Xin Ji 2022-07-14 494 fe6d8a9c8e6456 Xin Ji 2022-07-14 495 typec_set_vconn_role(ctx->typec.port, ctx->typec.vconn_role); fe6d8a9c8e6456 Xin Ji 2022-07-14 496 fe6d8a9c8e6456 Xin Ji 2022-07-14 497 if (ctx->typec.data_role == TYPEC_HOST) fe6d8a9c8e6456 Xin Ji 2022-07-14 498 return anx7411_set_usb_role(ctx, USB_ROLE_HOST); fe6d8a9c8e6456 Xin Ji 2022-07-14 499 fe6d8a9c8e6456 Xin Ji 2022-07-14 500 return anx7411_set_usb_role(ctx, USB_ROLE_DEVICE); fe6d8a9c8e6456 Xin Ji 2022-07-14 501 } fe6d8a9c8e6456 Xin Ji 2022-07-14 502 fe6d8a9c8e6456 Xin Ji 2022-07-14 503 static int anx7411_power_role_detect(struct anx7411_data *ctx) fe6d8a9c8e6456 Xin Ji 2022-07-14 504 { fe6d8a9c8e6456 Xin Ji 2022-07-14 505 int ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 506 fe6d8a9c8e6456 Xin Ji 2022-07-14 507 ret = anx7411_reg_read(ctx->spi_client, SYSTEM_STSTUS); fe6d8a9c8e6456 Xin Ji 2022-07-14 508 if (ret < 0) fe6d8a9c8e6456 Xin Ji 2022-07-14 509 return ret; fe6d8a9c8e6456 Xin Ji 2022-07-14 510 fe6d8a9c8e6456 Xin Ji 2022-07-14 511 ctx->typec.power_role = (ret & SINK_STATUS) ? TYPEC_SINK : TYPEC_SOURCE; fe6d8a9c8e6456 Xin Ji 2022-07-14 512 fe6d8a9c8e6456 Xin Ji 2022-07-14 513 if (ctx->typec.power_role == TYPEC_SOURCE) { fe6d8a9c8e6456 Xin Ji 2022-07-14 514 ctx->typec.request_current = DEF_1_5A; fe6d8a9c8e6456 Xin Ji 2022-07-14 515 ctx->typec.request_voltage = DEF_5V; fe6d8a9c8e6456 Xin Ji 2022-07-14 516 } fe6d8a9c8e6456 Xin Ji 2022-07-14 517 fe6d8a9c8e6456 Xin Ji 2022-07-14 518 typec_set_pwr_role(ctx->typec.port, ctx->typec.power_role); fe6d8a9c8e6456 Xin Ji 2022-07-14 519 fe6d8a9c8e6456 Xin Ji 2022-07-14 520 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 521 } fe6d8a9c8e6456 Xin Ji 2022-07-14 522 fe6d8a9c8e6456 Xin Ji 2022-07-14 523 static int anx7411_cc_status_detect(struct anx7411_data *ctx) fe6d8a9c8e6456 Xin Ji 2022-07-14 524 { fe6d8a9c8e6456 Xin Ji 2022-07-14 525 anx7411_detect_cc_orientation(ctx); fe6d8a9c8e6456 Xin Ji 2022-07-14 526 anx7411_detect_power_mode(ctx); fe6d8a9c8e6456 Xin Ji 2022-07-14 527 fe6d8a9c8e6456 Xin Ji 2022-07-14 528 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 529 } fe6d8a9c8e6456 Xin Ji 2022-07-14 530 fe6d8a9c8e6456 Xin Ji 2022-07-14 531 static void anx7411_partner_unregister_altmode(struct anx7411_data *ctx) fe6d8a9c8e6456 Xin Ji 2022-07-14 532 { fe6d8a9c8e6456 Xin Ji 2022-07-14 533 int i; fe6d8a9c8e6456 Xin Ji 2022-07-14 534 fe6d8a9c8e6456 Xin Ji 2022-07-14 535 ctx->typec.dp_altmode_enter = 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 536 ctx->typec.cust_altmode_enter = 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 537 fe6d8a9c8e6456 Xin Ji 2022-07-14 538 for (i = 0; i < MAX_ALTMODE; i++) fe6d8a9c8e6456 Xin Ji 2022-07-14 539 if (ctx->typec.amode[i]) { fe6d8a9c8e6456 Xin Ji 2022-07-14 540 typec_unregister_altmode(ctx->typec.amode[i]); fe6d8a9c8e6456 Xin Ji 2022-07-14 541 ctx->typec.amode[i] = NULL; fe6d8a9c8e6456 Xin Ji 2022-07-14 542 } fe6d8a9c8e6456 Xin Ji 2022-07-14 543 fe6d8a9c8e6456 Xin Ji 2022-07-14 544 ctx->typec.pin_assignment = 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 545 } fe6d8a9c8e6456 Xin Ji 2022-07-14 546 fe6d8a9c8e6456 Xin Ji 2022-07-14 547 static int anx7411_typec_register_altmode(struct anx7411_data *ctx, fe6d8a9c8e6456 Xin Ji 2022-07-14 548 int svid, int vdo) fe6d8a9c8e6456 Xin Ji 2022-07-14 549 { fe6d8a9c8e6456 Xin Ji 2022-07-14 550 struct device *dev = &ctx->spi_client->dev; fe6d8a9c8e6456 Xin Ji 2022-07-14 551 struct typec_altmode_desc desc; fe6d8a9c8e6456 Xin Ji 2022-07-14 552 int i; fe6d8a9c8e6456 Xin Ji 2022-07-14 553 fe6d8a9c8e6456 Xin Ji 2022-07-14 554 desc.svid = svid; fe6d8a9c8e6456 Xin Ji 2022-07-14 555 desc.vdo = vdo; fe6d8a9c8e6456 Xin Ji 2022-07-14 556 fe6d8a9c8e6456 Xin Ji 2022-07-14 557 for (i = 0; i < MAX_ALTMODE; i++) fe6d8a9c8e6456 Xin Ji 2022-07-14 558 if (!ctx->typec.amode[i]) fe6d8a9c8e6456 Xin Ji 2022-07-14 559 break; fe6d8a9c8e6456 Xin Ji 2022-07-14 560 fe6d8a9c8e6456 Xin Ji 2022-07-14 561 desc.mode = i + 1; /* start with 1 */ fe6d8a9c8e6456 Xin Ji 2022-07-14 562 fe6d8a9c8e6456 Xin Ji 2022-07-14 563 if (i >= MAX_ALTMODE) { fe6d8a9c8e6456 Xin Ji 2022-07-14 564 dev_err(dev, "no altmode space for registering\n"); fe6d8a9c8e6456 Xin Ji 2022-07-14 565 return -ENOMEM; fe6d8a9c8e6456 Xin Ji 2022-07-14 566 } fe6d8a9c8e6456 Xin Ji 2022-07-14 567 fe6d8a9c8e6456 Xin Ji 2022-07-14 568 ctx->typec.amode[i] = typec_partner_register_altmode(ctx->typec.partner, fe6d8a9c8e6456 Xin Ji 2022-07-14 569 &desc); fe6d8a9c8e6456 Xin Ji 2022-07-14 570 if (IS_ERR(ctx->typec.amode[i])) { fe6d8a9c8e6456 Xin Ji 2022-07-14 571 dev_err(dev, "failed to register altmode\n"); fe6d8a9c8e6456 Xin Ji 2022-07-14 572 ctx->typec.amode[i] = NULL; fe6d8a9c8e6456 Xin Ji 2022-07-14 @573 return PTR_ERR(ctx->typec.amode); fe6d8a9c8e6456 Xin Ji 2022-07-14 574 } fe6d8a9c8e6456 Xin Ji 2022-07-14 575 fe6d8a9c8e6456 Xin Ji 2022-07-14 576 return 0; fe6d8a9c8e6456 Xin Ji 2022-07-14 577 } fe6d8a9c8e6456 Xin Ji 2022-07-14 578 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
