imx8qm_ldb_set_phy_cfg(imx8qm_ldb, di_clk, is_split, false, phy_cfg);
ret = phy_configure(imx8qm_ldb_ch->phy, &opts); if (ret < 0)
DRM_DEV_ERROR(dev, "failed to configure PHY: %d\n", ret);
if (is_split) {
imx8qm_ldb_ch =
imx8qm_ldb->channel[imx8qm_ldb->active_chno ^ 1];
imx8qm_ldb_set_phy_cfg(imx8qm_ldb, di_clk, is_split, true,
phy_cfg);
ret = phy_configure(imx8qm_ldb_ch->phy, &opts); if (ret < 0)
DRM_DEV_ERROR(dev, "failed to configure slave PHY: %d\n",
ret);
}
/* input VSYNC signal from pixel link is active low */ if (ldb_ch->chno == 0 || is_split)
ldb->ldb_ctrl |= LDB_DI0_VS_POL_ACT_LOW; if (ldb_ch->chno == 1 || is_split)
ldb->ldb_ctrl |= LDB_DI1_VS_POL_ACT_LOW;
switch (ldb_ch->out_bus_format) { case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: break; case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: if (ldb_ch->chno == 0 || is_split)
ldb->ldb_ctrl |= LDB_CH0_DATA_WIDTH_24BIT; if (ldb_ch->chno == 1 || is_split)
ldb->ldb_ctrl |= LDB_CH1_DATA_WIDTH_24BIT; break;
}
/* both DI0 and DI1 connect with pixel link, so ok to use DI0 only */ if (ldb_ch->chno == 0 || is_split) {
ldb->ldb_ctrl &= ~LDB_CH0_MODE_EN_MASK;
ldb->ldb_ctrl |= LDB_CH0_MODE_EN_TO_DI0;
} if (ldb_ch->chno == 1 || is_split) {
ldb->ldb_ctrl &= ~LDB_CH1_MODE_EN_MASK;
ldb->ldb_ctrl |= LDB_CH1_MODE_EN_TO_DI0;
}
if (is_split) {
ret = phy_power_on(imx8qm_ldb->channel[0]->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power on channel0 PHY: %d\n",
ret);
ret = phy_power_on(imx8qm_ldb->channel[1]->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power on channel1 PHY: %d\n",
ret);
} else {
ret = phy_power_on(imx8qm_ldb_ch->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power on PHY: %d\n", ret);
}
if (is_split) {
ret = phy_power_off(imx8qm_ldb->channel[0]->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power off channel0 PHY: %d\n",
ret);
ret = phy_power_off(imx8qm_ldb->channel[1]->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power off channel1 PHY: %d\n",
ret);
} else {
ret = phy_power_off(imx8qm_ldb_ch->phy); if (ret)
DRM_DEV_ERROR(dev, "failed to power off PHY: %d\n", ret);
}
if (!imx8qm_ldb_bus_output_fmt_supported(output_fmt)) return NULL;
*num_input_fmts = 1;
input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL); if (!input_fmts) return NULL;
switch (output_fmt) { case MEDIA_BUS_FMT_FIXED:
di = &conn_state->connector->display_info;
/* * Look at the first bus format to determine input format. * Default to MEDIA_BUS_FMT_RGB888_1X36_CPADLO, if no match.
*/ if (di->num_bus_formats) {
finfo = drm_format_info(di->bus_formats[0]);
staticint imx8qm_ldb_get_phy(struct imx8qm_ldb *imx8qm_ldb)
{ struct imx8qm_ldb_channel *imx8qm_ldb_ch; struct ldb_channel *ldb_ch; struct device *dev = imx8qm_ldb->dev; int i, ret;
for (i = 0; i < MAX_LDB_CHAN_NUM; i++) {
imx8qm_ldb_ch = imx8qm_ldb->channel[i];
ldb_ch = &imx8qm_ldb_ch->base;
if (!ldb_ch->is_available) continue;
imx8qm_ldb_ch->phy = devm_of_phy_get(dev, ldb_ch->np, "lvds_phy"); if (IS_ERR(imx8qm_ldb_ch->phy)) {
ret = PTR_ERR(imx8qm_ldb_ch->phy); if (ret != -EPROBE_DEFER)
DRM_DEV_ERROR(dev, "failed to get channel%d PHY: %d\n",
i, ret); return ret;
}
}
imx8qm_ldb = devm_kzalloc(dev, sizeof(*imx8qm_ldb), GFP_KERNEL); if (!imx8qm_ldb) return -ENOMEM;
for (i = 0; i < MAX_LDB_CHAN_NUM; i++) {
imx8qm_ldb->channel[i] =
devm_drm_bridge_alloc(dev, struct imx8qm_ldb_channel, base.bridge,
&imx8qm_ldb_bridge_funcs); if (IS_ERR(imx8qm_ldb->channel[i])) return PTR_ERR(imx8qm_ldb->channel[i]);
}
imx8qm_ldb->clk_pixel = devm_clk_get(dev, "pixel"); if (IS_ERR(imx8qm_ldb->clk_pixel)) {
ret = PTR_ERR(imx8qm_ldb->clk_pixel); if (ret != -EPROBE_DEFER)
DRM_DEV_ERROR(dev, "failed to get pixel clock: %d\n", ret); return ret;
}
imx8qm_ldb->clk_bypass = devm_clk_get(dev, "bypass"); if (IS_ERR(imx8qm_ldb->clk_bypass)) {
ret = PTR_ERR(imx8qm_ldb->clk_bypass); if (ret != -EPROBE_DEFER)
DRM_DEV_ERROR(dev, "failed to get bypass clock: %d\n", ret); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.