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=-9.1 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_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 AE107C10F0B for ; Tue, 26 Feb 2019 15:38:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7C0662173C for ; Tue, 26 Feb 2019 15:38:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l6yCo1D+" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727320AbfBZPiS (ORCPT ); Tue, 26 Feb 2019 10:38:18 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:46959 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726478AbfBZPiS (ORCPT ); Tue, 26 Feb 2019 10:38:18 -0500 Received: by mail-pg1-f193.google.com with SMTP id 196so6367745pgf.13 for ; Tue, 26 Feb 2019 07:38:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cK1IJgl5MgH2jqM8NVg2h5rg9Ncs9eGOGQd36tvcK+w=; b=l6yCo1D+anZifk/3AQyxDtvf3lhzC1mCqgCkcQs7eoslKHZadmhXg61gnTBDfWcFhX k/ygOlrHOV/WN7hPwABAHW+IFFwAlydeHx7LtAX+F//TxSlhgGrY7j3sV9dM6KepHziG +056yME++V69XZk3U31AIJR2Ep3yeLV5HX8rMT/tuJPyLoIpoMGplaDGdww7uFGQmtXd whRQfSg0OIeD9LGucZkHICPnzl7hpW0giQmirBuNY+oHXskSRR8YIjBG/7andacm3gNY Qo2VNqDmRnl65zy16jRUab3snvcZwrTNnXwE+s5RPNy0o1IZN7tIAX6Oh/SXOyCsOFIZ z2lQ== 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:mime-version :content-transfer-encoding; bh=cK1IJgl5MgH2jqM8NVg2h5rg9Ncs9eGOGQd36tvcK+w=; b=aYZfK9sWUvKUnf/CU/F/6bk7+qzeYMXjumvXAxqOpacKSX7ZAv68EDrKB+UOvU4rhO xXrBnQB7IAmV/swaj2SWJ5Jqlyg7XRM+7+3hWb7t7X95v0bKWi7wO3gnuP9sDvomhTtU j/qH//UZZAspnUgar354fPiR88/lBiPkGLvrP2xecW5mUk5UNY3QtbR1b/A3UkhYjmxz AlwgHGNaV0Ii84kZe5/xBn5WJn+1g04lLu2uferpPFnWo3g0wxh2bVBLNhKjN3JP9GV6 R3fI07gwTzxpQ27i/vZi8k0TD9l/ui3QNy9UfnmKQI57w0SVTDq07kCaGyjtuCyz7eMg VTlw== X-Gm-Message-State: AHQUAuZElG47wTLakE9UU8zHGiB2DoH1JdQRhepOzjJEfp9y9lfCzL4T SaMo/dyP4nOV6CXHmcHS9M0= X-Google-Smtp-Source: AHgI3IZQokcAuFuEBrCs8oMIoMKh3bwg1UlfgEerO6xGWrfZgtrcdgudgGAHATHapIRe7ZAFRmuzmw== X-Received: by 2002:a63:fc49:: with SMTP id r9mr20955975pgk.447.1551195497589; Tue, 26 Feb 2019 07:38:17 -0800 (PST) Received: from localhost.localdomain ([125.142.23.13]) by smtp.googlemail.com with ESMTPSA id y7sm21940610pgf.42.2019.02.26.07.38.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 26 Feb 2019 07:38:16 -0800 (PST) From: Suwan Kim To: sw.kim@os.korea.ac.kr Cc: Nikolaus Voss , stable , Guenter Roeck , Heikki Krogerus , Greg Kroah-Hartman Subject: [RFC 1/3] usb: typec: tps6598x: handle block writes separately with plain-I2C adapters Date: Wed, 27 Feb 2019 00:38:08 +0900 Message-Id: <20190226153810.5638-1-suwan.kim027@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Nikolaus Voss Commit 1a2f474d328f handles block _reads_ separately with plain-I2C adapters, but the problem described with regmap-i2c not handling SMBus block transfers (i.e. read and writes) correctly also exists with writes. As workaround, this patch adds a block write function the same way 1a2f474d328f adds a block read function. Fixes: 1a2f474d328f ("usb: typec: tps6598x: handle block reads separately with plain-I2C adapters") Fixes: 0a4c005bd171 ("usb: typec: driver for TI TPS6598x USB Power Delivery controllers") Signed-off-by: Nikolaus Voss Cc: stable Reviewed-by: Guenter Roeck Acked-by: Heikki Krogerus Signed-off-by: Greg Kroah-Hartman --- drivers/usb/typec/tps6598x.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/usb/typec/tps6598x.c b/drivers/usb/typec/tps6598x.c index 9947c87d2a1e..c674abe3cf99 100644 --- a/drivers/usb/typec/tps6598x.c +++ b/drivers/usb/typec/tps6598x.c @@ -126,6 +126,20 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len) return 0; } +static int tps6598x_block_write(struct tps6598x *tps, u8 reg, + void *val, size_t len) +{ + u8 data[TPS_MAX_LEN + 1]; + + if (!tps->i2c_protocol) + return regmap_raw_write(tps->regmap, reg, val, len); + + data[0] = len; + memcpy(&data[1], val, len); + + return regmap_raw_write(tps->regmap, reg, data, sizeof(data)); +} + static inline int tps6598x_read16(struct tps6598x *tps, u8 reg, u16 *val) { return tps6598x_block_read(tps, reg, val, sizeof(u16)); @@ -143,23 +157,23 @@ static inline int tps6598x_read64(struct tps6598x *tps, u8 reg, u64 *val) static inline int tps6598x_write16(struct tps6598x *tps, u8 reg, u16 val) { - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u16)); + return tps6598x_block_write(tps, reg, &val, sizeof(u16)); } static inline int tps6598x_write32(struct tps6598x *tps, u8 reg, u32 val) { - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u32)); + return tps6598x_block_write(tps, reg, &val, sizeof(u32)); } static inline int tps6598x_write64(struct tps6598x *tps, u8 reg, u64 val) { - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u64)); + return tps6598x_block_write(tps, reg, &val, sizeof(u64)); } static inline int tps6598x_write_4cc(struct tps6598x *tps, u8 reg, const char *val) { - return regmap_raw_write(tps->regmap, reg, &val, sizeof(u32)); + return tps6598x_block_write(tps, reg, &val, sizeof(u32)); } static int tps6598x_read_partner_identity(struct tps6598x *tps) @@ -245,8 +259,8 @@ static int tps6598x_exec_cmd(struct tps6598x *tps, const char *cmd, return -EBUSY; if (in_len) { - ret = regmap_raw_write(tps->regmap, TPS_REG_DATA1, - in_data, in_len); + ret = tps6598x_block_write(tps, TPS_REG_DATA1, + in_data, in_len); if (ret) return ret; } -- 2.20.1