Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2538429pxj; Mon, 10 May 2021 05:28:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyTZjZk318xCX06fPG4NUdU8zmpE81ks9Clj4ER3faHPF35RxbZA17xHDEgcPu5aS8TF/1j X-Received: by 2002:a17:906:4795:: with SMTP id cw21mr25029698ejc.304.1620649690704; Mon, 10 May 2021 05:28:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620649690; cv=none; d=google.com; s=arc-20160816; b=Dm45ktVyLI2AukPKKoNciHM0F5AdfvuPfJxhEzHyNxxqMwo7Ae1zd0aqTRXnBTCrqz 9sYK7hmvjJCShLFyxpHzQOi4z/oEEo6C8TtWxA3PMjChvtXMzgX8xMBdVgybs6WGkoyN x4HM9OtjHdDka+pH+UWvOLi1Z8HlWvDffSESX7UpfCXiGimFRiXu35L3+5v2nlqmiT7z 7DeJTRWrFkcV/kg7BylbEZCZLhX31pvq65vZL2VK5nggmJLabxXFm6IsG6bRYBoDc7Je 8yN8T1g78TuUdpG7hB5R8JJdHLECI0TjQ/4AbD0ilzZfNJMeXDFjxpM3a7BxeGXFalEd E4hg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=+yAxwVlJKqa0zJvuYOQaABguB4WowjvzH3MkqiJdtUE=; b=Sfl6EVQ3QksxANXknMD9opLNaWLdPmaooaJjiGo8X2b2Sp8IIC/SQtvX8W8JQvDMIg v4P665QmoRdAzl4RSJTZHtLHqUMPcyd5mkoxZ2oJZiAHmYU0FhMR14K3Eyc9R91hh10q NLoLGx79HgioTu+4973e9vQFV6fLA9Q8m7WfXSM4Oq9rm1RM6uTKBEHKx41qHkI0X1nW t1gcA3ROMTXTZp124OcxQSkhdcUuEcIP3rTj52JzFDgzHF/+84Q9WU768kBoWXzUQyAd Dyw/MLm3u73XRHtuUaU/UW6QSXbUFWY3RChrW7DK+xAluQaiOWxSJhZF0COahA0og7YS QIfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=T1Mel0hc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ku17si12627916ejc.97.2021.05.10.05.27.47; Mon, 10 May 2021 05:28:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=T1Mel0hc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235342AbhEJM1B (ORCPT + 99 others); Mon, 10 May 2021 08:27:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:46278 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237190AbhEJLLc (ORCPT ); Mon, 10 May 2021 07:11:32 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 6CB0B6191E; Mon, 10 May 2021 11:07:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620644876; bh=MhnKdDO3EoebFgSsizSZjcagHXoeCi2YwTd5PJAXvaU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T1Mel0hc5/ss000/jh6EOU6tI/o4B6WFYDw9m7K3RcnpuWIpxRPEViATr0w4RXYxn NYwpHY7pC5Ij0agH5DF00UTDdUt4wgC4q9GyGk2josKJUfmSbifWZWaXX1G3zCpR5S +eDo5t+YxU12ofuihSVEgfeooJLk3s2A5aROTX6E= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Hubert Streidl , Mark Jonas , Wolfram Sang , Lee Jones , Sasha Levin Subject: [PATCH 5.12 259/384] mfd: da9063: Support SMBus and I2C mode Date: Mon, 10 May 2021 12:20:48 +0200 Message-Id: <20210510102023.407071527@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102014.849075526@linuxfoundation.org> References: <20210510102014.849075526@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hubert Streidl [ Upstream commit 586478bfc9f7e16504d6f64cf18bcbdf6fd0cbc9 ] By default the PMIC DA9063 2-wire interface is SMBus compliant. This means the PMIC will automatically reset the interface when the clock signal ceases for more than the SMBus timeout of 35 ms. If the I2C driver / device is not capable of creating atomic I2C transactions, a context change can cause a ceasing of the clock signal. This can happen if for example a real-time thread is scheduled. Then the DA9063 in SMBus mode will reset the 2-wire interface. Subsequently a write message could end up in the wrong register. This could cause unpredictable system behavior. The DA9063 PMIC also supports an I2C compliant mode for the 2-wire interface. This mode does not reset the interface when the clock signal ceases. Thus the problem depicted above does not occur. This patch tests for the bus functionality "I2C_FUNC_I2C". It can reasonably be assumed that the bus cannot obey SMBus timings if this functionality is set. SMBus commands most probably are emulated in this case which is prone to the latency issue described above. This patch enables the I2C bus mode if I2C_FUNC_I2C is set or otherwise keeps the default SMBus mode. Signed-off-by: Hubert Streidl Signed-off-by: Mark Jonas Reviewed-by: Wolfram Sang Signed-off-by: Lee Jones Signed-off-by: Sasha Levin --- drivers/mfd/da9063-i2c.c | 10 ++++++++++ include/linux/mfd/da9063/registers.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/drivers/mfd/da9063-i2c.c b/drivers/mfd/da9063-i2c.c index 3781d0bb7786..783a14af18e2 100644 --- a/drivers/mfd/da9063-i2c.c +++ b/drivers/mfd/da9063-i2c.c @@ -442,6 +442,16 @@ static int da9063_i2c_probe(struct i2c_client *i2c, return ret; } + /* If SMBus is not available and only I2C is possible, enter I2C mode */ + if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) { + ret = regmap_clear_bits(da9063->regmap, DA9063_REG_CONFIG_J, + DA9063_TWOWIRE_TO); + if (ret < 0) { + dev_err(da9063->dev, "Failed to set Two-Wire Bus Mode.\n"); + return -EIO; + } + } + return da9063_device_init(da9063, i2c->irq); } diff --git a/include/linux/mfd/da9063/registers.h b/include/linux/mfd/da9063/registers.h index 1dbabf1b3cb8..6e0f66a2e727 100644 --- a/include/linux/mfd/da9063/registers.h +++ b/include/linux/mfd/da9063/registers.h @@ -1037,6 +1037,9 @@ #define DA9063_NONKEY_PIN_AUTODOWN 0x02 #define DA9063_NONKEY_PIN_AUTOFLPRT 0x03 +/* DA9063_REG_CONFIG_J (addr=0x10F) */ +#define DA9063_TWOWIRE_TO 0x40 + /* DA9063_REG_MON_REG_5 (addr=0x116) */ #define DA9063_MON_A8_IDX_MASK 0x07 #define DA9063_MON_A8_IDX_NONE 0x00 -- 2.30.2