|
@@ -30,18 +30,15 @@
|
|
#include <drm/drm_encoder_slave.h>
|
|
#include <drm/drm_encoder_slave.h>
|
|
#include <drm/bridge/dw_hdmi.h>
|
|
#include <drm/bridge/dw_hdmi.h>
|
|
|
|
|
|
|
|
+#include <uapi/linux/media-bus-format.h>
|
|
|
|
+#include <uapi/linux/videodev2.h>
|
|
|
|
+
|
|
#include "dw-hdmi.h"
|
|
#include "dw-hdmi.h"
|
|
#include "dw-hdmi-audio.h"
|
|
#include "dw-hdmi-audio.h"
|
|
|
|
|
|
#define DDC_SEGMENT_ADDR 0x30
|
|
#define DDC_SEGMENT_ADDR 0x30
|
|
#define HDMI_EDID_LEN 512
|
|
#define HDMI_EDID_LEN 512
|
|
|
|
|
|
-#define RGB 0
|
|
|
|
-#define YCBCR444 1
|
|
|
|
-#define YCBCR422_16BITS 2
|
|
|
|
-#define YCBCR422_8BITS 3
|
|
|
|
-#define XVYCC444 4
|
|
|
|
-
|
|
|
|
enum hdmi_datamap {
|
|
enum hdmi_datamap {
|
|
RGB444_8B = 0x01,
|
|
RGB444_8B = 0x01,
|
|
RGB444_10B = 0x03,
|
|
RGB444_10B = 0x03,
|
|
@@ -95,10 +92,10 @@ struct hdmi_vmode {
|
|
};
|
|
};
|
|
|
|
|
|
struct hdmi_data_info {
|
|
struct hdmi_data_info {
|
|
- unsigned int enc_in_format;
|
|
|
|
- unsigned int enc_out_format;
|
|
|
|
- unsigned int enc_color_depth;
|
|
|
|
- unsigned int colorimetry;
|
|
|
|
|
|
+ unsigned int enc_in_bus_format;
|
|
|
|
+ unsigned int enc_out_bus_format;
|
|
|
|
+ unsigned int enc_in_encoding;
|
|
|
|
+ unsigned int enc_out_encoding;
|
|
unsigned int pix_repet_factor;
|
|
unsigned int pix_repet_factor;
|
|
unsigned int hdcp_enable;
|
|
unsigned int hdcp_enable;
|
|
struct hdmi_vmode video_mode;
|
|
struct hdmi_vmode video_mode;
|
|
@@ -567,6 +564,92 @@ void dw_hdmi_audio_disable(struct dw_hdmi *hdmi)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(dw_hdmi_audio_disable);
|
|
EXPORT_SYMBOL_GPL(dw_hdmi_audio_disable);
|
|
|
|
|
|
|
|
+static bool hdmi_bus_fmt_is_rgb(unsigned int bus_format)
|
|
|
|
+{
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_RGB888_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_RGB101010_1X30:
|
|
|
|
+ case MEDIA_BUS_FMT_RGB121212_1X36:
|
|
|
|
+ case MEDIA_BUS_FMT_RGB161616_1X48:
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static bool hdmi_bus_fmt_is_yuv444(unsigned int bus_format)
|
|
|
|
+{
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_YUV8_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV10_1X30:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV12_1X36:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV16_1X48:
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static bool hdmi_bus_fmt_is_yuv422(unsigned int bus_format)
|
|
|
|
+{
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY8_1X16:
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY10_1X20:
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY12_1X24:
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static bool hdmi_bus_fmt_is_yuv420(unsigned int bus_format)
|
|
|
|
+{
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY12_0_5X36:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
|
|
|
|
+ return true;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int hdmi_bus_fmt_color_depth(unsigned int bus_format)
|
|
|
|
+{
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_RGB888_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV8_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY8_1X16:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
|
|
|
|
+ return 8;
|
|
|
|
+
|
|
|
|
+ case MEDIA_BUS_FMT_RGB101010_1X30:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV10_1X30:
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY10_1X20:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
|
|
|
|
+ return 10;
|
|
|
|
+
|
|
|
|
+ case MEDIA_BUS_FMT_RGB121212_1X36:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV12_1X36:
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY12_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY12_0_5X36:
|
|
|
|
+ return 12;
|
|
|
|
+
|
|
|
|
+ case MEDIA_BUS_FMT_RGB161616_1X48:
|
|
|
|
+ case MEDIA_BUS_FMT_YUV16_1X48:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
|
|
|
|
+ return 16;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* this submodule is responsible for the video data synchronization.
|
|
* this submodule is responsible for the video data synchronization.
|
|
* for example, for RGB 4:4:4 input, the data map is defined as
|
|
* for example, for RGB 4:4:4 input, the data map is defined as
|
|
@@ -579,37 +662,49 @@ static void hdmi_video_sample(struct dw_hdmi *hdmi)
|
|
int color_format = 0;
|
|
int color_format = 0;
|
|
u8 val;
|
|
u8 val;
|
|
|
|
|
|
- if (hdmi->hdmi_data.enc_in_format == RGB) {
|
|
|
|
- if (hdmi->hdmi_data.enc_color_depth == 8)
|
|
|
|
- color_format = 0x01;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 10)
|
|
|
|
- color_format = 0x03;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 12)
|
|
|
|
- color_format = 0x05;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 16)
|
|
|
|
- color_format = 0x07;
|
|
|
|
- else
|
|
|
|
- return;
|
|
|
|
- } else if (hdmi->hdmi_data.enc_in_format == YCBCR444) {
|
|
|
|
- if (hdmi->hdmi_data.enc_color_depth == 8)
|
|
|
|
- color_format = 0x09;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 10)
|
|
|
|
- color_format = 0x0B;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 12)
|
|
|
|
- color_format = 0x0D;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 16)
|
|
|
|
- color_format = 0x0F;
|
|
|
|
- else
|
|
|
|
- return;
|
|
|
|
- } else if (hdmi->hdmi_data.enc_in_format == YCBCR422_8BITS) {
|
|
|
|
- if (hdmi->hdmi_data.enc_color_depth == 8)
|
|
|
|
- color_format = 0x16;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 10)
|
|
|
|
- color_format = 0x14;
|
|
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 12)
|
|
|
|
- color_format = 0x12;
|
|
|
|
- else
|
|
|
|
- return;
|
|
|
|
|
|
+ switch (hdmi->hdmi_data.enc_in_bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_RGB888_1X24:
|
|
|
|
+ color_format = 0x01;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_RGB101010_1X30:
|
|
|
|
+ color_format = 0x03;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_RGB121212_1X36:
|
|
|
|
+ color_format = 0x05;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_RGB161616_1X48:
|
|
|
|
+ color_format = 0x07;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case MEDIA_BUS_FMT_YUV8_1X24:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY8_0_5X24:
|
|
|
|
+ color_format = 0x09;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_YUV10_1X30:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY10_0_5X30:
|
|
|
|
+ color_format = 0x0B;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_YUV12_1X36:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY12_0_5X36:
|
|
|
|
+ color_format = 0x0D;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_YUV16_1X48:
|
|
|
|
+ case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
|
|
|
|
+ color_format = 0x0F;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY8_1X16:
|
|
|
|
+ color_format = 0x16;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY10_1X20:
|
|
|
|
+ color_format = 0x14;
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_UYVY12_1X24:
|
|
|
|
+ color_format = 0x12;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
|
|
val = HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE |
|
|
val = HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE |
|
|
@@ -632,26 +727,30 @@ static void hdmi_video_sample(struct dw_hdmi *hdmi)
|
|
|
|
|
|
static int is_color_space_conversion(struct dw_hdmi *hdmi)
|
|
static int is_color_space_conversion(struct dw_hdmi *hdmi)
|
|
{
|
|
{
|
|
- return hdmi->hdmi_data.enc_in_format != hdmi->hdmi_data.enc_out_format;
|
|
|
|
|
|
+ return hdmi->hdmi_data.enc_in_bus_format != hdmi->hdmi_data.enc_out_bus_format;
|
|
}
|
|
}
|
|
|
|
|
|
static int is_color_space_decimation(struct dw_hdmi *hdmi)
|
|
static int is_color_space_decimation(struct dw_hdmi *hdmi)
|
|
{
|
|
{
|
|
- if (hdmi->hdmi_data.enc_out_format != YCBCR422_8BITS)
|
|
|
|
|
|
+ if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format))
|
|
return 0;
|
|
return 0;
|
|
- if (hdmi->hdmi_data.enc_in_format == RGB ||
|
|
|
|
- hdmi->hdmi_data.enc_in_format == YCBCR444)
|
|
|
|
|
|
+
|
|
|
|
+ if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_in_bus_format) ||
|
|
|
|
+ hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_in_bus_format))
|
|
return 1;
|
|
return 1;
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static int is_color_space_interpolation(struct dw_hdmi *hdmi)
|
|
static int is_color_space_interpolation(struct dw_hdmi *hdmi)
|
|
{
|
|
{
|
|
- if (hdmi->hdmi_data.enc_in_format != YCBCR422_8BITS)
|
|
|
|
|
|
+ if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_in_bus_format))
|
|
return 0;
|
|
return 0;
|
|
- if (hdmi->hdmi_data.enc_out_format == RGB ||
|
|
|
|
- hdmi->hdmi_data.enc_out_format == YCBCR444)
|
|
|
|
|
|
+
|
|
|
|
+ if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format) ||
|
|
|
|
+ hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format))
|
|
return 1;
|
|
return 1;
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -662,15 +761,16 @@ static void dw_hdmi_update_csc_coeffs(struct dw_hdmi *hdmi)
|
|
u32 csc_scale = 1;
|
|
u32 csc_scale = 1;
|
|
|
|
|
|
if (is_color_space_conversion(hdmi)) {
|
|
if (is_color_space_conversion(hdmi)) {
|
|
- if (hdmi->hdmi_data.enc_out_format == RGB) {
|
|
|
|
- if (hdmi->hdmi_data.colorimetry ==
|
|
|
|
- HDMI_COLORIMETRY_ITU_601)
|
|
|
|
|
|
+ if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ if (hdmi->hdmi_data.enc_out_encoding ==
|
|
|
|
+ V4L2_YCBCR_ENC_601)
|
|
csc_coeff = &csc_coeff_rgb_out_eitu601;
|
|
csc_coeff = &csc_coeff_rgb_out_eitu601;
|
|
else
|
|
else
|
|
csc_coeff = &csc_coeff_rgb_out_eitu709;
|
|
csc_coeff = &csc_coeff_rgb_out_eitu709;
|
|
- } else if (hdmi->hdmi_data.enc_in_format == RGB) {
|
|
|
|
- if (hdmi->hdmi_data.colorimetry ==
|
|
|
|
- HDMI_COLORIMETRY_ITU_601)
|
|
|
|
|
|
+ } else if (hdmi_bus_fmt_is_rgb(
|
|
|
|
+ hdmi->hdmi_data.enc_in_bus_format)) {
|
|
|
|
+ if (hdmi->hdmi_data.enc_out_encoding ==
|
|
|
|
+ V4L2_YCBCR_ENC_601)
|
|
csc_coeff = &csc_coeff_rgb_in_eitu601;
|
|
csc_coeff = &csc_coeff_rgb_in_eitu601;
|
|
else
|
|
else
|
|
csc_coeff = &csc_coeff_rgb_in_eitu709;
|
|
csc_coeff = &csc_coeff_rgb_in_eitu709;
|
|
@@ -708,16 +808,23 @@ static void hdmi_video_csc(struct dw_hdmi *hdmi)
|
|
else if (is_color_space_decimation(hdmi))
|
|
else if (is_color_space_decimation(hdmi))
|
|
decimation = HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA3;
|
|
decimation = HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA3;
|
|
|
|
|
|
- if (hdmi->hdmi_data.enc_color_depth == 8)
|
|
|
|
|
|
+ switch (hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ case 8:
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP;
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP;
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 10)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 10:
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_30BPP;
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_30BPP;
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 12)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 12:
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_36BPP;
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_36BPP;
|
|
- else if (hdmi->hdmi_data.enc_color_depth == 16)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 16:
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_48BPP;
|
|
color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_48BPP;
|
|
- else
|
|
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
return;
|
|
return;
|
|
|
|
+ }
|
|
|
|
|
|
/* Configure the CSC registers */
|
|
/* Configure the CSC registers */
|
|
hdmi_writeb(hdmi, interpolation | decimation, HDMI_CSC_CFG);
|
|
hdmi_writeb(hdmi, interpolation | decimation, HDMI_CSC_CFG);
|
|
@@ -740,32 +847,43 @@ static void hdmi_video_packetize(struct dw_hdmi *hdmi)
|
|
struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
|
|
struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
|
|
u8 val, vp_conf;
|
|
u8 val, vp_conf;
|
|
|
|
|
|
- if (hdmi_data->enc_out_format == RGB ||
|
|
|
|
- hdmi_data->enc_out_format == YCBCR444) {
|
|
|
|
- if (!hdmi_data->enc_color_depth) {
|
|
|
|
- output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
|
|
|
|
- } else if (hdmi_data->enc_color_depth == 8) {
|
|
|
|
|
|
+ if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format) ||
|
|
|
|
+ hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ switch (hdmi_bus_fmt_color_depth(
|
|
|
|
+ hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ case 8:
|
|
color_depth = 4;
|
|
color_depth = 4;
|
|
output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
|
|
output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
|
|
- } else if (hdmi_data->enc_color_depth == 10) {
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 10:
|
|
color_depth = 5;
|
|
color_depth = 5;
|
|
- } else if (hdmi_data->enc_color_depth == 12) {
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 12:
|
|
color_depth = 6;
|
|
color_depth = 6;
|
|
- } else if (hdmi_data->enc_color_depth == 16) {
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 16:
|
|
color_depth = 7;
|
|
color_depth = 7;
|
|
- } else {
|
|
|
|
- return;
|
|
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
|
|
}
|
|
}
|
|
- } else if (hdmi_data->enc_out_format == YCBCR422_8BITS) {
|
|
|
|
- if (!hdmi_data->enc_color_depth ||
|
|
|
|
- hdmi_data->enc_color_depth == 8)
|
|
|
|
|
|
+ } else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ switch (hdmi_bus_fmt_color_depth(
|
|
|
|
+ hdmi->hdmi_data.enc_out_bus_format)) {
|
|
|
|
+ case 0:
|
|
|
|
+ case 8:
|
|
remap_size = HDMI_VP_REMAP_YCC422_16bit;
|
|
remap_size = HDMI_VP_REMAP_YCC422_16bit;
|
|
- else if (hdmi_data->enc_color_depth == 10)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 10:
|
|
remap_size = HDMI_VP_REMAP_YCC422_20bit;
|
|
remap_size = HDMI_VP_REMAP_YCC422_20bit;
|
|
- else if (hdmi_data->enc_color_depth == 12)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case 12:
|
|
remap_size = HDMI_VP_REMAP_YCC422_24bit;
|
|
remap_size = HDMI_VP_REMAP_YCC422_24bit;
|
|
- else
|
|
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
return;
|
|
return;
|
|
|
|
+ }
|
|
output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422;
|
|
output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422;
|
|
} else {
|
|
} else {
|
|
return;
|
|
return;
|
|
@@ -1148,28 +1266,35 @@ static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
/* Initialise info frame from DRM mode */
|
|
/* Initialise info frame from DRM mode */
|
|
drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
|
|
drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
|
|
|
|
|
|
- if (hdmi->hdmi_data.enc_out_format == YCBCR444)
|
|
|
|
|
|
+ if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format))
|
|
frame.colorspace = HDMI_COLORSPACE_YUV444;
|
|
frame.colorspace = HDMI_COLORSPACE_YUV444;
|
|
- else if (hdmi->hdmi_data.enc_out_format == YCBCR422_8BITS)
|
|
|
|
|
|
+ else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format))
|
|
frame.colorspace = HDMI_COLORSPACE_YUV422;
|
|
frame.colorspace = HDMI_COLORSPACE_YUV422;
|
|
else
|
|
else
|
|
frame.colorspace = HDMI_COLORSPACE_RGB;
|
|
frame.colorspace = HDMI_COLORSPACE_RGB;
|
|
|
|
|
|
/* Set up colorimetry */
|
|
/* Set up colorimetry */
|
|
- if (hdmi->hdmi_data.enc_out_format == XVYCC444) {
|
|
|
|
- frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
|
|
|
- if (hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_601)
|
|
|
|
- frame.extended_colorimetry =
|
|
|
|
|
|
+ switch (hdmi->hdmi_data.enc_out_encoding) {
|
|
|
|
+ case V4L2_YCBCR_ENC_601:
|
|
|
|
+ if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601)
|
|
|
|
+ frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
|
|
|
+ else
|
|
|
|
+ frame.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
|
|
|
+ frame.extended_colorimetry =
|
|
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
|
HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
|
- else /*hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_709*/
|
|
|
|
- frame.extended_colorimetry =
|
|
|
|
|
|
+ case V4L2_YCBCR_ENC_709:
|
|
|
|
+ if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709)
|
|
|
|
+ frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
|
|
|
|
+ else
|
|
|
|
+ frame.colorimetry = HDMI_COLORIMETRY_ITU_709;
|
|
|
|
+ frame.extended_colorimetry =
|
|
HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
|
HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
|
|
- } else if (hdmi->hdmi_data.enc_out_format != RGB) {
|
|
|
|
- frame.colorimetry = hdmi->hdmi_data.colorimetry;
|
|
|
|
- frame.extended_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
|
|
|
- } else { /* Carries no data */
|
|
|
|
- frame.colorimetry = HDMI_COLORIMETRY_NONE;
|
|
|
|
- frame.extended_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
|
|
|
|
|
+ break;
|
|
|
|
+ default: /* Carries no data */
|
|
|
|
+ frame.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
|
|
|
+ frame.extended_colorimetry =
|
|
|
|
+ HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
frame.scan_mode = HDMI_SCAN_MODE_NONE;
|
|
frame.scan_mode = HDMI_SCAN_MODE_NONE;
|
|
@@ -1498,19 +1623,30 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
|
|
(hdmi->vic == 21) || (hdmi->vic == 22) ||
|
|
(hdmi->vic == 21) || (hdmi->vic == 22) ||
|
|
(hdmi->vic == 2) || (hdmi->vic == 3) ||
|
|
(hdmi->vic == 2) || (hdmi->vic == 3) ||
|
|
(hdmi->vic == 17) || (hdmi->vic == 18))
|
|
(hdmi->vic == 17) || (hdmi->vic == 18))
|
|
- hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_601;
|
|
|
|
|
|
+ hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_601;
|
|
else
|
|
else
|
|
- hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_709;
|
|
|
|
|
|
+ hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709;
|
|
|
|
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
|
|
hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;
|
|
|
|
|
|
- /* TODO: Get input format from IPU (via FB driver interface) */
|
|
|
|
- hdmi->hdmi_data.enc_in_format = RGB;
|
|
|
|
|
|
+ /* TOFIX: Get input format from plat data or fallback to RGB888 */
|
|
|
|
+ if (hdmi->plat_data->input_bus_format >= 0)
|
|
|
|
+ hdmi->hdmi_data.enc_in_bus_format =
|
|
|
|
+ hdmi->plat_data->input_bus_format;
|
|
|
|
+ else
|
|
|
|
+ hdmi->hdmi_data.enc_in_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
|
|
|
|
+
|
|
|
|
+ /* TOFIX: Get input encoding from plat data or fallback to none */
|
|
|
|
+ if (hdmi->plat_data->input_bus_encoding >= 0)
|
|
|
|
+ hdmi->hdmi_data.enc_in_encoding =
|
|
|
|
+ hdmi->plat_data->input_bus_encoding;
|
|
|
|
+ else
|
|
|
|
+ hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT;
|
|
|
|
|
|
- hdmi->hdmi_data.enc_out_format = RGB;
|
|
|
|
|
|
+ /* TOFIX: Default to RGB888 output format */
|
|
|
|
+ hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24;
|
|
|
|
|
|
- hdmi->hdmi_data.enc_color_depth = 8;
|
|
|
|
hdmi->hdmi_data.pix_repet_factor = 0;
|
|
hdmi->hdmi_data.pix_repet_factor = 0;
|
|
hdmi->hdmi_data.hdcp_enable = 0;
|
|
hdmi->hdmi_data.hdcp_enable = 0;
|
|
hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
|
|
hdmi->hdmi_data.video_mode.mdataenablepolarity = true;
|