From patchwork Wed Jun 19 05:27:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Smirnov X-Patchwork-Id: 11003601 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 65B6814DB for ; Wed, 19 Jun 2019 07:12:02 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5344228A68 for ; Wed, 19 Jun 2019 07:12:02 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4760F28B4B; Wed, 19 Jun 2019 07:12:02 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DA8DE28A68 for ; Wed, 19 Jun 2019 07:12:01 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CA5FD6E2D6; Wed, 19 Jun 2019 07:11:37 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6CDE56E299 for ; Wed, 19 Jun 2019 05:27:55 +0000 (UTC) Received: by mail-pf1-x442.google.com with SMTP id x15so9034921pfq.0 for ; Tue, 18 Jun 2019 22:27:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HLH0lqvZF2YW47kF82c+4eI137sw7vALgNnez8nJtAo=; b=OyTeqNBkAdKXqlTef6xHrS8/gDUjAR+TPjCqoEmv8BS7i2UfqQAXRx1froLkFN+e8M YSVR9fiU4u24L9FtOdKou4BBJ4De7jAdLC8dAiU5dV4KKP0M81x8WIkIHnZ/rROOQysG W0zcncGR4o/yCdzt7ZO6oje+GjI4FweYivHMcq3GJl9HOTUfnpglTTJ5ywrSh6B8jdhs RDfUh4508527IpdLazKAptzY7D8hYlhk4FUPW74RflyFgcLINTPhs1Ihdq3eej1jigpE WWSriicRVqHzejGCbWnbDCg+gSXpTTAkgBQ3pUaxnDQQfH25P/4Kig72G+/xQSUv7T03 4C8Q== X-Gm-Message-State: APjAAAX35qSJ7JQK1O44xcUfE8nHH8R2urGE/9S6YQNs7LqkRyYfQDtH pWSnBHkyeJfH8Way0EkCZ+m3K6f8hss= X-Google-Smtp-Source: APXvYqwEo/5VnxgZr65e8cL5i0qkfqYPmZ0/fI74F+U4KjS3UH+04Mf40Dg1QxYprFHJRxYt5LoSrg== X-Received: by 2002:a63:145f:: with SMTP id 31mr6055673pgu.320.1560922074652; Tue, 18 Jun 2019 22:27:54 -0700 (PDT) Received: from localhost.lan (c-24-22-235-96.hsd1.wa.comcast.net. [24.22.235.96]) by smtp.gmail.com with ESMTPSA id l44sm534742pje.29.2019.06.18.22.27.53 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 18 Jun 2019 22:27:53 -0700 (PDT) From: Andrey Smirnov To: dri-devel@lists.freedesktop.org Subject: [PATCH v6 15/15] drm/bridge: tc358767: Add support for address-only I2C transfers Date: Tue, 18 Jun 2019 22:27:16 -0700 Message-Id: <20190619052716.16831-16-andrew.smirnov@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190619052716.16831-1-andrew.smirnov@gmail.com> References: <20190619052716.16831-1-andrew.smirnov@gmail.com> MIME-Version: 1.0 X-Mailman-Approved-At: Wed, 19 Jun 2019 07:10:14 +0000 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HLH0lqvZF2YW47kF82c+4eI137sw7vALgNnez8nJtAo=; b=qEmVluxmK/18OQ+++SpHWnGDCghiUyUaW14rwQjiPOLI5J4BeYe4D1gCQuG5NyvqXN qwCRgux/LCIMpoAp+VNhY01o8kStEkjtw0OW1JelbTj++ZKv8Lwuo4Q1LkcJYyp2WoWt gODUNatTlmb/Kqe9OYCrQN6s3EGk4DpGHx//kS5fXN8kIOiSZr316AUv+c0NC+1s8enS Ud7+1sYqow2wwTvUKaNbSE1AJzsBv33ET0g3lmPh7oiLEDy0kmb6hEsyvRf4pxvgsisO 26a/8KSibKbxMimvGU7lNlS1/p4uaGZnk47necXS2AU+9c286QVCZHtHT25yIOjTROPR j1pA== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Cory Tusar , Andrey Smirnov , Andrey Gusakov , linux-kernel@vger.kernel.org, Tomi Valkeinen , Laurent Pinchart , Chris Healy Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Transfer size of zero means a request to do an address-only transfer. Since the HW support this, we probably shouldn't be just ignoring such requests. While at it allow DP_AUX_I2C_MOT flag to pass through, since it is supported by the HW as well. Signed-off-by: Andrey Smirnov Reviewed-by: Andrzej Hajda Cc: Andrzej Hajda Cc: Laurent Pinchart Cc: Tomi Valkeinen Cc: Andrey Gusakov Cc: Philipp Zabel Cc: Cory Tusar Cc: Chris Healy Cc: Lucas Stach Cc: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org --- drivers/gpu/drm/bridge/tc358767.c | 42 +++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c index 3f8a15390813..7b8e19d6cf29 100644 --- a/drivers/gpu/drm/bridge/tc358767.c +++ b/drivers/gpu/drm/bridge/tc358767.c @@ -145,6 +145,8 @@ /* AUX channel */ #define DP0_AUXCFG0 0x0660 +#define DP0_AUXCFG0_BSIZE GENMASK(11, 8) +#define DP0_AUXCFG0_ADDR_ONLY BIT(4) #define DP0_AUXCFG1 0x0664 #define AUX_RX_FILTER_EN BIT(16) @@ -326,6 +328,18 @@ static int tc_aux_read_data(struct tc_data *tc, void *data, size_t size) return size; } +static u32 tc_auxcfg0(struct drm_dp_aux_msg *msg, size_t size) +{ + u32 auxcfg0 = msg->request; + + if (size) + auxcfg0 |= FIELD_PREP(DP0_AUXCFG0_BSIZE, size - 1); + else + auxcfg0 |= DP0_AUXCFG0_ADDR_ONLY; + + return auxcfg0; +} + static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) { @@ -335,9 +349,6 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, u32 auxstatus; int ret; - if (size == 0) - return 0; - ret = tc_aux_wait_busy(tc); if (ret) return ret; @@ -348,9 +359,11 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, break; case DP_AUX_NATIVE_WRITE: case DP_AUX_I2C_WRITE: - ret = tc_aux_write_data(tc, msg->buffer, size); - if (ret < 0) - return ret; + if (size) { + ret = tc_aux_write_data(tc, msg->buffer, size); + if (ret < 0) + return ret; + } break; default: return -EINVAL; @@ -361,8 +374,7 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, if (ret) return ret; /* Start transfer */ - ret = regmap_write(tc->regmap, DP0_AUXCFG0, - ((size - 1) << 8) | request); + ret = regmap_write(tc->regmap, DP0_AUXCFG0, tc_auxcfg0(msg, size)); if (ret) return ret; @@ -376,14 +388,22 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, if (auxstatus & AUX_TIMEOUT) return -ETIMEDOUT; - - size = FIELD_GET(AUX_BYTES, auxstatus); + /* + * For some reason address-only DP_AUX_I2C_WRITE (MOT), still + * reports 1 byte transferred in its status. To deal we that + * we ignore aux_bytes field if we know that this was an + * address-only transfer + */ + if (size) + size = FIELD_GET(AUX_BYTES, auxstatus); msg->reply = FIELD_GET(AUX_STATUS, auxstatus); switch (request) { case DP_AUX_NATIVE_READ: case DP_AUX_I2C_READ: - return tc_aux_read_data(tc, msg->buffer, size); + if (size) + return tc_aux_read_data(tc, msg->buffer, size); + break; } return size;