irq_hpd interrupt should be handled after dongle plugged in and before dongle unplugged. Hence irq_hpd interrupt is enabled at the end of the plugin handle and disabled at the beginning of unplugged handle. Current irq_hpd with sink_count = 0 is wrongly handled same as the dongle unplugged which tears down the mainlink and disables the phy. This patch fixes this problem by only tearing down the mainlink but keeping phy enabled at irq_hpd with sink_count = 0 handle so that next irq_hpd with sink_count =1 can be handled by setup mainlink only. This patch also set dongle into D3 (power off) state at end of handling irq_hpd with sink_count = 0. Changes in v2: -- add ctrl->phy_Power_count Changes in v3: -- del ctrl->phy_Power_count -- add phy_power_off to dp_ctrl_off_link_stream() Changes in v4: -- return immediately if clock disable failed at dp_ctrl_off_link_stream() Changes in v5: -- set dongle to D3 (power off) state at dp_ctrl_off_link_stream() Changes in v6: -- add Fixes tag Fixes: ea9f337ce81e ("drm/msm/dp: reset dp controller only at boot up and pm_resume") Signed-off-by: Kuogee Hsieh <khsieh@codeaurora.org> Tested-by: Stephen Boyd <swboyd@chromium.org> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Link: https://lore.kernel.org/r/1621635930-30161-1-git-send-email-khsieh@codeaurora.org Signed-off-by: Rob Clark <robdclark@chromium.org>
39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _DP_CTRL_H_
|
|
#define _DP_CTRL_H_
|
|
|
|
#include "dp_aux.h"
|
|
#include "dp_panel.h"
|
|
#include "dp_link.h"
|
|
#include "dp_parser.h"
|
|
#include "dp_power.h"
|
|
#include "dp_catalog.h"
|
|
|
|
struct dp_ctrl {
|
|
bool orientation;
|
|
atomic_t aborted;
|
|
u32 pixel_rate;
|
|
};
|
|
|
|
int dp_ctrl_host_init(struct dp_ctrl *dp_ctrl, bool flip, bool reset);
|
|
void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl);
|
|
int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl);
|
|
int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl);
|
|
int dp_ctrl_off_link_stream(struct dp_ctrl *dp_ctrl);
|
|
void dp_ctrl_off_phy(struct dp_ctrl *dp_ctrl);
|
|
int dp_ctrl_off(struct dp_ctrl *dp_ctrl);
|
|
void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl);
|
|
void dp_ctrl_isr(struct dp_ctrl *dp_ctrl);
|
|
void dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl);
|
|
struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link,
|
|
struct dp_panel *panel, struct drm_dp_aux *aux,
|
|
struct dp_power *power, struct dp_catalog *catalog,
|
|
struct dp_parser *parser);
|
|
void dp_ctrl_put(struct dp_ctrl *dp_ctrl);
|
|
|
|
#endif /* _DP_CTRL_H_ */
|