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

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

drm/exynos: remove struct exynos_drm_display



This struct was just representing encoder information, it was a member of
struct exynos_drm_encoder, so any code trying to access encoder data would
have to go through the encoder struct, get the display struct and then get
the data it want.

During this patchset we also realized that the only data
exynos_drm_encoder needs to store is the drm_encoder parent and the
exynos_drm_encoder_ops.

Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent d1fa72d0
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -61,7 +61,7 @@ struct decon_context {
	atomic_t			wait_vsync_event;
	atomic_t			wait_vsync_event;


	struct exynos_drm_panel_info panel;
	struct exynos_drm_panel_info panel;
	struct exynos_drm_display *display;
	struct exynos_drm_encoder *encoder;
};
};


static const struct of_device_id decon_driver_dt_match[] = {
static const struct of_device_id decon_driver_dt_match[] = {
@@ -681,8 +681,9 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
		return PTR_ERR(ctx->crtc);
		return PTR_ERR(ctx->crtc);
	}
	}


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


	return 0;
	return 0;


@@ -695,8 +696,8 @@ static void decon_unbind(struct device *dev, struct device *master,


	decon_disable(ctx->crtc);
	decon_disable(ctx->crtc);


	if (ctx->display)
	if (ctx->encoder)
		exynos_dpi_remove(ctx->display);
		exynos_dpi_remove(ctx->encoder);


	decon_ctx_remove(ctx);
	decon_ctx_remove(ctx);
}
}
@@ -781,9 +782,9 @@ static int decon_probe(struct platform_device *pdev)


	platform_set_drvdata(pdev, ctx);
	platform_set_drvdata(pdev, ctx);


	ctx->display = exynos_dpi_probe(dev);
	ctx->encoder = exynos_dpi_probe(dev);
	if (IS_ERR(ctx->display)) {
	if (IS_ERR(ctx->encoder)) {
		ret = PTR_ERR(ctx->display);
		ret = PTR_ERR(ctx->encoder);
		goto err_iounmap;
		goto err_iounmap;
	}
	}


+22 −24
Original line number Original line Diff line number Diff line
@@ -38,13 +38,13 @@


static inline struct exynos_drm_crtc *dp_to_crtc(struct exynos_dp_device *dp)
static inline struct exynos_drm_crtc *dp_to_crtc(struct exynos_dp_device *dp)
{
{
	return to_exynos_crtc(dp->encoder->crtc);
	return to_exynos_crtc(dp->encoder.base.crtc);
}
}


static inline struct exynos_dp_device *
static inline struct exynos_dp_device *encoder_to_dp(
display_to_dp(struct exynos_drm_display *d)
						struct exynos_drm_encoder *e)
{
{
	return container_of(d, struct exynos_dp_device, display);
	return container_of(e, struct exynos_dp_device, encoder);
}
}


struct bridge_init {
struct bridge_init {
@@ -891,9 +891,9 @@ static void exynos_dp_hotplug(struct work_struct *work)
		drm_helper_hpd_irq_event(dp->drm_dev);
		drm_helper_hpd_irq_event(dp->drm_dev);
}
}


static void exynos_dp_commit(struct exynos_drm_display *display)
static void exynos_dp_commit(struct exynos_drm_encoder *encoder)
{
{
	struct exynos_dp_device *dp = display_to_dp(display);
	struct exynos_dp_device *dp = encoder_to_dp(encoder);
	int ret;
	int ret;


	/* Keep the panel disabled while we configure video */
	/* Keep the panel disabled while we configure video */
@@ -994,7 +994,7 @@ static struct drm_encoder *exynos_dp_best_encoder(
{
{
	struct exynos_dp_device *dp = ctx_from_connector(connector);
	struct exynos_dp_device *dp = ctx_from_connector(connector);


	return dp->encoder;
	return &dp->encoder.base;
}
}


static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
static struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
@@ -1019,15 +1019,13 @@ static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
	return 0;
	return 0;
}
}


static int exynos_dp_create_connector(struct exynos_drm_display *display,
static int exynos_dp_create_connector(struct exynos_drm_encoder *exynos_encoder)
				struct drm_encoder *encoder)
{
{
	struct exynos_dp_device *dp = display_to_dp(display);
	struct exynos_dp_device *dp = encoder_to_dp(exynos_encoder);
	struct drm_encoder *encoder = &exynos_encoder->base;
	struct drm_connector *connector = &dp->connector;
	struct drm_connector *connector = &dp->connector;
	int ret;
	int ret;


	dp->encoder = encoder;

	/* Pre-empt DP connector creation if there's a bridge */
	/* Pre-empt DP connector creation if there's a bridge */
	if (dp->bridge) {
	if (dp->bridge) {
		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
		ret = exynos_drm_attach_lcd_bridge(dp, encoder);
@@ -1054,9 +1052,9 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
	return ret;
	return ret;
}
}


static void exynos_dp_enable(struct exynos_drm_display *display)
static void exynos_dp_enable(struct exynos_drm_encoder *encoder)
{
{
	struct exynos_dp_device *dp = display_to_dp(display);
	struct exynos_dp_device *dp = encoder_to_dp(encoder);
	struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
	struct exynos_drm_crtc *crtc = dp_to_crtc(dp);


	if (dp->dpms_mode == DRM_MODE_DPMS_ON)
	if (dp->dpms_mode == DRM_MODE_DPMS_ON)
@@ -1076,14 +1074,14 @@ static void exynos_dp_enable(struct exynos_drm_display *display)
	phy_power_on(dp->phy);
	phy_power_on(dp->phy);
	exynos_dp_init_dp(dp);
	exynos_dp_init_dp(dp);
	enable_irq(dp->irq);
	enable_irq(dp->irq);
	exynos_dp_commit(&dp->display);
	exynos_dp_commit(&dp->encoder);


	dp->dpms_mode = DRM_MODE_DPMS_ON;
	dp->dpms_mode = DRM_MODE_DPMS_ON;
}
}


static void exynos_dp_disable(struct exynos_drm_display *display)
static void exynos_dp_disable(struct exynos_drm_encoder *encoder)
{
{
	struct exynos_dp_device *dp = display_to_dp(display);
	struct exynos_dp_device *dp = encoder_to_dp(encoder);
	struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
	struct exynos_drm_crtc *crtc = dp_to_crtc(dp);


	if (dp->dpms_mode != DRM_MODE_DPMS_ON)
	if (dp->dpms_mode != DRM_MODE_DPMS_ON)
@@ -1112,7 +1110,7 @@ static void exynos_dp_disable(struct exynos_drm_display *display)
	dp->dpms_mode = DRM_MODE_DPMS_OFF;
	dp->dpms_mode = DRM_MODE_DPMS_OFF;
}
}


static struct exynos_drm_display_ops exynos_dp_display_ops = {
static struct exynos_drm_encoder_ops exynos_dp_encoder_ops = {
	.create_connector = exynos_dp_create_connector,
	.create_connector = exynos_dp_create_connector,
	.enable = exynos_dp_enable,
	.enable = exynos_dp_enable,
	.disable = exynos_dp_disable,
	.disable = exynos_dp_disable,
@@ -1287,7 +1285,8 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)


	dp->drm_dev = drm_dev;
	dp->drm_dev = drm_dev;


	return exynos_drm_create_enc_conn(drm_dev, &dp->display);
	return exynos_drm_create_enc_conn(drm_dev, &dp->encoder,
					  EXYNOS_DISPLAY_TYPE_LCD);
}
}


static void exynos_dp_unbind(struct device *dev, struct device *master,
static void exynos_dp_unbind(struct device *dev, struct device *master,
@@ -1295,7 +1294,7 @@ static void exynos_dp_unbind(struct device *dev, struct device *master,
{
{
	struct exynos_dp_device *dp = dev_get_drvdata(dev);
	struct exynos_dp_device *dp = dev_get_drvdata(dev);


	exynos_dp_disable(&dp->display);
	exynos_dp_disable(&dp->encoder);
}
}


static const struct component_ops exynos_dp_ops = {
static const struct component_ops exynos_dp_ops = {
@@ -1314,8 +1313,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
	if (!dp)
	if (!dp)
		return -ENOMEM;
		return -ENOMEM;


	dp->display.type = EXYNOS_DISPLAY_TYPE_LCD;
	dp->encoder.ops = &exynos_dp_encoder_ops;
	dp->display.ops = &exynos_dp_display_ops;
	platform_set_drvdata(pdev, dp);
	platform_set_drvdata(pdev, dp);


	panel_node = of_parse_phandle(dev->of_node, "panel", 0);
	panel_node = of_parse_phandle(dev->of_node, "panel", 0);
@@ -1353,7 +1351,7 @@ static int exynos_dp_suspend(struct device *dev)
{
{
	struct exynos_dp_device *dp = dev_get_drvdata(dev);
	struct exynos_dp_device *dp = dev_get_drvdata(dev);


	exynos_dp_disable(&dp->display);
	exynos_dp_disable(&dp->encoder);
	return 0;
	return 0;
}
}


@@ -1361,7 +1359,7 @@ static int exynos_dp_resume(struct device *dev)
{
{
	struct exynos_dp_device *dp = dev_get_drvdata(dev);
	struct exynos_dp_device *dp = dev_get_drvdata(dev);


	exynos_dp_enable(&dp->display);
	exynos_dp_enable(&dp->encoder);
	return 0;
	return 0;
}
}
#endif
#endif
+1 −2
Original line number Original line Diff line number Diff line
@@ -147,11 +147,10 @@ struct link_train {
};
};


struct exynos_dp_device {
struct exynos_dp_device {
	struct exynos_drm_display display;
	struct exynos_drm_encoder encoder;
	struct device		*dev;
	struct device		*dev;
	struct drm_device	*drm_dev;
	struct drm_device	*drm_dev;
	struct drm_connector	connector;
	struct drm_connector	connector;
	struct drm_encoder	*encoder;
	struct drm_panel	*panel;
	struct drm_panel	*panel;
	struct drm_bridge	*bridge;
	struct drm_bridge	*bridge;
	struct clk		*clock;
	struct clk		*clock;
+9 −14
Original line number Original line Diff line number Diff line
@@ -21,38 +21,33 @@
static LIST_HEAD(exynos_drm_subdrv_list);
static LIST_HEAD(exynos_drm_subdrv_list);


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


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


	possible_crtcs |= 1 << ret;
	possible_crtcs |= 1 << ret;


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


	display->encoder = encoder;
	ret = exynos_encoder->ops->create_connector(exynos_encoder);

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


	return 0;
	return 0;

err_destroy_encoder:
	encoder->funcs->destroy(encoder);
	return ret;
}
}


int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
+1 −1
Original line number Original line Diff line number Diff line
@@ -237,7 +237,7 @@ void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb)
}
}


int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
					unsigned int out_type)
				       enum exynos_drm_output_type out_type)
{
{
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;


Loading