From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Keeping Subject: [PATCH v3 16/24] drm/rockchip: dw-mipi-dsi: properly configure PHY timing Date: Sun, 29 Jan 2017 13:24:36 +0000 Message-ID: <20170129132444.25251-17-john@metanate.com> References: <20170129132444.25251-1-john@metanate.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170129132444.25251-1-john@metanate.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao 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: linux-rockchip.vger.kernel.org VGhlc2UgdmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgY29uc3RhbnQgdGltZSBwZXJpb2RzIGJ1dCB0 aGUgUEhZCmNvbmZpZ3VyYXRpb24gaXMgaW4gdGVybXMgb2YgdGhlIGN1cnJlbnQgbGFuZSBieXRl IGNsb2NrIHNvIHVzaW5nCmNvbnN0YW50IHZhbHVlcyBndWFyYW50ZWVzIHRoYXQgdGhlIHRpbWlu Z3Mgd2lsbCBiZSBvdXRzaWRlIHRoZQpzcGVjaWZpY2F0aW9uIHdpdGggc29tZSBkaXNwbGF5IGNv bmZpZ3VyYXRpb25zLgoKRGVyaXZlIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBmcm9tIHRo ZSBieXRlIGNsb2NrIGluIG9yZGVyIHRvCmVuc3VyZSB0aGF0IHRoZSBQSFkgY29uZmlndXJhdGlv biBpcyBjb3JyZWN0LgoKU2lnbmVkLW9mZi1ieTogSm9obiBLZWVwaW5nIDxqb2huQG1ldGFuYXRl LmNvbT4KLS0tCnYzOgotIFdyYXAgc29tZSBsb25nIGxpbmVzClVuY2hhbmdlZCBpbiB2MgoKIGRy aXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kdy1taXBpLWRzaS5jIHwgMzkgKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrLS0tLQogMSBmaWxlIGNoYW5nZWQsIDM1IGluc2VydGlvbnMoKyksIDQg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1p cGktZHNpLmMgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYwppbmRleCBj ZmU3ZTRiYTMwNWMuLjg1ZWRmNmRkMmJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL2R3LW1pcGktZHNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2R3LW1p cGktZHNpLmMKQEAgLTM4Myw2ICszODMsMjYgQEAgc3RhdGljIHZvaWQgZHdfbWlwaV9kc2lfcGh5 X3dyaXRlKHN0cnVjdCBkd19taXBpX2RzaSAqZHNpLCB1OCB0ZXN0X2NvZGUsCiAJZHNpX3dyaXRl KGRzaSwgRFNJX1BIWV9UU1RfQ1RSTDAsIFBIWV9URVNUQ0xLIHwgUEhZX1VOVEVTVENMUik7CiB9 CiAKKy8qKgorICogbnMyYmMgLSBOYW5vc2Vjb25kcyB0byBieXRlIGNsb2NrIGN5Y2xlcworICov CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBuczJiYyhzdHJ1Y3QgZHdfbWlwaV9kc2kgKmRz aSwgaW50IG5zKQoreworCXVuc2lnbmVkIGxvbmcgYnl0ZV9jbGtfa2h6ID0gZHNpLT5sYW5lX21i cHMgKiBNU0VDX1BFUl9TRUMgLyA4OworCisJcmV0dXJuIChucyAqIChieXRlX2Nsa19raHogLyAx MDAwKSArIDk5OSkgLyAxMDAwOworfQorCisvKioKKyAqIG5zMnVpIC0gTmFub3NlY29uZHMgdG8g VUkgdGltZSBwZXJpb2RzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5zMnVpKHN0 cnVjdCBkd19taXBpX2RzaSAqZHNpLCBpbnQgbnMpCit7CisJdW5zaWduZWQgbG9uZyBieXRlX2Ns a19raHogPSBkc2ktPmxhbmVfbWJwcyAqIE1TRUNfUEVSX1NFQzsKKworCXJldHVybiAobnMgKiAo Ynl0ZV9jbGtfa2h6IC8gMTAwMCkgKyA5OTkpIC8gMTAwMDsKK30KKwogc3RhdGljIGludCBkd19t aXBpX2RzaV9waHlfaW5pdChzdHJ1Y3QgZHdfbWlwaV9kc2kgKmRzaSkKIHsKIAlpbnQgcmV0LCB0 ZXN0ZGluLCB2Y28sIHZhbDsKQEAgLTQzNCwxMCArNDU0LDIxIEBAIHN0YXRpYyBpbnQgZHdfbWlw aV9kc2lfcGh5X2luaXQoc3RydWN0IGR3X21pcGlfZHNpICpkc2kpCiAJCQkJCSBTRVRSRF9NQVgg fCBQT1dFUl9NQU5BR0UgfAogCQkJCQkgVEVSX1JFU0lTVE9SU19PTik7CiAKLQotCWR3X21pcGlf ZHNpX3BoeV93cml0ZShkc2ksIDB4NzAsIFRMUF9QUk9HUkFNX0VOIHwgMHhmKTsKLQlkd19taXBp X2RzaV9waHlfd3JpdGUoZHNpLCAweDcxLCBUSFNfUFJFX1BST0dSQU1fRU4gfCAweDU1KTsKLQlk d19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAweDcyLCBUSFNfWkVST19QUk9HUkFNX0VOIHwgMHhh KTsKKwlkd19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAweDYwLCBUTFBfUFJPR1JBTV9FTiB8IG5z MmJjKGRzaSwgNTAwKSk7CisJZHdfbWlwaV9kc2lfcGh5X3dyaXRlKGRzaSwgMHg2MSwgVEhTX1BS RV9QUk9HUkFNX0VOIHwgbnMydWkoZHNpLCA0MCkpOworCWR3X21pcGlfZHNpX3BoeV93cml0ZShk c2ksIDB4NjIsIFRIU19aRVJPX1BST0dSQU1fRU4gfCBuczJiYyhkc2ksIDMwMCkpOworCWR3X21p cGlfZHNpX3BoeV93cml0ZShkc2ksIDB4NjMsIFRIU19QUkVfUFJPR1JBTV9FTiB8IG5zMnVpKGRz aSwgMTAwKSk7CisJZHdfbWlwaV9kc2lfcGh5X3dyaXRlKGRzaSwgMHg2NCwgQklUKDUpIHwgbnMy YmMoZHNpLCAxMDApKTsKKwlkd19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAweDY1LCBCSVQoNSkg fCAobnMyYmMoZHNpLCA2MCkgKyA3KSk7CisKKwlkd19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAw eDcwLCBUTFBfUFJPR1JBTV9FTiB8IG5zMmJjKGRzaSwgNTAwKSk7CisJZHdfbWlwaV9kc2lfcGh5 X3dyaXRlKGRzaSwgMHg3MSwKKwkJCSAgICAgIFRIU19QUkVfUFJPR1JBTV9FTiB8IChuczJ1aShk c2ksIDUwKSArIDUpKTsKKwlkd19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAweDcyLAorCQkJICAg ICAgVEhTX1pFUk9fUFJPR1JBTV9FTiB8IChuczJiYyhkc2ksIDE0MCkgKyAyKSk7CisJZHdfbWlw aV9kc2lfcGh5X3dyaXRlKGRzaSwgMHg3MywKKwkJCSAgICAgIFRIU19QUkVfUFJPR1JBTV9FTiB8 IChuczJ1aShkc2ksIDYwKSArIDgpKTsKKwlkd19taXBpX2RzaV9waHlfd3JpdGUoZHNpLCAweDc0 LCBCSVQoNSkgfCBuczJiYyhkc2ksIDEwMCkpOwogCiAJZHNpX3dyaXRlKGRzaSwgRFNJX1BIWV9S U1RaLCBQSFlfRU5GT1JDRVBMTCB8IFBIWV9FTkFCTEVDTEsgfAogCQkJCSAgICAgUEhZX1VOUlNU WiB8IFBIWV9VTlNIVVRET1dOWik7Ci0tIAoyLjExLjAuMTk3LmdiNTU2ZGU1LmRpcnR5CgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFp bGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: john@metanate.com (John Keeping) Date: Sun, 29 Jan 2017 13:24:36 +0000 Subject: [PATCH v3 16/24] drm/rockchip: dw-mipi-dsi: properly configure PHY timing In-Reply-To: <20170129132444.25251-1-john@metanate.com> References: <20170129132444.25251-1-john@metanate.com> Message-ID: <20170129132444.25251-17-john@metanate.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org These values are specified as constant time periods but the PHY configuration is in terms of the current lane byte clock so using constant values guarantees that the timings will be outside the specification with some display configurations. Derive the necessary configuration from the byte clock in order to ensure that the PHY configuration is correct. Signed-off-by: John Keeping --- v3: - Wrap some long lines Unchanged in v2 drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 39 ++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cfe7e4ba305c..85edf6dd2bac 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -383,6 +383,26 @@ static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi *dsi, u8 test_code, dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR); } +/** + * ns2bc - Nanoseconds to byte clock cycles + */ +static inline unsigned int ns2bc(struct dw_mipi_dsi *dsi, int ns) +{ + unsigned long byte_clk_khz = dsi->lane_mbps * MSEC_PER_SEC / 8; + + return (ns * (byte_clk_khz / 1000) + 999) / 1000; +} + +/** + * ns2ui - Nanoseconds to UI time periods + */ +static inline unsigned int ns2ui(struct dw_mipi_dsi *dsi, int ns) +{ + unsigned long byte_clk_khz = dsi->lane_mbps * MSEC_PER_SEC; + + return (ns * (byte_clk_khz / 1000) + 999) / 1000; +} + static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) { int ret, testdin, vco, val; @@ -434,10 +454,21 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) SETRD_MAX | POWER_MANAGE | TER_RESISTORS_ON); - - dw_mipi_dsi_phy_write(dsi, 0x70, TLP_PROGRAM_EN | 0xf); - dw_mipi_dsi_phy_write(dsi, 0x71, THS_PRE_PROGRAM_EN | 0x55); - dw_mipi_dsi_phy_write(dsi, 0x72, THS_ZERO_PROGRAM_EN | 0xa); + dw_mipi_dsi_phy_write(dsi, 0x60, TLP_PROGRAM_EN | ns2bc(dsi, 500)); + dw_mipi_dsi_phy_write(dsi, 0x61, THS_PRE_PROGRAM_EN | ns2ui(dsi, 40)); + dw_mipi_dsi_phy_write(dsi, 0x62, THS_ZERO_PROGRAM_EN | ns2bc(dsi, 300)); + dw_mipi_dsi_phy_write(dsi, 0x63, THS_PRE_PROGRAM_EN | ns2ui(dsi, 100)); + dw_mipi_dsi_phy_write(dsi, 0x64, BIT(5) | ns2bc(dsi, 100)); + dw_mipi_dsi_phy_write(dsi, 0x65, BIT(5) | (ns2bc(dsi, 60) + 7)); + + dw_mipi_dsi_phy_write(dsi, 0x70, TLP_PROGRAM_EN | ns2bc(dsi, 500)); + dw_mipi_dsi_phy_write(dsi, 0x71, + THS_PRE_PROGRAM_EN | (ns2ui(dsi, 50) + 5)); + dw_mipi_dsi_phy_write(dsi, 0x72, + THS_ZERO_PROGRAM_EN | (ns2bc(dsi, 140) + 2)); + dw_mipi_dsi_phy_write(dsi, 0x73, + THS_PRE_PROGRAM_EN | (ns2ui(dsi, 60) + 8)); + dw_mipi_dsi_phy_write(dsi, 0x74, BIT(5) | ns2bc(dsi, 100)); dsi_write(dsi, DSI_PHY_RSTZ, PHY_ENFORCEPLL | PHY_ENABLECLK | PHY_UNRSTZ | PHY_UNSHUTDOWNZ); -- 2.11.0.197.gb556de5.dirty From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751225AbdA2OIK (ORCPT ); Sun, 29 Jan 2017 09:08:10 -0500 Received: from dougal.metanate.com ([90.155.101.14]:1302 "EHLO metanate.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750982AbdA2OIG (ORCPT ); Sun, 29 Jan 2017 09:08:06 -0500 From: John Keeping To: Mark Yao Cc: Chris Zhong , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org, John Keeping Subject: [PATCH v3 16/24] drm/rockchip: dw-mipi-dsi: properly configure PHY timing Date: Sun, 29 Jan 2017 13:24:36 +0000 Message-Id: <20170129132444.25251-17-john@metanate.com> X-Mailer: git-send-email 2.11.0.197.gb556de5.dirty In-Reply-To: <20170129132444.25251-1-john@metanate.com> References: <20170129132444.25251-1-john@metanate.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org These values are specified as constant time periods but the PHY configuration is in terms of the current lane byte clock so using constant values guarantees that the timings will be outside the specification with some display configurations. Derive the necessary configuration from the byte clock in order to ensure that the PHY configuration is correct. Signed-off-by: John Keeping --- v3: - Wrap some long lines Unchanged in v2 drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 39 ++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cfe7e4ba305c..85edf6dd2bac 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -383,6 +383,26 @@ static void dw_mipi_dsi_phy_write(struct dw_mipi_dsi *dsi, u8 test_code, dsi_write(dsi, DSI_PHY_TST_CTRL0, PHY_TESTCLK | PHY_UNTESTCLR); } +/** + * ns2bc - Nanoseconds to byte clock cycles + */ +static inline unsigned int ns2bc(struct dw_mipi_dsi *dsi, int ns) +{ + unsigned long byte_clk_khz = dsi->lane_mbps * MSEC_PER_SEC / 8; + + return (ns * (byte_clk_khz / 1000) + 999) / 1000; +} + +/** + * ns2ui - Nanoseconds to UI time periods + */ +static inline unsigned int ns2ui(struct dw_mipi_dsi *dsi, int ns) +{ + unsigned long byte_clk_khz = dsi->lane_mbps * MSEC_PER_SEC; + + return (ns * (byte_clk_khz / 1000) + 999) / 1000; +} + static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) { int ret, testdin, vco, val; @@ -434,10 +454,21 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi) SETRD_MAX | POWER_MANAGE | TER_RESISTORS_ON); - - dw_mipi_dsi_phy_write(dsi, 0x70, TLP_PROGRAM_EN | 0xf); - dw_mipi_dsi_phy_write(dsi, 0x71, THS_PRE_PROGRAM_EN | 0x55); - dw_mipi_dsi_phy_write(dsi, 0x72, THS_ZERO_PROGRAM_EN | 0xa); + dw_mipi_dsi_phy_write(dsi, 0x60, TLP_PROGRAM_EN | ns2bc(dsi, 500)); + dw_mipi_dsi_phy_write(dsi, 0x61, THS_PRE_PROGRAM_EN | ns2ui(dsi, 40)); + dw_mipi_dsi_phy_write(dsi, 0x62, THS_ZERO_PROGRAM_EN | ns2bc(dsi, 300)); + dw_mipi_dsi_phy_write(dsi, 0x63, THS_PRE_PROGRAM_EN | ns2ui(dsi, 100)); + dw_mipi_dsi_phy_write(dsi, 0x64, BIT(5) | ns2bc(dsi, 100)); + dw_mipi_dsi_phy_write(dsi, 0x65, BIT(5) | (ns2bc(dsi, 60) + 7)); + + dw_mipi_dsi_phy_write(dsi, 0x70, TLP_PROGRAM_EN | ns2bc(dsi, 500)); + dw_mipi_dsi_phy_write(dsi, 0x71, + THS_PRE_PROGRAM_EN | (ns2ui(dsi, 50) + 5)); + dw_mipi_dsi_phy_write(dsi, 0x72, + THS_ZERO_PROGRAM_EN | (ns2bc(dsi, 140) + 2)); + dw_mipi_dsi_phy_write(dsi, 0x73, + THS_PRE_PROGRAM_EN | (ns2ui(dsi, 60) + 8)); + dw_mipi_dsi_phy_write(dsi, 0x74, BIT(5) | ns2bc(dsi, 100)); dsi_write(dsi, DSI_PHY_RSTZ, PHY_ENFORCEPLL | PHY_ENABLECLK | PHY_UNRSTZ | PHY_UNSHUTDOWNZ); -- 2.11.0.197.gb556de5.dirty