+int rk3288_hdmi_config_vsi(struct hdmi *hdmi_drv, unsigned char vic_3d, unsigned char format, int auto_send)
+{
+ int i = 0;
+ unsigned char data[3] = {0};
+ int id = 0x000c03;
+ struct rk3288_hdmi_device *hdmi_dev = container_of(hdmi_drv, struct rk3288_hdmi_device, driver);
+
+ hdmi_dbg(hdmi_drv->dev, "[%s] vic %d format %d.\n", __FUNCTION__, vic, format);
+ hdmi_msk_reg(hdmi_dev, FC_DATAUTO0, m_VSD_AUTO, v_VSD_AUTO(0));
+ hdmi_writel(hdmi_dev, FC_VSDIEEEID0, id & 0xff);
+ hdmi_writel(hdmi_dev, FC_VSDIEEEID1, (id >> 8) & 0xff);
+ hdmi_writel(hdmi_dev, FC_VSDIEEEID2, (id >> 16) & 0xff);
+
+ data[0] = format << 5; //PB4 --HDMI_Video_Format
+ switch(format)
+ {
+ case HDMI_VIDEO_FORMAT_4Kx2K:
+ data[1] = vic_3d; //PB5--HDMI_VIC
+ data[2] = 0;
+ break;
+ case HDMI_VIDEO_FORMAT_3D:
+ data[1] = vic_3d << 4; //PB5--3D_Structure field
+ data[2] = 0; //PB6--3D_Ext_Data field
+ break;
+ default:
+ data[1] = 0;
+ data[2] = 0;
+ break;
+ }
+
+ for (i = 0; i < 3; i++) {
+ hdmi_writel(hdmi_dev, FC_VSDPAYLOAD0 + i, data[i]);
+ }
+
+ if (auto_send) {
+ hdmi_msk_reg(hdmi_dev, FC_DATAUTO0, m_VSD_AUTO, v_VSD_AUTO(auto_send));
+ }
+ else {
+ hdmi_msk_reg(hdmi_dev, FC_DATMAN, m_VSD_MAN, v_VSD_MAN(1));
+ }
+
+ return 0;
+}
+