Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp3464231pxb; Mon, 9 Nov 2020 11:48:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJwQYvhtj4DtVzrhTbVH7scbRinG9EYcP+cSaqs8KsGq3glLYuyGgWPX4EeyyMA9pOe2/3i+ X-Received: by 2002:a17:906:5e02:: with SMTP id n2mr15579970eju.295.1604951305980; Mon, 09 Nov 2020 11:48:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1604951305; cv=none; d=google.com; s=arc-20160816; b=F8dvh6Dc2w/wZyUNoYNcagSrRZoKorQ0XPB13oFpfoYnAfh5zpGUcDbAYwWV9sm6pa zSykSvRllqE3NNcsHIFItz9gI2XHphVPVgOQQEnzyLG7F+UiFmurEjp7q+Ryswhyvl5d ag++WVbWa1jqwdD5YrRgjG0Hxs8qICKcmQ2U3qyaBj9BJrdejJNC90WwBy2jXo9vBdMa 0vfDx/ckAwQ/BuXJ0aU67TkGHTdkhrpB5fFD27nCRjac8S3YzoMfRvaSKjlXOB0Mq80R Cid4mrRhF5FlaC+aShkMq/WCT0a1RY1PQKtBo3ElHhFHD7bEHHq2oHFnkzJdxEfyKyAu /gNg== 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:subject:reply-to:cc:from:to :dkim-signature:date; bh=SFT4XaVfOyn6BnIvM53a+fBVoR87Tr9aFi2bP37+tOc=; b=lGQ0rE2F0TnlCSpBbH2hfO/m3vGvW4u2GWCl3Fml6d+MBBLVFwG5wjJz4juuYXK7Q0 D9LPFVnRXVTanqXFUT4FXLzxcw03b3cU1PtPISMjO6yt2ns2Erv5L6xs85lXHvh2ueZG DJonv6zYKvALuuAwkOPmgXEbxFwAaAg16EySAYbGgqZ8kc1nyJ0PPHizraVzLqS9YfW0 pC7jvM/bWf0H/VeSRdJIbIsAaZysMF/o1IAaPhbszZM+yieetPtjVqPQUv1nAf5fJeub Lm2r6oatLeAlHY9//pXUsYzyghOIOJbqMMm47jMtS3oK5zEYJkOL+ZAa6PSGgI9utICa gbWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@protonmail.com header.s=protonmail header.b=vnOtMncW; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=protonmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a13si8001294edr.154.2020.11.09.11.48.01; Mon, 09 Nov 2020 11:48:25 -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=@protonmail.com header.s=protonmail header.b=vnOtMncW; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=protonmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730416AbgKIToG (ORCPT + 99 others); Mon, 9 Nov 2020 14:44:06 -0500 Received: from mail-02.mail-europe.com ([51.89.119.103]:47408 "EHLO mail-02.mail-europe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730348AbgKIToG (ORCPT ); Mon, 9 Nov 2020 14:44:06 -0500 Date: Mon, 09 Nov 2020 19:43:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1604951042; bh=SFT4XaVfOyn6BnIvM53a+fBVoR87Tr9aFi2bP37+tOc=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References:From; b=vnOtMncWPL5Sk5Dtq9CDqnhYneLwnE5VSN3HHlQu3YWUzC/7DjiKM5ZGpHNyrIrng R9dQYVEqwp+YDi+vpPHjEHJoLu2R+ZQn1aD+uxf15y6siU1OMb0csl4XUVukxx0KFQ Xh+tj2R5sE9VqTvS6cXRfpfFEoUSSlBoX7zCQHDI= To: Sebastian Reichel From: Timon Baetz Cc: Timon Baetz , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Reply-To: Timon Baetz Subject: [PATCH 3/3] power: supply: max8997-charger: Improve getting charger status Message-ID: <20201109194251.562203-3-timon.baetz@protonmail.com> In-Reply-To: <20201109194251.562203-1-timon.baetz@protonmail.com> References: <20201109194251.562203-1-timon.baetz@protonmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-1.2 required=10.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM shortcircuit=no autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on mailout.protonmail.ch Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Detect charging and discharging state. Ported from downstream Samsung Galaxy S2 (i9100) kernel fork. Signed-off-by: Timon Baetz --- drivers/power/supply/max8997_charger.c | 52 +++++++++++++++++--------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/= max8997_charger.c index 8fccd58dac67..1947af25879a 100644 --- a/drivers/power/supply/max8997_charger.c +++ b/drivers/power/supply/max8997_charger.c @@ -13,6 +13,20 @@ #include #include =20 +/* MAX8997_REG_STATUS4 */ +#define DCINOK_SHIFT=09=091 +#define DCINOK_MASK=09=09(1 << DCINOK_SHIFT) +#define DETBAT_SHIFT=09=092 +#define DETBAT_MASK=09=09(1 << DETBAT_SHIFT) + +/* MAX8997_REG_MBCCTRL1 */ +#define TFCH_SHIFT=09=094 +#define TFCH_MASK=09=09(7 << TFCH_SHIFT) + +/* MAX8997_REG_MBCCTRL5 */ +#define ITOPOFF_SHIFT=09=090 +#define ITOPOFF_MASK=09=09(0xF << ITOPOFF_SHIFT) + struct charger_data { =09struct device *dev; =09struct max8997_dev *iodev; @@ -20,7 +34,7 @@ struct charger_data { }; =20 static enum power_supply_property max8997_battery_props[] =3D { -=09POWER_SUPPLY_PROP_STATUS, /* "FULL" or "NOT FULL" only. */ +=09POWER_SUPPLY_PROP_STATUS, /* "FULL", "CHARGING" or "DISCHARGING". */ =09POWER_SUPPLY_PROP_PRESENT, /* the presence of battery */ =09POWER_SUPPLY_PROP_ONLINE, /* charger is active or not */ }; @@ -43,6 +57,10 @@ static int max8997_battery_get_property(struct power_sup= ply *psy, =09=09=09return ret; =09=09if ((reg & (1 << 0)) =3D=3D 0x1) =09=09=09val->intval =3D POWER_SUPPLY_STATUS_FULL; +=09=09else if ((reg & DCINOK_MASK)) +=09=09=09val->intval =3D POWER_SUPPLY_STATUS_CHARGING; +=09=09else +=09=09=09val->intval =3D POWER_SUPPLY_STATUS_DISCHARGING; =20 =09=09break; =09case POWER_SUPPLY_PROP_PRESENT: @@ -50,7 +68,7 @@ static int max8997_battery_get_property(struct power_supp= ly *psy, =09=09ret =3D max8997_read_reg(i2c, MAX8997_REG_STATUS4, ®); =09=09if (ret) =09=09=09return ret; -=09=09if ((reg & (1 << 2)) =3D=3D 0x0) +=09=09if ((reg & DETBAT_MASK) =3D=3D 0x0) =09=09=09val->intval =3D 1; =20 =09=09break; @@ -59,8 +77,7 @@ static int max8997_battery_get_property(struct power_supp= ly *psy, =09=09ret =3D max8997_read_reg(i2c, MAX8997_REG_STATUS4, ®); =09=09if (ret) =09=09=09return ret; -=09=09/* DCINOK */ -=09=09if (reg & (1 << 1)) +=09=09if (reg & DCINOK_MASK) =09=09=09val->intval =3D 1; =20 =09=09break; @@ -84,11 +101,14 @@ static int max8997_battery_probe(struct platform_devic= e *pdev) =09int ret =3D 0; =09struct charger_data *charger; =09struct max8997_dev *iodev =3D dev_get_drvdata(pdev->dev.parent); +=09struct i2c_client *i2c =3D iodev->i2c; =09struct max8997_platform_data *pdata =3D iodev->pdata; =09struct power_supply_config psy_cfg =3D {}; =20 -=09if (!pdata) +=09if (!pdata) { +=09=09dev_err(&pdev->dev, "No platform data supplied.\n"); =09=09return -EINVAL; +=09} =20 =09if (pdata->eoc_mA) { =09=09int val =3D (pdata->eoc_mA - 50) / 10; @@ -97,30 +117,29 @@ static int max8997_battery_probe(struct platform_devic= e *pdev) =09=09if (val > 0xf) =09=09=09val =3D 0xf; =20 -=09=09ret =3D max8997_update_reg(iodev->i2c, -=09=09=09=09MAX8997_REG_MBCCTRL5, val, 0xf); +=09=09ret =3D max8997_update_reg(i2c, MAX8997_REG_MBCCTRL5, +=09=09=09=09val << ITOPOFF_SHIFT, ITOPOFF_MASK); =09=09if (ret < 0) { =09=09=09dev_err(&pdev->dev, "Cannot use i2c bus.\n"); =09=09=09return ret; =09=09} =09} - =09switch (pdata->timeout) { =09case 5: -=09=09ret =3D max8997_update_reg(iodev->i2c, MAX8997_REG_MBCCTRL1, -=09=09=09=090x2 << 4, 0x7 << 4); +=09=09ret =3D max8997_update_reg(i2c, MAX8997_REG_MBCCTRL1, +=09=09=09=090x2 << TFCH_SHIFT, TFCH_MASK); =09=09break; =09case 6: -=09=09ret =3D max8997_update_reg(iodev->i2c, MAX8997_REG_MBCCTRL1, -=09=09=09=090x3 << 4, 0x7 << 4); +=09=09ret =3D max8997_update_reg(i2c, MAX8997_REG_MBCCTRL1, +=09=09=09=090x3 << TFCH_SHIFT, TFCH_MASK); =09=09break; =09case 7: -=09=09ret =3D max8997_update_reg(iodev->i2c, MAX8997_REG_MBCCTRL1, -=09=09=09=090x4 << 4, 0x7 << 4); +=09=09ret =3D max8997_update_reg(i2c, MAX8997_REG_MBCCTRL1, +=09=09=09=090x4 << TFCH_SHIFT, TFCH_MASK); =09=09break; =09case 0: -=09=09ret =3D max8997_update_reg(iodev->i2c, MAX8997_REG_MBCCTRL1, -=09=09=09=090x7 << 4, 0x7 << 4); +=09=09ret =3D max8997_update_reg(i2c, MAX8997_REG_MBCCTRL1, +=09=09=09=090x7 << TFCH_SHIFT, TFCH_MASK); =09=09break; =09default: =09=09dev_err(&pdev->dev, "incorrect timeout value (%d)\n", @@ -138,7 +157,6 @@ static int max8997_battery_probe(struct platform_device= *pdev) =20 =09platform_set_drvdata(pdev, charger); =20 - =09charger->dev =3D &pdev->dev; =09charger->iodev =3D iodev; =20 --=20 2.25.1