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.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 891E3C31E49 for ; Wed, 19 Jun 2019 05:28:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5023A21479 for ; Wed, 19 Jun 2019 05:28:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="uLA4Ungo" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731140AbfFSF2X (ORCPT ); Wed, 19 Jun 2019 01:28:23 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:45525 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730923AbfFSF1n (ORCPT ); Wed, 19 Jun 2019 01:27:43 -0400 Received: by mail-pf1-f196.google.com with SMTP id r1so9017025pfq.12 for ; Tue, 18 Jun 2019 22:27:43 -0700 (PDT) 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=GTaqBAzCZc4tNG3/fwrCdpD8i/fiZyLrGTzNBgRKb94=; b=uLA4Ungo9ScC2fe6LMYu8CyNwNTr5HV7kzB5iLN3MZUCqLyByJvvBAjWHo2ytumRtu cqRJAFWOyUAPBfozjbmFqmo3fJEwn6dRYbTrQnRktrioJHZk4ghQTi2/Qi9QmJm+XRzY SKCB7Ped6hDHPeHMZpJLMkhpmbQhUqrlaimdYqsA8+3gt+8no3LDsYywhbnKIzCJZeOf RblkbpbuUeszrEEIpQJUF/jJe3mFo2pdKeWss5mdUDN4xI/hXJvff0JjQf39FEfVOw4z 3wRQhat0VGFUD02gReCrVYkH8OM9GWOi/Z8jzAoa4ii44PJ6YKw5+1D96vB/Jj2M5sfH eABw== 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=GTaqBAzCZc4tNG3/fwrCdpD8i/fiZyLrGTzNBgRKb94=; b=iHPDTcPlvAFPrzDFL9i24q0R0YFK8UMjUcBswoaNX/HfamRlHznGCiRp/wqRe8r4Ul 2nDLSIrIvjfuH0LV4ZdRUQdPqLLuuOc/zItOSwYJ4pw8OKcvwLDMnM5TxS0YjgoSmTkV 7V7nJ1YqeVkbIUtX3uNqwZQSPdf7c7oAe5XCS24+ShDJydwNG0OAWHLRd9n2T0J3If4c 1JKpWZRroX7o+WNlXYJ/aaci1DuzNeedZ0sXdC78jkLPt/w1qZT729bV+oc+wQnYCv2b 0iU+EwEZ8YpIjwTT8BIp6EZKf9ARTu5DDxwL8l4QZetr0LN7/p8oJKV0Hk7J3sdB9ia8 L+kA== X-Gm-Message-State: APjAAAW2vaczZNg1qIZwcliyPO71E6CsdDOuUxLU3wMA8gUmBQlKCyJK 6eqnuCM2kZs45+WpLmQbtHk= X-Google-Smtp-Source: APXvYqyoNwNGC6zfle7yS3gvaPetPMP0k63jXNfaiOuRHCSHHK68cNJKIjrhlC7a3MLS7dT5O5v3dw== X-Received: by 2002:aa7:818b:: with SMTP id g11mr8455488pfi.122.1560922062980; Tue, 18 Jun 2019 22:27:42 -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.41 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Tue, 18 Jun 2019 22:27:42 -0700 (PDT) From: Andrey Smirnov To: dri-devel@lists.freedesktop.org Cc: Andrey Smirnov , Andrzej Hajda , Laurent Pinchart , Tomi Valkeinen , Andrey Gusakov , Philipp Zabel , Cory Tusar , Chris Healy , Lucas Stach , linux-kernel@vger.kernel.org Subject: [PATCH v6 07/15] drm/bridge: tc358767: Simplify AUX data write Date: Tue, 18 Jun 2019 22:27:08 -0700 Message-Id: <20190619052716.16831-8-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 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simplify AUX data write by dropping index arithmetic and shifting and replacing it with a call to a helper function that does two things: 1. Copies user-provided data into a write buffer 2. Transfers contents of the write buffer to up to 4 32-bit registers on the chip Note that separate data endianness fix: tmp = (tmp << 8) | buf[i]; that was reserved for DP_AUX_I2C_WRITE looks really strange, since it will place data differently depending on the passed user-data size. E.g. for a write of 1 byte, data transferred to the chip would look like: [byte0] [dummy1] [dummy2] [dummy3] whereas for a write of 4 bytes we'd get: [byte3] [byte2] [byte1] [byte0] Since there's no indication in the datasheet that I2C write buffer should be treated differently than AUX write buffer and no comment in the original code explaining why it was done this way, that special I2C write buffer transformation was dropped in this patch. 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 | 48 +++++++++++++++++-------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c index 02f6d907f5c4..a441e8e66287 100644 --- a/drivers/gpu/drm/bridge/tc358767.c +++ b/drivers/gpu/drm/bridge/tc358767.c @@ -321,6 +321,21 @@ static int tc_aux_get_status(struct tc_data *tc, u8 *reply) return 0; } +static int tc_aux_write_data(struct tc_data *tc, const void *data, + size_t size) +{ + u32 auxwdata[DP_AUX_MAX_PAYLOAD_BYTES / sizeof(u32)] = { 0 }; + int ret, count = ALIGN(size, sizeof(u32)); + + memcpy(auxwdata, data, size); + + ret = regmap_raw_write(tc->regmap, DP0_AUXWDATA(0), auxwdata, count); + if (ret) + return ret; + + return size; +} + static int tc_aux_read_data(struct tc_data *tc, void *data, size_t size) { u32 auxrdata[DP_AUX_MAX_PAYLOAD_BYTES / sizeof(u32)]; @@ -341,9 +356,6 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, struct tc_data *tc = aux_to_tc(aux); size_t size = min_t(size_t, 8, msg->size); u8 request = msg->request & ~DP_AUX_I2C_MOT; - u8 *buf = msg->buffer; - u32 tmp = 0; - int i = 0; int ret; if (size == 0) @@ -353,25 +365,17 @@ static ssize_t tc_aux_transfer(struct drm_dp_aux *aux, if (ret) return ret; - if (request == DP_AUX_I2C_WRITE || request == DP_AUX_NATIVE_WRITE) { - /* Store data */ - while (i < size) { - if (request == DP_AUX_NATIVE_WRITE) - tmp = tmp | (buf[i] << (8 * (i & 0x3))); - else - tmp = (tmp << 8) | buf[i]; - i++; - if (((i % 4) == 0) || (i == size)) { - ret = regmap_write(tc->regmap, - DP0_AUXWDATA((i - 1) >> 2), - tmp); - if (ret) - return ret; - tmp = 0; - } - } - } else if (request != DP_AUX_I2C_READ && - request != DP_AUX_NATIVE_READ) { + switch (request) { + case DP_AUX_NATIVE_READ: + case DP_AUX_I2C_READ: + 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; + break; + default: return -EINVAL; } -- 2.21.0