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

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

Merge "drm/msm/dp: configure quantization ranges as per video format"

parents c9c2518d 7f2aa153
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -2960,7 +2960,7 @@ static u8 drm_match_hdmi_mode_clock_tolerance(const struct drm_display_mode *to_
 *
 * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
 */
static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
{
	u8 vic;

@@ -2982,6 +2982,7 @@ static u8 drm_match_hdmi_mode(const struct drm_display_mode *to_match)
	}
	return 0;
}
EXPORT_SYMBOL(drm_match_hdmi_mode);

static bool drm_valid_hdmi_vic(u8 vic)
{
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ struct dp_display {
int dp_display_get_num_of_displays(void);
int dp_display_get_displays(void **displays, int count);
bool dp_connector_mode_needs_full_range(void *display);
bool dp_connector_mode_is_cea_mode(void *display);
enum sde_csc_type dp_connector_get_csc_type(struct drm_connector *conn,
	void *data);
#endif /* _DP_DISPLAY_H_ */
+45 −2
Original line number Diff line number Diff line
@@ -134,6 +134,8 @@ static void convert_to_dp_mode(const struct drm_display_mode *drm_mode,
		!!(drm_mode->flags & DRM_MODE_FLAG_NHSYNC);

	dp_mode->flags = drm_mode->flags;

	dp_mode->timing.par = drm_mode->picture_aspect_ratio;
}

static void convert_to_drm_mode(const struct dp_display_mode *dp_mode,
@@ -174,6 +176,8 @@ static void convert_to_drm_mode(const struct dp_display_mode *dp_mode,
	drm_mode->flags = flags;
	drm_mode->flags |= (dp_mode->flags & SDE_DRM_MODE_FLAG_FMT_MASK);

	drm_mode->picture_aspect_ratio = dp_mode->timing.par;

	drm_mode->type = 0x48;
	drm_mode_set_name(drm_mode);
}
@@ -474,6 +478,45 @@ bool dp_connector_mode_needs_full_range(void *data)
	return false;
}

bool dp_connector_mode_is_cea_mode(void *data)
{
	struct dp_display *display = data;
	struct dp_bridge *bridge;
	struct dp_display_mode *mode;
	struct drm_display_mode drm_mode;
	struct dp_panel_info *timing;
	bool is_ce_mode = false;

	if (!display) {
		pr_err("invalid input\n");
		return false;
	}

	bridge = display->bridge;
	if (!bridge) {
		pr_err("invalid bridge data\n");
		return false;
	}

	mode = &bridge->dp_mode;
	timing = &mode->timing;

	if (timing->h_active == 640 &&
	    timing->v_active == 480)
		is_ce_mode = false;

	convert_to_drm_mode(mode, &drm_mode);
	drm_mode.flags &= ~SDE_DRM_MODE_FLAG_FMT_MASK;

	if (drm_match_cea_mode(&drm_mode) || drm_match_hdmi_mode(&drm_mode))
		is_ce_mode = true;

	pr_debug("%s: %s : %s video format\n", __func__,
			drm_mode.name, is_ce_mode ? "CE" : "IT");

	return is_ce_mode;
}

enum sde_csc_type dp_connector_get_csc_type(struct drm_connector *conn,
	void *data)
{
@@ -500,10 +543,10 @@ enum sde_csc_type dp_connector_get_csc_type(struct drm_connector *conn,
		return SDE_CSC_RGB2YUV_2020L;
	else if (dp_connector_mode_needs_full_range(data)
		|| conn->yuv_qs)
		return SDE_CSC_RGB2YUV_601FR;
		return SDE_CSC_RGB2YUV_709FR;

error:
	return SDE_CSC_RGB2YUV_601L;
	return SDE_CSC_RGB2YUV_709L;
}

enum drm_connector_status dp_connector_detect(struct drm_connector *conn,
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ struct dp_panel_info {
	u32 pixel_clk_khz;
	u32 bpp;
	u32 out_format;
	enum hdmi_picture_aspect par;
};

struct dp_display_mode {
+22 −0
Original line number Diff line number Diff line
@@ -768,6 +768,28 @@ bool sde_connector_mode_needs_full_range(struct drm_connector *connector)
	return c_conn->ops.mode_needs_full_range(c_conn->display);
}

bool sde_connector_mode_is_cea_mode(struct drm_connector *connector)
{
	struct sde_connector *c_conn;

	if (!connector) {
		SDE_ERROR("invalid argument\n");
		return false;
	}

	c_conn = to_sde_connector(connector);

	if (!c_conn->display) {
		SDE_ERROR("invalid argument\n");
		return false;
	}

	if (!c_conn->ops.mode_is_cea_mode)
		return false;

	return c_conn->ops.mode_is_cea_mode(c_conn->display);
}

static void sde_connector_destroy(struct drm_connector *connector)
{
	struct sde_connector *c_conn;
Loading