From nobody Sat Jul 25 02:43:53 2026 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FD20339853 for ; Mon, 20 Jul 2026 11:20:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546448; cv=none; b=YbyISqwhyk9ToBLUwARahmtRznX+WIO5Y7szUxHvmuEhFqxAkUw5E20l5zbGDunaBEFfQXd7aw4T45DKwI4ATSiGnLWwx02q74zcBttrKpWDcWZGlhxw+tUYEH/AXZ5eu6MXIQYg68bL67Y5lJwFWLxS1SCapucFyFP6+BGoUmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546448; c=relaxed/simple; bh=Jo3R2o9/Tnmp5FshmLaLSUQe0IPLv37pQ7a5x0AQ+Ao=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WJPERFpqRVouCVYq0yjz+M9S5/yEeG/mo7iutYg7+XyqlxxYS4DaV5r+LXLYiRCM6Mts8fnIBbv4Ja6IWYGbE3Wxz4N0JhADav2D45TcWmNmazseFzyTllhF/Gs4AaX7WauDl3N0F1CB1yIhx7kPPc3qcvvbTg0wiJiiLkbWpWo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=MTjwykVQ; arc=none smtp.client-ip=209.85.221.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="MTjwykVQ" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-47f752b3423so831407f8f.3 for ; Mon, 20 Jul 2026 04:20:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784546445; x=1785151245; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=kvVoV3t9T4UO6MI6QVPWj93aCOdJhDbhrgyYg5VNsyA=; b=MTjwykVQgAhokFSybuXbFXZcX0XTdz5oOMpD5SeWlEMummS6H48TctvndnfDOWGr3s CL7BAzqau4r+FJE5w8zHdgWSpelKbkqX8tXi+fCkkFjMHZlvIcHGKVNYy1FvIJ3XgTFI 4dnnPTACULlTdWiiLGT2lh3fG0c6P5/CnyhStwRFkuqhOcb4YblLbVhqZz6nESde/cfU wkYD+VDJCL9zIAlUn2Qm1NagprC0F2Ta4jtfA0EHJLMmkiuzc5lJpV7EOMBkA1TasFZM opPt5Bvdy4ygKOzu3da4A1b044dXxhelXIseqDLQuyNjmovlrsUMeeZ2gUFKexMuvr+Q UolQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784546445; x=1785151245; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=kvVoV3t9T4UO6MI6QVPWj93aCOdJhDbhrgyYg5VNsyA=; b=aY5Y9Sxml0xx/rqcDJHDbBGRRIhU5rT+pLFSRn/ZMDnQ+eU2S0dk0sllOKRxRDr4CD uOyqo96sFLgU3Si16sJTpL/ikrnvv4ZLrwuu//zkiOUyG3eRyCCRnNsgtU1RyGV/cFF4 tviuTorcgxEE/7EynICCT20blYCy7ypXmB5+PceR4LGN7Hj03ercKsrOew3+ZTCxvd/S GH+36c5EhVxVUvGzPVIbhcCsTEzVOS+I95QvHq1TerxN6caylF+zyzCLb12fYIZoph7E vOdZvu5afnJxvrwTwOBWooSW4ZmngCKCCLP3G1tJ8eXnuvwVmEoA7dFbPXSIWsASbZtm 4deA== X-Forwarded-Encrypted: i=1; AHgh+RpYpxePsVbA25Qnv3KSwjyE51u4lpzhPri24UqWaTG8KkiebA1RtHewGmAhvg2JZx/hYiy9+1kslqVWmlE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+yyvRGmScVo2O8zWVCILBTcI8BmrJ8PMMynTwpmpVCIcCcyhb S7DUKDnwD3CHW7cQ1CJoYcitQuyZbLx0T4Zjt8oHEV/kq41LxKV/zHlp77XhAiD1oUI= X-Gm-Gg: AfdE7clyZ0w4dscYvxyEi22jPVWSKu/s9zSIxTBCNMx12Dq9Ozk1kgb3j41l5E+YSEu LhDIpTQeaOiMTHqj6H+C5/TQRbMqhDDW12D1jlNLzhvdmjzsFNz7hP9csZMfDBwWpd9NztUGXVJ XfD1aWisZjvyyreRwPs8OMxB2OIPE4EwsitOd90N8asPn2nsA9WshEutSFGFkmA6WmmkfIDU8KY 1XZBUKzvGDBSS1gynyc8xwSyTLgtvhrd2gU0IVTWjA8XcQUkrRxBMLwSw2/yx2O/H65yKkoxZvV OMJZVadY7NGmSaVyeFCmlj2ecHKmSF+a08kZtFJt3D2sz3ReT2E+qtXJTxhYYzUjTpnkQ+8OYcU 8g2hcF1qAktcKxQhtxEmgCbmzbqcQx9Vyd6vZAIH9Ot/235mhTwxdrQldN1e8Ta0xodl1X2nDrx aHLbFVxgWL16s= X-Received: by 2002:a05:600c:1906:b0:495:58fc:ec0e with SMTP id 5b1f17b1804b1-49558fcf831mr69599285e9.23.1784546444980; Mon, 20 Jul 2026 04:20:44 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:f341:e28f:dde9:3687]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-47f63ee0086sm31384218f8f.30.2026.07.20.04.20.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jul 2026 04:20:44 -0700 (PDT) From: Jerome Brunet Date: Mon, 20 Jul 2026 13:20:28 +0200 Subject: [PATCH v5 1/5] mfd: axp20x: Constify axp313 and axp717 cells Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-axp318-regulator-v5-1-a1afa7ee24f9@baylibre.com> References: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> In-Reply-To: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> To: Andre Przywara , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Jerome Brunet X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1118; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=Jo3R2o9/Tnmp5FshmLaLSUQe0IPLv37pQ7a5x0AQ+Ao=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqXgSE4rHFGsiEJPqcuzjdUv6Ve0f143KQcVKxA 6NziW/1nd6JAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCal4EhAAKCRDm/A8cN/La hY59D/9ZUb9UHzWFmyX11oaQ5IsN38sGXK76v6+9Ghlm/H9peJ2uvIrpdI2F5kxkRM5+jV0qSYJ ZOH4gBhAqkr9Bo4fvKnLA46gfF+2c5iCXFAV5Vce741FltPUrGTxvxq1gPAgavJ6KPO9iF6JE/F WvfEYxND4QfonLsLiFwC88fT1kGlW4g/c00LC6GYvK9WKvVq0YKjcvnQctEjVgYExhjMhIurnFs D9oECVeiyFbtMO3Iaz8JcfzYEtQZqpPzXFxn2Ql97apGoC/yuy8sEUuxj9WN0yz+TkTsl9wMmy/ vf3rQRXtGbmMkZ/2NWvzQUv8ReZr7MVlvIJGp5CRTdgRcA710/4h8yYdUvxVzxmacT52Sshk0hT MFb6HdexEOzfGtfEMv2iYVwe+zdttB31lbNHAt3Ua9EAAwRBYRltYVWxBhC9HWXhfQKtCL7MoBS CYCgqQfNwDVvZNwfaJt11Mjax2BSd2FzCRYyWWISTVRf9tlqG7AnjsLCdtMFWRhtt4TJBzytVK7 K4mGhFVjV6ZNcXPFJXStJisMoz+LcHoqZVwAnU+OS3F1GwvjI+/NDuQbI/TyXLAM82/diHbEDjf rNRc/UNhSCWJ3V7iPaC4PREAD2Y7zmCrHK6lDqfyBcvZJjIlBE0zdqTtpxS3kTd3d94cl/+0hW/ LouChJvuc5ul7Vg== X-Developer-Key: i=jbrunet@baylibre.com; a=openpgp; fpr=F29F26CF27BAE1A9719AE6BDC3C92AAF3E60AED9 mfd_cells array should generally be const and there does not seem to be anything against it for the axp313 and axp717. Constify the mfd_cells array for the axp313 and axp717 to be consitent with the other supported chips Signed-off-by: Jerome Brunet Acked-by: Chen-Yu Tsai --- drivers/mfd/axp20x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 679364189ea5..22baab6e10fa 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -1055,13 +1055,13 @@ static const struct mfd_cell axp152_cells[] =3D { }, }; =20 -static struct mfd_cell axp313a_cells[] =3D { +static const struct mfd_cell axp313a_cells[] =3D { /* AXP323 is sometimes paired with AXP717 as sub-PMIC */ MFD_CELL_BASIC("axp20x-regulator", NULL, NULL, 0, 1), MFD_CELL_RES("axp313a-pek", axp313a_pek_resources), }; =20 -static struct mfd_cell axp717_cells[] =3D { +static const struct mfd_cell axp717_cells[] =3D { MFD_CELL_NAME("axp20x-regulator"), MFD_CELL_RES("axp20x-pek", axp717_pek_resources), MFD_CELL_OF("axp717-adc", --=20 2.47.3 From nobody Sat Jul 25 02:43:53 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BDD2F33B97A for ; Mon, 20 Jul 2026 11:20:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546450; cv=none; b=d3y5FnqNNM1foV8c74EQRgdZbnzv22eBSkKgtfvD/YFSm7qdoJP1wFOfIKDVvsFWCq8zX+kManRLhdGSG9158+Toa+UX8GgUOhO9XI1jsT8Lo36CvgFIbsTxZZcT1HutLji+9N2VUy0HJSbwcPf19Dr7TzpBhBDDDiop8iowcz0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546450; c=relaxed/simple; bh=IIUZtjYeAgjkjY+KiecPS6RBNf9bht5M1+J2u9CKmR4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ET0+oTYv3GmZGurJGtC9odYr2RKwxaYcVCdJr2YnliM7ZIaT4LpXatw9zmkfIrWmvDOM5BouwjQ0Ks1NZxvWOvhNnh8SbLty/JEUYsw6CQVKpUlQar4fQ/oHJWE2yQSrQeratU/SEK3DpgYWJoV0CVxMjfr3Nw6pr+S1cXuYOKU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=O01jBJSw; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="O01jBJSw" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-493f75f7172so78394605e9.1 for ; Mon, 20 Jul 2026 04:20:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784546447; x=1785151247; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=2WuKp07RnT3lHFLt+YLF1Nf5rGNaEWONm2LTrQxfq48=; b=O01jBJSwVtddleGAabDZUwwCb7/0V34sYYEH3lPq82CZX6AL3or1Mutfpl9zt/hhAn z0dvCxjLJ97O2bVGdOedmEMi7aVt7p/ZiXkNUyiIcnINBbMD2Q4jaRtqCiJhSANDD+TJ 028k+TufyWourJ7vCkSYj2ZvGEA4pRDaBvMSQf1cNkySpIVKCnZc2q0e55MN06eDwfzc NKsPepit2o22+0fa/DzHr34Zjzn1b8Kjg/9MAcGnGqTc/6jUrsiiPBz++xP1IgvGUuqP OAt1eE/740MOoze0E38AEaGEWX41DaAKH3r1oHhuATsuygSceDpnOhGVPUjLM0fxVYkn i1WQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784546447; x=1785151247; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=2WuKp07RnT3lHFLt+YLF1Nf5rGNaEWONm2LTrQxfq48=; b=mZj1OvY6xf+Jb1V1GUtB9SGyJI7c2DtxkiCfBL94+Wg5iddFXEGjZZE2vv3id7Y2ka dNY8jbWnDTo9XEPLlaD7QMXnwlCq2DJDjPIwGUMhDCAEDUDt717dEpVX1PQvuKywi4YC Rgx3LJkFN0uxBGl7PyakeVAjBVfLMj4TYVVfRrMcN7ralmyCALUqS99vvkG1vjTW9Obe xAkdVPePGLGth2e9Gzyh9SKxpA9PSRO0i8X39414Ms87PiWKWzMoQ3pjQ+jwsFHzARkf /OYwdrff/o9XC9bJ0c4B7a+rtXPsG0Km0F1KKITGEK9JYsKzoD6wGM6lqcQFq3jEPfRz AAqA== X-Forwarded-Encrypted: i=1; AHgh+RqydfNU5B6z5s4e9UApjBlM763rkcdxRZi9J3hCqdgyhkC1YERlgoZgcJr8zT2URkaMryQF2S+rjo/pB1M=@vger.kernel.org X-Gm-Message-State: AOJu0YywquDN4BU3Iri5eeoIYw1GOPGBIzfxVgol33Z5qXYdlNOLO9m7 rhvU+fvTIx91mLCeye6taP/p5JhZfw8PkNafgru4NVdpty7gY66jPMlIjWQSu0Uo+Ck= X-Gm-Gg: AfdE7cnevf9mSWIsqVJOoz7Y6qmMY1xiJ76fzob7I5cyWy5muBPS7wjMA2GDk++9Q8e j8mHTLYjKzDOmdb8NVCNQBuHOWMUJSm1OJ5+p65wafAmwDa5m79TBSFvd0J97wrezFr8BzuTNtw TWxUp09SJR0YzuVLpQ3kUA9Pm9VOKBdoOIXTvulsXEwGyFYDa9oLlkpSTOEZ8/eLzHpeYWzExNy S2axpAWnwDlSP0XyWIRQ4zPvngYELzcQ051frnVb47Qt5kTfSlkUJBPLNF6eMKgEBJHAR1wXzBw JAtT6JZY+ZwQZLyeaiEP36wtvJSldGSsW4XKTmPv1XNH5beNndgJONy5gCF3TKiP0Rs9SUnL7Dw ffcvqxSoVvKNG1GQN03FRH5fOnYz92/iZmNqTKz/Y/AibVcIqjhxCPctKZ0vi8CyvEXU+esPPE7 io X-Received: by 2002:a05:600c:4585:b0:492:437a:a653 with SMTP id 5b1f17b1804b1-4954a50b811mr143084395e9.26.1784546446969; Mon, 20 Jul 2026 04:20:46 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:f341:e28f:dde9:3687]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-47f6b85970esm23123632f8f.15.2026.07.20.04.20.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jul 2026 04:20:46 -0700 (PDT) From: Jerome Brunet Date: Mon, 20 Jul 2026 13:20:29 +0200 Subject: [PATCH v5 2/5] mfd: axp20x-i2c: Fix i2c instantiation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-axp318-regulator-v5-2-a1afa7ee24f9@baylibre.com> References: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> In-Reply-To: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> To: Andre Przywara , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Sashiko , Jerome Brunet X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3805; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=IIUZtjYeAgjkjY+KiecPS6RBNf9bht5M1+J2u9CKmR4=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqXgSFmd849so+EGCWmUof27RJS162c4uQgBjDD m49MxrIlVOJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCal4EhQAKCRDm/A8cN/La hWqiEACojaHK8APs2Bfkw12iMRe3hoTT8Y5pPt8HuVNSfqtzFwybA6SQ3+MjXbqrUvwHCS5xHCD NY7lJ724BZQ8R2QEpNg2Od0/ttz56u6hYjwjssRy13qpORE1H1Ybhh+fCaIY0loHrkUR0CGuoAU SeSH7L1S751bIeXvmudhndv5aBY+Jfnl+4nNHv7LH+ptUHU8exZiMCycGqpe937+GhHkXZcuRi+ EsnFEb8njLdS2O9KeZy93sYNPrGOTFis67mA+9GuoPStItuBF5W/eCTsm3AudNadOYEesAfZKeu KvQR+xuwS1fo3sN5ZE4vV53rgJiq/mzIoKyOKIsg5jKCu4c/piTTCf7nNsw3jeLiiucKl5XEChU bsKkKGIsIUdZAduEIxgPolEn3HyrnbP3Tr1Qssnih7N9VmvKvCSY5YTkiRKidyBm4W0TsrmyT9N B2kvQp3FJpM+JVyITxC/NvOWevHl+IgKJaz2WFmJQGEtW/MuS9C6gm96fl/FhDb6+cAaD2HoXAj fWwlWNfcK4ZumFz0rw9HSx7KS/kJsKoWGOmbKTfOFBAqoGdXOlaV7zxp+vBGlO2SwKGbB8dleaE aPSuzDgz4HYrMJuN3S1NBsCR7Qn/dIbRmQLzrBZU6n9RZv7vRhhMMQ7Ev6I+Mv/QPXyCfI4eNJU vqyRJf7Xym2HJVQ== X-Developer-Key: i=jbrunet@baylibre.com; a=openpgp; fpr=F29F26CF27BAE1A9719AE6BDC3C92AAF3E60AED9 Apparently this device never really supported i2c instantiation via sysfs, because the driver does not even look at the i2c driver, which are not set. It would only probe if the device matched through DT. Fix that for correctness, even-though it is probably useless. Add the missing AXP323 while at it. Reported-by: Sashiko Closes: https://lore.kernel.org/r/20260717090209.2A09B1F000E9@smtp.kernel.o= rg Fixes: 41751b033aaa ("mfd: axp20x-i2c: Add i2c-ids to fix module auto-loadi= ng") Signed-off-by: Jerome Brunet Acked-by: Chen-Yu Tsai --- drivers/mfd/axp20x-i2c.c | 24 +++++++++++++----------- drivers/mfd/axp20x-rsb.c | 1 + drivers/mfd/axp20x.c | 1 - include/linux/mfd/axp20x.h | 3 +-- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c index 5c93136f977e..a76bec5604c4 100644 --- a/drivers/mfd/axp20x-i2c.c +++ b/drivers/mfd/axp20x-i2c.c @@ -35,6 +35,7 @@ static int axp20x_i2c_probe(struct i2c_client *i2c) axp20x->irq =3D i2c->irq; dev_set_drvdata(axp20x->dev, axp20x); =20 + axp20x->variant =3D (kernel_ulong_t)i2c_get_match_data(i2c); ret =3D axp20x_match_device(axp20x); if (ret) return ret; @@ -76,17 +77,18 @@ MODULE_DEVICE_TABLE(of, axp20x_i2c_of_match); #endif =20 static const struct i2c_device_id axp20x_i2c_id[] =3D { - { "axp152" }, - { "axp192" }, - { "axp202" }, - { "axp209" }, - { "axp221" }, - { "axp223" }, - { "axp313a" }, - { "axp717" }, - { "axp803" }, - { "axp806" }, - { "axp15060" }, + { .name =3D "axp152", .driver_data =3D AXP152_ID }, + { .name =3D "axp192", .driver_data =3D AXP192_ID }, + { .name =3D "axp202", .driver_data =3D AXP202_ID }, + { .name =3D "axp209", .driver_data =3D AXP209_ID }, + { .name =3D "axp221", .driver_data =3D AXP221_ID }, + { .name =3D "axp223", .driver_data =3D AXP223_ID }, + { .name =3D "axp313a", .driver_data =3D AXP313A_ID }, + { .name =3D "axp323", .driver_data =3D AXP323_ID }, + { .name =3D "axp717", .driver_data =3D AXP717_ID }, + { .name =3D "axp803", .driver_data =3D AXP803_ID }, + { .name =3D "axp806", .driver_data =3D AXP806_ID }, + { .name =3D "axp15060", .driver_data =3D AXP15060_ID }, { } }; MODULE_DEVICE_TABLE(i2c, axp20x_i2c_id); diff --git a/drivers/mfd/axp20x-rsb.c b/drivers/mfd/axp20x-rsb.c index 059656f2a1bd..8fdc870c1fe4 100644 --- a/drivers/mfd/axp20x-rsb.c +++ b/drivers/mfd/axp20x-rsb.c @@ -35,6 +35,7 @@ static int axp20x_rsb_probe(struct sunxi_rsb_device *rdev) axp20x->irq =3D rdev->irq; dev_set_drvdata(&rdev->dev, axp20x); =20 + axp20x->variant =3D (kernel_ulong_t)device_get_match_data(axp20x->dev); ret =3D axp20x_match_device(axp20x); if (ret) return ret; diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 22baab6e10fa..84839d4aa1ca 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -1267,7 +1267,6 @@ int axp20x_match_device(struct axp20x_dev *axp20x) const struct mfd_cell *cells_no_irq =3D NULL; int nr_cells_no_irq =3D 0; =20 - axp20x->variant =3D (long)device_get_match_data(dev); switch (axp20x->variant) { case AXP152_ID: axp20x->nr_cells =3D ARRAY_SIZE(axp152_cells); diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index b352661d99a1..1badb4868d17 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -997,8 +997,7 @@ static inline int axp20x_read_variable_width(struct reg= map *regmap, /** * axp20x_match_device(): Setup axp20x variant related fields * - * @axp20x: axp20x device to setup (.dev field must be set) - * @dev: device associated with this axp20x device + * @axp20x: axp20x device to setup (.dev and variant fields must be set) * * This lets the axp20x core configure the mfd cells and register maps * for later use. --=20 2.47.3 From nobody Sat Jul 25 02:43:53 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9111233E348 for ; Mon, 20 Jul 2026 11:20:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546452; cv=none; b=tj3T7SbIVf8tWv2hdYf8xviUAI8CvnVffR8B1C8AMe8+wBfwrwkxXBCGn8BlQVK7QzLdQkFEet5PTAzW9r3+vQuc11tO65syY0IhGdrtRGqYLpnOwPXQQw0KYdMR0jcmwXoAhkIEg3PL7u311s1K6VhVn9L9aKGY1aevGclch48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546452; c=relaxed/simple; bh=HNKPooQDA/uxDpi0iVReus05wyumo6SSu/JRjgFGHnI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OSXkPr2kLyF1hli0WVSd/LIP+zFGLRAaIhOrPHg4juEVNj4OqOoB/JgGDQLCtg0PjhTnK9S9SSqKMMmGN+AI51hlRM5v5dTRbSBCZVEetMbz7Wf+xCz25mNMdWjjKpBZKdzqzK99E7HKAHGa2oklVSbDcZjgJVeKZgsVBJgA1MY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=EM8H1SiZ; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="EM8H1SiZ" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-490cf322ed0so69778195e9.1 for ; Mon, 20 Jul 2026 04:20:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784546449; x=1785151249; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=sMG++y6EWSQXnyGqXgGD2YHD3WKXzWPkbseer/BOl7g=; b=EM8H1SiZD3rEm5/GFucs4yhmtj+4JRCF1GuxJvC9CrvhF4C/qeP8Unt5GCQkEgCNCu D+qx244m73iRbiS5aLxrnBXC3vok9w04VtHLYEvBt2utQx4nS63kHgR9G/BBzR0mYdoO S3aZyetiiTlcs/hP177fM9lJof9FaAONyC6vgMNJo7GSJJKsrEewqiBviHqvRXY2pZi9 d8/XeFIBOLSY8GExJ4IWwtqhCaTr/obW8jWEtoXVyGGqS8D5LqggwBL/SJeCoY1MGPBM wfd/0+bo0qwAIDryF7JC8XsUbO9XsApAdnEXgVabIwcfzr7NOUeNcqrHhF5823/FHjzO uAuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784546449; x=1785151249; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=sMG++y6EWSQXnyGqXgGD2YHD3WKXzWPkbseer/BOl7g=; b=sTRO0p117PWs4JKzKbTDSq72+1nvfQLRtJYtHUgpM5bx3ig/xbHtXWYAB1ZQa8rIqR WKreevmHj26Jub94aGnzizlmGBzJ39WgHcaR/o6WyuYJDcCQXVeahqHDgs0Op0+Vm0if GeeY8gPoFd/wnxQOOjMz9AMChvivrOgtdiM/unABpShyXHlaN7vXXxJI/sFLBaL5XnWt G+F4en5njkWwBFrKetMf7/ws41QSCQCYQa8YpdndrPV8Y6ldCfxUbj3Ho4rrT3CEgbz1 2s+jgsif8D1L/VffpRZ5lDveCNF8zNa8t7h6Oz/w+l9REin6IQUwJ7q7fxoR9gaRgPoh B2JA== X-Forwarded-Encrypted: i=1; AHgh+RpvLCqW6+t3FTUUN3TWxiz6Zu4wo0QF2c+8vJekoy0EK/8hE62ioH/3ArfZz6WfLSwQja98PqPae2ztfmQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwYA+ByZD+5XAx8px/MG36PgSvyOp4YzWB6iwZpU3hb0hyOPdmy XHmCdW1ul1E/xtaXm5EqXUxJoWYDmmkJtYEmOSp9Axgyfde32fv/er7Bd+OGp4gFs8U= X-Gm-Gg: AfdE7cn54h7thhsR/gWSyqC9EZR/v74+pSQ2jYPNvbPn3Vu01qY7GeboBwySCiGWjFJ 4RtC067Q2rcexxPS9XitxIhNOvRFki02L0BmnaOaDo4N5MYRaMBiYBkPkJnLB0+AUo40Hft4MUd SXph3o53eqpUSgEFLp9zMw+7LaQ3NdkLZaJcrS2RkU2eqensoKfaD1dh/c0fw8OwBkm/fve6mSz rcG3ofUUqNPoW4eQJQypUgc0bY/EUopcseN8XVSuuQUI8Sc4zeDEEqfqBsFzvVjBtEUUJf1SoVK LJV0uh0o45yfUZ8zcGjB6FM4MKJfMdgi4kq/HHxswzk7zCBCxb/Quw+an+Ly8fxlV/C24MCCUWU nqO7pSFRnyXmsJYY3IUtiiwdfnBEppA3Ve48Mt6G0teU473xJHil/cSZBLpU+ctwsQOlUXoWQ4B t5 X-Received: by 2002:a05:600c:4f82:b0:495:51b6:174f with SMTP id 5b1f17b1804b1-49551b61801mr96136675e9.20.1784546448902; Mon, 20 Jul 2026 04:20:48 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:f341:e28f:dde9:3687]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-4954a2b893dsm242517495e9.8.2026.07.20.04.20.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jul 2026 04:20:48 -0700 (PDT) From: Jerome Brunet Date: Mon, 20 Jul 2026 13:20:30 +0200 Subject: [PATCH v5 3/5] dt-bindings: mfd: x-powers,axp152: Document AXP318W Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-axp318-regulator-v5-3-a1afa7ee24f9@baylibre.com> References: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> In-Reply-To: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> To: Andre Przywara , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Conor Dooley , Jerome Brunet X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3753; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=hsuv5cpXOmqMVqVOdS3Ga8YcCzGfBUQhLGlSYAfReNA=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqXgSFcUwnygGmdULOR+FGKv4O8P6bnHyKp8rUo wL3XbfMHd2JAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCal4EhQAKCRDm/A8cN/La hX0WD/4wVrNDgbQZjl9PSIc+tTNxGDoNJeRjSmZSoemzL7P+jxWdw47VuAIvFGRhs5fX2bdIaB2 zus0xGEeRSsjod91C/+5fNlAO8JMfZGIUNK1nOU1voTHrFBwG5aaCIbVItMIkpxVb16C7gqq1Md dEF3geqdvvS7vmaAaIK52FICtv0yn7iyy2ChyN94ZN+CJToPjbPq7aCj7GhG/3Ys2y5WGg9n1u8 lPE8FQdxwTk/kYoglzb4g4PJQeEsuq17+f+wkBgaW2BZc3YCrgOi8xUixqemTV/CyFTR/3I2Lpq vcPATBZd0VaMDUBcZ+l9SNdOVZlxnE8zKLygdBbOAZvMsKomlpJem8I7MdIfc0szZh9bKcsyzWo VB+RyaI2WnNraZQoBzcsL3TjjNOny8G360dhlbOrkrY5bwRbjMPAy9ovRk66yXreB48+isxMCaJ nPIO6hE6xOpks0anglk2htnl7GyPP6k8FAG6J0vdsEdrteW/Pq0mmCnaQrOlUPbQMvYy9wOKs1Q iXA7KhP3Z/OUtzEcyPA4M4vkIRiBVRSXAQfKRFEfoQLlzr78mHyG6nMRhkIv1uVwrrmdvGB5Na6 BDUOfgmqgSJwDH+h0xZ2h8XV40/P/NRxhIl12x0r2nN14tOqU4TTmEwXIGY6FihYJPO2Qwqr0d3 Vd92Aqw+A3JPIaw== X-Developer-Key: i=jbrunet@baylibre.com; a=openpgp; fpr=F29F26CF27BAE1A9719AE6BDC3C92AAF3E60AED9 From: Andre Przywara The X-Powers AXP318W is a PMIC used on some newer Allwinner devices. Among a large number of both DCDC and LDO regulators it features the usual ADC/IRQ/power key parts. Like other recent PMICs, it lacks the DC/DC converter PWM frequency control register, that rate is fixed here (1.5MHz on DCDC1, 3 MHz on the others). Add the new compatible string, and add that to the list of PMICs without the PWM frequency property. Also add more input supply properties, for the split DCDC and ALDO supplies. The PMIC features *two* switched outputs, hanging of DCDC1, and the manual calls them swout1 and swout2, so follow suit here and add those names to the pattern for matching the node names. Signed-off-by: Andre Przywara Reviewed-by: Chen-Yu Tsai Acked-by: Conor Dooley Signed-off-by: Jerome Brunet --- .../devicetree/bindings/mfd/x-powers,axp152.yaml | 28 ++++++++++++++++++= +++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml b/D= ocumentation/devicetree/bindings/mfd/x-powers,axp152.yaml index 45f015d63df1..38556c32417b 100644 --- a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml +++ b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml @@ -83,6 +83,7 @@ allOf: contains: enum: - x-powers,axp313a + - x-powers,axp318w - x-powers,axp323 - x-powers,axp15060 - x-powers,axp717 @@ -102,6 +103,7 @@ properties: - x-powers,axp221 - x-powers,axp223 - x-powers,axp313a + - x-powers,axp318w - x-powers,axp323 - x-powers,axp717 - x-powers,axp803 @@ -156,10 +158,18 @@ properties: description: > DCDC1 power supply node, if present. =20 + vin19-supply: + description: > + Combined DCDC1/DCDC9 power supply node, if present. + vin2-supply: description: > DCDC2 power supply node, if present. =20 + vin23-supply: + description: > + Combined DCDC2/DCDC3 power supply node, if present. + vin3-supply: description: > DCDC3 power supply node, if present. @@ -168,6 +178,10 @@ properties: description: > DCDC4 power supply node, if present. =20 + vin45-supply: + description: > + Combined DCDC4/DCDC5 power supply node, if present. + vin5-supply: description: > DCDC5 power supply node, if present. @@ -176,6 +190,10 @@ properties: description: > DCDC6 power supply node, if present. =20 + vin678-supply: + description: > + Combined DCDC6/DCDC7/DCDC8 power supply node, if present. + vin7-supply: description: > DCDC7 power supply node, if present. @@ -220,6 +238,14 @@ properties: description: > ALDO* power supply node, if present. =20 + aldo156in-supply: + description: > + ALDO* power supply node, if present. + + aldo234in-supply: + description: > + ALDO* power supply node, if present. + bldoin-supply: description: > BLDO* power supply node, if present. @@ -277,7 +303,7 @@ properties: Defines the work frequency of DC-DC in kHz. =20 patternProperties: - "^(([a-f])?ldo[0-9]|dcdc[0-7a-e]|ldo(_|-)io(0|1)|(dc1)?sw|rtc(_|-)ld= o|cpusldo|drivevbus|dc5ldo|boost)$": + "^(([a-f])?ldo[0-9]|dcdc[0-9a-e]|ldo(_|-)io(0|1)|(dc1)?sw|swout[1-2]= |rtc(_|-)ldo|cpusldo|drivevbus|dc5ldo|boost)$": $ref: /schemas/regulator/regulator.yaml# type: object unevaluatedProperties: false --=20 2.47.3 From nobody Sat Jul 25 02:43:53 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA69834040D for ; Mon, 20 Jul 2026 11:20:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546454; cv=none; b=Jovl3vlHhJ1hHLAD1JyW7fu11RNsuaZo0ke6ibcK/oiZWj4iF7v91MV4OaTiouWEUYDVmSRJuXgn4fJuVdM2puNpLoqIB430dXIVGQDAG0CGxsf4HUELLX53UwlKMPmVEfeGQkTjlaCQozDuMPFPCemAK77MKG8cTET5jL4oDcQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546454; c=relaxed/simple; bh=wXqZSdqvIcJKWS3NHh7hSZzb0Fy4RHTv7j5v15ANLnU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SMJxiSJ6KU21TaV3ayNV7sUNY7GstoI9yTCrOzOUaz8zdChIpOJAJQ6y6zuNezYmgl/v9xqHB9d6vColcY1P1WowiBBcpxs/vRffBDIzwFMv26Rgx8aNKx9kim13YRuzAAKDnPI7kXZNSHd6vstZF0Zcmrd0F5HXXUiGStD9lGk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=OBNw+tFx; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="OBNw+tFx" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-4954dff6536so16429935e9.0 for ; Mon, 20 Jul 2026 04:20:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784546451; x=1785151251; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=nLCXRdYBbzsqqU+KjFO/DdbrpddiifvGaDhMVqXEjUY=; b=OBNw+tFx2lkKhP84nCU0zQmgB0urTeCEPo5dQEX90ViCqx/ttT9LtDmAqTkGsJyPrG RaMsbMFRgavqaZA+O2roa3HpI5ls+WN978b+ugCtq4CEvM1Ca14TQrUbYSlDf4T5PqjH 8kk0qWczDOQpgRz+dgf1KUYrUWEcGMoH8m2KJze4D44oauD18yHwRBQ2UbmFWt7HGxa9 QvMmbRUtzjMnS7tA7WeCqHzpS4mrZHOPgPQuT7rrVhIKepQn+cqo1X37A/yIRCYS9aZ/ Q5sdF8H7yi5RPNxESOTm7rYthrz/VUFyXslKVaNQBc6IWyT29Eu1GV3wUDHo+UL40QTG GfzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784546451; x=1785151251; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=nLCXRdYBbzsqqU+KjFO/DdbrpddiifvGaDhMVqXEjUY=; b=k/qDVONP4+bOovtoAq87fm4TY1rSJmM4ocYU3Ej2FaXc4MAjiOKtMFRsfnymQPaOwl 8dZetqLl8lZKxSaMmo8hoeiigPgsw5XtCVTZS29FhAvwuGjrKlZ2Jy5Snt7yZg1Rmjzy xNtmm7SM1NMUBVVYnZ1Qo16ybsu2jt841a3gYOJ1QopouMfNJZBZs4xbXdfGMvyghGOp dl+MDUZnGZaEEivLWTUTHnJbSR9r5ARCQOADgq7bXc6Ue02hAhTThDHcrWlmtcLlPH+h 4sz/6JWGTy6jVisbnymA6G/8sLWaLm+tkScdNCXHwFIjpu6LTFrGuzlv43EBQ5nvUfTH YVNg== X-Forwarded-Encrypted: i=1; AHgh+Rpvfw68qblXq1WS+rApu65LqWLc81kgJ9hOjMqcbLfqFnalN6fxYRBJ5BXQ0mCqyVMF7EURKkC7nQc6Gk8=@vger.kernel.org X-Gm-Message-State: AOJu0YyXaArFKFCRPkGXnDNwLtKjWWR+ejyQHxTQa7TdEKvXQYB7DjFt e+WweKXCE1dfhNfztQylqsHGV+xa2FCw++aJNuOn8M8W1tN11UMLaQao362bpJbcrfQ= X-Gm-Gg: AfdE7ckKW6NnA5RtOnXPTlD3EjcqYywc6+9W2yr/rImULkkz2mVrc9MMoCTvNrl3NyQ hszu5uE59XsigLm1gBv1OccEAZfFWOwjWdPsSErVrHt/Kl29VIZAp4rAGzNgfqtRQmgnGh5Vbju /oJW5lJPZW7cBYqVU7VFzX9IYpfq3u4WOxYjUVdPOpMXgNGiY/G73R0vOJZ8UdIBa/eXToJ/EN2 iVCR6/RNHGNzh5zNKsDws/oIdppRp9ilogX37XH2ADNz7KUZobPjUteY6CjEhdgOqABbMGnrjDK wbVXawl98N86LjYr/9YvQGZCqdU5HqcysODFRgvLjep1fcdI+/b9kqPDiWOBWm973YnvNTR3dc7 wltoO/HQPY9atBk0Ia/8bvBD+bGzixVeE2U8137FLXFUGZJSsFK8h0Gztc2Ju0ZERfkNQIXlPpF IQ X-Received: by 2002:a05:600c:630e:b0:495:4856:2659 with SMTP id 5b1f17b1804b1-4954a3db6b0mr152920055e9.9.1784546451047; Mon, 20 Jul 2026 04:20:51 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:f341:e28f:dde9:3687]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-4955a9e5f26sm85490455e9.0.2026.07.20.04.20.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jul 2026 04:20:50 -0700 (PDT) From: Jerome Brunet Date: Mon, 20 Jul 2026 13:20:31 +0200 Subject: [PATCH v5 4/5] mfd: axp20x: Add support for AXP318W PMIC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-axp318-regulator-v5-4-a1afa7ee24f9@baylibre.com> References: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> In-Reply-To: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> To: Andre Przywara , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Jerome Brunet X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=11128; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=lCIoI2OR8DW2EqdOmZne0ZKTXbwoT8DKQPeKDXJ7r8I=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqXgSGvBFCQU8gvp7Z3sQDgjiiF1/O05oN0QDZq 2OFUAtOJJGJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCal4EhgAKCRDm/A8cN/La hdUkEACY3n1RtJODCv/gBi1cQXgVKtGp1k6v/BoIreUYH3lk7C2h3PbjVn/L5yyYfUYamn7uxG+ TG6Dhz0pEFvAAzLcKRuy7UTnrSqqJ5fLstCa2l1jEXC5YXUElKn2a5Ty4pPsUAuWZDHEGwNQKTs BUhSkD9/zjNt4KTq4ZvSCqf/YL2FgaKp/bmbSHqafohgnFDZiAoquTQ+HZeYjekHr89P+Y0Ucw3 VjwLBCbCpwpiJ4ydVNRR3bq1MZhlXwjtgLcQ9Q6gZ5GG/Jgq6/s7C1aLCvkOHp5gxSwtmCQXC4y Rfy1gBessTaN9uetBHOKAUPNd+3vIGwf1HaEzHe4wwon6akrcT51g9oWPrEudnFn7DObRTtXjxn 4NmZdPxk8CwBcZfqkWjVx6IckhusUj4OBiXzcFi4SjRhTnHlA/ckrvy2pZ9WQnLiLonEJhU0j0Y Cy/ty8MH4zdzupxeyIBwnGuioActHGGKKKmYyKMoqRGIhduhkmgYRro4NVVYNNNh4SF5hDlnKyV z/I4oHc7hqw+OFapfvGGhBRDl190L9djKk7eUD2PeWGr8tfF6M7SMOt/UWO+eB854uhPQoBZ2i9 3OB91/+vZRs9fse1Fn9FEDLDVQ3VVdJDzdZzJkuudv0NQOijMWpUVSs73v0wNA+e7azcWRnDWwE N8lpzH1f+B+1p8A== X-Developer-Key: i=jbrunet@baylibre.com; a=openpgp; fpr=F29F26CF27BAE1A9719AE6BDC3C92AAF3E60AED9 From: Andre Przywara The AXP318W is a PMIC chip produced by X-Powers, it can be connected to an I2C bus. It has a large number of regulators: 9(!) DCDC buck converters, and 28 LDOs, also some ADCs, interrupts, and a power key. Describe the regmap and the MFD bits, along with the registers exposed via I2C only. This covers the regulators and interrupts for now. Advertise the device using the new compatible string. We use just "318" for the internal identifiers, for easier typing and less churn, but use "318W" for anything externally visible. If something else other than the "AXP318W" shows up, that's an easy change then. Signed-off-by: Andre Przywara Signed-off-by: Jerome Brunet --- drivers/mfd/axp20x-i2c.c | 2 ++ drivers/mfd/axp20x.c | 81 ++++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/axp20x.h | 88 ++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 171 insertions(+) diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c index a76bec5604c4..64c212b76e5e 100644 --- a/drivers/mfd/axp20x-i2c.c +++ b/drivers/mfd/axp20x-i2c.c @@ -66,6 +66,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = =3D { { .compatible =3D "x-powers,axp221", .data =3D (void *)AXP221_ID }, { .compatible =3D "x-powers,axp223", .data =3D (void *)AXP223_ID }, { .compatible =3D "x-powers,axp313a", .data =3D (void *)AXP313A_ID }, + { .compatible =3D "x-powers,axp318w", .data =3D (void *)AXP318_ID }, { .compatible =3D "x-powers,axp323", .data =3D (void *)AXP323_ID }, { .compatible =3D "x-powers,axp717", .data =3D (void *)AXP717_ID }, { .compatible =3D "x-powers,axp803", .data =3D (void *)AXP803_ID }, @@ -84,6 +85,7 @@ static const struct i2c_device_id axp20x_i2c_id[] =3D { { .name =3D "axp221", .driver_data =3D AXP221_ID }, { .name =3D "axp223", .driver_data =3D AXP223_ID }, { .name =3D "axp313a", .driver_data =3D AXP313A_ID }, + { .name =3D "axp318w", .driver_data =3D AXP318_ID }, { .name =3D "axp323", .driver_data =3D AXP323_ID }, { .name =3D "axp717", .driver_data =3D AXP717_ID }, { .name =3D "axp803", .driver_data =3D AXP803_ID }, diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 84839d4aa1ca..ea00c0cdce58 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -42,6 +42,7 @@ static const char * const axp20x_model_names[] =3D { [AXP223_ID] =3D "AXP223", [AXP288_ID] =3D "AXP288", [AXP313A_ID] =3D "AXP313a", + [AXP318_ID] =3D "AXP318W", [AXP323_ID] =3D "AXP323", [AXP717_ID] =3D "AXP717", [AXP803_ID] =3D "AXP803", @@ -218,6 +219,31 @@ static const struct regmap_access_table axp313a_volati= le_table =3D { .n_yes_ranges =3D ARRAY_SIZE(axp313a_volatile_ranges), }; =20 +static const struct regmap_range axp318_writeable_ranges[] =3D { + regmap_reg_range(AXP318_DCDC_OUTPUT_CONTROL1, AXP318_IRQ_STATE4), + regmap_reg_range(AXP318_SHUTDOWN_SRC_CTRL1, AXP318_TEMP_ADC_H_EN), + regmap_reg_range(AXP318_DIE_TEMP_ADC_H_EN, AXP318_DIE_TEMP_ADC_H_EN), + regmap_reg_range(AXP318_GPADC_H_EN, AXP318_GPADC_H_EN), + regmap_reg_range(AXP318_GPIO_CTRL, AXP318_WDOG_CTRL), +}; + +static const struct regmap_range axp318_volatile_ranges[] =3D { + regmap_reg_range(AXP318_IRQ_EN1, AXP318_IRQ_STATE4), + regmap_reg_range(AXP318_POWER_REASON, AXP318_SHUTDOWN_SOURCE), + regmap_reg_range(AXP318_TEMP_ADC_H_EN, AXP318_GPADC_L), + regmap_reg_range(AXP318_GPIO_INPUT, AXP318_GPIO_INPUT), +}; + +static const struct regmap_access_table axp318_writeable_table =3D { + .yes_ranges =3D axp318_writeable_ranges, + .n_yes_ranges =3D ARRAY_SIZE(axp318_writeable_ranges), +}; + +static const struct regmap_access_table axp318_volatile_table =3D { + .yes_ranges =3D axp318_volatile_ranges, + .n_yes_ranges =3D ARRAY_SIZE(axp318_volatile_ranges), +}; + static const struct regmap_range axp717_writeable_ranges[] =3D { regmap_reg_range(AXP717_PMU_FAULT, AXP717_MODULE_EN_CONTROL_1), regmap_reg_range(AXP717_MIN_SYS_V_CONTROL, AXP717_BOOST_CONTROL), @@ -447,6 +473,15 @@ static const struct regmap_config axp313a_regmap_confi= g =3D { .cache_type =3D REGCACHE_MAPLE, }; =20 +static const struct regmap_config axp318_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .wr_table =3D &axp318_writeable_table, + .volatile_table =3D &axp318_volatile_table, + .max_register =3D AXP318_WDOG_CTRL, + .cache_type =3D REGCACHE_MAPLE, +}; + static const struct regmap_config axp323_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, @@ -663,6 +698,28 @@ static const struct regmap_irq axp313a_regmap_irqs[] = =3D { INIT_REGMAP_IRQ(AXP313A, DIE_TEMP_HIGH, 0, 0), }; =20 +static const struct regmap_irq axp318_regmap_irqs[] =3D { + INIT_REGMAP_IRQ(AXP318, DCDC8_V_LOW, 0, 7), + INIT_REGMAP_IRQ(AXP318, DCDC7_V_LOW, 0, 6), + INIT_REGMAP_IRQ(AXP318, DCDC6_V_LOW, 0, 5), + INIT_REGMAP_IRQ(AXP318, DCDC5_V_LOW, 0, 4), + INIT_REGMAP_IRQ(AXP318, DCDC4_V_LOW, 0, 3), + INIT_REGMAP_IRQ(AXP318, DCDC3_V_LOW, 0, 2), + INIT_REGMAP_IRQ(AXP318, DCDC2_V_LOW, 0, 1), + INIT_REGMAP_IRQ(AXP318, DCDC1_V_LOW, 0, 0), + INIT_REGMAP_IRQ(AXP318, PEK_RIS_EDGE, 1, 6), + INIT_REGMAP_IRQ(AXP318, PEK_FAL_EDGE, 1, 5), + INIT_REGMAP_IRQ(AXP318, PEK_LONG, 1, 4), + INIT_REGMAP_IRQ(AXP318, PEK_SHORT, 1, 3), + INIT_REGMAP_IRQ(AXP318, DIE_TEMP_HIGH_LV2, 1, 2), + INIT_REGMAP_IRQ(AXP318, DIE_TEMP_HIGH_LV1, 1, 1), + INIT_REGMAP_IRQ(AXP318, DCDC9_V_LOW, 1, 0), + INIT_REGMAP_IRQ(AXP318, GPIO3_INPUT, 2, 6), + INIT_REGMAP_IRQ(AXP318, GPIO2_INPUT, 2, 5), + INIT_REGMAP_IRQ(AXP318, GPIO1_INPUT, 2, 4), + INIT_REGMAP_IRQ(AXP318, WDOG_EXPIRE, 3, 0), +}; + static const struct regmap_irq axp717_regmap_irqs[] =3D { INIT_REGMAP_IRQ(AXP717, SOC_DROP_LVL2, 0, 7), INIT_REGMAP_IRQ(AXP717, SOC_DROP_LVL1, 0, 6), @@ -884,6 +941,17 @@ static const struct regmap_irq_chip axp313a_regmap_irq= _chip =3D { .num_regs =3D 1, }; =20 +static const struct regmap_irq_chip axp318_regmap_irq_chip =3D { + .name =3D "axp318w_irq_chip", + .status_base =3D AXP318_IRQ_STATE1, + .ack_base =3D AXP318_IRQ_STATE1, + .unmask_base =3D AXP318_IRQ_EN1, + .init_ack_masked =3D true, + .irqs =3D axp318_regmap_irqs, + .num_irqs =3D ARRAY_SIZE(axp318_regmap_irqs), + .num_regs =3D 4, +}; + static const struct regmap_irq_chip axp717_regmap_irq_chip =3D { .name =3D "axp717_irq_chip", .status_base =3D AXP717_IRQ0_STATE, @@ -1061,6 +1129,10 @@ static const struct mfd_cell axp313a_cells[] =3D { MFD_CELL_RES("axp313a-pek", axp313a_pek_resources), }; =20 +static const struct mfd_cell axp318_cells[] =3D { + MFD_CELL_BASIC("axp20x-regulator", NULL, NULL, 0, 1), +}; + static const struct mfd_cell axp717_cells[] =3D { MFD_CELL_NAME("axp20x-regulator"), MFD_CELL_RES("axp20x-pek", axp717_pek_resources), @@ -1248,6 +1320,9 @@ static int axp20x_power_off(struct sys_off_data *data) case AXP313A_ID: shutdown_reg =3D AXP313A_SHUTDOWN_CTRL; break; + case AXP318_ID: + shutdown_reg =3D AXP318_SHUTDOWN_CTRL; + break; default: shutdown_reg =3D AXP20X_OFF_CTRL; break; @@ -1312,6 +1387,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x) axp20x->regmap_cfg =3D &axp313a_regmap_config; axp20x->regmap_irq_chip =3D &axp313a_regmap_irq_chip; break; + case AXP318_ID: + axp20x->nr_cells =3D ARRAY_SIZE(axp318_cells); + axp20x->cells =3D axp318_cells; + axp20x->regmap_cfg =3D &axp318_regmap_config; + axp20x->regmap_irq_chip =3D &axp318_regmap_irq_chip; + break; case AXP323_ID: axp20x->nr_cells =3D ARRAY_SIZE(axp313a_cells); axp20x->cells =3D axp313a_cells; diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index 1badb4868d17..0191467de4ec 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -19,6 +19,7 @@ enum axp20x_variants { AXP223_ID, AXP288_ID, AXP313A_ID, + AXP318_ID, AXP323_ID, AXP717_ID, AXP803_ID, @@ -116,6 +117,71 @@ enum axp20x_variants { #define AXP313A_IRQ_STATE 0x21 #define AXP323_DCDC_MODE_CTRL2 0x22 =20 +#define AXP318_DCDC_OUTPUT_CONTROL1 0x10 +#define AXP318_DCDC_OUTPUT_CONTROL2 0x11 +#define AXP318_DCDC1_CONTROL 0x12 +#define AXP318_DCDC2_CONTROL 0x13 +#define AXP318_DCDC3_CONTROL 0x14 +#define AXP318_DCDC4_CONTROL 0x15 +#define AXP318_DCDC5_CONTROL 0x16 +#define AXP318_DCDC6_CONTROL 0x17 +#define AXP318_DCDC7_CONTROL 0x18 +#define AXP318_DCDC8_CONTROL 0x19 +#define AXP318_DCDC9_CONTROL 0x1a +#define AXP318_LDO_OUTPUT_CONTROL1 0x20 +#define AXP318_LDO_OUTPUT_CONTROL2 0x21 +#define AXP318_LDO_OUTPUT_CONTROL3 0x22 +#define AXP318_LDO_OUTPUT_CONTROL4 0x23 +#define AXP318_ALDO1_CONTROL 0x24 +#define AXP318_ALDO2_CONTROL 0x25 +#define AXP318_ALDO3_CONTROL 0x26 +#define AXP318_ALDO4_CONTROL 0x27 +#define AXP318_ALDO5_CONTROL 0x28 +#define AXP318_ALDO6_CONTROL 0x29 +#define AXP318_BLDO1_CONTROL 0x2a +#define AXP318_BLDO2_CONTROL 0x2b +#define AXP318_BLDO3_CONTROL 0x2c +#define AXP318_BLDO4_CONTROL 0x2d +#define AXP318_BLDO5_CONTROL 0x2e +#define AXP318_CLDO1_CONTROL 0x2f +#define AXP318_CLDO2_CONTROL 0x30 +#define AXP318_CLDO3_CONTROL 0x31 +#define AXP318_CLDO4_CONTROL 0x32 +#define AXP318_CLDO5_CONTROL 0x33 +#define AXP318_DLDO1_CONTROL 0x34 +#define AXP318_DLDO2_CONTROL 0x35 +#define AXP318_DLDO3_CONTROL 0x36 +#define AXP318_DLDO4_CONTROL 0x37 +#define AXP318_DLDO5_CONTROL 0x38 +#define AXP318_DLDO6_CONTROL 0x39 +#define AXP318_ELDO1_CONTROL 0x3a +#define AXP318_ELDO2_CONTROL 0x3b +#define AXP318_ELDO3_CONTROL 0x3c +#define AXP318_ELDO4_CONTROL 0x3d +#define AXP318_ELDO5_CONTROL 0x3e +#define AXP318_ELDO6_CONTROL 0x3f +#define AXP318_IRQ_EN1 0x40 +#define AXP318_IRQ_EN2 0x41 +#define AXP318_IRQ_EN3 0x42 +#define AXP318_IRQ_EN4 0x43 +#define AXP318_IRQ_STATE1 0x48 +#define AXP318_IRQ_STATE2 0x49 +#define AXP318_IRQ_STATE3 0x4a +#define AXP318_IRQ_STATE4 0x4b +#define AXP318_POWER_REASON 0x50 +#define AXP318_SHUTDOWN_SOURCE 0x51 +#define AXP318_SHUTDOWN_SRC_CTRL1 0x52 +#define AXP318_SHUTDOWN_SRC_CTRL2 0x53 +#define AXP318_SHUTDOWN_CTRL 0x55 +#define AXP318_TEMP_ADC_H_EN 0x65 +#define AXP318_TEMP_ADC_L 0x66 +#define AXP318_DIE_TEMP_ADC_H_EN 0x67 +#define AXP318_GPADC_H_EN 0x69 +#define AXP318_GPADC_L 0x6a +#define AXP318_GPIO_CTRL 0x70 +#define AXP318_GPIO_INPUT 0x71 +#define AXP318_WDOG_CTRL 0x77 + #define AXP717_ON_INDICATE 0x00 #define AXP717_PMU_STATUS_2 0x01 #define AXP717_BC_DETECT 0x05 @@ -819,6 +885,28 @@ enum axp313a_irqs { AXP313A_IRQ_PEK_RIS_EDGE, }; =20 +enum axp318_irqs { + AXP318_IRQ_DCDC1_V_LOW, + AXP318_IRQ_DCDC2_V_LOW, + AXP318_IRQ_DCDC3_V_LOW, + AXP318_IRQ_DCDC4_V_LOW, + AXP318_IRQ_DCDC5_V_LOW, + AXP318_IRQ_DCDC6_V_LOW, + AXP318_IRQ_DCDC7_V_LOW, + AXP318_IRQ_DCDC8_V_LOW, + AXP318_IRQ_DCDC9_V_LOW, + AXP318_IRQ_DIE_TEMP_HIGH_LV1, + AXP318_IRQ_DIE_TEMP_HIGH_LV2, + AXP318_IRQ_PEK_SHORT, + AXP318_IRQ_PEK_LONG, + AXP318_IRQ_PEK_FAL_EDGE, + AXP318_IRQ_PEK_RIS_EDGE, + AXP318_IRQ_GPIO1_INPUT =3D 20, + AXP318_IRQ_GPIO2_INPUT, + AXP318_IRQ_GPIO3_INPUT, + AXP318_IRQ_WDOG_EXPIRE =3D 24, +}; + enum axp717_irqs { AXP717_IRQ_VBUS_FAULT, AXP717_IRQ_VBUS_OVER_V, --=20 2.47.3 From nobody Sat Jul 25 02:43:53 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F13BB343895 for ; Mon, 20 Jul 2026 11:20:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546457; cv=none; b=IH1IvWyVuIYcy0Au3NiEAts2VevOod6pig+EhkklAHYhzzSXsNpmG2H1LBuk0IIMy8OvSPDDQ0jn65C84TpXlkfMt7W7CjxEfgqDLwiTuD32ikqpoY+9i7T5COXBWwyVWxFXf3RZWDj6L35jzBvVznTXc/OrwrJka3AvGej3DYw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784546457; c=relaxed/simple; bh=cPlCNpAmkXW66Y4FH05sass5lvTqJtGFtyB1OWNY78w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cz7jiQfP9Uz2V1y1LyS7bVSco3y5ahZ3MVvqyiQITK3ewL1oDPuT9S2WEWFiYegdohjzzPi4d9/P3HJMB056xXlPqDcpExYEgJNnZdWuM3mK37wy6RwP1ptPmqacTurlRnL5Z2iUBckuFBAYULt2TCVappAvKNOgAEnNmQe7sSE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b=XrmbRIk5; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre.com header.i=@baylibre.com header.b="XrmbRIk5" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4954a32cf1eso11575045e9.3 for ; Mon, 20 Jul 2026 04:20:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784546453; x=1785151253; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=8QdM7aDJ6BUm8/+T7aYi5rYCae/1VGfhBTecUKPKjBE=; b=XrmbRIk57hm0ZSNl+PdVnBGqSWMwgmyHqP5lAH4QGD3yB1MLf1Ry8mZJOTEivwEhph xYITm7AM/zUZwqcfUrfuIGA8fYgXlQBPtGqNYPeNCq9LdngoLwOtFmSQMUOZTSofqjQH I/q7/NQ2o9/7+LKwtMYa23Y9y6ajBbh1iN6PtyQZK1opKZLEHpaic3VooZymEUMwxs9Z pLP4w849pKSfEVzjg9iOa5WIUm92tWn0/ULYK/oPedpWKJ/u1F1auRjbvP+X2fHnXeTH L23VbVqgo6+bPc8hvEw916M4pbMEqdzrIMRUcGVX1gKfbhE/bMYS5NmEUuWI6BYpVfTZ iquA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784546453; x=1785151253; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=8QdM7aDJ6BUm8/+T7aYi5rYCae/1VGfhBTecUKPKjBE=; b=MTESKlDYCexVWnnJQZJoQFo40S4qa6V0QA7MHoRcs84farkege6RK9TBKbcjjdQzoa fqD7XXNzgpO1tyTPCWxX4D0LGT/FGS9ozFx80XTmAReSrzopMUfNvBWbDSULNOQhzUPh mBPt22ntrifCll94JJTYPxGmvjUQ2UVGXHRWhRFtiCCcDi36qTz/PeZ8Tv8GQmgIH7Lx 4Ji1orRk9RPegd39khYGV9yXp2XHb35Jlg/Vz+NlM/vq7XnkFw17cwPNiUVSYyxeziDL EhasYblobz8WORYl0scJS+YX5mYRvzPZJv3cBw/ijfMM4YFi9dkyOy9Lbe/NtsyXiGTl zDMA== X-Forwarded-Encrypted: i=1; AHgh+RrNZSpxabcQDNJYo9BRc+Es1mEfVd6sl1NnFh2M/zEthQEkRxmqMrCIPySEUc6tcVbAXXy7yHb3KapZHDI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz4HMi15pjv1lykdrwTKcT1lLN+mymxdaXRvILeIDGd2pO638fe UZiEJ63H++o1LYiW+lDgxVnxVMjFv16uGbZfEt+/vFEVJISvCKEx5RQdFMRFgknGuvc= X-Gm-Gg: AfdE7cnTYOoDFktVh4RiaVKehlaU1c3jgnNBvSBsl+tLiht0j16O5g7nboLX6HGzCVW 46/aAaGjS8ttySUaXNciRasEsmI3Ym/nvCY2z+q0ubTsEXyoYmPjPIb6cFqgAueVsGHNyL422xR u9b3lpRuYgJp8DhNTHrGR4DWy6tDTGCFiOY1ximaUM+LqOwLwJ9/2TpChx5l2eO0lgt6Vy8Ks/v DSAOEvgs9UGx4WlAFSk4zhM7Idc6lUDOTEiFrSkF9y7jWF8Ru3kx+li2jM/gvjzuahjuM4QvAmZ YtdjpiXyKIeZByQZWB2zheDfGQarE6fBBc0en8hPSwh5+L6tccJG5I026jaqwprif/n0aOfCbw3 aPVBsP4Dv5+QtCINPYQedWJekDaUQ351phCszuFUieV7g4zzUyUMOpQaGPwSPFP79YTy2CZVldn vY X-Received: by 2002:a05:600c:e54a:20b0:495:5d6d:9cd5 with SMTP id 5b1f17b1804b1-4955d6d9e31mr32651795e9.27.1784546453097; Mon, 20 Jul 2026 04:20:53 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:f341:e28f:dde9:3687]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-49563e4573bsm7923805e9.0.2026.07.20.04.20.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Jul 2026 04:20:52 -0700 (PDT) From: Jerome Brunet Date: Mon, 20 Jul 2026 13:20:32 +0200 Subject: [PATCH v5 5/5] regulator: axp20x: add support for the AXP318W Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260720-axp318-regulator-v5-5-a1afa7ee24f9@baylibre.com> References: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> In-Reply-To: <20260720-axp318-regulator-v5-0-a1afa7ee24f9@baylibre.com> To: Andre Przywara , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Jerome Brunet X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=21087; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=4RVYcCbWmpUy7Aem4G3dzn5By1vjwTdoe6KYKqM0p+M=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqXgSHRxKY5L/ms/8cRG9+Z6w38ahKlH8hAYT8Y NFrIpKgcJOJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCal4EhwAKCRDm/A8cN/La hX22D/9ZKK3LO+Yns1cQbF6LlWGM11R3M/hPjEhh/uS4I6kMqxK8nde7TW5EFZuFN+FbWPatuax P/j+pEUXFPYEsRnrSiGfO4JTrdbAn2FI455oARlItoFphMBGQRgs2nad10wig8cyGOW0wwC1+Y/ S+DAeKv3h+kYpwTHGAdCl1ZoMalwl3W/gajBK5/UAPYvKNiFVFd65yq6elMYSWMXYfDjzQxH55V E4at86vBj5Jr/tYD6vwguJc96pMUHZHZ4mmnHVFXhfBm0WirsLt2FN4nVOxoCas9fFZ7zXLJXJj LhtAGXlrpxCSdYcAbUoG5eQOWdFeTYAHQubCRaHgSEzOOStb3M0QggUF9d0jQy33A5UX1hbosU+ OXDEZpkFXBIUg6+bsMwESTVLX+MaXRKn48m0YZVpcVCxOdXRscIO2tyli3FAS+aTzNzR329iWeY EMPWcmGxCMFTqsb6IRS7y3JQgxipbj6KmGlKGMHFmHEqbDoCbPtjwR72UGiNN8BnirkT9ZkSZd6 Fm9v+LCu1HBNWEXThVbExYnVmAskLoDq8lHq3Z6W8/3d2UGGEfJOMaYH/O7chjhrMK47jvKbeEI 1uAufv9kHKDA4YBLRQC2LujooFudZhoXEG86rkqVxmqmR5a4k9L+8PniXunvPSqLPVNAphfXIPN EW9kxHcLesXumvA== X-Developer-Key: i=jbrunet@baylibre.com; a=openpgp; fpr=F29F26CF27BAE1A9719AE6BDC3C92AAF3E60AED9 From: Andre Przywara The X-Powers AXP318W is a typical PMIC from X-Powers, featuring nine DC/DC converters and 28 LDOs, on the regulator side. Describe the chip's voltage settings and switch registers, how the voltages are encoded, and connect this to the MFD device via its regulator ID. We use just "318" for the internal identifiers, for easier typing and less churn. If something else other than the "AXP318W" shows up, that's an easy change, externally visible strings carry the additional letter already. Reviewed-by: Mark Brown Signed-off-by: Andre Przywara Co-developed-by: Jerome Brunet Signed-off-by: Jerome Brunet --- drivers/regulator/axp20x-regulator.c | 324 +++++++++++++++++++++++++++++++= +++- include/linux/mfd/axp20x.h | 45 +++++ 2 files changed, 360 insertions(+), 9 deletions(-) diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20= x-regulator.c index da891415efc0..9e81e2cb7542 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -138,6 +138,29 @@ #define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0) #define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0) =20 +#define AXP318_DCDC1_PFM_PWM_CTRL BIT(7) +#define AXP318_DCDC23_POLYPHASE_CTRL BIT(6) +#define AXP318_DCDC45_POLYPHASE_CTRL BIT(7) +#define AXP318_DCDC1_V_OUT_MASK GENMASK(4, 0) +#define AXP318_DCDC2_V_OUT_MASK GENMASK(6, 0) +#define AXP318_LDO_V_OUT_MASK GENMASK(4, 0) +#define AXP318_ELDO_V_OUT_MASK GENMASK(5, 0) +#define AXP318_THRESHOLD_VOLTAGE 1540000 +/* + * FIXME: + * Some LDOs of the AXP318 may be fed by different supplies and + * the documentation repeatedly warns that output voltage must + * be less than the supply, which is the case for any LDO really. + * + * The best way to let the framework handle this is to set the + * min_dropout_uV field. However the AXP318 documentation + * does not provide any information about this. + * + * Realistically, it can't be less than 1uV so use this + * for all LDOs until we know more. + */ +#define AXP318_LDO_MIN_DROPOUT 1 /* uV */ + #define AXP717_DCDC1_NUM_VOLTAGES 88 #define AXP717_DCDC2_NUM_VOLTAGES 107 #define AXP717_DCDC3_NUM_VOLTAGES 103 @@ -371,8 +394,8 @@ .ops =3D &axp20x_ops, \ } =20 -#define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ - _vmask, _ereg, _emask) \ +#define AXP_DESC_EXT(_family, _id, _match, _supply, _min, _max, _step, _vr= eg, \ + _vmask, _ereg, _emask, _ops, _bpreg, _bpmask, _dropout) \ [_family##_##_id] =3D { \ .name =3D (_match), \ .supply_name =3D (_supply), \ @@ -384,13 +407,32 @@ .owner =3D THIS_MODULE, \ .min_uV =3D (_min) * 1000, \ .uV_step =3D (_step) * 1000, \ + .min_dropout_uV =3D (_dropout), \ .vsel_reg =3D (_vreg), \ .vsel_mask =3D (_vmask), \ .enable_reg =3D (_ereg), \ .enable_mask =3D (_emask), \ - .ops =3D &axp20x_ops, \ + .bypass_reg =3D (_bpreg), \ + .bypass_mask =3D (_bpmask), \ + .ops =3D (_ops), \ } =20 +#define AXP_DESC(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask) \ + AXP_DESC_EXT(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, &axp20x_ops, 0, 0, 0) + +#define AXP_DESC_DO(_family, _id, _match, _supply, _min, _max, _step, _vre= g, \ + _vmask, _ereg, _emask, _dropout) \ + AXP_DESC_EXT(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, &axp20x_ops, 0, 0, _dropout) + +#define AXP_DESC_BYPASS(_family, _id, _match, _supply, _min, _max, _step, = _vreg,\ + _vmask, _ereg, _emask, _bpreg, _bpmask, _dropout) \ + AXP_DESC_EXT(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ + _vmask, _ereg, _emask, &axp20x_bypass_ops, _bpreg, \ + _bpmask, _dropout) + #define AXP_DESC_SW(_family, _id, _match, _supply, _ereg, _emask) \ [_family##_##_id] =3D { \ .name =3D (_match), \ @@ -419,8 +461,9 @@ .ops =3D &axp20x_ops_fixed \ } =20 -#define AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, _n_v= oltages, \ - _vreg, _vmask, _ereg, _emask, _ramp_delay) \ +#define AXP_DESC_RANGES_DELAY_OPS(_family, _id, _match, _supply, _ranges, \ + _n_voltages, _vreg, _vmask, _ereg, _emask, \ + _ramp_delay, _ops) \ [_family##_##_id] =3D { \ .name =3D (_match), \ .supply_name =3D (_supply), \ @@ -436,10 +479,23 @@ .enable_mask =3D (_emask), \ .linear_ranges =3D (_ranges), \ .n_linear_ranges =3D ARRAY_SIZE(_ranges), \ - .ramp_delay =3D (_ramp_delay), \ - .ops =3D &axp20x_ops_range, \ + .ramp_delay =3D (_ramp_delay), \ + .ops =3D (_ops), \ } =20 +#define AXP_DESC_RANGES_THRESHOLD(_family, _id, _match, _supply, _ranges, \ + _n_voltages, _vreg, _vmask, _ereg, _emask) \ + AXP_DESC_RANGES_DELAY_OPS(_family, _id, _match, _supply, _ranges, \ + _n_voltages, _vreg, _vmask, _ereg, _emask, \ + 0, &axp318_threshold_ops_range) + +#define AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, \ + _n_voltages, _vreg, _vmask, _ereg, _emask, \ + _ramp_delay) \ + AXP_DESC_RANGES_DELAY_OPS(_family, _id, _match, _supply, _ranges, \ + _n_voltages, _vreg, _vmask, _ereg, _emask, \ + _ramp_delay, &axp20x_ops_range) + #define AXP_DESC_RANGES(_family, _id, _match, _supply, _ranges, _n_voltage= s, \ _vreg, _vmask, _ereg, _emask) \ AXP_DESC_RANGES_DELAY(_family, _id, _match, _supply, _ranges, \ @@ -567,6 +623,50 @@ static int axp20x_regulator_enable_regmap(struct regul= ator_dev *rdev) return regulator_enable_regmap(rdev); }; =20 +static int axp318_threshold_check(struct regulator_dev *rdev, + unsigned int sel) +{ + int old_sel, old_uV, new_uV, enabled; + + /* Only applicable if the regulator is enabled */ + enabled =3D rdev->desc->ops->is_enabled(rdev); + if (enabled <=3D 0) + return enabled; + + old_sel =3D rdev->desc->ops->get_voltage_sel(rdev); + if (old_sel < 0) + return old_sel; + + old_uV =3D rdev->desc->ops->list_voltage(rdev, old_sel); + if (old_uV < 0) + return old_uV; + + new_uV =3D rdev->desc->ops->list_voltage(rdev, sel); + if (new_uV < 0) + return new_uV; + + /* Crossing the threshold ? */ + if ((old_uV <=3D AXP318_THRESHOLD_VOLTAGE && + new_uV > AXP318_THRESHOLD_VOLTAGE) || + (new_uV <=3D AXP318_THRESHOLD_VOLTAGE && + old_uV > AXP318_THRESHOLD_VOLTAGE)) + return -EBUSY; + + return 0; +} + +static int axp318_threshold_set_voltage_sel(struct regulator_dev *rdev, + unsigned int sel) +{ + int ret; + + ret =3D axp318_threshold_check(rdev, sel); + if (ret < 0) + return ret; + + return regulator_set_voltage_sel_regmap(rdev, sel); +} + static const struct regulator_ops axp20x_ops_fixed =3D { .list_voltage =3D regulator_list_voltage_linear, }; @@ -580,6 +680,15 @@ static const struct regulator_ops axp20x_ops_range =3D= { .is_enabled =3D regulator_is_enabled_regmap, }; =20 +static const struct regulator_ops axp318_threshold_ops_range =3D { + .set_voltage_sel =3D axp318_threshold_set_voltage_sel, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .list_voltage =3D regulator_list_voltage_linear_range, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .is_enabled =3D regulator_is_enabled_regmap, +}; + static const struct regulator_ops axp20x_ops =3D { .set_voltage_sel =3D regulator_set_voltage_sel_regmap, .get_voltage_sel =3D regulator_get_voltage_sel_regmap, @@ -590,6 +699,18 @@ static const struct regulator_ops axp20x_ops =3D { .set_ramp_delay =3D axp20x_set_ramp_delay, }; =20 +static const struct regulator_ops axp20x_bypass_ops =3D { + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .list_voltage =3D regulator_list_voltage_linear, + .enable =3D axp20x_regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .is_enabled =3D regulator_is_enabled_regmap, + .set_ramp_delay =3D axp20x_set_ramp_delay, + .get_bypass =3D regulator_get_bypass_regmap, + .set_bypass =3D regulator_set_bypass_regmap, +}; + static const struct regulator_ops axp20x_ops_sw =3D { .enable =3D regulator_enable_regmap, .disable =3D regulator_disable_regmap, @@ -765,6 +886,158 @@ static const struct regulator_desc axp313a_regulators= [] =3D { AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800), }; =20 +static const struct linear_range axp318_dcdc2_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), +}; + +static const struct linear_range axp318_dcdc6_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), + REGULATOR_LINEAR_RANGE(1800000, 88, 118, 20000), + REGULATOR_LINEAR_RANGE(2440000, 119, 127, 40000), +}; + +static const struct linear_range axp318_dcdc7_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), + REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000), +}; + +static const struct linear_range axp318_dcdc8_ranges[] =3D { + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), + REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000), + REGULATOR_LINEAR_RANGE(1900000, 103, 118, 100000), +}; + +static const struct regulator_desc axp318_regulators[] =3D { + AXP_DESC(AXP318, DCDC1, "dcdc1", "vin19", 1000, 3400, 100, + AXP318_DCDC1_CONTROL, AXP318_DCDC1_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(0)), + AXP_DESC_RANGES(AXP318, DCDC2, "dcdc2", "vin23", + axp318_dcdc2_ranges, 88, + AXP318_DCDC2_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(1)), + AXP_DESC_RANGES(AXP318, DCDC3, "dcdc3", "vin23", + axp318_dcdc2_ranges, 88, + AXP318_DCDC3_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(2)), + AXP_DESC_RANGES(AXP318, DCDC4, "dcdc4", "vin45", + axp318_dcdc2_ranges, 88, + AXP318_DCDC4_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(3)), + AXP_DESC_RANGES(AXP318, DCDC5, "dcdc5", "vin45", + axp318_dcdc2_ranges, 88, + AXP318_DCDC5_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(4)), + AXP_DESC_RANGES_THRESHOLD(AXP318, DCDC6, "dcdc6", "vin678", + axp318_dcdc6_ranges, 128, + AXP318_DCDC6_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(5)), + AXP_DESC_RANGES_THRESHOLD(AXP318, DCDC7, "dcdc7", "vin678", + axp318_dcdc7_ranges, 103, + AXP318_DCDC7_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(6)), + AXP_DESC_RANGES_THRESHOLD(AXP318, DCDC8, "dcdc8", "vin678", + axp318_dcdc8_ranges, 119, + AXP318_DCDC8_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL1, BIT(7)), + AXP_DESC_RANGES_THRESHOLD(AXP318, DCDC9, "dcdc9", "vin19", + axp318_dcdc8_ranges, 119, + AXP318_DCDC9_CONTROL, AXP318_DCDC2_V_OUT_MASK, + AXP318_DCDC_OUTPUT_CONTROL2, BIT(0)), + AXP_DESC_SW(AXP318, SWOUT1, "swout1", NULL, + AXP318_DCDC_OUTPUT_CONTROL2, BIT(3)), + AXP_DESC_SW(AXP318, SWOUT2, "swout2", NULL, + AXP318_DCDC_OUTPUT_CONTROL2, BIT(4)), + AXP_DESC_DO(AXP318, ALDO1, "aldo1", "aldo156in", 500, 3400, 100, + AXP318_ALDO1_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(0), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ALDO2, "aldo2", "aldo234in", 500, 3400, 100, + AXP318_ALDO2_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(1), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ALDO3, "aldo3", "aldo234in", 500, 3400, 100, + AXP318_ALDO3_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(2), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ALDO4, "aldo4", "aldo234in", 500, 3400, 100, + AXP318_ALDO4_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(3), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ALDO5, "aldo5", "aldo156in", 500, 3400, 100, + AXP318_ALDO5_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(4), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ALDO6, "aldo6", "aldo156in", 500, 3400, 100, + AXP318_ALDO6_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(5), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, BLDO1, "bldo1", "bldoin", 500, 3400, 100, + AXP318_BLDO1_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(6), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, BLDO2, "bldo2", "bldoin", 500, 3400, 100, + AXP318_BLDO2_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL1, BIT(7), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, BLDO3, "bldo3", "bldoin", 500, 3400, 100, + AXP318_BLDO3_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(0), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, BLDO4, "bldo4", "bldoin", 500, 3400, 100, + AXP318_BLDO4_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(1), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, BLDO5, "bldo5", "bldoin", 500, 3400, 100, + AXP318_BLDO5_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(2), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, CLDO1, "cldo1", "cldoin", 500, 3400, 100, + AXP318_CLDO1_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(3), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, CLDO2, "cldo2", "cldoin", 500, 3400, 100, + AXP318_CLDO2_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(4), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, CLDO3, "cldo3", "cldoin", 500, 3400, 100, + AXP318_CLDO3_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(5), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, CLDO4, "cldo4", "cldoin", 500, 3400, 100, + AXP318_CLDO4_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(6), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, CLDO5, "cldo5", "cldoin", 500, 3400, 100, + AXP318_CLDO5_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL2, BIT(7), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO1, "dldo1", "dldoin", 500, 3400, 100, + AXP318_DLDO1_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(0), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO2, "dldo2", "dldoin", 500, 3400, 100, + AXP318_DLDO2_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(1), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO3, "dldo3", "dldoin", 500, 3400, 100, + AXP318_DLDO3_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(2), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO4, "dldo4", "dldoin", 500, 3400, 100, + AXP318_DLDO4_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(3), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO5, "dldo5", "dldoin", 500, 3400, 100, + AXP318_DLDO5_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(4), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, DLDO6, "dldo6", "dldoin", 500, 3400, 100, + AXP318_DLDO6_CONTROL, AXP318_LDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(5), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ELDO1, "eldo1", "eldoin", 500, 1500, 25, + AXP318_ELDO1_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(6), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ELDO2, "eldo2", "eldoin", 500, 1500, 25, + AXP318_ELDO2_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL3, BIT(7), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ELDO3, "eldo3", "eldoin", 500, 1500, 25, + AXP318_ELDO3_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL4, BIT(0), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_BYPASS(AXP318, ELDO4, "eldo4", "eldoin", 500, 1500, 25, + AXP318_ELDO4_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL4, BIT(1), + AXP318_ELDO4_CONTROL, BIT(6), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_BYPASS(AXP318, ELDO5, "eldo5", "eldoin", 500, 1500, 25, + AXP318_ELDO5_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL4, BIT(2), + AXP318_ELDO5_CONTROL, BIT(6), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_DO(AXP318, ELDO6, "eldo6", "eldoin", 500, 1500, 25, + AXP318_ELDO6_CONTROL, AXP318_ELDO_V_OUT_MASK, + AXP318_LDO_OUTPUT_CONTROL4, BIT(3), AXP318_LDO_MIN_DROPOUT), + AXP_DESC_FIXED(AXP318, RTC_LDO, "rtc-ldo", "ips", 1800), +}; + static const struct linear_range axp717_dcdc1_ranges[] =3D { REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), @@ -1347,6 +1620,7 @@ static int axp20x_set_dcdc_freq(struct platform_devic= e *pdev, u32 dcdcfreq) step =3D 150; break; case AXP313A_ID: + case AXP318_ID: case AXP323_ID: case AXP717_ID: case AXP15060_ID: @@ -1430,6 +1704,20 @@ static int axp20x_set_dcdc_workmode(struct regulator= _dev *rdev, int id, u32 work workmode <<=3D ffs(mask) - 1; break; =20 + case AXP318_ID: + /* + * Only DCDC1 has PWM control on the AXP318 + * The other DCDCs control DVM through bit 7 of the related + * registers. Work mode could possibly extended to deal with + * this but it is not how it is documented at the moment + */ + if (id !=3D AXP318_DCDC1) + return -EINVAL; + reg =3D AXP318_DCDC1_CONTROL; + mask =3D AXP318_DCDC1_PFM_PWM_CTRL; + workmode <<=3D ffs(mask) - 1; + break; + case AXP806_ID: /* * AXP806 DCDC regulator IDs have the same range as AXP22X. @@ -1543,6 +1831,17 @@ static bool axp20x_is_polyphase_slave(struct axp20x_= dev *axp20x, int id) } break; =20 + case AXP318_ID: + regmap_read(axp20x->regmap, AXP318_DCDC_CONTROL1, ®); + + switch (id) { + case AXP318_DCDC3: + return !!(reg & AXP318_DCDC23_POLYPHASE_CTRL); + case AXP318_DCDC5: + return !!(reg & AXP318_DCDC45_POLYPHASE_CTRL); + } + break; + default: return false; } @@ -1585,6 +1884,10 @@ static int axp20x_regulator_probe(struct platform_de= vice *pdev) regulators =3D axp313a_regulators; nregulators =3D AXP313A_REG_ID_MAX; break; + case AXP318_ID: + regulators =3D axp318_regulators; + nregulators =3D AXP318_REG_ID_MAX; + break; case AXP717_ID: regulators =3D axp717_regulators; nregulators =3D AXP717_REG_ID_MAX; @@ -1651,7 +1954,9 @@ static int axp20x_regulator_probe(struct platform_dev= ice *pdev) if ((regulators =3D=3D axp22x_regulators && i =3D=3D AXP22X_DC1SW) || (regulators =3D=3D axp803_regulators && i =3D=3D AXP803_DC1SW) || (regulators =3D=3D axp809_regulators && i =3D=3D AXP809_DC1SW) || - (regulators =3D=3D axp15060_regulators && i =3D=3D AXP15060_SW)) { + (regulators =3D=3D axp15060_regulators && i =3D=3D AXP15060_SW) || + (regulators =3D=3D axp318_regulators && i =3D=3D AXP318_SWOUT1) || + (regulators =3D=3D axp318_regulators && i =3D=3D AXP318_SWOUT2)) { new_desc =3D devm_kzalloc(&pdev->dev, sizeof(*desc), GFP_KERNEL); if (!new_desc) @@ -1709,7 +2014,8 @@ static int axp20x_regulator_probe(struct platform_dev= ice *pdev) */ if ((regulators =3D=3D axp22x_regulators && i =3D=3D AXP22X_DCDC1) || (regulators =3D=3D axp809_regulators && i =3D=3D AXP809_DCDC1) || - (regulators =3D=3D axp15060_regulators && i =3D=3D AXP15060_DCDC1)) + (regulators =3D=3D axp15060_regulators && i =3D=3D AXP15060_DCDC1) || + (regulators =3D=3D axp318_regulators && i =3D=3D AXP318_DCDC1)) of_property_read_string(rdev->dev.of_node, "regulator-name", &dcdc1_name); diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index 0191467de4ec..251f057ea76d 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -128,6 +128,7 @@ enum axp20x_variants { #define AXP318_DCDC7_CONTROL 0x18 #define AXP318_DCDC8_CONTROL 0x19 #define AXP318_DCDC9_CONTROL 0x1a +#define AXP318_DCDC_CONTROL1 0x1b #define AXP318_LDO_OUTPUT_CONTROL1 0x20 #define AXP318_LDO_OUTPUT_CONTROL2 0x21 #define AXP318_LDO_OUTPUT_CONTROL3 0x22 @@ -564,6 +565,50 @@ enum { AXP313A_REG_ID_MAX, }; =20 +enum { + AXP318_DCDC1 =3D 0, + AXP318_DCDC2, + AXP318_DCDC3, + AXP318_DCDC4, + AXP318_DCDC5, + AXP318_DCDC6, + AXP318_DCDC7, + AXP318_DCDC8, + AXP318_DCDC9, + AXP318_ALDO1, + AXP318_ALDO2, + AXP318_ALDO3, + AXP318_ALDO4, + AXP318_ALDO5, + AXP318_ALDO6, + AXP318_BLDO1, + AXP318_BLDO2, + AXP318_BLDO3, + AXP318_BLDO4, + AXP318_BLDO5, + AXP318_CLDO1, + AXP318_CLDO2, + AXP318_CLDO3, + AXP318_CLDO4, + AXP318_CLDO5, + AXP318_DLDO1, + AXP318_DLDO2, + AXP318_DLDO3, + AXP318_DLDO4, + AXP318_DLDO5, + AXP318_DLDO6, + AXP318_ELDO1, + AXP318_ELDO2, + AXP318_ELDO3, + AXP318_ELDO4, + AXP318_ELDO5, + AXP318_ELDO6, + AXP318_SWOUT1, + AXP318_SWOUT2, + AXP318_RTC_LDO, + AXP318_REG_ID_MAX, +}; + enum { AXP717_DCDC1 =3D 0, AXP717_DCDC2, --=20 2.47.3