From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Keeping Subject: [PATCH v3 24/24] drm/rockchip: dw-mipi-dsi: support read commands Date: Sun, 29 Jan 2017 13:24:44 +0000 Message-ID: <20170129132444.25251-25-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 SSBoYXZlbid0IGZvdW5kIGFueSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGxlbmd0aCBvZiBhIHJl c3BvbnNlLCBzbyB0aGlzCmp1c3QgdXNlcyB0aGUgcmVxdWVzdGVkIHJ4X2xlbgoKU2lnbmVkLW9m Zi1ieTogSm9obiBLZWVwaW5nIDxqb2huQG1ldGFuYXRlLmNvbT4KLS0tCnYzOgotIEZpeCBjaGVj a3BhdGNoIHdhcm5pbmdzClVuY2hhbmdlZCBpbiB2MgoKIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hp cC9kdy1taXBpLWRzaS5jIHwgNTYgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog MSBmaWxlIGNoYW5nZWQsIDU2IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9k dy1taXBpLWRzaS5jCmluZGV4IGNmM2NhNmIwY2JkYi4uY2M1OGFkYTc1NDI1IDEwMDY0NAotLS0g YS9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vcm9ja2NoaXAvZHctbWlwaS1kc2kuYwpAQCAtNjc4LDYgKzY3OCw1NiBAQCBzdGF0aWMg aW50IGR3X21pcGlfZHNpX2Rjc19sb25nX3dyaXRlKHN0cnVjdCBkd19taXBpX2RzaSAqZHNpLAog CXJldHVybiBkd19taXBpX2RzaV9nZW5fcGt0X2hkcl93cml0ZShkc2ksIGhkcl92YWwpOwogfQog CitzdGF0aWMgaW50IGR3X21pcGlfZHNpX2Rjc19yZWFkKHN0cnVjdCBkd19taXBpX2RzaSAqZHNp LAorCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKK3sKKwljb25zdCB1OCAqdHhf YnVmID0gbXNnLT50eF9idWY7CisJdTggKnJ4X2J1ZiA9IG1zZy0+cnhfYnVmOworCXNpemVfdCBp OworCWludCByZXQsIHZhbDsKKworCWRzaV93cml0ZShkc2ksIERTSV9QQ0tIRExfQ0ZHLCBFTl9D UkNfUlggfCBFTl9FQ0NfUlggfCBFTl9CVEEpOworCWRzaV93cml0ZShkc2ksIERTSV9HRU5fSERS LAorCQkgIEdFTl9IREFUQSh0eF9idWZbMF0pIHwgR0VOX0hUWVBFKG1zZy0+dHlwZSkpOworCisJ cmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KGRzaS0+YmFzZSArIERTSV9DTURfUEtUX1NUQVRVUywK KwkJCQkgdmFsLCAhKHZhbCAmIEdFTl9SRF9DTURfQlVTWSksIDEwMDAsCisJCQkJIENNRF9QS1Rf U1RBVFVTX1RJTUVPVVRfVVMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNpLT5kZXYs ICJmYWlsZWQgdG8gcmVhZCBjb21tYW5kIHJlc3BvbnNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9 CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnLT5yeF9sZW47KSB7CisJCXUzMiBwbGQgPSBkc2lfcmVh ZChkc2ksIERTSV9HRU5fUExEX0RBVEEpOworCisJCXdoaWxlIChpIDwgbXNnLT5yeF9sZW4pIHsK KwkJCXJ4X2J1ZltpXSA9IHBsZCAmIDB4ZmY7CisJCQlwbGQgPj49IDg7CisJCQlpKys7CisJCX0K Kwl9CisKKwlyZXR1cm4gbXNnLT5yeF9sZW47Cit9CisKK3N0YXRpYyBpbnQgZHdfbWlwaV9kc2lf c2V0X21heF9yZXR1cm5fcGFja2V0X3NpemUoc3RydWN0IGR3X21pcGlfZHNpICpkc2ksCisJCQkJ CQkgIHNpemVfdCBsZW4pCit7CisJdTggdmFsW10gPSB7IGxlbiAmIDB4ZmYsIChsZW4gPj4gOCkg JiAweGZmIH07CisJc3RydWN0IG1pcGlfZHNpX21zZyBtc2cgPSB7CisJCS5jaGFubmVsID0gZHNp LT5jaGFubmVsLAorCQkudHlwZSA9IE1JUElfRFNJX1NFVF9NQVhJTVVNX1JFVFVSTl9QQUNLRVRf U0laRSwKKwkJLnR4X2J1ZiA9IHZhbCwKKwkJLnR4X2xlbiA9IDIsCisJfTsKKworCWlmIChsZW4g PiAweGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGR3X21pcGlfZHNpX2Rjc19z aG9ydF93cml0ZShkc2ksICZtc2cpOworfQorCiBzdGF0aWMgc3NpemVfdCBkd19taXBpX2RzaV9o b3N0X3RyYW5zZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAogCQkJCQkgY29uc3Qgc3Ry dWN0IG1pcGlfZHNpX21zZyAqbXNnKQogewpAQCAtNjk1LDYgKzc0NSwxMiBAQCBzdGF0aWMgc3Np emVfdCBkd19taXBpX2RzaV9ob3N0X3RyYW5zZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0 LAogCWNhc2UgTUlQSV9EU0lfRENTX0xPTkdfV1JJVEU6CiAJCXJldCA9IGR3X21pcGlfZHNpX2Rj c19sb25nX3dyaXRlKGRzaSwgbXNnKTsKIAkJYnJlYWs7CisJY2FzZSBNSVBJX0RTSV9EQ1NfUkVB RDoKKwkJcmV0ID0gZHdfbWlwaV9kc2lfc2V0X21heF9yZXR1cm5fcGFja2V0X3NpemUoZHNpLCBt c2ctPnJ4X2xlbik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gZHdf bWlwaV9kc2lfZGNzX3JlYWQoZHNpLCBtc2cpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZf ZXJyKGRzaS0+ZGV2LCAidW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlIDB4JTAyeFxuIiwKIAkJCW1z Zy0+dHlwZSk7Ci0tIAoyLjExLjAuMTk3LmdiNTU2ZGU1LmRpcnR5CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: john@metanate.com (John Keeping) Date: Sun, 29 Jan 2017 13:24:44 +0000 Subject: [PATCH v3 24/24] drm/rockchip: dw-mipi-dsi: support read commands In-Reply-To: <20170129132444.25251-1-john@metanate.com> References: <20170129132444.25251-1-john@metanate.com> Message-ID: <20170129132444.25251-25-john@metanate.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org I haven't found any method for getting the length of a response, so this just uses the requested rx_len Signed-off-by: John Keeping --- v3: - Fix checkpatch warnings Unchanged in v2 drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cf3ca6b0cbdb..cc58ada75425 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -678,6 +678,56 @@ static int dw_mipi_dsi_dcs_long_write(struct dw_mipi_dsi *dsi, return dw_mipi_dsi_gen_pkt_hdr_write(dsi, hdr_val); } +static int dw_mipi_dsi_dcs_read(struct dw_mipi_dsi *dsi, + const struct mipi_dsi_msg *msg) +{ + const u8 *tx_buf = msg->tx_buf; + u8 *rx_buf = msg->rx_buf; + size_t i; + int ret, val; + + dsi_write(dsi, DSI_PCKHDL_CFG, EN_CRC_RX | EN_ECC_RX | EN_BTA); + dsi_write(dsi, DSI_GEN_HDR, + GEN_HDATA(tx_buf[0]) | GEN_HTYPE(msg->type)); + + ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, + val, !(val & GEN_RD_CMD_BUSY), 1000, + CMD_PKT_STATUS_TIMEOUT_US); + if (ret < 0) { + dev_err(dsi->dev, "failed to read command response\n"); + return ret; + } + + for (i = 0; i < msg->rx_len;) { + u32 pld = dsi_read(dsi, DSI_GEN_PLD_DATA); + + while (i < msg->rx_len) { + rx_buf[i] = pld & 0xff; + pld >>= 8; + i++; + } + } + + return msg->rx_len; +} + +static int dw_mipi_dsi_set_max_return_packet_size(struct dw_mipi_dsi *dsi, + size_t len) +{ + u8 val[] = { len & 0xff, (len >> 8) & 0xff }; + struct mipi_dsi_msg msg = { + .channel = dsi->channel, + .type = MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, + .tx_buf = val, + .tx_len = 2, + }; + + if (len > 0xffff) + return -EINVAL; + + return dw_mipi_dsi_dcs_short_write(dsi, &msg); +} + static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host, const struct mipi_dsi_msg *msg) { @@ -695,6 +745,12 @@ static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host, case MIPI_DSI_DCS_LONG_WRITE: ret = dw_mipi_dsi_dcs_long_write(dsi, msg); break; + case MIPI_DSI_DCS_READ: + ret = dw_mipi_dsi_set_max_return_packet_size(dsi, msg->rx_len); + if (ret < 0) + return ret; + ret = dw_mipi_dsi_dcs_read(dsi, msg); + break; default: dev_err(dsi->dev, "unsupported message type 0x%02x\n", msg->type); -- 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 S1751279AbdA2Ora (ORCPT ); Sun, 29 Jan 2017 09:47:30 -0500 Received: from dougal.metanate.com ([90.155.101.14]:17888 "EHLO metanate.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750982AbdA2Or2 (ORCPT ); Sun, 29 Jan 2017 09:47:28 -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 24/24] drm/rockchip: dw-mipi-dsi: support read commands Date: Sun, 29 Jan 2017 13:24:44 +0000 Message-Id: <20170129132444.25251-25-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 I haven't found any method for getting the length of a response, so this just uses the requested rx_len Signed-off-by: John Keeping --- v3: - Fix checkpatch warnings Unchanged in v2 drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index cf3ca6b0cbdb..cc58ada75425 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -678,6 +678,56 @@ static int dw_mipi_dsi_dcs_long_write(struct dw_mipi_dsi *dsi, return dw_mipi_dsi_gen_pkt_hdr_write(dsi, hdr_val); } +static int dw_mipi_dsi_dcs_read(struct dw_mipi_dsi *dsi, + const struct mipi_dsi_msg *msg) +{ + const u8 *tx_buf = msg->tx_buf; + u8 *rx_buf = msg->rx_buf; + size_t i; + int ret, val; + + dsi_write(dsi, DSI_PCKHDL_CFG, EN_CRC_RX | EN_ECC_RX | EN_BTA); + dsi_write(dsi, DSI_GEN_HDR, + GEN_HDATA(tx_buf[0]) | GEN_HTYPE(msg->type)); + + ret = readl_poll_timeout(dsi->base + DSI_CMD_PKT_STATUS, + val, !(val & GEN_RD_CMD_BUSY), 1000, + CMD_PKT_STATUS_TIMEOUT_US); + if (ret < 0) { + dev_err(dsi->dev, "failed to read command response\n"); + return ret; + } + + for (i = 0; i < msg->rx_len;) { + u32 pld = dsi_read(dsi, DSI_GEN_PLD_DATA); + + while (i < msg->rx_len) { + rx_buf[i] = pld & 0xff; + pld >>= 8; + i++; + } + } + + return msg->rx_len; +} + +static int dw_mipi_dsi_set_max_return_packet_size(struct dw_mipi_dsi *dsi, + size_t len) +{ + u8 val[] = { len & 0xff, (len >> 8) & 0xff }; + struct mipi_dsi_msg msg = { + .channel = dsi->channel, + .type = MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, + .tx_buf = val, + .tx_len = 2, + }; + + if (len > 0xffff) + return -EINVAL; + + return dw_mipi_dsi_dcs_short_write(dsi, &msg); +} + static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host, const struct mipi_dsi_msg *msg) { @@ -695,6 +745,12 @@ static ssize_t dw_mipi_dsi_host_transfer(struct mipi_dsi_host *host, case MIPI_DSI_DCS_LONG_WRITE: ret = dw_mipi_dsi_dcs_long_write(dsi, msg); break; + case MIPI_DSI_DCS_READ: + ret = dw_mipi_dsi_set_max_return_packet_size(dsi, msg->rx_len); + if (ret < 0) + return ret; + ret = dw_mipi_dsi_dcs_read(dsi, msg); + break; default: dev_err(dsi->dev, "unsupported message type 0x%02x\n", msg->type); -- 2.11.0.197.gb556de5.dirty