On Fri, 2022-02-18 at 15:54 +0100, Guillaume Ranquet wrote:
From: Jitao Shi jitao.shi@mediatek.com
Implement the DP HDP debounce described in DP 1.4a 3.3.
Signed-off-by: Jitao Shi jitao.shi@mediatek.com Signed-off-by: Guillaume Ranquet granquet@baylibre.com
Reviewed-by: Rex-BC Chen rex-bc.chen@mediatek.com
drivers/gpu/drm/mediatek/mtk_dp.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/drivers/gpu/drm/mediatek/mtk_dp.c b/drivers/gpu/drm/mediatek/mtk_dp.c index 2a3d5f15b651b..fe91ab8b2fd89 100644 --- a/drivers/gpu/drm/mediatek/mtk_dp.c +++ b/drivers/gpu/drm/mediatek/mtk_dp.c @@ -178,6 +178,8 @@ struct mtk_dp { struct device *codec_dev; u8 connector_eld[MAX_ELD_BYTES]; struct drm_connector *conn;
- bool need_debounce;
- struct timer_list debounce_timer;
};
static struct regmap_config mtk_dp_regmap_config = { @@ -1698,6 +1700,9 @@ static irqreturn_t mtk_dp_hpd_event_thread(int hpd, void *dev) if (event < 0) return IRQ_HANDLED;
- if (mtk_dp->need_debounce && mtk_dp-
train_info.cable_plugged_in)
msleep(100);
- if (mtk_dp->drm_dev) { dev_info(mtk_dp->dev, "drm_helper_hpd_irq_event\n"); drm_helper_hpd_irq_event(mtk_dp->bridge.dev);
@@ -1776,6 +1781,13 @@ static irqreturn_t mtk_dp_hpd_isr_handler(struct mtk_dp *mtk_dp) } train_info->cable_state_change = true;
- if (train_info->cable_state_change) {
if (!train_info->cable_plugged_in) {
mod_timer(&mtk_dp->debounce_timer, jiffies +
msecs_to_jiffies(100) - 1);
mtk_dp->need_debounce = false;
}
- }
- return IRQ_WAKE_THREAD;
}
@@ -2239,6 +2251,13 @@ static const struct drm_bridge_funcs mtk_dp_bridge_funcs = { .detect = mtk_dp_bdg_detect, };
+static void mtk_dp_debounce_timer(struct timer_list *t) +{
- struct mtk_dp *mtk_dp = from_timer(mtk_dp, t, debounce_timer);
- mtk_dp->need_debounce = true;
+}
static int mtk_dp_probe(struct platform_device *pdev) { struct mtk_dp *mtk_dp; @@ -2319,6 +2338,9 @@ static int mtk_dp_probe(struct platform_device *pdev) else mtk_dp->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
- mtk_dp->need_debounce = true;
- timer_setup(&mtk_dp->debounce_timer, mtk_dp_debounce_timer, 0);
- pm_runtime_enable(dev); pm_runtime_get_sync(dev);
@@ -2332,6 +2354,7 @@ static int mtk_dp_remove(struct platform_device *pdev) platform_device_unregister(mtk_dp->phy_dev);
mtk_dp_video_mute(mtk_dp, true);
del_timer_sync(&mtk_dp->debounce_timer);
pm_runtime_disable(&pdev->dev);