aboutsummaryrefslogtreecommitdiff
path: root/drivers/video/mcde/display-av8100.c
diff options
context:
space:
mode:
authorPer Persson <per.xb.persson@stericsson.com>2010-07-02 13:14:25 +0200
committerJohn Rigby <john.rigby@linaro.org>2010-09-02 22:45:50 -0600
commit48d5fa309fc3a106e531528867406d6a3adb3059 (patch)
tree5af714f69b41159cc9dfd4d055c6e6fce20bddfc /drivers/video/mcde/display-av8100.c
parent862ec7d2196b8072487f0a70cc9e56eea3fc8b7b (diff)
HDMI and AV8100: new features
* HDMI api, including EDID, CEC, INFOFRAME, audio coniguration, aes key handling, event support. * Automatic detection and handling of av8100 chip version 1 and 2. * Support for av8100/mcde hw trig method using I2SDAT3 (menuconfig). ST Ericsson Change-Id: WP264235 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/2120 Reviewed-by: Dan JOHANSSON <dan.johansson@stericsson.com> Tested-by: Per PERSSON <per.xb.persson@stericsson.com> Reviewed-by: Marcel TUNNISSEN <marcel.tuennissen@stericsson.com> Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> Change-Id: Ic205e046988fff7a5d49ae3091559d1fd76768d2 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/2841
Diffstat (limited to 'drivers/video/mcde/display-av8100.c')
-rwxr-xr-xdrivers/video/mcde/display-av8100.c244
1 files changed, 106 insertions, 138 deletions
diff --git a/drivers/video/mcde/display-av8100.c b/drivers/video/mcde/display-av8100.c
index 139c36f4d78..6de32c3ddf3 100755
--- a/drivers/video/mcde/display-av8100.c
+++ b/drivers/video/mcde/display-av8100.c
@@ -17,8 +17,8 @@
#include <video/mcde_display.h>
#include <video/mcde_display-av8100.h>
-#include <video/hdmi.h>
#include <video/av8100.h>
+#include <video/hdmi.h>
static int hdmi_try_video_mode(
struct mcde_display_device *ddev, struct mcde_video_mode *video_mode);
@@ -139,6 +139,7 @@ static int hdmi_try_video_mode(
if (found_index != -1) {
res = 0;
+ memset(video_mode, 0, sizeof(struct mcde_video_mode));
memcpy(video_mode, &video_modes_supp[found_index],
sizeof(struct mcde_video_mode));
@@ -165,7 +166,8 @@ static int hdmi_set_video_mode(
int ret = -EINVAL;
bool update = 0;
union av8100_configuration av8100_config;
- struct mcde_display_hdmi_platform_data *pdata;
+ struct mcde_display_hdmi_platform_data *pdata = dev->dev.platform_data;
+ struct av8100_status status;
/* TODO check video_mode_params */
if (dev == NULL || video_mode == NULL) {
@@ -173,8 +175,6 @@ static int hdmi_set_video_mode(
goto out;
}
- pdata = dev->dev.platform_data;
-
dev_vdbg(&dev->dev, "%s:\n", __func__);
dev_vdbg(&dev->dev, "%s:xres:%d yres:%d hbp:%d hfp:%d vbp1:%d vfp1:%d "
"vbp2:%d vfp2:%d interlaced:%d\n", __func__,
@@ -194,49 +194,56 @@ static int hdmi_set_video_mode(
if (dev->port->pixel_format == MCDE_PORTPIXFMT_DSI_YCBCR422)
mcde_chnl_set_col_convert(dev->chnl_state,
&pdata->rgb_2_yCbCr_convert);
-
ret = mcde_chnl_set_video_mode(dev->chnl_state, &dev->video_mode);
if (ret < 0) {
dev_warn(&dev->dev, "Failed to set video mode\n");
goto out;
}
- /* Disable interrupts */
- ret = av8100_disable_interrupt();
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_disable_interrupt failed\n",
+ /* TODO: We shouldn't need to shutdown */
+ status = av8100_status_get();
+ if (status.av8100_state >= AV8100_OPMODE_STANDBY) {
+ /* Disable interrupts */
+ ret = av8100_disable_interrupt();
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev,
+ "%s:av8100_disable_interrupt failed\n",
__func__);
- goto out;
- }
+ goto out;
+ }
- /* TODO: We shouldn't need to shutdown */
- ret = av8100_powerdown();
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "av8100_powerdown failed\n");
- goto out;
- }
- /* TODO: What delay is needed here */
- msleep(10);
+ ret = av8100_powerdown();
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev, "av8100_powerdown failed\n");
+ goto out;
+ }
- ret = av8100_powerup();
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "av8100_powerup failed\n");
- goto out;
+ /* TODO: What delay is needed here */
+ msleep(10);
}
- ret = av8100_download_firmware(NULL, 0, I2C_INTERFACE);
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "av8100_download_firmware failed\n");
- goto out;
+ status = av8100_status_get();
+ if (status.av8100_state < AV8100_OPMODE_STANDBY) {
+ ret = av8100_powerup();
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev, "av8100_powerup failed\n");
+ goto out;
+ }
+
+ ret = av8100_download_firmware(NULL, 0, I2C_INTERFACE);
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev, "av8100_download_firmware failed\n");
+ goto out;
+ }
}
/* Get current av8100 video output format */
- ret = av8100_configuration_get(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
+ ret = av8100_conf_get(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_get "
- "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
- __func__);
+ dev_err(&dev->dev, "%s:av8100_conf_get "
+ "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
+ __func__);
goto out;
}
@@ -260,27 +267,26 @@ static int hdmi_set_video_mode(
if (AV8100_VIDEO_OUTPUT_CEA_VESA_MAX ==
av8100_config.video_output_format.video_output_cea_vesa) {
dev_err(&dev->dev, "%s:video output format not found "
- "\n", __func__);
+ "\n", __func__);
goto out;
}
- ret = av8100_configuration_prepare(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
+ ret = av8100_conf_prep(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev,
- "%s:av8100_configuration_prepare "
- "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
- __func__);
+ dev_err(&dev->dev, "%s:av8100_conf_prep "
+ "AV8100_COMMAND_VIDEO_OUTPUT_FORMAT failed\n",
+ __func__);
goto out;
}
/* Get current av8100 video input format */
- ret = av8100_configuration_get(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
+ ret = av8100_conf_get(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_get "
- "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
- __func__);
+ dev_err(&dev->dev, "%s:av8100_conf_get "
+ "AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
+ __func__);
goto out;
}
@@ -305,26 +311,32 @@ static int hdmi_set_video_mode(
break;
case MCDE_PORTPIXFMT_DSI_YCBCR422:
av8100_config.video_input_format.input_pixel_format =
- AV8100_INPUT_PIX_YCBCR422;
+ /*
+ * The following is expected:
+ * AV8100_INPUT_PIX_YCBCR422;
+ * However 565 is used for now and the colour converter
+ * is used to transform the correct colour.
+ */
+ AV8100_INPUT_PIX_RGB565;
break;
}
/* Set ui_x4 */
av8100_config.video_input_format.ui_x4 = dev->port->phy.dsi.ui;
- ret = av8100_configuration_prepare(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
+ ret = av8100_conf_prep(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
+ dev_err(&dev->dev, "%s:av8100_conf_prep "
"AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
__func__);
goto out;
}
- ret = av8100_configuration_write(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
+ ret = av8100_conf_w(AV8100_COMMAND_VIDEO_INPUT_FORMAT,
NULL, NULL, I2C_INTERFACE);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
+ dev_err(&dev->dev, "%s:av8100_conf_w "
"AV8100_COMMAND_VIDEO_INPUT_FORMAT failed\n",
__func__);
goto out;
@@ -333,108 +345,65 @@ static int hdmi_set_video_mode(
/* TODO: Remove #ifdefs in driver code. This is a dynamic property! */
#ifdef CONFIG_AV8100_SDTV
if (dev->port->pixel_format != MCDE_PORTPIXFMT_DSI_YCBCR422) {
- av8100_config.color_space_conversion_format.c0 = 0xFFDA;
- av8100_config.color_space_conversion_format.c1 = 0xFFB6;
- av8100_config.color_space_conversion_format.c2 = 0x0070;
- av8100_config.color_space_conversion_format.c3 = 0x0042;
- av8100_config.color_space_conversion_format.c4 = 0x0081;
- av8100_config.color_space_conversion_format.c5 = 0x0019;
- av8100_config.color_space_conversion_format.c6 = 0x0070;
- av8100_config.color_space_conversion_format.c7 = 0xFFA2;
- av8100_config.color_space_conversion_format.c8 = 0xFFEE;
- av8100_config.color_space_conversion_format.aoffset = 0x007F;
- av8100_config.color_space_conversion_format.boffset = 0x0010;
- av8100_config.color_space_conversion_format.coffset = 0x007F;
- av8100_config.color_space_conversion_format.lmax = 0xEB;
- av8100_config.color_space_conversion_format.lmin = 0x10;
- av8100_config.color_space_conversion_format.cmax = 0xF0;
- av8100_config.color_space_conversion_format.cmin = 0x10;
-
- ret = av8100_configuration_prepare(
- AV8100_COMMAND_COLORSPACECONVERSION,
- &av8100_config);
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- goto out;
- }
-
- /* TODO make it possible to turn off conl conversion */
- ret = av8100_configuration_write(
- AV8100_COMMAND_COLORSPACECONVERSION,
- NULL, NULL, I2C_INTERFACE);
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- goto out;
- }
-
+ av8100_config.color_space_conversion_format =
+ col_cvt_rgb_to_denc;
+ } else {
+ av8100_config.color_space_conversion_format =
+ col_cvt_yuv422_to_denc;
}
- /* TODO else turn off col converter (needed for dynamic switching */
#else
if (dev->port->pixel_format == MCDE_PORTPIXFMT_DSI_YCBCR422) {
- /* YUV to RGB: std */
- av8100_config.color_space_conversion_format.c0 = 0x012a;
- av8100_config.color_space_conversion_format.c1 = 0x0000;
- av8100_config.color_space_conversion_format.c2 = 0x0199;
- av8100_config.color_space_conversion_format.c3 = 0x012a;
- av8100_config.color_space_conversion_format.c4 = 0xff9c;
- av8100_config.color_space_conversion_format.c5 = 0xff30;
- av8100_config.color_space_conversion_format.c6 = 0x012a;
- av8100_config.color_space_conversion_format.c7 = 0x0204;
- av8100_config.color_space_conversion_format.c8 = 0x0000;
- av8100_config.color_space_conversion_format.aoffset = 0xff21;
- av8100_config.color_space_conversion_format.boffset = 0x0088;
- av8100_config.color_space_conversion_format.coffset = 0xfeeb;
-
- ret = av8100_configuration_prepare(
- AV8100_COMMAND_COLORSPACECONVERSION, &av8100_config);
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- goto out;
- }
+ av8100_config.color_space_conversion_format =
+ col_cvt_yuv422_to_rgb;
+ } else {
+ av8100_config.color_space_conversion_format =
+ col_cvt_identity;
+ }
+#endif
- ret = av8100_configuration_write(
- AV8100_COMMAND_COLORSPACECONVERSION,
- NULL, NULL, I2C_INTERFACE);
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
- "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
- __func__);
- goto out;
- }
+ ret = av8100_conf_prep(
+ AV8100_COMMAND_COLORSPACECONVERSION,
+ &av8100_config);
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev, "%s:av8100_configuration_prepare "
+ "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
+ __func__);
+ goto out;
}
- /* TODO else turn off col converter (needed for dynamic switching */
-#endif
+ ret = av8100_conf_w(
+ AV8100_COMMAND_COLORSPACECONVERSION,
+ NULL, NULL, I2C_INTERFACE);
+ if (ret != AV8100_OK) {
+ dev_err(&dev->dev, "%s:av8100_conf_w "
+ "AV8100_COMMAND_COLORSPACECONVERSION failed\n",
+ __func__);
+ goto out;
+ }
/* Set video output format */
- ret = av8100_configuration_write(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
+ ret = av8100_conf_w(AV8100_COMMAND_VIDEO_OUTPUT_FORMAT,
NULL, NULL, I2C_INTERFACE);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "av8100_configuration_write failed\n");
+ dev_err(&dev->dev, "av8100_conf_w failed\n");
goto out;
}
/* Set audio input format */
- ret = av8100_configuration_write(AV8100_COMMAND_AUDIO_INPUT_FORMAT,
+ ret = av8100_conf_w(AV8100_COMMAND_AUDIO_INPUT_FORMAT,
NULL, NULL, I2C_INTERFACE);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
+ dev_err(&dev->dev, "%s:av8100_conf_w "
"AV8100_COMMAND_AUDIO_INPUT_FORMAT failed\n",
__func__);
goto out;
}
/* Get current av8100 video denc settings format */
- ret = av8100_configuration_get(AV8100_COMMAND_DENC,
+ ret = av8100_conf_get(AV8100_COMMAND_DENC,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_get "
+ dev_err(&dev->dev, "%s:av8100_conf_get "
"AV8100_COMMAND_DENC failed\n", __func__);
goto out;
}
@@ -457,19 +426,19 @@ static int hdmi_set_video_mode(
#else
av8100_config.denc_format.on_off = 0;
#endif
- ret = av8100_configuration_prepare(AV8100_COMMAND_DENC,
+ ret = av8100_conf_prep(AV8100_COMMAND_DENC,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
+ dev_err(&dev->dev, "%s:av8100_conf_prep "
"AV8100_COMMAND_DENC failed\n", __func__);
goto out;
}
/* TODO: prepare depending on OUT fmt */
- ret = av8100_configuration_write(AV8100_COMMAND_DENC,
+ ret = av8100_conf_w(AV8100_COMMAND_DENC,
NULL, NULL, I2C_INTERFACE);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
+ dev_err(&dev->dev, "%s:av8100_conf_w "
"AV8100_COMMAND_DENC failed\n", __func__);
goto out;
}
@@ -494,10 +463,10 @@ static int hdmi_on_first_update(struct mcde_display_device *dev)
av8100_config.hdmi_format.hdmi_format = AV8100_HDMI;
av8100_config.hdmi_format.dvi_format = AV8100_DVI_CTRL_CTL0;
- ret = av8100_configuration_prepare(AV8100_COMMAND_HDMI,
+ ret = av8100_conf_prep(AV8100_COMMAND_HDMI,
&av8100_config);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_prepare "
+ dev_err(&dev->dev, "%s:av8100_conf_prep "
"AV8100_COMMAND_HDMI failed\n", __func__);
goto out;
}
@@ -510,10 +479,10 @@ static int hdmi_on_first_update(struct mcde_display_device *dev)
goto out;
}
- ret = av8100_configuration_write(AV8100_COMMAND_HDMI, NULL,
+ ret = av8100_conf_w(AV8100_COMMAND_HDMI, NULL,
NULL, I2C_INTERFACE);
if (ret != AV8100_OK) {
- dev_err(&dev->dev, "%s:av8100_configuration_write "
+ dev_err(&dev->dev, "%s:av8100_conf_w "
"AV8100_COMMAND_HDMI failed\n", __func__);
goto out;
}
@@ -540,19 +509,18 @@ static int __devinit hdmi_probe(struct mcde_display_device *dev)
goto invalid_port_type;
}
+ /* DSI use clock continous mode if AV8100_CHIPVER_1 > 1 */
+ if (av8100_ver_get() > AV8100_CHIPVER_1)
+ dev->port->phy.dsi.clk_cont = true;
+
dev->prepare_for_update = NULL;
dev->on_first_update = hdmi_on_first_update;
dev->try_video_mode = hdmi_try_video_mode;
dev->set_video_mode = hdmi_set_video_mode;
- ret = av8100_powerup();
- if (ret != AV8100_OK) {
- dev_err(&dev->dev, "av8100_powerup failed\n");
- goto out;
- }
-
dev_info(&dev->dev, "HDMI display probed\n");
+ ret = 0;
goto out;
invalid_port_type:
no_pdata: