Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2345813pxb; Fri, 5 Feb 2021 15:54:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJwyhp2qAsFZjrRP4MNDS7I6KmxdE0i19mJfGmGzMUlw3kMVS+kUHh4vzDQ9i+xcikBRJDkq X-Received: by 2002:a05:6402:40c4:: with SMTP id z4mr5851849edb.15.1612569264929; Fri, 05 Feb 2021 15:54:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612569264; cv=none; d=google.com; s=arc-20160816; b=tuoDKn0wyY4ee3wbnt8WoWsOvdDveF/OU8KuaK/NUGZ2vmrRz9tyeedkWj7uOPhzvm 5Ncix/eYKSGfX3iLJFMtRI6273LaJuAn2UJ71ccximsYuanhs8yHHUV13xwz8jkGSu0P 2B2XEa4F8uBCI8VnBCcBUeln7xNn8qSsvxKIcsOy5geslrS9AGbq3a31fSFn0u8bzYhK HvuxYGmCUkE7PvKYkE3hwLoFEQRZq4cV09TFErUBRX6LDHJSfYsHL7cWB+yvrCPnoXly TqrPk2w7xewy0QnNaHZcfp258biz6tC7nHnAncWM+7hRvjU4FxEUjSwWG5zKGdOWy2kT I0PQ== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=0FuW0z5cQXSzsTSpK/V6UwMAj0/8ARpqPlWINDUu44E=; b=OmGU2k7nJ42Xd7lxIv7W7lO3zPNSCHqo2EOSybv092Gzjo/S9Ycd22P/luyItqUe24 M2O1lKp4+kPJRCjUoTEFppq3LBM8uAXiGb2usWfy2teePvFzopxlMItgkKkQVODYzIsK Qohluo5DiPzbbMqQ5FIX3HJWnL7BBoEpSOPM5ormG8N5oNejd2j55Z2B6VVH7qAgIFMW Gpe9A3IPpSzr4pfPJV9yGw2ar3qEFCBmcCbnSQuhw9DqyTstoP2pieUjMTlkf6H9fmyF aj7FteutXt5aDqorNWoxkaeUJo3h6BjnmLHzpnaki0wwrUM0YbZAvcMSASSKRhGkTDQV AAZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@de.bosch.com header.s=key3-intmail header.b=BFyuHrAS; 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=REJECT sp=NONE dis=NONE) header.from=de.bosch.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k4si6389681edq.62.2021.02.05.15.54.00; Fri, 05 Feb 2021 15:54:24 -0800 (PST) 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=@de.bosch.com header.s=key3-intmail header.b=BFyuHrAS; 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=REJECT sp=NONE dis=NONE) header.from=de.bosch.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231180AbhBEXti (ORCPT + 99 others); Fri, 5 Feb 2021 18:49:38 -0500 Received: from de-deferred2.bosch-org.com ([139.15.180.217]:39766 "EHLO de-deferred2.bosch-org.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232315AbhBEOQK (ORCPT ); Fri, 5 Feb 2021 09:16:10 -0500 Received: from de-out1.bosch-org.com (snat-lb41g3-dmz-psi-sl1-maildeferred.fe.ssn.bosch.com [139.15.180.215]) by fe0vms0193.rbdmz01.com (Postfix) with ESMTPS id 4DXKhV0dqhzqPN; Fri, 5 Feb 2021 16:53:30 +0100 (CET) Received: from fe0vm1650.rbesz01.com (lb41g3-ha-dmz-psi-sl1-mailout.fe.ssn.bosch.com [139.15.230.188]) by fe0vms0187.rbdmz01.com (Postfix) with ESMTPS id 4DXKdH1nd8z1XLDQv; Fri, 5 Feb 2021 16:50:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=de.bosch.com; s=key3-intmail; t=1612540243; bh=fP74M6HwZDCum3+vzeaerJPkseKxvj4gZV75mefECbo=; l=10; h=From:Subject:From:Reply-To:Sender; b=BFyuHrASzp3561tTs9ypVNcLBywXr4MmrO95y/5oH8MS0atS6GpZS1diHxcL6YjaV 9jEdK/DU2JgykhK6zqDnY5p3+AWQPpGfwi+8TjSUKQUX7cSlvNOhWc0CHEL++tEzqx XmdhOf/c+u1+OBzjti95/wHRyVC0PnBP4kut9DhU= Received: from fe0vm7918.rbesz01.com (unknown [10.58.172.176]) by fe0vm1650.rbesz01.com (Postfix) with ESMTPS id 4DXKdH1PBKz2HM; Fri, 5 Feb 2021 16:50:43 +0100 (CET) X-AuditID: 0a3aad10-b0bff70000002230-42-601d6953e72d Received: from fe0vm1652.rbesz01.com ( [10.58.173.29]) (using TLS with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by fe0vm7918.rbesz01.com (SMG Outbound) with SMTP id 70.4D.08752.3596D106; Fri, 5 Feb 2021 16:50:43 +0100 (CET) Received: from SI-HUB2000.de.bosch.com (si-hub2000.de.bosch.com [10.4.103.108]) by fe0vm1652.rbesz01.com (Postfix) with ESMTPS id 4DXKdH0MYtzV16; Fri, 5 Feb 2021 16:50:43 +0100 (CET) Received: from luchador.grb-fir.grb.de.bosch.com (10.19.187.97) by SI-HUB2000.de.bosch.com (10.4.103.108) with Microsoft SMTP Server id 15.1.2106.2; Fri, 5 Feb 2021 16:50:42 +0100 From: Mark Jonas To: Support Opensource , Lee Jones CC: , , , , , , , Wolfram Sang , Mark Jonas Subject: [PATCH v3] mfd: da9063: Support SMBus and I2C mode Date: Fri, 5 Feb 2021 16:50:06 +0100 Message-ID: <20210205155006.130458-1-mark.jonas@de.bosch.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLLMWRmVeSWpSXmKPExsXCZbVWVjc4UzbB4O88doul75cyW9z/epTR ouPvF0aLy7vmsFkc3XOP2eLq7/UsFntbLzJb3N0/l9GBw2PFJ32PnbPusntsWtXJ5nHn2h42 j8+b5AJYo7hsUlJzMstSi/TtErgyrhzazlbwT7Li69aFrA2Ma0S7GDk5JARMJCZcP8zUxcjF ISQwnUli8do3bBDObkaJ1xNPs0I42xklrt7dwATSwiagJXHzxA5mEFtEIFqi5esJsHZmgVVM EndW7WIHSQgLWEt0zutiBLFZBFQkXpy8AtbMK2Ar8X3rTnaI3fISMy99Z4eIC0qcnPmEBcRm Boo3b53NDGFLSBx88YJ5AiPfLCRls5CUzUJStoCReRWjaFqqQVmuuaWhhV5RUmpxlYGhXnJ+ 7iZGSAgL7GC83f1B7xAjEwfjIUYJDmYlEd7ENqkEId6UxMqq1KL8+KLSnNTiQ4zSHCxK4rwq PBvjhATSE0tSs1NTC1KLYLJMHJxSDUxtYv6f5oU7LfyfMz13YxyzztSEh7tcjNT5a91fz9h0 YlUgV7mnRlRz8NWMBO3T271lVhxbdz33nHmc0USH14V/j2+J6Np8Uv1yiGSnwHG1/xd2PXKt +qATtH2fqlTj/7cRAjl73RPlRVPy/rz6PSth1baU0nC3+uhkKQ9rG9FXO+4fbVqp/c1UzKL5 clnAl51OG4vk+GanbTpawCou7SzRGPakTlNy88zpSo2qz7h439yPvn92bu0iQacTMYf0WiaI Ftx8vt2oyjUr/f+E3av3mXw+LsuaYXJapyGusuaF5gvGxdd1y36rbUr8PinOWeYZ37P+RRzy W7tW123avldrInPo2QvreCc8naS8dbMSS3FGoqEWc1FxIgDtFBBU0AIAAA== Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hubert Streidl 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 enables the SMBus mode for a native SMBus controller which doesn't have I2C_FUNC_I2C set. Signed-off-by: Hubert Streidl Signed-off-by: Mark Jonas --- Changes in v3: - busmode now contains the correct bit DA9063_TWOWIRE_TO Changes in v2: - Implement proposal by Adam Thomson and Wolfram Sang to check for functionality I2C_FUNC_I2C instead of introducing a new DT property. drivers/mfd/da9063-i2c.c | 15 +++++++++++++++ include/linux/mfd/da9063/registers.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/drivers/mfd/da9063-i2c.c b/drivers/mfd/da9063-i2c.c index 3781d0bb7786..4c5e0f69942f 100644 --- a/drivers/mfd/da9063-i2c.c +++ b/drivers/mfd/da9063-i2c.c @@ -355,6 +355,7 @@ static int da9063_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct da9063 *da9063; + unsigned int busmode; int ret; da9063 = devm_kzalloc(&i2c->dev, sizeof(struct da9063), GFP_KERNEL); @@ -442,6 +443,20 @@ static int da9063_i2c_probe(struct i2c_client *i2c, return ret; } + if (i2c_check_functionality(i2c->adapter, I2C_FUNC_I2C)) { + dev_info(da9063->dev, "I2C mode"); + busmode = 0; + } else { + dev_info(da9063->dev, "SMBus mode"); + busmode = DA9063_TWOWIRE_TO; + } + ret = regmap_update_bits(da9063->regmap, DA9063_REG_CONFIG_J, + DA9063_TWOWIRE_TO, busmode); + if (ret < 0) { + dev_err(da9063->dev, "Failed to set 2-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.25.1