Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2207667ybl; Sat, 11 Jan 2020 11:34:41 -0800 (PST) X-Google-Smtp-Source: APXvYqy4zr3lDbRiQzymK+ZfBlzP/vv8897TVSiviTth1idq6SU6267k7JqXpTmWgEG0GPt3ORYb X-Received: by 2002:aca:de06:: with SMTP id v6mr6968613oig.168.1578771281115; Sat, 11 Jan 2020 11:34:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578771281; cv=none; d=google.com; s=arc-20160816; b=BtkvohcIbsEkk5h8JUz2/kV46jaK1VStO9Gvp9wjsByDyJUOttwdUQ6fmX7DEobZtn H0OsccCilsdJ6LBc9aLptwS+qS9nJDAWatPkB75xtF/Q4u5+8lu/lnmtX9Fllgmz636i xg/lJ0i7X82nEiqJscJoL1Kg+ghty9mkaXWXVqXF5jcIpgic9lS0zTFv3niUjwtuWWBZ 6/mgRWnCVuC3Vw7QNfmZtqdIifzngqdAsS3vGGWDj6BSDOU8S+5eBE17wZ0/HUuytWHi a2z2PbjX9IKFL536g3phATTv+Q4bq0TqNG5z0IktFO6lKCogPbD0B9Kt8psV9xEPSw40 QmeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=vkJFDNlglZjZCSdChW4o9vV/SHWxub++qIThoeeXFvo=; b=sS992q9GQ9Qx/xwtLDTVlfmiX10GyvWH4ntmhBJEbrU3xWtDJbrGdFetqIaFKrLIck DzwrcFMbpRi7UsaUrFbG5Sz7uJH+rJwwtmZ0EBt8oef5gVtRxtQAknF43YhvH+n6JQIu dVarSp0j8QsAB6C7WsQKvj9+Se481JZsA3TsNhjmBI4FwoxA00JTFi9NL+f6Eh8Y1bvw H6DrE/l5vZyueaPJb0ww3jW6z6+O3ira9KqJHU/sZiX6FBL/Af91EbPrAyUYpMwlbnS+ mop8/zT2OW4IYyRHNfYkKvdg5r9kK9LuWN8k9W10UIJsufdaI3rI0vTweRmkRUFAgOij bMYQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=archlinux.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b11si3552160oie.152.2020.01.11.11.33.53; Sat, 11 Jan 2020 11:34:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=archlinux.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730964AbgAKTal (ORCPT + 99 others); Sat, 11 Jan 2020 14:30:41 -0500 Received: from orion.archlinux.org ([88.198.91.70]:49554 "EHLO orion.archlinux.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730948AbgAKTal (ORCPT ); Sat, 11 Jan 2020 14:30:41 -0500 X-Greylist: delayed 357 seconds by postgrey-1.27 at vger.kernel.org; Sat, 11 Jan 2020 14:30:40 EST Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id 4841E180A9717F; Sat, 11 Jan 2020 19:24:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.3 (2019-12-06) on orion.archlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=ALL_TRUSTED=-1,BAYES_00=-1, DMARC_FAIL_NONE=0.25,T_DMARC_POLICY_NONE=0.01,T_DMARC_TESTS_FAIL=0.01 autolearn=no autolearn_force=no version=3.4.3 X-Spam-BL-Results: Received: from localhost.localdomain (unknown [IPv6:2001:8a0:f254:2300:dad6:8c60:8394:88da]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: ffy00) by orion.archlinux.org (Postfix) with ESMTPSA; Sat, 11 Jan 2020 19:24:40 +0000 (UTC) From: =?UTF-8?q?Filipe=20La=C3=ADns?= To: Jiri Kosina , Benjamin Tissoires , Henrik Rydberg , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Pedro Vanzella Cc: =?UTF-8?q?Filipe=20La=C3=ADns?= Subject: [PATCH] HID: logitech-hidpp: BatteryVoltage: only read chargeStatus if extPower is active Date: Sat, 11 Jan 2020 19:24:19 +0000 Message-Id: <20200111192419.2503922-1-lains@archlinux.org> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the HID++ 2.0 function getBatteryInfo() from the BatteryVoltage (0x1001) feature, chargeStatus is only valid if extPower is active. Previously we were ignoring extPower, which resulted in wrong values. Example: With an unplugged mouse $ cat /sys/class/power_supply/hidpp_battery_0/status Charging This patch makes fixes that, it also renames charge_sts to flags as charge_sts can be confused with chargeStatus from the spec. Spec: +--------+-------------------------------------------------------------------------+ | byte | 2 | +--------+--------------+------------+------------+----------+----------+----------+ | bit | 0..2 | 3 | 4 | 5 | 6 | 7 | +--------+--------------+------------+------------+----------+----------+----------+ | buffer | chargeStatus | fastCharge | slowCharge | critical | (unused) | extPower | +--------+--------------+------------+------------+----------+----------+----------+ Table 1 - battery voltage (0x1001), getBatteryInfo() (ASE 0), 3rd byte +-------+--------------------------------------+ | value | meaning | +-------+--------------------------------------+ | 0 | Charging | +-------+--------------------------------------+ | 1 | End of charge (100% charged) | +-------+--------------------------------------+ | 2 | Charge stopped (any "normal" reason) | +-------+--------------------------------------+ | 7 | Hardware error | +-------+--------------------------------------+ Table 2 - chargeStatus value Signed-off-by: Filipe LaĆ­ns --- drivers/hid/hid-logitech-hidpp.c | 43 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index bb063e7d48df..39a5ee0aaab0 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c @@ -1256,36 +1256,35 @@ static int hidpp20_battery_map_status_voltage(u8 data[3], int *voltage, { int status; - long charge_sts = (long)data[2]; + long flags = (long) data[2]; - *level = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN; - switch (data[2] & 0xe0) { - case 0x00: - status = POWER_SUPPLY_STATUS_CHARGING; - break; - case 0x20: - status = POWER_SUPPLY_STATUS_FULL; - *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; - break; - case 0x40: + if (flags & 0x80) + switch (flags & 0x07) { + case 0: + status = POWER_SUPPLY_STATUS_CHARGING; + break; + case 1: + status = POWER_SUPPLY_STATUS_FULL; + *level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; + break; + case 2: + status = POWER_SUPPLY_STATUS_NOT_CHARGING; + break; + default: + status = POWER_SUPPLY_STATUS_UNKNOWN; + break; + } + else status = POWER_SUPPLY_STATUS_DISCHARGING; - break; - case 0xe0: - status = POWER_SUPPLY_STATUS_NOT_CHARGING; - break; - default: - status = POWER_SUPPLY_STATUS_UNKNOWN; - } *charge_type = POWER_SUPPLY_CHARGE_TYPE_STANDARD; - if (test_bit(3, &charge_sts)) { + if (test_bit(3, &flags)) { *charge_type = POWER_SUPPLY_CHARGE_TYPE_FAST; } - if (test_bit(4, &charge_sts)) { + if (test_bit(4, &flags)) { *charge_type = POWER_SUPPLY_CHARGE_TYPE_TRICKLE; } - - if (test_bit(5, &charge_sts)) { + if (test_bit(5, &flags)) { *level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; } -- 2.24.1