From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3262FC5DF66 for ; Mon, 17 Aug 2026 13:34:36 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id F040260844; Mon, 17 Aug 2026 13:34:35 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id r1gIcNPifGfh; Mon, 17 Aug 2026 13:34:35 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.166.142; helo=lists1.osuosl.org; envelope-from=u-boot-bounces@lists.u-boot-project.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 818AA60856 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lists.u-boot-project.org ; s=default; t=1786973675; bh=JDs0QzXnw6uktvOtK8cHncbCmLKEi3ok6Pvbu1srUfk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=wKR8a4LsNvUkTdSXnSvsK65fuNLFWEc0s/syw/cZm1taBRp9JaRW/g6YvHQeERS+6 8VT++Q50n26zLlS6X5uWGA+P1Dv+QYWHpyNqvzxdMvSULQPvZK2ZMEDCIzEXsU4c42 f+v6xPx2M6d7OV6icmHTxA90UyahUi2NpUULHzEIDjDl1PvePssA9LJtbGbzqXdvIm 17qcA+bRHXnR4wEdQXrZqWpXpzkLEelIELqEyZbV9jT/3O8HANtNcYGKRkT45WQL72 buIxUD9hWCU7FSvkdItyYLaBS1u5eX2KaOHZAhVJw3wdJtXGdKNvz468U5HuDzJ/Q4 5+i1DZlbKyxYg== Received: from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142]) by smtp3.osuosl.org (Postfix) with ESMTP id 818AA60856; Mon, 17 Aug 2026 13:34:34 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists1.osuosl.org (Postfix) with ESMTP id A287925B for ; Mon, 17 Aug 2026 09:32:02 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 94C6940099 for ; Mon, 17 Aug 2026 09:32:02 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id On7r8NSsnBjy for ; Mon, 17 Aug 2026 09:32:01 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=172.105.4.254; helo=tor.source.kernel.org; envelope-from=linusw@kernel.org; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp2.osuosl.org 8134640090 Authentication-Results: smtp2.osuosl.org; dmarc=pass (p=quarantine dis=none) header.from=kernel.org DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 8134640090 Authentication-Results: smtp2.osuosl.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=oNz3a4qQ Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by smtp2.osuosl.org (Postfix) with ESMTPS id 8134640090 for ; Mon, 17 Aug 2026 09:32:01 +0000 (UTC) Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 9E8DA6020E; Mon, 17 Aug 2026 09:32:00 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 213CF1F000E9; Mon, 17 Aug 2026 09:31:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1786959120; bh=JDs0QzXnw6uktvOtK8cHncbCmLKEi3ok6Pvbu1srUfk=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=oNz3a4qQrFKijo5YNvVGprR0OpW2AojLIk8bc1pVLu45B9eXFZhH/6ZVsyESDptyn OABg3fWMKtyMTT6pPW1tDVoiq/1HOHFpnK0k4XBBESnmyttu4Sg6wq5fl1/gf3mtA6 qfISwu2PG5r9taS8FBDnQDwINZ1vRyxGvCNcpKRnWY0VOLc1K3GQtv/GvZpZF7dhEN vZgyAospRz4qD5Qy1srUIKLLYmYljlS7qD06QcTWZYsttVkJcao34s9FC/M73mnN1U l/ZU33eTj5iQ57k8X5+oBVYSxplLGegqzPkBrKhr0cFTQJtV3LgIDwH7ESTwQ2yYnw y09KtOVbYW+hg== From: Linus Walleij Date: Mon, 17 Aug 2026 11:31:53 +0200 Subject: [PATCH v2 4/8] power: regulator: Add AB8500 AUX3 support MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260817-ux500-external-sdcard-v2-4-ca9a110bd9c6@kernel.org> References: <20260817-ux500-external-sdcard-v2-0-ca9a110bd9c6@kernel.org> In-Reply-To: <20260817-ux500-external-sdcard-v2-0-ca9a110bd9c6@kernel.org> To: u-boot@lists.u-boot-project.org, Tom Rini , Stefan Hansson , Stephan Gerhold Cc: Linus Walleij X-Mailer: b4 0.16.0 X-Mailman-Approved-At: Mon, 17 Aug 2026 13:33:58 +0000 X-BeenThere: u-boot@lists.u-boot-project.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.u-boot-project.org Sender: "U-Boot" Add regulator support for LDO AUX3 on AB8500 and AB8505 PMICs. AUX3 supplies the removable SD card on the upstream Ux500 Samsung device trees, and both PMIC variants use the same control registers. Imply the regulator core for ARCH_U8500 so the driver can instantiate from the upstream device trees. Signed-off-by: Linus Walleij --- MAINTAINERS | 1 + arch/arm/Kconfig | 2 + drivers/power/pmic/ab8500.c | 1 + drivers/power/regulator/Kconfig | 7 +++ drivers/power/regulator/Makefile | 1 + drivers/power/regulator/ab8500.c | 111 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 123 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index a5d6b5be29dc..8e78a7f224fa 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -790,6 +790,7 @@ F: drivers/gpio/nmk_gpio.c F: drivers/pinctrl/pinctrl-nomadik.c F: drivers/phy/phy-ab8500-usb.c F: drivers/power/pmic/ab8500.c +F: drivers/power/regulator/ab8500.c F: drivers/timer/nomadik-mtu-timer.c F: drivers/usb/musb-new/ux500.c F: drivers/video/mcde_simple.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 5b02ff18bd0e..62aa9e8cc565 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -1275,6 +1275,7 @@ config ARCH_U8500 imply ARM_PL180_MMCI imply CLK imply DM_PMIC + imply DM_REGULATOR imply DM_RTC imply NOMADIK_GPIO imply NOMADIK_MTU_TIMER @@ -1283,6 +1284,7 @@ config ARCH_U8500 imply PHY imply PL01X_SERIAL imply PMIC_AB8500 + imply REGULATOR_AB8500 imply RTC_PL031 imply SYS_THUMB_BUILD imply SYSRESET_SYSCON diff --git a/drivers/power/pmic/ab8500.c b/drivers/power/pmic/ab8500.c index 9ba096711e14..b9fae7000b78 100644 --- a/drivers/power/pmic/ab8500.c +++ b/drivers/power/pmic/ab8500.c @@ -253,6 +253,7 @@ static int ab8500_probe(struct udevice *dev) static const struct udevice_id ab8500_ids[] = { { .compatible = "stericsson,ab8500" }, + { .compatible = "stericsson,ab8505" }, { } }; diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig index 00a25acfdf99..a27fe4925cf9 100644 --- a/drivers/power/regulator/Kconfig +++ b/drivers/power/regulator/Kconfig @@ -16,6 +16,13 @@ config DM_REGULATOR for this purpose if PMIC I/O driver is implemented or dm_scan_fdt_dev() otherwise. Detailed information can be found in the header file. +config REGULATOR_AB8500 + bool "ST-Ericsson AB8500/AB8505 regulator support" + depends on DM_REGULATOR && PMIC_AB8500 + help + Enable LDO AUX3 regulator support for AB8500 and AB8505 PMICs. + This supply is used to power removable SD cards on Ux500 boards. + config SPL_DM_REGULATOR bool "Enable regulators for SPL" depends on DM_REGULATOR && SPL_POWER diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile index a40c9d340d98..a500a3da98d4 100644 --- a/drivers/power/regulator/Makefile +++ b/drivers/power/regulator/Makefile @@ -5,6 +5,7 @@ # obj-$(CONFIG_$(PHASE_)DM_REGULATOR) += regulator-uclass.o +obj-$(CONFIG_REGULATOR_AB8500) += ab8500.o obj-$(CONFIG_REGULATOR_ACT8846) += act8846.o obj-$(CONFIG_REGULATOR_AS3722) += as3722_regulator.o obj-$(CONFIG_$(PHASE_)REGULATOR_AXP) += axp_regulator.o diff --git a/drivers/power/regulator/ab8500.c b/drivers/power/regulator/ab8500.c new file mode 100644 index 000000000000..03beb0834d53 --- /dev/null +++ b/drivers/power/regulator/ab8500.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* ST-Ericsson AB8500/AB8505 LDO AUX3 regulator */ + +#include +#include +#include +#include +#include +#include +#include + +#define AB8500_VAUX3_REGU AB8500_REGU_CTRL2(0x0a) +#define AB8500_VAUX3_SEL AB8500_REGU_CTRL2(0x21) +#define AB8500_VAUX3_EN_MASK GENMASK(1, 0) +#define AB8500_VAUX3_EN BIT(0) +#define AB8500_VAUX3_SEL_MASK GENMASK(2, 0) + +static const int ab8500_vaux3_voltages[] = { + 1200000, 1500000, 1800000, 2100000, + 2500000, 2750000, 2790000, 2910000, +}; + +static struct udevice *ab8500_regulator_pmic(struct udevice *dev) +{ + return dev->parent->parent; +} + +static int ab8500_regulator_get_value(struct udevice *dev) +{ + int ret; + + ret = pmic_reg_read(ab8500_regulator_pmic(dev), AB8500_VAUX3_SEL); + if (ret < 0) + return ret; + ret &= AB8500_VAUX3_SEL_MASK; + + return ab8500_vaux3_voltages[ret]; +} + +static int ab8500_regulator_set_value(struct udevice *dev, int uV) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(ab8500_vaux3_voltages); i++) { + if (ab8500_vaux3_voltages[i] == uV) + return pmic_clrsetbits(ab8500_regulator_pmic(dev), + AB8500_VAUX3_SEL, + AB8500_VAUX3_SEL_MASK, i); + } + + return -EINVAL; +} + +static int ab8500_regulator_get_enable(struct udevice *dev) +{ + int ret; + + ret = pmic_reg_read(ab8500_regulator_pmic(dev), AB8500_VAUX3_REGU); + if (ret < 0) + return ret; + + return (ret & AB8500_VAUX3_EN_MASK) == AB8500_VAUX3_EN; +} + +static int ab8500_regulator_set_enable(struct udevice *dev, bool enable) +{ + return pmic_clrsetbits(ab8500_regulator_pmic(dev), AB8500_VAUX3_REGU, + AB8500_VAUX3_EN_MASK, + enable ? AB8500_VAUX3_EN : 0); +} + +static const struct dm_regulator_ops ab8500_regulator_ops = { + .get_value = ab8500_regulator_get_value, + .set_value = ab8500_regulator_set_value, + .get_enable = ab8500_regulator_get_enable, + .set_enable = ab8500_regulator_set_enable, +}; + +U_BOOT_DRIVER(ab8500_ldo_aux3) = { + .name = "ab8500_ldo_aux3", + .id = UCLASS_REGULATOR, + .ops = &ab8500_regulator_ops, +}; + +static int ab8500_regulators_bind(struct udevice *dev) +{ + struct driver *drv = lists_driver_lookup_name("ab8500_ldo_aux3"); + ofnode node; + + dev_for_each_subnode(node, dev) { + if (!strcmp(ofnode_get_name(node), "ab8500_ldo_aux3")) + return device_bind_with_driver_data(dev, drv, + ofnode_get_name(node), 0, + node, NULL); + } + + return -ENODEV; +} + +static const struct udevice_id ab8500_regulator_ids[] = { + { .compatible = "stericsson,ab8500-regulator" }, + { .compatible = "stericsson,ab8505-regulator" }, + { } +}; + +U_BOOT_DRIVER(ab8500_regulators) = { + .name = "ab8500_regulators", + .id = UCLASS_NOP, + .of_match = ab8500_regulator_ids, + .bind = ab8500_regulators_bind, +}; -- 2.55.0