From patchwork Mon Apr 15 21:34:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Lengfeld X-Patchwork-Id: 1085942 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=stefanchrist.eu Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44jhbd4t58z9s71 for ; Tue, 16 Apr 2019 07:34:37 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727052AbfDOVef (ORCPT ); Mon, 15 Apr 2019 17:34:35 -0400 Received: from stcim.de ([78.46.90.227]:43634 "EHLO stcim.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727201AbfDOVef (ORCPT ); Mon, 15 Apr 2019 17:34:35 -0400 Received: from xdsl-89-0-59-235.nc.de ([89.0.59.235] helo=localhost.localdomain) by stcim with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1hG9FJ-0000yF-Eh; Mon, 15 Apr 2019 23:34:33 +0200 From: Stefan Lengfeld To: linux-i2c@vger.kernel.org Cc: wsa+renesas@sang-engineering.com Subject: [RFC PATCH 2/3] watchdog: da9062: avoid regmap in restart handler Date: Mon, 15 Apr 2019 23:34:31 +0200 Message-Id: <20190415213432.8972-3-contact@stefanchrist.eu> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190415213432.8972-1-contact@stefanchrist.eu> References: <20190403124019.8947-1-wsa+renesas@sang-engineering.com> <20190415213432.8972-1-contact@stefanchrist.eu> MIME-Version: 1.0 Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Using i2c_transfer() to set the shutdown bit is more reliable than using regmap. I have tried to avoid any routines in the regmap code that sleep by setting use_hwclock to true, but there seems to be other issues, like spontaneous deadlocks. After a lower number of boot and reboot cycles, the board hangs in the shutdown code. So instead of trying to find the culprit in the regmap code, this patch just bypasses it and calls the i2c_transfer() function directly. Tested on a phyCORE-i.MX6 Solo board. Signed-off-by: Stefan Lengfeld --- drivers/mfd/da9062-core.c | 1 + drivers/watchdog/da9062_wdt.c | 17 +++++++++++++---- include/linux/mfd/da9062/core.h | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c index 9f6105906c09..b6a01054ba0f 100644 --- a/drivers/mfd/da9062-core.c +++ b/drivers/mfd/da9062-core.c @@ -609,6 +609,7 @@ static int da9062_i2c_probe(struct i2c_client *i2c, i2c_set_clientdata(i2c, chip); chip->dev = &i2c->dev; + chip->i2c = i2c; if (!i2c->irq) { dev_err(chip->dev, "No IRQ configured\n"); diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c index fe169d8e1fb2..ad6483d25f83 100644 --- a/drivers/watchdog/da9062_wdt.c +++ b/drivers/watchdog/da9062_wdt.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -152,12 +153,20 @@ static int da9062_wdt_restart(struct watchdog_device *wdd, unsigned long action, void *data) { struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd); + struct i2c_client *client = wdt->hw->i2c; + __u8 buf[3] = {DA9062AA_CONTROL_F, DA9062AA_SHUTDOWN_MASK, 0x0}; + struct i2c_msg msgs[1] = { + { + .addr = client->addr, + .flags = (client->flags & I2C_M_TEN), + .len = sizeof(buf), + .buf = buf, + } + }; int ret; - ret = regmap_write(wdt->hw->regmap, - DA9062AA_CONTROL_F, - DA9062AA_SHUTDOWN_MASK); - if (ret) + ret = i2c_transfer(client->adapter, msgs, sizeof(msgs)); + if (ret < 0) dev_alert(wdt->hw->dev, "Failed to shutdown (err = %d)\n", ret); diff --git a/include/linux/mfd/da9062/core.h b/include/linux/mfd/da9062/core.h index 74d33a01ddae..c994293b3aef 100644 --- a/include/linux/mfd/da9062/core.h +++ b/include/linux/mfd/da9062/core.h @@ -68,6 +68,7 @@ enum da9062_irqs { struct da9062 { struct device *dev; struct regmap *regmap; + struct i2c_client *i2c; struct regmap_irq_chip_data *regmap_irq; enum da9062_compatible_types chip_type; };