Commit 85840c76 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'imx-drm-fixes-2015-01-28' of git://git.pengutronix.de/git/pza/linux into drm-next

imx-drm fixes for IPUv3 DC and i.MX5 IPUv3 IC and TVE

- Corrected handling of wait_for_completion_timeout return value
  when disabling IPUv3 DC channels
- Fixed error return value propagation in TVE mode_set
- Fixed IPUv3 register offsets for IC module on i.MX51 and i.MX53

* tag 'imx-drm-fixes-2015-01-28' of git://git.pengutronix.de/git/pza/linux:
  gpu: ipu-v3: Fix IC control register offset
  drm: imx: imx-tve: Check and propagate the errors
  gpu: ipu-v3: wait_for_completion_timeout does not return negative status
parents 79a44c16 a49e7c0d
...@@ -191,10 +191,18 @@ static int tve_setup_vga(struct imx_tve *tve) ...@@ -191,10 +191,18 @@ static int tve_setup_vga(struct imx_tve *tve)
/* set gain to (1 + 10/128) to provide 0.7V peak-to-peak amplitude */ /* set gain to (1 + 10/128) to provide 0.7V peak-to-peak amplitude */
ret = regmap_update_bits(tve->regmap, TVE_TVDAC0_CONT_REG, ret = regmap_update_bits(tve->regmap, TVE_TVDAC0_CONT_REG,
TVE_TVDAC_GAIN_MASK, 0x0a); TVE_TVDAC_GAIN_MASK, 0x0a);
if (ret)
return ret;
ret = regmap_update_bits(tve->regmap, TVE_TVDAC1_CONT_REG, ret = regmap_update_bits(tve->regmap, TVE_TVDAC1_CONT_REG,
TVE_TVDAC_GAIN_MASK, 0x0a); TVE_TVDAC_GAIN_MASK, 0x0a);
if (ret)
return ret;
ret = regmap_update_bits(tve->regmap, TVE_TVDAC2_CONT_REG, ret = regmap_update_bits(tve->regmap, TVE_TVDAC2_CONT_REG,
TVE_TVDAC_GAIN_MASK, 0x0a); TVE_TVDAC_GAIN_MASK, 0x0a);
if (ret)
return ret;
/* set configuration register */ /* set configuration register */
mask = TVE_DATA_SOURCE_MASK | TVE_INP_VIDEO_FORM; mask = TVE_DATA_SOURCE_MASK | TVE_INP_VIDEO_FORM;
...@@ -204,16 +212,12 @@ static int tve_setup_vga(struct imx_tve *tve) ...@@ -204,16 +212,12 @@ static int tve_setup_vga(struct imx_tve *tve)
mask |= TVE_TV_OUT_MODE_MASK | TVE_SYNC_CH_0_EN; mask |= TVE_TV_OUT_MODE_MASK | TVE_SYNC_CH_0_EN;
val |= TVE_TV_OUT_RGB | TVE_SYNC_CH_0_EN; val |= TVE_TV_OUT_RGB | TVE_SYNC_CH_0_EN;
ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, mask, val); ret = regmap_update_bits(tve->regmap, TVE_COM_CONF_REG, mask, val);
if (ret < 0) { if (ret)
dev_err(tve->dev, "failed to set configuration: %d\n", ret);
return ret; return ret;
}
/* set test mode (as documented) */ /* set test mode (as documented) */
ret = regmap_update_bits(tve->regmap, TVE_TST_MODE_REG, return regmap_update_bits(tve->regmap, TVE_TST_MODE_REG,
TVE_TVDAC_TEST_MODE_MASK, 1); TVE_TVDAC_TEST_MODE_MASK, 1);
return 0;
} }
static enum drm_connector_status imx_tve_connector_detect( static enum drm_connector_status imx_tve_connector_detect(
...@@ -335,9 +339,11 @@ static void imx_tve_encoder_mode_set(struct drm_encoder *encoder, ...@@ -335,9 +339,11 @@ static void imx_tve_encoder_mode_set(struct drm_encoder *encoder,
} }
if (tve->mode == TVE_MODE_VGA) if (tve->mode == TVE_MODE_VGA)
tve_setup_vga(tve); ret = tve_setup_vga(tve);
else else
tve_setup_tvout(tve); ret = tve_setup_tvout(tve);
if (ret)
dev_err(tve->dev, "failed to set configuration: %d\n", ret);
} }
static void imx_tve_encoder_commit(struct drm_encoder *encoder) static void imx_tve_encoder_commit(struct drm_encoder *encoder)
...@@ -671,6 +677,8 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data) ...@@ -671,6 +677,8 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
/* disable cable detection for VGA mode */ /* disable cable detection for VGA mode */
ret = regmap_write(tve->regmap, TVE_CD_CONT_REG, 0); ret = regmap_write(tve->regmap, TVE_CD_CONT_REG, 0);
if (ret)
return ret;
ret = imx_tve_register(drm, tve); ret = imx_tve_register(drm, tve);
if (ret) if (ret)
......
...@@ -742,7 +742,7 @@ static struct ipu_devtype ipu_type_imx51 = { ...@@ -742,7 +742,7 @@ static struct ipu_devtype ipu_type_imx51 = {
.tpm_ofs = 0x1f060000, .tpm_ofs = 0x1f060000,
.csi0_ofs = 0x1f030000, .csi0_ofs = 0x1f030000,
.csi1_ofs = 0x1f038000, .csi1_ofs = 0x1f038000,
.ic_ofs = 0x1f020000, .ic_ofs = 0x1e020000,
.disp0_ofs = 0x1e040000, .disp0_ofs = 0x1e040000,
.disp1_ofs = 0x1e048000, .disp1_ofs = 0x1e048000,
.dc_tmpl_ofs = 0x1f080000, .dc_tmpl_ofs = 0x1f080000,
...@@ -758,7 +758,7 @@ static struct ipu_devtype ipu_type_imx53 = { ...@@ -758,7 +758,7 @@ static struct ipu_devtype ipu_type_imx53 = {
.tpm_ofs = 0x07060000, .tpm_ofs = 0x07060000,
.csi0_ofs = 0x07030000, .csi0_ofs = 0x07030000,
.csi1_ofs = 0x07038000, .csi1_ofs = 0x07038000,
.ic_ofs = 0x07020000, .ic_ofs = 0x06020000,
.disp0_ofs = 0x06040000, .disp0_ofs = 0x06040000,
.disp1_ofs = 0x06048000, .disp1_ofs = 0x06048000,
.dc_tmpl_ofs = 0x07080000, .dc_tmpl_ofs = 0x07080000,
......
...@@ -277,7 +277,8 @@ static irqreturn_t dc_irq_handler(int irq, void *dev_id) ...@@ -277,7 +277,8 @@ static irqreturn_t dc_irq_handler(int irq, void *dev_id)
void ipu_dc_disable_channel(struct ipu_dc *dc) void ipu_dc_disable_channel(struct ipu_dc *dc)
{ {
struct ipu_dc_priv *priv = dc->priv; struct ipu_dc_priv *priv = dc->priv;
int irq, ret; int irq;
unsigned long ret;
u32 val; u32 val;
/* TODO: Handle MEM_FG_SYNC differently from MEM_BG_SYNC */ /* TODO: Handle MEM_FG_SYNC differently from MEM_BG_SYNC */
...@@ -292,7 +293,7 @@ void ipu_dc_disable_channel(struct ipu_dc *dc) ...@@ -292,7 +293,7 @@ void ipu_dc_disable_channel(struct ipu_dc *dc)
enable_irq(irq); enable_irq(irq);
ret = wait_for_completion_timeout(&priv->comp, msecs_to_jiffies(50)); ret = wait_for_completion_timeout(&priv->comp, msecs_to_jiffies(50));
disable_irq(irq); disable_irq(irq);
if (ret <= 0) { if (ret == 0) {
dev_warn(priv->dev, "DC stop timeout after 50 ms\n"); dev_warn(priv->dev, "DC stop timeout after 50 ms\n");
val = readl(dc->base + DC_WR_CH_CONF); val = readl(dc->base + DC_WR_CH_CONF);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment