return ret;
}
+static struct rk_hdmi_drvdata rk3036_hdmi_drvdata = {
+ .soc_type = HDMI_SOC_RK3036,
+};
+
+static struct rk_hdmi_drvdata rk312x_hdmi_drvdata = {
+ .soc_type = HDMI_SOC_RK312X,
+};
+
#if defined(CONFIG_OF)
static const struct of_device_id rk3036_hdmi_of_match[] = {
- {.compatible = "rockchip,rk3036-hdmi",},
- {.compatible = "rockchip,rk312x-hdmi",},
+ {.compatible = "rockchip,rk3036-hdmi",
+ .data = (void *)&rk3036_hdmi_drvdata, },
+ {.compatible = "rockchip,rk312x-hdmi",
+ .data = (void *)&rk312x_hdmi_drvdata,},
{}
};
int ret;
struct hdmi *hdmi_drv;
struct resource *res;
+ const struct of_device_id *match;
+ struct device_node *node = pdev->dev.of_node;
hdmi_dev = devm_kzalloc(&pdev->dev, sizeof(struct rk_hdmi_device),
GFP_KERNEL);
platform_set_drvdata(pdev, hdmi_dev);
spin_lock_init(&hdmi_dev->reg_lock);
+ match = of_match_node(rk3036_hdmi_of_match, node);
+ hdmi_drv->data = (struct rk_hdmi_drvdata*)match->data;
+ dev_info(hdmi_drv->dev, "%s,type=%d\n",
+ __func__,hdmi_drv->data->soc_type);
+
+
#ifdef CONFIG_SWITCH
hdmi_drv->switch_hdmi.name = "hdmi";
switch_dev_register(&(hdmi_drv->switch_hdmi));
unsigned char vic, unsigned char output_color)
{
int i;
+ int avi_color_mode;
char info[SIZE_AVI_INFOFRAME];
struct rk_hdmi_device *hdmi_dev = container_of(hdmi_drv,
struct rk_hdmi_device,
info[1] = 0x02;
info[2] = 0x0D;
info[3] = info[0] + info[1] + info[2];
- info[4] = (AVI_COLOR_MODE_RGB << 5);
+
+ if (output_color == VIDEO_OUTPUT_RGB444)
+ avi_color_mode = AVI_COLOR_MODE_RGB;
+ else if(output_color == VIDEO_OUTPUT_YCBCR444)
+ avi_color_mode = AVI_COLOR_MODE_YCBCR444;
+ else if(output_color == VIDEO_OUTPUT_YCBCR422)
+ avi_color_mode = AVI_COLOR_MODE_YCBCR422;
+
+ info[4] = (avi_color_mode << 5);
info[5] =
(AVI_COLORIMETRY_NO_DATA << 6) | (AVI_CODED_FRAME_ASPECT_NO_DATA <<
4) |
return -1;
}
- /* Output RGB as default */
- vpara->output_color = VIDEO_OUTPUT_RGB444;
+ if (hdmi_drv->data->soc_type == HDMI_SOC_RK3036) {
+ vpara->input_color = VIDEO_INPUT_COLOR_RGB;
+ vpara->output_color = VIDEO_OUTPUT_RGB444;/*rk3036 vop only can output rgb fmt*/
+ } else if (hdmi_drv->data->soc_type == HDMI_SOC_RK312X)
+ vpara->input_color = VIDEO_INPUT_COLOR_YCBCR444;/*rk3128 vop can output yuv444 fmt*/
+
if (hdmi_drv->pwr_mode == LOWER_PWR)
rk3036_hdmi_set_pwr_mode(hdmi_drv, NORMAL);
HDMI_SOURCE_LCDC1 = 1
};
+enum {
+ HDMI_SOC_RK3036,
+ HDMI_SOC_RK312X,
+ HDMI_SOC_RK3288
+};
/*
* If HDMI_ENABLE, system will auto configure output mode according to EDID
* If HDMI_DISABLE, system will output mode according to
*/
};
+struct rk_hdmi_drvdata {
+ u8 soc_type;
+ u32 reversed;
+};
+
struct hdmi {
struct device *dev;
int id;
int irq;
struct rk_lcdc_driver *lcdc;
+ struct rk_hdmi_drvdata *data;
#ifdef CONFIG_SWITCH
struct switch_dev switch_hdmi;