mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 17:12:50 -04:00
drm/msm/dp: move more AUX functions to dp_aux.c
Move several misnamed functions accessing AUX bus to dp_aux.c, further cleaning up dp_catalog submodule. Reviewed-by: Stephen Boyd <swboyd@chromium.org> Tested-by: Stephen Boyd <swboyd@chromium.org> # sc7180-trogdor Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/654333/ Link: https://lore.kernel.org/r/20250518-fd-dp-audio-fixup-v6-9-2f0ec3ec000d@oss.qualcomm.com
This commit is contained in:
committed by
Dmitry Baryshkov
parent
2b3d6611b2
commit
e30cab9dd6
@@ -403,7 +403,7 @@ static ssize_t msm_dp_aux_transfer(struct drm_dp_aux *msm_dp_aux,
|
||||
phy_calibrate(aux->phy);
|
||||
}
|
||||
/* reset aux if link is in connected state */
|
||||
if (msm_dp_catalog_link_is_connected(aux->catalog))
|
||||
if (msm_dp_aux_is_link_connected(msm_dp_aux))
|
||||
msm_dp_aux_reset(aux);
|
||||
} else {
|
||||
aux->retry_cnt = 0;
|
||||
@@ -591,6 +591,98 @@ static int msm_dp_wait_hpd_asserted(struct drm_dp_aux *msm_dp_aux,
|
||||
return ret;
|
||||
}
|
||||
|
||||
void msm_dp_aux_hpd_enable(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
u32 reg;
|
||||
|
||||
/* Configure REFTIMER and enable it */
|
||||
reg = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER);
|
||||
reg |= DP_DP_HPD_REFTIMER_ENABLE;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER, reg);
|
||||
|
||||
/* Enable HPD */
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN);
|
||||
}
|
||||
|
||||
void msm_dp_aux_hpd_disable(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
u32 reg;
|
||||
|
||||
reg = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER);
|
||||
reg &= ~DP_DP_HPD_REFTIMER_ENABLE;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER, reg);
|
||||
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_CTRL, 0);
|
||||
}
|
||||
|
||||
void msm_dp_aux_hpd_intr_enable(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
u32 reg;
|
||||
|
||||
reg = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK);
|
||||
reg |= DP_DP_HPD_INT_MASK;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK,
|
||||
reg & DP_DP_HPD_INT_MASK);
|
||||
}
|
||||
|
||||
void msm_dp_aux_hpd_intr_disable(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
u32 reg;
|
||||
|
||||
reg = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK);
|
||||
reg &= ~DP_DP_HPD_INT_MASK;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK,
|
||||
reg & DP_DP_HPD_INT_MASK);
|
||||
}
|
||||
|
||||
u32 msm_dp_aux_get_hpd_intr_status(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
int isr, mask;
|
||||
|
||||
isr = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_STATUS);
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_ACK,
|
||||
(isr & DP_DP_HPD_INT_MASK));
|
||||
mask = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK);
|
||||
|
||||
/*
|
||||
* We only want to return interrupts that are unmasked to the caller.
|
||||
* However, the interrupt status field also contains other
|
||||
* informational bits about the HPD state status, so we only mask
|
||||
* out the part of the register that tells us about which interrupts
|
||||
* are pending.
|
||||
*/
|
||||
return isr & (mask | ~DP_DP_HPD_INT_MASK);
|
||||
}
|
||||
|
||||
u32 msm_dp_aux_is_link_connected(struct drm_dp_aux *msm_dp_aux)
|
||||
{
|
||||
struct msm_dp_aux_private *aux =
|
||||
container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux);
|
||||
struct msm_dp_catalog *msm_dp_catalog = aux->catalog;
|
||||
u32 status;
|
||||
|
||||
status = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_STATUS);
|
||||
status >>= DP_DP_HPD_STATE_STATUS_BITS_SHIFT;
|
||||
status &= DP_DP_HPD_STATE_STATUS_BITS_MASK;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
struct drm_dp_aux *msm_dp_aux_get(struct device *dev, struct msm_dp_catalog *catalog,
|
||||
struct phy *phy,
|
||||
bool is_edp)
|
||||
|
||||
@@ -17,6 +17,13 @@ void msm_dp_aux_init(struct drm_dp_aux *msm_dp_aux);
|
||||
void msm_dp_aux_deinit(struct drm_dp_aux *msm_dp_aux);
|
||||
void msm_dp_aux_reconfig(struct drm_dp_aux *msm_dp_aux);
|
||||
|
||||
void msm_dp_aux_hpd_enable(struct drm_dp_aux *msm_dp_aux);
|
||||
void msm_dp_aux_hpd_disable(struct drm_dp_aux *msm_dp_aux);
|
||||
void msm_dp_aux_hpd_intr_enable(struct drm_dp_aux *msm_dp_aux);
|
||||
void msm_dp_aux_hpd_intr_disable(struct drm_dp_aux *msm_dp_aux);
|
||||
u32 msm_dp_aux_get_hpd_intr_status(struct drm_dp_aux *msm_dp_aux);
|
||||
u32 msm_dp_aux_is_link_connected(struct drm_dp_aux *msm_dp_aux);
|
||||
|
||||
struct phy;
|
||||
struct drm_dp_aux *msm_dp_aux_get(struct device *dev, struct msm_dp_catalog *catalog,
|
||||
struct phy *phy,
|
||||
|
||||
@@ -85,8 +85,8 @@ u32 msm_dp_catalog_aux_get_irq(struct msm_dp_catalog *msm_dp_catalog)
|
||||
intr &= ~DP_INTERRUPT_STATUS1_MASK;
|
||||
intr_ack = (intr & DP_INTERRUPT_STATUS1)
|
||||
<< DP_INTERRUPT_STATUS_ACK_SHIFT;
|
||||
msm_dp_write_ahb(msm_dp_catalog, REG_DP_INTR_STATUS, intr_ack |
|
||||
DP_INTERRUPT_STATUS1_MASK);
|
||||
msm_dp_write_ahb(msm_dp_catalog, REG_DP_INTR_STATUS,
|
||||
intr_ack | DP_INTERRUPT_STATUS1_MASK);
|
||||
|
||||
return intr;
|
||||
|
||||
@@ -106,77 +106,6 @@ void msm_dp_catalog_ctrl_enable_irq(struct msm_dp_catalog *msm_dp_catalog,
|
||||
}
|
||||
}
|
||||
|
||||
void msm_dp_catalog_hpd_config_intr(struct msm_dp_catalog *msm_dp_catalog,
|
||||
u32 intr_mask, bool en)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
|
||||
u32 config = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK);
|
||||
|
||||
config = (en ? config | intr_mask : config & ~intr_mask);
|
||||
|
||||
drm_dbg_dp(catalog->drm_dev, "intr_mask=%#x config=%#x\n",
|
||||
intr_mask, config);
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK,
|
||||
config & DP_DP_HPD_INT_MASK);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_ctrl_hpd_enable(struct msm_dp_catalog *msm_dp_catalog)
|
||||
{
|
||||
u32 reftimer = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER);
|
||||
|
||||
/* Configure REFTIMER and enable it */
|
||||
reftimer |= DP_DP_HPD_REFTIMER_ENABLE;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER, reftimer);
|
||||
|
||||
/* Enable HPD */
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_ctrl_hpd_disable(struct msm_dp_catalog *msm_dp_catalog)
|
||||
{
|
||||
u32 reftimer = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER);
|
||||
|
||||
reftimer &= ~DP_DP_HPD_REFTIMER_ENABLE;
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_REFTIMER, reftimer);
|
||||
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_CTRL, 0);
|
||||
}
|
||||
|
||||
u32 msm_dp_catalog_link_is_connected(struct msm_dp_catalog *msm_dp_catalog)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
u32 status;
|
||||
|
||||
status = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_STATUS);
|
||||
drm_dbg_dp(catalog->drm_dev, "aux status: %#x\n", status);
|
||||
status >>= DP_DP_HPD_STATE_STATUS_BITS_SHIFT;
|
||||
status &= DP_DP_HPD_STATE_STATUS_BITS_MASK;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
u32 msm_dp_catalog_hpd_get_intr_status(struct msm_dp_catalog *msm_dp_catalog)
|
||||
{
|
||||
int isr, mask;
|
||||
|
||||
isr = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_STATUS);
|
||||
msm_dp_write_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_ACK,
|
||||
(isr & DP_DP_HPD_INT_MASK));
|
||||
mask = msm_dp_read_aux(msm_dp_catalog, REG_DP_DP_HPD_INT_MASK);
|
||||
|
||||
/*
|
||||
* We only want to return interrupts that are unmasked to the caller.
|
||||
* However, the interrupt status field also contains other
|
||||
* informational bits about the HPD state status, so we only mask
|
||||
* out the part of the register that tells us about which interrupts
|
||||
* are pending.
|
||||
*/
|
||||
return isr & (mask | ~DP_DP_HPD_INT_MASK);
|
||||
}
|
||||
|
||||
u32 msm_dp_catalog_ctrl_read_psr_interrupt_status(struct msm_dp_catalog *msm_dp_catalog)
|
||||
{
|
||||
u32 intr, intr_ack;
|
||||
|
||||
@@ -117,12 +117,6 @@ u32 msm_dp_catalog_aux_get_irq(struct msm_dp_catalog *msm_dp_catalog);
|
||||
|
||||
/* DP Controller APIs */
|
||||
void msm_dp_catalog_ctrl_enable_irq(struct msm_dp_catalog *msm_dp_catalog, bool enable);
|
||||
void msm_dp_catalog_hpd_config_intr(struct msm_dp_catalog *msm_dp_catalog,
|
||||
u32 intr_mask, bool en);
|
||||
void msm_dp_catalog_ctrl_hpd_enable(struct msm_dp_catalog *msm_dp_catalog);
|
||||
void msm_dp_catalog_ctrl_hpd_disable(struct msm_dp_catalog *msm_dp_catalog);
|
||||
u32 msm_dp_catalog_link_is_connected(struct msm_dp_catalog *msm_dp_catalog);
|
||||
u32 msm_dp_catalog_hpd_get_intr_status(struct msm_dp_catalog *msm_dp_catalog);
|
||||
int msm_dp_catalog_ctrl_get_interrupt(struct msm_dp_catalog *msm_dp_catalog);
|
||||
void msm_dp_catalog_ctrl_config_psr_interrupt(struct msm_dp_catalog *msm_dp_catalog);
|
||||
u32 msm_dp_catalog_ctrl_read_psr_interrupt_status(struct msm_dp_catalog *msm_dp_catalog);
|
||||
|
||||
@@ -2206,7 +2206,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl)
|
||||
break;
|
||||
} else if (training_step == DP_TRAINING_1) {
|
||||
/* link train_1 failed */
|
||||
if (!msm_dp_catalog_link_is_connected(ctrl->catalog))
|
||||
if (!msm_dp_aux_is_link_connected(ctrl->aux))
|
||||
break;
|
||||
|
||||
drm_dp_dpcd_read_link_status(ctrl->aux, link_status);
|
||||
@@ -2231,7 +2231,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl)
|
||||
}
|
||||
} else if (training_step == DP_TRAINING_2) {
|
||||
/* link train_2 failed */
|
||||
if (!msm_dp_catalog_link_is_connected(ctrl->catalog))
|
||||
if (!msm_dp_aux_is_link_connected(ctrl->aux))
|
||||
break;
|
||||
|
||||
drm_dp_dpcd_read_link_status(ctrl->aux, link_status);
|
||||
|
||||
@@ -1148,7 +1148,7 @@ static irqreturn_t msm_dp_display_irq_handler(int irq, void *dev_id)
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
hpd_isr_status = msm_dp_catalog_hpd_get_intr_status(dp->catalog);
|
||||
hpd_isr_status = msm_dp_aux_get_hpd_intr_status(dp->aux);
|
||||
|
||||
if (hpd_isr_status & 0x0F) {
|
||||
drm_dbg_dp(dp->drm_dev, "type=%d isr=0x%x\n",
|
||||
@@ -1363,7 +1363,7 @@ static int msm_dp_pm_runtime_suspend(struct device *dev)
|
||||
|
||||
if (dp->msm_dp_display.is_edp) {
|
||||
msm_dp_display_host_phy_exit(dp);
|
||||
msm_dp_catalog_ctrl_hpd_disable(dp->catalog);
|
||||
msm_dp_aux_hpd_disable(dp->aux);
|
||||
}
|
||||
msm_dp_display_host_deinit(dp);
|
||||
|
||||
@@ -1384,7 +1384,7 @@ static int msm_dp_pm_runtime_resume(struct device *dev)
|
||||
*/
|
||||
msm_dp_display_host_init(dp);
|
||||
if (dp->msm_dp_display.is_edp) {
|
||||
msm_dp_catalog_ctrl_hpd_enable(dp->catalog);
|
||||
msm_dp_aux_hpd_enable(dp->aux);
|
||||
msm_dp_display_host_phy_init(dp);
|
||||
}
|
||||
|
||||
@@ -1671,10 +1671,8 @@ void msm_dp_bridge_hpd_enable(struct drm_bridge *bridge)
|
||||
return;
|
||||
}
|
||||
|
||||
msm_dp_catalog_ctrl_hpd_enable(dp->catalog);
|
||||
|
||||
/* enable HDP interrupts */
|
||||
msm_dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, true);
|
||||
msm_dp_aux_hpd_enable(dp->aux);
|
||||
msm_dp_aux_hpd_intr_enable(dp->aux);
|
||||
|
||||
msm_dp_display->internal_hpd = true;
|
||||
mutex_unlock(&dp->event_mutex);
|
||||
@@ -1687,9 +1685,9 @@ void msm_dp_bridge_hpd_disable(struct drm_bridge *bridge)
|
||||
struct msm_dp_display_private *dp = container_of(msm_dp_display, struct msm_dp_display_private, msm_dp_display);
|
||||
|
||||
mutex_lock(&dp->event_mutex);
|
||||
/* disable HDP interrupts */
|
||||
msm_dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false);
|
||||
msm_dp_catalog_ctrl_hpd_disable(dp->catalog);
|
||||
|
||||
msm_dp_aux_hpd_intr_disable(dp->aux);
|
||||
msm_dp_aux_hpd_disable(dp->aux);
|
||||
|
||||
msm_dp_display->internal_hpd = false;
|
||||
|
||||
|
||||
@@ -175,7 +175,7 @@ int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel,
|
||||
if (!msm_dp_panel->drm_edid) {
|
||||
DRM_ERROR("panel edid read failed\n");
|
||||
/* check edid read fail is due to unplug */
|
||||
if (!msm_dp_catalog_link_is_connected(panel->catalog)) {
|
||||
if (!msm_dp_aux_is_link_connected(panel->aux)) {
|
||||
rc = -ETIMEDOUT;
|
||||
goto end;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user