Merge remote-tracking branch 'iwlwifi-fixes/master' into NEXT
[sfrench/cifs-2.6.git] / drivers / video / fbdev / omap2 / dss / hdmi5_core.c
index 7528c7a42aa577b9cb4717da528706f8e144347c..83acbf7a8c89c9ddb4df68f9a7fe0d926a0c55d0 100644 (file)
@@ -290,7 +290,6 @@ void hdmi5_core_dump(struct hdmi_core_data *core, struct seq_file *s)
 }
 
 static void hdmi_core_init(struct hdmi_core_vid_config *video_cfg,
-                       struct hdmi_core_infoframe_avi *avi_cfg,
                        struct hdmi_config *cfg)
 {
        DSSDBG("hdmi_core_init\n");
@@ -312,27 +311,8 @@ static void hdmi_core_init(struct hdmi_core_vid_config *video_cfg,
        video_cfg->vblank_osc = 0; /* Always 0 - need to confirm */
        video_cfg->vblank = cfg->timings.vsw +
                                cfg->timings.vfp + cfg->timings.vbp;
-       video_cfg->v_fc_config.cm.mode = cfg->cm.mode;
+       video_cfg->v_fc_config.hdmi_dvi_mode = cfg->hdmi_dvi_mode;
        video_cfg->v_fc_config.timings.interlace = cfg->timings.interlace;
-
-       /* info frame */
-       avi_cfg->db1_format = 0;
-       avi_cfg->db1_active_info = 0;
-       avi_cfg->db1_bar_info_dv = 0;
-       avi_cfg->db1_scan_info = 0;
-       avi_cfg->db2_colorimetry = 0;
-       avi_cfg->db2_aspect_ratio = 0;
-       avi_cfg->db2_active_fmt_ar = 0;
-       avi_cfg->db3_itc = 0;
-       avi_cfg->db3_ec = 0;
-       avi_cfg->db3_q_range = 0;
-       avi_cfg->db3_nup_scaling = 0;
-       avi_cfg->db4_videocode = 0;
-       avi_cfg->db5_pixel_repeat = 0;
-       avi_cfg->db6_7_line_eoftop = 0;
-       avi_cfg->db8_9_line_sofbottom = 0;
-       avi_cfg->db10_11_pixel_eofleft = 0;
-       avi_cfg->db12_13_pixel_sofright = 0;
 }
 
 /* DSS_HDMI_CORE_VIDEO_CONFIG */
@@ -398,7 +378,7 @@ static void hdmi_core_video_config(struct hdmi_core_data *core,
 
        /* select DVI mode */
        REG_FLD_MOD(base, HDMI_CORE_FC_INVIDCONF,
-                       cfg->v_fc_config.cm.mode, 3, 3);
+                       cfg->v_fc_config.hdmi_dvi_mode, 3, 3);
 }
 
 static void hdmi_core_config_video_packetizer(struct hdmi_core_data *core)
@@ -438,24 +418,60 @@ static void hdmi_core_config_video_sampler(struct hdmi_core_data *core)
        REG_FLD_MOD(core->base, HDMI_CORE_TX_INVID0, video_mapping, 4, 0);
 }
 
-static void hdmi_core_aux_infoframe_avi_config(struct hdmi_core_data *core)
+static void hdmi_core_write_avi_infoframe(struct hdmi_core_data *core,
+       struct hdmi_avi_infoframe *frame)
 {
        void __iomem *base = core->base;
-       struct hdmi_core_infoframe_avi avi = core->avi_cfg;
-
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF0, avi.db1_format, 1, 0);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF0, avi.db1_active_info, 6, 6);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF0, avi.db1_bar_info_dv, 3, 2);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF0, avi.db1_scan_info, 5, 4);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF1, avi.db2_colorimetry, 7, 6);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF1, avi.db2_aspect_ratio, 5, 4);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF1, avi.db2_active_fmt_ar, 3, 0);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF2, avi.db3_itc, 7, 7);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF2, avi.db3_ec, 6, 4);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF2, avi.db3_q_range, 3, 2);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVICONF2, avi.db3_nup_scaling, 1, 0);
-       REG_FLD_MOD(base, HDMI_CORE_FC_AVIVID, avi.db4_videocode, 6, 0);
-       REG_FLD_MOD(base, HDMI_CORE_FC_PRCONF, avi.db5_pixel_repeat, 3, 0);
+       u8 data[HDMI_INFOFRAME_SIZE(AVI)];
+       u8 *ptr;
+       unsigned y, a, b, s;
+       unsigned c, m, r;
+       unsigned itc, ec, q, sc;
+       unsigned vic;
+       unsigned yq, cn, pr;
+
+       hdmi_avi_infoframe_pack(frame, data, sizeof(data));
+
+       print_hex_dump_debug("AVI: ", DUMP_PREFIX_NONE, 16, 1, data,
+               HDMI_INFOFRAME_SIZE(AVI), false);
+
+       ptr = data + HDMI_INFOFRAME_HEADER_SIZE;
+
+       y = (ptr[0] >> 5) & 0x3;
+       a = (ptr[0] >> 4) & 0x1;
+       b = (ptr[0] >> 2) & 0x3;
+       s = (ptr[0] >> 0) & 0x3;
+
+       c = (ptr[1] >> 6) & 0x3;
+       m = (ptr[1] >> 4) & 0x3;
+       r = (ptr[1] >> 0) & 0x3;
+
+       itc = (ptr[2] >> 7) & 0x1;
+       ec = (ptr[2] >> 4) & 0x7;
+       q = (ptr[2] >> 2) & 0x3;
+       sc = (ptr[2] >> 0) & 0x3;
+
+       vic = ptr[3];
+
+       yq = (ptr[4] >> 6) & 0x3;
+       cn = (ptr[4] >> 4) & 0x3;
+       pr = (ptr[4] >> 0) & 0xf;
+
+       hdmi_write_reg(base, HDMI_CORE_FC_AVICONF0,
+               (a << 6) | (s << 4) | (b << 2) | (y << 0));
+
+       hdmi_write_reg(base, HDMI_CORE_FC_AVICONF1,
+               (c << 6) | (m << 4) | (r << 0));
+
+       hdmi_write_reg(base, HDMI_CORE_FC_AVICONF2,
+               (itc << 7) | (ec << 4) | (q << 2) | (sc << 0));
+
+       hdmi_write_reg(base, HDMI_CORE_FC_AVIVID, vic);
+
+       hdmi_write_reg(base, HDMI_CORE_FC_AVICONF3,
+               (yq << 2) | (cn << 0));
+
+       REG_FLD_MOD(base, HDMI_CORE_FC_PRCONF, pr, 3, 0);
 }
 
 static void hdmi_core_csc_config(struct hdmi_core_data *core,
@@ -497,10 +513,8 @@ static void hdmi_core_configure_range(struct hdmi_core_data *core)
 
        /* support limited range with 24 bit color depth for now */
        csc_coeff = csc_table_deepcolor[0];
-       core->avi_cfg.db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_LR;
 
        hdmi_core_csc_config(core, csc_coeff);
-       hdmi_core_aux_infoframe_avi_config(core);
 }
 
 static void hdmi_core_enable_video_path(struct hdmi_core_data *core)
@@ -591,11 +605,10 @@ void hdmi5_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
        struct omap_video_timings video_timing;
        struct hdmi_video_format video_format;
        struct hdmi_core_vid_config v_core_cfg;
-       struct hdmi_core_infoframe_avi *avi_cfg = &core->avi_cfg;
 
        hdmi_core_mask_interrupts(core);
 
-       hdmi_core_init(&v_core_cfg, avi_cfg, cfg);
+       hdmi_core_init(&v_core_cfg, cfg);
 
        hdmi_wp_init_vid_fmt_timings(&video_format, &video_timing, cfg);
 
@@ -608,7 +621,9 @@ void hdmi5_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
 
        hdmi_wp_video_config_interface(wp, &video_timing);
 
+       /* support limited range with 24 bit color depth for now */
        hdmi_core_configure_range(core);
+       cfg->infoframe.quantization_range = HDMI_QUANTIZATION_RANGE_LIMITED;
 
        /*
         * configure core video part, set software reset in the core
@@ -621,29 +636,8 @@ void hdmi5_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,
        hdmi_core_config_csc(core);
        hdmi_core_config_video_sampler(core);
 
-       /*
-        * configure packet info frame video see doc CEA861-D page 65
-        */
-       avi_cfg->db1_format = HDMI_INFOFRAME_AVI_DB1Y_RGB;
-       avi_cfg->db1_active_info =
-                       HDMI_INFOFRAME_AVI_DB1A_ACTIVE_FORMAT_OFF;
-       avi_cfg->db1_bar_info_dv = HDMI_INFOFRAME_AVI_DB1B_NO;
-       avi_cfg->db1_scan_info = HDMI_INFOFRAME_AVI_DB1S_0;
-       avi_cfg->db2_colorimetry = HDMI_INFOFRAME_AVI_DB2C_NO;
-       avi_cfg->db2_aspect_ratio = HDMI_INFOFRAME_AVI_DB2M_NO;
-       avi_cfg->db2_active_fmt_ar = HDMI_INFOFRAME_AVI_DB2R_SAME;
-       avi_cfg->db3_itc = HDMI_INFOFRAME_AVI_DB3ITC_NO;
-       avi_cfg->db3_ec = HDMI_INFOFRAME_AVI_DB3EC_XVYUV601;
-       avi_cfg->db3_q_range = HDMI_INFOFRAME_AVI_DB3Q_DEFAULT;
-       avi_cfg->db3_nup_scaling = HDMI_INFOFRAME_AVI_DB3SC_NO;
-       avi_cfg->db4_videocode = cfg->cm.code;
-       avi_cfg->db5_pixel_repeat = HDMI_INFOFRAME_AVI_DB5PR_NO;
-       avi_cfg->db6_7_line_eoftop = 0;
-       avi_cfg->db8_9_line_sofbottom = 0;
-       avi_cfg->db10_11_pixel_eofleft = 0;
-       avi_cfg->db12_13_pixel_sofright = 0;
-
-       hdmi_core_aux_infoframe_avi_config(core);
+       if (cfg->hdmi_dvi_mode == HDMI_HDMI)
+               hdmi_core_write_avi_infoframe(core, &cfg->infoframe);
 
        hdmi_core_enable_video_path(core);