.. | .. |
---|
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 | } |
---|