From patchwork Tue Apr 16 12:18:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13631758 Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04on2099.outbound.protection.outlook.com [40.107.7.99]) (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 961DD12A15A; Tue, 16 Apr 2024 12:18:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.7.99 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269918; cv=fail; b=AdGLt8j4LJNUyoGYPLugIOSQ0kq/p6Rw1Pm3EdVAFqOTqd1nJR+k9Z1P7Rc5rAN+/CPNN4CeeueGtZ4Q/NBL+GVhl01OcQk70mONlfvJeWxM/pPzAeB5jshFhSpaZyrxN41eEOwOGwGp0qb/icEygM+CxFDqMTK62LrNEgJBM6Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269918; c=relaxed/simple; bh=DbMIqFE48QPZGX3tHgZgmG8nnZPoAJxlzjCAIhzJTMg=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version: References; b=rsb2nDbODhMQa/H/h6j7wcQxfn+CdiWR7wv6osu0CUeo29Xzsg1m162KZ8Eno1ajoyRrkydPjX2ioq15UNFY0QkgsgevwteHfksv4BYz3eTC2DxGiBx7jSC/YOXOCM6M10qZCWNlKaZOPnzK2RYO9R1b2lgcpHOym1//eb0FnGM= 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=Szfs6bPo; arc=fail smtp.client-ip=40.107.7.99 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="Szfs6bPo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZsPBSlu59/niNcmtBL3HZ9YkjSM+GQZ6NnB1I4K/p34IZrQymUZncyIh8BW+qON7ZJhyv7StX5Fp2VMTxsUkNjKJ48guAVJGHImQE58KTFZQDvdEznaAeKeMxGvg/L+mTUej0qChf0dgXvGYhVHFSrngnLSiPwUFlkCVM8HtD1q92wwYV3ZRFKcAgf7LrpsS+W7O6NqLbwBUSqSibuuZGDspIJgwjqsTLeu0u8lcV+AyC4bbKO7doiJZwUtRKVMg8GZ6tgy+fCON5XOYP2u5rvnTDzPEs2gUj8HHzo84+psPJHwHJiJkilIlWDAzWL/kW9Tbz0AsM4wfK0XgJIVuww== 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=KfXUtN46cEcY2S0y7X/XQIQDyZzdkk7E29Kuxg7lIhd/WOzZfSNyZRscJk6hjRdcL7qVUcEXmz20Ge02XnCWCOeyS4KP6AgCdmj8SI1utWEyMLM73Vs1fIyFkDeVSb1wflI5AvEq0FDCxJZyzj21E2gmx0ZVsFTEe3bUo4xOZ+A8CLtnwLM+VUTup8Vt88wsR+x3T4sAXkHbsvmn1k1o9YNojdW2iXUINMgnjKYUDMcNW67oQRooBrbWaR3ozLJ0jxzDUDeDj7dve+F5Fs7vMXnVbob6FPl9scbeoUXPom3CT5teasW/74bAPHG6qPcrdHU1fJU/tMUtak4tzbiz8g== 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=Szfs6bPoHvsDuFWbRvZwkijHzYMO0NU40DuaAmIdTEU0DbqKUKcHseZ6E5BdwxTy+pehxuUQOVH/KngP/RiijczKATjmQp9mF4DgpzM4lGwr6uCfuffO4Yq4u8wkab9oaqHIBPUq4XONZRfR50t4nrGnNBs8nqgUcUTMGVbxrFcOj7C3CKy/60LoCbKkiTh3TneFb0dz9YzwsH8Z7Xk1B4QdJ82hnDXnLn+pg8nZbPtthxHKSg3BOmK4edv61ifAWliI+6JbZbzlBGqgnwee1REjmSCf1yCM5WCgDSHBJRwqvv8+cEohOdb5Pa+tv44nZn2X0wPkHOKwKYta6Y62Tw== Received: from DUZPR01CA0285.eurprd01.prod.exchangelabs.com (2603:10a6:10:4b7::23) by AM9PR04MB9013.eurprd04.prod.outlook.com (2603:10a6:20b:409::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:32 +0000 Received: from DU6PEPF0000B620.eurprd02.prod.outlook.com (2603:10a6:10:4b7:cafe::45) by DUZPR01CA0285.outlook.office365.com (2603:10a6:10:4b7::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.32 via Frontend Transport; Tue, 16 Apr 2024 12:18:32 +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 DU6PEPF0000B620.mail.protection.outlook.com (10.167.8.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Tue, 16 Apr 2024 12:18:32 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (104.47.51.169) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Tue, 16 Apr 2024 12:18:30 +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 VE1PR04MB7230.eurprd04.prod.outlook.com (2603:10a6:800:1ab::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:24 +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; Tue, 16 Apr 2024 12:18:24 +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 v5 1/5] dt-bindings: power: Extend battery chemistry with capacitor Date: Tue, 16 Apr 2024 14:18:14 +0200 Message-ID: <20240416121818.543896-1-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 X-ClientProxiedBy: AM8P251CA0015.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:21b::20) 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_|VE1PR04MB7230:EE_|DU6PEPF0000B620:EE_|AM9PR04MB9013:EE_ X-MS-Office365-Filtering-Correlation-Id: 63f61ead-601f-494b-d773-08dc5e0f54e1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 7SFKj+nr678/bhjbcggr4nUXPOju4BpzSmR32s9EOzyGpTR2nTKy/jVjMdXlMK4edcg0Bey4TXZgKvKldEetsGfMkyd6ifu0QiH4oSbACmf3TnltX3CW6nL9oiCVRWWniyZE2FQRPcoKIaUh8GZRwKiAuC3AERHoxrOggWZhe9uLesBg3lwkBerpX4OCAPBhoHV8FjGIsUFHBJe7nsU8+1nClgj7sAxFbJKX7sB9qgn+sUqclllq5gMkLMxkpH58zcgifm4emPFO4oiTxQWm1zIDjd+MKDkiRGwOUDN7iZKmkRD8vYUqtpDoHoYa+gR5diuVIg7dRdQmPN0Y6ErT6qSegd/9hJU7S5Wv61DCFe7rvsfup307BTa4unKPkWsB7A5I51aLgQvUc+o6tVFaY5H68SHu4d9KgeDWHNCgHHXHu18FFFMTKV1sQDjHcEwZqnP7L01cSju7qC8GxZXk+7Q4fz9uTsizbP/X685C6ZyWmv8rCfMyHFcL1L2HowzRc80r+611ckW/GMmzmS7tzFbpwlkgVhpj2PdKxx5+Oc+C767OWWluMpPIRc7n02NdIF2siMJGFeGxXhQk+ild6SgnSmBFqG6T2CVsMDUyI7LDeODI1L30g8RoYjLpsx27HmKv+FksPBMQxEbuj+Bl02i3CUHWnIA8WC6azkGpQRpsDU2Ns5P4/nJWbI/Mz0/D+LryRBWxpfIKOcbDciN9qQ== 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)(376005)(52116005)(366007)(1800799015)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7230 X-CodeTwo-MessageID: 1b5ac8c7-b024-4cb2-a073-9c05ed1eb553.20240416121830@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true References: <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.e2aac3eb-919a-41c3-81e9-f9030f4f80eb@emailsignatures365.codetwo.com> X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DU6PEPF0000B620.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: eaff7fcb-be01-465e-3bbd-08dc5e0f500b X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: w3WfWYCmkA4M+URVtOuVSQSZLZyQBUmmibN4tPYDqBMCahXS1arH9pNfd11WGCxGMPLaOExQuyBSvJZ2QOM9bk9RNlMqwjMwN9dbjsCX2EsJlXP5bD9WIInams3arWgMFTD5GM+OalTUFr1ofu7s8ZbaEuLrP+tcBxXTRdER0C66AalPqTZAxSRDlSkVIbeqLKRpK+MQoHyLCw1Vb3TvkH31vqXjikjsFaoQKP2aWrvjsBvfkBAVRMB9QX5NVsZIoiptNxTABsbrbczJABqR0TVoWgqzSL5BrKkn1sFbn/a3fq4qwoDqsVzyitU4+1U5g/vIT3TL4gbFtHDOH4yosqMGproFHepQn8SYMiDCoxQ9lXbKJkmJUQyc2E+IyinxdGrG4ZoP37BWOa46GguCZyYjy39zMXiBO1S44bI+0cRqKqKzBRx6oq3TPb0Wd2K736sCJFeTnmusAdUshPdf3f0x39Q6ezLr/S05coKG6zHgFQG9a6bPbFcQJGLjLklbEIEQ2zgzph0sj4ubF2LDD/HnhKrAdMO7vg/59M8oinplSGVcWxDFacmI3MEb4f6XHB0ctGx9WZnuz+/HlLWbmPVOs/56HEpruW+j5snCBVQoU2HbWrvaabSBEZnuhDd0jWMUlV5b3f21pN9/KqFmEX7HIfJsfQSp3JF/mRadnNTwfXJOfnv6ke9e0Emcc3DE3XM1g63W38Ktxky0HiJ2hw== 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)(82310400014)(1800799015)(36860700004);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2024 12:18:32.1062 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 63f61ead-601f-494b-d773-08dc5e0f54e1 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: DU6PEPF0000B620.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB9013 Another technology to store energy is a (super)capacitor. Signed-off-by: Mike Looijmans --- (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 Tue Apr 16 12:18:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13631762 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (mail-dbaeur03on2107.outbound.protection.outlook.com [40.107.104.107]) (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 5C43712C465; Tue, 16 Apr 2024 12:18:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.104.107 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269923; cv=fail; b=S8ZpXATMTV3vKsWhsakg7/fFcTqOKSCt1jjv7BfgQeuUAMQdcUlx6nAnxkJYZsfs1bNIuyzqE6SpbXtiQy57abj+f+1VwfpzQZoEf1aw3/G8Ah2gw2mNgM9UCzNoBpkVKXxpkvMS8xtAuiWmE6+/uDG5xi2SdipxCNXc7I/v+WM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269923; c=relaxed/simple; bh=GPkE/SJb68lyAgEHhSekPwGVMWfpx+zYeTihz+61/SI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Wi0iY1UDwvAmZQP7tQ9M+5aHiDUJTSJldqzmOS9siNyWWpccrVQ8+KriLg/norPqMG/WsdxuaI48HVW+S9FGtFh9fZZHC5jHrsdKSTCT+Otf3onc9vaWcQGgNguSYkZDA/w2Xh5ol8MeExu+cFXPj0P/v4/uQhYu1U0O0sDEcqs= 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=p4PwFbej; arc=fail smtp.client-ip=40.107.104.107 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="p4PwFbej" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EftWwHmEqjdO3t2XdYZvCkwY6Xz9hs/dQ2vY/QZ4qxE/2SYyWrRXPJ1IMCDVS6ARIOfJDKrEG+mbDNgMc7NUFmBtfowvjpzbs7rhLoA6xWdk4WyPIz0nKmDRSnKyZqC3UvbpX3wWCmTUkw1MVf+cGDl3SDVJZMKnUMijbOODSCjRM7cSTyON1I+6ZLt4VWNz/XaEa/CJ7pS2qUhCITMGh58SIFE+sEojIzmSdly2urd5CFBSr+wnaDsi7BYTwm8yjn0yV+Alg3J1o4bQw8xMJNnM9ojl65qdmoBsAETrB/qe8awVQYlfejA1GboncIKMyGOR1JYCYsg1aYFyWZHMSw== 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=huSSah7O2ejmjagcW3rxMebHsAfaYtV6Nh3iQGgc6JE=; b=gLoDJODcxnFoEpp7o90hb6GwaWBOyszRV8tKk4HxicgQmU9gUgm6bBJRvF9jW2tJ0kaFo9syjFIaWb+MaNQbfYMf38zRFnxn3Q9NH04pdvYmauszFIjBu88W5XHi43HtVgzSzQPrHXzw6Xc/odmUhsK/F69nC9+FiIcSMXtJCHw0Tw8RaWjLbCUaKB9rINixLDzYIKyQAPY+FJ83AtOFPy7yMoGHbzg3wJmjaSuge3KxyoRk1DEHSXHBD9pw5wvl66wSSnQDrpi+EWAB7RWnHeGWr6u/+1BzJyp1wjiu+rL0ijaT68YO11cJNjeVLjrdyO/dZtq6BR3XmOYLrHPw2A== 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=huSSah7O2ejmjagcW3rxMebHsAfaYtV6Nh3iQGgc6JE=; b=p4PwFbej46OU1czt4Ns1c8U2/v8Q0hANU6FMKkr283ASMsG7dvgSjZwYPa9PvK4rMgoRqXbFoGI7Hq52iZJM+rIDt3hXE7E1Sd4WKXR8E3WniGxPyOPgM+qgIaUKZcQ6ca3nNa28CPgT5ZPRQLj68hZ7hNhtFgFGw2MU9TcfBXHkOpXFe5yvGrEMkbIQESRHcqj6Zygo0wYLyV4p1HozLF37/lJ5DyWF3R3XhJDLAzAUC0sObelIe5I/JtPePo32RH9kHRyrBHassO97M4EiklSTtb04cjTVc0exI9k7+wGjaJTwOLs8iSDauZ0PnJorbrSPX2A5aXXwu7AE9DTvkA== Received: from DUZP191CA0062.EURP191.PROD.OUTLOOK.COM (2603:10a6:10:4fa::25) by PAXPR04MB9229.eurprd04.prod.outlook.com (2603:10a6:102:2bd::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:37 +0000 Received: from DU6PEPF0000A7E0.eurprd02.prod.outlook.com (2603:10a6:10:4fa:cafe::34) by DUZP191CA0062.outlook.office365.com (2603:10a6:10:4fa::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.34 via Frontend Transport; Tue, 16 Apr 2024 12:18:37 +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 DU6PEPF0000A7E0.mail.protection.outlook.com (10.167.8.42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Tue, 16 Apr 2024 12:18:37 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (104.47.51.169) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Tue, 16 Apr 2024 12:18:32 +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 VE1PR04MB7230.eurprd04.prod.outlook.com (2603:10a6:800:1ab::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:24 +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; Tue, 16 Apr 2024 12:18:24 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Sebastian Reichel , Shuah Khan , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH v5 2/5] power: supply: core: Add POWER_SUPPLY_TECHNOLOGY_CAPACITOR Date: Tue, 16 Apr 2024 14:18:15 +0200 Message-ID: <20240416121818.543896-2-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240416121818.543896-1-mike.looijmans@topic.nl> References: <20240416121818.543896-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.846cb2ab-fcec-478e-9752-6c7d0b6a347c@emailsignatures365.codetwo.com> X-ClientProxiedBy: AM8P251CA0015.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:21b::20) 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_|VE1PR04MB7230:EE_|DU6PEPF0000A7E0:EE_|PAXPR04MB9229:EE_ X-MS-Office365-Filtering-Correlation-Id: 99117eea-c7f9-4182-67bd-08dc5e0f57e4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: dgcVdLfinpNWs1sA3GCkU88kefiPU39E630OZoGqilCTqdhhz8a4Sj8e2q8b2J7SQDwC63CIJlyo/SkU+/Q3r9BJkj/mwfpi46f4A3CHPhTGHwuD7TG+4ikRq4ZuJd4nFKc1tBa6nd/uYjfauhv/ce6JI5oIVFWe3qnJzs3kCbWaGVtZF8AH/G+PVhh/LutV1IiGetmgAGxArygvhug1YsmvdCHMjPDfntyypZizy+voJ6LBTJyA2ZJXFkCP0BFnFrbyV5CpxNM3QmdKYhgZRB5w77msSusiAUnwx99UMmW0XMFNlBGo9bJrjdPfxGWL6v0duYTC8/lj1LGKG2FI+CQlDFEwUD5uLVzdMLPrULLIctSz9ySZEMVenwUlQ2YGMPwtQujU8BTCzO8+tNAl4B9Gy0lyJPFrTMqwrLto/rGMqJpWByXyizixMY4Maw43YvkhCC7pmaCjPt4fzA/E7rl6m1v7M4f1282UGoOp+1tqGE03mgvs8TTOBa/bk7b/cZTtkOkUeBjkQ+WRaExpV0KTY/WRhWYMSKrJdfbi0mtSiZplpYmXyR09k9SmYfcG3jIi9q8Jpql+eQwk0z+3P3Np8NJtuahCPSdosPVd6QZp1VUnITzVsh9uwT1kjjAXXorhKQWZSLSq2Z9uO3URb4Kq0cBNSyCl24/zU8gQXG0hs8RR0e/jf7ZLDectDgxfrLRI2c1qsYxeMnEgrkyNU4QK3ZrR11qwF4XmtEt2neo= 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)(376005)(52116005)(366007)(1800799015)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7230 X-CodeTwo-MessageID: 82f740c8-9228-48ca-96e8-58ee7cc842a9.20240416121832@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DU6PEPF0000A7E0.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 3f097a2b-5709-4376-536a-08dc5e0f5063 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1fO6FbyFRKV2FymO3q50+SGRLrrMNrY40J6L2ZjiIDbAg/Pp4SNY2PnZ/GEtt+GgN+7MwZVLwKmQsRi8RnfF01fT5+PJBkwPR/UiSE5c4nRFY1czrSvj1zz9DhPbLRK9OHFviWo+sXREC2CB6IjRcvL+AjQdMxKeJ8AN1Wd3tVehqjWwlRkF2enazfJcB2ZdN+t4coX95twmHbpoqnfv0LBA/wZzK2A52DsQAQX4YZb+TPe5GQjvy/4croH17o4y5N8hfO/rlaQrM//7E00FKClRCAEDSoVNm5GWWYlE74rVAuQB7bTDYJAnCRNvy4NgsbsMY3VVH1OmTLWjekseJPPXJvfGVp8Hs09psYkmCcgJtoKt0kvALYRsNwb5CnC02h+UHTEwt7Y4dsHeIboJqBImHXEu+r1GnRnFB8KCX4AE8D6/rxCIRQecUOIRmORRIdt7rAvD35Ahfbk9LpGlQtb9D+p9juGgjs1s9Uwwn6lN8Y54CzrlgpGbhZm25DHCycV2laN9gOEArM1wpOLpOS3hRdNgBM1swkpZEiKv1ii/MxzsRdX3ASHL+xc7RrfbBj/gnWSAWOYFbkDHZnwEwayn6KxFz9MF77OP4ylmMIteDpf6fbdJD/qFgo13rxJeTnf8u2oSnI6dGDUNynla02sL6Dod6gOj3v9o0lIusySaIvpmBSdb3iFmbIWMxsg997TjbAWIzKHPNu8Sh+3pnw== 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)(82310400014)(1800799015)(376005);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2024 12:18:37.1093 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 99117eea-c7f9-4182-67bd-08dc5e0f57e4 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: DU6PEPF0000A7E0.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB9229 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 + .../selftests/power_supply/test_power_supply_properties.sh | 2 +- 5 files changed, 6 insertions(+), 2 deletions(-) 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 { diff --git a/tools/testing/selftests/power_supply/test_power_supply_properties.sh b/tools/testing/selftests/power_supply/test_power_supply_properties.sh index df272dfe1d2a..75f801eb86af 100755 --- a/tools/testing/selftests/power_supply/test_power_supply_properties.sh +++ b/tools/testing/selftests/power_supply/test_power_supply_properties.sh @@ -74,7 +74,7 @@ for DEVNAME in $supplies; do test_sysfs_prop_optional model_name test_sysfs_prop_optional manufacturer test_sysfs_prop_optional serial_number - test_sysfs_prop_optional_list technology "Unknown","NiMH","Li-ion","Li-poly","LiFe","NiCd","LiMn" + test_sysfs_prop_optional_list technology "Unknown","NiMH","Li-ion","Li-poly","LiFe","NiCd","LiMn","Capacitor" test_sysfs_prop_optional cycle_count From patchwork Tue Apr 16 12:18:16 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13631759 Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on2093.outbound.protection.outlook.com [40.107.14.93]) (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 86DD2129E9C; Tue, 16 Apr 2024 12:18:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.14.93 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269918; cv=fail; b=EYCSY7WhmGyTXJdsUYh5AeF4u9LGtE0y8J0Ith+etODTDL31ElGpJrnZaalgT8CiPb/Z9QNFf/t8HxvYHUaRgxmwMCXBzUIb6RsAE4Z7sjmjMatylu1ZJXcG99rxGyWzsiuSeg0IPB/scLvnYpgNaGHQHCHeDF0w18zi6xvwad0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269918; c=relaxed/simple; bh=9qcG7iz3fuDsLrOzdibbuaHhqB/sTiBM5Y03rQwu/g8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Psqemt/evKtSvy2yD223RIlaHmUGJOAvt6kwfa5Wg7aRRSCMuslT2bzcP0aXVVxkbIzXGqJiBa1gSMqHCWRGFunWK8YKjTaT+M9hPE3tTIQLqzY9qu4aofEG/281Zaka0LFUe0E5PH4UjKtMN/vbWQiDqQHuucqpE3JiOxDo2do= 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=RSSyTrox; arc=fail smtp.client-ip=40.107.14.93 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="RSSyTrox" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ftleeA7dzRXMsmgqcz9iSQ/kG4OhdRKoOFODb7oG7mQH9pXbWFck0vBht0+kqS7TPjz9LV3qL/C24U9Psmrz3VwBdOUdu825PPul9hB0i1SM2ZZkBoHEHj+airxWlzKqTJ4bWaTokE8H7vIcneYSWkaq/7eMyxk/fOZXICnBP1Gcp9SmnoWDJDlLX8hsV1gLHJeSofHqyKOL3TjRSm8hkRyCiWir7xGAnL4v80Ol10uxAxdUJ+6a9gVwkwL1dOoNCzg+TLc6YG+tRKcf+CTNVKtrzZQxPz34W5tBeSz76OzLb8yrJ3reYyKXMyQR9Thl83ilMKR6jDD2Cy2Vkme65g== 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=jaOUQlna+wn9cgxka+XSQc4H6Qo/NO/nWBGoJMbDzkf/asM2YRDCTWkPr4/XLZNj+TjlWIFkB5HMXLDrTK1N3/HTp//W7O2NWqQXts1i58/fzsoz7TXD1TAW5G5n19dhAtxe5wcA0AmX4wbr5nTBSYfTWRxRiEokBtO9f5erQ6hmoGqC/9Y2pJA6Km6W4RONTPxBAfXe8kHa14BaQ5mnELKPnDD6cqkDhpSUI/u7WijBJCoJDLINw3jRUlzKEaYO1kn8jREg+35i6m6EUt5+w9Q31aoLT9yeKB8P17pkASq/wMKBkhnvQfKFXcCcWLuCaC2WHPxrPkXFuhzA4YWAog== 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=RSSyTroxfg1ntBeHN7AdhtayOa56jywLRW781t2xNBMIVZBZGbB7Ae+yT5UL9aTbnSIlazqggP0sN8EQhtWesfw/J+ig1pPYJ2OZqwQ1YhpWWWPeRaVcHwPgyLtUxO+D8suO/2gqacxGG7fe4L/NJwFAYa+O6IvPMU4jipttepGbFtP1qHGVnM4n++8Kd1r0yLN6J3D3YP7xvGC9HbVQl2lRlfky991M3GhGMViyFoOBH4a/CGO4TlWcooRQ93bqgfJ++HdKggPt2ZcrLYEkzes5m5O+h2HAqKQBQT26q5vOrIYoiYLTmyMAE35amv+PiB4D66/sxX18EEDwgU7N6A== Received: from DU2P251CA0008.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:230::10) by PAWPR04MB10053.eurprd04.prod.outlook.com (2603:10a6:102:387::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:33 +0000 Received: from DU2PEPF00028CFE.eurprd03.prod.outlook.com (2603:10a6:10:230:cafe::12) by DU2P251CA0008.outlook.office365.com (2603:10a6:10:230::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.34 via Frontend Transport; Tue, 16 Apr 2024 12:18:32 +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 DU2PEPF00028CFE.mail.protection.outlook.com (10.167.242.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Tue, 16 Apr 2024 12:18:32 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (104.47.51.169) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Tue, 16 Apr 2024 12:18:30 +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 VE1PR04MB7230.eurprd04.prod.outlook.com (2603:10a6:800:1ab::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:25 +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; Tue, 16 Apr 2024 12:18:25 +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 v5 3/5] power: supply: core: Add POWER_SUPPLY_PROP_*CELL* entries Date: Tue, 16 Apr 2024 14:18:16 +0200 Message-ID: <20240416121818.543896-3-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240416121818.543896-1-mike.looijmans@topic.nl> References: <20240416121818.543896-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.dc197200-74ec-4cd3-a0dd-4f7fd874c623@emailsignatures365.codetwo.com> X-ClientProxiedBy: AM8P251CA0015.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:21b::20) 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_|VE1PR04MB7230:EE_|DU2PEPF00028CFE:EE_|PAWPR04MB10053:EE_ X-MS-Office365-Filtering-Correlation-Id: e0e377bd-b1a7-48d6-0135-08dc5e0f5516 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: tfVjBKJhoXfQjFgWGSpUdvZiztfHVLwf9VSdxqmv8/ZMQAtuYtqsQ3o7nUR9sF3I+PEPOliSbv4NBJ4kxmUb3raG20vZrJhOMXA6YoazyoOck55vUSN8AuiBP3CIjOseSDbket6OVHZ2NDiCfBpOkuQO8lcS0u+O+34L6BUcaSSZAr91npYlL8mJQF51U5yfo5hte7Ypqkgf4aTwRFGP1kT53OjnN4M8IoxsibYVLMPHpfBXwQ7qAYj+gg+jRNZqngg2R9K+kkXXDil19rxwwYNnQ3qeGnwc6q8LaCQGOqL4VqBzIeCSUnmHx4qACAtQcbJXv/JT9DavPO6QhDte5mzTQ1eytBC7dwJFykDH7DLMxkYIuRgAoPAgj/zhTThAKTBimiT3FYG8IHxerLjGz8RzepX+cLFLwoHYMwkLrT19AgmrB1NL71WtzrE/kmNSCggmYjeegIHgpbCZeyFETJm5QRYQllRBnOzM56G/W6IDewwSGACArIhF2pLl7Ar/PbgOPYb3rkQY8vjvDl2mDxxPEh4U6PLI7dNINXjRGfAGZeDs8d1+c75U0KcekB+V21/QT+65wiiInyQqk7LEBqbNMDprpWGrD6zb6d6yzn2rgL/AXDQR0ucBgvTJ4tWR6TCV5bRx+yWqbT4u7VqurI0C1SK0m6oEe6QYBJMP7OpQTBZH5DJsfSbJr9w/DbUV2sbsRvzHZsZCvxHwX5ZYEA== 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)(376005)(52116005)(366007)(1800799015)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7230 X-CodeTwo-MessageID: dc67f059-2f8e-46b6-adbc-99c741076226.20240416121830@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DU2PEPF00028CFE.eurprd03.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 0c7cca2f-7c26-4078-7ea5-08dc5e0f50ad X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: wFXqZgw9j92C0Z7eud/WWrvXgaartii/YHSPuadVWMyuoTPhn0O4yzdyZfzBjSZolZGa/DPQfBJzzE7NqqMaZTQ4yASFoCfxKtMl+t7vy2WmsY6+OSvz8GjYrWHqRcKELjI6Mu9oTdzYcrYB1Ru0srbZRFSiI1dz22G/xdo1KfLpdXmdInsyVTydYnlAWBFPZO12mBJLrzj79OfKP7MGY7aU51sYhD3rkQvVC1OcDDkRrvLSuVUl3bDAMzrQ7SB7st211BK/sorjtc7mGUDQPfe3cSVYg6JmfFmH0so9kAQmRFooHnCQmMa9yQIvvI9SnckngbV+AlRCBmXKMxAVTnwz0/8WJL5AfY9BjOpx6S8K2H0it2qNXmovmbnsYKGFge6CHST19Ka/8PVRMmW+tI6r5CZ9K8+pOp5kQSkDrwhDhoNwx55MpqXuHT5XjAJZ+Zum3vWi8MttnymW4wWe+HgGx1xtd2qYRnS6cPc7aBjDyX/n9cFgRNFRCSoXC5wqmWD4NA0HnZf6KY2SQm9LvGzlDYk3QfZLBkpqPTBDVZIry3POlTp7/ElEbU2F9dnFGfoLD+3sW+zksfGxYZ2DNmOLGR4ugyZNnH5kpS0ohueNk/J/wXMSAV376Xpc1itLnuopB7+SGlphAZMm7qJ2dgVYB7DgHrAT5KfPgyxoPfkzExgpsLOOOmZa/WT2t+1GC0JmIdTwcaZZpUK089FVLg== 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: 16 Apr 2024 12:18:32.4481 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e0e377bd-b1a7-48d6-0135-08dc5e0f5516 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: DU2PEPF00028CFE.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAWPR04MB10053 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 Tue Apr 16 12:18:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13631760 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2112.outbound.protection.outlook.com [40.107.22.112]) (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 9727412A177; Tue, 16 Apr 2024 12:18:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.22.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269919; cv=fail; b=ppz+gm663w/wh1hV8RtH57oM6VfmVvo8I+Gg48uCNr/rBjaWAO0qky3Z25ukhuqAfY/jX6gVu5V1cvbqGWXwgE3G697pP7VJUzFyTWJGYOFeqi0zN64zByXsZYNYgIBNFsre41aj/DG34jKb6Om+KhYOXKuP8Y4+vP4sVwbOJDs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269919; c=relaxed/simple; bh=u2jNXUdlEl0kN1j8OchrByc+t9mhlXMj8KWzl9eF8sU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=YGYd03QF7R+o+HGhVRTF9n1+7ESEhlS7lLDutjoVDZETAk/A4uMZqOp2IxpR0fHC7+vSUOvYE3ncN+h8Xi1fv6HIddfKx4k0DFJhbCGVtETmcLpjEHcC47Ss6MxhsojH8bJlUMj6ufoarYq4Av7ip+LNp+wL+7JdF9H4g5/mrkY= 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=Bqo1ki0W; arc=fail smtp.client-ip=40.107.22.112 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="Bqo1ki0W" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=l9OjJ7dix/kwjF7yJuMbhV+U/Y1CUv+NU92wyDhVtwE3NOtW6iQnMBRx5RSv6e5IFk1/oZDt3onwcVn1LcHp3c5UDEHg/PW7it4Q5OsxrBXBx4q7bA0SGQkLcjl7RlPpuJEzd6SMlSsQMV5YF/hXmb9NonmCWa6i7wYEO3zZaTbOnDrArg0urx9Q3tFeY/51/n6CBI3i2KrKySoGNztMa1AzTPIERaV7D0WAHggvWo6ORzmm19DQ+JPoQGuB6JA8mbu5cJMguqYiECTnnBfERCeXFuKrkklK0sYYgv+HSBrnXRIJbyEsMro3akPDFKlxBoYUGdMRMvz0hR+Ups+Rhw== 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=XSFQFKjN5H+h6ZLKgSn2UjPwvpQb+8B3IX2euYcbq4GyBzr03nIzldaRbJs1YX4AmpYl/+hm1csIfUC2EkYuOIvofBtyShtdm0AmLX8rkJ89WPXbTv1PFtobnjbAO3CMIuiPoz698BptUBXwm1UjcLMLchyX3RWFZG1t7MeuyYd9I6+JPXcaIvRo2SBPAhllR6FNiMyNZy7gH7ThwP+kReVIyXb/STIUiniWvBGGbNtma89qf5K2UtZFGNJWguFPsAY5WDRvkindrdVCqHn6+FsA+vAb4DG6h8+fyOfv1NzTI67kShjLsiDOk4FWtbEhnvzb57wqhVrDs9f+EpHyWA== 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=Bqo1ki0WIfl33iPbLUssWCtIoJJwl4PSkoACYkcUMSpPLvOaacVVyNewbG8DlRiGjGw93pG/thqTfx31DMRfeDzlUefdRzfccJNIwYwNQ8hfVhqVq5BkW8UeIzn/2b+7mGrl89VdfYoOU8R0nu/BBrxN6FYUPHHjvoH8F6N3GLLu+QdANxwPyhKcI42abXDgU5J8cp4BYPe7uW9H6MgDqEtQA1oVYjAQVhtfN2RClerbQW9G1/4w8KOad7kHkGZRZyo925iVGdo0PWfQg1TPt8M2gkViXqQo1hr6uiLvo+Lvlo95Xe/vuzPWUVXh4TdqW+zjEBHBs+7bQbkQkCfI/g== Received: from DU7P250CA0023.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:54f::11) by AS8PR04MB8610.eurprd04.prod.outlook.com (2603:10a6:20b:425::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.43; Tue, 16 Apr 2024 12:18:34 +0000 Received: from DB5PEPF00014B9B.eurprd02.prod.outlook.com (2603:10a6:10:54f:cafe::ef) by DU7P250CA0023.outlook.office365.com (2603:10a6:10:54f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.34 via Frontend Transport; Tue, 16 Apr 2024 12:18:34 +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 DB5PEPF00014B9B.mail.protection.outlook.com (10.167.8.168) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Tue, 16 Apr 2024 12:18:33 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (104.47.51.169) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Tue, 16 Apr 2024 12:18:31 +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 VE1PR04MB7230.eurprd04.prod.outlook.com (2603:10a6:800:1ab::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:25 +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; Tue, 16 Apr 2024 12:18:25 +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 v5 4/5] dt-bindings: power: supply: ltc3350-charger: Add bindings Date: Tue, 16 Apr 2024 14:18:17 +0200 Message-ID: <20240416121818.543896-4-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240416121818.543896-1-mike.looijmans@topic.nl> References: <20240416121818.543896-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.217e6bb9-ab43-4da3-b354-1d8d288df2de@emailsignatures365.codetwo.com> X-ClientProxiedBy: AM8P251CA0015.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:21b::20) 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_|VE1PR04MB7230:EE_|DB5PEPF00014B9B:EE_|AS8PR04MB8610:EE_ X-MS-Office365-Filtering-Correlation-Id: 269eaed1-4f6f-4814-f119-08dc5e0f5570 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: EElw9z3JSiY61C7ScIOZjnHM+frHco3KHeSPRsWzv/zfDfT26cyoZGxwsw2rAEtmNFiEZvN/BKuKq2ERuDRfjz0m8WHreIuhql36g4POg8QYfGhGZiNU/EMXHhThb6kTNOyfPdnikt1gkaBViYww+t2h1VAlpY/kyaNLwC6f5KslI4gZW9nInwQnjH3Q6NOCuf3eDvhbirkTVzaqhyXl3cNmMG2hvkRjNyj9maogCwsR69QPoNpcaztmRJZJWZBa5dBGfaXNPa6d9uCxs4XatJO6t73nRhq45RJYiEaVRHmRSIR9n1kFN+vtTg+oTDj1fm+bQeLPtEPfov/hljEGlOa+h2Wi8WBLv7vC+LD79JormqgdSyPZCr73GXUFV8M79p8AsutYomT9h3R6R5RvB2d14HySA0jqRTwxyo8ONttQuzLShoShMxdun0VJmHOYskhOf6EISp7RzfAtsTD8XT6XKFRdIDx462fsTeh5QDCuAtk3rmOiEFwErceQ/DzaqZoM6VyaaffDSiV/q3t9XwWxxhjy69Im6ArHehCG9DcvExutqAWnzDu8ybce4wE59PPg2/7fgz73S8Wb4QEHQU7Nr0f18/hQBC5isE+bLVieKldcOi3h4+664aEELmOQqnHoJiETS2MvACVNkW23iWZspP7WsDfRxwtuwTPjJYM= 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)(376005)(52116005)(366007)(1800799015)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7230 X-CodeTwo-MessageID: 7cab85bb-b450-4b7a-803c-6431a8086678.20240416121831@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B9B.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 445b5ffc-6864-4c1e-ca39-08dc5e0f50f4 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: uAI51seGvFaUN0erFhno7YrJGASc3bEX76/q38uzvGmAseDC7mkJavj6fs6wlSih5OGUv07PoyWPXKcrkNou25FaJFM5n5WzPhlM2kDCYl9ODH2Q7nFrfu7vKcTNJYjHkaOGeB+psapqsLBY4YPuvtRk2pdp13K+dvPpilyer+wCZ+6dYUjl1suYAq8juQbdPwOc1/kdoaNaGnJhLvJncpYJcqe7F62zFD7JVjT+4yn63nPC8zjtwWMhbin2m27D5zHSA3Xs/0MHZIq5lw7iXXDHu76PsHt6FUXDlvzIPikrZjKiGCssGDA6mUJa5PskVoL0CuHkSATPDfMIV28wOe74y4NNxsu6mlvmtW/QvDx/C8LFD3S4LyHyP6YJj4JswU3LOu7622kGLe1bUdPNS4ozF9zB2r8LXWBf8xYBi0YrblnUy5VxAosr1g6S92y168gfY+t4iC7FjCoF6s8sOqERbMbOC6djVQXXXPb3G8I4znCy46ogaH1XIiox6Ld7Cxb+h49RJNx9BF4r8X7EEVkM8XjBkeSN+LFUM20Xp6nZOHXAFcU9n2nlHDvejrA1SBURM+CF51jLTTvwXcGZybCxzIAhTHkiJTJtwP+54iXJ0YiceWVg7GLE2qKTomx2tlO6eOadEStZkJy8HdrHitBqwQY7clneBChYk6VZSTDV/8HzD2oXFWpKLdilMDJprPBmBtVh3mLS9a2rKrBC5A== 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)(82310400014)(1800799015)(36860700004);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2024 12:18:33.0597 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 269eaed1-4f6f-4814-f119-08dc5e0f5570 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: DB5PEPF00014B9B.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8610 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 Tue Apr 16 12:18:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mike Looijmans X-Patchwork-Id: 13631761 Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on2112.outbound.protection.outlook.com [40.107.15.112]) (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 1254F12AAD2; Tue, 16 Apr 2024 12:18:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.15.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269922; cv=fail; b=vGWAzUyFaWOgBDzVqXN7wIENfsnvHw6kDTJ8qFIc3ICcf/QUBITlHRwo0rKeGvvfWUdNeKWoBI1e2JrPkCk5GHkxnBysk+T6atLcqnwAtD/xlMawLdhJFT1K8jz8GAmulPHLwP0cI80Ru3iDD4bPg+VGxX1bRjHoA0V0SBK9VF8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713269922; c=relaxed/simple; bh=1aoN1xbl/7l9754dcmnA721Yk2m5ifv0RCLzGUA6YGM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=agK+BIsiAt15Vhg+ZcsOWYBIrbWfppA8IQFBsPvuPhFDPQW+xAxmQD7mb3zJ0oV3fvAjW59+T+mpYaFXSNjePQcZznepIrxOlEPxcgPNXkMynAuqd1mAXiAQPxJCfUWwPVuCG5YSx5JwhGYWCOW+qet6Kjx4wJUa6uO7RbQ8EVc= 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=shUWSQUt; arc=fail smtp.client-ip=40.107.15.112 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="shUWSQUt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Zie07Se5jWnuWrB4pPkPuOBO+dMFgGsEMMTwWvoqwWZ9bY1jU+n3J9H3Ga0pDBBxStntRE673qybXx6S9mgli1GY8+4sluk7uH05wu/YLqfmtR6bKxVG8wjmZBN2B420bXVrzNiDQS5QaZdVTgi7kC4oFUjWQaoXJJQo25E5HvzE0VDoQoGUdPQTYkAX7KvKZlGGwNJa9mptbsO0l0CbS60QjPjJfUK8LAjmnMmKStvJo67gsTV8mBZntKIsKggrjzXcKw7SL6cf7C20jf9xctrUGys6+FAf+z+DSDaBMWe4nn4g86hTyUBKMhl9xYADC0wwe96jfs8BRzKUSS8+Eg== 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=QNwBJ+3V/poH/cqTNYIJW1lD5XSkzsOCir07AgsEEfk=; b=eriC23oOvo62Ntf+2YgoUX7Cltjuog/0N7PMixIQ2qSLiWhxLxVSKzZiQ8CzyoJdhgZksb9iKUwuIQqSDvrEvqbCyzeZ6rh8U2c+P/JoALSaBxMTG97SieOh/urJEedHqG+2PB9ZZadhXGVu/qSQHu+VG74cofB3VL2ggsScb+FLVRHFBJsGhMogQNmvZRY5mDKjyCHsc4UhKRfChf6rcr6IIOIi/aX6ddasX7K1PUvwyyg6mL8JoT+MYbMzEGtE+h35d4pPtUX0MBQieJKUdl3cEdtd3uuHZTEy2/iBw/cfH00bCSA5JccHuG8NaAmtQJKWzJ5Axqutqc7Z8+RP3g== 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=QNwBJ+3V/poH/cqTNYIJW1lD5XSkzsOCir07AgsEEfk=; b=shUWSQUtFXpGX43B9a86/XuoPl2zDcv/+sYPS85TBPOCkKTGUDZboPjjnNSYh8A0EOrtpWxT2SDjEyRnv+TZUoRbZUfmdXXKaRi9eh0phlMF8iKL2uKcvTcEh0gdbzAHTrNIRWa8+QULAUDRaoDjSZLfvmbl4osbdbeHURsWwLiSNs39lHD129RaKrbQQKeqPJbXCT1N5S58S7hezZkoUYjuarXiqESmU1N8DHYIOiKAIUGu6CgDRJhtff3bU9eXZKFnAiUxNx6tWEnJAYBKa4BmqeAMQicI+QKTzF9l28soqwRm/hz1Q6UwDcnWM0t3VJNJMRqD1sCWDtuvbU8GRw== Received: from AS9PR04CA0174.eurprd04.prod.outlook.com (2603:10a6:20b:530::15) by AM9PR04MB8890.eurprd04.prod.outlook.com (2603:10a6:20b:409::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:34 +0000 Received: from AM1PEPF000252DA.eurprd07.prod.outlook.com (2603:10a6:20b:530:cafe::35) by AS9PR04CA0174.outlook.office365.com (2603:10a6:20b:530::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.45 via Frontend Transport; Tue, 16 Apr 2024 12:18:34 +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 AM1PEPF000252DA.mail.protection.outlook.com (10.167.16.52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.22 via Frontend Transport; Tue, 16 Apr 2024 12:18:34 +0000 Received: from EUR03-DBA-obe.outbound.protection.outlook.com (104.47.51.169) by westeu100-emailsignatures-cloud.codetwo.com with CodeTwo SMTP Server (TLS12) via SMTP; Tue, 16 Apr 2024 12:18:32 +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 VE1PR04MB7230.eurprd04.prod.outlook.com (2603:10a6:800:1ab::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7452.50; Tue, 16 Apr 2024 12:18:26 +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; Tue, 16 Apr 2024 12:18:26 +0000 From: Mike Looijmans To: linux-pm@vger.kernel.org CC: Mike Looijmans , Sebastian Reichel , linux-kernel@vger.kernel.org Subject: [PATCH v5 5/5] power: supply: ltc3350-charger: Add driver Date: Tue, 16 Apr 2024 14:18:18 +0200 Message-ID: <20240416121818.543896-5-mike.looijmans@topic.nl> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240416121818.543896-1-mike.looijmans@topic.nl> References: <20240416121818.543896-1-mike.looijmans@topic.nl> <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.4a7cccf3-e7cb-4980-be8e-de8bd2795354@emailsignatures365.codetwo.com> X-ClientProxiedBy: AM8P251CA0015.EURP251.PROD.OUTLOOK.COM (2603:10a6:20b:21b::20) 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_|VE1PR04MB7230:EE_|AM1PEPF000252DA:EE_|AM9PR04MB8890:EE_ X-MS-Office365-Filtering-Correlation-Id: 6efb13fa-5b5c-4c33-71a0-08dc5e0f5612 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: NNkU7EMhbsC01jBbnzt/a79NNrfCFhXCxHBD02f6oMSAdpGUowTdWqkemghrS1Gp3yzVkHDzWyBkrOJOCCzTCJEN/t9DAnpO2hT5SWyh6DNGZ4KzRn/m8AYiohMTcSVE/3Fgn3K8Ghm/vJj5GJlr7g1YYfBhcXH+BYDF2S8emMr6WEbFTadG46e5zB4DI5lQeMDG5EUnwJCVcHx+cUm4amHv79Q7HhBjw8dmHeNf5s3HELGxtaakPOn418iqDOWmppz5Y2OV/33mG61t7FQI8kTprE7IkxiHJY8yonutwBfWbuxFy32nzImwvqcUvUcw6ZSlup3+0qDRRUI3fargY0kF3HOCdi9RqbE5bUIRiv81M3KJEJcUyVkjl5Zxz2jc4YepLRA4H4jtwYh04RZdoyT46K6z3CADN1P0ffPJqyJtpG091b+h9IVY52M6XR0tP7gEjgG1XrjmBynsjOqI/hs8kKvKCIpvVDK4iQFLXapR+T7evNLcVaTUXvRPvcd6LA7fbhztlsO5BqjDhm4JlxDCpsrlqiEXnj+LeyOoTi+DWHqC9fj8QVDyvjtSLm7+MYfTm/AwMQOqWY6tI4Gz/dGSClQsrtv+a1+bjRnK4BFlpR2/epYDHeKZEWuBcqMpm88U25Lljqe0jsvqJ70u2ky5YpqNcz6uyo0oqYC6mbDyLkR/6Zl5MvcdMZzMxdC4oG72mjWpaJXME7CtdUw00oPJ6mYoi2l8vxqsEBDpfAc= 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)(376005)(52116005)(366007)(1800799015)(38350700005);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR04MB7230 X-CodeTwo-MessageID: 5cdcea80-bff0-4a07-a4cb-919c7428c8f7.20240416121832@westeu100-emailsignatures-cloud.codetwo.com X-CodeTwoProcessed: true X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM1PEPF000252DA.eurprd07.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: c2f35af9-f6bf-4a54-a3c5-08dc5e0f5134 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: =?utf-8?q?dQcHh2QlSQmRSD+L02P7QNICcD1ytG7?= =?utf-8?q?9zpszdytpSXJ6yZniUZO+WY6FfZZPwVKVTQh9NrmVhK4pnAwoDVtdzcAx6QstBSY1?= =?utf-8?q?eBGx2f3TWy36DE0MUqlkZDKp/j7MhXAma5HftN7rNh7lba0ieJY9raxQ+iYqwEb6T?= =?utf-8?q?39anBEafwsqyWmBI+VKfECVNLaXSFcHrWhdR5fs0b/6mfhXYjuKkVuSx3kZhU8h4S?= =?utf-8?q?MtYZgVkM8lll4jBP+AvcQPkR4syAGXbRxACPVxD253VRZi794sF6yA5QB90aE3pGr?= =?utf-8?q?jJhDSuJp+lhLgvX6Th1DWMq75korSScneyxGb0KoUY4TdYO6i/XwAHtsNEu8TpuKw?= =?utf-8?q?A8CtsLeoeOtgBt9nKiglqg2uA8P6SxlTcE9NmS9A0l73kbP0Vu4spVALaVyPy9kb5?= =?utf-8?q?ksq270B8s/fXdFtxprR/urnTkivLyIVPXjfLaf7ik25eTwDD5+vTgoEsTuJLQVHel?= =?utf-8?q?1YBTerAI0ert8Mm3O4kwZ3XsMAEPkKU/7fU9LtxnruIKFJgEZ9BrCn14Wg7av41h0?= =?utf-8?q?JiAKDdS9iwVG9aA7eeewPH20+BEwN9BYicTHICsWKGHpgkrjwqAPFHcqBCVN4d5M/?= =?utf-8?q?/AfPhEnsqVTkL71V1/j33U/5d8hRs090BweuR44aEG3XNIfWFMHDnJbBStPi6slVX?= =?utf-8?q?IXOAEuRtYdYrLaqf1MGSUYYw7najW0G7MEAxxec1ziD9/2VLfjwLL3PjfwCvzlJF7?= =?utf-8?q?YcHPeLmMaACY9hjJAeZMtM5eAESHWUMJ2j/Yco/hpZTN7XKMAUr4BQAuKybR2NKn9?= =?utf-8?q?L/sQflSJhAgtekCtpRiOjhdhiU/D27mw77m3lRO+nRwyQntoV9DPZLkbi1sPbxomJ?= =?utf-8?q?Z5xp7938fzfaO6eLxUbYeAmv1y5KM9+iZ3ZtmnNUSxZXpCVorotckOFa09d1BsDWZ?= =?utf-8?q?LfLx63+PluCQTMLLwglkaA2vs6MsHAk8iGiZNrxjyqDPZshtZrqX7OTIjz2if3crl?= =?utf-8?q?2qim5ZGugMDNikrAMrqB6VVC9Im+nV1oWVmWup97gQtZ+/06hEZUEaVumbZkvOC3q?= =?utf-8?q?lBH6AiU6NuL0ILH/W+TtHemMUvTbwumDhDnmSen2GW10WXepBEWssEsTFUGs7sj7A?= =?utf-8?q?hVVMalqg+Nud4DlWMKMx65IFqzuLPXNZL8VyFib+Fnmv/9lzluxRYDR8e/Ydob03i?= =?utf-8?q?Y+5Am9YfyQ7+0cv23tF4hMwjgXzuNeRe5aGx8F0QWWBsKedfQ4hxXf8xqDFQgXM+4?= =?utf-8?q?TVHOtkY5LG9zTsHuaOqQ0L3+QjA7011f2XlNfEnMmT0x9bPmawEDutQxlUZKqfiWo?= =?utf-8?q?3CkTDNm5HiqBo?= 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)(82310400014)(36860700004)(376005)(1800799015);DIR:OUT;SFP:1102; X-OriginatorOrg: topic.nl X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Apr 2024 12:18:34.0243 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6efb13fa-5b5c-4c33-71a0-08dc5e0f5612 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: AM1PEPF000252DA.eurprd07.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8890 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 v5: Fix ltc3350_set_scaled() arguments in "store" routines Measurement values are signed Report technology as "Capacitor" Report "full" when "capgd" asserts Move charge current to "current_now" of capacitor Add ABI documentation 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 .../ABI/testing/sysfs-class-power-ltc3350 | 88 ++ drivers/power/supply/Kconfig | 10 + drivers/power/supply/Makefile | 1 + drivers/power/supply/ltc3350-charger.c | 789 ++++++++++++++++++ 4 files changed, 888 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..55b8a3922b4a --- /dev/null +++ b/drivers/power/supply/ltc3350-charger.c @@ -0,0 +1,789 @@ +// 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) { + if (value & LTC3350_CHRG_CAPPG) + 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 = sign_extend32(regval, 15) * 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 = sign_extend32(regval, 15) * 19830; + ret /= (int)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 = sign_extend32(regval, 15) * 19830; + ret /= (int)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 * sign_extend32(regval, 15); + 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, scale, val); + 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_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_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_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_CAPACITOR; + return 0; + 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_CURRENT_NOW: + return ltc3350_get_icharge(info, val); + 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_TECHNOLOGY, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_VOLTAGE_MIN, + POWER_SUPPLY_PROP_VOLTAGE_MAX, + POWER_SUPPLY_PROP_CURRENT_NOW, + 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");