From nobody Thu Oct 2 18:17:39 2025 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 4F1A5265CDD for ; Sun, 14 Sep 2025 12:42:48 +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=1757853770; cv=none; b=cUe5vRQ4kaGtuS3gWcJTuRlOfZsSpELevioT3RNQLU28q1SJTdp0DTPgCgj9WZamixafzl2Cc6aqf/yN1am3L49KoM25cPSTaeDOIQ2UCw2DIgFdPo/LbUvoj+e5kAYIPKeqRpA5AMdOoh6cxJYEVTbcuouKOOOo2XLnHkRcGC8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757853770; c=relaxed/simple; bh=z9kDI07Wpmm78QQXXWrYdY4Mhw7hD9DVSF7dxe4fhs4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bv1qQCVzJssphLKii1BbOhG3jBnEgX3FHrkwAtcWOCwD8yd3wZv3wBjnCQ7bLtc74reTJjnxkf8ZTTmwx4V3wT6xkYWCcPe1TV2bm+CmmeVgjYa/aVtw/FjLRdTS3Bf1B7KI9TBYhXwJm86QRcNCebneA3vvq3hUWYOipkUZktQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=K9jvENiU; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="K9jvENiU" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-45f2b062b86so2899515e9.1 for ; Sun, 14 Sep 2025 05:42:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1757853767; x=1758458567; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/NzjVjcE/iDN8N+s4aQ4GgYpTz60HWxWgUIghlOd1Cw=; b=K9jvENiUZznEQQ2zl8z42koo8py8wVLvKCAqOahP6RtvIdy1MPjfpev66uG4dB4X6e sXchn9ii1PmdLd9Br0asn3KPrqr4+Q8Iu5xXTJHWM3dhNRxaKxRwP8xlCgQTLBRHLB2p 2k5VsNc8DlHxIhlOsQfP7E0/a2zkGAFmvCvMKkigqH/j8hvuhQDeWAkhzRlAzTj1Lulw AqWfISBVBoJlPXZHgVvqog+kYzCGfiq/7+rYTMxAR3UhOCYSobY0SCYvLJu8Vn21tTkF 8RIeL8mU0qBwPGUIbyGE9nD1UsXzDbqt2rMRD/cHC0R07UJmf9FUjgD2b75baDW0YD0T meqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757853767; x=1758458567; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/NzjVjcE/iDN8N+s4aQ4GgYpTz60HWxWgUIghlOd1Cw=; b=KIP2viqhC+QZnqFtsbKOIbnHoO5Rh9mmLdvTQPAr2z6RMYtRebfkKLC/FHI9pISAEp p0evXyk/DPv/3SeKLnm5Iwghn6dVYAsMsLGavJYj3Q3IPZczrOlu04/lvKh7NCqYXciB nukXo8ueaaoY+2lByvayt9C2+0gApQJEK5bHm3lOY2LABDaR/nzeiEdl6rn7SBZgeLZk aYGd0gHxcfANVuBBFgBZ4cxq1LHc+11/Yod00wYn/MFCZQd94Fbrh4Tnz1cyXgf9OfHi ThJ6addJRKUYkWgWSdPW5BCBbHOXXzFOL10iomtsnQDx7pQph4gciYbLIKZEHfL9wte0 eLXA== X-Forwarded-Encrypted: i=1; AJvYcCW9ikgyivUPu02ZJ+tHv06FCzST+3ipmt9r+mJuBr9qJl0IJBc8I5IfvLgJwQPK+JAk6wZLTUX58GG92+Q=@vger.kernel.org X-Gm-Message-State: AOJu0YxaQyku7yFJCRSbij03Wbc/fi3oaEVGpxTLkM8oP71Ny45ZxcR0 IHpUIhH5N1Vg+SO3qRtKXh8b+JaapAJODWqIUtTE/NdDSpC9ZofWgkfp X-Gm-Gg: ASbGncv/MKvIZqODZgkmzbxuVB5Bbensdpu3mSFvpTW50VDgr1E76dCbpxIJxIqzwp7 YICo2T6HOYBhyEpsxRXnHTuhEQYVBambCvyE6XyN0VW9O/iwiUFKK9C3++hVQPfvLlO+gL1u5FN /Z4BMBtQj+b+kSi/dqrc7I1F9NWyTG0XqVdqd1ogv8b/C0dgFAbH8FBMlYk+ULbD8h4rZfT9HAg XQV5iWs8t0wpb7/neqSsCTxr1FRGpRKOnYKOvXecp51wMFT70DFJXVWteipA37CHiPN2WdYD4zH W3IW23PeF1FHqeyxh8T7exbZiP63xoew+nSpLLrHvFR8GngPxspn98ctZfskAs0nJ0mIVUEqPOW 4eCWMQZ7N1NOMr6BkhFAn41vwfWRAZ5ILYQUAyJLu+jMJCCpS8Ia6f6t87eADF13UbwEJZlCtoL s8O/AwsMrtPKarijAPt5Y= X-Google-Smtp-Source: AGHT+IF52cVcLt/Of4hqhHb8/XivoKbvphnH9NSc4wXU+Eh0bTuKYlp5oRDfnSzGvHYzjro9HUgg/g== X-Received: by 2002:a5d:5d81:0:b0:3ea:3b7b:80a8 with SMTP id ffacd0b85a97d-3ea3b7b86e1mr1126408f8f.52.1757853766693; Sun, 14 Sep 2025 05:42:46 -0700 (PDT) Received: from ivaylo-T580.. (91-139-201-119.stz.ddns.bulsat.com. [91.139.201.119]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e9511abbccsm3727773f8f.9.2025.09.14.05.42.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Sep 2025 05:42:46 -0700 (PDT) From: Ivaylo Ivanov To: Krzysztof Kozlowski , =?UTF-8?q?Andr=C3=A9=20Draszik?= , Sylwester Nawrocki , Chanwoo Choi , Alim Akhtar , Michael Turquette , Stephen Boyd , Rob Herring , Conor Dooley , Lee Jones , Liam Girdwood , Mark Brown , Alexandre Belloni Cc: linux-samsung-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org, linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 7/7] regulator: s2mps11: add support for S2MPS16 regulators Date: Sun, 14 Sep 2025 15:42:27 +0300 Message-ID: <20250914124227.2619925-8-ivo.ivanov.ivanov1@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250914124227.2619925-1-ivo.ivanov.ivanov1@gmail.com> References: <20250914124227.2619925-1-ivo.ivanov.ivanov1@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" S2MPS16 is a PMIC, manufactured by Samsung, particularly used in exynos8890 based devices, featuring 38 LDOs, of which 11 are used for CP, and 11 BUCKs, of which 1 is used for CP. Add driver support for controlling all BUCKs and LDOs, except the ones used for CP, as they are not documented enough and the vendor kernel doesn't handle them anyways. Signed-off-by: Ivaylo Ivanov --- drivers/regulator/Kconfig | 4 +- drivers/regulator/s2mps11.c | 147 ++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index eaa6df1c9..41b56b647 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -1352,10 +1352,10 @@ config REGULATOR_S2MPA01 via I2C bus. S2MPA01 has 10 Bucks and 26 LDO outputs. =20 config REGULATOR_S2MPS11 - tristate "Samsung S2MPS11/13/14/15/S2MPU02/05 voltage regulator" + tristate "Samsung S2MPS11/13/14/15/16/S2MPU02/05 voltage regulator" depends on MFD_SEC_CORE || COMPILE_TEST help - This driver supports a Samsung S2MPS11/13/14/15/S2MPU02/05 voltage + This driver supports a Samsung S2MPS11/13/14/15/16/S2MPU02/05 voltage output regulator via I2C bus. The chip is comprised of high efficient Buck converters including Dual-Phase Buck converter, Buck-Boost converter, various LDOs. diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index 04ae9c615..f736b6ee9 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include =20 @@ -828,6 +829,146 @@ static const struct regulator_desc s2mps15_regulators= [] =3D { regulator_desc_s2mps15_buck(10, s2mps15_buck_voltage_ranges2), }; =20 +static int s2mps16_set_ramp_delay(struct regulator_dev *rdev, int ramp_del= ay) +{ + unsigned int ramp_val, ramp_shift, ramp_reg; + int rdev_id =3D rdev_get_id(rdev); + + switch (rdev_id) { + case S2MPS16_BUCK2: + case S2MPS16_BUCK4: + case S2MPS16_BUCK5: + ramp_shift =3D S2MPS16_BUCK_RAMP_SHIFT1; + break; + case S2MPS16_BUCK1: + case S2MPS16_BUCK3: + case S2MPS16_BUCK6: + ramp_shift =3D S2MPS16_BUCK_RAMP_SHIFT2; + break; + case S2MPS16_BUCK7: + case S2MPS16_BUCK11: + ramp_shift =3D S2MPS16_BUCK_RAMP_SHIFT3; + break; + case S2MPS16_BUCK8: + case S2MPS16_BUCK9: + ramp_shift =3D S2MPS16_BUCK_RAMP_SHIFT4; + break; + default: + return 0; + } + ramp_reg =3D S2MPS16_REG_BUCK_RAMP; + ramp_val =3D get_ramp_delay(ramp_delay); + + return regmap_update_bits(rdev->regmap, ramp_reg, + S2MPS16_BUCK_RAMP_MASK << ramp_shift, + ramp_val << ramp_shift); +} + +static const struct regulator_ops s2mps16_ldo_ops =3D { + .list_voltage =3D regulator_list_voltage_linear, + .map_voltage =3D regulator_map_voltage_linear, + .is_enabled =3D regulator_is_enabled_regmap, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, +}; + +static const struct regulator_ops s2mps16_buck_ops =3D { + .list_voltage =3D regulator_list_voltage_linear, + .map_voltage =3D regulator_map_voltage_linear, + .is_enabled =3D regulator_is_enabled_regmap, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, + .set_voltage_time_sel =3D regulator_set_voltage_time_sel, + .set_ramp_delay =3D s2mps16_set_ramp_delay, +}; + +#define regulator_desc_s2mps16_ldo(num, min, step) { \ + .name =3D "ldo"#num, \ + .id =3D S2MPS16_LDO##num, \ + .ops =3D &s2mps16_ldo_ops, \ + .type =3D REGULATOR_VOLTAGE, \ + .owner =3D THIS_MODULE, \ + .min_uV =3D S2MPS16_LDO_##min, \ + .uV_step =3D S2MPS16_LDO_##step, \ + .n_voltages =3D S2MPS16_LDO_N_VOLTAGES, \ + .vsel_reg =3D S2MPS16_REG_L##num##CTRL, \ + .vsel_mask =3D S2MPS16_LDO_VSEL_MASK, \ + .enable_reg =3D S2MPS16_REG_L##num##CTRL, \ + .enable_mask =3D S2MPS16_ENABLE_MASK, \ + .enable_time =3D S2MPS16_ENABLE_TIME_LDO \ +} + +#define regulator_desc_s2mps16_buck(num, min, step, vsel, enable) { \ + .name =3D "buck"#num, \ + .id =3D S2MPS16_BUCK##num, \ + .ops =3D &s2mps16_buck_ops, \ + .type =3D REGULATOR_VOLTAGE, \ + .owner =3D THIS_MODULE, \ + .min_uV =3D S2MPS16_BUCK_##min, \ + .uV_step =3D S2MPS16_BUCK_##step, \ + .n_voltages =3D S2MPS16_BUCK_N_VOLTAGES, \ + .vsel_reg =3D S2MPS16_REG_B##num##vsel, \ + .vsel_mask =3D S2MPS16_BUCK_VSEL_MASK, \ + .enable_reg =3D S2MPS16_REG_B##num##enable, \ + .enable_mask =3D S2MPS16_ENABLE_MASK, \ + .enable_time =3D S2MPS16_ENABLE_TIME_BUCK##num \ +} + +#define regulator_desc_s2mps16_buck1(num) \ + regulator_desc_s2mps16_buck(num, MIN1, STEP1, CTRL2, CTRL1) + +#define regulator_desc_s2mps16_buck2(num) \ + regulator_desc_s2mps16_buck(num, MIN1, STEP1, CTRL3, CTRL1) + +#define regulator_desc_s2mps16_buck3(num) \ + regulator_desc_s2mps16_buck(num, MIN2, STEP2, CTRL2, CTRL1) + +static const struct regulator_desc s2mps16_regulators[] =3D { + regulator_desc_s2mps16_ldo(1, MIN2, STEP1), + regulator_desc_s2mps16_ldo(2, MIN4, STEP2), + regulator_desc_s2mps16_ldo(3, MIN3, STEP2), + regulator_desc_s2mps16_ldo(4, MIN3, STEP1), + regulator_desc_s2mps16_ldo(5, MIN3, STEP2), + regulator_desc_s2mps16_ldo(6, MIN4, STEP2), + regulator_desc_s2mps16_ldo(7, MIN1, STEP2), + regulator_desc_s2mps16_ldo(8, MIN1, STEP2), + regulator_desc_s2mps16_ldo(9, MIN1, STEP2), + regulator_desc_s2mps16_ldo(10, MIN1, STEP2), + regulator_desc_s2mps16_ldo(11, MIN1, STEP2), + regulator_desc_s2mps16_ldo(12, MIN3, STEP1), + regulator_desc_s2mps16_ldo(13, MIN3, STEP1), + /* LDOs 14-24 are used for CP. They aren't documented */ + regulator_desc_s2mps16_ldo(25, MIN3, STEP1), + regulator_desc_s2mps16_ldo(26, MIN3, STEP1), + regulator_desc_s2mps16_ldo(27, MIN3, STEP1), + regulator_desc_s2mps16_ldo(28, MIN4, STEP2), + regulator_desc_s2mps16_ldo(29, MIN4, STEP2), + regulator_desc_s2mps16_ldo(30, MIN3, STEP2), + regulator_desc_s2mps16_ldo(31, MIN3, STEP1), + regulator_desc_s2mps16_ldo(32, MIN3, STEP2), + regulator_desc_s2mps16_ldo(33, MIN4, STEP2), + regulator_desc_s2mps16_ldo(34, MIN4, STEP2), + regulator_desc_s2mps16_ldo(35, MIN4, STEP2), + regulator_desc_s2mps16_ldo(36, MIN4, STEP2), + regulator_desc_s2mps16_ldo(37, MIN3, STEP2), + regulator_desc_s2mps16_ldo(38, MIN3, STEP1), + regulator_desc_s2mps16_buck1(1), + regulator_desc_s2mps16_buck1(2), + regulator_desc_s2mps16_buck1(3), + regulator_desc_s2mps16_buck1(4), + regulator_desc_s2mps16_buck1(5), + regulator_desc_s2mps16_buck2(6), + regulator_desc_s2mps16_buck1(7), + regulator_desc_s2mps16_buck3(8), + regulator_desc_s2mps16_buck3(9), + /* BUCK 10 is used for CP. It's not documented */ + regulator_desc_s2mps16_buck1(11), +}; + static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11, struct regulator_dev *rdev) { @@ -1238,6 +1379,11 @@ static int s2mps11_pmic_probe(struct platform_device= *pdev) regulators =3D s2mps15_regulators; BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators)); break; + case S2MPS16X: + rdev_num =3D ARRAY_SIZE(s2mps16_regulators); + regulators =3D s2mps16_regulators; + BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps16_regulators)); + break; case S2MPU02: rdev_num =3D ARRAY_SIZE(s2mpu02_regulators); regulators =3D s2mpu02_regulators; @@ -1316,6 +1462,7 @@ static const struct platform_device_id s2mps11_pmic_i= d[] =3D { { "s2mps13-regulator", S2MPS13X}, { "s2mps14-regulator", S2MPS14X}, { "s2mps15-regulator", S2MPS15X}, + { "s2mps16-regulator", S2MPS16X}, { "s2mpu02-regulator", S2MPU02}, { "s2mpu05-regulator", S2MPU05}, { }, --=20 2.43.0