Commit a2986e80 authored by Gustavo Padovan's avatar Gustavo Padovan Committed by Inki Dae
Browse files

drm/exynos: remove exynos_drm_create_enc_conn()



This functions was just hiding the encoder and connector creation in
a way that was less clean than if we get rid of it. For example,
exynos_encoder ops had .create_connector() defined only because we were
handing off the encoder and connector creation to
exynos_drm_create_enc_conn(). Without this function we can directly call
the create_connector function internally in the code, without the need of
any vtable access.

It also does some refactoring in the code like creating a bind function
for dpi devices.

Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent af8be3f6
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -682,8 +682,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
	}

	if (ctx->encoder)
		exynos_drm_create_enc_conn(drm_dev, ctx->encoder,
					   EXYNOS_DISPLAY_TYPE_LCD);
		exynos_dpi_bind(drm_dev, ctx->encoder);

	return 0;

+17 −3
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <drm/drm_panel.h>

#include "exynos_dp_core.h"
#include "exynos_drm_encoder.h"

#define ctx_from_connector(c)	container_of(c, struct exynos_dp_device, \
					connector)
@@ -1111,7 +1112,6 @@ static void exynos_dp_disable(struct exynos_drm_encoder *encoder)
}

static struct exynos_drm_encoder_ops exynos_dp_encoder_ops = {
	.create_connector = exynos_dp_create_connector,
	.enable = exynos_dp_enable,
	.disable = exynos_dp_disable,
};
@@ -1192,6 +1192,7 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
	struct exynos_dp_device *dp = dev_get_drvdata(dev);
	struct platform_device *pdev = to_platform_device(dev);
	struct drm_device *drm_dev = data;
	struct exynos_drm_encoder *exynos_encoder = &dp->encoder;
	struct resource *res;
	unsigned int irq_flags;
	int ret = 0;
@@ -1284,8 +1285,21 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)

	dp->drm_dev = drm_dev;

	return exynos_drm_create_enc_conn(drm_dev, &dp->encoder,
	ret = exynos_drm_encoder_create(drm_dev, exynos_encoder,
					EXYNOS_DISPLAY_TYPE_LCD);
	if (ret) {
		DRM_ERROR("failed to create encoder\n");
		return ret;
	}

	ret = exynos_dp_create_connector(exynos_encoder);
	if (ret) {
		DRM_ERROR("failed to create connector ret = %d\n", ret);
		drm_encoder_cleanup(&exynos_encoder->base);
		return ret;
	}

	return 0;
}

static void exynos_dp_unbind(struct device *dev, struct device *master,
+0 −30
Original line number Diff line number Diff line
@@ -20,36 +20,6 @@

static LIST_HEAD(exynos_drm_subdrv_list);

int exynos_drm_create_enc_conn(struct drm_device *dev,
			       struct exynos_drm_encoder *exynos_encoder,
			       enum exynos_drm_output_type type)
{
	int ret;
	unsigned long possible_crtcs = 0;

	ret = exynos_drm_crtc_get_pipe_from_type(dev, type);
	if (ret < 0)
		return ret;

	possible_crtcs |= 1 << ret;

	/* create and initialize a encoder for this sub driver. */
	ret = exynos_drm_encoder_create(dev, exynos_encoder, possible_crtcs);
	if (ret) {
		DRM_ERROR("failed to create encoder\n");
		return ret;
	}

	ret = exynos_encoder->ops->create_connector(exynos_encoder);
	if (ret) {
		DRM_ERROR("failed to create connector ret = %d\n", ret);
		drm_encoder_cleanup(&exynos_encoder->base);
		return ret;
	}

	return 0;
}

int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
{
	if (!subdrv)
+24 −2
Original line number Diff line number Diff line
@@ -20,7 +20,8 @@
#include <video/of_videomode.h>
#include <video/videomode.h>

#include "exynos_drm_drv.h"
#include "exynos_drm_encoder.h"
#include "exynos_drm_crtc.h"

struct exynos_dpi {
	struct exynos_drm_encoder encoder;
@@ -151,7 +152,6 @@ static void exynos_dpi_disable(struct exynos_drm_encoder *encoder)
}

static struct exynos_drm_encoder_ops exynos_dpi_encoder_ops = {
	.create_connector = exynos_dpi_create_connector,
	.enable = exynos_dpi_enable,
	.disable = exynos_dpi_disable,
};
@@ -280,6 +280,28 @@ static int exynos_dpi_parse_dt(struct exynos_dpi *ctx)
	return 0;
}

int exynos_dpi_bind(struct drm_device *dev,
		    struct exynos_drm_encoder *exynos_encoder)
{
	int ret;

	ret = exynos_drm_encoder_create(dev, exynos_encoder,
					EXYNOS_DISPLAY_TYPE_LCD);
	if (ret) {
		DRM_ERROR("failed to create encoder\n");
		return ret;
	}

	ret = exynos_dpi_create_connector(exynos_encoder);
	if (ret) {
		DRM_ERROR("failed to create connector ret = %d\n", ret);
		drm_encoder_cleanup(&exynos_encoder->base);
		return ret;
	}

	return 0;
}

struct exynos_drm_encoder *exynos_dpi_probe(struct device *dev)
{
	struct exynos_dpi *ctx;
+6 −6
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ struct exynos_drm_plane {
 * Exynos DRM Encoder Structure.
 *	- this structure is common to analog tv, digital tv and lcd panel.
 *
 * @create_connector: initialize and register a new connector
 * @mode_fixup: fix mode data comparing to hw specific display mode.
 * @mode_set: convert drm_display_mode to hw specific display mode and
 *	      would be called by encoder->mode_set().
@@ -90,7 +89,6 @@ struct exynos_drm_plane {
 */
struct exynos_drm_encoder;
struct exynos_drm_encoder_ops {
	int (*create_connector)(struct exynos_drm_encoder *encoder);
	void (*mode_fixup)(struct exynos_drm_encoder *encoder,
				struct drm_connector *connector,
				const struct drm_display_mode *mode,
@@ -259,6 +257,7 @@ void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file);
#ifdef CONFIG_DRM_EXYNOS_DPI
struct exynos_drm_encoder *exynos_dpi_probe(struct device *dev);
int exynos_dpi_remove(struct exynos_drm_encoder *encoder);
int exynos_dpi_bind(struct drm_device *dev, struct exynos_drm_encoder *encoder);
#else
static inline struct exynos_drm_encoder *
exynos_dpi_probe(struct device *dev) { return NULL; }
@@ -266,12 +265,13 @@ static inline int exynos_dpi_remove(struct exynos_drm_encoder *encoder)
{
	return 0;
}
static inline int exynos_dpi_bind(struct drm_device *dev,
				  struct exynos_drm_encoder *encoder)
{
	return 0;
}
#endif

/* This function creates a encoder and a connector, and initializes them. */
int exynos_drm_create_enc_conn(struct drm_device *dev,
			       struct exynos_drm_encoder *encoder,
			       enum exynos_drm_output_type type);

extern struct platform_driver fimd_driver;
extern struct platform_driver exynos5433_decon_driver;
Loading