From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751872AbdBTICs (ORCPT ); Mon, 20 Feb 2017 03:02:48 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:34305 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750842AbdBTICq (ORCPT ); Mon, 20 Feb 2017 03:02:46 -0500 From: Chris Zhong To: john@metanate.com, dianders@chromium.org, tfiga@chromium.org, heiko@sntech.de, yzq@rock-chips.com, mark.rutland@arm.com, devicetree@vger.kernel.org, robh+dt@kernel.org, galak@codeaurora.org, pawel.moll@arm.com, seanpaul@chromium.org Cc: linux-rockchip@lists.infradead.org, Chris Zhong , Mark Yao , David Airlie , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RESEND PATCH v7 2/7] drm/rockchip/dsi: dw-mipi: support RK3399 mipi dsi Date: Mon, 20 Feb 2017 16:02:18 +0800 Message-Id: <1487577744-2855-3-git-send-email-zyw@rock-chips.com> X-Mailer: git-send-email 2.6.3 In-Reply-To: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> References: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The vopb/vopl switch register of RK3399 mipi is different from RK3288, the default setting for mipi dsi mode is different too, so add a of_device_id structure to distinguish them, and make sure set the correct mode before mipi phy init. Signed-off-by: Chris Zhong Signed-off-by: Mark Yao Reviewed-by: Sean Paul --- Changes in v6: - no need check phy_cfg_clk before enable/disable Changes in v5: - check the error of phy_cfg_clk in dw_mipi_dsi_bind Changes in v4: - remove the unrelated change Changes in v3: - base on John Keeping's patch series drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 72 +++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cc58ada..4e74681 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -29,9 +29,17 @@ #define DRIVER_NAME "dw-mipi-dsi" -#define GRF_SOC_CON6 0x025c -#define DSI0_SEL_VOP_LIT (1 << 6) -#define DSI1_SEL_VOP_LIT (1 << 9) +#define RK3288_GRF_SOC_CON6 0x025c +#define RK3288_DSI0_SEL_VOP_LIT BIT(6) +#define RK3288_DSI1_SEL_VOP_LIT BIT(9) + +#define RK3399_GRF_SOC_CON19 0x6250 +#define RK3399_DSI0_SEL_VOP_LIT BIT(0) +#define RK3399_DSI1_SEL_VOP_LIT BIT(4) + +/* disable turnrequest, turndisable, forcetxstopmode, forcerxmode */ +#define RK3399_GRF_SOC_CON22 0x6258 +#define RK3399_GRF_DSI_MODE 0xffff0000 #define DSI_VERSION 0x00 #define DSI_PWR_UP 0x04 @@ -265,6 +273,11 @@ enum { }; struct dw_mipi_dsi_plat_data { + u32 dsi0_en_bit; + u32 dsi1_en_bit; + u32 grf_switch_reg; + u32 grf_dsi0_mode; + u32 grf_dsi0_mode_reg; unsigned int max_data_lanes; enum drm_mode_status (*mode_valid)(struct drm_connector *connector, struct drm_display_mode *mode); @@ -281,6 +294,7 @@ struct dw_mipi_dsi { struct clk *pllref_clk; struct clk *pclk; + struct clk *phy_cfg_clk; unsigned int lane_mbps; /* per lane */ u32 channel; @@ -425,6 +439,12 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR); dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); + ret = clk_prepare_enable(dsi->phy_cfg_clk); + if (ret) { + dev_err(dsi->dev, "Failed to enable phy_cfg_clk\n"); + return ret; + } + dw_mipi_dsi_phy_write(dsi, 0x10, BYPASS_VCO_RANGE | VCO_RANGE_CON_SEL(vco) | VCO_IN_CAP_CON_LOW | @@ -481,17 +501,18 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) val, val & LOCK, 1000, PHY_STATUS_TIMEOUT_US); if (ret < 0) { dev_err(dsi->dev, "failed to wait for phy lock state\n"); - return ret; + goto phy_init_end; } ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, val, val & STOP_STATE_CLK_LANE, 1000, PHY_STATUS_TIMEOUT_US); - if (ret < 0) { + if (ret < 0) dev_err(dsi->dev, "failed to wait for phy clk lane stop state\n"); - return ret; - } + +phy_init_end: + clk_disable_unprepare(dsi->phy_cfg_clk); return ret; } @@ -960,6 +981,7 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) { struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; + const struct dw_mipi_dsi_plat_data *pdata = dsi->pdata; int mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder); u32 val; int ret; @@ -985,6 +1007,10 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) dw_mipi_dsi_dphy_interface_config(dsi); dw_mipi_dsi_clear_err(dsi); + if (pdata->grf_dsi0_mode_reg) + regmap_write(dsi->grf_regmap, pdata->grf_dsi0_mode_reg, + pdata->grf_dsi0_mode); + dw_mipi_dsi_phy_init(dsi); dw_mipi_dsi_wait_for_two_frames(mode); @@ -998,11 +1024,11 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) clk_disable_unprepare(dsi->pclk); if (mux) - val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16); + val = pdata->dsi0_en_bit | (pdata->dsi0_en_bit << 16); else - val = DSI0_SEL_VOP_LIT << 16; + val = pdata->dsi0_en_bit << 16; - regmap_write(dsi->grf_regmap, GRF_SOC_CON6, val); + regmap_write(dsi->grf_regmap, pdata->grf_switch_reg, val); dev_dbg(dsi->dev, "vop %s output to dsi0\n", (mux) ? "LIT" : "BIG"); } @@ -1161,14 +1187,29 @@ static enum drm_mode_status rk3288_mipi_dsi_mode_valid( } static struct dw_mipi_dsi_plat_data rk3288_mipi_dsi_drv_data = { + .dsi0_en_bit = RK3288_DSI0_SEL_VOP_LIT, + .dsi1_en_bit = RK3288_DSI1_SEL_VOP_LIT, + .grf_switch_reg = RK3288_GRF_SOC_CON6, .max_data_lanes = 4, .mode_valid = rk3288_mipi_dsi_mode_valid, }; +static struct dw_mipi_dsi_plat_data rk3399_mipi_dsi_drv_data = { + .dsi0_en_bit = RK3399_DSI0_SEL_VOP_LIT, + .dsi1_en_bit = RK3399_DSI1_SEL_VOP_LIT, + .grf_switch_reg = RK3399_GRF_SOC_CON19, + .grf_dsi0_mode = RK3399_GRF_DSI_MODE, + .grf_dsi0_mode_reg = RK3399_GRF_SOC_CON22, + .max_data_lanes = 4, +}; + static const struct of_device_id dw_mipi_dsi_dt_ids[] = { { .compatible = "rockchip,rk3288-mipi-dsi", .data = &rk3288_mipi_dsi_drv_data, + }, { + .compatible = "rockchip,rk3399-mipi-dsi", + .data = &rk3399_mipi_dsi_drv_data, }, { /* sentinel */ } }; @@ -1248,6 +1289,17 @@ static int dw_mipi_dsi_bind(struct device *dev, struct device *master, clk_disable_unprepare(dsi->pclk); } + dsi->phy_cfg_clk = devm_clk_get(dev, "phy_cfg"); + if (IS_ERR(dsi->phy_cfg_clk)) { + ret = PTR_ERR(dsi->phy_cfg_clk); + if (ret != -ENOENT) { + dev_err(dev, "Unable to get phy_cfg_clk: %d\n", ret); + return ret; + } + dsi->phy_cfg_clk = NULL; + dev_dbg(dev, "have not phy_cfg_clk\n"); + } + ret = clk_prepare_enable(dsi->pllref_clk); if (ret) { dev_err(dev, "%s: Failed to enable pllref_clk\n", __func__); -- 2.6.3 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Zhong Subject: [RESEND PATCH v7 2/7] drm/rockchip/dsi: dw-mipi: support RK3399 mipi dsi Date: Mon, 20 Feb 2017 16:02:18 +0800 Message-ID: <1487577744-2855-3-git-send-email-zyw@rock-chips.com> References: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: john@metanate.com, dianders@chromium.org, tfiga@chromium.org, heiko@sntech.de, yzq@rock-chips.com, mark.rutland@arm.com, devicetree@vger.kernel.org, robh+dt@kernel.org, galak@codeaurora.org, pawel.moll@arm.com, seanpaul@chromium.org Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, Chris Zhong , linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org VGhlIHZvcGIvdm9wbCBzd2l0Y2ggcmVnaXN0ZXIgb2YgUkszMzk5IG1pcGkgaXMgZGlmZmVyZW50 IGZyb20gUkszMjg4LAp0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBtaXBpIGRzaSBtb2RlIGlzIGRp ZmZlcmVudCB0b28sIHNvIGFkZCBhCm9mX2RldmljZV9pZCBzdHJ1Y3R1cmUgdG8gZGlzdGluZ3Vp c2ggdGhlbSwgYW5kIG1ha2Ugc3VyZSBzZXQgdGhlCmNvcnJlY3QgbW9kZSBiZWZvcmUgbWlwaSBw aHkgaW5pdC4KClNpZ25lZC1vZmYtYnk6IENocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+ ClNpZ25lZC1vZmYtYnk6IE1hcmsgWWFvIDxtYXJrLnlhb0Byb2NrLWNoaXBzLmNvbT4KUmV2aWV3 ZWQtYnk6IFNlYW4gUGF1bCA8c2VhbnBhdWxAY2hyb21pdW0ub3JnPgoKLS0tCgpDaGFuZ2VzIGlu IHY2OgotIG5vIG5lZWQgY2hlY2sgcGh5X2NmZ19jbGsgYmVmb3JlIGVuYWJsZS9kaXNhYmxlCgpD aGFuZ2VzIGluIHY1OgotIGNoZWNrIHRoZSBlcnJvciBvZiBwaHlfY2ZnX2NsayBpbiBkd19taXBp X2RzaV9iaW5kCgpDaGFuZ2VzIGluIHY0OgotIHJlbW92ZSB0aGUgdW5yZWxhdGVkIGNoYW5nZQoK Q2hhbmdlcyBpbiB2MzoKLSBiYXNlIG9uIEpvaG4gS2VlcGluZydzIHBhdGNoIHNlcmllcwoKIGRy aXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1taXBpLWRzaS5jIHwgNzIgKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLQogMSBmaWxlIGNoYW5nZWQsIDYyIGluc2VydGlvbnMoKyksIDEw IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1t aXBpLWRzaS5jIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1pcGktZHNpLmMKaW5kZXgg Y2M1OGFkYS4uNGU3NDY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3 LW1pcGktZHNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1pcGktZHNpLmMK QEAgLTI5LDkgKzI5LDE3IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUgICAgImR3LW1pcGktZHNp IgogCi0jZGVmaW5lIEdSRl9TT0NfQ09ONiAgICAgICAgICAgICAgICAgICAgMHgwMjVjCi0jZGVm aW5lIERTSTBfU0VMX1ZPUF9MSVQgICAgICAgICAgICAgICAgKDEgPDwgNikKLSNkZWZpbmUgRFNJ MV9TRUxfVk9QX0xJVCAgICAgICAgICAgICAgICAoMSA8PCA5KQorI2RlZmluZSBSSzMyODhfR1JG X1NPQ19DT042CQkweDAyNWMKKyNkZWZpbmUgUkszMjg4X0RTSTBfU0VMX1ZPUF9MSVQJCUJJVCg2 KQorI2RlZmluZSBSSzMyODhfRFNJMV9TRUxfVk9QX0xJVAkJQklUKDkpCisKKyNkZWZpbmUgUksz Mzk5X0dSRl9TT0NfQ09OMTkJCTB4NjI1MAorI2RlZmluZSBSSzMzOTlfRFNJMF9TRUxfVk9QX0xJ VAkJQklUKDApCisjZGVmaW5lIFJLMzM5OV9EU0kxX1NFTF9WT1BfTElUCQlCSVQoNCkKKworLyog ZGlzYWJsZSB0dXJucmVxdWVzdCwgdHVybmRpc2FibGUsIGZvcmNldHhzdG9wbW9kZSwgZm9yY2Vy eG1vZGUgKi8KKyNkZWZpbmUgUkszMzk5X0dSRl9TT0NfQ09OMjIJCTB4NjI1OAorI2RlZmluZSBS SzMzOTlfR1JGX0RTSV9NT0RFCQkweGZmZmYwMDAwCiAKICNkZWZpbmUgRFNJX1ZFUlNJT04JCQkw eDAwCiAjZGVmaW5lIERTSV9QV1JfVVAJCQkweDA0CkBAIC0yNjUsNiArMjczLDExIEBAIGVudW0g ewogfTsKIAogc3RydWN0IGR3X21pcGlfZHNpX3BsYXRfZGF0YSB7CisJdTMyIGRzaTBfZW5fYml0 OworCXUzMiBkc2kxX2VuX2JpdDsKKwl1MzIgZ3JmX3N3aXRjaF9yZWc7CisJdTMyIGdyZl9kc2kw X21vZGU7CisJdTMyIGdyZl9kc2kwX21vZGVfcmVnOwogCXVuc2lnbmVkIGludCBtYXhfZGF0YV9s YW5lczsKIAllbnVtIGRybV9tb2RlX3N0YXR1cyAoKm1vZGVfdmFsaWQpKHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IsCiAJCQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl KTsKQEAgLTI4MSw2ICsyOTQsNyBAQCBzdHJ1Y3QgZHdfbWlwaV9kc2kgewogCiAJc3RydWN0IGNs ayAqcGxscmVmX2NsazsKIAlzdHJ1Y3QgY2xrICpwY2xrOworCXN0cnVjdCBjbGsgKnBoeV9jZmdf Y2xrOwogCiAJdW5zaWduZWQgaW50IGxhbmVfbWJwczsgLyogcGVyIGxhbmUgKi8KIAl1MzIgY2hh bm5lbDsKQEAgLTQyNSw2ICs0MzksMTIgQEAgc3RhdGljIGludCBkd19taXBpX2RzaV9waHlfaW5p dChzdHJ1Y3QgZHdfbWlwaV9kc2kgKmRzaSkKIAlkc2lfd3JpdGUoZHNpLCBEU0lfUEhZX1RTVF9D VFJMMCwgUEhZX1RFU1RDTFIpOwogCWRzaV93cml0ZShkc2ksIERTSV9QSFlfVFNUX0NUUkwwLCBQ SFlfVU5URVNUQ0xSKTsKIAorCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkc2ktPnBoeV9jZmdf Y2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZHNpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxl IHBoeV9jZmdfY2xrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlkd19taXBpX2RzaV9waHlf d3JpdGUoZHNpLCAweDEwLCBCWVBBU1NfVkNPX1JBTkdFIHwKIAkJCQkJIFZDT19SQU5HRV9DT05f U0VMKHZjbykgfAogCQkJCQkgVkNPX0lOX0NBUF9DT05fTE9XIHwKQEAgLTQ4MSwxNyArNTAxLDE4 IEBAIHN0YXRpYyBpbnQgZHdfbWlwaV9kc2lfcGh5X2luaXQoc3RydWN0IGR3X21pcGlfZHNpICpk c2kpCiAJCQkJIHZhbCwgdmFsICYgTE9DSywgMTAwMCwgUEhZX1NUQVRVU19USU1FT1VUX1VTKTsK IAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRzaS0+ZGV2LCAiZmFpbGVkIHRvIHdhaXQgZm9y IHBoeSBsb2NrIHN0YXRlXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBwaHlfaW5pdF9lbmQ7 CiAJfQogCiAJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KGRzaS0+YmFzZSArIERTSV9QSFlfU1RB VFVTLAogCQkJCSB2YWwsIHZhbCAmIFNUT1BfU1RBVEVfQ0xLX0xBTkUsIDEwMDAsCiAJCQkJIFBI WV9TVEFUVVNfVElNRU9VVF9VUyk7Ci0JaWYgKHJldCA8IDApIHsKKwlpZiAocmV0IDwgMCkKIAkJ ZGV2X2Vycihkc2ktPmRldiwKIAkJCSJmYWlsZWQgdG8gd2FpdCBmb3IgcGh5IGNsayBsYW5lIHN0 b3Agc3RhdGVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KKworcGh5X2luaXRfZW5kOgorCWNsa19k aXNhYmxlX3VucHJlcGFyZShkc2ktPnBoeV9jZmdfY2xrKTsKIAogCXJldHVybiByZXQ7CiB9CkBA IC05NjAsNiArOTgxLDcgQEAgc3RhdGljIHZvaWQgZHdfbWlwaV9kc2lfZW5jb2Rlcl9lbmFibGUo c3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQogewogCXN0cnVjdCBkd19taXBpX2RzaSAqZHNp ID0gZW5jb2Rlcl90b19kc2koZW5jb2Rlcik7CiAJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUgPSAmZW5jb2Rlci0+Y3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7CisJY29uc3Qgc3RydWN0 IGR3X21pcGlfZHNpX3BsYXRfZGF0YSAqcGRhdGEgPSBkc2ktPnBkYXRhOwogCWludCBtdXggPSBk cm1fb2ZfZW5jb2Rlcl9hY3RpdmVfZW5kcG9pbnRfaWQoZHNpLT5kZXYtPm9mX25vZGUsIGVuY29k ZXIpOwogCXUzMiB2YWw7CiAJaW50IHJldDsKQEAgLTk4NSw2ICsxMDA3LDEwIEBAIHN0YXRpYyB2 b2lkIGR3X21pcGlfZHNpX2VuY29kZXJfZW5hYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rl cikKIAlkd19taXBpX2RzaV9kcGh5X2ludGVyZmFjZV9jb25maWcoZHNpKTsKIAlkd19taXBpX2Rz aV9jbGVhcl9lcnIoZHNpKTsKIAorCWlmIChwZGF0YS0+Z3JmX2RzaTBfbW9kZV9yZWcpCisJCXJl Z21hcF93cml0ZShkc2ktPmdyZl9yZWdtYXAsIHBkYXRhLT5ncmZfZHNpMF9tb2RlX3JlZywKKwkJ CSAgICAgcGRhdGEtPmdyZl9kc2kwX21vZGUpOworCiAJZHdfbWlwaV9kc2lfcGh5X2luaXQoZHNp KTsKIAlkd19taXBpX2RzaV93YWl0X2Zvcl90d29fZnJhbWVzKG1vZGUpOwogCkBAIC05OTgsMTEg KzEwMjQsMTEgQEAgc3RhdGljIHZvaWQgZHdfbWlwaV9kc2lfZW5jb2Rlcl9lbmFibGUoc3RydWN0 IGRybV9lbmNvZGVyICplbmNvZGVyKQogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkc2ktPnBjbGsp OwogCiAJaWYgKG11eCkKLQkJdmFsID0gRFNJMF9TRUxfVk9QX0xJVCB8IChEU0kwX1NFTF9WT1Bf TElUIDw8IDE2KTsKKwkJdmFsID0gcGRhdGEtPmRzaTBfZW5fYml0IHwgKHBkYXRhLT5kc2kwX2Vu X2JpdCA8PCAxNik7CiAJZWxzZQotCQl2YWwgPSBEU0kwX1NFTF9WT1BfTElUIDw8IDE2OworCQl2 YWwgPSBwZGF0YS0+ZHNpMF9lbl9iaXQgPDwgMTY7CiAKLQlyZWdtYXBfd3JpdGUoZHNpLT5ncmZf cmVnbWFwLCBHUkZfU09DX0NPTjYsIHZhbCk7CisJcmVnbWFwX3dyaXRlKGRzaS0+Z3JmX3JlZ21h cCwgcGRhdGEtPmdyZl9zd2l0Y2hfcmVnLCB2YWwpOwogCWRldl9kYmcoZHNpLT5kZXYsICJ2b3Ag JXMgb3V0cHV0IHRvIGRzaTBcbiIsIChtdXgpID8gIkxJVCIgOiAiQklHIik7CiB9CiAKQEAgLTEx NjEsMTQgKzExODcsMjkgQEAgc3RhdGljIGVudW0gZHJtX21vZGVfc3RhdHVzIHJrMzI4OF9taXBp X2RzaV9tb2RlX3ZhbGlkKAogfQogCiBzdGF0aWMgc3RydWN0IGR3X21pcGlfZHNpX3BsYXRfZGF0 YSByazMyODhfbWlwaV9kc2lfZHJ2X2RhdGEgPSB7CisJLmRzaTBfZW5fYml0ID0gUkszMjg4X0RT STBfU0VMX1ZPUF9MSVQsCisJLmRzaTFfZW5fYml0ID0gUkszMjg4X0RTSTFfU0VMX1ZPUF9MSVQs CisJLmdyZl9zd2l0Y2hfcmVnID0gUkszMjg4X0dSRl9TT0NfQ09ONiwKIAkubWF4X2RhdGFfbGFu ZXMgPSA0LAogCS5tb2RlX3ZhbGlkID0gcmszMjg4X21pcGlfZHNpX21vZGVfdmFsaWQsCiB9Owog CitzdGF0aWMgc3RydWN0IGR3X21pcGlfZHNpX3BsYXRfZGF0YSByazMzOTlfbWlwaV9kc2lfZHJ2 X2RhdGEgPSB7CisJLmRzaTBfZW5fYml0ID0gUkszMzk5X0RTSTBfU0VMX1ZPUF9MSVQsCisJLmRz aTFfZW5fYml0ID0gUkszMzk5X0RTSTFfU0VMX1ZPUF9MSVQsCisJLmdyZl9zd2l0Y2hfcmVnID0g UkszMzk5X0dSRl9TT0NfQ09OMTksCisJLmdyZl9kc2kwX21vZGUgPSBSSzMzOTlfR1JGX0RTSV9N T0RFLAorCS5ncmZfZHNpMF9tb2RlX3JlZyA9IFJLMzM5OV9HUkZfU09DX0NPTjIyLAorCS5tYXhf ZGF0YV9sYW5lcyA9IDQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBk d19taXBpX2RzaV9kdF9pZHNbXSA9IHsKIAl7CiAJIC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJr MzI4OC1taXBpLWRzaSIsCiAJIC5kYXRhID0gJnJrMzI4OF9taXBpX2RzaV9kcnZfZGF0YSwKKwl9 LCB7CisJIC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1taXBpLWRzaSIsCisJIC5kYXRh ID0gJnJrMzM5OV9taXBpX2RzaV9kcnZfZGF0YSwKIAl9LAogCXsgLyogc2VudGluZWwgKi8gfQog fTsKQEAgLTEyNDgsNiArMTI4OSwxNyBAQCBzdGF0aWMgaW50IGR3X21pcGlfZHNpX2JpbmQoc3Ry dWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCiAJCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShkc2ktPnBjbGspOwogCX0KIAorCWRzaS0+cGh5X2NmZ19jbGsgPSBkZXZtX2Nsa19n ZXQoZGV2LCAicGh5X2NmZyIpOworCWlmIChJU19FUlIoZHNpLT5waHlfY2ZnX2NsaykpIHsKKwkJ cmV0ID0gUFRSX0VSUihkc2ktPnBoeV9jZmdfY2xrKTsKKwkJaWYgKHJldCAhPSAtRU5PRU5UKSB7 CisJCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBnZXQgcGh5X2NmZ19jbGs6ICVkXG4iLCByZXQp OworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkc2ktPnBoeV9jZmdfY2xrID0gTlVMTDsKKwkJZGV2 X2RiZyhkZXYsICJoYXZlIG5vdCBwaHlfY2ZnX2Nsa1xuIik7CisJfQorCiAJcmV0ID0gY2xrX3By ZXBhcmVfZW5hYmxlKGRzaS0+cGxscmVmX2Nsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRl diwgIiVzOiBGYWlsZWQgdG8gZW5hYmxlIHBsbHJlZl9jbGtcbiIsIF9fZnVuY19fKTsKLS0gCjIu Ni4zCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmkt ZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: zyw@rock-chips.com (Chris Zhong) Date: Mon, 20 Feb 2017 16:02:18 +0800 Subject: [RESEND PATCH v7 2/7] drm/rockchip/dsi: dw-mipi: support RK3399 mipi dsi In-Reply-To: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> References: <1487577744-2855-1-git-send-email-zyw@rock-chips.com> Message-ID: <1487577744-2855-3-git-send-email-zyw@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org The vopb/vopl switch register of RK3399 mipi is different from RK3288, the default setting for mipi dsi mode is different too, so add a of_device_id structure to distinguish them, and make sure set the correct mode before mipi phy init. Signed-off-by: Chris Zhong Signed-off-by: Mark Yao Reviewed-by: Sean Paul --- Changes in v6: - no need check phy_cfg_clk before enable/disable Changes in v5: - check the error of phy_cfg_clk in dw_mipi_dsi_bind Changes in v4: - remove the unrelated change Changes in v3: - base on John Keeping's patch series drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 72 +++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cc58ada..4e74681 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -29,9 +29,17 @@ #define DRIVER_NAME "dw-mipi-dsi" -#define GRF_SOC_CON6 0x025c -#define DSI0_SEL_VOP_LIT (1 << 6) -#define DSI1_SEL_VOP_LIT (1 << 9) +#define RK3288_GRF_SOC_CON6 0x025c +#define RK3288_DSI0_SEL_VOP_LIT BIT(6) +#define RK3288_DSI1_SEL_VOP_LIT BIT(9) + +#define RK3399_GRF_SOC_CON19 0x6250 +#define RK3399_DSI0_SEL_VOP_LIT BIT(0) +#define RK3399_DSI1_SEL_VOP_LIT BIT(4) + +/* disable turnrequest, turndisable, forcetxstopmode, forcerxmode */ +#define RK3399_GRF_SOC_CON22 0x6258 +#define RK3399_GRF_DSI_MODE 0xffff0000 #define DSI_VERSION 0x00 #define DSI_PWR_UP 0x04 @@ -265,6 +273,11 @@ enum { }; struct dw_mipi_dsi_plat_data { + u32 dsi0_en_bit; + u32 dsi1_en_bit; + u32 grf_switch_reg; + u32 grf_dsi0_mode; + u32 grf_dsi0_mode_reg; unsigned int max_data_lanes; enum drm_mode_status (*mode_valid)(struct drm_connector *connector, struct drm_display_mode *mode); @@ -281,6 +294,7 @@ struct dw_mipi_dsi { struct clk *pllref_clk; struct clk *pclk; + struct clk *phy_cfg_clk; unsigned int lane_mbps; /* per lane */ u32 channel; @@ -425,6 +439,12 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLR); dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_UNTESTCLR); + ret = clk_prepare_enable(dsi->phy_cfg_clk); + if (ret) { + dev_err(dsi->dev, "Failed to enable phy_cfg_clk\n"); + return ret; + } + dw_mipi_dsi_phy_write(dsi, 0x10, BYPASS_VCO_RANGE | VCO_RANGE_CON_SEL(vco) | VCO_IN_CAP_CON_LOW | @@ -481,17 +501,18 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) val, val & LOCK, 1000, PHY_STATUS_TIMEOUT_US); if (ret < 0) { dev_err(dsi->dev, "failed to wait for phy lock state\n"); - return ret; + goto phy_init_end; } ret = readl_poll_timeout(dsi->base + DSI_PHY_STATUS, val, val & STOP_STATE_CLK_LANE, 1000, PHY_STATUS_TIMEOUT_US); - if (ret < 0) { + if (ret < 0) dev_err(dsi->dev, "failed to wait for phy clk lane stop state\n"); - return ret; - } + +phy_init_end: + clk_disable_unprepare(dsi->phy_cfg_clk); return ret; } @@ -960,6 +981,7 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) { struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; + const struct dw_mipi_dsi_plat_data *pdata = dsi->pdata; int mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder); u32 val; int ret; @@ -985,6 +1007,10 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) dw_mipi_dsi_dphy_interface_config(dsi); dw_mipi_dsi_clear_err(dsi); + if (pdata->grf_dsi0_mode_reg) + regmap_write(dsi->grf_regmap, pdata->grf_dsi0_mode_reg, + pdata->grf_dsi0_mode); + dw_mipi_dsi_phy_init(dsi); dw_mipi_dsi_wait_for_two_frames(mode); @@ -998,11 +1024,11 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder) clk_disable_unprepare(dsi->pclk); if (mux) - val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16); + val = pdata->dsi0_en_bit | (pdata->dsi0_en_bit << 16); else - val = DSI0_SEL_VOP_LIT << 16; + val = pdata->dsi0_en_bit << 16; - regmap_write(dsi->grf_regmap, GRF_SOC_CON6, val); + regmap_write(dsi->grf_regmap, pdata->grf_switch_reg, val); dev_dbg(dsi->dev, "vop %s output to dsi0\n", (mux) ? "LIT" : "BIG"); } @@ -1161,14 +1187,29 @@ static enum drm_mode_status rk3288_mipi_dsi_mode_valid( } static struct dw_mipi_dsi_plat_data rk3288_mipi_dsi_drv_data = { + .dsi0_en_bit = RK3288_DSI0_SEL_VOP_LIT, + .dsi1_en_bit = RK3288_DSI1_SEL_VOP_LIT, + .grf_switch_reg = RK3288_GRF_SOC_CON6, .max_data_lanes = 4, .mode_valid = rk3288_mipi_dsi_mode_valid, }; +static struct dw_mipi_dsi_plat_data rk3399_mipi_dsi_drv_data = { + .dsi0_en_bit = RK3399_DSI0_SEL_VOP_LIT, + .dsi1_en_bit = RK3399_DSI1_SEL_VOP_LIT, + .grf_switch_reg = RK3399_GRF_SOC_CON19, + .grf_dsi0_mode = RK3399_GRF_DSI_MODE, + .grf_dsi0_mode_reg = RK3399_GRF_SOC_CON22, + .max_data_lanes = 4, +}; + static const struct of_device_id dw_mipi_dsi_dt_ids[] = { { .compatible = "rockchip,rk3288-mipi-dsi", .data = &rk3288_mipi_dsi_drv_data, + }, { + .compatible = "rockchip,rk3399-mipi-dsi", + .data = &rk3399_mipi_dsi_drv_data, }, { /* sentinel */ } }; @@ -1248,6 +1289,17 @@ static int dw_mipi_dsi_bind(struct device *dev, struct device *master, clk_disable_unprepare(dsi->pclk); } + dsi->phy_cfg_clk = devm_clk_get(dev, "phy_cfg"); + if (IS_ERR(dsi->phy_cfg_clk)) { + ret = PTR_ERR(dsi->phy_cfg_clk); + if (ret != -ENOENT) { + dev_err(dev, "Unable to get phy_cfg_clk: %d\n", ret); + return ret; + } + dsi->phy_cfg_clk = NULL; + dev_dbg(dev, "have not phy_cfg_clk\n"); + } + ret = clk_prepare_enable(dsi->pllref_clk); if (ret) { dev_err(dev, "%s: Failed to enable pllref_clk\n", __func__); -- 2.6.3