Skip to content
Permalink
Browse files
fixup! WIP: drm/meson: add DSI encoder
  • Loading branch information
superna9999 committed Dec 10, 2021
1 parent f10a5dc commit b186318175a12bdca613ee26b4b452964c795eb3
Showing 1 changed file with 36 additions and 25 deletions.
@@ -39,45 +39,41 @@ static int meson_encoder_dsi_attach(struct drm_bridge *bridge,
{
struct meson_encoder_dsi *encoder_dsi = bridge_to_meson_encoder_dsi(bridge);

pr_err("%s:%d\n", __func__, __LINE__);

return drm_bridge_attach(bridge->encoder, encoder_dsi->next_bridge,
&encoder_dsi->bridge, flags);
}

static void meson_encoder_dsi_atomic_enable(struct drm_bridge *bridge,
struct drm_bridge_state *bridge_state)
static void meson_encoder_dsi_mode_set(struct drm_bridge *bridge,
const struct drm_display_mode *mode,
const struct drm_display_mode *adjusted_mode)
{
struct meson_encoder_dsi *encoder_dsi = bridge_to_meson_encoder_dsi(bridge);
struct drm_atomic_state *state = bridge_state->base.state;
struct meson_drm *priv = encoder_dsi->priv;
struct drm_connector_state *conn_state;
struct drm_crtc_state *crtc_state;
struct drm_connector *connector;
struct drm_display_mode *mode;

connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
if (WARN_ON(!connector))
return;

conn_state = drm_atomic_get_new_connector_state(state, connector);
if (WARN_ON(!conn_state))
return;
pr_err("%s:%d\n", __func__, __LINE__);

crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
if (WARN_ON(!crtc_state))
return;

mode = &crtc_state->adjusted_mode;
if (WARN_ON(!mode))
return;

meson_vclk_setup(priv, MESON_VCLK_TARGET_DSI, mode->clock * 1000, 0, 0, 0, false);
meson_vclk_setup(priv, MESON_VCLK_TARGET_DSI, mode->clock, 0, 0, 0, false);

meson_venc_mipi_dsi_mode_set(priv, mode);

meson_encl_load_gamma(priv);

writel_relaxed(0, priv->io_base + _REG(ENCL_VIDEO_EN));

writel_bits_relaxed(BIT(3), BIT(3), priv->io_base + _REG(ENCL_VIDEO_MODE_ADV));
writel_relaxed(0, priv->io_base + _REG(ENCL_TST_EN));
}

static void meson_encoder_dsi_atomic_enable(struct drm_bridge *bridge,
struct drm_bridge_state *bridge_state)
{
struct meson_encoder_dsi *encoder_dsi = bridge_to_meson_encoder_dsi(bridge);
struct meson_drm *priv = encoder_dsi->priv;

pr_err("%s:%d\n", __func__, __LINE__);

writel_bits_relaxed(BIT(0), 0, priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_EN_CTRL));

writel_relaxed(1, priv->io_base + _REG(ENCL_VIDEO_EN));
}
@@ -89,11 +85,16 @@ static void meson_encoder_dsi_atomic_disable(struct drm_bridge *bridge,
bridge_to_meson_encoder_dsi(bridge);
struct meson_drm *priv = meson_encoder_dsi->priv;

pr_err("%s:%d\n", __func__, __LINE__);

writel_relaxed(0, priv->io_base + _REG(ENCL_VIDEO_EN));

writel_bits_relaxed(BIT(0), BIT(0), priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_EN_CTRL));
}

static const struct drm_bridge_funcs meson_encoder_dsi_bridge_funcs = {
.attach = meson_encoder_dsi_attach,
.mode_set = meson_encoder_dsi_mode_set,
.atomic_enable = meson_encoder_dsi_atomic_enable,
.atomic_disable = meson_encoder_dsi_atomic_disable,
.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
@@ -107,25 +108,31 @@ int meson_encoder_dsi_init(struct meson_drm *priv)
struct device_node *remote;
int ret;

pr_err("%s:%d\n", __func__, __LINE__);

DRM_DEBUG_DRIVER("\n");

meson_encoder_dsi = devm_kzalloc(priv->dev, sizeof(*meson_encoder_dsi), GFP_KERNEL);
if (!meson_encoder_dsi)
return -ENOMEM;

/* DSI Transceiver Bridge */
remote = of_graph_get_remote_node(priv->dev->of_node, 1, 0);
remote = of_graph_get_remote_node(priv->dev->of_node, 2, 0);
if (!remote) {
dev_err(priv->dev, "DSI transceiver device is disabled");
return 0;
}

pr_err("%s:%d\n", __func__, __LINE__);

meson_encoder_dsi->next_bridge = of_drm_find_bridge(remote);
if (!meson_encoder_dsi->next_bridge) {
dev_err(priv->dev, "Failed to find DSI transceiver bridge: %d\n", ret);
return -EPROBE_DEFER;
}

pr_err("%s:%d\n", __func__, __LINE__);

/* DSI Encoder Bridge */
meson_encoder_dsi->bridge.funcs = &meson_encoder_dsi_bridge_funcs;
meson_encoder_dsi->bridge.of_node = priv->dev->of_node;
@@ -143,6 +150,8 @@ int meson_encoder_dsi_init(struct meson_drm *priv)
return ret;
}

pr_err("%s:%d\n", __func__, __LINE__);

meson_encoder_dsi->encoder.possible_crtcs = BIT(0);

/* Attach DSI Encoder Bridge to Encoder */
@@ -152,6 +161,8 @@ int meson_encoder_dsi_init(struct meson_drm *priv)
return ret;
}

pr_err("%s:%d\n", __func__, __LINE__);

/*
* We should have now in place:
* encoder->[dsi encoder bridge]->[dw-mipi-dsi bridge]->[panel bridge]->[panel]

0 comments on commit b186318

Please sign in to comment.