From nobody Sat Jul 25 05:29:25 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 27FFF3E0C75 for ; Fri, 17 Jul 2026 08:45:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277906; cv=none; b=cjxoPIiAqtFcQyNRAqSvet/t/h6OPKC8aN07GxY5qXbq1vg/5VLBNTb1Wrw9UXbwdGQ/mqpIMsQVsMnH7Kt/2fvBUdZTAcNuzyWZK4VFF161GZBWYCJ2cAeOB0H2q4c7SOpp1bmmlZKSqD0i0JYBDWaq8l/mOtoGLhJn43dpvpQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277906; c=relaxed/simple; bh=LxL3P7ZDDGnSBlu/ddOmtGsoPccExZSdj2/X5iSlPsQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YPWfYSrSa/R2x6501OlVXxt50b9Zj2/xqMc6lBPPUXYMoeH+p5Um2Jnc6al7+X0Ih4/JUSmUeK9Td1EY2gZbQpJSftTHnsa26GrS6Gnfz7oLmkiAjPsYITiKqCFsmJlvKWsMDvRKrfwM5E2xEIkdHVD2Dw0mo4kEguOS+e4E9qU= 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=OUjg7WPY; arc=none smtp.client-ip=209.85.128.45 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="OUjg7WPY" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-493f4638f4aso35088995e9.3 for ; Fri, 17 Jul 2026 01:45:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784277902; x=1784882702; 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=tQrvCLaskKYjL8vcT0t1hmEL3tKSyDUY1GNsxXEl0Is=; b=OUjg7WPYNlsVS4dph12xUjUsktKwUOsd5xy4zzOjxsvuAs/qQPxAE/gjwmgpogpAi0 glTzg0TX9Fjk5+JmGW+GrCRjrViMvDeXGilMJuypNLbgltFmLD/ZIealW4D4IUi7KRnA 6K0Zu3ArM6ORjpBlcE9b8MNIAe0XPMgdQYkdM/E0ZLoMF7jYo9Jql00CDxr2FK5X0/ZL fcqkaU3ciPlTuOlZAOQJ4KQUNZ+61k9gMpxB5mYmGJEzam5/G4JEwcyzencyNkefQIpj 7uJDKD/tACcy7Avc84y7fGXaWYLt9qxCjaXYDfArvZ4x9SiEICSugqM4rEmZnj2DPrvH poXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784277902; x=1784882702; 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=tQrvCLaskKYjL8vcT0t1hmEL3tKSyDUY1GNsxXEl0Is=; b=sJ5ZDF6c6b4MXbypWmaucXv99h+m16HJAZEeXOwlLlWY9DdnRHsSg1G/paCfDsEs0i rubxlgAa4urHnO4uGHHuCWN2Efi5mQorl4TStHImOAgHY8WthS5zJaMwI8J1cVRP0JvX TJkSGUa0iJbK4NefBzhEtTMG70m8kpAO4BGbBCcZbwjX4bTQ6nxKIt4iJT9RKvUWdl4/ 3w0zmgWsMKjgOT2UDDsL40iWeZc6Jxux6Xx2uxgHCQMD5Kjzf8quUjYf9p+tFScZFYXR 5aFA6WmGBCAHtxJlUVOFlAkQ44AYlQXoUVQ4q+ll69QrKEpYFbD9agnSucYDxWrC4LB3 5URg== X-Forwarded-Encrypted: i=1; AHgh+RqtLbi3uTZWxyIQjxjAA3Of+BCBxtJDkG0lt5Vzdhe0ozz9XZSQpcKegEFX+9I8de6CHftPP+rmGQYq56E=@vger.kernel.org X-Gm-Message-State: AOJu0YySZMT9zEz9qCtBvkTwSzqfqMt+11J8g3+ACfJF+1lwciBZtx36 aF08bFIv5oEtHeLVMv39oXcbSBXu9/lRv2cP7RQgLLcqSAHnUXpdNn9KS185+Icia54= X-Gm-Gg: AfdE7ckKwP1fsXxOQro1rGT0ZqlPb/P10br9Uu3RmwrFXWfIZP6Vv7NYZIAGoIxNZcT Gose+CsTJiEtnBlARa5hqkAtXCxdbUBafLLqToev6Cvimz6y3Xx2C4lLNhnAs6uoCZ/AdF/dBOS s+Csibl/Z8mNEup1aRwe/eSjqoCzMwIUjQZTF5ofewi2vJraAT/mSAA8su5qgEuO0nY1Itq9N0/ tQfdexhsi6wAEAgrmAbddj6P7N2K8o8E6NZwl63a5zwIY/wfMsjPajTlt60fgc4225Y+GcePXSl N/RLRR51BTkMDtvIK/8xI8orAiMnqjWHK0Fnd55bOuyB+t74COUB8U9xRmt5/6neG/mcdAdiouX wAFxnsY7jd5EXVl1jfg2IL0HlwjJWnCRQXgj1kLHxXQkkV7GSqpSuQxQCtPZwIjoqxFtMnmHeTn u1 X-Received: by 2002:a05:600c:1c0b:b0:495:46dd:e238 with SMTP id 5b1f17b1804b1-4954a50ea30mr20255325e9.30.1784277902251; Fri, 17 Jul 2026 01:45:02 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:8e22:8a15:f33f:dc60]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-49548e075d4sm28741535e9.1.2026.07.17.01.45.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 01:45:01 -0700 (PDT) From: Jerome Brunet Date: Fri, 17 Jul 2026 10:44:29 +0200 Subject: [PATCH v3 1/4] 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: <20260717-axp318-regulator-v3-1-779dc1b97dd4@baylibre.com> References: <20260717-axp318-regulator-v3-0-779dc1b97dd4@baylibre.com> In-Reply-To: <20260717-axp318-regulator-v3-0-779dc1b97dd4@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=SCsGgJ9Tp6R0f+PpY/7kge/G93NkJs0Y9x0DlFSpF7Y=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqWeuFuBCui3i7dYpKcArfNZ/VQyYLRCCETqaxw V8iTAkuz4GJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCalnrhQAKCRDm/A8cN/La hV7cEAC0uoG2kDq8GOg7nN5xHReRro4C5xLKRb4iVbzjdGVqfYwnudi0UIG+RsxAjh5SuwOBugd VSDF13m5j1NLvj2BeX7lWHZfnMZbPhruIHwdAV4AcYmAoadoZZF5SO3/8x9ZYM6ykciri7BL8zq VFdCKKIirHlzJqMAS9jk6cOvabR7e6a2FHre17pooRHOLBXUWswdB2nVpSaDNSgSIIb9cnTKld1 +wQxTTNUxu+GI6Jo10qYtvT/jvoqBxsNRX6xJJk3DgT2CGkywr0Kt6TxPWmhcCCqyL6lataGqp5 QNp2AKtmQuji/HMginaGcpn5qwjOMPKCjRum1++6h4JQ3l/Uq+Fs9KLwP+pSuyEaK+NrW8zwz3r ywtENh4ApUsX8mduSfukyYuzQeUagIgaRX4ni+V1cFc9RgazYO4jrCgK59jp66p/kYIocJixmIX rMMsLWmCC+Ri3Lv+tSTEsiihL+g9ye56GVnwqm/k6B+MfINchNfuwXd9wIaVegWZg6k7U7u/+Ay +SC4V90iReAwMJu8p+tBfZ9NHhch3w6slXXA4Yc2AK2Da13X9G+rxS2gDw2uCaiRm7hBE7x43fX /yWRSz4/5lbObUvP5uCKgHR2MR5owYS69WTWCIj8uz9QFDQNHc55HAMXo9k1TnD/S7wdeqD3gMV 00ZL3vuVwmiPGJA== 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..95b3984fe0f9 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-9]= |rtc(_|-)ldo|cpusldo|drivevbus|dc5ldo|boost)$": $ref: /schemas/regulator/regulator.yaml# type: object unevaluatedProperties: false --=20 2.47.3 From nobody Sat Jul 25 05:29:25 2026 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.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 E54B73E5A0F for ; Fri, 17 Jul 2026 08:45:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277911; cv=none; b=QH1OnHkbo/smX8rUg+CJjKXjpm1sOgCOWeWDEI+FLKy3hnwjdA5IGVf52pHrP11J11xdMvAYG6m7JLQpdQQ1Wm5XiNtClSVmSqub2BP/s6jKfooQo579OnxI4juHQYYSGQodktPoP60oyPnKlzr32cDs78HM1icv17KzAO5FcWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277911; c=relaxed/simple; bh=6NI9JA56riU0pMtBwpeYQDHYV0ybRiqP573kxQrx+SM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aS8hvSj4kT9cbfzjc1CIG2IBnsQvSJzFQLAp0ij4kNkwNgIgx9cb7PsVmDG8rPGY+wTBDKaMlNWVxDKP2v+cRrhCE0hh4pd2562GoHpqBR++FVxxVc2IzCJ6Xjc6umlDb7c/Ys4SGT8kppYShAb++S+vhA/+iCF67Bcmnbw3eNw= 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=eHH16SJB; arc=none smtp.client-ip=209.85.221.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="eHH16SJB" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-47ddf7b09aaso5087716f8f.3 for ; Fri, 17 Jul 2026 01:45:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784277905; x=1784882705; 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=88wUvyx5sgfQq99G3HgUdBEQZOMyYYFf+RPeukqSGfg=; b=eHH16SJBMiXffEC99LYkVWmZSYxC6428PqGz+uwR/r63fYaEnV7ftiBwiFTqBafBD7 Bb7sI1UtVOQGHca0drRlGOxnk8SFwuhyWca06FQALBOoqOTjkPcquPC5rJ5pUzBCMgFz mq0DP6yf+fqmWXTda4dZtG5WAntANsaS2p0UxX4u0VrbJ6rxe64IGarpxqVGgAI2EyOG fNh5DKJxVkMZNMayiyBFUSGEOkTDDMyGUR56ycqjQTfTmk+W0jamDDGpMcCtTgvxQxy3 Jmsb6Vx6yD8o6USMRwKgFLvcQm1aB/zIIkEsSixBeABqO3XuFi5F8CIZZ5Ja/NewNrmd kqUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784277905; x=1784882705; 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=88wUvyx5sgfQq99G3HgUdBEQZOMyYYFf+RPeukqSGfg=; b=sfgrNSZMYy3I7v5nURKsO/mTPr23N+m9t9iki6kom/myW/rHqk6UyqL6wNB/YnDlZK pnZEKAD5FW3AVQl8db1DPFignWuRyY2GceVGTA3g9rlArIi/ZLymctqDTZ3QANCxsmCz U56+Ht0rR7HDsglBiqL4q5qs9aXdcuKoKlc4YQMJlKYaMQrzASHKRySE+gAITHzaoQuJ AUhYE5LpNd/y4siwkr5P9zbNpaJgkjFQksnSMEuO9zKRxDyRcC8xRm9wNwVP9nXpYYKm xR8dnTab5N6DgZjn6EncIkhgw0aqRB0AQcrlaCAwidIPz3AAtznoU/sWFsI5RBLH89iw OKWA== X-Forwarded-Encrypted: i=1; AHgh+Rq2SSPoAd0mYq5EFvjlk2lwF7nHzvh8nfLxSBU9etwiLY6YrpzYB8Hi9amb9y6TnXNLWv9hNA1x/aBUJJU=@vger.kernel.org X-Gm-Message-State: AOJu0YxiaoI1at5rqi3TvflpaUv6fnsMQHxsRdbi4xL8/oqkQueaPKGP znuD6NXutXIJs9PCrUipQl0oofNKRJvDFsmoxzNZ9p4JUTnvp5PhgLykML4PzvNqrO4= X-Gm-Gg: AfdE7cnuA9uZjsnYQM/Dfq9V/3ETe/ZRfS83E4eAFrD4YQroZNGlaTZ+CvkLgNic5ZD Zyolzw7kuIuq9pJww8RydlNjaImLimG3eE1u/IRC05fUxgxAeQcqmUzHbRry2eJgHGffj53MQSZ hgKyvzBAk5f2ia8j49SnJ3tM2Qug7W7JBAqIK6SVVvSx+MPgtUPOlvFDGYNJTPJlhlssBi0gF0b Bk3sGZyY7X3/HGiEERpxelTvm+PVg/g37CUBx49TAE9Xule2+ElS8Ek7vQyb/TN5Eji/fTVbsuu y+L5EmGO2PBnAOcpFdXUV8fIDJ6pTFk+8Wr9xNBpC7OpUyIvi4NG7cHSYHw0BvSq4Vbrq/n1Bnk JXjMnrhmNSlIjoI+uZOlPy8WyDcqcI2l5m5qchYoZZc5jywog6Y2mAEJ9Afz0bQcd+onKyP/voZ rf5xoz7TInV50= X-Received: by 2002:a05:6000:41fd:b0:47f:5990:45be with SMTP id ffacd0b85a97d-47f62305786mr2538715f8f.19.1784277904966; Fri, 17 Jul 2026 01:45:04 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:8e22:8a15:f33f:dc60]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-47f63ec7ea1sm1794052f8f.24.2026.07.17.01.45.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 01:45:03 -0700 (PDT) From: Jerome Brunet Date: Fri, 17 Jul 2026 10:44:30 +0200 Subject: [PATCH v3 2/4] 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: <20260717-axp318-regulator-v3-2-779dc1b97dd4@baylibre.com> References: <20260717-axp318-regulator-v3-0-779dc1b97dd4@baylibre.com> In-Reply-To: <20260717-axp318-regulator-v3-0-779dc1b97dd4@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=10527; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=KWfWKnniP2e14BUEEmVietQKTZrakuMtR8orgbStkII=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqWeuGebtFNAXMJVlah6aRG2RWep+yi41dGfLG+ eK/yFGwuy6JAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCalnrhgAKCRDm/A8cN/La hYihD/4+xDQGGht0RePbwjqgp8Of6nwXal3sH/j/7HJAJXrCo93nQU9ZMZs9oUG78jGzTCejyoV Y80v1hYcsA9dVYj+5QHUIpiHd8cF1mrHLov8BG9Vj2X9VNxPR9QibYQVyJNA1YyrXuIBw3yzaCE 26JTljaXqC4Eq8jIn2oD2uZvZrI30n7EkXc8freoCXpXMTNWEZZQkjjW9qv5VIR+RjSNaIsO80J SqX28811I7Awx9ajuwG+PNghKbGIJq5w4FJ6rbHcs/LFyh0I51Y0Ge17P2SXSZmG+TypFbQ/nuD 2sMIYyVHOelQoxt83MWeiEZW61rn2F5acL4HGs1GpmliLv1n+dIBnMKokdeRePKlCdHUkIGcQm1 Zj+KzpOLRfBhlmpRX30ZB5CjEYVaHxCoUffRt8IN04Pl8CCrKZFX7XrgI+MTuqbckUk6czAyINH /077uq9SG32bOH2vH/9o+UURNzkXp0Ce8ocpG++a9EHf2pWU/9rBwEeBbVfM/xELg4qyoHJUGh5 x9wq13NvFU2lDoBiz4D4IhOwDRBK9Xsy80yd/nyaNaSp5SHcC6vHPnHXO7tpVNbk5AvPE7TBsnt mSEqecedSvwpwVvif4to8LTTUCkoz27xllCAgj8MaeAdb4S+aTBG7nechacz3bQQJGwaQNH4tYW 0NVqbFxk9S13XHA== 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 regulator, interrupts and power key devices 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 | 78 +++++++++++++++++++++++++++++++++++++++++ include/linux/mfd/axp20x.h | 86 ++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 166 insertions(+) diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c index 5c93136f977e..4e4ebfc78525 100644 --- a/drivers/mfd/axp20x-i2c.c +++ b/drivers/mfd/axp20x-i2c.c @@ -65,6 +65,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 }, @@ -83,6 +84,7 @@ static const struct i2c_device_id axp20x_i2c_id[] =3D { { "axp221" }, { "axp223" }, { "axp313a" }, + { "axp318w" }, { "axp717" }, { "axp803" }, { "axp806" }, diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index 679364189ea5..c8aeebd01bbc 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_CTRL, 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_REASON), + 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 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 struct mfd_cell axp717_cells[] =3D { MFD_CELL_NAME("axp20x-regulator"), MFD_CELL_RES("axp20x-pek", axp717_pek_resources), @@ -1313,6 +1385,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 b352661d99a1..c1f9dc06387a 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,69 @@ 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_REASON 0x51 +#define AXP318_SHUTDOWN_CTRL 0x52 +#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 +883,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 05:29:25 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 943AD3E5EF2 for ; Fri, 17 Jul 2026 08:45:09 +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=1784277912; cv=none; b=dHSy5dENjX7jK4fhpHGHr/Lfrw55P5T8ImUSa3dgIsJuwkhhc5WOlxEOjwRS6Zx2CjxLBqZUKDT+EmZ9x0fuZ8hNMoyBZ/RrUNop32nTerHpv0e14Roa8W8yjQg3X9QIAFcre/6KY2rImaBSAlSgKl9W546lb/0TxHrXS448AlQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277912; c=relaxed/simple; bh=bA8lkVa6MhT21HmHeSNZxVJnTSK1jb7w+kbz7hqzzyw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=row55oi+qBF/CpbioFdV8PID9V3bMwQWtxH/iLOPvf6dSArsoS45PzNqdv46J2HZ1ZrDs6AgEK3M4A/DtIUqmSupCT5R3oLdCU78Uw00L5fJn7OHNBpQHnA5zw4PjsuH4Af61LXJWIf0Mr+qVQR98ax8D4u/DSSgZogpyCYjNUc= 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=lOqjSJXS; 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="lOqjSJXS" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-493ec555a26so49499015e9.0 for ; Fri, 17 Jul 2026 01:45:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784277907; x=1784882707; 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=tvg1048boO0grk708g2we8TSqKA9YID/DFGl64E7ytM=; b=lOqjSJXS9Ui6A/uUoH4/9Jim1Bdrw3/hB6TPYJTGgY5VsC1AkSZdyUM8IaGZpowUxf NJWqneZzAnALIKt2LB0nvi5dBA5k5mQsjJtQqXf2o5T5SjmqGr77gEW0wh37FK73kvoT I/Ju6d+UrlPzBV4ZwzpvpWRc219/oQS1CuQT38XBJnrs1OI54jWw/WmROLtMRp8rSbLU b/KX+OrmvDKT1ZrF1NQ1PRrnfBx+P2qmbEn0jgGB9AAhplHMIq1XDQNgm1mWZbL7KW2Q 7vSWHyXYpVLZAZTyfWhJlQShFUEAyV2WddSsDhepGUKgY4BrxwCiBNLY4R7ba05tzGVg 6tog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784277907; x=1784882707; 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=tvg1048boO0grk708g2we8TSqKA9YID/DFGl64E7ytM=; b=oOHYvjOq0hSRm7Rb1UlbrnZJ2DChd9PbUus94XkFANLiWDNyADK5BSyWjKt58ZtdBN YnzuYCbJibCITyPjw3zPEBvnuBN3495+0sl1OUJ0km4YWwGJ9gUGirZPOeeWWZOgI4X8 AQRtXNfUHR7UxqqjMSf5CghI8axY4vF4klMGkaLt0KTS7rgOz7qo57zaKNZyULPRaDfT VIpECz62UDjPZ3m2zD2IVikAIsi4HJwhUarpRCOm6n+5/cNOutyoK4OlLaSTZRiUTuFh giPBUlwDWqA/H66AaFVgTNP50Hp7uz1Bt2RMMgsEOgu/Db30cPo7+G4y0I4u/j8p0l6s S9AQ== X-Forwarded-Encrypted: i=1; AHgh+Rp5i5zqRXOYbRHoG/KZSAjNm7R+yh0rokA3ZsKfLBApGHXbLluKvorZ75BIaNsdER02CBQ7PrX801WIzsU=@vger.kernel.org X-Gm-Message-State: AOJu0YxXjwqfGqdpCGo1w3ll395mUvtMc+mzqwNzd1og4+YRAD3+Aimy Y0u6jM67WjQio5NoV1lcKAI/Nt/fKFTuSUcN3BWVz+I/h+8xJC/STvxiqg+7pAD/KSk= X-Gm-Gg: AfdE7cmdc0R0sz0Xta3LkM2SXmXVNhiDew8OY+HAZK63CjUxd1fjfZwKmJyPiIXUabf GT2Exd5QIihKOW3AtwDzbKNDYMgYCWEGe8vWVQkmdmRQBZtQGP8jbCkg67Kl4URTeboeeyZYyQk /6Av5D9fjClj6yh2m6/yxhTPeDeBjhaf1kS0pgVpV1oTrcxntFMvN3trX/YidQVPzcZTl2CG4/L +SwGfqTrVrJHSM7xpba9BqXctoLDDIuqmU50PsqRTSgRaZOfBOnzTLw//4JiGsrskZphx7s8muC rixUhDNMlNbiLFvs8bARyniTKW/RV1baO/GlPKy9LZJf0HKxxMb9jwVozmzHqoa+4j56ZOlT2tS qIigN+G/BF2NXWxOZl/LEwcr4PVa9Y4Gcu6tSzHju5TNIUim8b8oarGImCZMoBYk5nGV6rdSmcv pJuBG95LBzEUA= X-Received: by 2002:a05:600c:4ed3:b0:493:c548:87fb with SMTP id 5b1f17b1804b1-4954a513410mr17676585e9.36.1784277907166; Fri, 17 Jul 2026 01:45:07 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:8e22:8a15:f33f:dc60]) by smtp.gmail.com with UTF8SMTPSA id 5b1f17b1804b1-4954a2a24b6sm30017505e9.3.2026.07.17.01.45.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 01:45:06 -0700 (PDT) From: Jerome Brunet Date: Fri, 17 Jul 2026 10:44:31 +0200 Subject: [PATCH v3 3/4] 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: <20260717-axp318-regulator-v3-3-779dc1b97dd4@baylibre.com> References: <20260717-axp318-regulator-v3-0-779dc1b97dd4@baylibre.com> In-Reply-To: <20260717-axp318-regulator-v3-0-779dc1b97dd4@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=1244; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=bA8lkVa6MhT21HmHeSNZxVJnTSK1jb7w+kbz7hqzzyw=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqWeuHz7+9BMxF+8DtbcXF+tDOCdMJr7DIsyBCy Q3HfIhQI6uJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCalnrhwAKCRDm/A8cN/La hQLbD/45l/YQ90bI7HPXbSZuGilmTzBYXLFxkR0aDnbsueCktzPY1tekTIPJJ+VMPUQ5ZoAQzdf klQopZLUjLIFNIEXqpbFNDlAatpPCu+6B874IYahPpeWgwnYjHc+e5V4bV6HieuzpLUeaCR74HA 9RNRByYYmQeswkhgyNRXyVW2VJB9zHgzwuMj0oxUldHlwUHt7Vwe6dNNQmOVSUvFGpPeoVeUc+F 9lBG93u+l5jigXaVgy889MNSoPiXx5lqE0a6mRVZjJJVfsHBqJ3zS7DO7gAe33wR2tUlQud8VpJ /2EemjtTme8tYeIqiTOXMjJo7Y7+4+PqyuiRm0MGz37bNdH4hNDdKdiodd9RXMP96YmCcNOeAhU JKWz3ok103oEC8K8zW3PZK2U6Y24PwjbHO1SQ0/CLOKvW838EiIfcdG6cRlGVNVduMDVCVqr6vE +RdL35kYfEFCfDS/Nk25RzNX0jcPbv7CJToPzPQPKmgOB5A2u4nVSCVoGSzieGiS0tBjUqbmoHC E6Nb1+4N6lomuBP2EDI8K+1yZPxQyk+YN8qzoUB+n1pFDdPhDage7kpOs5oFzFQJPENz7FsmIf4 N7+qq4E4LG++gNINZT8LZIvegakh5Mo27v/VEi642lriEpv/1X8CfguOqU7+feQ44CAX7Yyw5nv ByfHyU66S7Ge4sw== 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 --- 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 c8aeebd01bbc..2bbe73afff43 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -1123,7 +1123,7 @@ 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), @@ -1133,7 +1133,7 @@ static const struct mfd_cell axp318_cells[] =3D { MFD_CELL_BASIC("axp20x-regulator", NULL, NULL, 0, 1), }; =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 05:29:25 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.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 3A0F33E5EE7 for ; Fri, 17 Jul 2026 08:45:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277915; cv=none; b=Q/Fn/3r4UQO4v8gnPcKTxg4T16e7/VWOmi2MwnO2iG6/pTK4ZHoamwonySgdG2SUCLwL+FLLmhoHQzEK2G0a5EJ7DqdwkTyhdz+wEuYj6J2n97fgi1MGAJaGwXaMI37Oxi2fCsDPwuVH64QQKX+zZaVkvg5v1q2/eBBo9pi3gd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784277915; c=relaxed/simple; bh=/MEpAfEz7DmnMzx5eJMVjh6hAAIFDiAyNI2jcMbDtz8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cy0cZpZGWgVUfGZh3azyj+PkQrOJp01qIZcm8cjCJVyBQVCI6oO3EQyf42uzCJtRaBS7Wi1iGwVWUlPmF+VHja/wyvm1VAROKdNQoltPP7lfKNisi87lE73ymMWStxXw8C46idao5y1I9OF4k7eyGZMKYp9or87C/DO2exq0Gws= 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=VRdsTQIN; arc=none smtp.client-ip=209.85.221.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="VRdsTQIN" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-47640541585so3758670f8f.1 for ; Fri, 17 Jul 2026 01:45:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre.com; s=google; t=1784277910; x=1784882710; 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=XNe2LGcG6ezZdW7XHkW/C9cPHcCj1tsqoKufLbckPF4=; b=VRdsTQINIidh1m+Oc/UUdUPpFGeH4RT03JOsTaoLbX8aLCr6a8go123AQhH0rEV7UQ nae9EdqAK4+GMW0YhWMEUK3yLfx/uqyi1IpR2Y4Wi+dvILg1IQMHaqxzj+u6DJd13yDx iGxNWnjH4ra8wPIfxwiXuPxEf/rvs+eXmmbb1HBsHYSNMowNiOpAoNXGk0MakTOwhU/a uRU0JYFxkppUiwm0BIvOv4XH168Whl8tMM4m2QgthEkZidxCVyivmqypyKzGRIG8akzD LpegnUSt/BH+OTiVKHNlHIfRdYclL0ABkvhldnUh++NYGIOhJvHbGo0FQOLDJIf2Rv1A jyTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784277910; x=1784882710; 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=XNe2LGcG6ezZdW7XHkW/C9cPHcCj1tsqoKufLbckPF4=; b=ZBSrB4FaFZLxsXPj0UMWIm7jtNrH9D0eJd1C0Euy5Elc+OnWfD4sD8vbveZ5HLeurE 5L9gIAs6lzPXMciXNzzhsmY0uMlcaJsu1ubh4zQO6ylH5XNLq61mii86005ewDQd05Ao feHwFd7BewvOiWUx7PgGTE2VyCUtQHBtGExOf5Q7hdYzEU6FKdwYb/i0NUn/CVrZgyRQ RxoapBGBDg2l1CFjRy0nifcw601jorAF1pRJp92ZeqAfcCn+jFcWszjMNZL5uqRx0jHu 8P8RBAC82yBBN1FALOWUBmGrckaNcHmChMmz4LYLTy/WDve9VeyD/ZhTkMf+w5uFMnIx tBYg== X-Forwarded-Encrypted: i=1; AHgh+RrE9kKbtdHqhb5A2QqFEDguHSn1lOmqtXyX1+h8d6llxG6X9Erkx6r8RM1O7Dzuu0XA3edSJlLjrZLaQ2U=@vger.kernel.org X-Gm-Message-State: AOJu0Yx8AvILfc9R25zPNr6mUtSBM+ao959E8jzBRo4JFyppQ8bjiiGS vp+cRKmGVcM6X6SrD1NjIVDScgz6oEo5UMlah8rPECnJgKOFf7LCMDPGSxvVT1wcco0= X-Gm-Gg: AfdE7ckjsQhoAMPVdfXcUBoLHNcERfsmiF0O6ptDZ8+5cJ69lzlIi0YzIkLj/zFHw30 jaYfffVsvouA/NLNdGklk5yJmHMzsMlMkXRKcWZqsxLiaotvra12V8O9eJjxIPGN9oZ1OvktbLN NM2HXDchZ2TTF2iBvPku/k+oQyVIEiI65e9Aa2p96hClLxKVk4vB2WyClCuLUmPYgwxaAnkFh0c 2Mj2it9obzpbgLA6KO7JKOw74k+AfIaXF9XRjLstDM5/wxuDZxbPS3UiMrI07hgkA/LRV6/1cM8 b4HIxL/TqsD0/eNb4IzrpyRk9jKiBwYNv0GpQRb5e8T9u06wf0eO7XIfslKOej6L+hLVASXhhtx Py/SiCp3yzxkkgKv1O4uRwWYjVmvJ8BNPI/4OrjzbbGNPlTCBjyEA5XjZ2bPypUjQAUk0wxnLID WY X-Received: by 2002:a5d:5f94:0:b0:47f:5289:d5e1 with SMTP id ffacd0b85a97d-47f62337871mr1988645f8f.37.1784277909781; Fri, 17 Jul 2026 01:45:09 -0700 (PDT) Received: from localhost ([2a01:e0a:3c5:5fb1:8e22:8a15:f33f:dc60]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-47f63e49469sm1895415f8f.7.2026.07.17.01.45.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 01:45:08 -0700 (PDT) From: Jerome Brunet Date: Fri, 17 Jul 2026 10:44:32 +0200 Subject: [PATCH v3 4/4] 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: <20260717-axp318-regulator-v3-4-779dc1b97dd4@baylibre.com> References: <20260717-axp318-regulator-v3-0-779dc1b97dd4@baylibre.com> In-Reply-To: <20260717-axp318-regulator-v3-0-779dc1b97dd4@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=19540; i=jbrunet@baylibre.com; h=from:subject:message-id; bh=zgAh78XUQZfCkErlZaH6gQjPJi6UrTyryUXVDKDs9gE=; b=owEBbQKS/ZANAwAKAeb8Dxw38tqFAcsmYgBqWeuIpQPLxhTXaAjfK2WE8yizksQk9Phr73+4B CbFH4NExSaJAjMEAAEKAB0WIQT04VmuGPP1bV8btxvm/A8cN/LahQUCalnriAAKCRDm/A8cN/La hRPSD/9na2ZojJUatAB9lU7YY27JQilQaSV7sBuKYWcG05i7ioYnc0gchAS64mJZiLTd38PeO5m 1nNGWUYKWZkx90bCFn8d3hvPpHQMXIJXxBfCBDP1Jk4H/t9anq7aYnbLUcK9Q/YvWMUgpAVZ4UU 6Wqpgd03yxIAe/kQMax3R+zBNO/6Uj3j7GobYwJ2NeB5e4SGHXsf+XXHfclXKXYsFMxzIzFdiMN omKP9oqORPGZ1HYVeMI3YZXEfSYL9+z6S1iE3v62GxADYPNzozA8RlcJouQtZdHUSipg6STuQg0 Ilfkm6u9cSICwTlBk5bIJq5mnj1HnMu8H9HZ8CHH2uR+nOn6OAhiL4n9LsPcZoJZYm0jzdlETyW BPRN2YwX5Qg7A2gMwVxgMYnqVSYuN+6Zana1Q2dvNGwjm9pPD2/XZ0VJJq2/uHuNiWBLACnr1Y4 2sNaKFzSse+9dJPoWsz4ngu1qc4PM4aKOYNNBMPwnBL+HlAcXRZ4HBZqJ0rq7/39yMHHtH6vPaj V3+2uik4cko6taydVa0uE6l0BoMcNdhDCmpinaWUbppO8MOau48Q0I/ZQHxxI3BYwiprZ3nzob+ viuCx0fEScpkdFBf4N9iU4CB3ArbdXJZvojj5Ww/PExnF1lSnDXH0G0sQyq6OptQPqt4DGS4K8I Bi6pI/Dog+meQGg== 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 | 298 +++++++++++++++++++++++++++++++= ++-- include/linux/mfd/axp20x.h | 44 ++++++ 2 files changed, 333 insertions(+), 9 deletions(-) diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20= x-regulator.c index da891415efc0..6f887250d640 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -138,6 +138,27 @@ #define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0) #define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0) =20 +#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 +392,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 +405,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 +459,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 +477,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 +621,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 +678,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 +697,19 @@ 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 +885,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 +1619,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: @@ -1585,6 +1858,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 +1928,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 +1988,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 c1f9dc06387a..89001990106e 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -562,6 +562,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