From patchwork Mon Apr 15 08:13:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13629613 Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2092.outbound.protection.outlook.com [40.107.7.92]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DDBB3A1B9; Mon, 15 Apr 2024 08:13:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.7.92 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168808; cv=fail; b=tdluTn/qr7PZbQKny3N36Kcfk9QPuSgWqUYdH0pPM0Ei14IEGCFAfcil1SF3wcqbnhOwiAMh1yaYJOAU/uKbw9uYsdLYXN/KWul+7v+02wa7q3oGkkkrtk6213GwI50uhWP+rIKXMOCMZf6WEv34ky6GiJEHyyYHc2bWLnNErJ8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168808; c=relaxed/simple; bh=DbMIqFE48QPZGX3tHgZgmG8nnZPoAJxlzjCAIhzJTMg=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version: References; b=IJw0R0gKMAFYjr4Dk9h4LtcAzPXzoRFy8H/JgN/z2FKk9P2J9JG99u2o6lisvWUGeGDVTXm9iN6SafuwvUolPR8LgWfMcSwno42g1QTuFWdXZMp0ftzLseDq2smoAGBBtATP7dfWbmMjjpxqUZTDYexaPz20whH4oMbPVKY2Tqw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl; spf=pass smtp.mailfrom=topic.nl; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b=OWfCMWIu; arc=fail smtp.client-ip=40.107.7.92 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=topic.nl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b="OWfCMWIu" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GkbUX6AkYpM5E5TZOzYqT1IpcfSB9jmJXfAbO2P7aWc4jwt+fmIo3kdRwonrjhG/6Wr2MS8gif0YXIwZCz788wCZWlzCWerOiynQhrqVbArC5y5QuNEsTBVvXmGD50zCn7XUZmh/DTJk6YCh6e5tpjV+y15z0tDmDUkN5FiB0gKx3O5ImUUWpHjDPtVrp7sNVGoqJADw8arIvFM0sqFU1e0Fb0GWHiS7UnyZPwNxbMFRrpowbZuBqcYhFwms/6m1vKF8vnCNCHSExm8clIiEeumn3DNyTp3NAWrGhzxICBXzlqkLK/5sEPwyjJuFql1NT3QGiKUroteW1lU80hD09Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=SM0GYnb+LCQZA1SJ1xN8BGBtGWYPC+YBaACg2JyuFQ0=; b=Z2HNFaD9a2xNH6b5c9kxYe899L294wF3HxikXVCSDz15txxujOZ7sNlT7Mn6pxFWQ/6EZ+d7rYThdJmSxaR66+ilmKBJQB8Wj3h4fKsm3rZ1dDlxsQadIxhfou9BR+Q35vZ/zzCJfRRZ6E7/eb9iJqHlTbSEU1CaNY4O0AbocBdQTlf92vB+SPxHNTanShppKzbEqeu3DFHQyzYSQcmskLeaEJvheaOPtzyd8X1UKb9YbnODFGlMdyGMJzNQl3V/T1AO+NH2wTWPr4+5nwiwsWbB27eKzPkqPvFHpyO8nqfulc6JqCbLWsb0KA06SeJMdwo2nCuMdQmkdJFiuTc71Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.69.19.60) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=topic.nl; dmarc=pass (p=none sp=none pct=100) action=none header.from=topic.nl; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=topic.nl; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SM0GYnb+LCQZA1SJ1xN8BGBtGWYPC+YBaACg2JyuFQ0=; b=OWfCMWIueOTT6lh3XgB8s/atz7oWfvYLn0pzv1SprfaSb+2Zr13h+RVdt117GJVnLQVtzAa53r+H2Ris4XaGnTDWh8iW8vQZOgRFjH1fErwAJkqtpQ5fc6XYm2tRVRwKzOyZwB9pl8vtXQowoAAcuzH3FEF1Qqb+nniGiEZZYndWB4y50YOzUjoBqbJmbPF3ron3nKKTHQlbt0DaFiG1j8YUpwyKjhpPkAcZrjQXcBgINt4C5j/Nvz4z3pook7OC2tKA+GKntO9MMIANa1NF5hjFuRKNItvTp13HpWwKDZsywaQ+DDoqHfv1OVP9t3TwjaWdA+C5M+2VRsdJl0YZRA== Received: from DUZPR01CA0125.eurprd01.prod.exchangelabs.com (2603:10a6:10:4bc::17) by GV1PR04MB9104.eurprd04.prod.outlook.com (2603:10a6:150:23::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:20 +0000 Received: from DB1PEPF000509F9.eurprd02.prod.outlook.com (2603:10a6:10:4bc:cafe::cb) by DUZPR01CA0125.outlook.office365.com (2603:10a6:10:4bc::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.33 via Frontend Transport; Mon, 15 Apr 2024 08:13:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.69.19.60) smtp.mailfrom=topic.nl; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=topic.nl; Received-SPF: Pass (protection.outlook.com: domain of topic.nl designates 40.69.19.60 as permitted sender) receiver=protection.outlook.com; client-ip=40.69.19.60; helo=westeu100-emailsignatures-cloud.codetwo.com; pr=C Received: from westeu100-emailsignatures-cloud.codetwo.com (40.69.19.60) by DB1PEPF000509F9.mail.protection.outlook.com (10.167.242.155) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Mon, 15 Apr 2024 08:13:19 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.105) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 15 Apr 2024 08:13:18 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=topic.nl; Received: from AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) by PAXPR04MB8288.eurprd04.prod.outlook.com (2603:10a6:102:1bc::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:11 +0000 Received: from AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a]) by AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a%4]) with mapi id 15.20.7452.049; Mon, 15 Apr 2024 08:13:11 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Conor Dooley , Krzysztof Kozlowski , Rob Herring , Sebastian Reichel , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 1/5] dt-bindings: power: Extend battery chemistry with capacitor Date: Mon, 15 Apr 2024 10:13:01 +0200 Message-ID: <20240415081305.316107-1-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 X-ClientProxiedBy: AS4P195CA0029.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::19) To AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR04MB8644:EE_|PAXPR04MB8288:EE_|DB1PEPF000509F9:EE_|GV1PR04MB9104:EE_ X-MS-Office365-Filtering-Correlation-Id: 093ec577-1ecc-42b2-e17a-08dc5d23e956 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: JjvqCUAfQxbire0ax6yh17rykGCfsTOBxPHpNyw9zsrlhUCd1Ky87QfZlT8xn0OH4kO1S/gny2A2FXeBZpbLPFiSp3HjcaiwqGiHH3oLKhCZwloSPV+WGaR2VjcF8AadOghEzg7FyI6UkAlJFgzB8ItxZzU5MymRpwV58/15szHm8qyfhXcYiKjS1cgFKYOjp/8X+m+LrvUqS9qAT12vW/8i25FTZgRDo12/jZ7kDd4NUumg1FbV/OpWn/aq+mHVVlpa/hSKAShUiB4/RQrMzQUpQPaPwjqNck/a6aLqk++upB22rxENo4EuTIefR373SfH4Nm6agMPWnff/+dQ+HhOvLwT4I0vyDuz3LFsiCFlPnaIQlRX37mabKMg98Ni2sQN1UMx67P9j6ps1QT15+SDUIWrQvAH2K9qeg7jyjJnuY2I+U/Oo8TWyTcETjpdN2LzHl083VWr/eWqprG3pQlFcmK+U4hc8PftB5Iz6qbfrRH6KHi8QKk64a9VyVaZxCa9acoGc5wmdIF50Z7Hfu4e8NwsIHFDQEYVkepaL48hJuA6l+PBsnA2iP0Dmxh9sHbmMmmKnz/5TTof+krAww56aG5P7W3kqkVXOkpzER5BjBdepe72Zmn+6wNqfvsmXVv4suIy7ZYcoDAECaUVbZorSP2ya1jfAvTj/k//2WW/aRYpB9YQG5LDWZvqdbHfMwKVCgzi43T9fKu01sJuHtQ== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB8644.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(1800799015)(52116005)(376005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8288 X-CodeTwo-MessageID: ba7e6d2d-244b-4915-8e65-acf77f724428.20240415081318@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true References: <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.b2a893bc-f00b-47cf-ae07-b37ec1bace22@emailsignatures365.codetwo.com> X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB1PEPF000509F9.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 67619643-946b-44ba-6543-08dc5d23e43e X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: muR3G+MVkVROzNaUI624cBzPCyIHr2vskS79EMNfRnhiv9JOpeXRHP9YAWypRxOrBGMV5Md8HTs0qQt012YEl/YsnV7peaS0tDR/sNl2gdTyF8UJF8uWvpDTanPJBZkGQ55sUp6I0oQrLXQTYwe0MRC/x3eC1ZfFqG9pObCBLQHXAaK3KjhGkWjzCtJkopYxdR09QRvrn2vbvvUc1zHKEo1Z7LPyZUtVPWTteZQmSHT1CNyosklsOpAyXU7CfPAL4rVh16TR6r1gAvYjRcouwTkS6x9xI4f+vdqBJ2n95YmsOE+dlXeOZvfyOaIRvEJ+nCwdOQeDQEcawQoiFrdJ0ItY2gLrgU+SljEmXQeiD/Cao3hEhbFdu4/2Htxmbmnc/B3UyVHwPOVTmDX2iAeeQVIVVpzsHWsiHMIgkAUmbAo4qOEtoEg/MCXZFHEY2cwbk6VypCJpVC4t3nVWJRStr63Ul8s+snDz9Ga1o2+jZj4/9nhB/DGDzJwenl/l3I7YdYlLttSNhfdj0pF05OhFgEiGqkheBaPdRJhPj4x4TyvUg3Zj2/KnIwaH+j1IIHIbnufb8zw24bMa8QpsCIBToYwMyGbQtfffi9/RgHOhYHS4staQO3QNCqhw9ihUUr/qa0pqMOgiCwy5Rfs701kTSMyqa9rWNR5i6Uk+7iO4RCq/lOofR18sfX/2cDSbLLZ/Yi1gY35GSXIsufRUnj49Vg== X-Forefront-Antispam-Report: CIP:40.69.19.60;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:westeu100-emailsignatures-cloud.codetwo.com;PTR:westeu100-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(376005)(1800799015)(36860700004)(82310400014);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Apr 2024 08:13:19.9635 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 093ec577-1ecc-42b2-e17a-08dc5d23e956 X-MS-Exchange-CrossTenant-Id: 449607a5-3517-482d-8d16-41dd868cbda3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=449607a5-3517-482d-8d16-41dd868cbda3;Ip=[40.69.19.60];Helo=[westeu100-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: DB1PEPF000509F9.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: GV1PR04MB9104 Another technology to store energy is a (super)capacitor. Signed-off-by: Mike Looijmans Acked-by: Krzysztof Kozlowski --- (no changes since v1) Documentation/devicetree/bindings/power/supply/battery.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/power/supply/battery.yaml b/Documentation/devicetree/bindings/power/supply/battery.yaml index 491488e7b970..a22c97dfad88 100644 --- a/Documentation/devicetree/bindings/power/supply/battery.yaml +++ b/Documentation/devicetree/bindings/power/supply/battery.yaml @@ -44,6 +44,7 @@ properties: - const: lithium-ion-polymer - const: lithium-ion-iron-phosphate - const: lithium-ion-manganese-oxide + - const: capacitor over-voltage-threshold-microvolt: description: battery over-voltage limit From patchwork Mon Apr 15 08:13:02 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13629611 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2127.outbound.protection.outlook.com [40.107.22.127]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2CE2383B0; Mon, 15 Apr 2024 08:13:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.22.127 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168806; cv=fail; b=tkrKY1P8UStoRCLzNdXtQX7fA2vBTzKAZDZCkuQBOmnN+ct2PmL4ZnHkg+WXzFD6n4LirfcEbSjBiSwtFvcrbUEL/psmvLehvP7+RfVTTOQ4HJhpjqZio3etKqx2pyBOio4t2CbAZ9fM98l0t13r5l9DIZVVy3tHeNTGU2vqwFo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168806; c=relaxed/simple; bh=Y2H6dOGBf2pkftSVAP8GOMZcx7D2R5boo/6ugyeLpFc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=dz5xVkb6+YEIcB7NOFTAwzm2yvDxa+gzMS1dwfKkmlXdCfYqIV8rmpvRqutqk9OgONLPKtBf2bLEMA60VBky6U53rSUPTUs6sF5KwoS7ZbGUQIXJs71neZ5TJTS56TiMJ0Vjiez6XemsK8c/Msn0ar+OFvXL25UfXJwpvveNfuA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl; spf=pass smtp.mailfrom=topic.nl; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b=Bts71gga; arc=fail smtp.client-ip=40.107.22.127 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=topic.nl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b="Bts71gga" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ap4WWKjhP6Ub+Fh2CNMrxZeHaw9MDdnaiUfE5crQgh+YZHvKDdLRY8MCtRc9cv71GIDSBG0HywzBLcLo2Q1k+KuA4njzxeWwvEaEtwsKxrpy6X6XrqVcnfhaIeWx1gKmB4gizmrj6c+tF3FDD2JbrpV7SDXSl08/B1wSYcAs6BAe1uNddQZJGK3/DjFWDsVagCJH+QJC5UshQ6ugfUw4WDWMSWEzANNfChTY3+NDfAWKA8d/Q3RkpCX0I4QHuCQK3HpWbnndSSnQpVwVWzmltC6m9ElFGt7lEzgG+8t/kYBYT2KepLYXYC+lcRit1k34AX+HSjdIXQpX4clifOVfmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=2PxWi/d1gN0YGmptaDaIN+rhdlEdWzrSX4jllpSdXX4=; b=TCUllCBtJm+ByfEmmugdscY9XswebzKPYzXTtV+TB49LV2YHEgXGX6RSbQjhnvqUeMUMvV055NZ42m1pwvi+OmEdRIfpjDxTM8b3tJqBsti8W5rbvwet9bNiq5h6FRxG8kl8VerwsBRQEsw3p/h3uWUjtId+kldkAfFiF4+dJg1dMKTKUiJUNoOZ5U0i9jIZtKbmuRqRb452AqAVhQyf3VnBJe6zZ3PgqIBJwpcnxWaaJlPw1Qj/3TNm6P2Sz6/N/ERu/ms+GGntmsf3K/iAdm3/drs4Tirfd0tKgC0EOnu6I1wxFirSB6YQ79lU7VDbfbc8nbL84AO2kcBuUbuQpA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.69.19.60) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=topic.nl; dmarc=pass (p=none sp=none pct=100) action=none header.from=topic.nl; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=topic.nl; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2PxWi/d1gN0YGmptaDaIN+rhdlEdWzrSX4jllpSdXX4=; b=Bts71gga8vBm5rk2uBEkio0wLxS6GHzaTMeMlcl93XuoDjsGWKakZAgSmvDjyVb01B6w+l1pk5fGKsW9d1Xb/ogkOHoKPTTe8M2m/CJDTEmO2Z1Ck1R+T78xjaPXxbTiWNoF3D/EW+Ce1NDtqxeH2Q/K2Ht+p7C7raFj7tEyJ64dN0ttECS4CCuizlBiz+RKYYwjsD0Jyqy0sQAMyts4YpmZw7oqUMO/s3SWEPRSfWaTqH6pMm5LZBXrZfsDx7gCWBTkX32rdQFQnbpOWS1K1CueF+yZTrxc2+8CvAEE89mT0ohwpbvVloiRwJY+lb33iv/4TxKuCxdh8KnGiXcKHw== Received: from AS9PR05CA0102.eurprd05.prod.outlook.com (2603:10a6:20b:498::27) by DB8PR04MB7049.eurprd04.prod.outlook.com (2603:10a6:10:fc::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:20 +0000 Received: from AMS1EPF0000004D.eurprd04.prod.outlook.com (2603:10a6:20b:498:cafe::b9) by AS9PR05CA0102.outlook.office365.com (2603:10a6:20b:498::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.33 via Frontend Transport; Mon, 15 Apr 2024 08:13:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.69.19.60) smtp.mailfrom=topic.nl; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=topic.nl; Received-SPF: Pass (protection.outlook.com: domain of topic.nl designates 40.69.19.60 as permitted sender) receiver=protection.outlook.com; client-ip=40.69.19.60; helo=westeu100-emailsignatures-cloud.codetwo.com; pr=C Received: from westeu100-emailsignatures-cloud.codetwo.com (40.69.19.60) by AMS1EPF0000004D.mail.protection.outlook.com (10.167.16.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Mon, 15 Apr 2024 08:13:19 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.104) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 15 Apr 2024 08:13:18 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=topic.nl; Received: from AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) by PAXPR04MB8288.eurprd04.prod.outlook.com (2603:10a6:102:1bc::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:12 +0000 Received: from AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a]) by AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a%4]) with mapi id 15.20.7452.049; Mon, 15 Apr 2024 08:13:12 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Sebastian Reichel , linux-kernel@vger.kernel.org Subject: [PATCH v4 2/5] power: supply: core: Add POWER_SUPPLY_TECHNOLOGY_CAPACITOR Date: Mon, 15 Apr 2024 10:13:02 +0200 Message-ID: <20240415081305.316107-2-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415081305.316107-1-mike.looijmans@topic.nl> References: <20240415081305.316107-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.0aecd676-868f-4018-bb2f-56c7fe7c18ff@emailsignatures365.codetwo.com> X-ClientProxiedBy: AS4P195CA0029.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::19) To AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR04MB8644:EE_|PAXPR04MB8288:EE_|AMS1EPF0000004D:EE_|DB8PR04MB7049:EE_ X-MS-Office365-Filtering-Correlation-Id: f5f5e1ad-f09b-4318-4867-08dc5d23e93b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: e/9WCkdrxhl57fk/qgnQJyi/4RjgQR0IZQ34V+F6AWrvy/atyJ5ZGjAdlmsPihKuK7CzKcr+In3wGT7DWFHDtoZ2OW0+mtilFQ2zoSFonl0oSFBRgc/J3SLAzo0R8E2CqLAr6tHOA2oK1AMgUdMng8Fe8QQnek6X9YUekhDE6SrbVpoeuPaFJIxTCTYW2ecxF9tmzcdYGvW4HdA39VjwC5R8cLpqCb4vvwNvdI+0920GmvvSW1UNEHJoap3mfXjUrqHAub0vu3fkd2f/HO7vfqLIkdVvk8/CjaLzLnFKZoFq8mj5dSfeQiw/CSDgoEZex6FweO5fb2mtXvy1NiDjjY622a1viHCDTpMakM9alF4YRkG/iL4KN3MN7UgtyCWBb4QBsxJUL/E/l5DbJtxv2eIWy7yv6ht1ETv1pnyckIjemezgRWvdro6+0TiLL+iKJKyV49tJybM1fzbySPi3RaLSJ26QKttgkPsG0U38I/xWOF16jWRx9cWnO2QFCvtyIP8nd34Hp4AKYLscl1JGsSF2FBLggq5zEV9TkfRzYiXmzljXZQNlghxjX0ZE+JIIZr4pvbhKpQGcEqCgTIIWlmB8A9qAfmpb/tV2doSGyKvDYS+K9yVtf5ShMax5ss5L2iP8vlLEYmwL/7fH1s2XEaXkw99XGIfcWVlyynk6ruMkyZ7vtjBHmoF4/O3mocV6bCkkCNvu3Pn2F3Xa1Jc7vQSQkqzR//GNTyJesPEOVpY= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB8644.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(1800799015)(52116005)(376005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8288 X-CodeTwo-MessageID: 2614c8f6-768a-453d-b1a5-76a247684cf2.20240415081318@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS1EPF0000004D.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: f4cb233c-113a-4010-893c-08dc5d23e486 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: kYqIk8YT/hAbztdy/Dukl9U9oEGUF7nbWXBE2LtqpT2xAX9qzHbuVJJ3oikFo69l0no2+CpmdqLrBKWcfp+RINssQWFPQeeMqB9VZXPvwyQgKG/7e2G1n/BZ+LtJCAGAb8mANlkGn9lBz8qPL8j9OaT0mtX8UhBO3CH7KFybF9C5Ml9MLdEmAbdthrX0H/XK0E0DxDXziJaLBGL3Rk8WjpVDaI40kVWTgIXsfJCxokSVYEXeVzC+nia48Pbq0j5Quuo6PBeRybYngtba/7h3OqUGxO6KutA3dV4vtf9UvQlQNd32XyWo40/MpKCOtLxVQM3HogFI2VMux/E7Z8JuowtJLotPTiKM0WXjKExd/1nLuDJ0euRpIzaqAebynsEcINfsfe9lDTfkMCAXkhvQ2XvzrCrTsgO536Ndy/5TJdM1iwRPJvyMPmeaUYrCh6P+rauCTeCTQd3jfZrdvVclyoQT5PhjEyi5hiQYvEn6aHQcQAtwZcE5uGGQk8CTSxeSkPUTtl4D97fn6REQfw1rvYFlvyDvvKGazCmnpGmTPzSdbjr6G8unVa7T2DVp9WTkxp/UIuzJZpuq4V/zYDshYYrOsIIJHwccm5oBwWqFNJixatU4w+NfeaJ1pPNtX9ZfU3ZOTEuyOqheyu3la+cVxoaGcJICqqOk6ydciO48CkaBvgb76IRT3qUYllx4GBQjncM7AKgw1lTOmeuQ7jW0DQ== X-Forefront-Antispam-Report: CIP:40.69.19.60;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:westeu100-emailsignatures-cloud.codetwo.com;PTR:westeu100-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(376005)(1800799015)(36860700004)(82310400014);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Apr 2024 08:13:19.7201 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f5f5e1ad-f09b-4318-4867-08dc5d23e93b X-MS-Exchange-CrossTenant-Id: 449607a5-3517-482d-8d16-41dd868cbda3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=449607a5-3517-482d-8d16-41dd868cbda3;Ip=[40.69.19.60];Helo=[westeu100-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: AMS1EPF0000004D.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR04MB7049 Another technology to store energy is a (super)capacitor. Signed-off-by: Mike Looijmans --- (no changes since v1) Documentation/ABI/testing/sysfs-class-power | 2 +- drivers/power/supply/power_supply_core.c | 2 ++ drivers/power/supply/power_supply_sysfs.c | 1 + include/linux/power_supply.h | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-class-power b/Documentation/ABI/testing/sysfs-class-power index 7c81f0a25a48..1f6a04a17c81 100644 --- a/Documentation/ABI/testing/sysfs-class-power +++ b/Documentation/ABI/testing/sysfs-class-power @@ -488,7 +488,7 @@ Description: Valid values: "Unknown", "NiMH", "Li-ion", "Li-poly", "LiFe", - "NiCd", "LiMn" + "NiCd", "LiMn", "Capacitor" What: /sys/class/power_supply//voltage_avg, diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c index fefe938c9342..6d1327e16ff6 100644 --- a/drivers/power/supply/power_supply_core.c +++ b/drivers/power/supply/power_supply_core.c @@ -686,6 +686,8 @@ int power_supply_get_battery_info(struct power_supply *psy, info->technology = POWER_SUPPLY_TECHNOLOGY_LiFe; else if (!strcmp("lithium-ion-manganese-oxide", value)) info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn; + else if (!strcmp("capacitor", value)) + info->technology = POWER_SUPPLY_TECHNOLOGY_CAPACITOR; else dev_warn(&psy->dev, "%s unknown battery type\n", value); } diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index 0d2c3724d0bc..9d8540ce1f7e 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -119,6 +119,7 @@ static const char * const POWER_SUPPLY_TECHNOLOGY_TEXT[] = { [POWER_SUPPLY_TECHNOLOGY_LiFe] = "LiFe", [POWER_SUPPLY_TECHNOLOGY_NiCd] = "NiCd", [POWER_SUPPLY_TECHNOLOGY_LiMn] = "LiMn", + [POWER_SUPPLY_TECHNOLOGY_CAPACITOR] = "Capacitor", }; static const char * const POWER_SUPPLY_CAPACITY_LEVEL_TEXT[] = { diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 8e5705a56b85..af5a4e700881 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -78,6 +78,7 @@ enum { POWER_SUPPLY_TECHNOLOGY_LiFe, POWER_SUPPLY_TECHNOLOGY_NiCd, POWER_SUPPLY_TECHNOLOGY_LiMn, + POWER_SUPPLY_TECHNOLOGY_CAPACITOR, }; enum { From patchwork Mon Apr 15 08:13:03 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13629612 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2115.outbound.protection.outlook.com [40.107.22.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7783539851; Mon, 15 Apr 2024 08:13:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.22.115 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168807; cv=fail; b=pq/bpy9czBtRV0pEIIgdTgp67x6EvJMUqfGsD5PHxIABdDZfsG5tjQR+etxLAo4IOwTrGXPskrmjZEWupNgTsq5Mqhw95BgLn52D5KsrIbfKr+WVpyC1ow4Z24lPPsJ9QZQ37rt2dRMne1UC0+zr9EfqSXFNI055vay+llm2RNM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168807; c=relaxed/simple; bh=9qcG7iz3fuDsLrOzdibbuaHhqB/sTiBM5Y03rQwu/g8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BNis+ycK1r0kHt+qFrJGEaD2Yk6L4liLEr3IfqqSJnJBZgrTKDcUkX/LkWh1jMm0H8yAAuDojIQMdGoj5v+O+F+nnQ8AV2j9b9JRoTuBru1775DUGaIzVZ4o7+qxBVGrSI8FFCXpU8DlmifLclQP305UPijgAepat8mCg6I/k14= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl; spf=pass smtp.mailfrom=topic.nl; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b=hqmtTrgh; arc=fail smtp.client-ip=40.107.22.115 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=topic.nl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b="hqmtTrgh" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=OBN/9wzZ2XZhtEPzRjmdCDit2oK4Y2/taYnvJz301G3IhqGq3rwbVyrQlj2Z/yJZ1h7drHL836cpT2rpeB5UZxudx+iZkbzaIx3RLvQIlWBIAwRwo7z3XsZpAlixUDNnELqmo4SovoSyuodtV4HRemqMo9Lc1rPT/Y5D8sfdX2ETWFDLz4eOVo/vqBUkDxmZJ9r6zhmreysEwmgEjrIOlmP8xxG3Ao59s1COZEnF6kHe4WWvP9E846aFpaFT8sSDl+izPqldVbYzjKyWVOpTSvK9gZCl2svvNUXJN2TAuTkgaUesqgcL3zX4OfYFPdhg/oujHmJewRc5JGiYdl0+ww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7CXGJvQlQE1Iieu+YOvD9q8PM9AIhDyaffeEMwspuFQ=; b=Hj71x96EQpxAMEGtzjtVdkoy7/pSpnMUGXskT4F1AGyCX6iVzPxLethgd+SgH9K3N6XGQe00UTsOLyhKoEFQbd1DNaAwQOn3YWoU1Pg8WF5XZxSO2Uy2k+8MB77v3ggZW05DVnO1vT8JlfKzETzipzQtlwG53zgh3SfUQwW/eXVNRUrhPHQlzibSqsADmdXsglWH3F8VIrbLaNz1n7T3hdAmOlY3ItcghFMj6tEA1jgmMOwAxQ+VohqR9qNOfYuBTu14l6wZRltB0tOYzZ3uDNljcMIfeWtMdD3cb+bRHCukcXgKGwlxx1OGlon6SfZAKZd+mRAm/HtqzNtEP5h6nw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.69.19.60) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=topic.nl; dmarc=pass (p=none sp=none pct=100) action=none header.from=topic.nl; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=topic.nl; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=7CXGJvQlQE1Iieu+YOvD9q8PM9AIhDyaffeEMwspuFQ=; b=hqmtTrghtCrmPt54ZzL1ZoF0iv5omnk2Jin5rpjX8und4pFKoL6UZntX4KdeiqyTS3VvKqpf3g12t3cBkBA7UR8ZHbl6LRgwuafn1W9baD2UPuMjLRzA1ErykoK0KwyyDHpAbQj/4gdC92PTQupqON75AkED4Wnzca8iVBVDfia4thdn9K0vxEn4Wl8BEbL3k5FnvGvzghkBTZYPAhKoWsHDljYzxg+ArTSwPG1wdLzi6zM4ZjJ6g/5AMK4BNez+5aK07m3MmO7B+Lfo4+S6wskxUOZDyZkYfoxxnRfKpboIY2ZeMSs1wandlBvKSdQxe8GUDHBIZBDB9Tu4cfpCgw== Received: from DU2PR04CA0263.eurprd04.prod.outlook.com (2603:10a6:10:28e::28) by PAWPR04MB9988.eurprd04.prod.outlook.com (2603:10a6:102:38b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:20 +0000 Received: from DB1PEPF000509F3.eurprd02.prod.outlook.com (2603:10a6:10:28e:cafe::48) by DU2PR04CA0263.outlook.office365.com (2603:10a6:10:28e::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.33 via Frontend Transport; Mon, 15 Apr 2024 08:13:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.69.19.60) smtp.mailfrom=topic.nl; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=topic.nl; Received-SPF: Pass (protection.outlook.com: domain of topic.nl designates 40.69.19.60 as permitted sender) receiver=protection.outlook.com; client-ip=40.69.19.60; helo=westeu100-emailsignatures-cloud.codetwo.com; pr=C Received: from westeu100-emailsignatures-cloud.codetwo.com (40.69.19.60) by DB1PEPF000509F3.mail.protection.outlook.com (10.167.242.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Mon, 15 Apr 2024 08:13:20 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.104) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 15 Apr 2024 08:13:18 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=topic.nl; Received: from AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) by PAXPR04MB8288.eurprd04.prod.outlook.com (2603:10a6:102:1bc::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:12 +0000 Received: from AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a]) by AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a%4]) with mapi id 15.20.7452.049; Mon, 15 Apr 2024 08:13:12 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Len Brown , Pavel Machek , "Rafael J. Wysocki" , Sebastian Reichel , linux-kernel@vger.kernel.org Subject: [PATCH v4 3/5] power: supply: core: Add POWER_SUPPLY_PROP_*CELL* entries Date: Mon, 15 Apr 2024 10:13:03 +0200 Message-ID: <20240415081305.316107-3-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415081305.316107-1-mike.looijmans@topic.nl> References: <20240415081305.316107-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.9dd4ffd7-8f51-463b-bf4f-d1ff27030b84@emailsignatures365.codetwo.com> X-ClientProxiedBy: AS4P195CA0029.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::19) To AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR04MB8644:EE_|PAXPR04MB8288:EE_|DB1PEPF000509F3:EE_|PAWPR04MB9988:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c23eb29-1f38-4c86-7eb5-08dc5d23e97a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 0nGCCUq7/8QuW0s/Sw+f3VBsU6laUVuAeh17LpMSS6NHYlbMFr44mnVZ5Mzp0UkgNrEYQP/5zGfVMr7pST8ZsGE0DXqD2Xg/5vaSm3cKXOGb+X+K8TRKhxDQ7CaDEBNdOF7IC2CFQd8fy7CTUPO571+uOrxr+gz1I3EUYgzme2mxKzIa6yjTFHcwkxJNQhTmk3INgLOwQckLa1e1ZGSTggLmvjx0daHKXmiM7A306U1Emc9SCVn9+TJZvEsYwnEAzCMnnd621DKrXRP1wDSL65UYuaTcEZyYldQDDKU6vAMluoFQWKFss8zouX1X9oB65ENjiJrMn5hu02gFKF/1qXDrCLgyg2qU7k3JoMH31Z1/PKJCJwJIBlSkxNCw8z51PEnv1m3DWIpts1ailAiKNAu+2NC0gW86hKEe9PXS0VElG60a4ynpy13qQGxIZEcKNm3yfO8FQVZTLKyhjPnQ94Pg8+EqVU3J/0jLbEEGxEt+In54Th7GQjtG1j1GxaJ5x63lf9b4PXP7vKXI82Qvq+hfecIRugfPMP6H25gRDIoE9mbrl3Xmwm0DHhnOsK3/fVMeQEoJgi1rSLkTBL6YNb1N/0xpKEKu5tIvD2556P3NvGMPe4npE6Kr4nDf8xaAYFGCFp8iQaIdhb39D7hLU1ZqkkF+p3FZtDor7abTgPtd6ogphDJuUKdYcvmIwmW6oPm0ITnbOHweWgF4/bVNWg== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB8644.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(1800799015)(52116005)(376005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8288 X-CodeTwo-MessageID: 1f7827fd-2769-4c15-8486-04e5a232ee74.20240415081318@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB1PEPF000509F3.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: de705ab2-f56a-4028-a775-08dc5d23e4cc X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: BRklKNtFwo2akyyGwysJliJEBr/QvlPfwX1kCskItmOnjsaSNqOWXUsN5DGz63jmPMVsyW7ZC6XpNA5mQ24tPIz45/8d+yMRQhGnqhm8/k5EsdVbo6xFaUruADdWqEbYMSctxYHyqoqi7HVIcRXnSsP29EY4UMpDO8ZLNwfEsML9EnvNA1kbW6KOEeH4tNDRlXT5ei8JHtH3kiX3MxJvaVvb4mysHci82l0srRSXXpBiq3JlkIumHvq3bkUmsuDxFF/nIHRUy5sFQCNJqBGlQYqWKV2ZIoSxH4i9BUazuVyQZmBbXHCJZP6VUEyqcZnLLQkm31bYQWJuOkub6Rtnec0JqD/YMoV9OIQRxED9oSI4pCdjr5oya1ZW7uBZNbLupp0jnYNB586xUyvHk9hJOd7KHmuadIaRU1LKcTsTfhkRV9drED4y2mkAPrDpXjg/mi7H9dBYG79VMhUK/C+JNVPRhOw22cumYILJaxuDCc1WSeYCokgCSIAirHMjQ+TAQzkv+cCGttv2KXEddMDL+L0Yc6llG8Q/EnhCa8x2nRSCoG/H8B5F+X93pbzE3bSwx/gZHr1M47gr3da84naa38dYpYtTluuicm66ek2ddNck+mKfFI4chCDWTz/yJ9mqjl2i+YZ2+OhvaPutMhvmvPiISpal/oSNGSMREAPSzg3VJE2j7kmZZyVHiw4+R3UYbnyRKq6uHh0G8jBANQAcAw== X-Forefront-Antispam-Report: CIP:40.69.19.60;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:westeu100-emailsignatures-cloud.codetwo.com;PTR:westeu100-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(36860700004)(1800799015)(82310400014)(376005);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Apr 2024 08:13:20.1969 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0c23eb29-1f38-4c86-7eb5-08dc5d23e97a X-MS-Exchange-CrossTenant-Id: 449607a5-3517-482d-8d16-41dd868cbda3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=449607a5-3517-482d-8d16-41dd868cbda3;Ip=[40.69.19.60];Helo=[westeu100-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: DB1PEPF000509F3.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR04MB9988 For multi-cell chargers (or stacks of capacitors), allow to report the number of cells in series and the voltage of each cell. Signed-off-by: Mike Looijmans --- (no changes since v1) Documentation/ABI/testing/sysfs-class-power | 51 +++++++++++++++++++++ Documentation/power/power_supply_class.rst | 7 +++ drivers/power/supply/power_supply_sysfs.c | 7 +++ include/linux/power_supply.h | 7 +++ 4 files changed, 72 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-class-power b/Documentation/ABI/testing/sysfs-class-power index 1f6a04a17c81..f5b194ad61b3 100644 --- a/Documentation/ABI/testing/sysfs-class-power +++ b/Documentation/ABI/testing/sysfs-class-power @@ -516,6 +516,57 @@ Description: Integer > 0: representing full cycles Integer = 0: cycle_count info is not available +What: /sys/class/power_supply//number_of_serial_cells +Date: April 2024 +Contact: linux-pm@vger.kernel.org +Description: + If the energy storage is composed of multiple cells in series, + this provides the number of stacked cells. Parallel cells aren't + considered here. + + Access: Read + + Valid values: + Integer > 0: number of cells + Integer = 0: info is not available + +What: /sys/class/power_supply//cell1_voltage_now +Date: April 2024 +Contact: linux-pm@vger.kernel.org +Description: + Reports an instant, single cell voltage reading. The voltage is + measured across the cell. The battery reports voltages for up to + 'number_of_serial_cells' cells, in cell2_voltage_now and so on. + + Access: Read + + Valid values: Represented in microvolts + +What: /sys/class/power_supply//cell_voltage_max +Date: April 2024 +Contact: linux-pm@vger.kernel.org +Description: + Maximum allowed voltage for a single cell. This value is shared + across all cells in the range 1 to 'number_of_serial_cells'. + Typically used to trigger an alert for userspace. + + Access: Read, Write + + Valid values: Represented in microvolts + +What: /sys/class/power_supply//cell_voltage_min +Date: April 2024 +Contact: linux-pm@vger.kernel.org +Description: + Minimum allowed voltage for a single cell. This value is shared + across all cells in the range 1 to 'number_of_serial_cells'. + Typically used to trigger an alert for userspace. + + Access: Read, Write + + Valid values: Represented in microvolts + + **USB Properties** What: /sys/class/power_supply//input_current_limit diff --git a/Documentation/power/power_supply_class.rst b/Documentation/power/power_supply_class.rst index da8e275a14ff..42110cbbea4a 100644 --- a/Documentation/power/power_supply_class.rst +++ b/Documentation/power/power_supply_class.rst @@ -213,6 +213,13 @@ TIME_TO_FULL seconds left for battery to be considered full (i.e. while battery is charging) +NUMBER_OF_SERIAL_CELLS + If the energy storage is composed of multiple cells in series, this provides + the number of stacked cells. Parallel cells aren't considered here. +CELLn_VOLTAGE + voltage measured of the n-th cell in the stack +CELL_VOLTAGE + single cell voltage when the cells share the same value (usually MIN or MAX) Battery <-> external power supply interaction ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index 9d8540ce1f7e..4ea6b556f3fd 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -218,6 +218,13 @@ static struct power_supply_attr power_supply_attrs[] = { POWER_SUPPLY_ATTR(MANUFACTURE_YEAR), POWER_SUPPLY_ATTR(MANUFACTURE_MONTH), POWER_SUPPLY_ATTR(MANUFACTURE_DAY), + POWER_SUPPLY_ATTR(NUMBER_OF_SERIAL_CELLS), + POWER_SUPPLY_ATTR(CELL1_VOLTAGE_NOW), + POWER_SUPPLY_ATTR(CELL2_VOLTAGE_NOW), + POWER_SUPPLY_ATTR(CELL3_VOLTAGE_NOW), + POWER_SUPPLY_ATTR(CELL4_VOLTAGE_NOW), + POWER_SUPPLY_ATTR(CELL_VOLTAGE_MIN), + POWER_SUPPLY_ATTR(CELL_VOLTAGE_MAX), /* Properties of type `const char *' */ POWER_SUPPLY_ATTR(MODEL_NAME), POWER_SUPPLY_ATTR(MANUFACTURER), diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index af5a4e700881..3c208dff8af8 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -171,6 +171,13 @@ enum power_supply_property { POWER_SUPPLY_PROP_MANUFACTURE_YEAR, POWER_SUPPLY_PROP_MANUFACTURE_MONTH, POWER_SUPPLY_PROP_MANUFACTURE_DAY, + POWER_SUPPLY_PROP_NUMBER_OF_SERIAL_CELLS, + POWER_SUPPLY_PROP_CELL1_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL2_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL3_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL4_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL_VOLTAGE_MIN, + POWER_SUPPLY_PROP_CELL_VOLTAGE_MAX, /* Properties of type `const char *' */ POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_MANUFACTURER, From patchwork Mon Apr 15 08:13:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13629614 Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-db3eur04on2117.outbound.protection.outlook.com [40.107.6.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A2FB3BBF5; Mon, 15 Apr 2024 08:13:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.6.117 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168810; cv=fail; b=RtV2XDI2wrqSTPEhebLRhQQuJPANl4BIFRfhbBgA+0EjLMJsQMs49/1ejRwaI6oKeLs99PiKEDtSbFamaBzB2RP4QyTi4+bRuXGVEVw18ltY7s8Vu2lnWtzKNiFWWg66aPYKGD5yH4dZA2x4xy75NJ7M8HZJPZ53ipr7SakTA0w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168810; c=relaxed/simple; bh=u2jNXUdlEl0kN1j8OchrByc+t9mhlXMj8KWzl9eF8sU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=VhjMWt6ZcvspOdtrB4cFslpUXSD+PaQyRMIIJs/hRHHh9HLMTqsnheyq3Yz5Enh1esyTmFCqmUIoFzAeKe8Ujv4CfEsAU3JYPx2X6m1+m80bRf1Jdp6Hx5hw5WTFaSjSsFlmbjJjf1HWvj71QbCZKEQNQTg+KkeziZUvd0SdlG8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl; spf=pass smtp.mailfrom=topic.nl; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b=PVW7RaRp; arc=fail smtp.client-ip=40.107.6.117 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=topic.nl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b="PVW7RaRp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UBG5NhOQ31n75EzTLGL3PvtFNml6loPKlnZblWJRYdLUyAmt0yZeRoLSrgHZJwQZfAP+PF8QP4tfkbaEk/YoX2xTkOICKm5IiP9qz5MeIsONY223q2nb3rDtkQ6OgdWY7vi3bCOYjj3V3lzhas3ajadsiYlSv4CWHf08l/4d064ijTwaQzwqEmzfBF5RH8/6GBMCPVPjZI28orYEthZ985tEUCqK9lUNG0NG9v6LQQgi/sN0EKuv8mjd4WypH5fYyxveOjPt4U43G6um5iDZKSx9CRjfRdrOkvlRmclIi6dhy43oiakdSSRjB4OcaEmqTpeAGv8cQYSh/icJk6jISw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5Qkr7nM727EHH45DBlYjU1b/MAYY/KynsP/yC64XoSI=; b=EbIBfSMOn7Kh4i8Gv0DOjWFd0wtKUS5JTvxFqF8ZzCRV77DdyzMQM5gkmML3TEBeWAnQ8sfhjRGN4zmgKKgqX9uYZS7v3IyAxIv7KpXAA+i5TEi674aqANDk71E5O5xTnU0cs9RQXM4PAYkp68FHfLVsBbvw2IcCtUqIkWhy94LCgNiFe6gosUzyUn1TzHIh1IyySnt/7qXRM5G+FIZiJdL08JNB5tv0QwCTEBUsVJVJ6SyHwwMeFIlj0HXfN14cRPoX6eyKQ69wKkjCoIwoaEEBoXMTXaHe58X406uI2UlRVhxULHWs5m9jiN6h0gP9vKSOXNuBGptncVfPJ7thTw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.69.19.60) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=topic.nl; dmarc=pass (p=none sp=none pct=100) action=none header.from=topic.nl; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=topic.nl; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5Qkr7nM727EHH45DBlYjU1b/MAYY/KynsP/yC64XoSI=; b=PVW7RaRptLJgD5x/gBS6C5z0X1ilEp9WYcv+3+yZ3KWYhzooP9Rxe0Wa6QGtBb+vgWmXxsoJ7FCMO1xD0HRS1uGy44sJN93zEdJiBBZKkWdjucwbTVmgvyP+SCh60WoqbfaaHdAzN124GTKHTpLVronnNBtG3zOreSWc/geM8y3eMdfMD2HYs6Vd8TgxW/+wchdhH0D6hA9dWAXWs9zPooPA8Wy/wME1kwEBOPMVFpB/qSA7imNGIEzmSIr6MwCqFryX0HL2oVkaixvQbMS5mSCjlU5OtJdzyaMYOKmSqIKwz1iiKqXdSJp6T/siiEpWUWohrlekPosO0hvB1Q/c8g== Received: from AS4P251CA0003.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:5d2::9) by PA4PR04MB7968.eurprd04.prod.outlook.com (2603:10a6:102:c0::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:25 +0000 Received: from AM4PEPF00027A62.eurprd04.prod.outlook.com (2603:10a6:20b:5d2:cafe::92) by AS4P251CA0003.outlook.office365.com (2603:10a6:20b:5d2::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.33 via Frontend Transport; Mon, 15 Apr 2024 08:13:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.69.19.60) smtp.mailfrom=topic.nl; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=topic.nl; Received-SPF: Pass (protection.outlook.com: domain of topic.nl designates 40.69.19.60 as permitted sender) receiver=protection.outlook.com; client-ip=40.69.19.60; helo=westeu100-emailsignatures-cloud.codetwo.com; pr=C Received: from westeu100-emailsignatures-cloud.codetwo.com (40.69.19.60) by AM4PEPF00027A62.mail.protection.outlook.com (10.167.16.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Mon, 15 Apr 2024 08:13:24 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.105) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 15 Apr 2024 08:13:23 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=topic.nl; Received: from AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) by PAXPR04MB8288.eurprd04.prod.outlook.com (2603:10a6:102:1bc::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:13 +0000 Received: from AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a]) by AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a%4]) with mapi id 15.20.7452.049; Mon, 15 Apr 2024 08:13:13 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Krzysztof Kozlowski , Conor Dooley , Krzysztof Kozlowski , Rob Herring , Sebastian Reichel , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 4/5] dt-bindings: power: supply: ltc3350-charger: Add bindings Date: Mon, 15 Apr 2024 10:13:04 +0200 Message-ID: <20240415081305.316107-4-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415081305.316107-1-mike.looijmans@topic.nl> References: <20240415081305.316107-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.9959538d-6257-47d8-9ef7-78f72d89b9a7@emailsignatures365.codetwo.com> X-ClientProxiedBy: AS4P195CA0029.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::19) To AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR04MB8644:EE_|PAXPR04MB8288:EE_|AM4PEPF00027A62:EE_|PA4PR04MB7968:EE_ X-MS-Office365-Filtering-Correlation-Id: b9b71392-f1e1-4f2f-498d-08dc5d23ec3f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 9wXLUpS72pTYY3Dyot8GMKGc81wXqrJmV2D+rK/5nf5719YWchM9a/WQKg2BI9hGAnbfrQpA9L0pMzJlQGgHgeDlq9hPhl+JZgrZB7AwCYJEKW3RrMFUVxFDR6ruGbS1DNFKA8WrX+bPCGkQIV8Z8cjnFb1oFyC4VESZ0S7teolz5u5FHp5f9912R6NFloMWeyTVgf2zUkyTTSoa5ZTx48CUN68eqj3JcUuBtDjDeXknGYApyxobBap1iPImAQcgKN2pqfmw8ATEKWZJGf29uo9m0nMYcHUaqrRiXHI6uPv2nlmHlr21kHUfLi0Ragb1uQO1dkWuG7ehea9RH44aTAUresGVqZDdGcAir3WG52kIem4sVe/563w/3HC/yXIZCpqS8ZLEbGZmD4gBhpfjNcgS1/o66d4+r3ctYauzOmdBwZyzdAUJOOStc5DDbhAlrgyVRUZjUm9SIrRluhXD+NgRqjVOZFoA6OqM8SmvJTJf/85iAFIifHpZiVOINnAUKLDJQu6ojEQ1RiT3gLr1lvy47cdPDqGCOOgtBjPT/ktZDC+4s26jMK4gmY6r+D18qhLOB7jJJKDIKzOpfL7cO6/UQtZXpukfLTkMu+bAzVMdTpICnPGhO+LgvoIc108Yli4kFvP0SXWSHQamUUwu2Y0gSzfD1slQcegBosgMD3Y= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB8644.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(1800799015)(52116005)(376005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8288 X-CodeTwo-MessageID: dfa4f5f4-9248-4977-970f-28c6487af4be.20240415081323@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM4PEPF00027A62.eurprd04.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 0f4714ae-9dcc-4a6e-8bab-08dc5d23e513 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: zdE3xn9FtIUA1nOsYGaLZNw4iCWEnYXji6Z5prp4femZJh4Imy6pAibN9Vcwd9gF04COBANDgriueKMUBinKDaLoJa5DTWxu9T/0Fk7usi/KjTvRx7JFMmWQT4D1QeQLSPqfAc6GO6hmjYjy13Y6ffxF++xBQn/jDvOXPZ+sTPDsJ752bbSW7nl0MFoMGqdP3h4IdxoUE+eTRSrDgqAohjA2DPwP0fSrYGoQUo6dvkKh4jWgMgsXubyFFm2nw5rbvKnRpuU4exXMtIc6ZEH907VPCoFownZuoeFiOvZ3KmAH2uHicS+wI3EVzlguMzFqg953L1KcSabt60kLDpyuG0pIkuBoEpmZAkZaxivUNPnVt8gDwKv7ej5pFQFpt3aTuDM03wYq2atYr1RIXUx5pgrw4ZTdmTDRanrtnR9Xfiv6QZuDcSCsorPgN6QnpZo/3QCEgxiu1hpvgCDRmv/aWnTGFF5qEM6GQ5a1uLPob7g5Cfq05Qtqf8vhBtv+S+Wd4hiARIjE9lLlpmCOqkk040Aw1YG24wxFP5kYniTr4lOeegseWL/D4g+nQJghcoLTl+bAQ61teRJGIIte9VKsyQ5+IQUnNQK1acHtHJNLGhtPi/u+ZmLTtJnhrCXAcuDx+qM/1mA7/Xmz5ZDghNJVz9Gk6xtkGJcgZ/t5VvgP+X/53N+9tASjb5dEdu/uUd/yMh74bR+voL5+cBJyj2u4Gg== X-Forefront-Antispam-Report: CIP:40.69.19.60;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:westeu100-emailsignatures-cloud.codetwo.com;PTR:westeu100-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(36860700004)(376005)(1800799015)(82310400014);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Apr 2024 08:13:24.6858 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b9b71392-f1e1-4f2f-498d-08dc5d23ec3f X-MS-Exchange-CrossTenant-Id: 449607a5-3517-482d-8d16-41dd868cbda3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=449607a5-3517-482d-8d16-41dd868cbda3;Ip=[40.69.19.60];Helo=[westeu100-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: AM4PEPF00027A62.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR04MB7968 The LTC3350 is a backup power controller that can charge and monitor a series stack of one to four supercapacitors. Signed-off-by: Mike Looijmans Reviewed-by: Krzysztof Kozlowski --- (no changes since v3) Changes in v3: Fix $id after rename to lltc,ltc3350.yaml Changes in v2: Rename to lltc,ltc3350.yaml Fix spaces and indentation .../bindings/power/supply/lltc,ltc3350.yaml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Documentation/devicetree/bindings/power/supply/lltc,ltc3350.yaml diff --git a/Documentation/devicetree/bindings/power/supply/lltc,ltc3350.yaml b/Documentation/devicetree/bindings/power/supply/lltc,ltc3350.yaml new file mode 100644 index 000000000000..dca7fe0f0d8f --- /dev/null +++ b/Documentation/devicetree/bindings/power/supply/lltc,ltc3350.yaml @@ -0,0 +1,54 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +# Copyright (C) 2024 Topic Embedded Products +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/power/supply/lltc,ltc3350.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Linear Technology (Analog Devices) LTC3350 Supercap Charger + +maintainers: + - Mike Looijmans + +description: | + The LTC3350 is a High Current Supercapacitor Backup Controller and System + Monitor. + Specifications about the charger can be found at: + https://www.analog.com/en/products/ltc3350.html + +properties: + compatible: + enum: + - lltc,ltc3350 + + reg: + maxItems: 1 + + lltc,rsnsc-micro-ohms: + description: Capacitor charger sense resistor in microohm. + minimum: 1000 + + lltc,rsnsi-micro-ohms: + description: Input current sense resistor in microohm. + minimum: 1000 + +required: + - compatible + - reg + - lltc,rsnsc-micro-ohms + - lltc,rsnsi-micro-ohms + +additionalProperties: false + +examples: + - | + i2c { + #address-cells = <1>; + #size-cells = <0>; + charger: battery-charger@9 { + compatible = "lltc,ltc3350"; + reg = <0x9>; + lltc,rsnsc-micro-ohms = <10000>; + lltc,rsnsi-micro-ohms = <10000>; + }; + }; From patchwork Mon Apr 15 08:13:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13629615 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2117.outbound.protection.outlook.com [40.107.22.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2F0BD3BBDC; Mon, 15 Apr 2024 08:13:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.22.117 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168811; cv=fail; b=WQQGDd5b5Vz8KPacYO36n+3x/Nje3LL1gU5G5Lo8wh+uVvAaUXzdav15VYsF57wNrOfGQikO5IbJJlYz435mzLSPGMNRgChBfF92leS2mv2Xt4yWKpFKvRie+2xx+aa2Kq7ql5C0qK1rdG1pWxTW5Vlaj2avsYylbCfyLIi7K/4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713168811; c=relaxed/simple; bh=d2yl41KEXxg8kahHMOor9fOH9kQ09CdKq+C/fvMe0t0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ffjB673jgxcn+DX2nHqv0VboMIo1nuTHnoYE/h3m+uJEEPoRI//3sB/oy4fl9WfJ5V/a9Iv6MoQg1n5IfhFNHsnnYxwUcf+GBimjNfOXewZZxYdXuZlp08AZ0VE4Y5toI9aSSnNRZ3zX4ul/AZj7VpaeKeM7QwnMZ95LdVwADmM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl; spf=pass smtp.mailfrom=topic.nl; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b=NlxsgKde; arc=fail smtp.client-ip=40.107.22.117 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=topic.nl Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=topic.nl Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=topic.nl header.i=@topic.nl header.b="NlxsgKde" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QBSUxmXcB/Bn98geW97N70SeqbXtJqrySPA5ncOV4dDjxhawGZLG6470oSjssxrCjg+6VFlRK/mOgREiqAjyALf4tQBMYbeSal+pRKyeTHsrFK+ytpznRckIg0hVRN3oTMBq4wVQgJUHZqtynruY49o82AS98eF7UOdW4C0Dj+MSGAzFt/60HmNk0s3QsS6I9scX3nMok16i97dohjpunfSSAg7GsqxdBlcic1Lio8Ibm0Kiwhw8giOiBQQuBWVimBSKd+aKoQ6NM9S7hFFsRpI3mgsYv2eAZzx9kc+QNw49KZ9wiG+qm4End0QRF3UJz41HzcfieZBFzesVQD6TFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hQP7/z2sq2I11vIJH9OMinTMt1phtF+PGKjb3wp3gy0=; b=PDAkLwkAhDyz7azlz7QYp/iLkg3lF5d9QZH+NGMEX5bDq7G3Bum8gSUelw5owKPl1EAUWxryo1Gy17JtujY+XUOUFMjiWIHZv2P4CGjVWP3O7q9CPa6GlB0HxUApVD486Z3m8xTznFfXqh5bpVdDacpSU9ZDtVVH7fuRwFMpshqHDN46by8QLcxYKO/36zDReA3FrGgLw4hDA5BSvbQoOMSiM/OZZsTIHJyW3DdXjzbPFfawrEYcoCxZb7rkUCfLQNo38ubgmmozXdTdzT7VrTUuyBLwQlOxCKILTfsdd9yX1hK4UlK8NxcUbV3lb+vXT3+XZ9GhlvoO7Haekk41bA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.69.19.60) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=topic.nl; dmarc=pass (p=none sp=none pct=100) action=none header.from=topic.nl; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=topic.nl; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hQP7/z2sq2I11vIJH9OMinTMt1phtF+PGKjb3wp3gy0=; b=NlxsgKdexaoaKbwoknqiR9p8eFV2Zdm/1CBGC630pRoq87DqE3KUBJLywRIO72VuxKHEN0r1w1WPnlrE2tLA4G4ufIrt5MkQaTh8aQ4PePLkZHYjvM9NvD1znXsA2pFio7n7GWWxnNfAuNbXtmUE5p85YPxxvEgouPfRE+yudUOXdy80LZkWkI4jOB8yXLdIcyH2joRhiIMFxZRuFr4o9m7pUwS+qB2hu7BoK2BsuyR0cjgznsYiBNkBqjluIcfiM0lGV6orwKJtXtG+1PN4jFXaY/lUsVfCCkd6zoE6XG8C2D70t9iiyPsqLANX4wqovF9wbvGEqjDKS3/gFZWguA== Received: from AS9PR06CA0508.eurprd06.prod.outlook.com (2603:10a6:20b:49b::32) by VI0PR04MB10229.eurprd04.prod.outlook.com (2603:10a6:800:23e::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Mon, 15 Apr 2024 08:13:23 +0000 Received: from AMS0EPF000001AE.eurprd05.prod.outlook.com (2603:10a6:20b:49b:cafe::a4) by AS9PR06CA0508.outlook.office365.com (2603:10a6:20b:49b::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.33 via Frontend Transport; Mon, 15 Apr 2024 08:13:22 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.69.19.60) smtp.mailfrom=topic.nl; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=topic.nl; Received-SPF: Pass (protection.outlook.com: domain of topic.nl designates 40.69.19.60 as permitted sender) receiver=protection.outlook.com; client-ip=40.69.19.60; helo=westeu100-emailsignatures-cloud.codetwo.com; pr=C Received: from westeu100-emailsignatures-cloud.codetwo.com (40.69.19.60) by AMS0EPF000001AE.mail.protection.outlook.com (10.167.16.154) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Mon, 15 Apr 2024 08:13:21 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.105) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Mon, 15 Apr 2024 08:13:19 +0000 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=topic.nl; Received: from AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) by PAXPR04MB8288.eurprd04.prod.outlook.com (2603:10a6:102:1bc::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Mon, 15 Apr 2024 08:13:13 +0000 Received: from AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a]) by AS8PR04MB8644.eurprd04.prod.outlook.com ([fe80::e86d:f110:534e:480a%4]) with mapi id 15.20.7452.049; Mon, 15 Apr 2024 08:13:13 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Sebastian Reichel , linux-kernel@vger.kernel.org Subject: [PATCH v4 5/5] power: supply: ltc3350-charger: Add driver Date: Mon, 15 Apr 2024 10:13:05 +0200 Message-ID: <20240415081305.316107-5-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415081305.316107-1-mike.looijmans@topic.nl> References: <20240415081305.316107-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.f3ad88bc-748d-4d1b-abcf-bcf420d05ddf@emailsignatures365.codetwo.com> X-ClientProxiedBy: AS4P195CA0029.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:5d6::19) To AS8PR04MB8644.eurprd04.prod.outlook.com (2603:10a6:20b:42b::12) Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: AS8PR04MB8644:EE_|PAXPR04MB8288:EE_|AMS0EPF000001AE:EE_|VI0PR04MB10229:EE_ X-MS-Office365-Filtering-Correlation-Id: d883ad8d-83d1-4743-ce6a-08dc5d23ea5f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: cfy1Hb2l7VXbF7otbwtWPYlSllY2Hw0qEYGwMd3hlRNhK0r2MeRifn6xj7g0bhrmtQtTfUIYXdv9C2KQnvyYPgfTfjRUtFghTL5GasWZrktX3HBA1TD+QzoJRMzSF/tnKDHHmfU9NUj222uyF/ORkskdS11BvfV7VucktpW8xchDymHnVeN62tt4I0Ndo03TsllhBmvoQxUNy3zcMoT5IxbARHGcbaEKOfYuQk9W/Zs2qQLDrs9uUO7R8B5X7QSwqrxf8tMQ633k9yeNHEVkRDYkHxj6ByM2HVoy/htdegaTL5UcwQe0628pM6/hPhmFEB6fUv4R09yxsxWMXzkW2N3eBZq8sop86Ke94aWgiVmss4qs9LH6tRpI+hA4FN/bw3dK3Ybfneut9JmQFwyI44osK2YH2xaSgVzqXS2sOqpK7GVt6nxdONkrNqH8U7iLqPvt+kidH/eCrbqh0BKHw2K2XUCZv2MXDpTnCUDu28/HibmyklRFZjFWN49insdVnXzpQGZSlYjYdUhq9IkMXYQYYEqmvSz9Sn7/XkshLXJq9rGqxZT9/lP+3enkpopHMQIZVRPYBoKt+hWF6RR7YntkvJsSLRwXs2oUWkTyKhTIrqIOIaefZASktA6GtKO5Ji5BpMr7bZHDpp/8r4Jh/Zoje7hfusvPAf16SGqwu6OmUg8Ym5X3uBHNpNj2A2l94zwBuMKAwcjxSPtF7jqWkCYNWrM+3hNLN0RdaP963oo= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS8PR04MB8644.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(1800799015)(52116005)(376005)(366007)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8288 X-CodeTwo-MessageID: 3f1c8b01-bd31-45bb-9279-67df71677a9e.20240415081319@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF000001AE.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 4ecab4ad-5871-4700-d900-08dc5d23e57d X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: G+qgbEuEacakkKkRzAYnnnjmuvORErHZYBp9KIpjTwyUhRoSogTv7nFNBhV3EeAur8G41A+q52LpEBwCWkJc3Gj77vgogaOo4x5k5CeiJj6eScWl9NugEepQqewt2agUe8YAesaue8PFz0PLc/xREIWTbUs2DahhzgeNfHbZHlMjOwiKJdFjb1gE890UBBHtwS2HbzWW05V3G9TUSL6IkveUTYGA0wR4Gq2TjNAMRTWQcRtCaiHKhAVe8koEXmoMnDVDk6udXA4FPXwRn0uKmdRIVDEfpCvB1/Ia68g0q4nZY6JRB5pIGhUfii82tOdNpBqYOzb/D7CFANrIbKcSI+X5oTFW0BLhcMu7YRBY1igjk9uH0I05uJSvvgBGVUmFR66mg2VVCFSbJ7L7IvBgrltaBJjBQWPbUPQN9sl/gu4OuIFV13nER85r5s1rSqkwHINPOLiGubajOyJa+8JncJ+4icLttqdMPel8GnfCGX0bXUq2xr9FyT6faBFQtG0dbP+BG+QkCY5nIOUcmvHemQQ546Erz8jXRcEdqOJK9jf/Dg9UeLo4R1OGWfDoLltec53R/p4964ycoguim6MAWjYgpBiv2lsQpFNDf2QWR1Rqx/qnN0aSA4jN6Bdve8V4PimIJAuIZl2/PTw235JIea6QqRP8r3yPr/0CMoCSHhmOluXSl6FIyMoNT7ybR0YbkFptHtVHMtB12MhL+LcdjQ== X-Forefront-Antispam-Report: CIP:40.69.19.60;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:westeu100-emailsignatures-cloud.codetwo.com;PTR:westeu100-emailsignatures-cloud.codetwo.com;CAT:NONE;SFS:(13230031)(1800799015)(36860700004)(376005)(82310400014);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Apr 2024 08:13:21.6528 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d883ad8d-83d1-4743-ce6a-08dc5d23ea5f X-MS-Exchange-CrossTenant-Id: 449607a5-3517-482d-8d16-41dd868cbda3 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=449607a5-3517-482d-8d16-41dd868cbda3;Ip=[40.69.19.60];Helo=[westeu100-emailsignatures-cloud.codetwo.com] X-MS-Exchange-CrossTenant-AuthSource: AMS0EPF000001AE.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR04MB10229 The LTC3350 is a backup power controller that can charge and monitor a series stack of one to four supercapacitors. Signed-off-by: Mike Looijmans --- Changes in v4: Split into "charger" and "capacitor" parts Use (new) standard properties Header include fixups Explain local "scale" units Drop i2c_check_functionality Use dev_err_probe Use dev_fwnode Drop of_match_ptr Changes in v2: Duplicate "vin_ov" and "vin_uv" attributes # bash /tmp/tools/testing/selftests/power_supply/test_power_supply_properties.sh TAP version 13 1..66 # Testing device ltc3350 ok 1 ltc3350.exists ok 2 ltc3350.uevent.NAME ok 3 ltc3350.sysfs.type ok 4 ltc3350.uevent.TYPE ok 5 ltc3350.sysfs.usb_type # SKIP # Reported: '1' () ok 6 ltc3350.sysfs.online ok 7 ltc3350.sysfs.present # SKIP # Reported: 'Full' ok 8 ltc3350.sysfs.status ok 9 ltc3350.sysfs.capacity # SKIP ok 10 ltc3350.sysfs.capacity_level # SKIP ok 11 ltc3350.sysfs.model_name # SKIP ok 12 ltc3350.sysfs.manufacturer # SKIP ok 13 ltc3350.sysfs.serial_number # SKIP ok 14 ltc3350.sysfs.technology # SKIP ok 15 ltc3350.sysfs.cycle_count # SKIP ok 16 ltc3350.sysfs.scope # SKIP # Reported: '3200000' uA (3200 mA) ok 17 ltc3350.sysfs.input_current_limit ok 18 ltc3350.sysfs.input_voltage_limit # SKIP # Reported: '23742030' uV (23.742 V) ok 19 ltc3350.sysfs.voltage_now ok 20 ltc3350.sysfs.voltage_min # SKIP ok 21 ltc3350.sysfs.voltage_max # SKIP ok 22 ltc3350.sysfs.voltage_min_design # SKIP ok 23 ltc3350.sysfs.voltage_max_design # SKIP # Reported: '467900' uA (467.9 mA) ok 24 ltc3350.sysfs.current_now ok 25 ltc3350.sysfs.current_max # SKIP ok 26 ltc3350.sysfs.charge_now # SKIP ok 27 ltc3350.sysfs.charge_full # SKIP ok 28 ltc3350.sysfs.charge_full_design # SKIP ok 29 ltc3350.sysfs.power_now # SKIP ok 30 ltc3350.sysfs.energy_now # SKIP ok 31 ltc3350.sysfs.energy_full # SKIP ok 32 ltc3350.sysfs.energy_full_design # SKIP ok 33 ltc3350.sysfs.energy_full_design # SKIP # Testing device ltc3350_capacitor ok 34 ltc3350_capacitor.exists ok 35 ltc3350_capacitor.uevent.NAME ok 36 ltc3350_capacitor.sysfs.type ok 37 ltc3350_capacitor.uevent.TYPE ok 38 ltc3350_capacitor.sysfs.usb_type # SKIP ok 39 ltc3350_capacitor.sysfs.online # SKIP ok 40 ltc3350_capacitor.sysfs.present # SKIP # Reported: 'Full' ok 41 ltc3350_capacitor.sysfs.status ok 42 ltc3350_capacitor.sysfs.capacity # SKIP ok 43 ltc3350_capacitor.sysfs.capacity_level # SKIP ok 44 ltc3350_capacitor.sysfs.model_name # SKIP ok 45 ltc3350_capacitor.sysfs.manufacturer # SKIP ok 46 ltc3350_capacitor.sysfs.serial_number # SKIP ok 47 ltc3350_capacitor.sysfs.technology # SKIP ok 48 ltc3350_capacitor.sysfs.cycle_count # SKIP ok 49 ltc3350_capacitor.sysfs.scope # SKIP ok 50 ltc3350_capacitor.sysfs.input_current_limit # SKIP ok 51 ltc3350_capacitor.sysfs.input_voltage_limit # SKIP # Reported: '5053824' uV (5.05382 V) ok 52 ltc3350_capacitor.sysfs.voltage_now # Reported: '4299588' uV (4.29959 V) ok 53 ltc3350_capacitor.sysfs.voltage_min # Reported: '4680396' uV (4.6804 V) ok 54 ltc3350_capacitor.sysfs.voltage_max ok 55 ltc3350_capacitor.sysfs.voltage_min_design # SKIP ok 56 ltc3350_capacitor.sysfs.voltage_max_design # SKIP ok 57 ltc3350_capacitor.sysfs.current_now # SKIP ok 58 ltc3350_capacitor.sysfs.current_max # SKIP ok 59 ltc3350_capacitor.sysfs.charge_now # SKIP ok 60 ltc3350_capacitor.sysfs.charge_full # SKIP ok 61 ltc3350_capacitor.sysfs.charge_full_design # SKIP ok 62 ltc3350_capacitor.sysfs.power_now # SKIP ok 63 ltc3350_capacitor.sysfs.energy_now # SKIP ok 64 ltc3350_capacitor.sysfs.energy_full # SKIP ok 65 ltc3350_capacitor.sysfs.energy_full_design # SKIP ok 66 ltc3350_capacitor.sysfs.energy_full_design # SKIP # Totals: pass:17 fail:0 xfail:0 xpass:0 skip:49 error:0 .../ABI/testing/sysfs-class-power-ltc3350 | 88 ++ drivers/power/supply/Kconfig | 10 + drivers/power/supply/Makefile | 1 + drivers/power/supply/ltc3350-charger.c | 786 ++++++++++++++++++ 4 files changed, 885 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-class-power-ltc3350 create mode 100644 drivers/power/supply/ltc3350-charger.c diff --git a/Documentation/ABI/testing/sysfs-class-power-ltc3350 b/Documentation/ABI/testing/sysfs-class-power-ltc3350 new file mode 100644 index 000000000000..d4a2bb0fb62b --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-power-ltc3350 @@ -0,0 +1,88 @@ +What: /sys/class/power_supply/ltc3350/charge_status +Date: April 2024 +KernelVersion: 6.9 +Description: + Detailed charge status information as reported by the chip. This + returns the raw register value in hex. + + Access: Read + +What: /sys/class/power_supply/ltc3350/vshunt +Date: April 2024 +KernelVersion: 6.9 +Description: + Voltage for "shunting" the capacitors in the stack. When the + capacitor voltage is above this value, the chip will discharge + the excess voltage using a shunt resistor. + This is typically used to limit the voltage on a single cell, + to compensate for imbalance and prevent damaging the capacitor + while charging. It can also be used to forcibly discharge the + capacitors. + + Access: Read, Write + + Valid values: In microvolts, defaults to 2.7V + +What: /sys/class/power_supply/ltc3350/gpi +Date: April 2024 +KernelVersion: 6.9 +Description: + General purpose input voltage. Returns a single measurement. + + Access: Read + + Valid values: In microvolts + +What: /sys/class/power_supply/ltc3350/gpi_ov +Date: April 2024 +KernelVersion: 6.9 +Description: + General purpose input voltage overvoltage level. Triggers an + alert for userspace when the voltage goes above this value. + + Access: Read, Write + + Valid values: In microvolts + +What: /sys/class/power_supply/ltc3350/gpi_uv +Date: April 2024 +KernelVersion: 6.9 +Description: + General purpose input voltage undervoltage level. Triggers an + alert for userspace when the voltage drops below this value. + + Access: Read, Write + + Valid values: In microvolts + +What: /sys/class/power_supply/ltc3350/vin +Date: April 2024 +KernelVersion: 6.9 +Description: + Charger input voltage. Returns a single measurement. + + Access: Read + + Valid values: In microvolts + +What: /sys/class/power_supply/ltc3350/vin_ov +Date: April 2024 +KernelVersion: 6.9 +Description: + Input voltage overvoltage level. Triggers an alert for userspace + when the voltage goes above this value. + + Access: Read, Write + + Valid values: In microvolts + +What: /sys/class/power_supply/ltc3350/vin_uv +Date: April 2024 +KernelVersion: 6.9 +Description: + Input voltage undervoltage level. Triggers an alert for + userspace when the voltage drops below this value. + + Access: Read, Write + + Valid values: In microvolts diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig index 3e31375491d5..7cb1a66e522d 100644 --- a/drivers/power/supply/Kconfig +++ b/drivers/power/supply/Kconfig @@ -514,6 +514,16 @@ config CHARGER_LT3651 Say Y to include support for the Analog Devices (Linear Technology) LT3651 battery charger which reports its status via GPIO lines. +config CHARGER_LTC3350 + tristate "LTC3350 Supercapacitor Backup Controller and System Monitor" + depends on I2C + select REGMAP_I2C + select I2C_SMBUS + help + Say Y to include support for the Analog Devices (Linear Technology) + LTC3350 Supercapacitor Backup Controller and System Monitor connected + to I2C. + config CHARGER_LTC4162L tristate "LTC4162-L charger" depends on I2C diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile index 58b567278034..a8d618e4ac91 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -72,6 +72,7 @@ obj-$(CONFIG_CHARGER_LP8788) += lp8788-charger.o obj-$(CONFIG_CHARGER_GPIO) += gpio-charger.o obj-$(CONFIG_CHARGER_MANAGER) += charger-manager.o obj-$(CONFIG_CHARGER_LT3651) += lt3651-charger.o +obj-$(CONFIG_CHARGER_LTC3350) += ltc3350-charger.o obj-$(CONFIG_CHARGER_LTC4162L) += ltc4162-l-charger.o obj-$(CONFIG_CHARGER_MAX14577) += max14577_charger.o obj-$(CONFIG_CHARGER_DETECTOR_MAX14656) += max14656_charger_detector.o diff --git a/drivers/power/supply/ltc3350-charger.c b/drivers/power/supply/ltc3350-charger.c new file mode 100644 index 000000000000..6e0e238766ca --- /dev/null +++ b/drivers/power/supply/ltc3350-charger.c @@ -0,0 +1,786 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Driver for Analog Devices (Linear Technology) LTC3350 + * High Current Supercapacitor Backup Controller and System Monitor + * Copyright (C) 2024, Topic Embedded Products + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Registers (names based on what datasheet uses) */ +#define LTC3350_REG_CLR_ALARMS 0x00 +#define LTC3350_REG_MSK_ALARMS 0x01 +#define LTC3350_REG_MSK_MON_STATUS 0x02 +#define LTC3350_REG_CAP_ESR_PER 0x04 +#define LTC3350_REG_VCAPFB_DAC 0x05 +#define LTC3350_REG_VSHUNT 0x06 +#define LTC3350_REG_CAP_UV_LVL 0x07 +#define LTC3350_REG_CAP_OV_LVL 0x08 +#define LTC3350_REG_GPI_UV_LVL 0x09 +#define LTC3350_REG_GPI_OV_LVL 0x0A +#define LTC3350_REG_VIN_UV_LVL 0x0B +#define LTC3350_REG_VIN_OV_LVL 0x0C +#define LTC3350_REG_VCAP_UV_LVL 0x0D +#define LTC3350_REG_VCAP_OV_LVL 0x0E +#define LTC3350_REG_VOUT_UV_LVL 0x0F +#define LTC3350_REG_VOUT_OV_LVL 0x10 +#define LTC3350_REG_IIN_OC_LVL 0x11 +#define LTC3350_REG_ICHG_UC_LVL 0x12 +#define LTC3350_REG_DTEMP_COLD_LVL 0x13 +#define LTC3350_REG_DTEMP_HOT_LVL 0x14 +#define LTC3350_REG_ESR_HI_LVL 0x15 +#define LTC3350_REG_CAP_LO_LVL 0x16 +#define LTC3350_REG_CTL_REG 0x17 +#define LTC3350_REG_NUM_CAPS 0x1A +#define LTC3350_REG_CHRG_STATUS 0x1B +#define LTC3350_REG_MON_STATUS 0x1C +#define LTC3350_REG_ALARM_REG 0x1D +#define LTC3350_REG_MEAS_CAP 0x1E +#define LTC3350_REG_MEAS_ESR 0x1F +#define LTC3350_REG_MEAS_VCAP1 0x20 +#define LTC3350_REG_MEAS_VCAP2 0x21 +#define LTC3350_REG_MEAS_VCAP3 0x22 +#define LTC3350_REG_MEAS_VCAP4 0x23 +#define LTC3350_REG_MEAS_GPI 0x24 +#define LTC3350_REG_MEAS_VIN 0x25 +#define LTC3350_REG_MEAS_VCAP 0x26 +#define LTC3350_REG_MEAS_VOUT 0x27 +#define LTC3350_REG_MEAS_IIN 0x28 +#define LTC3350_REG_MEAS_ICHG 0x29 +#define LTC3350_REG_MEAS_DTEMP 0x2A + +/* LTC3350_REG_CLR_ALARMS, LTC3350_REG_MASK_ALARMS, LTC3350_REG_ALARM_REG */ +#define LTC3350_MSK_CAP_UV BIT(0) /* capacitor undervoltage alarm */ +#define LTC3350_MSK_CAP_OV BIT(1) /* capacitor overvoltage alarm */ +#define LTC3350_MSK_GPI_UV BIT(2) /* GPI undervoltage alarm */ +#define LTC3350_MSK_GPI_OV BIT(3) /* GPI overvoltage alarm */ +#define LTC3350_MSK_VIN_UV BIT(4) /* VIN undervoltage alarm */ +#define LTC3350_MSK_VIN_OV BIT(5) /* VIN overvoltage alarm */ +#define LTC3350_MSK_VCAP_UV BIT(6) /* VCAP undervoltage alarm */ +#define LTC3350_MSK_VCAP_OV BIT(7) /* VCAP overvoltage alarm */ +#define LTC3350_MSK_VOUT_UV BIT(8) /* VOUT undervoltage alarm */ +#define LTC3350_MSK_VOUT_OV BIT(9) /* VOUT overvoltage alarm */ +#define LTC3350_MSK_IIN_OC BIT(10) /* input overcurrent alarm */ +#define LTC3350_MSK_ICHG_UC BIT(11) /* charge undercurrent alarm */ +#define LTC3350_MSK_DTEMP_COLD BIT(12) /* die temperature cold alarm */ +#define LTC3350_MSK_DTEMP_HOT BIT(13) /* die temperature hot alarm */ +#define LTC3350_MSK_ESR_HI BIT(14) /* ESR high alarm */ +#define LTC3350_MSK_CAP_LO BIT(15) /* capacitance low alarm */ + +/* LTC3350_REG_MSK_MON_STATUS masks */ +#define LTC3350_MSK_MON_CAPESR_ACTIVE BIT(0) +#define LTC3350_MSK_MON_CAPESR_SCHEDULED BIT(1) +#define LTC3350_MSK_MON_CAPESR_PENDING BIT(2) +#define LTC3350_MSK_MON_CAP_DONE BIT(3) +#define LTC3350_MSK_MON_ESR_DONE BIT(4) +#define LTC3350_MSK_MON_CAP_FAILED BIT(5) +#define LTC3350_MSK_MON_ESR_FAILED BIT(6) +#define LTC3350_MSK_MON_POWER_FAILED BIT(8) +#define LTC3350_MSK_MON_POWER_RETURNED BIT(9) + +/* LTC3350_REG_CTL_REG */ +/* Begin a capacitance and ESR measurement when possible */ +#define LTC3350_CTL_STRT_CAPESR BIT(0) +/* A one in this bit location enables the input buffer on the GPI pin */ +#define LTC3350_CTL_GPI_BUFFER_EN BIT(1) +/* Stops an active capacitance/ESR measurement */ +#define LTC3350_CTL_STOP_CAPESR BIT(2) +/* Increases capacitor measurement resolution by 100x for smaller capacitors */ +#define LTC3350_CTL_CAP_SCALE BIT(3) + +/* LTC3350_REG_CHRG_STATUS */ +#define LTC3350_CHRG_STEPDOWN BIT(0) /* Synchronous controller in step-down mode (charging) */ +#define LTC3350_CHRG_STEPUP BIT(1) /* Synchronous controller in step-up mode (backup) */ +#define LTC3350_CHRG_CV BIT(2) /* The charger is in constant voltage mode */ +#define LTC3350_CHRG_UVLO BIT(3) /* The charger is in undervoltage lockout */ +#define LTC3350_CHRG_INPUT_ILIM BIT(4) /* The charger is in input current limit */ +#define LTC3350_CHRG_CAPPG BIT(5) /* The capacitor voltage is above power good threshold */ +#define LTC3350_CHRG_SHNT BIT(6) /* The capacitor manager is shunting */ +#define LTC3350_CHRG_BAL BIT(7) /* The capacitor manager is balancing */ +#define LTC3350_CHRG_DIS BIT(8) /* Charger disabled for capacitance measurement */ +#define LTC3350_CHRG_CI BIT(9) /* The charger is in constant current mode */ +#define LTC3350_CHRG_PFO BIT(11) /* Input voltage is below PFI threshold */ + +/* LTC3350_REG_MON_STATUS */ +#define LTC3350_MON_CAPESR_ACTIVE BIT(0) /* Capacitance/ESR measurement in progress */ +#define LTC3350_MON_CAPESR_SCHEDULED BIT(1) /* Waiting programmed time */ +#define LTC3350_MON_CAPESR_PENDING BIT(2) /* Waiting for satisfactory conditions */ +#define LTC3350_MON_CAP_DONE BIT(3) /* Capacitance measurement has completed */ +#define LTC3350_MON_ESR_DONE BIT(4) /* ESR Measurement has completed */ +#define LTC3350_MON_CAP_FAILED BIT(5) /* Last capacitance measurement failed */ +#define LTC3350_MON_ESR_FAILED BIT(6) /* Last ESR measurement failed */ +#define LTC3350_MON_POWER_FAILED BIT(8) /* Unable to charge */ +#define LTC3350_MON_POWER_RETURNED BIT(9) /* Able to charge */ + + +struct ltc3350_info { + struct i2c_client *client; + struct regmap *regmap; + struct power_supply *charger; + struct power_supply *capacitor; + u32 rsnsc; /* Series resistor that sets charge current, microOhm */ + u32 rsnsi; /* Series resistor to measure input current, microOhm */ +}; + +/* + * About LTC3350 "alarm" functions: Setting a bit in the LTC3350_REG_MSK_ALARMS + * register enables the alarm. The alarm will trigger an SMBALERT only once. + * To reset the alarm, write a "1" bit to LTC3350_REG_CLR_ALARMS. Then the alarm + * will trigger another SMBALERT when conditions are met (may be immediately). + * After writing to one of the corresponding level registers, enable the alarm, + * so that a UEVENT triggers when the alarm goes off. + */ +static void ltc3350_enable_alarm(struct ltc3350_info *info, unsigned int reg) +{ + unsigned int mask; + + /* Register locations correspond to alarm mask bits */ + mask = BIT(reg - LTC3350_REG_CAP_UV_LVL); + /* Clear the alarm bit so it may trigger again */ + regmap_write(info->regmap, LTC3350_REG_CLR_ALARMS, mask); + /* Enable the alarm */ + regmap_update_bits(info->regmap, LTC3350_REG_MSK_ALARMS, mask, mask); +} + +/* Convert enum value to POWER_SUPPLY_STATUS value */ +static int ltc3350_state_decode(unsigned int value) +{ + if (value & LTC3350_CHRG_STEPUP) + return POWER_SUPPLY_STATUS_DISCHARGING; /* running on backup */ + + if (value & LTC3350_CHRG_PFO) + return POWER_SUPPLY_STATUS_NOT_CHARGING; + + if (value & LTC3350_CHRG_STEPDOWN) { + /* The chip remains in CV mode indefinitely, hence "full" */ + if (value & LTC3350_CHRG_CV) + return POWER_SUPPLY_STATUS_FULL; + + return POWER_SUPPLY_STATUS_CHARGING; + } + + /* Not in step down? Must be full then (never seen this) */ + return POWER_SUPPLY_STATUS_FULL; +}; + +static int ltc3350_get_status(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_CHRG_STATUS, ®val); + if (ret) + return ret; + + val->intval = ltc3350_state_decode(regval); + + return 0; +} + +static int ltc3350_charge_status_decode(unsigned int value) +{ + if (!(value & LTC3350_CHRG_STEPDOWN)) + return POWER_SUPPLY_CHARGE_TYPE_NONE; + + /* constant voltage is "topping off" */ + if (value & LTC3350_CHRG_CV) + return POWER_SUPPLY_CHARGE_TYPE_TRICKLE; + + /* input limiter */ + if (value & LTC3350_CHRG_INPUT_ILIM) + return POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE; + + /* constant current is "fast" */ + if (value & LTC3350_CHRG_CI) + return POWER_SUPPLY_CHARGE_TYPE_FAST; + + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; +} + +static int ltc3350_get_charge_type(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_CHRG_STATUS, ®val); + if (ret) + return ret; + + val->intval = ltc3350_charge_status_decode(regval); + + return 0; +} + +static int ltc3350_get_online(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_MON_STATUS, ®val); + if (ret) + return ret; + + /* indicates if input voltage is sufficient to charge */ + val->intval = !!(regval & LTC3350_MON_POWER_RETURNED); + + return 0; +} + +static int ltc3350_get_scaled(struct ltc3350_info *info, unsigned int reg, + int scale, int *value) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, reg, ®val); + if (ret) + return ret; + + /* + * The "scale" here is 10 μV per LSB, this allows all calculations to + * be done in 32-bit integer without overflow. This converts the + * register value to μV. + */ + *value = regval * scale / 10; + + return 0; +} + +static int ltc3350_set_scaled(struct ltc3350_info *info, unsigned int reg, int scale, int value) +{ + int ret; + + value *= 10; + value = DIV_ROUND_CLOSEST(value, scale); + + ret = regmap_write(info->regmap, reg, value); + if (ret) + return ret; + + /* When writing to one of the LVL registers, update the alarm mask */ + if (reg >= LTC3350_REG_CAP_UV_LVL && reg <= LTC3350_REG_CAP_LO_LVL) + ltc3350_enable_alarm(info, reg); + + return 0; +} + +static int ltc3350_get_input_current(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_MEAS_IIN, ®val); + if (ret) + return ret; + + /* 1.983µV/RSNSI amperes per LSB */ + ret = regval * 19830; + ret /= info->rsnsi; + ret *= 100; + + val->intval = ret; + + return 0; +} + +static int ltc3350_get_icharge(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_MEAS_ICHG, ®val); + if (ret) + return ret; + + /* 1.983µV/RSNSC amperes per LSB */ + ret = regval * 19830; + ret /= info->rsnsc; + ret *= 100; + + val->intval = ret; + + return 0; +} + +static int ltc3350_get_icharge_max(struct ltc3350_info *info, union power_supply_propval *val) +{ + /* I_CHG(MAX) = 32mV / RSNSC (Ampere) */ + val->intval = 3200000000U / (info->rsnsc / 10); + + return 0; +} + +static int ltc3350_get_iin_max(struct ltc3350_info *info, union power_supply_propval *val) +{ + /* I_IN(MAX) = 32mV / RSNSI (Ampere) */ + val->intval = 3200000000U / (info->rsnsi / 10); + + return 0; +} + + +static int ltc3350_get_die_temp(struct ltc3350_info *info, unsigned int reg, + union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, reg, ®val); + if (ret) + return ret; + + /* 0.028°C per LSB – 251.4°C */ + ret = 280 * regval; + ret /= 100; /* Centidegrees scale */ + ret -= 25140; + val->intval = ret; + + return 0; +} + +static int ltc3350_set_die_temp(struct ltc3350_info *info, unsigned int reg, int val) +{ + unsigned int regval; + int ret; + + /* 0.028°C per LSB – 251.4°C */ + regval = val + 25140; + regval *= 100; + regval /= 280; + + ret = regmap_write(info->regmap, reg, regval); + if (ret) + return ret; + + ltc3350_enable_alarm(info, reg); + return 0; +} + +static int ltc3350_get_num_caps(struct ltc3350_info *info, union power_supply_propval *val) +{ + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_NUM_CAPS, ®val); + if (ret) + return ret; + + val->intval = regval + 1; + + return 0; +} + + +/* Custom properties */ +static ssize_t ltc3350_attr_show(struct device *dev, + struct device_attribute *attr, char *buf, + unsigned int reg, int scale) +{ + struct power_supply *psy = to_power_supply(dev); + struct ltc3350_info *info = power_supply_get_drvdata(psy); + int value; + int ret; + + ret = ltc3350_get_scaled(info, reg, scale, &value); + if (ret) + return ret; + + return sprintf(buf, "%d\n", value); +} + +static ssize_t ltc3350_attr_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count, + unsigned int reg, unsigned int scale) +{ + struct power_supply *psy = to_power_supply(dev); + struct ltc3350_info *info = power_supply_get_drvdata(psy); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + return ret; + + ret = ltc3350_set_scaled(info, reg, val, scale); + if (ret) + return ret; + + return count; +} + +#define LTC3350_DEVICE_ATTR_RO(_name, _reg, _scale) \ +static ssize_t _name##_show(struct device *dev, struct device_attribute *attr, \ + char *buf) \ +{ \ + return ltc3350_attr_show(dev, attr, buf, _reg, _scale); \ +} \ +static DEVICE_ATTR_RO(_name) + +#define LTC3350_DEVICE_ATTR_RW(_name, _reg, _scale) \ +static ssize_t _name##_show(struct device *dev, struct device_attribute *attr, \ + char *buf) \ +{ \ + return ltc3350_attr_show(dev, attr, buf, _reg, _scale); \ +} \ +static ssize_t _name##_store(struct device *dev, struct device_attribute *attr, \ + const char *buf, size_t count) \ +{ \ + return ltc3350_attr_store(dev, attr, buf, count, _reg, _scale); \ +} \ +static DEVICE_ATTR_RW(_name) + +/* Shunt voltage, 183.5μV per LSB */ +LTC3350_DEVICE_ATTR_RW(vshunt, LTC3350_REG_VSHUNT, 1835); + +/* General purpose input, 183.5μV per LSB */ +LTC3350_DEVICE_ATTR_RO(gpi, LTC3350_REG_MEAS_GPI, 1835); +LTC3350_DEVICE_ATTR_RW(gpi_uv, LTC3350_REG_GPI_UV_LVL, 1835); +LTC3350_DEVICE_ATTR_RW(gpi_ov, LTC3350_REG_GPI_OV_LVL, 1835); + +/* Input voltage, 2.21mV per LSB */ +LTC3350_DEVICE_ATTR_RO(vin, LTC3350_REG_MEAS_VIN, 22100); +LTC3350_DEVICE_ATTR_RW(vin_uv, LTC3350_REG_VIN_UV_LVL, 22100); +LTC3350_DEVICE_ATTR_RW(vin_ov, LTC3350_REG_VIN_OV_LVL, 22100); + +static ssize_t charge_status_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct power_supply *psy = to_power_supply(dev); + struct ltc3350_info *info = power_supply_get_drvdata(psy); + unsigned int regval; + int ret; + + ret = regmap_read(info->regmap, LTC3350_REG_CHRG_STATUS, ®val); + if (ret) + return ret; + + return sprintf(buf, "0x%x\n", regval); +} +static DEVICE_ATTR_RO(charge_status); + +static struct attribute *ltc3350_sysfs_entries[] = { + &dev_attr_vshunt.attr, + &dev_attr_gpi.attr, + &dev_attr_gpi_uv.attr, + &dev_attr_gpi_ov.attr, + &dev_attr_vin.attr, + &dev_attr_vin_uv.attr, + &dev_attr_vin_ov.attr, + &dev_attr_charge_status.attr, + NULL, +}; + +static const struct attribute_group ltc3350_attr_group = { + .name = NULL, /* put in device directory */ + .attrs = ltc3350_sysfs_entries, +}; + +static const struct attribute_group *ltc3350_attr_groups[] = { + <c3350_attr_group, + NULL, +}; + +static int ltc3350_get_property(struct power_supply *psy, enum power_supply_property psp, + union power_supply_propval *val) +{ + struct ltc3350_info *info = power_supply_get_drvdata(psy); + + switch (psp) { + case POWER_SUPPLY_PROP_STATUS: + return ltc3350_get_status(info, val); + case POWER_SUPPLY_PROP_CHARGE_TYPE: + return ltc3350_get_charge_type(info, val); + case POWER_SUPPLY_PROP_ONLINE: + return ltc3350_get_online(info, val); + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VOUT, 22100, &val->intval); + case POWER_SUPPLY_PROP_VOLTAGE_MIN: + return ltc3350_get_scaled(info, LTC3350_REG_VOUT_UV_LVL, 22100, &val->intval); + case POWER_SUPPLY_PROP_VOLTAGE_MAX: + return ltc3350_get_scaled(info, LTC3350_REG_VOUT_OV_LVL, 22100, &val->intval); + case POWER_SUPPLY_PROP_CURRENT_NOW: + return ltc3350_get_input_current(info, val); + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: + return ltc3350_get_icharge(info, val); + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: + return ltc3350_get_icharge_max(info, val); + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: + return ltc3350_get_iin_max(info, val); + case POWER_SUPPLY_PROP_TEMP: + return ltc3350_get_die_temp(info, LTC3350_REG_MEAS_DTEMP, val); + case POWER_SUPPLY_PROP_TEMP_ALERT_MIN: + return ltc3350_get_die_temp(info, LTC3350_REG_DTEMP_COLD_LVL, val); + case POWER_SUPPLY_PROP_TEMP_ALERT_MAX: + return ltc3350_get_die_temp(info, LTC3350_REG_DTEMP_HOT_LVL, val); + default: + return -EINVAL; + } +} + +static int ltc3350_set_property(struct power_supply *psy, enum power_supply_property psp, + const union power_supply_propval *val) +{ + struct ltc3350_info *info = power_supply_get_drvdata(psy); + + switch (psp) { + case POWER_SUPPLY_PROP_TEMP_ALERT_MIN: + return ltc3350_set_die_temp(info, LTC3350_REG_DTEMP_COLD_LVL, val->intval); + case POWER_SUPPLY_PROP_TEMP_ALERT_MAX: + return ltc3350_set_die_temp(info, LTC3350_REG_DTEMP_HOT_LVL, val->intval); + default: + return -EINVAL; + } +} + +static int ltc3350_property_is_writeable(struct power_supply *psy, enum power_supply_property psp) +{ + switch (psp) { + case POWER_SUPPLY_PROP_VOLTAGE_MIN: + case POWER_SUPPLY_PROP_VOLTAGE_MAX: + case POWER_SUPPLY_PROP_TEMP_ALERT_MIN: + case POWER_SUPPLY_PROP_TEMP_ALERT_MAX: + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MIN: + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MAX: + return 1; + default: + return 0; + } +} + +/* Charger power supply property routines */ +static enum power_supply_property ltc3350_properties[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_CHARGE_TYPE, + POWER_SUPPLY_PROP_ONLINE, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, + POWER_SUPPLY_PROP_TEMP, + POWER_SUPPLY_PROP_TEMP_ALERT_MIN, + POWER_SUPPLY_PROP_TEMP_ALERT_MAX, +}; + +static const struct power_supply_desc ltc3350_desc = { + .name = "ltc3350", + .type = POWER_SUPPLY_TYPE_MAINS, + .properties = ltc3350_properties, + .num_properties = ARRAY_SIZE(ltc3350_properties), + .get_property = ltc3350_get_property, + .set_property = ltc3350_set_property, + .property_is_writeable = ltc3350_property_is_writeable, +}; + +static int ltc3350_capacitor_get_property(struct power_supply *psy, enum power_supply_property psp, + union power_supply_propval *val) +{ + struct ltc3350_info *info = power_supply_get_drvdata(psy); + + switch (psp) { + case POWER_SUPPLY_PROP_STATUS: + return ltc3350_get_status(info, val); + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + /* Capacitor stack voltage, 1.476 mV per LSB */ + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VCAP, 14760, &val->intval); + case POWER_SUPPLY_PROP_VOLTAGE_MIN: + return ltc3350_get_scaled(info, LTC3350_REG_VCAP_UV_LVL, 14760, &val->intval); + case POWER_SUPPLY_PROP_VOLTAGE_MAX: + return ltc3350_get_scaled(info, LTC3350_REG_VCAP_OV_LVL, 14760, &val->intval); + case POWER_SUPPLY_PROP_NUMBER_OF_SERIAL_CELLS: + return ltc3350_get_num_caps(info, val); + case POWER_SUPPLY_PROP_CELL1_VOLTAGE_NOW: + /* Single capacitor voltages, 183.5μV per LSB */ + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VCAP1, 1835, &val->intval); + case POWER_SUPPLY_PROP_CELL2_VOLTAGE_NOW: + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VCAP2, 1835, &val->intval); + case POWER_SUPPLY_PROP_CELL3_VOLTAGE_NOW: + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VCAP3, 1835, &val->intval); + case POWER_SUPPLY_PROP_CELL4_VOLTAGE_NOW: + return ltc3350_get_scaled(info, LTC3350_REG_MEAS_VCAP4, 1835, &val->intval); + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MIN: + return ltc3350_get_scaled(info, LTC3350_REG_CAP_UV_LVL, 1835, &val->intval); + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MAX: + return ltc3350_get_scaled(info, LTC3350_REG_CAP_OV_LVL, 1835, &val->intval); + default: + return -EINVAL; + } +} + +static int ltc3350_capacitor_set_property(struct power_supply *psy, enum power_supply_property psp, + const union power_supply_propval *val) +{ + struct ltc3350_info *info = power_supply_get_drvdata(psy); + + switch (psp) { + case POWER_SUPPLY_PROP_VOLTAGE_MIN: + return ltc3350_set_scaled(info, LTC3350_REG_VCAP_UV_LVL, 14760, val->intval); + case POWER_SUPPLY_PROP_VOLTAGE_MAX: + return ltc3350_set_scaled(info, LTC3350_REG_VCAP_OV_LVL, 14760, val->intval); + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MIN: + return ltc3350_set_scaled(info, LTC3350_REG_CAP_UV_LVL, 1835, val->intval); + case POWER_SUPPLY_PROP_CELL_VOLTAGE_MAX: + return ltc3350_set_scaled(info, LTC3350_REG_CAP_OV_LVL, 1835, val->intval); + default: + return -EINVAL; + } +} + +static enum power_supply_property ltc3350_capacitor_properties[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_VOLTAGE_MIN, + POWER_SUPPLY_PROP_VOLTAGE_MAX, + POWER_SUPPLY_PROP_NUMBER_OF_SERIAL_CELLS, + POWER_SUPPLY_PROP_CELL1_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL2_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL3_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL4_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CELL_VOLTAGE_MIN, + POWER_SUPPLY_PROP_CELL_VOLTAGE_MAX, +}; + +static const struct power_supply_desc ltc3350_capacitor_desc = { + .name = "ltc3350_capacitor", + .type = POWER_SUPPLY_TYPE_BATTERY, + .properties = ltc3350_capacitor_properties, + .num_properties = ARRAY_SIZE(ltc3350_capacitor_properties), + .get_property = ltc3350_capacitor_get_property, + .set_property = ltc3350_capacitor_set_property, + .property_is_writeable = ltc3350_property_is_writeable, +}; + +static char *ltc3350_supply_interface_capacitor[] = { "ltc3350_capacitor" }; + +static bool ltc3350_is_writeable_reg(struct device *dev, unsigned int reg) +{ + /* all registers up to this one are writeable */ + return reg < LTC3350_REG_NUM_CAPS; +} + +static bool ltc3350_is_volatile_reg(struct device *dev, unsigned int reg) +{ + /* read-only status registers and self-clearing register */ + return reg > LTC3350_REG_NUM_CAPS || reg == LTC3350_REG_CLR_ALARMS; +} + +static const struct regmap_config ltc3350_regmap_config = { + .reg_bits = 8, + .val_bits = 16, + .val_format_endian = REGMAP_ENDIAN_LITTLE, + .writeable_reg = ltc3350_is_writeable_reg, + .volatile_reg = ltc3350_is_volatile_reg, + .max_register = LTC3350_REG_MEAS_DTEMP, + .cache_type = REGCACHE_MAPLE, +}; + +static int ltc3350_probe(struct i2c_client *client) +{ + struct device *dev = &client->dev; + struct ltc3350_info *info; + struct power_supply_config ltc3350_config = {}; + int ret; + + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + info->client = client; + i2c_set_clientdata(client, info); + + info->regmap = devm_regmap_init_i2c(client, <c3350_regmap_config); + if (IS_ERR(info->regmap)) + return dev_err_probe(dev, PTR_ERR(info->regmap), + "Failed to initialize register map\n"); + + ret = device_property_read_u32(dev, "lltc,rsnsc-micro-ohms", + &info->rsnsc); + if (ret) + return dev_err_probe(dev, ret, "Missing lltc,rsnsc-micro-ohms property\n"); + + if (!info->rsnsc) + return -EINVAL; + + ret = device_property_read_u32(dev, "lltc,rsnsi-micro-ohms", + &info->rsnsi); + if (ret) + return dev_err_probe(dev, ret, "Missing lltc,rsnsi-micro-ohms property\n"); + + if (!info->rsnsi) + return -EINVAL; + + /* Clear and disable all interrupt sources*/ + ret = regmap_write(info->regmap, LTC3350_REG_CLR_ALARMS, 0xFFFF); + if (ret) + return dev_err_probe(dev, ret, "Failed to write configuration\n"); + + regmap_write(info->regmap, LTC3350_REG_MSK_ALARMS, 0); + regmap_write(info->regmap, LTC3350_REG_MSK_MON_STATUS, 0); + + ltc3350_config.fwnode = dev_fwnode(dev); + ltc3350_config.drv_data = info; + info->capacitor = devm_power_supply_register(dev, <c3350_capacitor_desc, <c3350_config); + if (IS_ERR(info->capacitor)) { + dev_err(dev, "Failed to register capacitor\n"); + return PTR_ERR(info->capacitor); + } + + ltc3350_config.supplied_to = ltc3350_supply_interface_capacitor; + ltc3350_config.num_supplicants = ARRAY_SIZE(ltc3350_supply_interface_capacitor); + ltc3350_config.attr_grp = ltc3350_attr_groups; + info->charger = devm_power_supply_register(dev, <c3350_desc, <c3350_config); + if (IS_ERR(info->charger)) { + dev_err(dev, "Failed to register charger\n"); + return PTR_ERR(info->charger); + } + + /* Enable interrupts on status changes */ + regmap_write(info->regmap, LTC3350_REG_MSK_MON_STATUS, + LTC3350_MON_POWER_FAILED | LTC3350_MON_POWER_RETURNED); + + return 0; +} + +static void ltc3350_alert(struct i2c_client *client, enum i2c_alert_protocol type, + unsigned int flag) +{ + struct ltc3350_info *info = i2c_get_clientdata(client); + + if (type != I2C_PROTOCOL_SMBUS_ALERT) + return; + + power_supply_changed(info->charger); +} + +static const struct i2c_device_id ltc3350_i2c_id_table[] = { + { "ltc3350", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, ltc3350_i2c_id_table); + +static const struct of_device_id ltc3350_of_match[] = { + { .compatible = "lltc,ltc3350", }, + { }, +}; +MODULE_DEVICE_TABLE(of, ltc3350_of_match); + +static struct i2c_driver ltc3350_driver = { + .probe = ltc3350_probe, + .alert = ltc3350_alert, + .id_table = ltc3350_i2c_id_table, + .driver = { + .name = "ltc3350-charger", + .of_match_table = ltc3350_of_match, + }, +}; +module_i2c_driver(ltc3350_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mike Looijmans "); +MODULE_DESCRIPTION("LTC3350 charger driver");