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

Commit 16844fb1 authored by Rahul Sharma's avatar Rahul Sharma Committed by Inki Dae
Browse files

drm/exynos: hdmi: use drm_display_mode to check the supported modes



This patch renames check_timing to check_mode and removes the
unnecessary conversion of drm_display_mode to/from fb_videomode in
the hdmi driver.

v4:
1) Changed the commit message to add information related to renaming
the callbacks to check_mode.
2) Changed debug message to print 1/0 for interlace mode.

v3:
1) Replaced check_timing callbacks with check_mode.
2) Change the type of second parameter of check_mode callback from void
pointer paramenter to struct drm_display_mode pointer.

v2:
1) Removed convert_to_video_timing().
2) Corrected DRM_DEBUG_KMS to print the resolution properly.

Signed-off-by: default avatarRahul Sharma <rahul.sharma@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 725ddead
Loading
Loading
Loading
Loading
+2 −36
Original line number Diff line number Diff line
@@ -58,37 +58,6 @@ convert_to_display_mode(struct drm_display_mode *mode,
		mode->flags |= DRM_MODE_FLAG_DBLSCAN;
}

/* convert drm_display_mode to exynos_video_timings */
static inline void
convert_to_video_timing(struct fb_videomode *timing,
			struct drm_display_mode *mode)
{
	DRM_DEBUG_KMS("%s\n", __FILE__);

	memset(timing, 0, sizeof(*timing));

	timing->pixclock = mode->clock * 1000;
	timing->refresh = drm_mode_vrefresh(mode);

	timing->xres = mode->hdisplay;
	timing->right_margin = mode->hsync_start - mode->hdisplay;
	timing->hsync_len = mode->hsync_end - mode->hsync_start;
	timing->left_margin = mode->htotal - mode->hsync_end;

	timing->yres = mode->vdisplay;
	timing->lower_margin = mode->vsync_start - mode->vdisplay;
	timing->vsync_len = mode->vsync_end - mode->vsync_start;
	timing->upper_margin = mode->vtotal - mode->vsync_end;

	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
		timing->vmode = FB_VMODE_INTERLACED;
	else
		timing->vmode = FB_VMODE_NONINTERLACED;

	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
		timing->vmode |= FB_VMODE_DOUBLE;
}

static int exynos_drm_connector_get_modes(struct drm_connector *connector)
{
	struct exynos_drm_connector *exynos_connector =
@@ -168,15 +137,12 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
					to_exynos_connector(connector);
	struct exynos_drm_manager *manager = exynos_connector->manager;
	struct exynos_drm_display_ops *display_ops = manager->display_ops;
	struct fb_videomode timing;
	int ret = MODE_BAD;

	DRM_DEBUG_KMS("%s\n", __FILE__);

	convert_to_video_timing(&timing, mode);

	if (display_ops && display_ops->check_timing)
		if (!display_ops->check_timing(manager->dev, (void *)&timing))
	if (display_ops && display_ops->check_mode)
		if (!display_ops->check_mode(manager->dev, mode))
			ret = MODE_OK;

	return ret;
+2 −2
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ struct exynos_drm_overlay {
 * @is_connected: check for that display is connected or not.
 * @get_edid: get edid modes from display driver.
 * @get_panel: get panel object from display driver.
 * @check_timing: check if timing is valid or not.
 * @check_mode: check if mode is valid or not.
 * @power_on: display device on or off.
 */
struct exynos_drm_display_ops {
@@ -151,7 +151,7 @@ struct exynos_drm_display_ops {
	struct edid *(*get_edid)(struct device *dev,
			struct drm_connector *connector);
	void *(*get_panel)(struct device *dev);
	int (*check_timing)(struct device *dev, void *timing);
	int (*check_mode)(struct device *dev, struct drm_display_mode *mode);
	int (*power_on)(struct device *dev, int mode);
};

+2 −2
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ static void *fimd_get_panel(struct device *dev)
	return ctx->panel;
}

static int fimd_check_timing(struct device *dev, void *timing)
static int fimd_check_mode(struct device *dev, struct drm_display_mode *mode)
{
	DRM_DEBUG_KMS("%s\n", __FILE__);

@@ -188,7 +188,7 @@ static struct exynos_drm_display_ops fimd_display_ops = {
	.type = EXYNOS_DISPLAY_TYPE_LCD,
	.is_connected = fimd_display_is_connected,
	.get_panel = fimd_get_panel,
	.check_timing = fimd_check_timing,
	.check_mode = fimd_check_mode,
	.power_on = fimd_display_power_on,
};

+9 −8
Original line number Diff line number Diff line
@@ -127,7 +127,8 @@ static struct edid *drm_hdmi_get_edid(struct device *dev,
	return NULL;
}

static int drm_hdmi_check_timing(struct device *dev, void *timing)
static int drm_hdmi_check_mode(struct device *dev,
		struct drm_display_mode *mode)
{
	struct drm_hdmi_context *ctx = to_context(dev);
	int ret = 0;
@@ -139,14 +140,14 @@ static int drm_hdmi_check_timing(struct device *dev, void *timing)
	* If any of the two fails, return mode as BAD.
	*/

	if (mixer_ops && mixer_ops->check_timing)
		ret = mixer_ops->check_timing(ctx->mixer_ctx->ctx, timing);
	if (mixer_ops && mixer_ops->check_mode)
		ret = mixer_ops->check_mode(ctx->mixer_ctx->ctx, mode);

	if (ret)
		return ret;

	if (hdmi_ops && hdmi_ops->check_timing)
		return hdmi_ops->check_timing(ctx->hdmi_ctx->ctx, timing);
	if (hdmi_ops && hdmi_ops->check_mode)
		return hdmi_ops->check_mode(ctx->hdmi_ctx->ctx, mode);

	return 0;
}
@@ -167,7 +168,7 @@ static struct exynos_drm_display_ops drm_hdmi_display_ops = {
	.type = EXYNOS_DISPLAY_TYPE_HDMI,
	.is_connected = drm_hdmi_is_connected,
	.get_edid = drm_hdmi_get_edid,
	.check_timing = drm_hdmi_check_timing,
	.check_mode = drm_hdmi_check_mode,
	.power_on = drm_hdmi_power_on,
};

@@ -218,7 +219,7 @@ static void drm_hdmi_mode_fixup(struct device *subdrv_dev,

	drm_mode_set_crtcinfo(adjusted_mode, 0);

	mode_ok = drm_hdmi_check_timing(subdrv_dev, adjusted_mode);
	mode_ok = drm_hdmi_check_mode(subdrv_dev, adjusted_mode);

	/* just return if user desired mode exists. */
	if (mode_ok == 0)
@@ -229,7 +230,7 @@ static void drm_hdmi_mode_fixup(struct device *subdrv_dev,
	 * to adjusted_mode.
	 */
	list_for_each_entry(m, &connector->modes, head) {
		mode_ok = drm_hdmi_check_timing(subdrv_dev, m);
		mode_ok = drm_hdmi_check_mode(subdrv_dev, m);

		if (mode_ok == 0) {
			struct drm_mode_object base;
+3 −3
Original line number Diff line number Diff line
@@ -32,11 +32,11 @@ struct exynos_hdmi_ops {
	bool (*is_connected)(void *ctx);
	struct edid *(*get_edid)(void *ctx,
			struct drm_connector *connector);
	int (*check_timing)(void *ctx, struct fb_videomode *timing);
	int (*check_mode)(void *ctx, struct drm_display_mode *mode);
	int (*power_on)(void *ctx, int mode);

	/* manager */
	void (*mode_set)(void *ctx, void *mode);
	void (*mode_set)(void *ctx, struct drm_display_mode *mode);
	void (*get_max_resol)(void *ctx, unsigned int *width,
				unsigned int *height);
	void (*commit)(void *ctx);
@@ -57,7 +57,7 @@ struct exynos_mixer_ops {
	void (*win_disable)(void *ctx, int zpos);

	/* display */
	int (*check_timing)(void *ctx, struct fb_videomode *timing);
	int (*check_mode)(void *ctx, struct drm_display_mode *mode);
};

void exynos_hdmi_drv_attach(struct exynos_drm_hdmi_context *ctx);
Loading