From nobody Fri Sep 25 13:55:16 2026 Received: from mx0b-00128a01.pphosted.com (mx0b-00128a01.pphosted.com [148.163.139.77]) (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 26EBD469851; Fri, 11 Sep 2026 13:52:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.139.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134776; cv=fail; b=R69TG6PICQo7bMpjzTMM/C/R0JN4YDIvUZBl8qFPANbJy/1ScdZYAuDKEclZ5HDdzUrokVb7N3ez/J5l4HPAVxeU2231h4EDcK22AfFzucB5Ob96Kdy2B9G7UdSRzMD3qE/skOyzL6VDkDug0F7H72Nvc8vePhm9LZ/jQQBBSmo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134776; c=relaxed/simple; bh=rzZhxhup2Y8gYKvMUb1Qtzije1sxLFNX99C0PJYJMHQ=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=F1z1JgXpDjPFZExoloBAxMGzZdBmqBh+AjdXb9LsNNWr0bDdTQwab5wk8rqGDrqF35MKlJ9ZNZenGQxE1IoQiQhXty6LXGTvLw8mdq1V95zghABRj6GbtZXpkAt/m1g1MyaW9rWrghX+JXZKYJ3AMWmrslKgx7BYDNHsgNEYrAs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=sPfJU8Lx; arc=fail smtp.client-ip=148.163.139.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="sPfJU8Lx" Received: from pps.filterd (m0167091.ppops.net [127.0.0.1]) by mx0b-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68BCibQi381997; Fri, 11 Sep 2026 09:52:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=e1Nj0 ybc/Ar22kXHQCuK66LtFYHDNhKCmfdnEgz5Z5k=; b=sPfJU8Lx/4uvEFE/DCH9M otCsfGMeI3FYm4JvwMCppTCdSRBz23O1OC1B8whr44FXN29YdTxi5zk5Ob5dpgR+ RPBVd6QPvw4HyJVi5Jm38nRQcx02hdcZDXhMT2oOsZz/+yyJjRPJQ6dLFY3BKlzS uo6PnY15ft7fdakQIMTBie1bYTngIa47RTapJPaFUFrZBr3zSYWyGSUR8aksumrL luUKE9/RmmqapNECxHpWvtgIeyZK/3zmENSgLhunUs/k2PbU1bFXYZeEZTCpOqxG xV3MtEd3vv/vngP4wf/wBNibd/mdAM1efkkLccR7uPiRUqJ+KzsTh4Z+lO9i63Wv w== Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013049.outbound.protection.outlook.com [40.93.196.49]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx97mbt-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 11 Sep 2026 09:52:29 -0400 (EDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gjbp28nR2/bi+Rv5+KBd/E4oK7OxwZcA106IFnfgCXKxqRq24x2AdDppm1aJc5EY6+sd9zTl4xS5/vPbjigo7pfoQWAj5p9UWneC8EwWyZm4tGUTkpAysTUeeOfHngh+hECbSKxpXvoR2cAkANcCszN9mvgidW2nQPHA0Ejmo4mmKJrmGsA/Hhrnh223JlNInxHv15qyh7QbSU/9AiO065+0JPX2IXIXRCQhB0wNppIliZDp4B0LN5ykTHunzu7mpM7D0SqhtulnknN7Cv+F4XEaEDXqyYBaMjDmfEcf+MF1vPsSci2yQ+QjgZKC5sXHVO9wrpKtwQEbTlxvaVwYUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=e1Nj0ybc/Ar22kXHQCuK66LtFYHDNhKCmfdnEgz5Z5k=; b=xPV63Plk4lMspff28CTmep988J7H9jEKx5lzH9Qa+F0DlSsMNLnQctLU69vvu7ZFHJu6SWuoNbhX7TltR3weX/Q8WKrQeiUPMyrWmCiS3B/1dCVE2LW95A/iCZVXShv3pXaYGl5KHb97ea+VrYtH6ej237dCfJ2XPfBqxdtq+wOCQIw8RR/Rp9LPsIodS8DB/bcrpw9LMH3bXy4OAF2VKMFbiuDyq9ziDwoXk6xrm5r0NHNYChaRsnpAXlmVN5EZMWltZ7OxpAEJfyTT+bb+BwUXdrrm8coik8c/SgUHHkGuHFLo5hUkqneCPfUmiSrh/Ptc7hc7/cQ0E1onWjWm/Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=analog.com; dmarc=pass action=none header.from=analog.com; dkim=pass header.d=analog.com; arc=none Received: from SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) by MWHPR03MB989357.namprd03.prod.outlook.com (2603:10b6:303:2a8::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Fri, 11 Sep 2026 13:52:27 +0000 Received: from SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a]) by SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a%6]) with mapi id 15.21.0406.007; Fri, 11 Sep 2026 13:52:27 +0000 From: =?utf-8?q?Nuno_S=C3=A1?= Date: Fri, 11 Sep 2026 14:53:37 +0100 Subject: [PATCH v2 1/4] hwmon: (pmbus/core) increase number of phases and add new mask Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260911-hwmon-max20826-support-v2-1-5e30cbd97d84@analog.com> References: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> In-Reply-To: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> To: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Cc: Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , Shuah Khan , Randy Dunlap X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789134819; l=986; i=nuno.sa@analog.com; s=20231116; h=from:subject:message-id; bh=rzZhxhup2Y8gYKvMUb1Qtzije1sxLFNX99C0PJYJMHQ=; b=W5No0kUJWx3lP3PMm7/24SRwOu9jfLy1zzgluh+FyNWHCcHm42bS+Mju34JbY/kANnXHfRy/z GAkTtLfn4HOC9E9KHcg9Nn01hX8ZevvtdykUjIyKpRaQVWoLrkeLwzU X-Developer-Key: i=nuno.sa@analog.com; a=ed25519; pk=3NQwYA013OUYZsmDFBf8rmyyr5iQlxV/9H4/Df83o1E= X-ClientProxiedBy: MA2P292CA0003.ESPP292.PROD.OUTLOOK.COM (2603:10a6:250:1::20) To SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR03MB5469:EE_|MWHPR03MB989357:EE_ X-MS-Office365-Filtering-Correlation-Id: 8388ae1b-538b-46fc-f34a-08df100bea8a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|1800799024|376014|7416014|11063799006|56012099006|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: dxk7CNzIgrhrk8r4o5/dRE1mi9az9tNahR1Q/gY6Kxq0BElLDvfarNE4T5HgI+lapSERvdeWRmlSLDaBdRZfCDsG8RwaK3EZyPQRMTenad4uVZ0mb2zipgupH5vpGhUdgilsCW0hBy2ATNxupv3YIIkJg0ji9MAu6uunJnER3qObRnp1OLtwkB27v2V0+GD9zJTyDo3w0FsiTWwrCDRE/B0Y2cp5sBsRan4eN+WbUZeW2yWMIg4G6QSRAy8CjhrX5xSutEhtKWvaor2BAOICdG+ChcPJY/xZuv733oAFpcUjKMvpbeuZisX3c9jCuMDizhT7LGE6pwHnxS8ATwFydY9KL/Qj+fT7nLiy7NhI9UYPNVO12o3oaPNAUg+2ypX3bUhNxzUf4/siAbcwLn6GIvy8EP3ckmMliP4CqZhVf+9pB5y4KkZEmy2eBScHNK09hsbJ/FaKuTeey0V9kykgQxDqOEaoYjrr3foh57nbKKYI2juLjWweywReEj2xBcBLH5b+HWlUeIjxQbLkmjLO3cQIROQehNZkKKsKodixkj5oA4q781nJQRXNIo+dINAgKLswLRf6HtgYwCs/F8Eg4XNNKalMOhPabuPQSOxcPzHLfnnfOZyEzVmrzUCDIq5VglBDPfM3lXGr5WUWpDC5LvCYIGkZmvyXjMX9dvo6+mc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR03MB5469.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(1800799024)(376014)(7416014)(11063799006)(56012099006)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?V0dBd2l3S09NRFhDQUN5aFZhYXZGL1ZjTkdKa0hHREtNSmQwUnNmMzRpY0xn?= =?utf-8?B?QllxRW5zdGVsb2cxUnVJc3YyYW56ckpZOG9FMHFlQ3kzcEhuNjF0U1lKMEF5?= =?utf-8?B?TUljMU9OempUVzF0U1Z1TXNPSEwxcUdyalFGUUlINXBORldTRXlvSzZYL2gz?= =?utf-8?B?UVVCOTRKRit4dHpvUWhOMWRGVlpWY2d3dXIvUmN1TTUyYzhSdHlWRTRtMkpI?= =?utf-8?B?RzhmbkM0dE9yb3RrbEFwazBOQTdWTFZ1VWNvTjJrRUJVZGNiN2RjcXB6cUxM?= =?utf-8?B?TWtHSlNTUE1QTjlRZmc5YzVJcXFxd2gxU3cyT0NmOVRTVHBBTXkrMUJpQWlJ?= =?utf-8?B?V1FUT2t2R0RNU0pqYXRZdnE0KzdsbTBRRi9PQ2JoNDhzMTFVVjNvbnBDZmJJ?= =?utf-8?B?RG5KaitRZ3FWL2hqWW10NUNTNlYrNHlocTY5VlUxcDBHUG5MYjJ2QmRSSW9M?= =?utf-8?B?Y0ZmY3kwSUIvcXhVeWxGQkMrNzFIRzJROE8vRUFwUVV2VGpnL2FvVHozSkhL?= =?utf-8?B?MDhaeFpPL0xndVNpUjc5cjZUQmxXQzRCNVNxeVNNclR3TUVzZDdYQStFMElo?= =?utf-8?B?ektyYkk4blg0QmlQS245M1ZpU1FuL3E1WDZTSlZxNE9WOEhhYml6ek1LSlZW?= =?utf-8?B?R1VFWnhmWG4ra1JpOEhkY3REZkFDV2JpZGs4WHFkWjRHTjJBcmVSUTVMS0E1?= =?utf-8?B?ZnE3NlF2RS9hM3h1MVRIM01Tam11ZHE3b2V1KzNrb0NMTXB2LzVMcDdoaEZ3?= =?utf-8?B?Smp4d2NPTDJQMWFiVXhNZUFxVzFsd0p4Qi9BbDdFM1ZObkpVU1JlRjlyTGhG?= =?utf-8?B?bEZWclNRT2gydmdiNHVRZG00RHBLNTJFdGZkbGhsWGNLWHl4M2JzMjRYK1pC?= =?utf-8?B?NEQrTVZjMGp0cVg1RUdqMFQzUzY2dFNPZ29HaHFBMUp0SHNjUndQY3FIeGJp?= =?utf-8?B?d29iSVRCVW5TVzFlMlhhQmlwaStOMkRUdW45a3pjQVgxYTJ6S3hKVW9mZVRp?= =?utf-8?B?cGtzWVZTYzhiRTQxb28wa2lBUDNXSVZPK3IvSzc4VERKQXZoSysyN2pHTHlG?= =?utf-8?B?d05DOUswYVpYbVJ2ZExIK1pBWlBzQVBwcEovUzMxYzZLTFQ2ci9FOXRGbzFG?= =?utf-8?B?djlyTHVsbHlvYzNzamtMZC9CdFcrT2hzOVVJUm5DVUNhcDBjR09LRlRVRDVS?= =?utf-8?B?WW1PZWJwK2s5K2JHWnpiK2tWMG5LcFY0cWdyU040NitIL0QvTXQxNnZOejJx?= =?utf-8?B?b1lZRGlFWHdhOEpyNDBrbU1EVjlsQVJVbDBjejBIM3lYYnYwMlh4cHU4OEhI?= =?utf-8?B?c2VnK3RUMFQ5dVNMK1NUeTdBOFNXRGtpQ0czaWM5NUVLRW9LY2JoN1NDNm1Y?= =?utf-8?B?SGw5dm9HdEVqVkREcFBhQ3BabUpBMFBJMWVNY0IwUWJkUE5kVmFSRnlvMHpQ?= =?utf-8?B?eDlLYU5wYzhXdjlDSzFrL1NhV0lHcFFDY0RsczVCaDZkRkFCMmFwaEZDNXUr?= =?utf-8?B?SHJ2YU9ONnFvOG5RNlgvdk05VCswNnVINFcxWXJHeUd6dE1Dc1p3TStCbHkw?= =?utf-8?B?MDIzT0RiN1BHZVpvM3RNR3RXbTQwMnkrWVdQcnlTMXBmQ1hYZXdCL3YwMm5v?= =?utf-8?B?SklQdGxJdXltdkFDaWhHdjdmREdJWnNHNjg0RmdoTlk2Rkd4SUF2d3hESFRm?= =?utf-8?B?VmtSQll0Zm9vYW5GdVAwZ3NkZmFxaURoQ283ejBOTlAwVVNjUVRESFh3VWo5?= =?utf-8?B?RFgzUHh4d053V3JLNmpYUm5TRzFPclRONGNybU52TWtmdm5jTVMrdHBXbEFz?= =?utf-8?B?Z2EvazFzMXZBQzJ1Zy9Vc2FyWFdWRXVNNzE3alBwbUpHNWVQYnhqVU9IWTFU?= =?utf-8?B?KzJtNGdRb09pK1kyMzQvZUJtcVY5V1lxQVpyekJjRm4yQzJLUEczZnZ6MmZh?= =?utf-8?B?bFVuRytqVUNITjN3a3FPbFFudjF2WFFBZ2d3WGFta0VETWxEVjJWYTZ2N1Nz?= =?utf-8?B?MTBubFdHU3VMRFFqSFVRdGhhUWE0b0JiZWE1RU9LdkRwYlAxZWZMVkg5VFA0?= =?utf-8?B?QlZYTGFuUmoxemg4UXlVMWprazBxSmNwQ0U2bCtLSUx0QUdGWVBJblhIODJI?= =?utf-8?B?UUIvT2k3MDFmci9RU3ZZQ0F4ZDlOS3RoOFRFTExMY0s3eDZ1N3lkV21WZ1BI?= =?utf-8?B?S2tLeVlkYXdvRkdpZXFRZHpnaW9jU0xMV29pb3JTa3BIdGd0ZHdobnZKWmZl?= =?utf-8?B?RjlZZThReFFMdEtUTDRWVDhQaFZESkRvTDY1VmZvOHVqU0cxYnNzVExJY0JN?= =?utf-8?B?djlNWXFDdlJsVHZTVFRYQjlzRU04cnBiS0hOdXJMZDhYcTc0Mm5lQT09?= X-Exchange-RoutingPolicyChecked: 1rzMKBPjL5PRsGf2CTmrOQ5S4I+6eosE8epAs8kEgH7djTdFwoP/zbt+nNjyEALt7Fpju6f7pOxcgYlmu/5eCBMu8sE+ZFdZtYZ5Nf/A2vxr7QgrMXDM2jFlWkZZcKFliqwIleZ7R6EzSvuOx7eVTGO4420mLpDWf3vNBI6zcSIDNvHlEF7vDdHqLKAxZ5T7y+Bn3ye9bRmXUSMc4e2p3CohoketUMsin4kNpjXbbgPeiYMj+YFzcjuqjZP3Dioq+EgkeoNkHgtYhWh3IzmfrEGrApl+7R9WcloeccA2syjeZgU1rFTukKUZeA1lW5ABAGG22ifALBwoKAPSHYsiXA== X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8388ae1b-538b-46fc-f34a-08df100bea8a X-MS-Exchange-CrossTenant-AuthSource: SJ0PR03MB5469.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2026 13:52:27.7334 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UxG0UPA4erIoXEzY0msG2gFNSdht0eNUgJ6svp87D0QbeT9nsDQ0/BxHlENkbm5vYzo73d3RlYmQ1haGNE2X+w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB989357 X-Proofpoint-GUID: xqf54tG6oHQC_3gilR-1kusN99nsajY0 X-Authority-Analysis: v=2.4 cv=DPMacCNb c=1 sm=1 tr=0 ts=6aa4079e cx=c_pps a=pBF/iFUSQWMAsEqgfgMJMQ==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=tJ0stoMY4fr_anPV:21 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=M51BFTxLslgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=ugNRTJOwpmtT476g4l8T:22 a=gAnH3GRIAAAA:8 a=hyX-LaOQUYohgLZ5MeQA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfX1aF6byZFty/i 4ZG7H9cXMLAjXrCIhjD8uV9lk3rrjLbuRjUGnjB2fGM4l9GaCc4Os5TZkrwjAUUIwKZEU/24mbC GreLqlFY2+2tEys5+FILDKDrYaJz3DRxrchsebD8el5KzQ9DURvs X-Proofpoint-ORIG-GUID: xqf54tG6oHQC_3gilR-1kusN99nsajY0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfXyQ1gESM+obuu 1Q3DCHBeDz8PV//BCrxD5ZWy/mlyoZFq4X2kVP7DsHsbKjuuLAb0boq1HaYs8ReUD83IaLFhw4A /SZ/z6OozPoTCdxvvP7GicghSty8no8rTo3hI5Zm4g06H5qIDvGTbYht7TpXf+y8eQowCyxtAFN 2s5UcwQFHThq3O5hfvTbK2Ce5E16yOzZoDTey2uzbW7OoZYeALlMXaIa4Jr6PZv9z7igqdHkLJ/ kRBSSre26EbkM33WdzuU64JyMs8dwemR6lpXeWG3A7HdDYgZHIPkLqzLTZogI8M08aRbbOEK7Bo I529OYKDli7pa0Ki+dMtQiYcRko/r6eKN2YyrN9W07rZuSb4aGpjuPq3aJZo6jR/lg8KhraG2pW SSuQrixne8iuAKbfLglv0cIVK+aqMxGOR56iJ+A4LmXuQRO9b5/nR5fIBM1pEPPgrcFWgKUegx6 T4bOabyYWKOCPKQm7yg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-11_04,2026-09-11_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 phishscore=0 spamscore=0 malwarescore=0 impostorscore=0 suspectscore=0 clxscore=1015 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609110193 Increase the number of phases to 16 as a new upcoming device supports such a number. While at it, add a new mask for controlling the source of the output voltage. Signed-off-by: Nuno S=C3=A1 --- drivers/hwmon/pmbus/pmbus.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h index 2cd3216b3cd9..920c1102ab6d 100644 --- a/drivers/hwmon/pmbus/pmbus.h +++ b/drivers/hwmon/pmbus/pmbus.h @@ -242,6 +242,7 @@ enum pmbus_regs { /* * OPERATION */ +#define PB_OPERATION_CONTROL_V_SRC GENMASK(5, 4) #define PB_OPERATION_CONTROL_ON BIT(7) =20 /* @@ -386,7 +387,7 @@ enum pmbus_sensor_classes { }; =20 #define PMBUS_PAGES 32 /* Per PMBus specification */ -#define PMBUS_PHASES 10 /* Maximum number of phases per page */ +#define PMBUS_PHASES 16 /* Maximum number of phases per page */ =20 /* Functionality bit mask */ #define PMBUS_HAVE_VIN BIT(0) --=20 2.55.0 From nobody Fri Sep 25 13:55:16 2026 Received: from mx0b-00128a01.pphosted.com (mx0b-00128a01.pphosted.com [148.163.139.77]) (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 7CD4B4756C1; Fri, 11 Sep 2026 13:52:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.139.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134779; cv=fail; b=Te+NJqci3OAxpRag4ETFhWBILAOUOiRbIcWWpKtrPf7RdxFRzvq5iTCiQn+aUuzQrfYR3+YsCmsRXvl5eXay8+ZeCaQaq4vza1PoEEnb2mPEshJd0dR6hSsNC49HkcWXK562IJhoqMeYe0zSeIndVMelCxziomvivE+8vk0soB8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134779; c=relaxed/simple; bh=DrOocyQcdrwqAH+WjBgXT7AKQg5lfv4MywtDtJjon1I=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=R4SeSghI5TaPWtaFejHdjiB13p+D1wAV5LLZKkrghv1oz9CKZ4WiigZ8kenbQpT4sfgT7W8nBIx2K5/09Py5amfzQBRSk8f9WwNLjgAfo2WOfb7iLcz++YqCZsy4NyuISmLQqtWnikqSKeU9PFh86g3g1Q8P8n9Wglpnbvhl8YQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=pq9jV4R3; arc=fail smtp.client-ip=148.163.139.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="pq9jV4R3" Received: from pps.filterd (m0167091.ppops.net [127.0.0.1]) by mx0b-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68BCimCf382452; Fri, 11 Sep 2026 09:52:35 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=2jVWy tfi+2Hi4y9CZzB0foR2c+yewIbq849mURYzJWo=; b=pq9jV4R38WmpizDSsa7x8 rRxCNimHNNUI4p5OtWruFCXdIAeDPtkDvYg/XsadGefRvgya/VgHlBAwcUGR6pmo NszSj1TYCEvAAxzA08TXmgjOnhS7JMb/49Rea0ht8BPeRa0Q9uqyKPlAAC1OvRyR /9GlILSGIwZvZRlXBHGB2hQH42b48QPdWsfOHKj/jMZeeCqZYAyh23qrORjHAPtY g2ZwqW+4h8zjP7fpKri4C5jMPEsMsJSIAs1L989UZeYXWoDXtwuqHxXdyTZymlge PaBog0rouFBKOUmiWE+o9LnDaIms4iRJqEtudy4q3UZ5oWZLRbyov8YV67pL8G/b g== Received: from sa9pr02cu001.outbound.protection.outlook.com (mail-southcentralusazon11013034.outbound.protection.outlook.com [40.93.196.34]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx97mby-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 11 Sep 2026 09:52:34 -0400 (EDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=g8o335h7MewUfrngJJQSkEUYSDHzaj67wwENYK5pxl2hxG8aEE9L+uTtZazLWwgbOOwvrdXCyKCVT1/6bYSmictq7wLjxTYYA4NzSEoItUe6Xq97mxuwYfPnOP8vdG6XZs+xjigC12AP8ehaYVQ2hQbf6EoL9+0z0C+d5VBXGLsIHdyks7Sb1ajLfQH45hRDZcmP7t99J9pAF6rduQz2avHKWi5+edzcMxtU13ISH3mJGiYq/yprrcycfLiPhPsEwEQiuF08epak7WmiaIsSN3hNnEuLE6ywxkQ/mlKiBkKkQ7aJWxX6LxxZcvVn8qMU9HMHKBa0g1kHI2GOP+E/YA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=2jVWytfi+2Hi4y9CZzB0foR2c+yewIbq849mURYzJWo=; b=AD0kPR3jFreKnaAZS9KJ7gat9cNfxmHKsTGEnrli9E/8N45dl/cU+EvUHALa2ctxf4+eNO1Jpdl7Cs7yMN09BNIHWvkwl/U21yQChxj/LXpyuOiKtu1e/Q4Cy8CkvQI2bYr3w8Q83dzTA59Do7K4xQQKnHQj1ZAxIEH1nQBx/MfVps+PaB1OZNAnllbDy5ZrV3lN7lVlowwh4YjGUWqJyv0tufCt97YKE5AWX3Fjz7h68l7Is1uziE374w5IlMxVnPODcl5amGemSfE7B7Ed4H1z9rPFzmYUpI+ZdTHYjhbV4AeRHv9iX08/aJfDpxGyQcZ+tJoS7itVaqbUekFsrw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=analog.com; dmarc=pass action=none header.from=analog.com; dkim=pass header.d=analog.com; arc=none Received: from SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) by MWHPR03MB989357.namprd03.prod.outlook.com (2603:10b6:303:2a8::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Fri, 11 Sep 2026 13:52:31 +0000 Received: from SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a]) by SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a%6]) with mapi id 15.21.0406.007; Fri, 11 Sep 2026 13:52:31 +0000 From: =?utf-8?q?Nuno_S=C3=A1?= Date: Fri, 11 Sep 2026 14:53:38 +0100 Subject: [PATCH v2 2/4] hwmon: (pmbus/core) Add mapping function to pmbus_read_block_data() Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260911-hwmon-max20826-support-v2-2-5e30cbd97d84@analog.com> References: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> In-Reply-To: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> To: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Cc: Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , Shuah Khan , Randy Dunlap X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789134819; l=3431; i=nuno.sa@analog.com; s=20231116; h=from:subject:message-id; bh=DrOocyQcdrwqAH+WjBgXT7AKQg5lfv4MywtDtJjon1I=; b=0JHKmCQkz4PpTV2WWG6pZvI9vRqpWvwvt0W2g1uToKEV/7zpYWNztvGgcburXc9sCytLVhgAG 8FW5FUoD7C4B9z1gTYmokwLIayN2cY//C9YlJhggGZ6yNcGCAxQICK2 X-Developer-Key: i=nuno.sa@analog.com; a=ed25519; pk=3NQwYA013OUYZsmDFBf8rmyyr5iQlxV/9H4/Df83o1E= X-ClientProxiedBy: MA2P292CA0024.ESPP292.PROD.OUTLOOK.COM (2603:10a6:250::6) To SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR03MB5469:EE_|MWHPR03MB989357:EE_ X-MS-Office365-Filtering-Correlation-Id: 815d78ab-ade5-4402-afda-08df100becf1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|1800799024|376014|7416014|11063799006|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: puERfEWqLB5Rac5vpI0kd5KFZeialx4pt5tsgBocDRZsYj3iGr7DqxET1YbJf+gMuqC0ZMouKJ9zfqSo8LSRd+LcNRZ+OiOc/AlfYg0XYdOobbvzU4KTRoqoP4ckTLlPTtGbMZbBYCvybA2Fb7txDH3XGHhRl3x3Qwj02bA/IrHthezi9HAebW/+/5A9hUIpYa+BQTOh2gFqh6TC3lFFYL3ViN/YikVPAXytkTVYw0ylup+sl3GGxGtdSg1laAUJMP21oXCb07lIyZ2pbLiLFph1D7BsBVO0VxsHJdmeb67JOETD7EGOhkqhk8TWKqQqOZQ2t6urJGtYva42PXy2Ckmdl6gMe9KbmskpBPyEaokYOpSC1OUt58vUEqUwpFYm851Mly1kATKBgFK8qGbkpiiA2zM22k6HA8hk0H8cRZyPFrn6I+d/FdP6YqnEfzj40pCgCH1ZRt6uoHHhqw3utOfg4CSxf3N6lIlh7RkzHmBnSM/GZvHYzh1ZRw4hvz3IMAJsiOWm+sRI6yRiuVjr6VZtJj326anXFuSeSdvke7Wf3G/kicQhOTq/u3F2M61BGseenKJMEg3IFwfbLlVdijUO5qR9SXpgUkI0JV7BuwyOvSrwY0IXgD9jRjUZW0ROTtn+t4IPWt05wqC9MItGhlr5jaLtOpkYDaPFcZLhFPk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR03MB5469.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(1800799024)(376014)(7416014)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TWt1RGlaRFR3Q3Q5ajFPS0RsYWpic1ByNU5ZS2NkQklUV0lTTmZxbStRSGtC?= =?utf-8?B?VjRGWGt4bzFEcjg1Mk1MVm9Wc202YW82RVFxT1oxM2o5YjI1S3R1WWxMcHVq?= =?utf-8?B?NGo1NDl0dE9TY1c2RWhCSWhuZXpiUGR4Um1MaWg5MDVsZGtXMXl2OTV3THdw?= =?utf-8?B?dWdXRkdpMER6YVYzMG8xMmtWNGpnUGJpZDB0cWhTaWV3anZCNVpxSHFTanBK?= =?utf-8?B?RTk3OTMzRUZtTHVrZ3FUREk3WU8zSUVnVHFhM2gzTm82cGxraFNIanFYZ0FN?= =?utf-8?B?Vnc1S1BxbGg4RFFzN0E2ck9pQXhmejZ1NGVPcXBKalJPMENJRkU0dUdkbWRo?= =?utf-8?B?SWFsbDJNbE5SY0paYVNYYkFZNDdFUFpPY1hXTW55UFViK2ViV0g3RlhmbndI?= =?utf-8?B?djFHT1llTG1uSHJ4ekRzUUlNektneFEyQUZXL2VrVnM5SXh5RWhCZm0vbjRE?= =?utf-8?B?MmhidWdhekw1akFUODZOczl5VUMvN216a2JuWmY5bWZPV0JtY0xWU2tra3F2?= =?utf-8?B?NytwRXBvWHRhNWpXS1dBL1EwWHVCblpzSDNraC9DTFJXanhBRTFlSXEwN2Nl?= =?utf-8?B?bDRhdUhGUm1wdGRiaFJUd25QWnJMOGpJYzU2NmoybDFtY0o3SHFPeUdSdTRB?= =?utf-8?B?SklrUmZ6MEExL2t2cCtLd0lhaTY2a1g4bXZBZDdlelZuQVNNN09hTnVvK0Rk?= =?utf-8?B?U3hnK1A5a0V6dWVsZlpwTHFxV2tHazRMRTgvR1ZmOU5SOWJleW1IRGV0ajk5?= =?utf-8?B?aXdhSHRUZXIvL0dBQ1kwSk5HdkY0b1BnVU1USVlkL0tESHRNcWJlVkhGbWhR?= =?utf-8?B?Z3p6RWJic21LMkZ4VnNwUFFEdis2em9Kd3JWMGpGSWNiSktwREpQQlF6VFF1?= =?utf-8?B?YVZYamQ0NU41S1BPeExRZVVtVEQ1VXJxbE5KUlNFU1F5T3czZ0FadWFVT3B6?= =?utf-8?B?MXVRMFZ2NXRTeXFrUmNzNkgrZ01Ka1pLMHhPcFY4eXppUUNtUjZMZVBHQllT?= =?utf-8?B?MHU1emlmb0Iyai9EY0dhTURzcERRZ001RVlOV3NYZHZRTHZMdmF3dk16THNq?= =?utf-8?B?UHE0cWIycFhKdWp4b0U4U2d3aGdwUmlja0ROaWYwTWNicU5FOExOdFAwQXhD?= =?utf-8?B?TnBGTDBkazR0YytFWjZ2V09HbGhNN0R6MU9TNWJxWnREd3MrRHl1SlhtNFRh?= =?utf-8?B?NDQwN1ZLL0dQZmZ4TWRyRlV2cDlrVnUxV3hNRmtBSkw1VHZncTd6WVBwWWZV?= =?utf-8?B?bEQySXErSHNsc2Jsb0dNVUlmQUZnSGFqYVBIU05VYXNDU2xRZkpmZWV6bzVG?= =?utf-8?B?QU9YN0hGSisya21jbTQzMTVBTnc5RDFuS1k2djlwMXphS2dkWTZ5bVJpTEM5?= =?utf-8?B?K2RJZStyMTR0bUgrckhOSjk3a3ZJUGs0OEZSLytCZnNSTGcwcG1teGdRMU1n?= =?utf-8?B?NWpVY2p3cGNEcldaRkszVUZrUkU3RkFMend2SWphbWh0YzNQL2xrajFtMlQ2?= =?utf-8?B?V3EwUTNTTXErN3dTc0VtK2JIeCtEUWFQTHlsTWlYWGU5a0luWUJUbVk2THkz?= =?utf-8?B?dGhwWkhCZWNKcTNVWWY0VDBSRVc5ZzlSQ2JGK203ZThtbTdnL3BUY25MVk1h?= =?utf-8?B?ZmlIZkNIOWVpUlYyODM1b08zUEpYQ3hBbXROZnd2RWU0cHhsN29vMHRVaTFN?= =?utf-8?B?RHkweCs1Qlc0M3pMUU9zZ1lBK3FtNlRCN0RxRWZvWXpkV1hGeTY1aWZoeUl3?= =?utf-8?B?YzhZTEhYKzJSUkNYME9hcHRPRmZjcXllbGF6Zi9SY00waGE5UGlvNG1vUTFI?= =?utf-8?B?YlVuT3RMOEpzM3UxQ1NodDBpei8zZjFoWTBqck5xKzdJUGZkMDlhTjM5QzI0?= =?utf-8?B?OW1hYW4xc0xJODZMQzYzRDRnZmdWN0pyRllJZ3BIZ1FLTzdpZmZQVXNOanVj?= =?utf-8?B?NjVqU2htMDdFZ0FlVGFHeTlIbzc4Z00xWEMxUm5waGVTWkxKRVFGc2krdG9w?= =?utf-8?B?NzVRUWlyeFFWS0Z2bThuK3VkNXNmTFFhVkY2UmVmSFh5WDdqdnBIVHFVZlRT?= =?utf-8?B?U0o5eGpaS1BqMEpOUm9VcFFMN3JQYThXVXR6dzFCSjhKL0ZXWElUMzZUK0dF?= =?utf-8?B?RU9CY0ZpOUNRWjZPSFNFejBxSFluRytXcHd5NDdhd09QY2RLZTJ4L1ZpUDA4?= =?utf-8?B?YnN1MzFFOTJsb0k0Qm15TGJrUVdTTkNySGtHbUErSUpLUVdMME5GeFpFSW5P?= =?utf-8?B?TTY5VjIrZ3hBU3hMbDc0V1dPT29UdnplcHJRU29MZFJRMCt1enV6ckt1RldE?= =?utf-8?B?S1FFZ3h5YlVXeUordzN3MC9sL3dzTHNtZko0UWN5MXFXVzVjMlBUUT09?= X-Exchange-RoutingPolicyChecked: ZxTpvXrTLxerj8nlMgLx/OnUiOTn5QJeMiZvgaC1XAtzuq62aY9hSpbywFO7N6P4qocokYTpPTV60MG7CuUsJqD8HVuNuID/Wte0TfX/zykjLC3fp8l8kN8SXpQOuJQxfzmJKHs47qu7pZRMG0y7KsgWj4SUaYn86a65WAu/5/wKcwiU/u5QEyUwKG06na/09VZYD8B3De2kADEYsO3/w6q3URW2/4hCsEbVSbp/zrrZsqIYVV1JHxgUpcYbCI9Ki0xEEeHToBgwXDTWUtWCyK5TlFSwKMMH8yamLleb1uOBhAelL1jR0sVb/oDNCoxac3PN22bPl5hSi4myON2hzg== X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-Network-Message-Id: 815d78ab-ade5-4402-afda-08df100becf1 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR03MB5469.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2026 13:52:31.6754 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: x2MGOUoLS0+ltT2PB6615IzSyjMkjt7vuNciQ4oe540Y8RFLY0E0r7KBvDdVT1+AO3xqCZyYFrS233H0pRYC9Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB989357 X-Proofpoint-GUID: dzXxA6j8bEPEMpF5nR_vz3myuL_CH8O4 X-Authority-Analysis: v=2.4 cv=DPMacCNb c=1 sm=1 tr=0 ts=6aa407a3 cx=c_pps a=SpR4UuZ//oCsNj7RudjQzw==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=M51BFTxLslgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=ugNRTJOwpmtT476g4l8T:22 a=gAnH3GRIAAAA:8 a=uQ-vNoSQ2MSKvHIBFvUA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfX1obXU4L06p6x kUQrCnZ/TtY/0XZnI8sPfjtGm9cnUOPbfsr986I5k8zqx4l9wRkVfOqEcDJAati2q1qHKs7sB9F CWwzmumJlWLBOPOmI2WgxOarTonuL4IfYlKWwCpsU4ZZdjcjdv5Y X-Proofpoint-ORIG-GUID: dzXxA6j8bEPEMpF5nR_vz3myuL_CH8O4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfXwL+DTYBsydN/ tBmH8G0YJzvVv9S3RYzKw8WEZN+9rD9zw4AUhDb50MBcj8+WUZOhqk1x1utgyAmRXBrQotuLvwB oieZkwXbM2kgVJHannvbwDxEg98hD6SD9rHeOGAlXbuyCn+0z1Ay5UQeWUjFyzSQs3Ysgyv4ldq 8RA/m0XVr891QXM2yMJDLhlzyXLu4uk6z9WdyCzwbZ+9k2K/8Sg4cwa5jWL34DCwVWFqrkjWec1 3YNnnIZgvRVzBwInAOku1fXvT2YNUnDiilVrtQfQ8xg+IZk/bWIZVoRlfgkjbui4iutD8UPq1vO 0gFnjjKVS+ijeZSEXe6+bvZ7yn7IQiYAib8jY20RcNrkz+l5M5tWUKCYA089K+s8HBSWE8iRA79 K5cw8iLP0+bDar3QCri4ZiYLYMhtkCA1PPAWv5uBwaARFPkhTF3JIgnzsdoyEaz67BBxEyCY4oH 6aGM4b51vog0MglqefA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-11_04,2026-09-11_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 phishscore=0 spamscore=0 malwarescore=0 impostorscore=0 suspectscore=0 clxscore=1015 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609110193 This is in preparation for adding support to a device which needs to use it's own read_block implementation. The MAX20826 family is one such device. When not in PMBus page mode, each of its two rails sits at a different I2C address, so selecting the rail cannot be done through pmbus_set_page() and has to be handled by the driver. Signed-off-by: Nuno S=C3=A1 --- drivers/hwmon/pmbus/pmbus.h | 7 +++++++ drivers/hwmon/pmbus/pmbus_core.c | 24 ++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/drivers/hwmon/pmbus/pmbus.h b/drivers/hwmon/pmbus/pmbus.h index 920c1102ab6d..5525c048a810 100644 --- a/drivers/hwmon/pmbus/pmbus.h +++ b/drivers/hwmon/pmbus/pmbus.h @@ -461,6 +461,13 @@ struct pmbus_driver_info { int (*read_byte_data)(struct i2c_client *client, int page, int reg); int (*read_word_data)(struct i2c_client *client, int page, int phase, int reg); + /* + * data_buf is at least I2C_SMBUS_BLOCK_MAX bytes long. The callback + * must never return more than I2C_SMBUS_BLOCK_MAX bytes of data and + * returns the number of bytes written into data_buf. + */ + int (*read_block_data)(struct i2c_client *client, int page, u8 reg, + char *data_buf); int (*write_byte_data)(struct i2c_client *client, int page, int reg, u8 byte); int (*write_word_data)(struct i2c_client *client, int page, int reg, diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_c= ore.c index 5f69c1420b4e..5104fd29307b 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -616,6 +616,26 @@ static int pmbus_read_block_data(struct i2c_client *cl= ient, int page, u8 reg, return pmbus_read_smbus_i2c_block_data(client, reg, data_buf); } =20 +/* + * _pmbus_read_block_data() is similar to pmbus_read_block_data(), but che= cks if + * a device specific mapping function exists and calls it if necessary. + */ +static int _pmbus_read_block_data(struct i2c_client *client, int page, u8 = reg, + char *data_buf) +{ + struct pmbus_data *data =3D i2c_get_clientdata(client); + const struct pmbus_driver_info *info =3D data->info; + int status; + + if (info->read_block_data) { + status =3D info->read_block_data(client, page, reg, data_buf); + if (status !=3D -ENODATA) + return status; + } + + return pmbus_read_block_data(client, page, reg, data_buf); +} + static struct pmbus_sensor *pmbus_find_sensor(struct pmbus_data *data, int= page, int reg) { @@ -761,7 +781,7 @@ static bool __maybe_unused pmbus_check_block_register(s= truct i2c_client *client, struct pmbus_data *data =3D i2c_get_clientdata(client); char data_buf[I2C_SMBUS_BLOCK_MAX + 2]; =20 - rv =3D pmbus_read_block_data(client, page, reg, data_buf); + rv =3D _pmbus_read_block_data(client, page, reg, data_buf); if (rv >=3D 0 && !(data->flags & PMBUS_SKIP_STATUS_CHECK)) rv =3D pmbus_check_status_cml(client); if (rv < 0 && (data->flags & PMBUS_READ_STATUS_AFTER_FAILED_CHECK)) @@ -3679,7 +3699,7 @@ static ssize_t pmbus_debugfs_block_read(struct file *= file, char __user *buf, char data[I2C_SMBUS_BLOCK_MAX + 2] =3D { 0 }; =20 scoped_guard(pmbus_lock, client) { - rc =3D pmbus_read_block_data(client, entry->page, entry->reg, data); + rc =3D _pmbus_read_block_data(client, entry->page, entry->reg, data); if (rc < 0) return rc; } --=20 2.55.0 From nobody Fri Sep 25 13:55:16 2026 Received: from mx0a-00128a01.pphosted.com (mx0a-00128a01.pphosted.com [148.163.135.77]) (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 CADAE2E7366; Fri, 11 Sep 2026 13:53:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.135.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134789; cv=fail; b=oQpbf+bM1IQzBvo1CNFMYCZiJEe/Ov2YZvRVGFDik0l16/ToFpLm1yYoGWEfGGZpOycwoApqnQom1KxiqCML5zctOjcBbmwAziyl6+ZQMUvxkoMCQQ6y6r0JYzofHHA7ZIUwuv4YNGQdkiyZMAmXESJ0QEe7iVr4Bu7NgMKTxbs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134789; c=relaxed/simple; bh=kp7jnPUKWeYnFIBx7h2DVTOSg6bNMd1kxhixBY/KuAM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Hp5A6a6ZzXbJ7NcfHlfgnvU0HQ/JjQ1oTrhyLyS2sHCTJVX0nX6/oIISjl+2565xfn/UKxK6Dlxu+cu9fza3hKftzv9pktLPi5EY3IdpzzwDh1qzwkK3N2aZtvoCLzGIn188dOxzyIC0O/KCQjsB1hbK81n5V3ZW8dv62Fnedq4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=f4l90O5F; arc=fail smtp.client-ip=148.163.135.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="f4l90O5F" Received: from pps.filterd (m0516787.ppops.net [127.0.0.1]) by mx0a-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68BCkvVA2608756; Fri, 11 Sep 2026 09:52:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=lCb8R kJrXe/DYDxkI+iX4djeaE5u6L/qAg92AC7zTyw=; b=f4l90O5FInhgYg1LwqDV7 i9/e+w39zagYwQdwfFKYn2jDLvE9WVpc779NNQyD2tF8sDMai/w+K6imcBS60QTu h0CP16i95T3vgDRMJUW3AiLBuchV86KXaHJzpDd/VlGTz21mD/nkgOMA0ikThFE9 cpgfZpJTL1EayZ84pLJIiyiW/YPAy0kjMQR4ZwkpplA0vVv0yXLtvBeNAflfG2WT Km3uFP/MvWW+92gfKAnYCH4wsMu4CIeNS45kmjGDFxt849ZtPaRVe/7P1t1bNdhR UR+yrBS8Hb4QwWhs9By+3BMnFUWxuOd0/+6VHzi01S87xdyDsQTm3iRDIQMv29Ey Q== Received: from mw6pr02cu001.outbound.protection.outlook.com (mail-westus2azon11012059.outbound.protection.outlook.com [52.101.48.59]) by mx0a-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcxd1che-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 11 Sep 2026 09:52:40 -0400 (EDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Vi1d3wMsay7QTtNygRweEgtWXFCqoshSadaygVZql2gXC/ad3xrXoGLf3c5lmYSJbLIl2dHUT2tGBXKtkGGBiBUUDERVWIk2gyGsjmEVqxGZv7/cSqqUxr39Zr99ach/97qoncfYcWpfVeFAKOniuQwJVWgaKAz9JmrOgWTQ4yYkh2il5KAIVbwOmrMfUQEHD129UzgU5YMgQehTY8jqH80dDjLQoPIJFrqVs7jAufDBt8SHC+R/d3MWLAIOLbdZUyBcQPs6Se1svc0I0PXhoGxEboIT49CrNiYrkvqHWmQQggjnq5V734nsEaboMMwdyE30hRY/oySjEt6RE87sqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=lCb8RkJrXe/DYDxkI+iX4djeaE5u6L/qAg92AC7zTyw=; b=Zi/YfP3EdkrSEczFUEEy/oX812qBuYfEk2gUpE/TXYcXQ2FIwfACKDqJMA4hPRvrVhGGUBX4m/ZE+jSd4SKiCDXBBorE4iEz8unytGzG6J9OM7f0OOt4WrVfPqOtzwS1B05KnxsYDncd4VQyLZOg3jFQwSd40g9l4L7aU+93pyrZXp3wUCCjhwX5XdqVsIHTKPaqCEAP5nMRBt224H1Ju2fRKDaPh8+HZ+uBfC5xJgwkHfDxT32DeoZb7ZsoR+fk8UuG2pKdmNL8LsRgko8HKLJUUggtTEoTl5iqSe4LpdPY+pp/xbp5dZaQPwGmqf4JA6wcrFsSiTroIGg1zSO+Xw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=analog.com; dmarc=pass action=none header.from=analog.com; dkim=pass header.d=analog.com; arc=none Received: from SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) by MWHPR03MB989357.namprd03.prod.outlook.com (2603:10b6:303:2a8::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Fri, 11 Sep 2026 13:52:36 +0000 Received: from SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a]) by SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a%6]) with mapi id 15.21.0406.007; Fri, 11 Sep 2026 13:52:35 +0000 From: =?utf-8?q?Nuno_S=C3=A1?= Date: Fri, 11 Sep 2026 14:53:39 +0100 Subject: [PATCH v2 3/4] dt-bindings: hwmon/pmbus: Document MAX20826 and similar devices Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260911-hwmon-max20826-support-v2-3-5e30cbd97d84@analog.com> References: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> In-Reply-To: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> To: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Cc: Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , Shuah Khan , Randy Dunlap , Alexis Czezar Torreno X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789134819; l=4881; i=nuno.sa@analog.com; s=20231116; h=from:subject:message-id; bh=kp7jnPUKWeYnFIBx7h2DVTOSg6bNMd1kxhixBY/KuAM=; b=6TxPAQPzplyxc/2Js/bV9jmzfnBnfmcgF7zWg3saK0THKgeSc1rYcmyoZ7I4wM69CUk61EiJP nLPyq4v+KVXDZdRv3jA2bG4xDy3+hTMuhwE0bkFSrmRvivCslKTaQ7c X-Developer-Key: i=nuno.sa@analog.com; a=ed25519; pk=3NQwYA013OUYZsmDFBf8rmyyr5iQlxV/9H4/Df83o1E= X-ClientProxiedBy: MR1P264CA0104.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:50::27) To SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR03MB5469:EE_|MWHPR03MB989357:EE_ X-MS-Office365-Filtering-Correlation-Id: d003f055-47a0-46ca-cfdf-08df100bef67 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|1800799024|376014|7416014|11063799006|56012099006|6133799003|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: i5vj2WeOCHvfn2YBC/clw+NiIQJPKux5wNFX9M3eSQCI5EjyuLF/0XiZ6ne9nOdKe3/ICn3Lh1rqw6RpaqKeDpMlgsYFliT/1D8aPDV140LZ6pMYnki+J5SaxMszmoLdRwtLt79fy7DFWpPM1fOO++XcXcTpRjQQAITlEuDPSFTAb10ypSSz9p7zobdsGN8GBlaXxG/OulUuAE89M0jE39ZBpogqlDbYL2cFiCikmoU36JaZ9FMuaMjIdMm9LsEqdq8V7cuQ5Bi4RTGTWPRpfbGr1mz+fx3orKF87TnSEUgzcm2grchc7dXpvhHPoZsc8CA5rZpA1tLyC+/wiv8wkpP0qp52AYcsTY2JtIVYLIt3X07Bpb96SRJ1tSXSkbl8OUQIPds4XV166eS78yT5hefPpDyLNkCjIgiE8eEBz7FHngHnMzxKdYkJXXmbWKeNS3CUW1biVPw/NaUfZ636FfqJm4nPp/Ll6sTD+bR55pgZq+yl0gH1r+prBhK0MqBni/dv2cJn38zp+ySwnwO1zCA/lip1AlT6eNlspXs5uPfykh9B/3NBF13y7jaUXlRYPLmM872IKAXNlAbz1dFHaO77KdlaoY0pscEqYkhvGAU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR03MB5469.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(1800799024)(376014)(7416014)(11063799006)(56012099006)(6133799003)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?d0g2NzVNZHc2SytWc0pqcWUyRDA5czhwWUQ1MmJJZ0pkdDBaMTE5RjVISm9D?= =?utf-8?B?VzZBQ3Q4RXJtYkxkRXNEVUZQMCszM016SExoYk5uZjhiNXlXNFo0Z2NheC9Q?= =?utf-8?B?NEwwWjBoOEdMWWhvams1a2d4aG54ajF6MS8xVXZqL29jQy9hUGY1dmtLdHNp?= =?utf-8?B?N2RTVUV4QUtNUTNtdllLUFFGb0d0TWp2WUdwUUR0YWYyRVpkbFNOR3hPejRZ?= =?utf-8?B?YVYzZFNZYTRZSi90TS8vbGxoc0VvUFlMNWtvcDNtRW5PTWhvN3NrcTE1VTMw?= =?utf-8?B?OE9jai9TMDZtZXVFbW9jdGJpTERQdURqNEZEZ3p5WG5naVlsTUxzSkdjaFgr?= =?utf-8?B?SFZQSkFGV2ZBUHNJZGNTWDlna3Jya2phZ09oMVZwZ0h3dFZrWGt6REhFZjdM?= =?utf-8?B?NlM2SlQ1U3FtL1RpWDB0UHM0SThOMlRoT1I1allWL2RKMnlkZ2pUUUhVcnZx?= =?utf-8?B?dm1wSUsra3pIMUdjMlVEbEhDeVFjaDlSYnczUkZHTk83TFZEMHRlOXFFek5n?= =?utf-8?B?SUc5L1dIT3ZkWnNLZEkrSEF0WGRqY1lacGJNY3FhbGNZOXhTOEdVMk92ODAy?= =?utf-8?B?VFVYOVZ2UWYzT0JQY2ZHeHNna0FtbVErSGhLeDltaW5jcWVhWGRrMld0NXdC?= =?utf-8?B?YldlT2hMV2N1aVNmNE50Q0dBcTVxQ1ZoZE5pbmlmQzlacW5WN0N4MGg5ZTdN?= =?utf-8?B?VW8yQ3IwcGFPM1hHR1AxVlRUT21mQjFQdlNUQWErZUNlTmxiMDRnVkhwclhk?= =?utf-8?B?RlpXNzhOYmJUeThZbU5PbjVDY2piUDZ5QmpiY3JObGdacDVyczRtZ1cyc0wx?= =?utf-8?B?enRkcU9xYU9qUFArYnQ4b0I4N3l6ZjIzSW9oazdSTnJDdHBjVXIyZmxNcjZF?= =?utf-8?B?Zm5kQXh1QXIxM1lWYWJiaDBYZGtnQTJDL2lyNUwzTHZhYVN3L20vQzVXYWJS?= =?utf-8?B?d2dhT3IyYzFGME0zb3RDeUNwcnVlQ0JmQ1MvUkdnVVVaVkUvRHlQTzVhYUNn?= =?utf-8?B?Q1JrTE56Vldjano0cTBub3hZOXhCUDUya0dBNklBcG52ZE5DN1Q0bW1OMjRo?= =?utf-8?B?NWV0b25Ya2hsRldMVVpLNFY4WklaVGp2SnZmTy8wMy9xNGw0enRYc09ka3BN?= =?utf-8?B?Y3diYS91N1RMSkwvLzVKeWZFekUvRG5OWXpHb3lhQVloYnJicnpjcTZpRHho?= =?utf-8?B?OWZJRGNVd1NYNmo1MVFMbEY0VFUrdlRnR3Z3WTVjem15UHFvM2hNT0xQSkQ2?= =?utf-8?B?SkxteHRDMkNPalRVejBnaW8wVnptNjZzTXZsRnJvMnRta3FGVGg4U2ZDTUdM?= =?utf-8?B?bEM5R3QrOXE5bkxuVXNTTFZKSlFocHVhWC9VcUZVeFd3VUdsdGxJT1ZwMkhh?= =?utf-8?B?aVV0Znk3b0lmbjdzclU2OS9FMXI0czEySk9xbjdneFBOY1huTC9rU2RpalE0?= =?utf-8?B?QW5XNEM2SHJDT3lZUnkzWVBPVitZaXQ4bG5pUyt4d0JvYUQ3NVRHKzRpcXdM?= =?utf-8?B?L1EveG8rWU9hc0Z4djc0ZVJyR2dtOWZrei8vWUxxQWt6dmdjYjdrSHQ1Y25m?= =?utf-8?B?cVoyajNYR1ZhVThmajNKOFZjNUNqL2xLTmM0WWtDMTY2Q0VGVjU4UjY3MFd0?= =?utf-8?B?YmF2aGFHaGJxSEZubWZlZUp2WC9Hd3FGY2hZSU9MY1JyOUVCNnJRWGRRbWgz?= =?utf-8?B?aEpNVFFTVnZjZWhkaU10ckRhUjdKOFBlNXJVVTUzY2EycjZqd0sxNGpQZ3dk?= =?utf-8?B?ZDdDVExqVVAwa2FkRVBySU1hd0UyYnlUS25uL3NnaGZzeng5YlZwNk96NWtx?= =?utf-8?B?WlJzazM3QXVxZnFlcDNoSXJqalFKTSs4cDMxVThXdXI5WEVDeU5xOHk5R3Ey?= =?utf-8?B?dllGdmdlQkxTUW9HdTlMRWRjbU45d2RmNXVHajlPalZ6NWYyWFdsWHV3TUpz?= =?utf-8?B?eS8ycXZBZm1PbTZtRlQzNWJjRVNMV0lmR1poUy83b25leGptck56V0dVaG9i?= =?utf-8?B?MHlHT2hXVXdVOWYxWWdpZThsSXpKQjB0NDhDUmY5MWd3dFg1MHpGVW9MUEJh?= =?utf-8?B?VVRQb3l0YlhqVnBOUThhUUtuRjV4MHMzNkVoZFlueVNRSGVKb3NSWHByNVU1?= =?utf-8?B?dkwzY0tGTVJLdXFIK0lkSVI2N3kyRzlYWldxMm9VOFI0K2liTm9JRS9QRUkx?= =?utf-8?B?NXYwTkVNUW4zM3dOU3h1UTJYd1pEK3dYblFIQVU1OUVZMVBFRFlOUlBjNklX?= =?utf-8?B?dXpxcEJUR09rbGdTYTZWcDJaSHlBekRiT3oxbHhLaDRnYjkrTEh5b25UenQw?= =?utf-8?B?R0o0QkYwYzF1bENNSloxOXRsNGlLaTN1WGpwQmI0SXZEcktIbzFmZz09?= X-Exchange-RoutingPolicyChecked: PpAMOYGKSQDjG2nVhWAdgdhBglkuf7uSSaUpO8Y5YZ6xJ+0e5cwmNWQ3GhlfN+idrJqG5fpkNvWM+QRYEwRLh95PCcgsNxrYb4QNWV3hZgxAVBFJQ1FYX9lVNUJxV+K3tccW3R1soSV066+O94tUr77PqHIg+PNPlTnHaZcC7fUq/Y6M7CUszcCcm+Q9BIyiFyutfYcP1ajO5l5x+ZOGvJa5we5/RrwPLM1hnt6S1fd0nEjneWB/WIJn/6mJUzOCAdCUualpbniKjg3Af9NFVrge22Y8qLxWzzqPQh+m7qpp4GNd7M7kD1fF2sS9BuufOJuG/QibJyW+xl9VGt1eDQ== X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-Network-Message-Id: d003f055-47a0-46ca-cfdf-08df100bef67 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR03MB5469.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2026 13:52:35.8510 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: MXX/K9kJjfRjhG7lR3BCSvRx1/n328ycUWA1jvefmgpEW7etCKsv5Tlz+bnYCQ7MRKRazggkqv48DeErVQSzhg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB989357 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfX7iie5e3MkY8Q NRWvxxWtWgYkslzQTFVGQboO7i62Z2axBiE3pop2B2v2FHYxdoqlRSNOqqqPxdGvk6+mLUHkKHQ M6M8/ZlxuorbiV0LboNSv19mV/jOF9Qz2znGJwx0lFw+6EZJBzfy0IfmdQp0OEq07P/aPrn6nYQ NuxRSWa8oHUZvAzEBwAs9ySkn93/EcnGomAPqLjaR2Jyx/FaH+Uj47cWUbpmDRNfibp30dn5gRj bVhsemT0C9o6lUZBwYCB6Cd9RFMYcFPEJoGQ2Jfkw0uuntn96a1fPGyoMuqfIejRwL3rlV0MaaT Fdkcumblqd8cOvaCOD39sBwZC6Kye5Y3qiK+HBBesKFJtzWQBmK4O/Y7GTqPANw7EYrfio+8Fka mJbWdA1V3KVnUCMOzzWlH+dpqwhrfiQC/s0gveekOzx90ZyLViY0xSuRmsjWBmTGim4NADALCRS LurmKgPuJAtlv8U5eQw== X-Authority-Analysis: v=2.4 cv=GoTXaU1C c=1 sm=1 tr=0 ts=6aa407a8 cx=c_pps a=rpDl8c4QES63uqz6MGSAyg==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=M51BFTxLslgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=OmVn7CZJonkx5R5zMQLL:22 a=gEfo2CItAAAA:8 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=lhhGCT_j3gHGGyJPvV0A:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=sptkURWiP4Gy88Gu7hUp:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfX2LDi+odRupq2 JLMAuSsuGEW0u50y+YBCtZ7p623DY8NlpXUu4wNs4qCNXos+pzpdITtYHMUADXjRYhhVbzCb1nM CbPnTexwbmNIhaY9P49rWcRBTmowsrm1THQAYAyjiqupbT0e2jid X-Proofpoint-GUID: v73KWG5M5USAOY5h5rz73v0rBayxCNXm X-Proofpoint-ORIG-GUID: v73KWG5M5USAOY5h5rz73v0rBayxCNXm X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-11_04,2026-09-11_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 phishscore=0 adultscore=0 priorityscore=1501 spamscore=0 clxscore=1015 impostorscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609110193 The MAX20826 IC and similar provide a high-density, flexible and scalable dual-loop solution for high current cores for AI applications. These are dual loop solutions multiphase voltage regulators. Between Rails A and B, MAX20855B and MAX20908 supports up to 8 phases total configurable from 8+0 to 4+4 phases, MAX20912 supports up to 12 phases from 12+0 to 6+6, and MAX20826 and MAX20916 supports up to 16 phases from 16+0 to 8+8. The output voltage of each rail is controlled either through PMBus or through the high-speed processor voltage-control interface (Intel SVID, AMD SVI3, Nvidia PWMVID or AVSBus, depending on the device). Which one is in use is part of the configuration the device powers up with and is read back from it, hence adi,rail-a-high-speed and adi,rail-b-high-speed only tell whether the high-speed interface or PMBus controls the output voltage of the respective rail. Co-developed-by: Alexis Czezar Torreno Signed-off-by: Alexis Czezar Torreno Signed-off-by: Nuno S=C3=A1 Acked-by: Conor Dooley --- .../bindings/hwmon/pmbus/adi,max20826.yaml | 102 +++++++++++++++++= ++++ MAINTAINERS | 7 ++ 2 files changed, 109 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/pmbus/adi,max20826.yam= l b/Documentation/devicetree/bindings/hwmon/pmbus/adi,max20826.yaml new file mode 100644 index 000000000000..e3bb51d6d1d6 --- /dev/null +++ b/Documentation/devicetree/bindings/hwmon/pmbus/adi,max20826.yaml @@ -0,0 +1,102 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/hwmon/pmbus/adi,max20826.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Analog Devices MAX20826 PMBus Voltage Regulator + +maintainers: + - Nuno S=C3=A1 + +description: + Analog Devices MAX20826 and similar devices are Dual-Output Multiphase + High-Current Controller. + +properties: + compatible: + enum: + - adi,max20826 + - adi,max20855b + - adi,max20908 + - adi,max20912 + - adi,max20916 + + reg: + maxItems: 1 + + vdd3p3-supply: + description: + 3.3V bias supply. It is the input of the internal 1.8V linear regula= tor + which supplies the controller. + + avren-gpios: + description: GPIO pin to enable/disable the output voltage on Rail A. + maxItems: 1 + + bvren-gpios: + description: GPIO pin to enable/disable the output voltage on Rail B. + maxItems: 1 + + adi,rail-a-high-speed: + type: boolean + description: + The output voltage of Rail A is controlled by the high-speed process= or + voltage-control interface the device powered up in (PWMVID, SVID, SV= I3 or + AVSBus). If not given, PMBus controls the output voltage of Rail A. + + adi,rail-b-high-speed: + type: boolean + description: + Same as adi,rail-a-high-speed but for Rail B. + + regulators: + type: object + description: + List of regulators provided by this controller. vout0 is Rail A and + vout1 is Rail B. + + patternProperties: + "^vout[0-1]$": + $ref: /schemas/regulator/regulator.yaml# + type: object + unevaluatedProperties: false + + additionalProperties: false + +required: + - compatible + - reg + - vdd3p3-supply + +additionalProperties: false + +examples: + - | + #include + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + regulator@64 { + compatible =3D "adi,max20826"; + reg =3D <0x64>; + + vdd3p3-supply =3D <&vdd3p3>; + + avren-gpios =3D <&gpio 0 GPIO_ACTIVE_HIGH>; + bvren-gpios =3D <&gpio 1 GPIO_ACTIVE_HIGH>; + + adi,rail-a-high-speed; + + regulators { + vout0 { + regulator-name =3D "vcore_a"; + }; + + vout1 { + regulator-name =3D "vcore_b"; + }; + }; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index 1fb5efb513f0..a8ae7af72099 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16004,6 +16004,13 @@ F: Documentation/devicetree/bindings/hwmon/pmbus/a= di,max17616.yaml F: Documentation/hwmon/max17616.rst F: drivers/hwmon/pmbus/max17616.c =20 +MAX20826 HARDWARE MONITOR CONTROLLER DRIVER +M: Nuno S=C3=A1 +L: linux-hwmon@vger.kernel.org +S: Supported +W: https://ez.analog.com/linux-software-drivers +F: Documentation/devicetree/bindings/hwmon/pmbus/adi,max20826.yaml + MAX20830 HARDWARE MONITOR DRIVER M: Alexis Czezar Torreno L: linux-hwmon@vger.kernel.org --=20 2.55.0 From nobody Fri Sep 25 13:55:16 2026 Received: from mx0b-00128a01.pphosted.com (mx0b-00128a01.pphosted.com [148.163.139.77]) (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 0E17D48A2C7; Fri, 11 Sep 2026 13:53:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.139.77 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134794; cv=fail; b=XYorGH4/InUgLGShGrlWOIWhpkfAUd+IKZ3VL4PAGkhxFQXxfuvIVjuMDz2/6ELbRxs9uGXzWpQtX8jhIF+m22PDadtLTLNeVl/FzDauS5ERPoo1Ryc2exs08hwjQLjerV1ohBExS+kU8HWiCyzlYr5kiSJg+y96NHpFyeytqT4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789134794; c=relaxed/simple; bh=5OrxfAy1nN4YLFEerIBK4C0KJWzjOtD1WxHfbBWIIWM=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=HkXJp4sHvI+2WLzDqb2AOTcn+2W+LNM/q9LtbTIAfP9ruGXFqItUgBnfY6p/CIyTTgkI3uDvHkjlkNI3cU+SkfWBwRkB4N5+QE99ie9K9AQXu8ibHlhydc96zVtA9jqIaAu1AT9Fi01RbHnUSEhaaQD+QdhyYFyRNWmyK1ZlI+I= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com; spf=pass smtp.mailfrom=analog.com; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b=bIYKv96+; arc=fail smtp.client-ip=148.163.139.77 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=analog.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=analog.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=analog.com header.i=@analog.com header.b="bIYKv96+" Received: from pps.filterd (m0167090.ppops.net [127.0.0.1]) by mx0b-00128a01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68BCj0iK458972; Fri, 11 Sep 2026 09:52:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=analog.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=DKIM; bh=1SbDk O1gYbEPz9uBIow3V58F7qp0S8aW1yqV26Vmhgs=; b=bIYKv96+DK7kvUNhEZDKX b0+nAqCyNGqBnPmewf7sUq92sZ9Xn6fUnMdM95qpSOJ+JrZKwZE5pkGf/CqeX9Fb IahBi8jFB/PF5Z8pF4iGPI2a0RNjq9PwH1WkYhOPXF50NeOaOnGgZboESuQ8Ve6p 3C1yOu08rhynhS93FG0eUb7hxL2NIcztoBF8H2ih/Ww78f7UVELtUzptx/SL6BX0 Cs4ktmV1OVg3fqsXUWo/bLZPE6Ttdw0gFN8Xeeqsd5DG9J79cMAa3P9ezR4NqEsO VGayQTvUdEVIRBaDFz+SoWq/i/7nxWHB7GzA2mkBW1AVo2TAusDd3l14Uu77XcHH g== Received: from mw6pr02cu001.outbound.protection.outlook.com (mail-westus2azon11012040.outbound.protection.outlook.com [52.101.48.40]) by mx0b-00128a01.pphosted.com (PPS) with ESMTPS id 4gkcx8qtme-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Fri, 11 Sep 2026 09:52:43 -0400 (EDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Orj0c45jIc8odK2q8uB89srrNAmQ/5owmaAiuTEu5d8SgLCcetQMpJlKhgtM30SsV5yV569U9rhi4pzrw4DC5Ej72qjOgNdupuEnn2SS2B/GUR/oCTER1yLwXiwrNM2wnfPvHSlQAGdUj7j7AbomASMr0TgKJfSxTTJJJhQTrO51dj5k8JsNTqA/ezANWYqvcNN/8xKtwfovPkfGo3e0BKBO7pigLgHVKYn/k4NwW/vqTvskrnD5F0xsRc379qH9lY8f89OSk/tAlwQwRzws45R5X7A0QWXL3JPVr6PakMJS0ovhxwu/uN2w3rnLIUWpw6xh33SmkVh9HPmsYgcxDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=1SbDkO1gYbEPz9uBIow3V58F7qp0S8aW1yqV26Vmhgs=; b=EjNUsEmjtCQpmQR63PbSWpqitiCa5LxdcLq1l6Pg530CzAYbyy103+FwjBHthGC+vDQ8hVImuxziSid4wG0Nb4Q0K6S0IMxdIQIx5Eh8GaVbPLGfzclPTvrrxgTfyOQiYmV7XdQYgkTRdn4S54fSYWR/EKUw/5kOWoZOOuc0YZ8Rc1N1TqHWum42gry/gzEgnhWc3LBLEiIGKhZoLpH0ki24uT1jSM5tLdG3xgkYNkXwS1lV4tUv0jf9b4xx4XE5eMLscekJmq5sL98CCebtG85/hpvWx1Z6me0MAlLTQBanVu4GDYsBWybYD3WUeOesgJRedYGUbLE5ytx1LsEgdQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=analog.com; dmarc=pass action=none header.from=analog.com; dkim=pass header.d=analog.com; arc=none Received: from SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) by MWHPR03MB989357.namprd03.prod.outlook.com (2603:10b6:303:2a8::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Fri, 11 Sep 2026 13:52:40 +0000 Received: from SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a]) by SJ0PR03MB5469.namprd03.prod.outlook.com ([fe80::2a19:76b2:e731:8c5a%6]) with mapi id 15.21.0406.007; Fri, 11 Sep 2026 13:52:40 +0000 From: =?utf-8?q?Nuno_S=C3=A1?= Date: Fri, 11 Sep 2026 14:53:40 +0100 Subject: [PATCH v2 4/4] hwmon: (pmbus) add support for MAX20826 and similar devices Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260911-hwmon-max20826-support-v2-4-5e30cbd97d84@analog.com> References: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> In-Reply-To: <20260911-hwmon-max20826-support-v2-0-5e30cbd97d84@analog.com> To: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-doc@vger.kernel.org Cc: Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jonathan Corbet , Shuah Khan , Randy Dunlap , Alexis Czezar Torreno X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789134819; l=38497; i=nuno.sa@analog.com; s=20231116; h=from:subject:message-id; bh=5OrxfAy1nN4YLFEerIBK4C0KJWzjOtD1WxHfbBWIIWM=; b=+cqqphdeaFYPTHmsQfX7OR/GvWILCv+TrJRx5+U+0h6U/pS619EoozGte9Soa9BjWfd8vdf6k MMYrapFZ7TnAFm7xaq8kwQ3E9utb2PQbwcUYyYKc9g9SrT8ESjbPzT+ X-Developer-Key: i=nuno.sa@analog.com; a=ed25519; pk=3NQwYA013OUYZsmDFBf8rmyyr5iQlxV/9H4/Df83o1E= X-ClientProxiedBy: MR1P264CA0143.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:51::22) To SJ0PR03MB5469.namprd03.prod.outlook.com (2603:10b6:a03:28a::17) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR03MB5469:EE_|MWHPR03MB989357:EE_ X-MS-Office365-Filtering-Correlation-Id: 1fe243ac-5822-453d-7153-08df100bf1db X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|366016|1800799024|376014|7416014|11063799006|56012099006|6133799003|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: QT7Rz5+PtNGxnBOqRuSxe4oO7fsUtbN7iGY9YzuNugnzJgrgu3LAvzK4xQ+gFArfG2ET3VAJWhLxzAHHANZ5imV+4hx5gWWu/dhNPiX9niHqU6LuRfKsF/q3IRrqJC8XB5brHQ9z7lpPj6P66kyxWDzSpbhS4hQpXYmI4xLlzqWP4DUxKM6EkAhkvRV3GC5Pmv5tX0fO/0yU00U1RYADyK3NsVbFgjQ3oRRBkUMm4m4Keb3vTjACun25E7YHd/ADo57X2Kq9WDiWjqSejUahbCVQy2NFPbMdNjccNyJI0ygv8DCiBT3CWNpmDoq8t5B0sULd8/Alw3uPlBr8kQLesrQj8jtHvOhjtPt/UaEKoopKJgSivT9vNJZRnyABo/TQHtXCPnkDB8Fy4/eF6cKDCPnTXrINiVTlMNMHuRXO+yl20jfsMST9DSyKwDBg0JhKnVtRxp4rhu9S/Xx5zMula/PWCqxduIZ9hqb2udULCEfTS/KM0le3cCY2qvdXyc8sq0zARaL5Lvcegm+cc382Ha8P5+tlB4Ibs/kMAM0kUX+w7WsUegiz/3EYJTpEqSMKe23mTp9LFL3lrZUN1zdSS2tpE1YkQlccx7a2AePYLaTV7m9fl+NKGF3cYn3WJjYS3Qujq8g7uyjNwi8RUCC7FAlbquUNYyACVF0qLoxTxhY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR03MB5469.namprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(1800799024)(376014)(7416014)(11063799006)(56012099006)(6133799003)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?OUVoUk9tYlVYY09oOC9IRmlueGV2MDVOV1FOMWhOUlB3TFQvVWRSenQxcW5V?= =?utf-8?B?NnFJbnJnaW1jUnk0MWJSRjFMaGVlNC9Gb3pMeDB0WEZvYlFxTUtVT25pRkdM?= =?utf-8?B?RE0rbUZTZlU4ZWtFdk5KTnVjcFl0d2FQeWkwNEtJcEM0alFsUFpDeFZzODRt?= =?utf-8?B?NlhmS3JuQzc3RzRzOCtKekNreGtkUFZKYjhLYktzcUFYL0NPelY3T1RtOFV5?= =?utf-8?B?VTNwcEVjWHB0NXdMcWF4WjhFL01FRU9Pa0ZpNjdpTVl2OVdEYnpmc2dXeTEr?= =?utf-8?B?blVvQTVUeVFQVzE1Mzk5a05vSVNOcUNHaC8xWTJTRFhPMFNKN2gzL2M5ajE3?= =?utf-8?B?ek5DZ25iVll6Y0xvbmZXeHJ3bUthQ0VadGY2SmdxUUlObG40VHo3NUQwUnA2?= =?utf-8?B?L2tqN2FWQjROdHJQSWRxNk1GN2NBWmd5WjF0SFJzdit6TUJvZ1BUVDhuTlVu?= =?utf-8?B?ODZBSTVoL09VRVpZSzZiak5tc0ZSSXdnWHpEbVIwNkc1Vmg0S2ZaeXh1Vkpa?= =?utf-8?B?WjQ2V3QxdzJDZHU3M3ExbEwzUDRNUFk2N2FZcjBFNXV6RExBZC9vZzJMUVd1?= =?utf-8?B?MW9idlB3SmwyWk1MUVREZjFSQ1JZU0ZRWGVTRmNJUEUzT20zRWJ2dkNVMUFN?= =?utf-8?B?bjdPRWJMaDh0LzkxYldWdWhvaXppRytESFZGd01ZSHRHUmNuUHJaTW9FVnlF?= =?utf-8?B?U3RGRC9uODdpY1d4Rnp6b2RZaVVEUlRtVjNheGhocjE0WWhLbStKU1RNWUdU?= =?utf-8?B?MEw1NWpVUUhwL0FsSk9meHBNbnBrc0puRkdqaGRFYmhSMWZkRUcwMXlsVUhM?= =?utf-8?B?eXB5czBXYWlpNXRGSGVrMzBabFErNlA1elVVRkJSWWVpOS9LQzZMZWl2aDBh?= =?utf-8?B?NWFQckdCbERQR2YrMTh2OHEvYXkzTmxXbVczcFRwdEJjY0dXZnI1UVRHU2hM?= =?utf-8?B?ZDFyUGl3aG91aUt1UlkvbDMrdXk0alJObWJ3YzFYZ0lFNTQyNmlhVnN4TnVW?= =?utf-8?B?b0FYa2JhSSsvclhLSXdCdEZTZDNiVUdMa0Q0enBDcThybGt4eW9lQUpqcnF1?= =?utf-8?B?Zll5VkFvV09raUF4SEJpRzF2Q21FT012azBacjN0RzhobDN0OXVhOG5RWFc5?= =?utf-8?B?OEpaYU5iVTlTWXJDc0pUcjlBbm0zbmV3MHlHcU9HZFlmUE5Eb1g0NE5HM2Ux?= =?utf-8?B?eDdhclJ1c2RKN2hGOVI0emJDTTJMRXMwckFYMytMNGVQdzhmSU9uUUtPTmpa?= =?utf-8?B?cUpiWVpUcGFwbThHK0FDenByNHZWVkphWThnaWdWTTlWZDNjeHh2cktUWkRw?= =?utf-8?B?Ky9HS1c1NE9lbUlCWmpVN3hteCtiWkRXVC9Mc1FFVERMSVU3aHUxNTdsSnZa?= =?utf-8?B?clU2VGpoK2ZXdlJFT3BTZVMvL3JIb2hlTHdWSmVtREZ4aG9EaitHNXZKYUJu?= =?utf-8?B?Q1BYTmlJKzdYMHhtSWFVcjJJbWNUTGFobkRlWm16WjZXeG0ybmNUUnlKMjMz?= =?utf-8?B?dlRsYlR1ZlVXR2xmYWpRelcrQXV2V0ZtanljR3c5b3M4Zk9RUVlOS0c4THI2?= =?utf-8?B?MTZ3RGlGQ0xBbW14UG5WNEhqV3lsUzNvWWVUMjZGOFo0ckZXNm0rc3pPTUUz?= =?utf-8?B?NmJDQXVOMWJ4OEZEWitwdXNzWWlscGtDNGRDbUlwQzlUMm5XRjZwNHBxNFNy?= =?utf-8?B?UVJhVGJMcit1VWpEYjZQMWE4NTEzYTV2cHFtR280b3NwSUxiTDBEOStIWGt3?= =?utf-8?B?RzlsSjBGUDRWb20vVzh6Tk8vaFV2QnBJTnVjSUNoQ1ZlcnhhTFRRYVZ3amZO?= =?utf-8?B?bCtvazR2TnNvWUttb21Td24xd0VVRVJ0dWM3dGU5Z1ozeXlPd0VFbHUvemRT?= =?utf-8?B?dFJQemNteDdmclA3Q0FqcnVsOEZabmZrekk3NUNrdkVkaEhkR1pqSUx4ekJa?= =?utf-8?B?YWNKTzBndlF5R3BsN25LM1RVQWVPSWM5UEdiR09jamVoaGMxQnNHcjJGL0F0?= =?utf-8?B?dWhPSUUzV0hFQjRQbUlBMGY3eWh6RkdvamhNN3QxMjZVUjRBYXBGODlwdktl?= =?utf-8?B?L3RGV1pONTRQNnpCTmZXOEtxVTVPRzdmSTNURWk3K2k1V3BkRDY1LzZ0UGJM?= =?utf-8?B?VmthTDRpbEF0U1pBeGhtR3JpTWx6aWYydHQzZUtYaUdFeUdPM1dUTVY1ZEp0?= =?utf-8?B?WTRxU1Z6dnowd0JWTFhsdVQyU0lOYVVoZU5xaStLNkJqVzQ5QWlBUW44dk5K?= =?utf-8?B?RjFERGZ4V1FsUHZmL2xMZmxKWGtsUUo4amUvOGhqQTc1cVdGRkRMWnRLWExX?= =?utf-8?B?OU5uQ0JrZEMwdkpidHhFOXNMeklDclFCb1BjT2Y5ZWZSaVkwYkhTdz09?= X-Exchange-RoutingPolicyChecked: q5JXNWFbWc0z8JSWlRUyUDasHvoOC6PMuw2DZjy6WMml6Nsz30Ts3qnQX+inK3khyHzA3fC8BR7pn4LYy89D7H+TUCZKwojqm8lCGmHkEd6nLOA8kKpq9D7R60JEuz2bnD2z2eJy9aB6136A8cpxCZJD0Crh44pcmSO4XyYzJL7yntjlLKjNEN9mgVKieGut9bW4/djAxqZIrkAnHPfHoV3IIKodStRh5A5tvEZNo3g1+oLR+IPGWtLKGUuna8IOm06AORl0h1dENuRPqPMwGziQuQbVdtdSNl5aTsrEXQ6vN9hX/UBj3r3LzJisUdksLunmY8pRODo66qPZAiwnDg== X-OriginatorOrg: analog.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1fe243ac-5822-453d-7153-08df100bf1db X-MS-Exchange-CrossTenant-AuthSource: SJ0PR03MB5469.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Sep 2026 13:52:40.1514 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: eaa689b4-8f87-40e0-9c6f-7228de4d754a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QsBzNSmlefXSmVcM8I2/Dfwz5hoMf0srbg84d8Q0OqLWZTbK3XjSdq8xLfCzx9IstksHQwZ7HnDpZnH0f24WYw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR03MB989357 X-Proofpoint-GUID: 8JcFrqVZuRNgW2KsVAKow2jl4vqUnHvE X-Authority-Analysis: v=2.4 cv=JaApPkKV c=1 sm=1 tr=0 ts=6aa407ac cx=c_pps a=utdtqqQbqC3rwi1NYZt6Rw==:117 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=z/mQ4Ysz8XfWz/Q5cLBRGdckG28=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=M51BFTxLslgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=0sLvza09kfJOxVLZPwjg:22 a=_jAD5XSDOtq9-5Nde2OG:22 a=gAnH3GRIAAAA:8 a=VwQbUJbxAAAA:8 a=pdorWlH7UUdCa_9Y6wQA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-ORIG-GUID: 8JcFrqVZuRNgW2KsVAKow2jl4vqUnHvE X-Proofpoint-Spam-Info: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfX31j1BPY9bOV5 c2NejtgjxqyJjvnOQRAfQrC+rGkO6RMZ9ce41F0cgDBYDpgfb1ZyiI8znyo7M6Hi2wUEm3JHbp3 m+LqdDs5KhqwSgUwXLzScm2AmWae92AWQ9DmUcEifBdHfvTH4AM5 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTExMDE5MyBTYWx0ZWRfXwgWzCWhXEau7 3bIu7HKxyc6NPyXh28SLjQD1GEMAIElAD1gjkCHkmEQGGiWrppoE1aJMp+3zZrJJrlRSGpNQOkS vWZfrjYT3kn/aMVRN+gLIc0Zbu5sgY5qI1ojOfzr5K/KAcjwt7vyLPqmEnHHXIWQjMDZ4/tNRmA XRmDthfx8znLdnvofEoDfpOuLZ2ZiEsfKEPqKWKtphfY4QcAW2+ZFNu7VNt+FOP7X2HRedVEwmK RcYi67v23cb6h67xOdr29OH7GP7zfE0wfiJQ5RKnYYk9m4sBRwkXkOFagtAlrc05AFlTzgY6+RT DdV54FiOTzPIWylHx50GwEJAx+ecE86KwHsGMvqnzftAfWZaejjYLrLXDC02vIgJ303kndMBqBZ 0lvVL0OznqIEI0tpl4/vjdkMrB30Z0MSLLtG+yl/d8G1jbNQJ96NKG4rghsaThGWDsPusAfz8fl f9Admo58rg1zuQmXchQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-11_04,2026-09-11_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 impostorscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609110193 The MAX20826 IC and similar provide a high-density, flexible and scalable dual-loop solution for high current cores for AI applications. These are dual loop solutions multiphase voltage regulators. Between Rails A and B, MAX20855B and MAX20908 supports up to 8 phases total configurable from 8+0 to 4+4 phases, MAX20912 supports up to 12 phases from 12+0 to 6+6, and MAX20826 and MAX20916 supports up to 16 phases from 16+0 to 8+8. Co-developed-by: Alexis Czezar Torreno Signed-off-by: Alexis Czezar Torreno Signed-off-by: Nuno S=C3=A1 --- Documentation/hwmon/index.rst | 1 + Documentation/hwmon/max20826.rst | 139 +++++ MAINTAINERS | 2 + drivers/hwmon/pmbus/Kconfig | 19 + drivers/hwmon/pmbus/Makefile | 1 + drivers/hwmon/pmbus/max20826.c | 1044 ++++++++++++++++++++++++++++++++++= ++++ 6 files changed, 1206 insertions(+) diff --git a/Documentation/hwmon/index.rst b/Documentation/hwmon/index.rst index 7ab9cfe71cee..21ad419fcbf1 100644 --- a/Documentation/hwmon/index.rst +++ b/Documentation/hwmon/index.rst @@ -167,6 +167,7 @@ Hardware Monitoring Kernel Drivers max197 max20730 max20751 + max20826 max20830 max20860a max31722 diff --git a/Documentation/hwmon/max20826.rst b/Documentation/hwmon/max2082= 6.rst new file mode 100644 index 000000000000..bcabbc64c039 --- /dev/null +++ b/Documentation/hwmon/max20826.rst @@ -0,0 +1,139 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Kernel driver max20826 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Supported chips: + + * Analog Devices MAX20826 + + Prefix: 'max20826' + + Addresses scanned: - + + Datasheet: Datasheet is not publicly available. + + * Analog Devices MAX20855B + + Prefix: 'max20855b' + + Addresses scanned: - + + Datasheet: Datasheet is not publicly available. + + * Analog Devices MAX20908 + + Prefix: 'max20908' + + Addresses scanned: - + + Datasheet: Datasheet is not publicly available. + + * Analog Devices MAX20912 + + Prefix: 'max20912' + + Addresses scanned: - + + Datasheet: Datasheet is not publicly available. + + * Analog Devices MAX20916 + + Prefix: 'max20916' + + Addresses scanned: - + + Datasheet: Datasheet is not publicly available. + +Author: + + - Nuno S=C3=A1 + + +Description +----------- + +This driver supports hardware monitoring for Analog Devices MAX20826, +MAX20855B, MAX20908, MAX20912, and MAX20916 multiphase voltage regulator +controllers with PMBus interface. + +The devices are dual-loop, multiphase controllers. Depending on the device= and +configuration, the high-speed processor voltage-control interface can be +Nvidia PWMVID, Intel SVID, AMD SVI3, or AVSBus. PMBus is used for monitori= ng, +configuration, status, and fault reporting. + +The driver detects whether the device uses PMBus page mode or direct addre= ss +mode. In direct address mode, rail B is accessed at the rail A I2C address= plus +one. If rail B is present, the driver exposes a second PMBus page. + +The driver detects the active number of phases and exposes per-phase input= and +output current attributes through the PMBus virtual phase support. + +Usage Notes +----------- + +This driver does not auto-detect devices. You will have to instantiate the +devices explicitly. Please see Documentation/i2c/instantiating-devices.rst= for +details. + +The optional ``avren`` and ``bvren`` GPIOs may be provided to control the = rail A +and rail B hardware enable pins. If regulator support is enabled, the rail= s are +also registered through the PMBus regulator framework. + +The source of the output voltage of each rail, i.e. either the high-speed +processor voltage-control interface or PMBus, is normally selected once, b= efore +the processor boots. Hence it is described in firmware with the +``adi,rail-a-high-speed`` and ``adi,rail-b-high-speed`` properties. If the +property is not given for a rail, PMBus controls its output voltage. + +Sysfs entries +------------- + +The following attributes are supported. Limits, alarms, and per-phase entr= ies +are exposed depending on device capabilities, rail configuration, and dete= cted +phase count. + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D +in1_label "vin" +in1_input Measured input voltage +in1_alarm Input voltage alarm +in[2-3]_label "vout[1-2]" +in[2-3]_input Measured output voltage +in[2-3]_alarm Output voltage alarm +currX_label "iinN", "iinN.P", "ioutN", or "ioutN.P" +currX_input Measured input/output current +currX_alarm Current alarm +powerX_label "pinN" or "poutN" +powerX_input Measured input/output power +temp[1-2]_input Measured temperature +temp[1-2]_alarm Temperature alarm +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D + +Notes +----- + +``N`` is the rail number, starting at 1. ``P`` is the phase number, starti= ng at +0. The exact ``currX`` indices depend on the number of present rails and o= n the +detected phase count. + +Debugfs entries +--------------- + +In addition to the entries provided by the PMBus core, the following entri= es are +available for debug purposes only. They are not part of any ABI and may ch= ange +or go away at any time. + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D +in[2-3]_high_speed_en Enable high-speed voltage-control interface +in_high_speed_bus Active high-speed voltage-control interface +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D + +``in[2-3]_high_speed_en`` is a per-rail read/write entry matching the stan= dard +hwmon voltage channels for the output rails. ``in2_high_speed_en`` control= s rail +A / ``vout1``. ``in3_high_speed_en`` controls rail B / ``vout2`` and is on= ly +present if rail B is detected. Writing 1 selects the high-speed voltage-co= ntrol +interface for that rail; writing 0 selects PMBus voltage control. + +``in_high_speed_bus`` is a read-only entry reporting the high-speed interf= ace +used by the device, for example ``Nvidia PWMVID``, ``Intel SVID``, ``AMD S= VI3``, +or ``AVSBus``. diff --git a/MAINTAINERS b/MAINTAINERS index a8ae7af72099..f64401e56e88 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -16010,6 +16010,8 @@ L: linux-hwmon@vger.kernel.org S: Supported W: https://ez.analog.com/linux-software-drivers F: Documentation/devicetree/bindings/hwmon/pmbus/adi,max20826.yaml +F: Documentation/hwmon/max20826.rst +F: drivers/hwmon/pmbus/max20826.c =20 MAX20830 HARDWARE MONITOR DRIVER M: Alexis Czezar Torreno diff --git a/drivers/hwmon/pmbus/Kconfig b/drivers/hwmon/pmbus/Kconfig index bcfdc4ce4c10..3289ab50a028 100644 --- a/drivers/hwmon/pmbus/Kconfig +++ b/drivers/hwmon/pmbus/Kconfig @@ -393,6 +393,25 @@ config SENSORS_MAX20751 This driver can also be built as a module. If so, the module will be called max20751. =20 +config SENSORS_MAX20826 + tristate "Analog Devices MAX20826 and similar devices" + help + If you say yes here you get hardware monitoring support for Analog + Devices MAX20826 and similar devices. + + This driver can also be built as a module. If so, the module will + be called max20826. + +config SENSORS_MAX20826_REGULATOR + bool "Regulator support for Analog Devices MAX20826 and similar devices" + depends on SENSORS_MAX20826 && REGULATOR + help + If you say yes here you get regulator support for Analog Devices + MAX20826 and similar sensors. + + This enables the MAX20826 to be used as a regulator device, + providing voltage control through the regulator framework. + config SENSORS_MAX20830 tristate "Analog Devices MAX20830 and compatibles" help diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile index e288fe72a437..e3fc23f88401 100644 --- a/drivers/hwmon/pmbus/Makefile +++ b/drivers/hwmon/pmbus/Makefile @@ -38,6 +38,7 @@ obj-$(CONFIG_SENSORS_MAX16601) +=3D max16601.o obj-$(CONFIG_SENSORS_MAX17616) +=3D max17616.o obj-$(CONFIG_SENSORS_MAX20730) +=3D max20730.o obj-$(CONFIG_SENSORS_MAX20751) +=3D max20751.o +obj-$(CONFIG_SENSORS_MAX20826) +=3D max20826.o obj-$(CONFIG_SENSORS_MAX20830) +=3D max20830.o obj-$(CONFIG_SENSORS_MAX20860A) +=3D max20860a.o obj-$(CONFIG_SENSORS_MAX31785) +=3D max31785.o diff --git a/drivers/hwmon/pmbus/max20826.c b/drivers/hwmon/pmbus/max20826.c new file mode 100644 index 000000000000..013a97189fde --- /dev/null +++ b/drivers/hwmon/pmbus/max20826.c @@ -0,0 +1,1044 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Hardware monitoring driver for Analog Devices MAX20826 PMBus device + * + * Copyright 2026 Analog Devices Inc. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pmbus.h" + +#define MAX20826_REG_RAIL_PHASE_CFG 0xB1 +#define MAX20826_REG_CTRL_MISC 0xCB +#define MAX20826_OPL_EN_MSK BIT(7) + +#define MAX20826_REG_VOUT_RES 0xDB +#define MAX20826_VOUT_RES_MSK BIT(7) + +#define MAX20855B_REG_VOUT_VRM 0xD1 +#define MAX20855B_REG_VOUT_VRM_MASK BIT(4) + +#define MAX20826_REG_C_MODEAB 0xDC +/* Byte 1 bits 7 and 6*/ +#define MAX20826_C_MODEAB_MASK GENMASK(15, 14) + +#define MAX20826_REG_ADDR_MODE 0xEC +#define MAX20826_PAGE_MODE_MSK BIT(7) +#define MAX20826_DIRECT_ADDR_MSK GENMASK(6, 0) + +#define MAX20826_REG_OVERRIDE 0xED +#define MAX20826_OVERRIDE_MASK BIT(7) + +#define MAX20826_REG_PHASE_DETECT 0xF3 +#define MAX20826_REG_PHASE_READ 0xF4 + +#define MAX20826_REG_STATUS_MON 0xF9 +#define MAX20826_PHASES_NUM_MASK GENMASK(7, 3) + +#define MAX20826_MAX_PAGES 2 +#define MAX20826_MAX_PHASES 16 +#define MAX20826_PHASES_PER_PAGE 8 +#define MAX20826_INTF_PWMVID 1 +#define MAX20826_INTF_AVSBUS 3 + +#define MAX20855B_PHASES_NUM_MASK GENMASK(7, 4) +#define MAX20855B_MAX_PHASES 8 +#define MAX20908_MAX_PHASES 8 +#define MAX20912_MAX_PHASES 12 +#define MAX20916_MAX_PHASES 16 + +struct max20826_chip_info { + const char *vendor_bus_name; + u8 max_phases; + unsigned int phase_num_mask; + u8 start_index_iin; + u8 start_index_iout; + bool is_reg_addr_mode_block; + bool is_vout_direct; + bool select_vrm; + bool has_avsbus; + bool has_opl; + u8 (*count_phases)(const u8 *config, int page); +}; + +struct max20826 { + const struct max20826_chip_info *chip_info; + struct pmbus_driver_info info; + struct i2c_client *client; + /* RAIL-B direct mode */ + struct i2c_client *client_b; + struct i2c_client *curr_client; + struct gpio_desc *avren; + struct gpio_desc *bvren; + bool vendor_bus; + bool high_speed[MAX20826_MAX_PAGES]; + bool on_off_ctrl[MAX20826_MAX_PAGES]; + bool opl_enabled[MAX20826_MAX_PAGES]; +}; + +struct max20826_debugfs_entry { + struct max20826 *st; + u8 page; +}; + +static u8 __max20826_count_phases(const u8 *config, int page) +{ + if (page) + return hweight8(config[4]); + + return hweight8(config[0]) + hweight8(config[1]) - + hweight8(config[4]); +} + +static u8 __max20855b_count_phases(const u8 *config, int page) +{ + if (page) + return hweight8(config[3] & 0x3F); + + return hweight8(config[0]) + hweight8(config[1] & 0x0F) - + hweight8(config[3] & 0x3F); +} + +static u8 __max20908_count_phases(const u8 *config, int page) +{ + if (page) + return hweight8(config[4]); + + return hweight8(config[0]) + hweight8(config[1] & 0xF0) - + hweight8(config[4]); +} + +static u8 __max20912_count_phases(const u8 *config, int page) +{ + if (page) + return hweight8(config[4]); + + return hweight8(config[0]) + hweight8(config[1] & 0xFC) - + hweight8(config[4]); +} + +#define to_max20826(p) container_of(p, struct max20826, info) + +enum { + RAIL_A, + RAIL_B, +}; + +static const struct regulator_desc __maybe_unused max20826_reg_desc[] =3D { + PMBUS_REGULATOR("vout", 0), + PMBUS_REGULATOR("vout", 1), +}; + +static struct i2c_client *max20826_select_rail(struct max20826 *st, + int page, bool probing) +{ + int ret; + + /* + * If in direct mode and we want RAIL_B (page 1) just return client_b. + * Otherwise, set the proper page (if page mode) and return RAIL_A. + */ + if (st->client_b) { + /* if 0xff just return the last client */ + if (page < 0) + return st->curr_client; + if (page) + st->curr_client =3D st->client_b; + else + st->curr_client =3D st->client; + + return st->curr_client; + } + + if (!probing) + ret =3D pmbus_set_page(st->client, page, 0xff); + else + ret =3D i2c_smbus_write_byte_data(st->client, PMBUS_PAGE, page); + if (ret < 0) + return ERR_PTR(ret); + + return st->client; +} + +static int max20826_rail_read_block_data(struct i2c_client *rail, u8 reg, + u8 *block, u8 min_len) +{ + int ret; + + ret =3D pmbus_read_smbus_i2c_block_data(rail, reg, block); + if (ret < 0) + return ret; + if (ret < min_len) + return -EIO; + + return ret; +} + +static int __max20826_read_block_data(struct max20826 *st, int page, u8 re= g, + u8 *block, u8 min_len) +{ + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return max20826_rail_read_block_data(rail, reg, block, min_len); +} + +static int __max20826_read_byte_data(struct max20826 *st, int page, int re= g) +{ + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return i2c_smbus_read_byte_data(rail, reg); +} + +static int __max20826_write_byte_data(struct max20826 *st, int page, int r= eg, + u8 value) +{ + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return i2c_smbus_write_byte_data(rail, reg, value); +} + +static int __max20826_read_word_data(struct max20826 *st, int page, int re= g) +{ + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return i2c_smbus_read_word_data(rail, reg); +} + +/* + * @rail is the already selected rail client and is only given during prob= e, + * where the PMBus core cannot be used yet. Otherwise, pass NULL and let t= he + * core dispatch through our own read_byte_data()/write_byte_data() callba= cks, + * which take care of selecting the rail. + */ +static int max20826_set_high_speed(struct max20826 *st, struct i2c_client = *rail, + u8 page, bool high_speed) +{ + u8 reg, mask, val; + int ret; + + if (st->vendor_bus) { + reg =3D MAX20826_REG_OVERRIDE; + mask =3D MAX20826_OVERRIDE_MASK; + val =3D high_speed ? 0 : FIELD_PREP(MAX20826_OVERRIDE_MASK, 1); + } else { + reg =3D PMBUS_OPERATION; + mask =3D PB_OPERATION_CONTROL_V_SRC; + val =3D high_speed ? FIELD_PREP(PB_OPERATION_CONTROL_V_SRC, MAX20826_INT= F_AVSBUS) : 0; + } + + if (!rail) { + ret =3D pmbus_update_byte_data(st->client, page, reg, mask, val); + } else { + ret =3D i2c_smbus_read_byte_data(rail, reg); + if (ret < 0) + return ret; + + ret =3D i2c_smbus_write_byte_data(rail, reg, (ret & ~mask) | val); + } + + if (ret) + return ret; + + st->high_speed[page] =3D high_speed; + + return 0; +} + +static int max20826_read_curr(struct max20826 *st, int page, int phase, in= t reg) +{ + u8 val_out[I2C_SMBUS_BLOCK_MAX], start_byte; + struct i2c_client *rail; + int ret; + + if (phase =3D=3D 0xff) + return __max20826_read_word_data(st, page, reg); + + /* + * On Rail_A phases are ascending (from 1) while on RAIL_B they + * are descending (from 16). + */ + if (!page) + phase +=3D 1; + else + phase =3D st->chip_info->max_phases - phase; + + /* phase detect and read are only available on RAIL_A */ + rail =3D max20826_select_rail(st, RAIL_A, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + ret =3D i2c_smbus_write_byte_data(rail, MAX20826_REG_PHASE_DETECT, phase); + if (ret < 0) + return ret; + + /* + * For MAX20826: Byte 2:3 is for phase IOUT 4:5 is for phase IIN. + * For other chips: Byte 0:1 is for phase IOUT 2:3 is for phase IIN. + */ + if (reg =3D=3D PMBUS_READ_IIN) + start_byte =3D st->chip_info->start_index_iin; + else + start_byte =3D st->chip_info->start_index_iout; + + ret =3D max20826_rail_read_block_data(rail, MAX20826_REG_PHASE_READ, + val_out, start_byte + 2); + if (ret < 0) + return ret; + + return get_unaligned_le16(&val_out[start_byte]); +} + +static int max20826_read_word_data(struct i2c_client *client, int page, + int phase, int reg) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + + switch (reg) { + case PMBUS_READ_IIN: + case PMBUS_READ_IOUT: + return max20826_read_curr(st, page, phase, reg); + case PMBUS_IOUT_OC_FAULT_LIMIT: + if (!st->chip_info->has_opl || !st->opl_enabled[page]) + return __max20826_read_word_data(st, page, reg); + return -EIO; + case PMBUS_POUT_OP_FAULT_LIMIT: + /* + * If Over Power Limit is enabled, PMBUS_IOUT_OC_FAULT_LIMIT + * shows the power limit and hence we need to report it + * properly in Watts. + */ + if (!st->chip_info->has_opl) + return __max20826_read_word_data(st, page, reg); + + if (st->opl_enabled[page]) + return __max20826_read_word_data(st, page, + PMBUS_IOUT_OC_FAULT_LIMIT); + return -EIO; + default: + if (reg >=3D PMBUS_VIRT_BASE) + return -EOPNOTSUPP; + return __max20826_read_word_data(st, page, reg); + } +} + +static int max20826_write_word_data(struct i2c_client *client, int page, + int reg, u16 word) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return i2c_smbus_write_word_data(rail, reg, word); +} + +static int max20826_regulator_do_enable(struct max20826 *st, + struct i2c_client *rail, u8 page, + u8 byte) +{ + /* + * If AVSBus is enabled (bits 5 and 4 set) the device refuses to set bit + * 7 of the OPERATION register. Hence, to workaround this, we first + * clear the bits and then set them all together. + */ + if (st->chip_info->has_avsbus && !st->vendor_bus && st->high_speed[page] = && + PB_OPERATION_CONTROL_ON & byte) { + u8 __byte =3D byte & ~(PB_OPERATION_CONTROL_V_SRC | PB_OPERATION_CONTROL= _ON); + int ret; + + ret =3D i2c_smbus_write_byte_data(rail, PMBUS_OPERATION, __byte); + if (ret < 0) + return ret; + } + + return i2c_smbus_write_byte_data(rail, PMBUS_OPERATION, byte); +} + +static int max20826_regulator_enable(struct max20826 *st, int page, u8 byt= e) +{ + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + if (page) + gpiod_set_value_cansleep(st->bvren, !!(PB_OPERATION_CONTROL_ON & byte)); + else + gpiod_set_value_cansleep(st->avren, !!(PB_OPERATION_CONTROL_ON & byte)); + + return max20826_regulator_do_enable(st, rail, page, byte); +} + +static int max20826_write_byte_data(struct i2c_client *client, int page, + int reg, u8 byte) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + + switch (reg) { + case PMBUS_OPERATION: + return max20826_regulator_enable(st, page, byte); + default: + return __max20826_write_byte_data(st, page, reg, byte); + } +} + +static int max20826_write_byte(struct i2c_client *client, int page, u8 byt= e) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + struct i2c_client *rail; + + rail =3D max20826_select_rail(st, page, false); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + return i2c_smbus_write_byte(rail, byte); +} + +static int max20826_regulator_enabled(struct max20826 *st, int page) +{ + struct gpio_desc *gpio =3D page ? st->bvren : st->avren; + int on, ret; + + if (gpio) { + on =3D gpiod_get_value_cansleep(gpio); + if (on < 0) + return on; + } else { + /* If the gpios are not given, just assume it's on */ + on =3D 1; + } + + ret =3D __max20826_read_byte_data(st, page, PMBUS_OPERATION); + if (ret < 0) + return ret; + + if (st->on_off_ctrl[page]) + on =3D (PB_OPERATION_CONTROL_ON & ret) && on; + + ret &=3D ~PB_OPERATION_CONTROL_ON; + return ret | FIELD_PREP(PB_OPERATION_CONTROL_ON, on); +} + +static int max20826_iout_status(struct max20826 *st, int page) +{ + int status; + + status =3D __max20826_read_byte_data(st, page, PMBUS_STATUS_IOUT); + if (status < 0 || !st->chip_info->has_opl) + return status; + + /* + * If Over power limit is on, the fault condition is still set on the OC + * bit + */ + if (st->opl_enabled[page] && (status & PB_IOUT_OC_FAULT)) + return status | PB_POUT_OP_FAULT; + + return status; +} + +static int max20826_read_byte_data(struct i2c_client *client, int page, in= t reg) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + + switch (reg) { + case PMBUS_OPERATION: + return max20826_regulator_enabled(st, page); + case PMBUS_STATUS_IOUT: + return max20826_iout_status(st, page); + default: + return __max20826_read_byte_data(st, page, reg); + } +} + +static int max20826_read_block_data(struct i2c_client *client, int page, u= 8 reg, + char *data_buf) +{ + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + + switch (reg) { + case PMBUS_MFR_ID: + case PMBUS_MFR_MODEL: + return __max20826_read_block_data(st, page, reg, data_buf, 16); + case PMBUS_MFR_REVISION: + return __max20826_read_block_data(st, page, reg, data_buf, 2); + case PMBUS_MFR_DATE: + return __max20826_read_block_data(st, page, reg, data_buf, 8); + default: + return -EOPNOTSUPP; + } +} + +static struct pmbus_driver_info max20826_default_info =3D { + .pages =3D 1, + .func[0] =3D PMBUS_HAVE_VIN | PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | + PMBUS_PHASE_VIRTUAL, + .format[PSC_VOLTAGE_IN] =3D linear, + .format[PSC_VOLTAGE_OUT] =3D direct, + .format[PSC_TEMPERATURE] =3D linear, + .format[PSC_CURRENT_IN] =3D linear, + .format[PSC_CURRENT_OUT] =3D linear, + .format[PSC_POWER] =3D linear, + .m[PSC_VOLTAGE_OUT] =3D 2, + .R[PSC_VOLTAGE_OUT] =3D 3, + .write_byte_data =3D max20826_write_byte_data, + .write_byte =3D max20826_write_byte, + .read_byte_data =3D max20826_read_byte_data, + .read_word_data =3D max20826_read_word_data, + .write_word_data =3D max20826_write_word_data, + .read_block_data =3D max20826_read_block_data, +#if IS_ENABLED(CONFIG_SENSORS_MAX20826_REGULATOR) + .num_regulators =3D 1, + .reg_desc =3D max20826_reg_desc, +#endif +}; + +static int max20826_detect_addr_mode(struct max20826 *st) +{ + u8 val_buf[I2C_SMBUS_BLOCK_MAX]; + struct device *dev =3D &st->client->dev; + int ret, val; + + /* + * The idea is that after a POR, we are in page0 in which case we can + * read MAX20826_REG_ADDR_MODE. If we fail to read + * MAX20826_REG_ADDR_MODE, it might be due to a soft reset or unbinding + * the device in which case the device could be left in page 1. Hence, + * let's just try to change to page 0 and error out if we can't. + * + * OTOH, if the addressing mode is direct, we should be able to + * read MAX20826_REG_ADDR_MODE. If not, we'll fail setting the page. + * + * REG_ADDR_MODE, MAX20855B has 6 bytes, other devices have 1. Byte 3 is + * the equivalent of the single byte of the others. + */ + if (st->chip_info->is_reg_addr_mode_block) + val =3D max20826_rail_read_block_data(st->client, + MAX20826_REG_ADDR_MODE, + val_buf, 3); + else + val =3D i2c_smbus_read_byte_data(st->client, MAX20826_REG_ADDR_MODE); + + if (val < 0) { + ret =3D i2c_smbus_write_byte_data(st->client, PMBUS_PAGE, 0); + if (ret < 0) + return dev_err_probe(dev, ret, + "Failed to change to page 0\n"); + + /* try again! */ + if (st->chip_info->is_reg_addr_mode_block) + val =3D max20826_rail_read_block_data(st->client, + MAX20826_REG_ADDR_MODE, + val_buf, 3); + else + val =3D i2c_smbus_read_byte_data(st->client, + MAX20826_REG_ADDR_MODE); + if (val < 0) + return dev_err_probe(dev, val, + "Failed to read MAX20826_REG_ADDR_MODE\n"); + } + + if (st->chip_info->is_reg_addr_mode_block) + val =3D val_buf[2]; + + if (val & MAX20826_PAGE_MODE_MSK) + return 0; + + /* + * If in direct mode, rail b will be accessible from the addr of RAIL_A + * +1 + */ + st->client_b =3D devm_i2c_new_dummy_device(dev, st->client->adapter, + st->client->addr + 1); + if (IS_ERR(st->client_b)) + return PTR_ERR(st->client_b); + + return 0; +} + +static int max20826_set_vout_interface(struct max20826 *st, + struct i2c_client *rail, u8 page) +{ + static const char * const props[MAX20826_MAX_PAGES] =3D { + "adi,rail-a-high-speed", + "adi,rail-b-high-speed", + }; + bool high_speed; + int ret; + + /* + * Rail A 0xDC_1[7:6] sets the operating mode for both rails, so only look + * at it once. + */ + if (page =3D=3D RAIL_A) { + if (st->chip_info->has_avsbus) { + ret =3D i2c_smbus_read_word_data(st->client, + MAX20826_REG_C_MODEAB); + if (ret < 0) + return ret; + + if (FIELD_GET(MAX20826_C_MODEAB_MASK, ret) =3D=3D MAX20826_INTF_PWMVID) + st->vendor_bus =3D true; + } else { + st->vendor_bus =3D true; + } + } + + high_speed =3D device_property_read_bool(&st->client->dev, props[page]); + + return max20826_set_high_speed(st, rail, page, high_speed); +} + +static int max20826_detect_phases(struct max20826 *st, struct i2c_client *= rail, + struct pmbus_driver_info *info, u8 page, + u8 expected) +{ + u8 status_mon[I2C_SMBUS_BLOCK_MAX]; + int ret, ret2 =3D 0, oper_save =3D -1; + u8 n_phases; + + /* + * In order to detect the number of phases, we need to be regulating. + * It is also assumed we're already in the page we want to detect the + * phases. + * + * If the vendor high speed interface controls the output voltage, the + * enable state is not ours to control (it is given by that interface + * together with the AVREN/BVREN pins) and writing PMBUS_OPERATION is a + * no-op, so just assume the rail is already regulating. + */ + if (!st->vendor_bus || !st->high_speed[page]) { + ret =3D i2c_smbus_read_byte_data(rail, PMBUS_OPERATION); + if (ret < 0) + return ret; + + if (!(ret & PB_OPERATION_CONTROL_ON)) { + oper_save =3D ret; + ret =3D max20826_regulator_do_enable(st, rail, page, + ret | PB_OPERATION_CONTROL_ON); + if (ret < 0) + return ret; + } + } + + ret =3D max20826_rail_read_block_data(rail, MAX20826_REG_STATUS_MON, + status_mon, 2); + if (ret < 0) + goto out_restore_oper; + + n_phases =3D field_get(st->chip_info->phase_num_mask, status_mon[1]); + if (n_phases !=3D expected) { + ret =3D dev_err_probe(&st->client->dev, -EIO, + "Number of phases mismatch: expected=3D%u, detected=3D%u\n", + expected, n_phases); + goto out_restore_oper; + } + + info->phases[page] =3D n_phases; + for (unsigned int phase =3D 0; phase < n_phases; phase++) + info->pfunc[phase] =3D PMBUS_HAVE_IOUT | PMBUS_HAVE_IIN; + +out_restore_oper: + if (oper_save >=3D 0) + ret2 =3D max20826_regulator_do_enable(st, rail, page, oper_save); + + return ret < 0 ? ret : ret2; +} + +static int max20826_get_rail_config(struct max20826 *st, + struct i2c_client *rail, u8 page) +{ + u8 ctrl_misc[I2C_SMBUS_BLOCK_MAX]; + int ret; + + /* + * Check if we need to control PMBUS_OPERATION in addition to the + * CONTROL pin. + */ + ret =3D i2c_smbus_read_byte_data(rail, PMBUS_ON_OFF_CONFIG); + if (ret < 0) + return ret; + + st->on_off_ctrl[page] =3D !!(ret & PB_ON_OFF_CONFIG_OPERATION_REQ); + + /* + * See if Over Power Limit is enabled. This will impact how + * OC_FAULT_LIMIT is handled. + */ + if (st->chip_info->has_opl) { + ret =3D max20826_rail_read_block_data(rail, MAX20826_REG_CTRL_MISC, + ctrl_misc, 1); + if (ret < 0) + return ret; + + st->opl_enabled[page] =3D !!(ctrl_misc[0] & MAX20826_OPL_EN_MSK); + } + + return 0; +} + +static int max20826_setup_vout_format(struct max20826 *st) +{ + struct pmbus_driver_info *info =3D &st->info; + struct i2c_client *rail; + int ret; + + if (st->chip_info->is_vout_direct) { + u8 vout_res[I2C_SMBUS_BLOCK_MAX]; + + rail =3D max20826_select_rail(st, RAIL_A, true); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + ret =3D max20826_rail_read_block_data(rail, MAX20826_REG_VOUT_RES, + vout_res, 2); + if (ret < 0) + return ret; + + /* check for 1 mv/LSB */ + if (MAX20826_VOUT_RES_MSK & vout_res[1]) + info->m[PSC_VOLTAGE_OUT] =3D 1; + + return 0; + } + + st->info.format[PSC_VOLTAGE_OUT] =3D vid; + for (unsigned int page =3D 0; page < info->pages; page++) { + if (!st->chip_info->select_vrm) { + /* only vr12 in this case */ + st->info.vrm_version[page] =3D vr12; + continue; + } + + rail =3D max20826_select_rail(st, page, true); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + ret =3D i2c_smbus_read_byte_data(rail, MAX20855B_REG_VOUT_VRM); + if (ret < 0) + return ret; + + if (ret & MAX20855B_REG_VOUT_VRM_MASK) + st->info.vrm_version[page] =3D vr13; + else + st->info.vrm_version[page] =3D vr12; + } + + return 0; +} + +static int max20826_setup(struct max20826 *st) +{ + struct pmbus_driver_info *info =3D &st->info; + u8 config[I2C_SMBUS_BLOCK_MAX], expected_phases; + struct device *dev =3D &st->client->dev; + struct i2c_client *rail; + int ret; + + ret =3D max20826_detect_addr_mode(st); + if (ret < 0) + return ret; + + ret =3D max20826_set_vout_interface(st, st->client, RAIL_A); + if (ret < 0) + return ret; + + ret =3D max20826_rail_read_block_data(st->client, + MAX20826_REG_RAIL_PHASE_CFG, + config, 5); + if (ret < 0) + return ret; + + /* + * If we have phases in RAIL_B, we need to subtract them on config[1] as + * those bits are also set in case RAIL_B has phases. + */ + expected_phases =3D st->chip_info->count_phases(config, RAIL_A); + ret =3D max20826_detect_phases(st, st->client, info, RAIL_A, + expected_phases); + if (ret < 0) + return ret; + + ret =3D max20826_get_rail_config(st, st->client, RAIL_A); + if (ret < 0) + return ret; + + /* Let's see if RAIL_B is present */ + rail =3D max20826_select_rail(st, RAIL_B, true); + if (IS_ERR(rail)) + return PTR_ERR(rail); + + /* Let's see if there's something on RAIL_B */ + st->bvren =3D devm_gpiod_get_optional(dev, "bvren", GPIOD_OUT_HIGH); + if (IS_ERR(st->bvren)) + return PTR_ERR(st->bvren); + + ret =3D max20826_set_vout_interface(st, rail, RAIL_B); + if (ret < 0) + return ret; + + expected_phases =3D st->chip_info->count_phases(config, RAIL_B); + ret =3D max20826_detect_phases(st, rail, info, RAIL_B, expected_phases); + if (ret < 0) + return ret; + + if (info->phases[RAIL_B]) { + info->pages =3D MAX20826_MAX_PAGES; + info->func[RAIL_B] =3D PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | + PMBUS_HAVE_IIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | + PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP | + PMBUS_HAVE_STATUS_INPUT | PMBUS_HAVE_PIN | PMBUS_HAVE_POUT | + PMBUS_PHASE_VIRTUAL; + + if (IS_ENABLED(CONFIG_SENSORS_MAX20826_REGULATOR)) + info->num_regulators =3D 2; + + ret =3D max20826_get_rail_config(st, rail, RAIL_B); + if (ret < 0) + return ret; + } + + ret =3D max20826_setup_vout_format(st); + if (ret < 0) + return ret; + + if (info->pages =3D=3D 1) { + /* + * In this case we can be left in RAIL_B and given that we on + * only have one page, pmbus_set_page() will refuse to comeback + * to RAIL_A which is obviously problematic. Hence, let's just + * select RAIL_A here. + */ + rail =3D max20826_select_rail(st, RAIL_A, true); + if (IS_ERR(rail)) + return PTR_ERR(rail); + } + + return 0; +} + +static int max20826_high_speed_en_get(void *arg, u64 *val) +{ + const struct max20826_debugfs_entry *entry =3D arg; + + *val =3D entry->st->high_speed[entry->page]; + + return 0; +} + +static int max20826_high_speed_en_set(void *arg, u64 val) +{ + const struct max20826_debugfs_entry *entry =3D arg; + struct max20826 *st =3D entry->st; + + guard(pmbus_lock)(st->client); + + return max20826_set_high_speed(st, NULL, entry->page, !!val); +} +DEFINE_DEBUGFS_ATTRIBUTE(max20826_high_speed_en_fops, + max20826_high_speed_en_get, + max20826_high_speed_en_set, "%llu\n"); + +static int max20826_high_speed_bus_show(struct seq_file *s, void *data) +{ + struct device *dev =3D s->private; + struct i2c_client *client =3D to_i2c_client(dev); + const struct pmbus_driver_info *info =3D pmbus_get_driver_info(client); + struct max20826 *st =3D to_max20826(info); + + seq_printf(s, "%s\n", st->vendor_bus ? st->chip_info->vendor_bus_name : "= AVSBus"); + + return 0; +} + +static void max20826_init_debugfs(struct max20826 *st) +{ + struct device *dev =3D &st->client->dev; + struct dentry *dir; + + dir =3D pmbus_get_debugfs_dir(st->client); + if (!dir) + return; + + for (unsigned int page =3D 0; page < st->info.pages; page++) { + struct max20826_debugfs_entry *entry; + char name[32]; + + entry =3D devm_kzalloc(dev, sizeof(*entry), GFP_KERNEL); + if (!entry) + return; + + entry->st =3D st; + entry->page =3D page; + + scnprintf(name, sizeof(name), "in%u_high_speed_en", page + 2); + debugfs_create_file_unsafe(name, 0644, dir, entry, + &max20826_high_speed_en_fops); + } + + debugfs_create_devm_seqfile(dev, "in_high_speed_bus", dir, + max20826_high_speed_bus_show); +} + +static int max20826_probe(struct i2c_client *client) +{ + struct max20826 *st; + int ret; + + st =3D devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL); + if (!st) + return -ENOMEM; + + st->client =3D client; + memcpy(&st->info, &max20826_default_info, sizeof(st->info)); + + st->chip_info =3D i2c_get_match_data(client); + if (!st->chip_info) + return -EINVAL; + + st->avren =3D devm_gpiod_get_optional(&client->dev, "avren", GPIOD_OUT_HI= GH); + if (IS_ERR(st->avren)) + return PTR_ERR(st->avren); + + ret =3D max20826_setup(st); + if (ret) + return ret; + + ret =3D pmbus_do_probe(client, &st->info); + if (ret) + return ret; + + max20826_init_debugfs(st); + + return 0; +} + +static const struct max20826_chip_info chip_info_max20826 =3D { + .vendor_bus_name =3D "Nvidia PWMVID", + .max_phases =3D MAX20826_MAX_PHASES, + .phase_num_mask =3D MAX20826_PHASES_NUM_MASK, + .start_index_iin =3D 4, + .start_index_iout =3D 2, + .is_vout_direct =3D true, + .has_avsbus =3D true, + .has_opl =3D true, + .count_phases =3D __max20826_count_phases, +}; + +static const struct max20826_chip_info chip_info_max20855b =3D { + .vendor_bus_name =3D "Intel SVID", + .max_phases =3D MAX20855B_MAX_PHASES, + .phase_num_mask =3D MAX20855B_PHASES_NUM_MASK, + .start_index_iin =3D 2, + .start_index_iout =3D 0, + .is_reg_addr_mode_block =3D true, + .select_vrm =3D true, + .count_phases =3D __max20855b_count_phases, +}; + +static const struct max20826_chip_info chip_info_max20908 =3D { + .vendor_bus_name =3D "AMD SVI3", + .max_phases =3D MAX20908_MAX_PHASES, + .phase_num_mask =3D MAX20826_PHASES_NUM_MASK, + .start_index_iin =3D 2, + .start_index_iout =3D 0, + .count_phases =3D __max20908_count_phases, +}; + +static const struct max20826_chip_info chip_info_max20912 =3D { + .vendor_bus_name =3D "AMD SVI3", + .max_phases =3D MAX20912_MAX_PHASES, + .phase_num_mask =3D MAX20826_PHASES_NUM_MASK, + .start_index_iin =3D 2, + .start_index_iout =3D 0, + .count_phases =3D __max20912_count_phases, +}; + +static const struct max20826_chip_info chip_info_max20916 =3D { + .vendor_bus_name =3D "AMD SVI3", + .max_phases =3D MAX20916_MAX_PHASES, + .phase_num_mask =3D MAX20826_PHASES_NUM_MASK, + .start_index_iin =3D 2, + .start_index_iout =3D 0, + .count_phases =3D __max20826_count_phases, +}; + +static const struct i2c_device_id max20826_id[] =3D { + { "max20826", (kernel_ulong_t)&chip_info_max20826 }, + { "max20855b", (kernel_ulong_t)&chip_info_max20855b }, + { "max20908", (kernel_ulong_t)&chip_info_max20908 }, + { "max20912", (kernel_ulong_t)&chip_info_max20912 }, + { "max20916", (kernel_ulong_t)&chip_info_max20916 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, max20826_id); + +static const struct of_device_id max20826_of_match[] =3D { + { .compatible =3D "adi,max20826", .data =3D &chip_info_max20826 }, + { .compatible =3D "adi,max20855b", .data =3D &chip_info_max20855b }, + { .compatible =3D "adi,max20908", .data =3D &chip_info_max20908 }, + { .compatible =3D "adi,max20912", .data =3D &chip_info_max20912 }, + { .compatible =3D "adi,max20916", .data =3D &chip_info_max20916 }, + { } +}; +MODULE_DEVICE_TABLE(of, max20826_of_match); + +static struct i2c_driver max20826_driver =3D { + .driver =3D { + .name =3D "max20826", + .of_match_table =3D max20826_of_match, + }, + .probe =3D max20826_probe, + .id_table =3D max20826_id, +}; +module_i2c_driver(max20826_driver); + +MODULE_AUTHOR("Nuno S=C3=A1 "); +MODULE_DESCRIPTION("PMBus driver for MAX20826"); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("PMBUS"); --=20 2.55.0