diff options
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_edid.c | 118 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_edid.h | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_tx.c | 170 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_tx.h | 6 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_util.c | 124 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_util.h | 13 | ||||
| -rw-r--r-- | include/uapi/video/msm_hdmi_modes.h | 125 |
7 files changed, 365 insertions, 194 deletions
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_edid.c b/drivers/video/fbdev/msm/mdss_hdmi_edid.c index deec2471977e..4014589d3ab2 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_edid.c +++ b/drivers/video/fbdev/msm/mdss_hdmi_edid.c @@ -227,9 +227,6 @@ static ssize_t hdmi_edid_sysfs_rda_modes(struct device *dev, struct disp_mode_info *video_mode = edid_ctrl->sink_data.disp_mode_list; for (i = 0; i < edid_ctrl->sink_data.num_of_elements; i++) { - if (!hdmi_get_supported_mode( - video_mode[i].video_format)) - continue; if (ret > 0) ret += scnprintf(buf + ret, PAGE_SIZE - ret, ",%d", video_mode[i].video_format); @@ -558,12 +555,15 @@ static void hdmi_edid_set_y420_support(struct hdmi_edid_ctrl *edid_ctrl, } } -static void hdmi_edid_add_sink_y420_format(struct hdmi_edid_sink_data *sink, +static void hdmi_edid_add_sink_y420_format(struct hdmi_edid_ctrl *edid_ctrl, u32 video_format) { - const struct msm_hdmi_mode_timing_info *timing = - hdmi_get_supported_mode(video_format); - u32 supported = timing != NULL; + struct msm_hdmi_mode_timing_info timing = {0}; + u32 ret = hdmi_get_supported_mode(&timing, + edid_ctrl->init_data.ds_data, + video_format); + u32 supported = timing.supported; + struct hdmi_edid_sink_data *sink = &edid_ctrl->sink_data; if (video_format >= HDMI_VFRMT_MAX) { DEV_ERR("%s: video format: %s is not supported\n", __func__, @@ -580,7 +580,7 @@ static void hdmi_edid_add_sink_y420_format(struct hdmi_edid_sink_data *sink, video_format, msm_hdmi_mode_2string(video_format), supported ? "Supported" : "Not-Supported"); - if (supported) { + if (!ret && supported) { sink->disp_mode_list[sink->num_of_elements].video_format = video_format; sink->disp_mode_list[sink->num_of_elements].y420_support @@ -606,8 +606,7 @@ static void hdmi_edid_parse_Y420VDB(struct hdmi_edid_ctrl *edid_ctrl, in_buf += 2; for (i = 0; i < len; i++) { video_format = *in_buf & 0x7F; - hdmi_edid_add_sink_y420_format(&edid_ctrl->sink_data, - video_format); + hdmi_edid_add_sink_y420_format(edid_ctrl, video_format); } } @@ -1005,7 +1004,8 @@ static u32 hdmi_edid_check_header(const u8 *edid_buf) && (edid_buf[6] == 0xff) && (edid_buf[7] == 0x00); } /* hdmi_edid_check_header */ -static void hdmi_edid_detail_desc(const u8 *data_buf, u32 *disp_mode) +static void hdmi_edid_detail_desc(struct hdmi_edid_ctrl *edid_ctrl, + const u8 *data_buf, u32 *disp_mode) { u32 aspect_ratio_4_3 = false; u32 interlaced = false; @@ -1090,23 +1090,25 @@ static void hdmi_edid_detail_desc(const u8 *data_buf, u32 *disp_mode) *disp_mode = HDMI_VFRMT_FORCE_32BIT; for (ndx = HDMI_VFRMT_UNKNOWN + 1; ndx < HDMI_VFRMT_MAX; ndx++) { - const struct msm_hdmi_mode_timing_info *timing = NULL; - timing = hdmi_get_supported_mode(ndx); + struct msm_hdmi_mode_timing_info timing = {0}; + u32 ret = hdmi_get_supported_mode(&timing, + edid_ctrl->init_data.ds_data, + ndx); - if (!timing) + if (ret || !timing.supported) continue; - if ((interlaced == timing->interlaced) && - (active_h == timing->active_h) && - (blank_h == (timing->front_porch_h + - timing->pulse_width_h + - timing->back_porch_h)) && - (blank_v == (timing->front_porch_v + - timing->pulse_width_v + - timing->back_porch_v)) && - ((active_v == timing->active_v) || - (active_v == (timing->active_v + 1)))) { - *disp_mode = timing->video_format; + if ((interlaced == timing.interlaced) && + (active_h == timing.active_h) && + (blank_h == (timing.front_porch_h + + timing.pulse_width_h + + timing.back_porch_h)) && + (blank_v == (timing.front_porch_v + + timing.pulse_width_v + + timing.back_porch_v)) && + ((active_v == timing.active_v) || + (active_v == (timing.active_v + 1)))) { + *disp_mode = timing.video_format; /* * There can be 16:9 and 4:3 aspect ratio of same @@ -1115,10 +1117,10 @@ static void hdmi_edid_detail_desc(const u8 *data_buf, u32 *disp_mode) */ if (aspect_ratio_4_3 && - (timing->ar != HDMI_RES_AR_4_3)) + (timing.ar != HDMI_RES_AR_4_3)) continue; else if (!aspect_ratio_4_3 && - (timing->ar == HDMI_RES_AR_4_3)) + (timing.ar == HDMI_RES_AR_4_3)) continue; else break; @@ -1154,12 +1156,15 @@ static void hdmi_edid_add_sink_3d_format(struct hdmi_edid_sink_data *sink_data, string, added ? "added" : "NOT added"); } /* hdmi_edid_add_sink_3d_format */ -static void hdmi_edid_add_sink_video_format( - struct hdmi_edid_sink_data *sink_data, u32 video_format) +static void hdmi_edid_add_sink_video_format(struct hdmi_edid_ctrl *edid_ctrl, + u32 video_format) { - const struct msm_hdmi_mode_timing_info *timing = - hdmi_get_supported_mode(video_format); - u32 supported = timing != NULL; + struct msm_hdmi_mode_timing_info timing = {0}; + u32 ret = hdmi_get_supported_mode(&timing, + edid_ctrl->init_data.ds_data, + video_format); + u32 supported = timing.supported; + struct hdmi_edid_sink_data *sink_data = &edid_ctrl->sink_data; struct disp_mode_info *disp_mode_list = sink_data->disp_mode_list; if (video_format >= HDMI_VFRMT_MAX) { @@ -1172,7 +1177,7 @@ static void hdmi_edid_add_sink_video_format( video_format, msm_hdmi_mode_2string(video_format), supported ? "Supported" : "Not-Supported"); - if (supported) { + if (!ret && supported) { /* todo: MHL */ disp_mode_list[sink_data->num_of_elements].video_format = video_format; @@ -1364,7 +1369,7 @@ static void hdmi_edid_get_extended_video_formats( for (i = 0; i < hdmi_vic_len; i++) { video_format = HDMI_VFRMT_END + vsd[offset + 2 + i]; - hdmi_edid_add_sink_video_format(&edid_ctrl->sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, video_format); } } @@ -1409,7 +1414,7 @@ static void hdmi_edid_parse_et3(struct hdmi_edid_ctrl *edid_ctrl, iter++; if (edid_blk0[iter] & BIT(3)) { pr_debug("%s: DMT 848x480@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_848x480p60_16_9); } @@ -1417,13 +1422,13 @@ static void hdmi_edid_parse_et3(struct hdmi_edid_ctrl *edid_ctrl, iter++; if (edid_blk0[iter] & BIT(1)) { pr_debug("%s: DMT 1280x1024@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1280x1024p60_5_4); } if (edid_blk0[iter] & BIT(3)) { pr_debug("%s: DMT 1280x960@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1280x960p60_4_3); } @@ -1431,19 +1436,19 @@ static void hdmi_edid_parse_et3(struct hdmi_edid_ctrl *edid_ctrl, iter++; if (edid_blk0[iter] & BIT(1)) { pr_debug("%s: DMT 1400x1050@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1400x1050p60_4_3); } if (edid_blk0[iter] & BIT(5)) { pr_debug("%s: DMT 1440x900@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1440x900p60_16_10); } if (edid_blk0[iter] & BIT(7)) { pr_debug("%s: DMT 1360x768@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1360x768p60_16_9); } @@ -1451,13 +1456,13 @@ static void hdmi_edid_parse_et3(struct hdmi_edid_ctrl *edid_ctrl, iter++; if (edid_blk0[iter] & BIT(2)) { pr_debug("%s: DMT 1600x1200@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1600x1200p60_4_3); } if (edid_blk0[iter] & BIT(5)) { pr_debug("%s: DMT 1680x1050@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1680x1050p60_16_10); } @@ -1465,7 +1470,7 @@ static void hdmi_edid_parse_et3(struct hdmi_edid_ctrl *edid_ctrl, iter++; if (edid_blk0[iter] & BIT(0)) { pr_debug("%s: DMT 1920x1200@60\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1920x1200p60_16_10); } @@ -1521,7 +1526,7 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, * CEA_861D spec */ video_format = (*svd & 0x7F); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, video_format); /* Make a note of the preferred video format */ if (i == 0) @@ -1561,14 +1566,15 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, * timing descriptor has block size of 18 */ while (4 > i && 0 != edid_blk0[0x36+desc_offset]) { - hdmi_edid_detail_desc(edid_blk0+0x36+desc_offset, + hdmi_edid_detail_desc(edid_ctrl, + edid_blk0+0x36+desc_offset, &video_format); DEV_DBG("[%s:%d] Block-0 Adding vid fmt = [%s]\n", __func__, __LINE__, msm_hdmi_mode_2string(video_format)); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) @@ -1590,14 +1596,15 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, * Read EDID block[0] as above */ while (4 > i && 0 != edid_blk0[0x36+desc_offset]) { - hdmi_edid_detail_desc(edid_blk0+0x36+desc_offset, + hdmi_edid_detail_desc(edid_ctrl, + edid_blk0+0x36+desc_offset, &video_format); DEV_DBG("[%s:%d] Block-0 Adding vid fmt = [%s]\n", __func__, __LINE__, msm_hdmi_mode_2string(video_format)); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) @@ -1623,14 +1630,15 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, */ desc_offset = edid_blk1[0x02]; while (0 != edid_blk1[desc_offset]) { - hdmi_edid_detail_desc(edid_blk1+desc_offset, + hdmi_edid_detail_desc(edid_ctrl, + edid_blk1+desc_offset, &video_format); DEV_DBG("[%s:%d] Block-1 Adding vid fmt = [%s]\n", __func__, __LINE__, msm_hdmi_mode_2string(video_format)); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, video_format); if (video_format == HDMI_VFRMT_640x480p60_4_3) has480p = true; @@ -1652,14 +1660,14 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, (edid_blk0[0x26 + offset + 1] == 0x80)) { pr_debug("%s: 108MHz: off=[%x] stdblk=[%x]\n", __func__, offset, std_blk); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1280x1024p60_5_4); } if ((edid_blk0[0x26 + offset] == 0x61) && (edid_blk0[0x26 + offset + 1] == 0x40)) { pr_debug("%s: 65MHz: off=[%x] stdblk=[%x]\n", __func__, offset, std_blk); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1024x768p60_4_3); break; } else { @@ -1671,7 +1679,7 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, /* Established Timing I */ if (edid_blk0[0x23] & BIT(0)) { pr_debug("%s: DMT: ETI: HDMI_VFRMT_800x600_4_3\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_800x600p60_4_3); } @@ -1679,7 +1687,7 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, if (edid_blk0[0x24] & BIT(3)) { pr_debug("%s: DMT: ETII: HDMI_VFRMT_1024x768p60_4_3\n", __func__); - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_1024x768p60_4_3); } @@ -1727,7 +1735,7 @@ static void hdmi_edid_get_display_mode(struct hdmi_edid_ctrl *edid_ctrl, * All DTV sink devices should support this mode */ if (!has480p) - hdmi_edid_add_sink_video_format(sink_data, + hdmi_edid_add_sink_video_format(edid_ctrl, HDMI_VFRMT_640x480p60_4_3); } /* hdmi_edid_get_display_mode */ diff --git a/drivers/video/fbdev/msm/mdss_hdmi_edid.h b/drivers/video/fbdev/msm/mdss_hdmi_edid.h index 6e796fa7e0a6..d226de74f3de 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_edid.h +++ b/drivers/video/fbdev/msm/mdss_hdmi_edid.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -22,6 +22,7 @@ struct hdmi_edid_init_data { struct kobject *sysfs_kobj; struct hdmi_tx_ddc_ctrl *ddc_ctrl; + struct hdmi_util_ds_data *ds_data; }; int hdmi_edid_read(void *edid_ctrl); diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.c b/drivers/video/fbdev/msm/mdss_hdmi_tx.c index 70cdb45106de..5622a07c7cf7 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_tx.c +++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.c @@ -410,7 +410,12 @@ static int hdmi_tx_get_vic_from_panel_info(struct hdmi_tx_ctrl *hdmi_ctrl, } if (pinfo->vic) { - if (hdmi_get_supported_mode(pinfo->vic)) { + struct msm_hdmi_mode_timing_info info = {0}; + u32 ret = hdmi_get_supported_mode(&info, + &hdmi_ctrl->ds_data, pinfo->vic); + u32 supported = info.supported; + + if (!ret && supported) { new_vic = pinfo->vic; DEV_DBG("%s: %s is supported\n", __func__, msm_hdmi_mode_2string(new_vic)); @@ -451,7 +456,7 @@ static int hdmi_tx_get_vic_from_panel_info(struct hdmi_tx_ctrl *hdmi_ctrl, DEV_DBG("%s: pixel_freq=%d refresh_rate=%d\n", __func__, timing.pixel_freq, timing.refresh_rate); - new_vic = hdmi_get_video_id_code(&timing); + new_vic = hdmi_get_video_id_code(&timing, &hdmi_ctrl->ds_data); } return new_vic; @@ -680,7 +685,7 @@ static ssize_t hdmi_tx_sysfs_wta_hpd(struct device *dev, return rc; } - if (hdmi_ctrl->mhl_max_pclk && hpd && + if (hdmi_ctrl->ds_registered && hpd && (!hdmi_ctrl->mhl_hpd_on || hdmi_ctrl->hpd_feature_on)) return 0; @@ -956,6 +961,72 @@ static ssize_t hdmi_tx_sysfs_wta_avi_cn_bits(struct device *dev, return ret; } /* hdmi_tx_sysfs_wta_cn_bits */ +static ssize_t hdmi_tx_sysfs_wta_res_info(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc, res_info_id; + ssize_t ret = strnlen(buf, PAGE_SIZE); + struct hdmi_tx_ctrl *hdmi_ctrl = NULL; + + hdmi_ctrl = hdmi_tx_get_drvdata_from_sysfs_dev(dev); + + if (!hdmi_ctrl) { + DEV_ERR("%s: invalid input\n", __func__); + return -EINVAL; + } + + rc = kstrtoint(buf, 10, &res_info_id); + if (rc) { + DEV_ERR("%s: kstrtoint failed. rc=%d\n", __func__, rc); + return rc; + } + + if (res_info_id >= 0 && res_info_id < HDMI_VFRMT_MAX) + hdmi_ctrl->res_info_id = res_info_id; + else + hdmi_ctrl->res_info_id = 0; + + DEV_DBG("%s: %d\n", __func__, hdmi_ctrl->res_info_id); + return ret; +} + +static ssize_t hdmi_tx_sysfs_rda_res_info(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t ret; + struct msm_hdmi_mode_timing_info info = {0}; + struct hdmi_tx_ctrl *hdmi_ctrl = + hdmi_tx_get_drvdata_from_sysfs_dev(dev); + u32 size = sizeof(info) < PAGE_SIZE ? sizeof(info) : PAGE_SIZE; + + if (!hdmi_ctrl) { + DEV_ERR("%s: invalid input\n", __func__); + return -EINVAL; + } + + if (!hdmi_ctrl->res_info_id) + return -EINVAL; + + ret = hdmi_get_supported_mode(&info, &hdmi_ctrl->ds_data, + hdmi_ctrl->res_info_id); + + if (ret) + return -EINVAL; + + memcpy(buf, &info, size); + + DEV_DBG("%s: %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", + __func__, + info.video_format, info.active_h, info.front_porch_h, + info.pulse_width_h, info.back_porch_h, info.active_low_h, + info.active_v, info.front_porch_v, info.pulse_width_v, + info.back_porch_v, info.active_low_v, info.pixel_freq, + info.refresh_rate, info.interlaced, info.supported, + info.ar); + + return size; +} + static DEVICE_ATTR(connected, S_IRUGO, hdmi_tx_sysfs_rda_connected, NULL); static DEVICE_ATTR(video_mode, S_IRUGO, hdmi_tx_sysfs_rda_video_mode, NULL); static DEVICE_ATTR(hpd, S_IRUGO | S_IWUSR, hdmi_tx_sysfs_rda_hpd, @@ -967,6 +1038,8 @@ static DEVICE_ATTR(product_description, S_IRUGO | S_IWUSR, hdmi_tx_sysfs_wta_product_description); static DEVICE_ATTR(avi_itc, S_IWUSR, NULL, hdmi_tx_sysfs_wta_avi_itc); static DEVICE_ATTR(avi_cn0_1, S_IWUSR, NULL, hdmi_tx_sysfs_wta_avi_cn_bits); +static DEVICE_ATTR(res_info, S_IRUGO | S_IWUSR, hdmi_tx_sysfs_rda_res_info, + hdmi_tx_sysfs_wta_res_info); static struct attribute *hdmi_tx_fs_attrs[] = { &dev_attr_connected.attr, @@ -976,6 +1049,7 @@ static struct attribute *hdmi_tx_fs_attrs[] = { &dev_attr_product_description.attr, &dev_attr_avi_itc.attr, &dev_attr_avi_cn0_1.attr, + &dev_attr_res_info.attr, NULL, }; static struct attribute_group hdmi_tx_fs_attrs_group = { @@ -1150,6 +1224,7 @@ static int hdmi_tx_init_features(struct hdmi_tx_ctrl *hdmi_ctrl) edid_init_data.mutex = &hdmi_ctrl->mutex; edid_init_data.sysfs_kobj = hdmi_ctrl->kobj; edid_init_data.ddc_ctrl = &hdmi_ctrl->ddc_ctrl; + edid_init_data.ds_data = &hdmi_ctrl->ds_data; hdmi_ctrl->feature_data[HDMI_TX_FEAT_EDID] = hdmi_edid_init(&edid_init_data); @@ -1217,31 +1292,33 @@ static inline u32 hdmi_tx_is_controller_on(struct hdmi_tx_ctrl *hdmi_ctrl) static int hdmi_tx_init_panel_info(struct hdmi_tx_ctrl *hdmi_ctrl) { struct mdss_panel_info *pinfo; - const struct msm_hdmi_mode_timing_info *timing; + struct msm_hdmi_mode_timing_info timing = {0}; + u32 ret; if (!hdmi_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } - timing = hdmi_get_supported_mode(hdmi_ctrl->vid_cfg.vic); + ret = hdmi_get_supported_mode(&timing, &hdmi_ctrl->ds_data, + hdmi_ctrl->vid_cfg.vic); pinfo = &hdmi_ctrl->panel_data.panel_info; - if (!timing || !pinfo) { + if (ret || !timing.supported || !pinfo) { DEV_ERR("%s: invalid timing data\n", __func__); return -EINVAL; } - pinfo->xres = timing->active_h; - pinfo->yres = timing->active_v; - pinfo->clk_rate = timing->pixel_freq*1000; + pinfo->xres = timing.active_h; + pinfo->yres = timing.active_v; + pinfo->clk_rate = timing.pixel_freq * 1000; - pinfo->lcdc.h_back_porch = timing->back_porch_h; - pinfo->lcdc.h_front_porch = timing->front_porch_h; - pinfo->lcdc.h_pulse_width = timing->pulse_width_h; - pinfo->lcdc.v_back_porch = timing->back_porch_v; - pinfo->lcdc.v_front_porch = timing->front_porch_v; - pinfo->lcdc.v_pulse_width = timing->pulse_width_v; + pinfo->lcdc.h_back_porch = timing.back_porch_h; + pinfo->lcdc.h_front_porch = timing.front_porch_h; + pinfo->lcdc.h_pulse_width = timing.pulse_width_h; + pinfo->lcdc.v_back_porch = timing.back_porch_v; + pinfo->lcdc.v_front_porch = timing.front_porch_v; + pinfo->lcdc.v_pulse_width = timing.pulse_width_v; pinfo->type = DTV_PANEL; pinfo->pdest = DISPLAY_2; @@ -1258,30 +1335,6 @@ static int hdmi_tx_init_panel_info(struct hdmi_tx_ctrl *hdmi_ctrl) return 0; } /* hdmi_tx_init_panel_info */ -/* Table tuned to indicate video formats supported by the MHL Tx */ -/* Valid pclk rates (Mhz): 25.2, 27, 27.03, 74.25 */ -static void hdmi_tx_setup_mhl_video_mode_lut(struct hdmi_tx_ctrl *hdmi_ctrl) -{ - u32 i; - struct msm_hdmi_mode_timing_info *temp_timing; - - if (!hdmi_ctrl->mhl_max_pclk) { - DEV_WARN("%s: mhl max pclk not set!\n", __func__); - return; - } - DEV_DBG("%s: max mode set to [%u]\n", - __func__, hdmi_ctrl->mhl_max_pclk); - for (i = 0; i < HDMI_VFRMT_MAX; i++) { - temp_timing = - (struct msm_hdmi_mode_timing_info *)hdmi_get_supported_mode(i); - if (!temp_timing) - continue; - /* formats that exceed max mhl line clk bw */ - if (temp_timing->pixel_freq > hdmi_ctrl->mhl_max_pclk) - hdmi_del_supported_mode(i); - } -} /* hdmi_tx_setup_mhl_video_mode_lut */ - static int hdmi_tx_read_sink_info(struct hdmi_tx_ctrl *hdmi_ctrl) { int status; @@ -1406,9 +1459,9 @@ static int hdmi_tx_set_video_fmt(struct hdmi_tx_ctrl *hdmi_ctrl, struct mdss_panel_info *pinfo) { int new_vic = -1; - const struct msm_hdmi_mode_timing_info *timing = NULL; int res_changed = RESOLUTION_UNCHANGED; struct hdmi_video_config *vid_cfg = NULL; + u32 ret; if (!hdmi_ctrl || !pinfo) { DEV_ERR("%s: invalid input\n", __func__); @@ -1430,16 +1483,16 @@ static int hdmi_tx_set_video_fmt(struct hdmi_tx_ctrl *hdmi_ctrl, vid_cfg->vic = (u32)new_vic; - timing = hdmi_get_supported_mode(vid_cfg->vic); + ret = hdmi_get_supported_mode(&vid_cfg->timing, &hdmi_ctrl->ds_data, + vid_cfg->vic); - if (!timing) { + if (ret || !vid_cfg->timing.supported) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } /* Setup AVI Infoframe content */ vid_cfg->vic = new_vic; - vid_cfg->timing = timing; vid_cfg->avi_iframe.pixel_format = pinfo->out_format; vid_cfg->avi_iframe.scan_info = hdmi_edid_get_sink_scaninfo( hdmi_ctrl->feature_data[HDMI_TX_FEAT_EDID], @@ -1448,9 +1501,11 @@ static int hdmi_tx_set_video_fmt(struct hdmi_tx_ctrl *hdmi_ctrl, vid_cfg->avi_iframe.pixel_format = pinfo->out_format; vid_cfg->avi_iframe.bar_info.end_of_top_bar = 0x0; - vid_cfg->avi_iframe.bar_info.start_of_bottom_bar = timing->active_v + 1; + vid_cfg->avi_iframe.bar_info.start_of_bottom_bar = + vid_cfg->timing.active_v + 1; vid_cfg->avi_iframe.bar_info.end_of_left_bar = 0; - vid_cfg->avi_iframe.bar_info.start_of_right_bar = timing->active_h + 1; + vid_cfg->avi_iframe.bar_info.start_of_right_bar = + vid_cfg->timing.active_h + 1; vid_cfg->avi_iframe.act_fmt_info_present = true; vid_cfg->avi_iframe.rgb_quantization_range = HDMI_QUANTIZATION_DEFAULT; @@ -1464,7 +1519,7 @@ static int hdmi_tx_set_video_fmt(struct hdmi_tx_ctrl *hdmi_ctrl, vid_cfg->avi_iframe.pixel_rpt_factor = 0; /* todo: find a better way */ hdmi_ctrl->pdata.power_data[HDMI_TX_CORE_PM].clk_config[0].rate = - timing->pixel_freq * 1000; + vid_cfg->timing.pixel_freq * 1000; hdmi_edid_set_video_resolution( hdmi_ctrl->feature_data[HDMI_TX_FEAT_EDID], vid_cfg->vic); @@ -1482,14 +1537,13 @@ static int hdmi_tx_video_setup(struct hdmi_tx_ctrl *hdmi_ctrl) u32 end_v = 0; u32 div = 0; struct dss_io_data *io = NULL; - const struct msm_hdmi_mode_timing_info *timing = NULL; - + struct msm_hdmi_mode_timing_info *timing = NULL; if (!hdmi_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } - timing = hdmi_ctrl->vid_cfg.timing; + timing = &hdmi_ctrl->vid_cfg.timing; if (timing == NULL) { DEV_ERR("%s: video format not supported: %d\n", __func__, @@ -1562,7 +1616,7 @@ static void hdmi_tx_set_avi_infoframe(struct hdmi_tx_ctrl *hdmi_ctrl) u32 sum, reg_val; struct dss_io_data *io = NULL; struct hdmi_avi_infoframe_config *avi_info; - const struct msm_hdmi_mode_timing_info *timing; + struct msm_hdmi_mode_timing_info *timing; if (!hdmi_ctrl) { DEV_ERR("%s: invalid input\n", __func__); @@ -1571,7 +1625,7 @@ static void hdmi_tx_set_avi_infoframe(struct hdmi_tx_ctrl *hdmi_ctrl) io = &hdmi_ctrl->pdata.io[HDMI_TX_CORE_IO]; avi_info = &hdmi_ctrl->vid_cfg.avi_iframe; - timing = hdmi_ctrl->vid_cfg.timing; + timing = &hdmi_ctrl->vid_cfg.timing; if (!io->base) { DEV_ERR("%s: Core io is not initialized\n", __func__); @@ -2311,8 +2365,8 @@ static int hdmi_tx_audio_acr_setup(struct hdmi_tx_ctrl *hdmi_ctrl, acr_pck_ctrl_reg = DSS_REG_R(io, HDMI_ACR_PKT_CTRL); if (enabled) { - const struct msm_hdmi_mode_timing_info *timing = - hdmi_ctrl->vid_cfg.timing; + struct msm_hdmi_mode_timing_info *timing = + &hdmi_ctrl->vid_cfg.timing; const struct hdmi_tx_audio_acr_arry *audio_acr = &hdmi_tx_audio_acr_lut[0]; const int lut_size = sizeof(hdmi_tx_audio_acr_lut) @@ -2649,12 +2703,13 @@ static int hdmi_tx_set_mhl_max_pclk(struct platform_device *pdev, u32 max_val) return -ENODEV; } if (max_val) { - hdmi_ctrl->mhl_max_pclk = max_val; - hdmi_tx_setup_mhl_video_mode_lut(hdmi_ctrl); + hdmi_ctrl->ds_data.ds_max_clk = max_val; + hdmi_ctrl->ds_data.ds_registered = true; } else { DEV_ERR("%s: invalid max pclk val\n", __func__); return -EINVAL; } + return 0; } @@ -2792,7 +2847,7 @@ static int hdmi_tx_setup_scrambler(struct hdmi_tx_ctrl *hdmi_ctrl) u32 reg_val = 0; bool scrambler_on = false; struct dss_io_data *io = NULL; - const struct msm_hdmi_mode_timing_info *timing = NULL; + struct msm_hdmi_mode_timing_info *timing = NULL; if (!hdmi_ctrl) { DEV_ERR("%s: Bad input parameters\n", __func__); @@ -2805,7 +2860,7 @@ static int hdmi_tx_setup_scrambler(struct hdmi_tx_ctrl *hdmi_ctrl) return -EINVAL; } - timing = hdmi_ctrl->vid_cfg.timing; + timing = &hdmi_ctrl->vid_cfg.timing; if (!timing) { DEV_ERR("%s: Invalid timing info\n", __func__); return -EINVAL; @@ -3406,7 +3461,6 @@ static int hdmi_tx_dev_init(struct hdmi_tx_ctrl *hdmi_ctrl) /* irq enable/disable will be handled in hpd on/off */ hdmi_tx_hw.ptr = (void *)hdmi_ctrl; - hdmi_setup_video_mode_lut(); mutex_init(&hdmi_ctrl->mutex); mutex_init(&hdmi_ctrl->lut_lock); mutex_init(&hdmi_ctrl->cable_notify_mutex); diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.h b/drivers/video/fbdev/msm/mdss_hdmi_tx.h index edfae7c29a72..d6b5fadaf9a7 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_tx.h +++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.h @@ -119,7 +119,7 @@ struct hdmi_avi_infoframe_config { struct hdmi_video_config { u32 vic; - const struct msm_hdmi_mode_timing_info *timing; + struct msm_hdmi_mode_timing_info timing; struct hdmi_avi_infoframe_config avi_iframe; }; @@ -154,9 +154,11 @@ struct hdmi_tx_ctrl { u32 hpd_feature_on; u32 hpd_initialized; u32 vote_hdmi_core_on; + u32 res_info_id; u8 timing_gen_on; - u32 mhl_max_pclk; u8 mhl_hpd_on; + + struct hdmi_util_ds_data ds_data; struct completion hpd_done; struct work_struct hpd_int_work; diff --git a/drivers/video/fbdev/msm/mdss_hdmi_util.c b/drivers/video/fbdev/msm/mdss_hdmi_util.c index 88c26d901ca9..b18c303f67aa 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_util.c +++ b/drivers/video/fbdev/msm/mdss_hdmi_util.c @@ -19,9 +19,6 @@ #define HDMI_SCDC_UNKNOWN_REGISTER "Unknown register" -static struct msm_hdmi_mode_timing_info - hdmi_supported_video_mode_lut[HDMI_VFRMT_MAX]; - static char res_buf[RESOLUTION_NAME_STR_LEN]; static void hdmi_scrambler_status_timer_setup(struct hdmi_tx_ddc_ctrl *ctrl, @@ -82,24 +79,46 @@ static inline char *hdmi_scdc_reg2string(u32 type) } } +int hdmi_get_supported_mode(struct msm_hdmi_mode_timing_info *info, + struct hdmi_util_ds_data *ds_data, u32 mode) +{ + int ret; + + if (!info || !ds_data) + return -EINVAL; + + if (mode >= HDMI_VFRMT_MAX) + return -EINVAL; + + ret = msm_hdmi_get_timing_info(info, mode); + + if (!ret && ds_data && ds_data->ds_registered && ds_data->ds_max_clk) { + if (info->pixel_freq > ds_data->ds_max_clk) + info->supported = false; + } + + return ret; +} /* hdmi_get_supported_mode */ + const char *msm_hdmi_mode_2string(u32 mode) { - static struct msm_hdmi_mode_timing_info *ri; + static struct msm_hdmi_mode_timing_info ri = {0}; char *aspect_ratio; if (mode >= HDMI_VFRMT_MAX) return "???"; - ri = &hdmi_supported_video_mode_lut[mode]; + if (hdmi_get_supported_mode(&ri, NULL, mode)) + return "???"; memset(res_buf, 0, sizeof(res_buf)); - if (!ri->supported) { + if (!ri.supported) { snprintf(res_buf, RESOLUTION_NAME_STR_LEN, "%d", mode); return res_buf; } - switch (ri->ar) { + switch (ri.ar) { case HDMI_RES_AR_4_3: aspect_ratio = "4/3"; break; @@ -117,41 +136,18 @@ const char *msm_hdmi_mode_2string(u32 mode) }; snprintf(res_buf, RESOLUTION_NAME_STR_LEN, "%dx%d %s%dHz %s", - ri->active_h, ri->active_v, ri->interlaced ? "i" : "p", - ri->refresh_rate / 1000, aspect_ratio); + ri.active_h, ri.active_v, ri.interlaced ? "i" : "p", + ri.refresh_rate / 1000, aspect_ratio); return res_buf; } -void hdmi_del_supported_mode(u32 mode) -{ - struct msm_hdmi_mode_timing_info *ret = NULL; - DEV_DBG("%s: removing %s\n", __func__, - msm_hdmi_mode_2string(mode)); - ret = &hdmi_supported_video_mode_lut[mode]; - if (ret != NULL && ret->supported) - ret->supported = false; -} - -const struct msm_hdmi_mode_timing_info *hdmi_get_supported_mode(u32 mode) -{ - const struct msm_hdmi_mode_timing_info *ret = NULL; - - if (mode >= HDMI_VFRMT_MAX) - return NULL; - - ret = &hdmi_supported_video_mode_lut[mode]; - - if (ret == NULL || !ret->supported) - return NULL; - - return ret; -} /* hdmi_get_supported_mode */ - -int hdmi_get_video_id_code(struct msm_hdmi_mode_timing_info *timing_in) +int hdmi_get_video_id_code(struct msm_hdmi_mode_timing_info *timing_in, + struct hdmi_util_ds_data *ds_data) { int i, vic = -1; - struct msm_hdmi_mode_timing_info *supported_timing; + struct msm_hdmi_mode_timing_info supported_timing = {0}; + u32 ret; if (!timing_in) { DEV_ERR("%s: invalid input\n", __func__); @@ -160,45 +156,46 @@ int hdmi_get_video_id_code(struct msm_hdmi_mode_timing_info *timing_in) /* active_low_h, active_low_v and interlaced are not checked against */ for (i = 0; i < HDMI_VFRMT_MAX; i++) { - supported_timing = &hdmi_supported_video_mode_lut[i]; + ret = hdmi_get_supported_mode(&supported_timing, ds_data, i); - if (!supported_timing->supported) + if (ret || !supported_timing.supported) continue; - if (timing_in->active_h != supported_timing->active_h) + if (timing_in->active_h != supported_timing.active_h) continue; - if (timing_in->front_porch_h != supported_timing->front_porch_h) + if (timing_in->front_porch_h != supported_timing.front_porch_h) continue; - if (timing_in->pulse_width_h != supported_timing->pulse_width_h) + if (timing_in->pulse_width_h != supported_timing.pulse_width_h) continue; - if (timing_in->back_porch_h != supported_timing->back_porch_h) + if (timing_in->back_porch_h != supported_timing.back_porch_h) continue; - if (timing_in->active_v != supported_timing->active_v) + if (timing_in->active_v != supported_timing.active_v) continue; - if (timing_in->front_porch_v != supported_timing->front_porch_v) + if (timing_in->front_porch_v != supported_timing.front_porch_v) continue; - if (timing_in->pulse_width_v != supported_timing->pulse_width_v) + if (timing_in->pulse_width_v != supported_timing.pulse_width_v) continue; - if (timing_in->back_porch_v != supported_timing->back_porch_v) + if (timing_in->back_porch_v != supported_timing.back_porch_v) continue; - if (timing_in->pixel_freq != supported_timing->pixel_freq) + if (timing_in->pixel_freq != supported_timing.pixel_freq) continue; - if (timing_in->refresh_rate != supported_timing->refresh_rate) + if (timing_in->refresh_rate != supported_timing.refresh_rate) continue; - vic = (int)supported_timing->video_format; + vic = (int)supported_timing.video_format; break; } if (vic < 0) { for (i = 0; i < HDMI_VFRMT_MAX; i++) { - supported_timing = &hdmi_supported_video_mode_lut[i]; - if (!supported_timing->supported) + ret = hdmi_get_supported_mode(&supported_timing, + ds_data, i); + if (ret || !supported_timing.supported) continue; - if (timing_in->active_h != supported_timing->active_h) + if (timing_in->active_h != supported_timing.active_h) continue; - if (timing_in->active_v != supported_timing->active_v) + if (timing_in->active_v != supported_timing.active_v) continue; - vic = (int)supported_timing->video_format; + vic = (int)supported_timing.video_format; break; } } @@ -215,25 +212,6 @@ exit: return vic; } /* hdmi_get_video_id_code */ -/* Table indicating the video format supported by the HDMI TX Core */ -/* Valid pclk rates (Mhz): 25.2, 27, 27.03, 74.25, 148.5, 268.5, 297 */ -void hdmi_setup_video_mode_lut(void) -{ - MSM_HDMI_MODES_INIT_TIMINGS(hdmi_supported_video_mode_lut); - - /* Add all supported CEA modes to the lut */ - MSM_HDMI_MODES_SET_SUPP_TIMINGS( - hdmi_supported_video_mode_lut, MSM_HDMI_MODES_CEA); - - /* Add all supported extended hdmi modes to the lut */ - MSM_HDMI_MODES_SET_SUPP_TIMINGS( - hdmi_supported_video_mode_lut, MSM_HDMI_MODES_XTND); - - /* Add any other specific DVI timings (DVI modes, etc.) */ - MSM_HDMI_MODES_SET_SUPP_TIMINGS( - hdmi_supported_video_mode_lut, MSM_HDMI_MODES_DVI); -} /* hdmi_setup_video_mode_lut */ - static const char *hdmi_get_single_video_3d_fmt_2string(u32 format) { switch (format) { diff --git a/drivers/video/fbdev/msm/mdss_hdmi_util.h b/drivers/video/fbdev/msm/mdss_hdmi_util.h index f3f510c1d694..bf3b3ff269de 100644 --- a/drivers/video/fbdev/msm/mdss_hdmi_util.h +++ b/drivers/video/fbdev/msm/mdss_hdmi_util.h @@ -311,11 +311,16 @@ struct hdmi_tx_ddc_data { int retry; }; +struct hdmi_util_ds_data { + bool ds_registered; + u32 ds_max_clk; +}; + /* video timing related utility routines */ -void hdmi_setup_video_mode_lut(void); -int hdmi_get_video_id_code(struct msm_hdmi_mode_timing_info *timing_in); -const struct msm_hdmi_mode_timing_info *hdmi_get_supported_mode(u32 mode); -void hdmi_del_supported_mode(u32 mode); +int hdmi_get_video_id_code(struct msm_hdmi_mode_timing_info *timing_in, + struct hdmi_util_ds_data *ds_data); +int hdmi_get_supported_mode(struct msm_hdmi_mode_timing_info *info, + struct hdmi_util_ds_data *ds_data, u32 mode); ssize_t hdmi_get_video_3d_fmt_2string(u32 format, char *buf, u32 size); const char *msm_hdmi_mode_2string(u32 mode); diff --git a/include/uapi/video/msm_hdmi_modes.h b/include/uapi/video/msm_hdmi_modes.h index 28276ea02416..9dbda4f512c3 100644 --- a/include/uapi/video/msm_hdmi_modes.h +++ b/include/uapi/video/msm_hdmi_modes.h @@ -1,6 +1,7 @@ #ifndef _UAPI_MSM_HDMI_MODES_H__ #define _UAPI_MSM_HDMI_MODES_H__ #include <linux/types.h> +#include <linux/errno.h> struct msm_hdmi_mode_timing_info { uint32_t video_format; @@ -259,6 +260,129 @@ static inline void MSM_HDMI_MODES_SET_SUPP_TIMINGS( } } +#define MSM_HDMI_MODES_GET_DETAILS(mode, MODE) do { \ + struct msm_hdmi_mode_timing_info info = MODE##_TIMING; \ + *mode = info; \ + } while (0) + +static inline int msm_hdmi_get_timing_info( + struct msm_hdmi_mode_timing_info *mode, int id) +{ + int ret = 0; + + switch (id) { + case HDMI_VFRMT_640x480p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_640x480p60_4_3); + break; + case HDMI_VFRMT_720x480p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_720x480p60_4_3); + break; + case HDMI_VFRMT_720x480p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_720x480p60_16_9); + break; + case HDMI_VFRMT_1280x720p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1280x720p60_16_9); + break; + case HDMI_VFRMT_1920x1080i60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080i60_16_9); + break; + case HDMI_VFRMT_1440x480i60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1440x480i60_4_3); + break; + case HDMI_VFRMT_1440x480i60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1440x480i60_16_9); + break; + case HDMI_VFRMT_1920x1080p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080p60_16_9); + break; + case HDMI_VFRMT_720x576p50_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_720x576p50_4_3); + break; + case HDMI_VFRMT_720x576p50_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_720x576p50_16_9); + break; + case HDMI_VFRMT_1280x720p50_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1280x720p50_16_9); + break; + case HDMI_VFRMT_1440x576i50_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1440x576i50_4_3); + break; + case HDMI_VFRMT_1440x576i50_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1440x576i50_16_9); + break; + case HDMI_VFRMT_1920x1080p50_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080p50_16_9); + break; + case HDMI_VFRMT_1920x1080p24_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080p24_16_9); + break; + case HDMI_VFRMT_1920x1080p25_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080p25_16_9); + break; + case HDMI_VFRMT_1920x1080p30_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1080p30_16_9); + break; + case HDMI_VFRMT_3840x2160p30_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_3840x2160p30_16_9); + break; + case HDMI_VFRMT_3840x2160p25_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_3840x2160p25_16_9); + break; + case HDMI_VFRMT_3840x2160p24_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_3840x2160p24_16_9); + break; + case HDMI_VFRMT_4096x2160p24_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_4096x2160p24_16_9); + break; + case HDMI_VFRMT_1024x768p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1024x768p60_4_3); + break; + case HDMI_VFRMT_1280x1024p60_5_4: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1280x1024p60_5_4); + break; + case HDMI_VFRMT_2560x1600p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_2560x1600p60_16_9); + break; + case HDMI_VFRMT_800x600p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_800x600p60_4_3); + break; + case HDMI_VFRMT_848x480p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_848x480p60_16_9); + break; + case HDMI_VFRMT_1280x960p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1280x960p60_4_3); + break; + case HDMI_VFRMT_1360x768p60_16_9: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1360x768p60_16_9); + break; + case HDMI_VFRMT_1440x900p60_16_10: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1440x900p60_16_10); + break; + case HDMI_VFRMT_1400x1050p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1400x1050p60_4_3); + break; + case HDMI_VFRMT_1680x1050p60_16_10: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1680x1050p60_16_10); + break; + case HDMI_VFRMT_1600x1200p60_4_3: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1600x1200p60_4_3); + break; + case HDMI_VFRMT_1920x1200p60_16_10: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1920x1200p60_16_10); + break; + case HDMI_VFRMT_1366x768p60_16_10: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1366x768p60_16_10); + break; + case HDMI_VFRMT_1280x800p60_16_10: + MSM_HDMI_MODES_GET_DETAILS(mode, HDMI_VFRMT_1280x800p60_16_10); + break; + default: + ret = -EINVAL; + } + + return ret; +} + static inline int hdmi_tx_get_v_total(const struct msm_hdmi_mode_timing_info *t) { if (t) { @@ -278,5 +402,4 @@ static inline int hdmi_tx_get_h_total(const struct msm_hdmi_mode_timing_info *t) return 0; } - #endif /* _UAPI_MSM_HDMI_MODES_H__ */ |
