// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) 2021 BayLibre, SAS * Author: Neil Armstrong <narmstrong@baylibre.com> * Copyright (C) 2015 Amlogic, Inc. All rights reserved.
*/
/* Set the bit clock rate to hs_clk_rate */
ret = clk_set_rate(mipi_dsi->bit_clk,
mipi_dsi->phy_opts.mipi_dphy.hs_clk_rate); if (ret) {
dev_err(mipi_dsi->dev, "Failed to set DSI Bit clock rate %lu (ret %d)\n",
mipi_dsi->phy_opts.mipi_dphy.hs_clk_rate, ret); return ret;
}
/* Make sure the rate of the bit clock is not modified by someone else */
ret = clk_rate_exclusive_get(mipi_dsi->bit_clk); if (ret) {
dev_err(mipi_dsi->dev, "Failed to set the exclusivity on the bit clock rate (ret %d)\n", ret); return ret;
}
clk_disable_unprepare(mipi_dsi->px_clk);
ret = clk_set_rate(mipi_dsi->px_clk, mipi_dsi->mode->clock * 1000);
if (ret) {
dev_err(mipi_dsi->dev, "Failed to set DSI Pixel clock rate %u (%d)\n",
mipi_dsi->mode->clock * 1000, ret); return ret;
}
ret = clk_prepare_enable(mipi_dsi->px_clk); if (ret) {
dev_err(mipi_dsi->dev, "Failed to enable DSI Pixel clock (ret %d)\n", ret); return ret;
}
switch (mipi_dsi->dsi_device->format) { case MIPI_DSI_FMT_RGB888:
dpi_data_format = DPI_COLOR_24BIT;
venc_data_width = VENC_IN_COLOR_24B; break; case MIPI_DSI_FMT_RGB666:
dpi_data_format = DPI_COLOR_18BIT_CFG_2;
venc_data_width = VENC_IN_COLOR_18B; break; case MIPI_DSI_FMT_RGB666_PACKED: case MIPI_DSI_FMT_RGB565: return -EINVAL;
}
/* Configure color format for DPI register */
writel_relaxed(FIELD_PREP(MIPI_DSI_TOP_DPI_COLOR_MODE, dpi_data_format) |
FIELD_PREP(MIPI_DSI_TOP_IN_COLOR_MODE, venc_data_width) |
FIELD_PREP(MIPI_DSI_TOP_COMP2_SEL, 2) |
FIELD_PREP(MIPI_DSI_TOP_COMP1_SEL, 1) |
FIELD_PREP(MIPI_DSI_TOP_COMP0_SEL, 0),
mipi_dsi->base + MIPI_DSI_TOP_CNTL);
switch (device->format) { case MIPI_DSI_FMT_RGB888: break; case MIPI_DSI_FMT_RGB666: break; case MIPI_DSI_FMT_RGB666_PACKED: case MIPI_DSI_FMT_RGB565:
dev_err(mipi_dsi->dev, "invalid pixel format %d\n", device->format); return -EINVAL;
}
ret = phy_init(mipi_dsi->phy); if (ret) return ret;
mipi_dsi = devm_kzalloc(dev, sizeof(*mipi_dsi), GFP_KERNEL); if (!mipi_dsi) return -ENOMEM;
mipi_dsi->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(mipi_dsi->base)) return PTR_ERR(mipi_dsi->base);
mipi_dsi->phy = devm_phy_get(dev, "dphy"); if (IS_ERR(mipi_dsi->phy)) return dev_err_probe(dev, PTR_ERR(mipi_dsi->phy), "failed to get mipi dphy\n");
mipi_dsi->bit_clk = devm_clk_get_enabled(dev, "bit"); if (IS_ERR(mipi_dsi->bit_clk)) { int ret = PTR_ERR(mipi_dsi->bit_clk);
/* TOFIX GP0 on some platforms fails to lock in early boot, defer probe */ if (ret == -EIO)
ret = -EPROBE_DEFER;
return dev_err_probe(dev, ret, "Unable to get enabled bit_clk\n");
}
mipi_dsi->px_clk = devm_clk_get_enabled(dev, "px"); if (IS_ERR(mipi_dsi->px_clk)) return dev_err_probe(dev, PTR_ERR(mipi_dsi->px_clk), "Unable to get enabled px_clk\n");
/* * We use a TOP reset signal because the APB reset signal * is handled by the TOP control registers.
*/
mipi_dsi->top_rst = devm_reset_control_get_exclusive(dev, "top"); if (IS_ERR(mipi_dsi->top_rst)) return dev_err_probe(dev, PTR_ERR(mipi_dsi->top_rst), "Unable to get reset control\n");
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.