Skip to content

Commit

Permalink
drm/exynos: remove struct exynos_drm_display
Browse files Browse the repository at this point in the history
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: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
  • Loading branch information
Gustavo Padovan authored and Inki Dae committed Aug 16, 2015
1 parent d1fa72d commit cf67cc9
Show file tree
Hide file tree
Showing 14 changed files with 177 additions and 252 deletions.
17 changes: 9 additions & 8 deletions drivers/gpu/drm/exynos/exynos7_drm_decon.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ struct decon_context {
atomic_t wait_vsync_event;

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[] = {
Expand Down Expand Up @@ -681,8 +681,9 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
return PTR_ERR(ctx->crtc);
}

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

return 0;

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

decon_disable(ctx->crtc);

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

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

platform_set_drvdata(pdev, ctx);

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

Expand Down
46 changes: 22 additions & 24 deletions drivers/gpu/drm/exynos/exynos_dp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@

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 *
display_to_dp(struct exynos_drm_display *d)
static inline struct exynos_dp_device *encoder_to_dp(
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 {
Expand Down Expand Up @@ -891,9 +891,9 @@ static void exynos_dp_hotplug(struct work_struct *work)
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;

/* Keep the panel disabled while we configure video */
Expand Down Expand Up @@ -994,7 +994,7 @@ static struct drm_encoder *exynos_dp_best_encoder(
{
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 = {
Expand All @@ -1019,15 +1019,13 @@ static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
return 0;
}

static int exynos_dp_create_connector(struct exynos_drm_display *display,
struct drm_encoder *encoder)
static int exynos_dp_create_connector(struct exynos_drm_encoder *exynos_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;
int ret;

dp->encoder = encoder;

/* Pre-empt DP connector creation if there's a bridge */
if (dp->bridge) {
ret = exynos_drm_attach_lcd_bridge(dp, encoder);
Expand All @@ -1054,9 +1052,9 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
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);

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

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);

if (dp->dpms_mode != DRM_MODE_DPMS_ON)
Expand Down Expand Up @@ -1112,7 +1110,7 @@ static void exynos_dp_disable(struct exynos_drm_display *display)
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,
.enable = exynos_dp_enable,
.disable = exynos_dp_disable,
Expand Down Expand Up @@ -1287,15 +1285,16 @@ 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->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,
void *data)
{
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 = {
Expand All @@ -1314,8 +1313,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
if (!dp)
return -ENOMEM;

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

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

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

static int exynos_dp_resume(struct device *dev)
{
struct exynos_dp_device *dp = dev_get_drvdata(dev);

exynos_dp_enable(&dp->display);
exynos_dp_enable(&dp->encoder);
return 0;
}
#endif
Expand Down
3 changes: 1 addition & 2 deletions drivers/gpu/drm/exynos/exynos_dp_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,10 @@ struct link_train {
};

struct exynos_dp_device {
struct exynos_drm_display display;
struct exynos_drm_encoder encoder;
struct device *dev;
struct drm_device *drm_dev;
struct drm_connector connector;
struct drm_encoder *encoder;
struct drm_panel *panel;
struct drm_bridge *bridge;
struct clk *clock;
Expand Down
23 changes: 9 additions & 14 deletions drivers/gpu/drm/exynos/exynos_drm_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,38 +21,33 @@
static LIST_HEAD(exynos_drm_subdrv_list);

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;
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)
return ret;

possible_crtcs |= 1 << ret;

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

display->encoder = encoder;

ret = display->ops->create_connector(display, encoder);
ret = exynos_encoder->ops->create_connector(exynos_encoder);
if (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;

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

int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_crtc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
unsigned int out_type)
enum exynos_drm_output_type out_type)
{
struct drm_crtc *crtc;

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/exynos/exynos_drm_crtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ void exynos_drm_crtc_complete_scanout(struct drm_framebuffer *fb);

/* This function gets pipe value to crtc device matched with out_type. */
int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev,
unsigned int out_type);
enum exynos_drm_output_type out_type);

/*
* This function calls the crtc device(manager)'s te_handler() callback
Expand Down
41 changes: 19 additions & 22 deletions drivers/gpu/drm/exynos/exynos_drm_dpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,21 @@
#include "exynos_drm_drv.h"

struct exynos_dpi {
struct exynos_drm_display display;
struct exynos_drm_encoder encoder;
struct device *dev;
struct device_node *panel_node;

struct drm_panel *panel;
struct drm_connector connector;
struct drm_encoder *encoder;

struct videomode *vm;
};

#define connector_to_dpi(c) container_of(c, struct exynos_dpi, connector)

static inline struct exynos_dpi *display_to_dpi(struct exynos_drm_display *d)
static inline struct exynos_dpi *encoder_to_dpi(struct exynos_drm_encoder *e)
{
return container_of(d, struct exynos_dpi, display);
return container_of(e, struct exynos_dpi, encoder);
}

static enum drm_connector_status
Expand Down Expand Up @@ -98,23 +97,22 @@ exynos_dpi_best_encoder(struct drm_connector *connector)
{
struct exynos_dpi *ctx = connector_to_dpi(connector);

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

static struct drm_connector_helper_funcs exynos_dpi_connector_helper_funcs = {
.get_modes = exynos_dpi_get_modes,
.best_encoder = exynos_dpi_best_encoder,
};

static int exynos_dpi_create_connector(struct exynos_drm_display *display,
struct drm_encoder *encoder)
static int exynos_dpi_create_connector(
struct exynos_drm_encoder *exynos_encoder)
{
struct exynos_dpi *ctx = display_to_dpi(display);
struct exynos_dpi *ctx = encoder_to_dpi(exynos_encoder);
struct drm_encoder *encoder = &exynos_encoder->base;
struct drm_connector *connector = &ctx->connector;
int ret;

ctx->encoder = encoder;

connector->polled = DRM_CONNECTOR_POLL_HPD;

ret = drm_connector_init(encoder->dev, connector,
Expand All @@ -132,27 +130,27 @@ static int exynos_dpi_create_connector(struct exynos_drm_display *display,
return 0;
}

static void exynos_dpi_enable(struct exynos_drm_display *display)
static void exynos_dpi_enable(struct exynos_drm_encoder *encoder)
{
struct exynos_dpi *ctx = display_to_dpi(display);
struct exynos_dpi *ctx = encoder_to_dpi(encoder);

if (ctx->panel) {
drm_panel_prepare(ctx->panel);
drm_panel_enable(ctx->panel);
}
}

static void exynos_dpi_disable(struct exynos_drm_display *display)
static void exynos_dpi_disable(struct exynos_drm_encoder *encoder)
{
struct exynos_dpi *ctx = display_to_dpi(display);
struct exynos_dpi *ctx = encoder_to_dpi(encoder);

if (ctx->panel) {
drm_panel_disable(ctx->panel);
drm_panel_unprepare(ctx->panel);
}
}

static struct exynos_drm_display_ops exynos_dpi_display_ops = {
static struct exynos_drm_encoder_ops exynos_dpi_encoder_ops = {
.create_connector = exynos_dpi_create_connector,
.enable = exynos_dpi_enable,
.disable = exynos_dpi_disable,
Expand Down Expand Up @@ -282,7 +280,7 @@ static int exynos_dpi_parse_dt(struct exynos_dpi *ctx)
return 0;
}

struct exynos_drm_display *exynos_dpi_probe(struct device *dev)
struct exynos_drm_encoder *exynos_dpi_probe(struct device *dev)
{
struct exynos_dpi *ctx;
int ret;
Expand All @@ -291,8 +289,7 @@ struct exynos_drm_display *exynos_dpi_probe(struct device *dev)
if (!ctx)
return ERR_PTR(-ENOMEM);

ctx->display.type = EXYNOS_DISPLAY_TYPE_LCD;
ctx->display.ops = &exynos_dpi_display_ops;
ctx->encoder.ops = &exynos_dpi_encoder_ops;
ctx->dev = dev;

ret = exynos_dpi_parse_dt(ctx);
Expand All @@ -307,14 +304,14 @@ struct exynos_drm_display *exynos_dpi_probe(struct device *dev)
return ERR_PTR(-EPROBE_DEFER);
}

return &ctx->display;
return &ctx->encoder;
}

int exynos_dpi_remove(struct exynos_drm_display *display)
int exynos_dpi_remove(struct exynos_drm_encoder *encoder)
{
struct exynos_dpi *ctx = display_to_dpi(display);
struct exynos_dpi *ctx = encoder_to_dpi(encoder);

exynos_dpi_disable(&ctx->display);
exynos_dpi_disable(&ctx->encoder);

if (ctx->panel)
drm_panel_detach(ctx->panel);
Expand Down
Loading

0 comments on commit cf67cc9

Please sign in to comment.