| .. | .. |
|---|
| 356 | 356 | |
|---|
| 357 | 357 | static int wcove_pd_transmit(struct tcpc_dev *tcpc, |
|---|
| 358 | 358 | enum tcpm_transmit_type type, |
|---|
| 359 | | - const struct pd_message *msg) |
|---|
| 359 | + const struct pd_message *msg, |
|---|
| 360 | + unsigned int negotiated_rev) |
|---|
| 360 | 361 | { |
|---|
| 361 | 362 | struct wcove_typec *wcove = tcpc_to_wcove(tcpc); |
|---|
| 362 | 363 | unsigned int info = 0; |
|---|
| .. | .. |
|---|
| 377 | 378 | const u8 *data = (void *)msg; |
|---|
| 378 | 379 | int i; |
|---|
| 379 | 380 | |
|---|
| 380 | | - for (i = 0; i < pd_header_cnt(msg->header) * 4 + 2; i++) { |
|---|
| 381 | + for (i = 0; i < pd_header_cnt_le(msg->header) * 4 + 2; i++) { |
|---|
| 381 | 382 | ret = regmap_write(wcove->regmap, USBC_TX_DATA + i, |
|---|
| 382 | 383 | data[i]); |
|---|
| 383 | 384 | if (ret) |
|---|
| .. | .. |
|---|
| 591 | 592 | PDO_VAR(5000, 12000, 3000), |
|---|
| 592 | 593 | }; |
|---|
| 593 | 594 | |
|---|
| 594 | | -static struct tcpc_config wcove_typec_config = { |
|---|
| 595 | | - .src_pdo = src_pdo, |
|---|
| 596 | | - .nr_src_pdo = ARRAY_SIZE(src_pdo), |
|---|
| 597 | | - .snk_pdo = snk_pdo, |
|---|
| 598 | | - .nr_snk_pdo = ARRAY_SIZE(snk_pdo), |
|---|
| 599 | | - |
|---|
| 600 | | - .operating_snk_mw = 15000, |
|---|
| 601 | | - |
|---|
| 602 | | - .type = TYPEC_PORT_DRP, |
|---|
| 603 | | - .data = TYPEC_PORT_DRD, |
|---|
| 604 | | - .default_role = TYPEC_SINK, |
|---|
| 595 | +static const struct property_entry wcove_props[] = { |
|---|
| 596 | + PROPERTY_ENTRY_STRING("data-role", "dual"), |
|---|
| 597 | + PROPERTY_ENTRY_STRING("power-role", "dual"), |
|---|
| 598 | + PROPERTY_ENTRY_STRING("try-power-role", "sink"), |
|---|
| 599 | + PROPERTY_ENTRY_U32_ARRAY("source-pdos", src_pdo), |
|---|
| 600 | + PROPERTY_ENTRY_U32_ARRAY("sink-pdos", snk_pdo), |
|---|
| 601 | + PROPERTY_ENTRY_U32("op-sink-microwatt", 15000000), |
|---|
| 602 | + { } |
|---|
| 605 | 603 | }; |
|---|
| 606 | 604 | |
|---|
| 607 | 605 | static int wcove_typec_probe(struct platform_device *pdev) |
|---|
| .. | .. |
|---|
| 620 | 618 | wcove->regmap = pmic->regmap; |
|---|
| 621 | 619 | |
|---|
| 622 | 620 | irq = platform_get_irq(pdev, 0); |
|---|
| 623 | | - if (irq < 0) { |
|---|
| 624 | | - dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq); |
|---|
| 621 | + if (irq < 0) |
|---|
| 625 | 622 | return irq; |
|---|
| 626 | | - } |
|---|
| 627 | 623 | |
|---|
| 628 | 624 | irq = regmap_irq_get_virq(pmic->irq_chip_data_chgr, irq); |
|---|
| 629 | 625 | if (irq < 0) |
|---|
| .. | .. |
|---|
| 652 | 648 | wcove->tcpc.set_roles = wcove_set_roles; |
|---|
| 653 | 649 | wcove->tcpc.pd_transmit = wcove_pd_transmit; |
|---|
| 654 | 650 | |
|---|
| 655 | | - wcove->tcpc.config = &wcove_typec_config; |
|---|
| 651 | + wcove->tcpc.fwnode = fwnode_create_software_node(wcove_props, NULL); |
|---|
| 652 | + if (IS_ERR(wcove->tcpc.fwnode)) |
|---|
| 653 | + return PTR_ERR(wcove->tcpc.fwnode); |
|---|
| 656 | 654 | |
|---|
| 657 | 655 | wcove->tcpm = tcpm_register_port(wcove->dev, &wcove->tcpc); |
|---|
| 658 | | - if (IS_ERR(wcove->tcpm)) |
|---|
| 656 | + if (IS_ERR(wcove->tcpm)) { |
|---|
| 657 | + fwnode_remove_software_node(wcove->tcpc.fwnode); |
|---|
| 659 | 658 | return PTR_ERR(wcove->tcpm); |
|---|
| 659 | + } |
|---|
| 660 | 660 | |
|---|
| 661 | 661 | ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, |
|---|
| 662 | 662 | wcove_typec_irq, IRQF_ONESHOT, |
|---|
| 663 | 663 | "wcove_typec", wcove); |
|---|
| 664 | 664 | if (ret) { |
|---|
| 665 | 665 | tcpm_unregister_port(wcove->tcpm); |
|---|
| 666 | + fwnode_remove_software_node(wcove->tcpc.fwnode); |
|---|
| 666 | 667 | return ret; |
|---|
| 667 | 668 | } |
|---|
| 668 | 669 | |
|---|
| .. | .. |
|---|
| 682 | 683 | regmap_write(wcove->regmap, USBC_IRQMASK2, val | USBC_IRQMASK2_ALL); |
|---|
| 683 | 684 | |
|---|
| 684 | 685 | tcpm_unregister_port(wcove->tcpm); |
|---|
| 686 | + fwnode_remove_software_node(wcove->tcpc.fwnode); |
|---|
| 685 | 687 | |
|---|
| 686 | 688 | return 0; |
|---|
| 687 | 689 | } |
|---|