@@ -2182,9 +2182,11 @@ static int mtk_dp_bridge_attach(struct drm_bridge *bridge,
21822182
21832183 mtk_dp -> drm_dev = bridge -> dev ;
21842184
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+ }
21882190
21892191 return 0 ;
21902192
@@ -2199,8 +2201,10 @@ static void mtk_dp_bridge_detach(struct drm_bridge *bridge)
21992201{
22002202 struct mtk_dp * mtk_dp = mtk_dp_from_bridge (bridge );
22012203
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+ }
22042208 mtk_dp -> drm_dev = NULL ;
22052209 mtk_dp_poweroff (mtk_dp );
22062210 drm_dp_aux_unregister (& mtk_dp -> aux );
@@ -2579,32 +2583,44 @@ static int mtk_dp_probe(struct platform_device *pdev)
25792583 mtk_dp -> dev = dev ;
25802584 mtk_dp -> data = (struct mtk_dp_data * )of_device_get_match_data (dev );
25812585
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-
25872586 ret = mtk_dp_dt_parse (mtk_dp , pdev );
25882587 if (ret )
25892588 return dev_err_probe (dev , ret , "Failed to parse dt\n" );
25902589
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+
25912618 mtk_dp -> aux .name = "aux_mtk_dp" ;
25922619 mtk_dp -> aux .dev = dev ;
25932620 mtk_dp -> aux .transfer = mtk_dp_aux_transfer ;
25942621 mtk_dp -> aux .wait_hpd_asserted = mtk_dp_wait_hpd_asserted ;
25952622 drm_dp_aux_init (& mtk_dp -> aux );
25962623
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-
26082624 platform_set_drvdata (pdev , mtk_dp );
26092625
26102626 if (mtk_dp -> data -> audio_supported ) {
@@ -2626,9 +2642,6 @@ static int mtk_dp_probe(struct platform_device *pdev)
26262642 mtk_dp -> bridge .of_node = dev -> of_node ;
26272643 mtk_dp -> bridge .type = mtk_dp -> data -> bridge_type ;
26282644
2629- mtk_dp -> need_debounce = true;
2630- timer_setup (& mtk_dp -> debounce_timer , mtk_dp_debounce_timer , 0 );
2631-
26322645 if (mtk_dp -> bridge .type == DRM_MODE_CONNECTOR_eDP ) {
26332646 /*
26342647 * 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)
26392652 mtk_dp_initialize_aux_settings (mtk_dp );
26402653 mtk_dp_power_enable (mtk_dp );
26412654
2655+ /* Disable HW interrupts: we don't need any for eDP */
2656+ mtk_dp_hwirq_enable (mtk_dp , false);
2657+
26422658 /*
26432659 * Power on the AUX to allow reading the EDID from aux-bus:
26442660 * 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)
26842700
26852701 pm_runtime_put (& pdev -> dev );
26862702 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 );
26882705 platform_device_unregister (mtk_dp -> phy_dev );
26892706 if (mtk_dp -> audio_pdev )
26902707 platform_device_unregister (mtk_dp -> audio_pdev );
@@ -2698,7 +2715,8 @@ static int mtk_dp_suspend(struct device *dev)
26982715 struct mtk_dp * mtk_dp = dev_get_drvdata (dev );
26992716
27002717 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);
27022720 pm_runtime_put_sync (dev );
27032721
27042722 return 0 ;
@@ -2710,7 +2728,8 @@ static int mtk_dp_resume(struct device *dev)
27102728
27112729 pm_runtime_get_sync (dev );
27122730 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);
27142733 mtk_dp_power_enable (mtk_dp );
27152734
27162735 return 0 ;
0 commit comments