Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4937721pxv; Tue, 6 Jul 2021 12:58:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxCovOi6hI0C7e/iflwm5PeQdnHSLS6MgFBNdkdetOQdeHoqyzlGK4dDxuQzpR6mH53IGei X-Received: by 2002:aa7:c841:: with SMTP id g1mr25513312edt.343.1625601524685; Tue, 06 Jul 2021 12:58:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625601524; cv=none; d=google.com; s=arc-20160816; b=DoAF8TBLu5R2HADdTmzQIobNXaAd6kWLPx8kIeImdYZJT/uODlKBBcMMkIrfMIiIcr Dj9yGweXp2jmnuI9MxYiZrOr2zbCIxeTjjf2EnRkIcZWkGGf65GV3dXL8nbGQaxR53Vv VY+3wwZ+QIK4HuYSRFEVzCd8SQk6lD8C5z/b2+Qozd84V1wxkNt00UmyMtZIaxOMhBo8 hu6PSSfkAFL17I7dAvL1C6NOkHCRkGqHwC8ONP2fsPzWeVQUSSuRokZx3g7vtNNXgbeo Tm8GKSlp6o8Z7y4EeDqnk2lcnuNJ7rGDxIrEByj1LE1gKKH2pFg7srlSzApK2nfFfbaz l3Zw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=H5hr1jkfiR6AahtYXG4oxTXgC9cQ55LO9WjbhjrCQHU=; b=RbAPRVTBRM2SL3VEgyR3IAg9VW+/wQ8+IJ/rZhUuSUmYE75jbwwp0cHk40lH+pYXNK 72PFsIgRk/7fRtd4g6xdV37utjptrH/292jNE/Z8LDxxIfVGAKrYpSqfndoiXen7p3L8 1tEQ4gxKYpcRyV/3dJa9CxKQA9dG8RtCRVO2ZkdcOPYGHPvXdHd1zzmevk4Hv7aPMNGa GnXtraYR/9M4g8f4/OwG3qYdGuWV8ufEuW6URd0t7vXp0DfG+bE0If/VJl94GGmF44ql 6qZMGCZ2QrgJ9LyXqKlxzvNkd/YPAzJ2xTnJCCIOvs/+W/N4gjn/zry5LOAWBAGTtQNy Vp1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=IKmlBAxO; 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=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y31si19537890edy.561.2021.07.06.12.58.21; Tue, 06 Jul 2021 12:58:44 -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=@redhat.com header.s=mimecast20190719 header.b=IKmlBAxO; 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=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230063AbhGFT6e (ORCPT + 99 others); Tue, 6 Jul 2021 15:58:34 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:27496 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbhGFT6e (ORCPT ); Tue, 6 Jul 2021 15:58:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1625601355; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=H5hr1jkfiR6AahtYXG4oxTXgC9cQ55LO9WjbhjrCQHU=; b=IKmlBAxOHpC7flZWfqV/sn3LcuEIkP5nlhLXwqTVCulfiQVyH2tprDqBAsjSQM8uJHgSw6 XXz1u5y2FPfEI1zw0Zll7L4s23QEqfyndNlXEYyp91e2XJ3zUhJ0+gbdQy5ejvaBTWFPft j1oylRTfJM0FPYIgFd0n8k0ixHTBPk4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-g1jsj-a7M_2awig4YWxuig-1; Tue, 06 Jul 2021 15:55:53 -0400 X-MC-Unique: g1jsj-a7M_2awig4YWxuig-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C60521084F4C; Tue, 6 Jul 2021 19:55:52 +0000 (UTC) Received: from localhost (ovpn-113-53.rdu2.redhat.com [10.10.113.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id 10BA22EB38; Tue, 6 Jul 2021 19:55:48 +0000 (UTC) From: Bruno Meneguele To: sre@kernel.org Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Bruno Meneguele Subject: [PATCH v2 2/2] power: supply: bq24735: add watchdog timer delay support Date: Tue, 6 Jul 2021 16:55:27 -0300 Message-Id: <20210706195527.371108-3-bmeneg@redhat.com> In-Reply-To: <20210706195527.371108-1-bmeneg@redhat.com> References: <20210706195527.371108-1-bmeneg@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The BQ24735 charger allows the user to set the watchdog timer delay between two consecutives ChargeCurrent or ChargeVoltage command writes, if the IC doesn't receive any command before the timeout happens, the charge is turned off. This patch adds the support to the user to change the default/POR value with four discrete values: 0 - disabled 1 - enabled, 44 sec 2 - enabled, 88 sec 3 - enabled, 175 sec (default at POR) These are the options supported in the ChargeOptions register bits 13&14. Also, this patch make one additional check when poll-interval is set by the user: if the interval set is greater than the WDT timeout it'll fail during the probe stage, preventing the user to set non-compatible values between the two options. Signed-off-by: Bruno Meneguele --- Changelog: v1 - corrected the type of new bq24735_platform member wdt_timeout .../bindings/power/supply/bq24735.yaml | 13 +++++ drivers/power/supply/bq24735-charger.c | 48 +++++++++++++++++++ include/linux/power/bq24735-charger.h | 1 + 3 files changed, 62 insertions(+) diff --git a/Documentation/devicetree/bindings/power/supply/bq24735.yaml b/Documentation/devicetree/bindings/power/supply/bq24735.yaml index 131be6782c4b..62399efab467 100644 --- a/Documentation/devicetree/bindings/power/supply/bq24735.yaml +++ b/Documentation/devicetree/bindings/power/supply/bq24735.yaml @@ -56,6 +56,19 @@ properties: The POR value is 0x1000h. This number is in mA (e.g. 8064). See the spec for more information about the InputCurrent (0x3fh) register. + ti,wdt-timeout: + $ref: /schemas/types.yaml#/definitions/uint32 + description: | + Used to control and set the charger watchdog delay between consecutive + charge voltage and charge current commands. + This value must be: + 0 - disabled + 1 - 44 seconds + 2 - 88 seconds + 3 - 175 seconds + The POR value is 0x11 (3). + See the spec for more information about the ChargeOptions(0x12h) register. + ti,external-control: type: boolean description: | diff --git a/drivers/power/supply/bq24735-charger.c b/drivers/power/supply/bq24735-charger.c index 3ce36d09c017..88f1cb1e9fee 100644 --- a/drivers/power/supply/bq24735-charger.c +++ b/drivers/power/supply/bq24735-charger.c @@ -45,6 +45,8 @@ /* ChargeOptions bits of interest */ #define BQ24735_CHARGE_OPT_CHG_DISABLE (1 << 0) #define BQ24735_CHARGE_OPT_AC_PRESENT (1 << 4) +#define BQ24735_CHARGE_OPT_WDT_OFFSET 13 +#define BQ24735_CHARGE_OPT_WDT (3 << BQ24735_CHARGE_OPT_WDT_OFFSET) struct bq24735 { struct power_supply *charger; @@ -156,6 +158,20 @@ static int bq24735_config_charger(struct bq24735 *charger) } } + if (pdata->wdt_timeout) { + value = pdata->wdt_timeout; + + ret = bq24735_update_word(charger->client, BQ24735_CHARGE_OPT, + BQ24735_CHARGE_OPT_WDT, + (value << BQ24735_CHARGE_OPT_WDT_OFFSET)); + if (ret < 0) { + dev_err(&charger->client->dev, + "Failed to write watchdog timer: %d\n", + ret); + return ret; + } + } + return 0; } @@ -347,6 +363,17 @@ static struct bq24735_platform *bq24735_parse_dt_data(struct i2c_client *client) if (!ret) pdata->input_current = val; + ret = of_property_read_u32(np, "ti,wdt-timeout", &val); + if (!ret) { + if (val <= 3) { + pdata->wdt_timeout = val; + } else { + dev_warn(&client->dev, + "Invalid value for ti,wdt-timeout: %d", + val); + } + } + pdata->ext_control = of_property_read_bool(np, "ti,external-control"); return pdata; @@ -476,6 +503,27 @@ static int bq24735_charger_probe(struct i2c_client *client, return 0; if (!charger->poll_interval) return 0; + if (charger->pdata->wdt_timeout) { + int wdt_ms; + + switch (charger->pdata->wdt_timeout) { + case 1: + wdt_ms = 44000; + break; + case 2: + wdt_ms = 88000; + break; + case 3: + wdt_ms = 175000; + break; + } + + if (charger->poll_interval > wdt_ms) { + dev_err(&client->dev, + "Poll interval greater than WDT timeout\n"); + return -EINVAL; + } + } ret = devm_delayed_work_autocancel(&client->dev, &charger->poll, bq24735_poll); diff --git a/include/linux/power/bq24735-charger.h b/include/linux/power/bq24735-charger.h index 321dd009ce66..ce5a030ca111 100644 --- a/include/linux/power/bq24735-charger.h +++ b/include/linux/power/bq24735-charger.h @@ -12,6 +12,7 @@ struct bq24735_platform { uint32_t charge_current; uint32_t charge_voltage; uint32_t input_current; + uint32_t wdt_timeout; const char *name; -- 2.31.1