From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06782C3A59E for ; Mon, 2 Sep 2019 15:05:28 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CCE3D21744 for ; Mon, 2 Sep 2019 15:05:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="V/XAbMVN"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gerhold.net header.i=@gerhold.net header.b="qUnvt/N5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CCE3D21744 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=gerhold.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=6UoSt6hFVT/CTakaEHyX7PHsxdENCbyN//6OYDx4V3w=; b=V/XAbMVN7t8bnp EbEw/4SgkC1eGfDxZTdN7rMzuJ+YcJbNhjRo4L+o54ZYtsuAozYQvg/+4buKbPSl6oB0v9U7FScCI 5nJWObGTlhSy73qUiBniMeKBlPzgotWiazVN/h0DAnth56+rv9DLzkkTWwBByiidsTOhqA6PJSLuC ex2ole010lC3Jqv6p/Hg64L0RPnQNqSPegJDhpR2JT4mPel/gcn2gMqrS+YXPHy4JCjoir9aF7s6d rDyZiOJ+bxfbfUrZxG4uO7KtF5/FQ71i/cWpJEVNzssrHBvACgGID1+xmPNh8G0k3O8gp11I5+1o2 /a66nprjhJnPxT8eC4Eg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1i4ntN-0007E6-K1; Mon, 02 Sep 2019 15:05:17 +0000 Received: from mo6-p01-ob.smtp.rzone.de ([2a01:238:20a:202:5301::9]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1i4ntI-0007C1-OR for linux-arm-kernel@lists.infradead.org; Mon, 02 Sep 2019 15:05:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1567436707; s=strato-dkim-0002; d=gerhold.net; h=In-Reply-To:References:Message-ID:Subject:Cc:To:From:Date: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=OylVPWNT4QCeYh4e0/iiWwhfYQsrXrzamjILi7qcFfE=; b=qUnvt/N54E0kxwm51vBsZQ/H0GBjLUrWXijVoUSjfpBCUEhPiC/CBMKhcA21FHTxSX fw/LQc5vUNNFCq7q118DmIgKloMZ7/C4eBSLMV9sfqh0PfrMt1UIKmnSMUHleXwr+bQa mE3q65UUusvBvfIgJt8pX85u79FIsCdZF4ICw1WJtftr1XnuGCjPpylH39XbWiRDyjc5 W3VagooYTbJzlfg06O2xA2yf3tN1BZnz/KTi0gSTa/gUQUeWiSvknd6v9+aTvcpM594o W7SXvAUfQdRXXB7MgAja3PqZk9au+/dq7my9++UL94q7kaGWNqAF1nLlWYlrWCc38zPk 9+Pg== X-RZG-AUTH: ":P3gBZUipdd93FF5ZZvYFPugejmSTVR2nRPhVOQ/OcYgojyw4j34+u26zEIdhPgpHQiVSwjMaBCsF" X-RZG-CLASS-ID: mo00 Received: from gerhold.net by smtp.strato.de (RZmta 44.27.0 DYNA|AUTH) with ESMTPSA id 6021c6v82F4wQas (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Mon, 2 Sep 2019 17:04:58 +0200 (CEST) Date: Mon, 2 Sep 2019 17:04:51 +0200 From: Stephan Gerhold To: Linus Walleij Subject: Re: [PATCH v2] drm/mcde: Fix DSI transfers Message-ID: <20190902150451.GA10619@gerhold.net> References: <20190831075013.21993-1-linus.walleij@linaro.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190831075013.21993-1-linus.walleij@linaro.org> User-Agent: Mutt/1.12.1 (2019-06-15) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190902_080513_384963_E874F902 X-CRM114-Status: GOOD ( 21.93 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kbuild test robot , Maxime Ripard , Maarten Lankhorst , dri-devel@lists.freedesktop.org, Sean Paul , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Sat, Aug 31, 2019 at 09:50:13AM +0200, Linus Walleij wrote: > There were bugs in the DSI transfer (read and write) function > as it was only tested with displays ever needing a single byte > to be written. Fixed it up and tested so we can now write > messages of up to 16 bytes and read up to 4 bytes from the > display. > > Tested with a Sony ACX424AKP display: this display now self- > identifies and can control backlight in command mode. > > Cc: Stephan Gerhold > Reported-by: kbuild test robot > Fixes: 5fc537bfd000 ("drm/mcde: Add new driver for ST-Ericsson MCDE") > Signed-off-by: Linus Walleij > --- > ChangeLog v1->v2: > - Fix a print modifier for dev_err() found by the build robot. > --- > drivers/gpu/drm/mcde/mcde_dsi.c | 70 ++++++++++++++++++++++----------- > 1 file changed, 47 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c > index 07f7090d08b3..90659d190d78 100644 > --- a/drivers/gpu/drm/mcde/mcde_dsi.c > +++ b/drivers/gpu/drm/mcde/mcde_dsi.c > @@ -178,22 +178,26 @@ static ssize_t mcde_dsi_host_transfer(struct mipi_dsi_host *host, > const u32 loop_delay_us = 10; /* us */ > const u8 *tx = msg->tx_buf; > u32 loop_counter; > - size_t txlen; > + size_t txlen = msg->tx_len; > + size_t rxlen = msg->rx_len; > u32 val; > int ret; > int i; > > - txlen = msg->tx_len; > - if (txlen > 12) { > + if (txlen > 16) { > dev_err(d->dev, > - "dunno how to write more than 12 bytes yet\n"); > + "dunno how to write more than 16 bytes yet\n"); > + return -EIO; > + } > + if (rxlen > 4) { > + dev_err(d->dev, > + "dunno how to read more than 4 bytes yet\n"); > return -EIO; > } > > dev_dbg(d->dev, > - "message to channel %d, %zd bytes", > - msg->channel, > - txlen); > + "message to channel %d, write %zd bytes read %zd bytes\n", > + msg->channel, txlen, rxlen); > > /* Command "nature" */ > if (MCDE_DSI_HOST_IS_READ(msg->type)) > @@ -210,9 +214,7 @@ static ssize_t mcde_dsi_host_transfer(struct mipi_dsi_host *host, > if (mipi_dsi_packet_format_is_long(msg->type)) > val |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_LONGNOTSHORT; > val |= 0 << DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_ID_SHIFT; > - /* Add one to the length for the MIPI DCS command */ > - val |= txlen > - << DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_SIZE_SHIFT; > + val |= txlen << DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_SIZE_SHIFT; > val |= DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_LP_EN; > val |= msg->type << DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_HEAD_SHIFT; > writel(val, d->regs + DSI_DIRECT_CMD_MAIN_SETTINGS); > @@ -249,17 +251,36 @@ static ssize_t mcde_dsi_host_transfer(struct mipi_dsi_host *host, > writel(1, d->regs + DSI_DIRECT_CMD_SEND); > > loop_counter = 1000 * 1000 / loop_delay_us; > - while (!(readl(d->regs + DSI_DIRECT_CMD_STS) & > - DSI_DIRECT_CMD_STS_WRITE_COMPLETED) > - && --loop_counter) > - usleep_range(loop_delay_us, (loop_delay_us * 3) / 2); > - > - if (!loop_counter) { > - dev_err(d->dev, "DSI write timeout!\n"); > - return -ETIME; > + if (MCDE_DSI_HOST_IS_READ(msg->type)) { > + /* Read command */ > + while (!(readl(d->regs + DSI_DIRECT_CMD_STS) & > + (DSI_DIRECT_CMD_STS_READ_COMPLETED | > + DSI_DIRECT_CMD_STS_READ_COMPLETED_WITH_ERR)) > + && --loop_counter) > + usleep_range(loop_delay_us, (loop_delay_us * 3) / 2); > + if (!loop_counter) { > + dev_err(d->dev, "DSI write timeout!\n"); "DSI read timeout!" might be more apppropriate here? > + return -ETIME; > + } > + } else { > + /* Writing only */ > + while (!(readl(d->regs + DSI_DIRECT_CMD_STS) & > + DSI_DIRECT_CMD_STS_WRITE_COMPLETED) > + && --loop_counter) > + usleep_range(loop_delay_us, (loop_delay_us * 3) / 2); > + > + if (!loop_counter) { > + dev_err(d->dev, "DSI write timeout!\n"); > + return -ETIME; > + } > } > > val = readl(d->regs + DSI_DIRECT_CMD_STS); > + if (val & DSI_DIRECT_CMD_STS_READ_COMPLETED_WITH_ERR) { > + dev_err(d->dev, "read completed with error\n"); > + writel(1, d->regs + DSI_DIRECT_CMD_RD_INIT); > + return -EIO; > + } > if (val & DSI_DIRECT_CMD_STS_ACKNOWLEDGE_WITH_ERR_RECEIVED) { > val >>= DSI_DIRECT_CMD_STS_ACK_VAL_SHIFT; > dev_err(d->dev, "error during transmission: %04x\n", > @@ -269,10 +290,7 @@ static ssize_t mcde_dsi_host_transfer(struct mipi_dsi_host *host, > > if (!MCDE_DSI_HOST_IS_READ(msg->type)) { > /* Return number of bytes written */ > - if (mipi_dsi_packet_format_is_long(msg->type)) > - ret = 4 + txlen; > - else > - ret = 4; > + ret = txlen; > } else { > /* OK this is a read command, get the response */ > u32 rdsz; > @@ -282,7 +300,13 @@ static ssize_t mcde_dsi_host_transfer(struct mipi_dsi_host *host, > rdsz = readl(d->regs + DSI_DIRECT_CMD_RD_PROPERTY); > rdsz &= DSI_DIRECT_CMD_RD_PROPERTY_RD_SIZE_MASK; > rddat = readl(d->regs + DSI_DIRECT_CMD_RDDAT); > - for (i = 0; i < 4 && i < rdsz; i++) > + if (rdsz < rxlen) { > + dev_err(d->dev, "read error, requested %zd got %d\n", > + msg->rx_len, rdsz); Using rxlen instead of msg->rx_len would be more consistent with the if condition. These are just minor nitpicks, so with or without changes: Reviewed-by: Stephan Gerhold _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel