Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3862881 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: hdmi: give multiple resolution info using sysfs node"

parents 8f505af4 583992fd
Loading
Loading
Loading
Loading
+100 −0
Original line number Diff line number Diff line
@@ -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];
@@ -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)
{
@@ -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,
};

@@ -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;
+0 −69
Original line number Diff line number Diff line
@@ -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,
@@ -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,
@@ -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 = {
+0 −1
Original line number Diff line number Diff line
@@ -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;

+2 −0
Original line number Diff line number Diff line
@@ -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)