@@ -2575,13 +2575,12 @@ static int qmp_combo_probe(struct platform_device *pdev)
2575
2575
{
2576
2576
struct qmp_combo * qmp ;
2577
2577
struct device * dev = & pdev -> dev ;
2578
- struct device_node * child ;
2578
+ struct device_node * dp_np , * usb_np ;
2579
2579
struct phy_provider * phy_provider ;
2580
2580
void __iomem * serdes ;
2581
2581
void __iomem * usb_serdes ;
2582
2582
void __iomem * dp_serdes = NULL ;
2583
2583
const struct qmp_phy_cfg * cfg = NULL ;
2584
- int num , id , expected_phys ;
2585
2584
int ret ;
2586
2585
2587
2586
qmp = devm_kzalloc (dev , sizeof (* qmp ), GFP_KERNEL );
@@ -2607,8 +2606,6 @@ static int qmp_combo_probe(struct platform_device *pdev)
2607
2606
if (IS_ERR (dp_serdes ))
2608
2607
return PTR_ERR (dp_serdes );
2609
2608
2610
- expected_phys = 2 ;
2611
-
2612
2609
mutex_init (& qmp -> phy_mutex );
2613
2610
2614
2611
ret = qmp_combo_clk_init (dev , cfg );
@@ -2623,75 +2620,52 @@ static int qmp_combo_probe(struct platform_device *pdev)
2623
2620
if (ret )
2624
2621
return ret ;
2625
2622
2626
- num = of_get_available_child_count (dev -> of_node );
2627
- /* do we have a rogue child node ? */
2628
- if (num > expected_phys )
2623
+ usb_np = of_get_child_by_name (dev -> of_node , "usb3-phy" );
2624
+ if (!usb_np )
2625
+ return - EINVAL ;
2626
+
2627
+ dp_np = of_get_child_by_name (dev -> of_node , "dp-phy" );
2628
+ if (!dp_np ) {
2629
+ of_node_put (usb_np );
2629
2630
return - EINVAL ;
2631
+ }
2630
2632
2631
2633
pm_runtime_set_active (dev );
2632
2634
ret = devm_pm_runtime_enable (dev );
2633
2635
if (ret )
2634
- return ret ;
2636
+ goto err_node_put ;
2635
2637
/*
2636
2638
* Prevent runtime pm from being ON by default. Users can enable
2637
2639
* it using power/control in sysfs.
2638
2640
*/
2639
2641
pm_runtime_forbid (dev );
2640
2642
2641
- id = 0 ;
2642
- for_each_available_child_of_node (dev -> of_node , child ) {
2643
- if (of_node_name_eq (child , "dp-phy" )) {
2644
- serdes = dp_serdes ;
2645
-
2646
- /* Create per-lane phy */
2647
- ret = qmp_combo_create_dp (dev , child , serdes , cfg );
2648
- if (ret ) {
2649
- dev_err (dev , "failed to create lane%d phy, %d\n" ,
2650
- id , ret );
2651
- goto err_node_put ;
2652
- }
2653
-
2654
- ret = phy_dp_clks_register (qmp , child );
2655
- if (ret ) {
2656
- dev_err (qmp -> dev ,
2657
- "failed to register DP clock source\n" );
2658
- goto err_node_put ;
2659
- }
2660
- } else if (of_node_name_eq (child , "usb3-phy" )) {
2661
- serdes = usb_serdes ;
2662
-
2663
- /* Create per-lane phy */
2664
- ret = qmp_combo_create_usb (dev , child , serdes , cfg );
2665
- if (ret ) {
2666
- dev_err (dev , "failed to create lane%d phy, %d\n" ,
2667
- id , ret );
2668
- goto err_node_put ;
2669
- }
2670
-
2671
- /*
2672
- * Register the pipe clock provided by phy.
2673
- * See function description to see details of this pipe clock.
2674
- */
2675
- ret = phy_pipe_clk_register (qmp , child );
2676
- if (ret ) {
2677
- dev_err (qmp -> dev ,
2678
- "failed to register pipe clock source\n" );
2679
- goto err_node_put ;
2680
- }
2681
- }
2643
+ ret = qmp_combo_create_usb (dev , usb_np , usb_serdes , cfg );
2644
+ if (ret )
2645
+ goto err_node_put ;
2682
2646
2683
- id ++ ;
2684
- }
2647
+ ret = phy_pipe_clk_register (qmp , usb_np );
2648
+ if (ret )
2649
+ goto err_node_put ;
2685
2650
2686
- if (!qmp -> usb_phy )
2687
- return - EINVAL ;
2651
+ ret = qmp_combo_create_dp (dev , dp_np , dp_serdes , cfg );
2652
+ if (ret )
2653
+ goto err_node_put ;
2654
+
2655
+ ret = phy_dp_clks_register (qmp , dp_np );
2656
+ if (ret )
2657
+ goto err_node_put ;
2688
2658
2689
2659
phy_provider = devm_of_phy_provider_register (dev , of_phy_simple_xlate );
2690
2660
2661
+ of_node_put (usb_np );
2662
+ of_node_put (dp_np );
2663
+
2691
2664
return PTR_ERR_OR_ZERO (phy_provider );
2692
2665
2693
2666
err_node_put :
2694
- of_node_put (child );
2667
+ of_node_put (usb_np );
2668
+ of_node_put (dp_np );
2695
2669
return ret ;
2696
2670
}
2697
2671
0 commit comments