From nobody Fri Nov 29 02:38:16 2024 Received: from mail-oi1-f172.google.com (mail-oi1-f172.google.com [209.85.167.172]) (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 049AA15F33A for ; Wed, 25 Sep 2024 09:38:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257099; cv=none; b=gHbH7E7pEjFCBym7GA+0j9ujk3UmXYZiF5q9Om5qQKFlmkGS8rEeqAvhQ0/Uz9aL/2gA9LTTW9T00qQ2B0m6e1oXc26FtZYZjLJTtWe53VWY7qao2jSyvxfd5Dn+GyR1cMMQTxy4eilQAg9xt0UBdqoHAHDy/0qiOe8GZKsRfK8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257099; c=relaxed/simple; bh=ntBZCPczRNZiWkhfj8rDKdtvvCqcsElpZJZ4F7etbqQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oCpRJGp/YtsEX2jzrLePHaNAJQU+xwTtd2v599w1+OYkpPemmKFyoxGNF4+PR8f0Wzwtbx/hLUf1PReE4+txC4KnduGwV/SDK0XkWJ9DmYhl9mixuFbhVYX0BQZ4yfyRBLoyY2Z1u7DkFv+hJex/9u11FA4nfhpPwmwVnYIKINo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=gJe0FrE6; arc=none smtp.client-ip=209.85.167.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="gJe0FrE6" Received: by mail-oi1-f172.google.com with SMTP id 5614622812f47-3e03e9d1f8dso3655195b6e.2 for ; Wed, 25 Sep 2024 02:38:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1727257097; x=1727861897; 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=ypf0ex0KOLFmUmiP+mRzdzjOaNicUi0dxKeNaDtm9Oc=; b=gJe0FrE6haLaRsaYS1KfMt689c2Un1uyR3KE3AiTp00dJkwrLeSDF3cdiHWln2jw6m MdXv/AU9TO6rXCo8uhlSrHNhnrU3765zZKLczm9UHW/JYuAg7ngdiDw3p/j1LAZi+Y01 yMsgudJ21kPkHbSbrLaDZWfdlNTp2jKLajub8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727257097; x=1727861897; 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=ypf0ex0KOLFmUmiP+mRzdzjOaNicUi0dxKeNaDtm9Oc=; b=wYD0zmlA3bNBHBczf+aIBoV0tKdHFMUyeNGmWIb2xkNynS2puHzkM154NVlVMPiVKX UYKtCEdB/FtWvP9quqWNiUivHc1WXwwIqd30LW++yjid1cj8wVmXYT8ZfjPeiTSDM3ti vRDp3YL2yrAsLZwqxb+gQ+91HYVC75OKRe4GGdp1LiIgHuNsS+tRBuwYDFETeK5mSitg WAqzqhW6ZjWGXAcCiUTb/anXfzbyBEmzntqg+y4LUm19W2D4+CtFEMDH2Pmd0hHvERQI LcqTbysoi13OywM0402xpGhh5e/bBCZPCElAuLWfVSN2mHH+qai4XsdIhpMkPgjopZaT PGTw== X-Forwarded-Encrypted: i=1; AJvYcCUI5b4hf+s0+rmrwoVUtiMv86RDkzeqEZUqEYHHC8RAPv3D7ero6h9GFlLd8/3NF/MpYQaNgm/SwKjyaas=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8NX4UW8ao+NPPsg9WeeWQvL+AwjeIJw6HWOBA4BAfCb52V+it Ex1vo1ogEQPaaoCD1yVeBHByGCQhFjwKJhOvbGjIrufeg1ayOEO9rYt/vX6EFA== X-Google-Smtp-Source: AGHT+IGVwSopYfh6VRdHaKiX8Q0SJ+DYfValNAdbXFAsqhezEQ8fzceKvGthosZ30OWssKAn5eItHw== X-Received: by 2002:a05:6870:46a9:b0:27b:8902:5ac9 with SMTP id 586e51a60fabf-286e177e7aemr2318402fac.40.1727257096957; Wed, 25 Sep 2024 02:38:16 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2401:fa00:1:10:2480:2c96:2b64:cdcb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71afc8347fesm2432789b3a.35.2024.09.25.02.38.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Sep 2024 02:38:16 -0700 (PDT) From: Chen-Yu Tsai To: Ulf Hansson , Matthias Brugger , AngeloGioacchino Del Regno , Mark Brown Cc: Chen-Yu Tsai , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Douglas Anderson , Johan Hovold , Andy Shevchenko , Pablo Sun , Macpaul Lin , Sebastian Reichel Subject: [PATCH v8 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup Date: Wed, 25 Sep 2024 17:38:04 +0800 Message-ID: <20240925093807.1026949-2-wenst@chromium.org> X-Mailer: git-send-email 2.46.0.792.g87dc391469-goog In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org> References: <20240925093807.1026949-1-wenst@chromium.org> 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" The to-be-introduced I2C component prober needs to enable regulator supplies (and toggle GPIO pins) for the various components it intends to probe. To support this, a new "pure DT lookup" method for getting regulator supplies is needed, since the device normally requesting the supply won't get created until after the component is probed to be available. Add a new of_regulator_get_optional() function for this. This mirrors the existing regulator_get_optional() function, but is OF-specific. The underlying code that supports the existing regulator_get*() functions has been reworked in previous patches to support this specific case. Also convert an existing usage of "dev && dev->of_node" to "dev_of_node(dev)". Link: https://lore.kernel.org/all/20231220203537.83479-2-jernej.skrabec@gma= il.com/ [1] Signed-off-by: Chen-Yu Tsai Reviewed-by: Andy Shevchenko --- Changes since v7: - Added stub version for !CONFIG_OF and !CONFIG_REGULATOR Changes since v6: - Changed reference [1] to Link: tag - Rebased on top of commit 401d078eaf2e ("regulator: of: Refactor of_get_*regulator() to decrease indentation") - Exported of_regulator_get_optional() - Changed commit message to focus on "of_regulator_get_optional()" - Dropped change to of_regulator_bulk_get_all() Changes since v5: - Used "dev_of_node(dev)" instead of "dev->of_node" - Replaced "dev_printk" with "dev_printk()" in kerneldoc mentions - Fixed kerneldoc "Return" section format for of_regulator_get_optional() - Fix @np parameter name in of_regulator_dev_lookup() kerneldoc Changes since v4: - Restore platform-agnostic regulator consumer code to original state - Move OF-specific regulator code to of_regulator.c (separate patch) - Split _regulator_get() into three parts for reuse (separate patch) - Add OF-specific _of_regulator_get() function - Rename regulator_of_get_optional() to of_regulator_get_optional() for consistency - Make of_regulator_get_optional static, as it is only used internally - Convert of_regulator_bulk_get_all() Changes since v3: - New patch --- drivers/regulator/core.c | 4 +-- drivers/regulator/internal.h | 2 ++ drivers/regulator/of_regulator.c | 51 ++++++++++++++++++++++++++---- include/linux/regulator/consumer.h | 20 ++++++++++++ 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 1179766811f5..d0b3879f2746 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1959,8 +1959,8 @@ static struct regulator_dev *regulator_dev_lookup(str= uct device *dev, regulator_supply_alias(&dev, &supply); =20 /* first do a dt based lookup */ - if (dev && dev->of_node) { - r =3D of_regulator_dev_lookup(dev, supply); + if (dev_of_node(dev)) { + r =3D of_regulator_dev_lookup(dev, dev_of_node(dev), supply); if (!IS_ERR(r)) return r; if (PTR_ERR(r) =3D=3D -EPROBE_DEFER) diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h index 5b43f802468d..f62cacbbc729 100644 --- a/drivers/regulator/internal.h +++ b/drivers/regulator/internal.h @@ -67,6 +67,7 @@ static inline struct regulator_dev *dev_to_rdev(struct de= vice *dev) =20 #ifdef CONFIG_OF struct regulator_dev *of_regulator_dev_lookup(struct device *dev, + struct device_node *np, const char *supply); struct regulator_init_data *regulator_of_get_init_data(struct device *dev, const struct regulator_desc *desc, @@ -82,6 +83,7 @@ bool of_check_coupling_data(struct regulator_dev *rdev); =20 #else static inline struct regulator_dev *of_regulator_dev_lookup(struct device = *dev, + struct device_node *np, const char *supply) { return ERR_PTR(-ENODEV); diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regula= tor.c index 3f490d81abc2..358c3ed791db 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -588,7 +588,8 @@ static struct device_node *of_get_child_regulator(struc= t device_node *parent, =20 /** * of_get_regulator - get a regulator device node based on supply name - * @dev: Device pointer for the consumer (of regulator) device + * @dev: Device pointer for dev_printk() messages + * @node: Device node pointer for supply property lookup * @supply: regulator supply name * * Extract the regulator device node corresponding to the supply name. @@ -596,15 +597,16 @@ static struct device_node *of_get_child_regulator(str= uct device_node *parent, * Return: Pointer to the &struct device_node corresponding to the regulat= or * if found, or %NULL if not found. */ -static struct device_node *of_get_regulator(struct device *dev, const char= *supply) +static struct device_node *of_get_regulator(struct device *dev, struct dev= ice_node *node, + const char *supply) { struct device_node *regnode =3D NULL; char prop_name[64]; /* 64 is max size of property name */ =20 - dev_dbg(dev, "Looking up %s-supply from device tree\n", supply); + dev_dbg(dev, "Looking up %s-supply from device node %pOF\n", supply, node= ); =20 snprintf(prop_name, 64, "%s-supply", supply); - regnode =3D of_parse_phandle(dev->of_node, prop_name, 0); + regnode =3D of_parse_phandle(node, prop_name, 0); if (regnode) return regnode; =20 @@ -628,6 +630,7 @@ static struct regulator_dev *of_find_regulator_by_node(= struct device_node *np) /** * of_regulator_dev_lookup - lookup a regulator device with device tree on= ly * @dev: Device pointer for regulator supply lookup. + * @np: Device node pointer for regulator supply lookup. * @supply: Supply name or regulator ID. * * Return: Pointer to the &struct regulator_dev on success, or ERR_PTR() @@ -642,13 +645,13 @@ static struct regulator_dev *of_find_regulator_by_nod= e(struct device_node *np) * * -%ENODEV if lookup fails permanently. * * -%EPROBE_DEFER if lookup could succeed in the future. */ -struct regulator_dev *of_regulator_dev_lookup(struct device *dev, +struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct d= evice_node *np, const char *supply) { struct regulator_dev *r; struct device_node *node; =20 - node =3D of_get_regulator(dev, supply); + node =3D of_get_regulator(dev, np, supply); if (node) { r =3D of_find_regulator_by_node(node); of_node_put(node); @@ -665,6 +668,42 @@ struct regulator_dev *of_regulator_dev_lookup(struct d= evice *dev, return ERR_PTR(-ENODEV); } =20 +static struct regulator *_of_regulator_get(struct device *dev, struct devi= ce_node *node, + const char *id, enum regulator_get_type get_type) +{ + struct regulator_dev *r; + int ret; + + ret =3D _regulator_get_common_check(dev, id, get_type); + if (ret) + return ERR_PTR(ret); + + r =3D of_regulator_dev_lookup(dev, node, id); + return _regulator_get_common(r, dev, id, get_type); +} + +/** + * of_regulator_get_optional - get optional regulator via device tree look= up + * @dev: device used for dev_printk() messages + * @node: device node for regulator "consumer" + * @id: Supply name + * + * Return: pointer to struct regulator corresponding to the regulator prod= ucer, + * or PTR_ERR() encoded error number. + * + * This is intended for use by consumers that want to get a regulator + * supply directly from a device node, and can and want to deal with + * absence of such supplies. This will _not_ consider supply aliases. + * See regulator_dev_lookup(). + */ +struct regulator *of_regulator_get_optional(struct device *dev, + struct device_node *node, + const char *id) +{ + return _of_regulator_get(dev, node, id, OPTIONAL_GET); +} +EXPORT_SYMBOL_GPL(of_regulator_get_optional); + /* * Returns number of regulators coupled with rdev. */ diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/c= onsumer.h index b9ce521910a0..2b22f07e491c 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -168,6 +168,19 @@ int devm_regulator_get_enable_read_voltage(struct devi= ce *dev, const char *id); void regulator_put(struct regulator *regulator); void devm_regulator_put(struct regulator *regulator); =20 +#if IS_ENABLED(CONFIG_OF) +struct regulator *__must_check of_regulator_get_optional(struct device *de= v, + struct device_node *node, + const char *id); +#else +static inline struct regulator *__must_check of_regulator_get_optional(str= uct device *dev, + struct device_node *node, + const char *id) +{ + return ERR_PTR(-ENODEV); +} +#endif + int regulator_register_supply_alias(struct device *dev, const char *id, struct device *alias_dev, const char *alias_id); @@ -350,6 +363,13 @@ devm_regulator_get_optional(struct device *dev, const = char *id) return ERR_PTR(-ENODEV); } =20 +static inline struct regulator *__must_check of_regulator_get_optional(str= uct device *dev, + struct device_node *node, + const char *id) +{ + return ERR_PTR(-ENODEV); +} + static inline void regulator_put(struct regulator *regulator) { } --=20 2.46.0.792.g87dc391469-goog From nobody Fri Nov 29 02:38:16 2024 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 A6F53183CAB for ; Wed, 25 Sep 2024 09:38:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257102; cv=none; b=Wtukcam4WkH219SKyg0bw4/i8tRBuI/wZlnLeI++VB/ewH91hJKPKsWzaVhGFJaKlU3g6aAljA5SZjZ78eRZB8felX7+h80bnghF90yMKOTWkfWldvxbBD5iWAmacpf9yqdBeTY7wnuiy79W5xruSnH0RJQTi7NjzAvL9fd8UA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257102; c=relaxed/simple; bh=yIHPQabVkxjx7tzx5SzyX87nRu2AVwQVbaXvyp7mRHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qbCUN3uZ6wH5SO+eZmF9YC0yTpfLAPo075QkiGE19k6tNYJ8LAWSv5Xlm0Gp/DTkdxp/mb1R/zffkBQkTmUSfEGF378ulmsMXQW+i6NgCO/nva9iXqDHU0dD7bqKh7JtjgeihwMYIWMldX+o6DGcfdk55RWCjc1fDOQ1tLBcxj8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=TDkp/u7V; arc=none smtp.client-ip=209.85.215.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="TDkp/u7V" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-7d916b6a73aso4106061a12.1 for ; Wed, 25 Sep 2024 02:38:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1727257100; x=1727861900; 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=7bXktUyxRWkmvmoDnOf/TDCOPJhfZ68iG0bFgcdjWoY=; b=TDkp/u7VGhaQ9OEvEadYZ65PBVUU+791OOObioavlRPLMy/xhzT6GL6epjslTC7qll YDuSDp31QDizbg3wV6oO+4YnV7MjqEaxlnu47pjnDRQqFBBsDnDPWrObGTUkYhUirqZ1 c9jmO2Ceq7Vtdys0iZe/TnEu7S1WyAgX1IB+M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727257100; x=1727861900; 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=7bXktUyxRWkmvmoDnOf/TDCOPJhfZ68iG0bFgcdjWoY=; b=tYe+Qg+alIrGitZujE2H25+AG9l3lAABKQ6/bU6FRe4s45a5K3WapKHSSBZfO8lXjD KnwjWb+Emjvou7vSGsFkEu5hU173qt/UYAHHMgijAazvgEInf7qVuwQjahlBAqk617MP ysGvd6sDKhBsW/sNZU7oYOyBOE7DW+wWrBW/vDJ4gC5YjbTeDDQS5/7XxXT7Wi1aK2cM 002HWjWwxIuPl5h2E8qit5L2ms0Cr53Jl+rYLojptXLugrSz6JE7raypAXYebkeL7NS5 jSrdbIjfA2mk7zPZntiCX6K3QS1g99y0dCugoXMh8FGOH7VrhW1X+OEnT2hIOuurT1Ym 4Jkw== X-Forwarded-Encrypted: i=1; AJvYcCUFYmnYjRgkF/EVP+5ZCYipPAo5Ue5ceLNc/YLlVS3G6v9usgsu/twBCq9ip1p4WNg+Hd/TadRRd8b22EA=@vger.kernel.org X-Gm-Message-State: AOJu0YyuDn0/XWCuivG9ewjCG0LI2f5M/ww28M48utNOWbfQtmMLlTED goNYV9rj7a7OAeRM+ybQAGBP6X+YNSMQVyvruSqQ7EKBM/gDOlYXZzctFLwp/w== X-Google-Smtp-Source: AGHT+IHiIptcOj4pohjGvFSBEsElP+b23Io+sJLV0MHs1RLHjwz1o2ogGe1jcYOVaKnKSawT4ThJ6Q== X-Received: by 2002:a05:6a21:3305:b0:1cf:31b6:18c6 with SMTP id adf61e73a8af0-1d4e0beb994mr2832996637.46.1727257099967; Wed, 25 Sep 2024 02:38:19 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2401:fa00:1:10:2480:2c96:2b64:cdcb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71afc8347fesm2432789b3a.35.2024.09.25.02.38.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Sep 2024 02:38:19 -0700 (PDT) From: Chen-Yu Tsai To: Ulf Hansson , Matthias Brugger , AngeloGioacchino Del Regno , Mark Brown Cc: Chen-Yu Tsai , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Douglas Anderson , Johan Hovold , Andy Shevchenko , Pablo Sun , Macpaul Lin , Sebastian Reichel Subject: [PATCH v8 2/3] regulator: Add devres version of of_regulator_get_optional() Date: Wed, 25 Sep 2024 17:38:05 +0800 Message-ID: <20240925093807.1026949-3-wenst@chromium.org> X-Mailer: git-send-email 2.46.0.792.g87dc391469-goog In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org> References: <20240925093807.1026949-1-wenst@chromium.org> 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" There are existing uses for a devres version of of_regulator_get_optional() in power domain drivers. On MediaTek platforms, power domains may have regulator supplies tied to them. The driver currently tries to use devm_regulator_get() to not have to manage the lifecycle, but ends up doing it in a very hacky way by replacing the device node of the power domain controller device to the device node of the power domain that is currently being registered, getting the supply, and reverting the device node. Provide a better API so that the hack can be replaced. Signed-off-by: Chen-Yu Tsai --- Changes since v7: - New patch --- drivers/regulator/devres.c | 39 ++++++++++++++++++++++++++++++ drivers/regulator/internal.h | 16 +++++++----- drivers/regulator/of_regulator.c | 4 +-- include/linux/regulator/consumer.h | 17 +++++++++++++ 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c index 1b893cdd1aad..36164aec30e8 100644 --- a/drivers/regulator/devres.c +++ b/drivers/regulator/devres.c @@ -749,3 +749,42 @@ void *devm_regulator_irq_helper(struct device *dev, return ptr; } EXPORT_SYMBOL_GPL(devm_regulator_irq_helper); + +#if IS_ENABLED(CONFIG_OF) +static struct regulator *_devm_of_regulator_get(struct device *dev, struct= device_node *node, + const char *id, int get_type) +{ + struct regulator **ptr, *regulator; + + ptr =3D devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return ERR_PTR(-ENOMEM); + + regulator =3D _of_regulator_get(dev, node, id, get_type); + if (!IS_ERR(regulator)) { + *ptr =3D regulator; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return regulator; +} + +/** + * devm_of_regulator_get_optional - Resource managed of_regulator_get_opti= onal() + * @dev: device used for dev_printk() messages and resource lifetime manag= ement + * @node: device node for regulator "consumer" + * @id: supply name or regulator ID. + * + * Managed regulator_get_optional(). Regulators returned from this + * function are automatically regulator_put() on driver detach. See + * of_regulator_get_optional() for more information. + */ +struct regulator *devm_of_regulator_get_optional(struct device *dev, struc= t device_node *node, + const char *id) +{ + return _devm_of_regulator_get(dev, node, id, OPTIONAL_GET); +} +EXPORT_SYMBOL_GPL(devm_of_regulator_get_optional); +#endif diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h index f62cacbbc729..b3d48dc38bc4 100644 --- a/drivers/regulator/internal.h +++ b/drivers/regulator/internal.h @@ -65,6 +65,13 @@ static inline struct regulator_dev *dev_to_rdev(struct d= evice *dev) return container_of(dev, struct regulator_dev, dev); } =20 +enum regulator_get_type { + NORMAL_GET, + EXCLUSIVE_GET, + OPTIONAL_GET, + MAX_GET_TYPE +}; + #ifdef CONFIG_OF struct regulator_dev *of_regulator_dev_lookup(struct device *dev, struct device_node *np, @@ -74,6 +81,9 @@ struct regulator_init_data *regulator_of_get_init_data(st= ruct device *dev, struct regulator_config *config, struct device_node **node); =20 +struct regulator *_of_regulator_get(struct device *dev, struct device_node= *node, + const char *id, enum regulator_get_type get_type); + struct regulator_dev *of_parse_coupled_regulator(struct regulator_dev *rde= v, int index); =20 @@ -116,12 +126,6 @@ static inline bool of_check_coupling_data(struct regul= ator_dev *rdev) } =20 #endif -enum regulator_get_type { - NORMAL_GET, - EXCLUSIVE_GET, - OPTIONAL_GET, - MAX_GET_TYPE -}; =20 int _regulator_get_common_check(struct device *dev, const char *id, enum regulator_get_type get_type); diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regula= tor.c index 358c3ed791db..3d85762beda6 100644 --- a/drivers/regulator/of_regulator.c +++ b/drivers/regulator/of_regulator.c @@ -668,8 +668,8 @@ struct regulator_dev *of_regulator_dev_lookup(struct de= vice *dev, struct device_ return ERR_PTR(-ENODEV); } =20 -static struct regulator *_of_regulator_get(struct device *dev, struct devi= ce_node *node, - const char *id, enum regulator_get_type get_type) +struct regulator *_of_regulator_get(struct device *dev, struct device_node= *node, + const char *id, enum regulator_get_type get_type) { struct regulator_dev *r; int ret; diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/c= onsumer.h index 2b22f07e491c..8c3c372ad735 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h @@ -172,6 +172,9 @@ void devm_regulator_put(struct regulator *regulator); struct regulator *__must_check of_regulator_get_optional(struct device *de= v, struct device_node *node, const char *id); +struct regulator *__must_check devm_of_regulator_get_optional(struct devic= e *dev, + struct device_node *node, + const char *id); #else static inline struct regulator *__must_check of_regulator_get_optional(str= uct device *dev, struct device_node *node, @@ -179,6 +182,13 @@ static inline struct regulator *__must_check of_regula= tor_get_optional(struct de { return ERR_PTR(-ENODEV); } + +static inline struct regulator *__must_check devm_of_regulator_get_optiona= l(struct device *dev, + struct device_node *node, + const char *id) +{ + return ERR_PTR(-ENODEV); +} #endif =20 int regulator_register_supply_alias(struct device *dev, const char *id, @@ -370,6 +380,13 @@ static inline struct regulator *__must_check of_regula= tor_get_optional(struct de return ERR_PTR(-ENODEV); } =20 +static inline struct regulator *__must_check devm_of_regulator_get_optiona= l(struct device *dev, + struct device_node *node, + const char *id) +{ + return ERR_PTR(-ENODEV); +} + static inline void regulator_put(struct regulator *regulator) { } --=20 2.46.0.792.g87dc391469-goog From nobody Fri Nov 29 02:38:16 2024 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (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 9E03E189904 for ; Wed, 25 Sep 2024 09:38:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257106; cv=none; b=jy66X1TzaqAp175SdzrNlYmZnrwymiujPwRcnOM3MF8XdIaMfNIu4ylblGEJSmXVK+SBZy1uO+L+8ITMe+EhK/QG5/GYez6z0F/hnsR6rsamjUb6cUIxBP36TyqlaZ7W4TQjM9fCklk18QM009hE7I5ZA2qtbGmF1v5ZWQlSf0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1727257106; c=relaxed/simple; bh=WhI5h6+Oaya6VO4wDUKB3EPlqBbBw4m7Ij0TCkx1zLI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=quAnDVOwg4u9UbwuZn4IrMZoZ5dlBvS5QtGJSX6T79SHPIgzaFXng2BXOCuygxo3Ibmwnv9hAnx6SbLq/3rfXtuSEdNUdIoIWxDZ1cQtxKC1PHIMt5oczwxRFecXZ6/MOvKwiQlyD5GdlmqAmKO1dHKY+X7zkp2Gg6cRu5vL0K8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=glgZyHQM; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="glgZyHQM" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-719b17b2da1so2752055b3a.0 for ; Wed, 25 Sep 2024 02:38:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1727257103; x=1727861903; 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=C76lYKqOaKFf1LWgw9jI+3gYXvFZ5Li6KGDavd2GlFk=; b=glgZyHQM06bdqPe8yc5wkAgYbELyBXO2l3ZJFsiIBX6155LevNXE9g/DUoRIsUmyif OipLRlXlwF3ZCNlQbUMp6cpH1ccrmEbjxupKUGS29WbQzRWvrJQIgYnFfseQsCpTGt0m imAm++SpUqKxFobHqJqT0w64lWV3zm3SSrilc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727257103; x=1727861903; 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=C76lYKqOaKFf1LWgw9jI+3gYXvFZ5Li6KGDavd2GlFk=; b=t/1TbGQj/9CHRGIsI5Fzyi7BhUmOIQXIWH1u7iErTQMVDkUD5AhpuTMmsvvtDIMSl/ Wkq8faMlnbeKF9cAdQQ4U6lIez9OBW47xhIi2JdrJyThbAKfoUWsxVr/K+f7F53Sar1N +khXX1TFMK2dcePXRMy5jp+qfajLmwPtXxvhubkfw6tqBXSZ+IsnX4INnS3JRFzQs1Ht 8qYM8heuGw6WtC1OIUypfFQijD4U33+fUvia9A1I2fXqk92m45xjc8woQ1NFo5cWEHl7 +BIe6qj7FxaquY/xYtW83BJ1ZsMuVQI3B1k8rP5nuRAWJMT0Z1EfTHWb1KEVdbN4MJ9c m4Rg== X-Forwarded-Encrypted: i=1; AJvYcCVPqOVJwvl//5ic0T5SMeXb59nwGaQZaEVxarcmRv78aLK/7to3ztjZ9Vn5bbXtnjFH1tWoiDHuNLRa9p0=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/rRQkz1prddZ8mTMmMcbBr8LGvl4l5EpSw/ZfHT8MSeumQYXp ufqyCxPcxNqrCf0LfU85ZOvgutuX0nPeh6LE3rq5rUrvw9sh9MfJzLQ72CERWg== X-Google-Smtp-Source: AGHT+IEIT60mHW/rWrUCbyRDTdBe2V8pmg+iP0bif2d5gdv8qwR5RMS+9ty2CUG5H+qVfEQgUwNthA== X-Received: by 2002:a05:6a00:14c6:b0:718:ddd7:dc3b with SMTP id d2e1a72fcca58-71b0ac5aad9mr3130147b3a.21.1727257103023; Wed, 25 Sep 2024 02:38:23 -0700 (PDT) Received: from wenstp920.tpe.corp.google.com ([2401:fa00:1:10:2480:2c96:2b64:cdcb]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71afc8347fesm2432789b3a.35.2024.09.25.02.38.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Sep 2024 02:38:22 -0700 (PDT) From: Chen-Yu Tsai To: Ulf Hansson , Matthias Brugger , AngeloGioacchino Del Regno , Mark Brown Cc: Chen-Yu Tsai , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Douglas Anderson , Johan Hovold , Andy Shevchenko , Pablo Sun , Macpaul Lin , Sebastian Reichel Subject: [PATCH v8 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply Date: Wed, 25 Sep 2024 17:38:06 +0800 Message-ID: <20240925093807.1026949-4-wenst@chromium.org> X-Mailer: git-send-email 2.46.0.792.g87dc391469-goog In-Reply-To: <20240925093807.1026949-1-wenst@chromium.org> References: <20240925093807.1026949-1-wenst@chromium.org> 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" The MediaTek power domain driver contains a hack that assigns the device node of the power domain to the struct device of the power domain controller in order to use the devres regulator API. Now that there is a proper OF-specific regulator API, and even a devres version, replace the hack with proper code. This change is incompatible with incomplete device trees. Instead of assigning the dummy regulator in cases where the power domain requires a supply but the device tree does not provide one, the driver will just error out. This will be seen on the MT8390 EVK, which is missing supplies for the IMG_VCORE and CAM_VCORE domains. And likely all the MediaTek EVBs, which have no power domain supplies specified. This is however the correct behavior. If the power domain's supply is missing, then it should not work. Relying on other parts of the system to keep the unattached regulator enabled is likely to break in ways less easier to understand. Signed-off-by: Chen-Yu Tsai --- Changes since v7: - New patch The other option is to follow what Rockchip will be doing: getting the regulator supply upon first use / enable [1]. This will result in less breakage: only the power domain that is missing its supplies will fail to be attached. [1] https://lore.kernel.org/all/20240919091834.83572-6-sebastian.reichel@co= llabora.com/ --- drivers/pmdomain/mediatek/mtk-pm-domains.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/= mediatek/mtk-pm-domains.c index 88406e9ac63c..3580913f25d3 100644 --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c @@ -353,7 +353,6 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys = *scpsys, struct device_no { const struct scpsys_domain_data *domain_data; struct scpsys_domain *pd; - struct device_node *root_node =3D scpsys->dev->of_node; struct device_node *smi_node; struct property *prop; const char *clk_name; @@ -388,16 +387,7 @@ generic_pm_domain *scpsys_add_one_domain(struct scpsys= *scpsys, struct device_no pd->scpsys =3D scpsys; =20 if (MTK_SCPD_CAPS(pd, MTK_SCPD_DOMAIN_SUPPLY)) { - /* - * Find regulator in current power domain node. - * devm_regulator_get() finds regulator in a node and its child - * node, so set of_node to current power domain node then change - * back to original node after regulator is found for current - * power domain node. - */ - scpsys->dev->of_node =3D node; - pd->supply =3D devm_regulator_get(scpsys->dev, "domain"); - scpsys->dev->of_node =3D root_node; + pd->supply =3D devm_of_regulator_get_optional(scpsys->dev, node, "domain= "); if (IS_ERR(pd->supply)) return dev_err_cast_probe(scpsys->dev, pd->supply, "%pOF: failed to get power supply.\n", --=20 2.46.0.792.g87dc391469-goog