From dd19dcb61a608cf072c43115b2455cf39d8f00e0 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Sun, 30 Dec 2018 13:15:43 +0800 Subject: [PATCH] drm/rockchip: csi tx: add host reset and path mode config 1. get csi tx path mode from dts config. 2. for some unknown reason, we must reset csi tx host before enable, otherwise will appear the following error: [drm:rockchip_mipi_csi_irq_handler] *ERROR* Header fifo overflow raw [drm:rockchip_mipi_csi_irq_handler] *ERROR* Payload fifo overflow raw Change-Id: I4dd49fc0ddecfcef4d88f24b7a22bef5c349b146 Signed-off-by: Sandy Huang --- .../gpu/drm/rockchip/rockchip-mipi-csi-tx.c | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip-mipi-csi-tx.c b/drivers/gpu/drm/rockchip/rockchip-mipi-csi-tx.c index 415c0c8451f4..b0a161ff7712 100644 --- a/drivers/gpu/drm/rockchip/rockchip-mipi-csi-tx.c +++ b/drivers/gpu/drm/rockchip/rockchip-mipi-csi-tx.c @@ -340,10 +340,24 @@ static void rockchip_mipi_csi_tx_en(struct rockchip_mipi_csi *csi) csi_mask_write(csi, CSITX_ENABLE, mask, val, true); } +static void rockchip_mipi_csi_tx_reset(struct rockchip_mipi_csi *csi) +{ + u32 mask, val; + + mask = m_SOFT_RESET; + val = v_SOFT_RESET(1); + csi_mask_write(csi, CSITX_SYS_CTRL0, mask, val, true); + usleep_range(50, 100); + mask = m_SOFT_RESET; + val = v_SOFT_RESET(0); + csi_mask_write(csi, CSITX_SYS_CTRL0, mask, val, true); +} + static void rockchip_mipi_csi_host_power_on(struct rockchip_mipi_csi *csi) { u32 mask, val; + rockchip_mipi_csi_tx_reset(csi); rockchip_mipi_csi_tx_en(csi); rockchip_mipi_csi_irq_init(csi); @@ -1019,7 +1033,10 @@ rockchip_mipi_csi_connector_set_property(struct drm_connector *connector, struct rockchip_mipi_csi *csi = con_to_csi(connector); if (property == csi->csi_tx_path_property) { - csi->path_mode = val; + /* + * csi->path_mode = val; + * we get path mode from dts now + */ return 0; } @@ -1251,7 +1268,7 @@ static int rockchip_mipi_csi_probe(struct platform_device *pdev) struct rockchip_mipi_csi *csi; struct device_node *np = dev->of_node; struct resource *res; - int ret; + int ret, val; csi = devm_kzalloc(dev, sizeof(*csi), GFP_KERNEL); if (!csi) @@ -1329,6 +1346,9 @@ static int rockchip_mipi_csi_probe(struct platform_device *pdev) if (ret) mipi_dsi_host_unregister(&csi->dsi_host); + if (!of_property_read_u32(np, "csi-tx-bypass-mode", &val)) + csi->path_mode = val; + return ret; }