gpu: ipu-v3: dp: fix CSC handling
Initialize the flow input colorspaces to unknown and reset to that value when the channel gets disabled. This avoids the state getting mixed up with a previous mode. Also keep the CSC settings for the background flow intact when disabling the foreground flow. Root-caused-by: Jonathan Marek <jonathan@marek.ca> Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
dc4060a5dc
commit
d4fad0a426
|
@ -195,7 +195,8 @@ int ipu_dp_setup_channel(struct ipu_dp *dp,
|
||||||
ipu_dp_csc_init(flow, flow->foreground.in_cs, flow->out_cs,
|
ipu_dp_csc_init(flow, flow->foreground.in_cs, flow->out_cs,
|
||||||
DP_COM_CONF_CSC_DEF_BOTH);
|
DP_COM_CONF_CSC_DEF_BOTH);
|
||||||
} else {
|
} else {
|
||||||
if (flow->foreground.in_cs == flow->out_cs)
|
if (flow->foreground.in_cs == IPUV3_COLORSPACE_UNKNOWN ||
|
||||||
|
flow->foreground.in_cs == flow->out_cs)
|
||||||
/*
|
/*
|
||||||
* foreground identical to output, apply color
|
* foreground identical to output, apply color
|
||||||
* conversion on background
|
* conversion on background
|
||||||
|
@ -261,6 +262,8 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
||||||
struct ipu_dp_priv *priv = flow->priv;
|
struct ipu_dp_priv *priv = flow->priv;
|
||||||
u32 reg, csc;
|
u32 reg, csc;
|
||||||
|
|
||||||
|
dp->in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||||
|
|
||||||
if (!dp->foreground)
|
if (!dp->foreground)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -268,8 +271,9 @@ void ipu_dp_disable_channel(struct ipu_dp *dp, bool sync)
|
||||||
|
|
||||||
reg = readl(flow->base + DP_COM_CONF);
|
reg = readl(flow->base + DP_COM_CONF);
|
||||||
csc = reg & DP_COM_CONF_CSC_DEF_MASK;
|
csc = reg & DP_COM_CONF_CSC_DEF_MASK;
|
||||||
if (csc == DP_COM_CONF_CSC_DEF_FG)
|
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
||||||
reg &= ~DP_COM_CONF_CSC_DEF_MASK;
|
if (csc == DP_COM_CONF_CSC_DEF_BOTH || csc == DP_COM_CONF_CSC_DEF_BG)
|
||||||
|
reg |= DP_COM_CONF_CSC_DEF_BG;
|
||||||
|
|
||||||
reg &= ~DP_COM_CONF_FG_EN;
|
reg &= ~DP_COM_CONF_FG_EN;
|
||||||
writel(reg, flow->base + DP_COM_CONF);
|
writel(reg, flow->base + DP_COM_CONF);
|
||||||
|
@ -347,6 +351,8 @@ int ipu_dp_init(struct ipu_soc *ipu, struct device *dev, unsigned long base)
|
||||||
mutex_init(&priv->mutex);
|
mutex_init(&priv->mutex);
|
||||||
|
|
||||||
for (i = 0; i < IPUV3_NUM_FLOWS; i++) {
|
for (i = 0; i < IPUV3_NUM_FLOWS; i++) {
|
||||||
|
priv->flow[i].background.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||||
|
priv->flow[i].foreground.in_cs = IPUV3_COLORSPACE_UNKNOWN;
|
||||||
priv->flow[i].foreground.foreground = true;
|
priv->flow[i].foreground.foreground = true;
|
||||||
priv->flow[i].base = priv->base + ipu_dp_flow_base[i];
|
priv->flow[i].base = priv->base + ipu_dp_flow_base[i];
|
||||||
priv->flow[i].priv = priv;
|
priv->flow[i].priv = priv;
|
||||||
|
|
Loading…
Reference in New Issue