Skip to content

Commit

Permalink
drm/exynos: Implement lvds bridge discovery to DP driver
Browse files Browse the repository at this point in the history
This patch implements the lvds bridge discovery and connector pre-emption
code to the dp driver.

Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
  • Loading branch information
Sean Paul authored and Inki Dae committed Mar 23, 2014
1 parent a9fe713 commit 1634ba2
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions drivers/gpu/drm/exynos/exynos_dp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,19 @@
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
#include <drm/drm_crtc_helper.h>
#include <drm/bridge/ptn3460.h>

#include "exynos_drm_drv.h"
#include "exynos_dp_core.h"

#define ctx_from_connector(c) container_of(c, struct exynos_dp_device, \
connector)

struct bridge_init {
struct i2c_client *client;
struct device_node *node;
};

static int exynos_dp_init_dp(struct exynos_dp_device *dp)
{
exynos_dp_reset(dp);
Expand Down Expand Up @@ -973,6 +979,35 @@ static int exynos_dp_initialize(struct exynos_drm_display *display,
return 0;
}

static bool find_bridge(const char *compat, struct bridge_init *bridge)
{
bridge->client = NULL;
bridge->node = of_find_compatible_node(NULL, NULL, compat);
if (!bridge->node)
return false;

bridge->client = of_find_i2c_device_by_node(bridge->node);
if (!bridge->client)
return false;

return true;
}

/* returns the number of bridges attached */
static int exynos_drm_attach_lcd_bridge(struct drm_device *dev,
struct drm_encoder *encoder)
{
struct bridge_init bridge;
int ret;

if (find_bridge("nxp,ptn3460", &bridge)) {
ret = ptn3460_init(dev, encoder, bridge.client, bridge.node);
if (!ret)
return 1;
}
return 0;
}

static int exynos_dp_create_connector(struct exynos_drm_display *display,
struct drm_encoder *encoder)
{
Expand All @@ -981,6 +1016,12 @@ static int exynos_dp_create_connector(struct exynos_drm_display *display,
int ret;

dp->encoder = encoder;

/* Pre-empt DP connector creation if there's a bridge */
ret = exynos_drm_attach_lcd_bridge(dp->drm_dev, encoder);
if (ret)
return 0;

connector->polled = DRM_CONNECTOR_POLL_HPD;

ret = drm_connector_init(dp->drm_dev, connector,
Expand Down

0 comments on commit 1634ba2

Please sign in to comment.