@@ -2182,9 +2182,11 @@ static int mtk_dp_bridge_attach(struct drm_bridge *bridge,
2182
2182
2183
2183
mtk_dp -> drm_dev = bridge -> dev ;
2184
2184
2185
- irq_clear_status_flags (mtk_dp -> irq , IRQ_NOAUTOEN );
2186
- enable_irq (mtk_dp -> irq );
2187
- mtk_dp_hwirq_enable (mtk_dp , true);
2185
+ if (mtk_dp -> bridge .type != DRM_MODE_CONNECTOR_eDP ) {
2186
+ irq_clear_status_flags (mtk_dp -> irq , IRQ_NOAUTOEN );
2187
+ enable_irq (mtk_dp -> irq );
2188
+ mtk_dp_hwirq_enable (mtk_dp , true);
2189
+ }
2188
2190
2189
2191
return 0 ;
2190
2192
@@ -2199,8 +2201,10 @@ static void mtk_dp_bridge_detach(struct drm_bridge *bridge)
2199
2201
{
2200
2202
struct mtk_dp * mtk_dp = mtk_dp_from_bridge (bridge );
2201
2203
2202
- mtk_dp_hwirq_enable (mtk_dp , false);
2203
- disable_irq (mtk_dp -> irq );
2204
+ if (mtk_dp -> bridge .type != DRM_MODE_CONNECTOR_eDP ) {
2205
+ mtk_dp_hwirq_enable (mtk_dp , false);
2206
+ disable_irq (mtk_dp -> irq );
2207
+ }
2204
2208
mtk_dp -> drm_dev = NULL ;
2205
2209
mtk_dp_poweroff (mtk_dp );
2206
2210
drm_dp_aux_unregister (& mtk_dp -> aux );
@@ -2579,32 +2583,44 @@ static int mtk_dp_probe(struct platform_device *pdev)
2579
2583
mtk_dp -> dev = dev ;
2580
2584
mtk_dp -> data = (struct mtk_dp_data * )of_device_get_match_data (dev );
2581
2585
2582
- mtk_dp -> irq = platform_get_irq (pdev , 0 );
2583
- if (mtk_dp -> irq < 0 )
2584
- return dev_err_probe (dev , mtk_dp -> irq ,
2585
- "failed to request dp irq resource\n" );
2586
-
2587
2586
ret = mtk_dp_dt_parse (mtk_dp , pdev );
2588
2587
if (ret )
2589
2588
return dev_err_probe (dev , ret , "Failed to parse dt\n" );
2590
2589
2590
+ /*
2591
+ * Request the interrupt and install service routine only if we are
2592
+ * on full DisplayPort.
2593
+ * For eDP, polling the HPD instead is more convenient because we
2594
+ * don't expect any (un)plug events during runtime, hence we can
2595
+ * avoid some locking.
2596
+ */
2597
+ if (mtk_dp -> data -> bridge_type != DRM_MODE_CONNECTOR_eDP ) {
2598
+ mtk_dp -> irq = platform_get_irq (pdev , 0 );
2599
+ if (mtk_dp -> irq < 0 )
2600
+ return dev_err_probe (dev , mtk_dp -> irq ,
2601
+ "failed to request dp irq resource\n" );
2602
+
2603
+ spin_lock_init (& mtk_dp -> irq_thread_lock );
2604
+
2605
+ irq_set_status_flags (mtk_dp -> irq , IRQ_NOAUTOEN );
2606
+ ret = devm_request_threaded_irq (dev , mtk_dp -> irq , mtk_dp_hpd_event ,
2607
+ mtk_dp_hpd_event_thread ,
2608
+ IRQ_TYPE_LEVEL_HIGH , dev_name (dev ),
2609
+ mtk_dp );
2610
+ if (ret )
2611
+ return dev_err_probe (dev , ret ,
2612
+ "failed to request mediatek dptx irq\n" );
2613
+
2614
+ mtk_dp -> need_debounce = true;
2615
+ timer_setup (& mtk_dp -> debounce_timer , mtk_dp_debounce_timer , 0 );
2616
+ }
2617
+
2591
2618
mtk_dp -> aux .name = "aux_mtk_dp" ;
2592
2619
mtk_dp -> aux .dev = dev ;
2593
2620
mtk_dp -> aux .transfer = mtk_dp_aux_transfer ;
2594
2621
mtk_dp -> aux .wait_hpd_asserted = mtk_dp_wait_hpd_asserted ;
2595
2622
drm_dp_aux_init (& mtk_dp -> aux );
2596
2623
2597
- spin_lock_init (& mtk_dp -> irq_thread_lock );
2598
-
2599
- irq_set_status_flags (mtk_dp -> irq , IRQ_NOAUTOEN );
2600
- ret = devm_request_threaded_irq (dev , mtk_dp -> irq , mtk_dp_hpd_event ,
2601
- mtk_dp_hpd_event_thread ,
2602
- IRQ_TYPE_LEVEL_HIGH , dev_name (dev ),
2603
- mtk_dp );
2604
- if (ret )
2605
- return dev_err_probe (dev , ret ,
2606
- "failed to request mediatek dptx irq\n" );
2607
-
2608
2624
platform_set_drvdata (pdev , mtk_dp );
2609
2625
2610
2626
if (mtk_dp -> data -> audio_supported ) {
@@ -2626,9 +2642,6 @@ static int mtk_dp_probe(struct platform_device *pdev)
2626
2642
mtk_dp -> bridge .of_node = dev -> of_node ;
2627
2643
mtk_dp -> bridge .type = mtk_dp -> data -> bridge_type ;
2628
2644
2629
- mtk_dp -> need_debounce = true;
2630
- timer_setup (& mtk_dp -> debounce_timer , mtk_dp_debounce_timer , 0 );
2631
-
2632
2645
if (mtk_dp -> bridge .type == DRM_MODE_CONNECTOR_eDP ) {
2633
2646
/*
2634
2647
* Set the data lanes to idle in case the bootloader didn't
@@ -2639,6 +2652,9 @@ static int mtk_dp_probe(struct platform_device *pdev)
2639
2652
mtk_dp_initialize_aux_settings (mtk_dp );
2640
2653
mtk_dp_power_enable (mtk_dp );
2641
2654
2655
+ /* Disable HW interrupts: we don't need any for eDP */
2656
+ mtk_dp_hwirq_enable (mtk_dp , false);
2657
+
2642
2658
/*
2643
2659
* Power on the AUX to allow reading the EDID from aux-bus:
2644
2660
* please note that it is necessary to call power off in the
@@ -2684,7 +2700,8 @@ static int mtk_dp_remove(struct platform_device *pdev)
2684
2700
2685
2701
pm_runtime_put (& pdev -> dev );
2686
2702
pm_runtime_disable (& pdev -> dev );
2687
- del_timer_sync (& mtk_dp -> debounce_timer );
2703
+ if (mtk_dp -> data -> bridge_type != DRM_MODE_CONNECTOR_eDP )
2704
+ del_timer_sync (& mtk_dp -> debounce_timer );
2688
2705
platform_device_unregister (mtk_dp -> phy_dev );
2689
2706
if (mtk_dp -> audio_pdev )
2690
2707
platform_device_unregister (mtk_dp -> audio_pdev );
@@ -2698,7 +2715,8 @@ static int mtk_dp_suspend(struct device *dev)
2698
2715
struct mtk_dp * mtk_dp = dev_get_drvdata (dev );
2699
2716
2700
2717
mtk_dp_power_disable (mtk_dp );
2701
- mtk_dp_hwirq_enable (mtk_dp , false);
2718
+ if (mtk_dp -> bridge .type != DRM_MODE_CONNECTOR_eDP )
2719
+ mtk_dp_hwirq_enable (mtk_dp , false);
2702
2720
pm_runtime_put_sync (dev );
2703
2721
2704
2722
return 0 ;
@@ -2710,7 +2728,8 @@ static int mtk_dp_resume(struct device *dev)
2710
2728
2711
2729
pm_runtime_get_sync (dev );
2712
2730
mtk_dp_init_port (mtk_dp );
2713
- mtk_dp_hwirq_enable (mtk_dp , true);
2731
+ if (mtk_dp -> bridge .type != DRM_MODE_CONNECTOR_eDP )
2732
+ mtk_dp_hwirq_enable (mtk_dp , true);
2714
2733
mtk_dp_power_enable (mtk_dp );
2715
2734
2716
2735
return 0 ;
0 commit comments