Skip to content

Commit

Permalink
drm: rcar-du: Remove i2c slave encoder interface for hdmi encoder
Browse files Browse the repository at this point in the history
The hdmi output in rcar-du uses the i2c slave encoder interface to link
to the adv7511 encoder chip. The kms driver creates encoder and connector
entities that internally uses the drm_encoder_slave_funcs ops provided by
the slave encoder driver.

Change the driver such that it expects a bridge entity instead of a slave
encoder. The hdmi connector code isn't needed anymore as we expect the
adv7511 bridge driver to create/manage the connector.

Note that the kms driver still expects a connector node for hdmi to be
present in DT. This node has no connection to the connector created
by the bridge driver.

Tested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
  • Loading branch information
Archit Taneja committed Jul 18, 2016
1 parent 7caff0f commit 1d92611
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 207 deletions.
4 changes: 2 additions & 2 deletions drivers/gpu/drm/rcar-du/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ rcar-du-drm-y := rcar_du_crtc.o \
rcar_du_plane.o \
rcar_du_vgacon.o

rcar-du-drm-$(CONFIG_DRM_RCAR_HDMI) += rcar_du_hdmicon.o \
rcar_du_hdmienc.o
rcar-du-drm-$(CONFIG_DRM_RCAR_HDMI) += rcar_du_hdmienc.o

rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_lvdsenc.o

rcar-du-drm-$(CONFIG_DRM_RCAR_VSP) += rcar_du_vsp.o
Expand Down
3 changes: 1 addition & 2 deletions drivers/gpu/drm/rcar-du/rcar_du_encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

#include "rcar_du_drv.h"
#include "rcar_du_encoder.h"
#include "rcar_du_hdmicon.h"
#include "rcar_du_hdmienc.h"
#include "rcar_du_kms.h"
#include "rcar_du_lvdscon.h"
Expand Down Expand Up @@ -174,7 +173,7 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu,
break;

case DRM_MODE_ENCODER_TMDS:
ret = rcar_du_hdmi_connector_init(rcdu, renc);
/* connector managed by the bridge driver */
break;

default:
Expand Down
7 changes: 3 additions & 4 deletions drivers/gpu/drm/rcar-du/rcar_du_encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
#define __RCAR_DU_ENCODER_H__

#include <drm/drm_crtc.h>
#include <drm/drm_encoder_slave.h>

struct rcar_du_device;
struct rcar_du_hdmienc;
Expand All @@ -30,16 +29,16 @@ enum rcar_du_encoder_type {
};

struct rcar_du_encoder {
struct drm_encoder_slave slave;
struct drm_encoder base;
enum rcar_du_output output;
struct rcar_du_hdmienc *hdmi;
struct rcar_du_lvdsenc *lvds;
};

#define to_rcar_encoder(e) \
container_of(e, struct rcar_du_encoder, slave.base)
container_of(e, struct rcar_du_encoder, base)

#define rcar_encoder_to_drm_encoder(e) (&(e)->slave.base)
#define rcar_encoder_to_drm_encoder(e) (&(e)->base)

struct rcar_du_connector {
struct drm_connector connector;
Expand Down
116 changes: 0 additions & 116 deletions drivers/gpu/drm/rcar-du/rcar_du_hdmicon.c

This file was deleted.

31 changes: 0 additions & 31 deletions drivers/gpu/drm/rcar-du/rcar_du_hdmicon.h

This file was deleted.

68 changes: 16 additions & 52 deletions drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_encoder_slave.h>

#include "rcar_du_drv.h"
#include "rcar_du_encoder.h"
Expand All @@ -25,20 +24,14 @@

struct rcar_du_hdmienc {
struct rcar_du_encoder *renc;
struct device *dev;
bool enabled;
};

#define to_rcar_hdmienc(e) (to_rcar_encoder(e)->hdmi)
#define to_slave_funcs(e) (to_rcar_encoder(e)->slave.slave_funcs)

static void rcar_du_hdmienc_disable(struct drm_encoder *encoder)
{
struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

if (sfuncs->dpms)
sfuncs->dpms(encoder, DRM_MODE_DPMS_OFF);

if (hdmienc->renc->lvds)
rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
Expand All @@ -50,15 +43,11 @@ static void rcar_du_hdmienc_disable(struct drm_encoder *encoder)
static void rcar_du_hdmienc_enable(struct drm_encoder *encoder)
{
struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

if (hdmienc->renc->lvds)
rcar_du_lvdsenc_enable(hdmienc->renc->lvds, encoder->crtc,
true);

if (sfuncs->dpms)
sfuncs->dpms(encoder, DRM_MODE_DPMS_ON);

hdmienc->enabled = true;
}

Expand All @@ -67,29 +56,21 @@ static int rcar_du_hdmienc_atomic_check(struct drm_encoder *encoder,
struct drm_connector_state *conn_state)
{
struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);
struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
const struct drm_display_mode *mode = &crtc_state->mode;

if (hdmienc->renc->lvds)
rcar_du_lvdsenc_atomic_check(hdmienc->renc->lvds,
adjusted_mode);

if (sfuncs->mode_fixup == NULL)
return 0;

return sfuncs->mode_fixup(encoder, mode, adjusted_mode) ? 0 : -EINVAL;
return 0;
}


static void rcar_du_hdmienc_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
struct rcar_du_hdmienc *hdmienc = to_rcar_hdmienc(encoder);
const struct drm_encoder_slave_funcs *sfuncs = to_slave_funcs(encoder);

if (sfuncs->mode_set)
sfuncs->mode_set(encoder, mode, adjusted_mode);

rcar_du_crtc_route_output(encoder->crtc, hdmienc->renc->output);
}
Expand All @@ -109,7 +90,6 @@ static void rcar_du_hdmienc_cleanup(struct drm_encoder *encoder)
rcar_du_hdmienc_disable(encoder);

drm_encoder_cleanup(encoder);
put_device(hdmienc->dev);
}

static const struct drm_encoder_funcs encoder_funcs = {
Expand All @@ -120,53 +100,37 @@ int rcar_du_hdmienc_init(struct rcar_du_device *rcdu,
struct rcar_du_encoder *renc, struct device_node *np)
{
struct drm_encoder *encoder = rcar_encoder_to_drm_encoder(renc);
struct drm_i2c_encoder_driver *driver;
struct i2c_client *i2c_slave;
struct drm_bridge *bridge;
struct rcar_du_hdmienc *hdmienc;
int ret;

hdmienc = devm_kzalloc(rcdu->dev, sizeof(*hdmienc), GFP_KERNEL);
if (hdmienc == NULL)
return -ENOMEM;

/* Locate the slave I2C device and driver. */
i2c_slave = of_find_i2c_device_by_node(np);
if (!i2c_slave || !i2c_get_clientdata(i2c_slave)) {
dev_dbg(rcdu->dev,
"can't get I2C slave for %s, deferring probe\n",
of_node_full_name(np));
/* Locate drm bridge from the hdmi encoder DT node */
bridge = of_drm_find_bridge(np);
if (!bridge)
return -EPROBE_DEFER;
}

hdmienc->dev = &i2c_slave->dev;

if (hdmienc->dev->driver == NULL) {
dev_dbg(rcdu->dev,
"I2C slave %s not probed yet, deferring probe\n",
dev_name(hdmienc->dev));
ret = -EPROBE_DEFER;
goto error;
}

/* Initialize the slave encoder. */
driver = to_drm_i2c_encoder_driver(to_i2c_driver(hdmienc->dev->driver));
ret = driver->encoder_init(i2c_slave, rcdu->ddev, &renc->slave);
if (ret < 0)
goto error;

ret = drm_encoder_init(rcdu->ddev, encoder, &encoder_funcs,
DRM_MODE_ENCODER_TMDS, NULL);
if (ret < 0)
goto error;
return ret;

drm_encoder_helper_add(encoder, &encoder_helper_funcs);

renc->hdmi = hdmienc;
hdmienc->renc = renc;

return 0;
/* Link drm_bridge to encoder */
bridge->encoder = encoder;

ret = drm_bridge_attach(rcdu->ddev, bridge);
if (ret) {
drm_encoder_cleanup(encoder);
return ret;
}

error:
put_device(hdmienc->dev);
return ret;
return 0;
}

0 comments on commit 1d92611

Please sign in to comment.