Loading drivers/video/msm/mdss/mdss_hdmi_edid.c +100 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ struct hdmi_edid_ctrl { u16 audio_latency; u16 video_latency; u32 present_3d; u32 page_id; u8 audio_data_block[MAX_NUMBER_ADB * MAX_AUDIO_DATA_BLOCK_SIZE]; int adb_size; u8 spkr_alloc_data_block[MAX_SPKR_ALLOC_DATA_BLOCK_SIZE]; Loading Loading @@ -207,6 +208,102 @@ static ssize_t hdmi_edid_sysfs_rda_modes(struct device *dev, } /* hdmi_edid_sysfs_rda_modes */ static DEVICE_ATTR(edid_modes, S_IRUGO, hdmi_edid_sysfs_rda_modes, NULL); static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int rc, page_id; ssize_t ret = strnlen(buf, PAGE_SIZE); struct hdmi_edid_ctrl *edid_ctrl = hdmi_get_featuredata_from_sysfs_dev(dev, HDMI_TX_FEAT_EDID); if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } rc = kstrtoint(buf, 10, &page_id); if (rc) { DEV_ERR("%s: kstrtoint failed. rc=%d\n", __func__, rc); return rc; } edid_ctrl->page_id = page_id; DEV_DBG("%s: %d\n", __func__, edid_ctrl->page_id); return ret; } static ssize_t hdmi_edid_sysfs_rda_res_info(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t ret; u32 *video_mode; u32 no_of_elem; u32 i = 0, j, page; char *buf_dbg = buf; struct msm_hdmi_mode_timing_info info = {0}; struct hdmi_edid_ctrl *edid_ctrl = hdmi_get_featuredata_from_sysfs_dev(dev, HDMI_TX_FEAT_EDID); u32 size_to_write = sizeof(info); if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } video_mode = edid_ctrl->sink_data.disp_mode_list; no_of_elem = edid_ctrl->sink_data.num_of_elements; if (edid_ctrl->page_id > MSM_HDMI_INIT_RES_PAGE) { page = MSM_HDMI_INIT_RES_PAGE; while (page < edid_ctrl->page_id) { j = 1; while (sizeof(info) * j < PAGE_SIZE) { i++; j++; video_mode++; } page++; } } for (; i < no_of_elem && size_to_write < PAGE_SIZE; i++) { ret = hdmi_get_supported_mode(&info, edid_ctrl->init_data.ds_data, *video_mode++); if (ret || !info.supported) continue; memcpy(buf, &info, sizeof(info)); buf += sizeof(info); size_to_write += sizeof(info); } for (i = sizeof(info); i < size_to_write; i += sizeof(info)) { struct msm_hdmi_mode_timing_info info_dbg = {0}; memcpy(&info_dbg, buf_dbg, sizeof(info_dbg)); DEV_DBG("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", info_dbg.video_format, info_dbg.active_h, info_dbg.front_porch_h, info_dbg.pulse_width_h, info_dbg.back_porch_h, info_dbg.active_low_h, info_dbg.active_v, info_dbg.front_porch_v, info_dbg.pulse_width_v, info_dbg.back_porch_v, info_dbg.active_low_v, info_dbg.pixel_freq, info_dbg.refresh_rate, info_dbg.interlaced, info_dbg.supported, info_dbg.ar); buf_dbg += sizeof(info_dbg); } return size_to_write - sizeof(info); } static DEVICE_ATTR(res_info, S_IRUGO | S_IWUSR, hdmi_edid_sysfs_rda_res_info, hdmi_edid_sysfs_wta_res_info); static ssize_t hdmi_edid_sysfs_rda_audio_latency(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -360,6 +457,7 @@ static struct attribute *hdmi_edid_fs_attrs[] = { &dev_attr_spkr_alloc_data_block.attr, &dev_attr_edid_audio_latency.attr, &dev_attr_edid_video_latency.attr, &dev_attr_res_info.attr, NULL, }; Loading Loading @@ -1578,6 +1676,8 @@ int hdmi_edid_read(void *input) return -EINVAL; } edid_ctrl->page_id = MSM_HDMI_INIT_RES_PAGE; edid_buf = edid_ctrl->edid_buf; edid_ctrl->pt_scan_info = 0; Loading drivers/video/msm/mdss/mdss_hdmi_tx.c +0 −69 Original line number Diff line number Diff line Loading @@ -1001,72 +1001,6 @@ 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, Loading @@ -1078,8 +1012,6 @@ 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, Loading @@ -1089,7 +1021,6 @@ 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 = { Loading drivers/video/msm/mdss/mdss_hdmi_tx.h +0 −1 Original line number Diff line number Diff line Loading @@ -90,7 +90,6 @@ struct hdmi_tx_ctrl { u32 hpd_feature_on; u32 hpd_initialized; u32 vote_hdmi_core_on; u32 res_info_id; u8 timing_gen_on; u8 mhl_hpd_on; Loading include/uapi/video/msm_hdmi_modes.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ struct msm_hdmi_mode_timing_info { enum aspect_ratio ar; }; #define MSM_HDMI_INIT_RES_PAGE 1 #define MSM_HDMI_MODES_CEA (1 << 0) #define MSM_HDMI_MODES_XTND (1 << 1) #define MSM_HDMI_MODES_DVI (1 << 2) Loading Loading
drivers/video/msm/mdss/mdss_hdmi_edid.c +100 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ struct hdmi_edid_ctrl { u16 audio_latency; u16 video_latency; u32 present_3d; u32 page_id; u8 audio_data_block[MAX_NUMBER_ADB * MAX_AUDIO_DATA_BLOCK_SIZE]; int adb_size; u8 spkr_alloc_data_block[MAX_SPKR_ALLOC_DATA_BLOCK_SIZE]; Loading Loading @@ -207,6 +208,102 @@ static ssize_t hdmi_edid_sysfs_rda_modes(struct device *dev, } /* hdmi_edid_sysfs_rda_modes */ static DEVICE_ATTR(edid_modes, S_IRUGO, hdmi_edid_sysfs_rda_modes, NULL); static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int rc, page_id; ssize_t ret = strnlen(buf, PAGE_SIZE); struct hdmi_edid_ctrl *edid_ctrl = hdmi_get_featuredata_from_sysfs_dev(dev, HDMI_TX_FEAT_EDID); if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } rc = kstrtoint(buf, 10, &page_id); if (rc) { DEV_ERR("%s: kstrtoint failed. rc=%d\n", __func__, rc); return rc; } edid_ctrl->page_id = page_id; DEV_DBG("%s: %d\n", __func__, edid_ctrl->page_id); return ret; } static ssize_t hdmi_edid_sysfs_rda_res_info(struct device *dev, struct device_attribute *attr, char *buf) { ssize_t ret; u32 *video_mode; u32 no_of_elem; u32 i = 0, j, page; char *buf_dbg = buf; struct msm_hdmi_mode_timing_info info = {0}; struct hdmi_edid_ctrl *edid_ctrl = hdmi_get_featuredata_from_sysfs_dev(dev, HDMI_TX_FEAT_EDID); u32 size_to_write = sizeof(info); if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); return -EINVAL; } video_mode = edid_ctrl->sink_data.disp_mode_list; no_of_elem = edid_ctrl->sink_data.num_of_elements; if (edid_ctrl->page_id > MSM_HDMI_INIT_RES_PAGE) { page = MSM_HDMI_INIT_RES_PAGE; while (page < edid_ctrl->page_id) { j = 1; while (sizeof(info) * j < PAGE_SIZE) { i++; j++; video_mode++; } page++; } } for (; i < no_of_elem && size_to_write < PAGE_SIZE; i++) { ret = hdmi_get_supported_mode(&info, edid_ctrl->init_data.ds_data, *video_mode++); if (ret || !info.supported) continue; memcpy(buf, &info, sizeof(info)); buf += sizeof(info); size_to_write += sizeof(info); } for (i = sizeof(info); i < size_to_write; i += sizeof(info)) { struct msm_hdmi_mode_timing_info info_dbg = {0}; memcpy(&info_dbg, buf_dbg, sizeof(info_dbg)); DEV_DBG("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", info_dbg.video_format, info_dbg.active_h, info_dbg.front_porch_h, info_dbg.pulse_width_h, info_dbg.back_porch_h, info_dbg.active_low_h, info_dbg.active_v, info_dbg.front_porch_v, info_dbg.pulse_width_v, info_dbg.back_porch_v, info_dbg.active_low_v, info_dbg.pixel_freq, info_dbg.refresh_rate, info_dbg.interlaced, info_dbg.supported, info_dbg.ar); buf_dbg += sizeof(info_dbg); } return size_to_write - sizeof(info); } static DEVICE_ATTR(res_info, S_IRUGO | S_IWUSR, hdmi_edid_sysfs_rda_res_info, hdmi_edid_sysfs_wta_res_info); static ssize_t hdmi_edid_sysfs_rda_audio_latency(struct device *dev, struct device_attribute *attr, char *buf) { Loading Loading @@ -360,6 +457,7 @@ static struct attribute *hdmi_edid_fs_attrs[] = { &dev_attr_spkr_alloc_data_block.attr, &dev_attr_edid_audio_latency.attr, &dev_attr_edid_video_latency.attr, &dev_attr_res_info.attr, NULL, }; Loading Loading @@ -1578,6 +1676,8 @@ int hdmi_edid_read(void *input) return -EINVAL; } edid_ctrl->page_id = MSM_HDMI_INIT_RES_PAGE; edid_buf = edid_ctrl->edid_buf; edid_ctrl->pt_scan_info = 0; Loading
drivers/video/msm/mdss/mdss_hdmi_tx.c +0 −69 Original line number Diff line number Diff line Loading @@ -1001,72 +1001,6 @@ 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, Loading @@ -1078,8 +1012,6 @@ 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, Loading @@ -1089,7 +1021,6 @@ 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 = { Loading
drivers/video/msm/mdss/mdss_hdmi_tx.h +0 −1 Original line number Diff line number Diff line Loading @@ -90,7 +90,6 @@ struct hdmi_tx_ctrl { u32 hpd_feature_on; u32 hpd_initialized; u32 vote_hdmi_core_on; u32 res_info_id; u8 timing_gen_on; u8 mhl_hpd_on; Loading
include/uapi/video/msm_hdmi_modes.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ struct msm_hdmi_mode_timing_info { enum aspect_ratio ar; }; #define MSM_HDMI_INIT_RES_PAGE 1 #define MSM_HDMI_MODES_CEA (1 << 0) #define MSM_HDMI_MODES_XTND (1 << 1) #define MSM_HDMI_MODES_DVI (1 << 2) Loading