* [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
2024-09-30 4:45 [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Chen-Yu Tsai
@ 2024-09-30 4:45 ` Chen-Yu Tsai
2024-09-30 8:57 ` AngeloGioacchino Del Regno
2024-09-30 4:45 ` [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional() Chen-Yu Tsai
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Chen-Yu Tsai @ 2024-09-30 4:45 UTC (permalink / raw)
To: Ulf Hansson, Matthias Brugger, AngeloGioacchino Del Regno,
Mark Brown
Cc: Chen-Yu Tsai, devicetree, linux-arm-kernel, linux-mediatek,
linux-kernel, linux-pm, Douglas Anderson, Johan Hovold,
Andy Shevchenko, Pablo Sun, Macpaul Lin, Sebastian Reichel
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@gmail.com/ [1]
Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
Changes since v8:
- Reformat stub versions with `clang-format`
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
# This is the commit message #2:
# fixup! regulator: Add of_regulator_get_optional() for pure DT regulator lookup
---
drivers/regulator/core.c | 4 +--
drivers/regulator/internal.h | 2 ++
drivers/regulator/of_regulator.c | 51 ++++++++++++++++++++++++++----
include/linux/regulator/consumer.h | 17 ++++++++++
4 files changed, 66 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(struct device *dev,
regulator_supply_alias(&dev, &supply);
/* first do a dt based lookup */
- if (dev && dev->of_node) {
- r = of_regulator_dev_lookup(dev, supply);
+ if (dev_of_node(dev)) {
+ r = of_regulator_dev_lookup(dev, dev_of_node(dev), supply);
if (!IS_ERR(r))
return r;
if (PTR_ERR(r) == -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 device *dev)
#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);
#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_regulator.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(struct device_node *parent,
/**
* 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(struct device_node *parent,
* Return: Pointer to the &struct device_node corresponding to the regulator
* 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 device_node *node,
+ const char *supply)
{
struct device_node *regnode = NULL;
char prop_name[64]; /* 64 is max size of property name */
- 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);
snprintf(prop_name, 64, "%s-supply", supply);
- regnode = of_parse_phandle(dev->of_node, prop_name, 0);
+ regnode = of_parse_phandle(node, prop_name, 0);
if (regnode)
return regnode;
@@ -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 only
* @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_node(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 device_node *np,
const char *supply)
{
struct regulator_dev *r;
struct device_node *node;
- node = of_get_regulator(dev, supply);
+ node = of_get_regulator(dev, np, supply);
if (node) {
r = of_find_regulator_by_node(node);
of_node_put(node);
@@ -665,6 +668,42 @@ struct regulator_dev *of_regulator_dev_lookup(struct device *dev,
return ERR_PTR(-ENODEV);
}
+static 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;
+
+ ret = _regulator_get_common_check(dev, id, get_type);
+ if (ret)
+ return ERR_PTR(ret);
+
+ r = 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 lookup
+ * @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 producer,
+ * 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/consumer.h
index b9ce521910a0..37a5c4199563 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -168,6 +168,17 @@ int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id);
void regulator_put(struct regulator *regulator);
void devm_regulator_put(struct regulator *regulator);
+#if IS_ENABLED(CONFIG_OF)
+struct regulator *__must_check of_regulator_get_optional(
+ struct device *dev, struct device_node *node, const char *id);
+#else
+static inline struct regulator *__must_check of_regulator_get_optional(
+ struct 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 +361,12 @@ devm_regulator_get_optional(struct device *dev, const char *id)
return ERR_PTR(-ENODEV);
}
+static inline struct regulator *__must_check of_regulator_get_optional(
+ struct device *dev, struct device_node *node, const char *id)
+{
+ return ERR_PTR(-ENODEV);
+}
+
static inline void regulator_put(struct regulator *regulator)
{
}
--
2.46.1.824.gd892dcdcdd-goog
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup
2024-09-30 4:45 ` [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup Chen-Yu Tsai
@ 2024-09-30 8:57 ` AngeloGioacchino Del Regno
0 siblings, 0 replies; 9+ messages in thread
From: AngeloGioacchino Del Regno @ 2024-09-30 8:57 UTC (permalink / raw)
To: Chen-Yu Tsai, Ulf Hansson, Matthias Brugger, Mark Brown
Cc: devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
linux-pm, Douglas Anderson, Johan Hovold, Andy Shevchenko,
Pablo Sun, Macpaul Lin, Sebastian Reichel
Il 30/09/24 06:45, Chen-Yu Tsai ha scritto:
> 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@gmail.com/ [1]
> Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional()
2024-09-30 4:45 [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Chen-Yu Tsai
2024-09-30 4:45 ` [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup Chen-Yu Tsai
@ 2024-09-30 4:45 ` Chen-Yu Tsai
2024-09-30 8:57 ` AngeloGioacchino Del Regno
2024-09-30 4:45 ` [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply Chen-Yu Tsai
2024-09-30 21:17 ` [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Mark Brown
3 siblings, 1 reply; 9+ messages in thread
From: Chen-Yu Tsai @ 2024-09-30 4:45 UTC (permalink / raw)
To: Ulf Hansson, Matthias Brugger, AngeloGioacchino Del Regno,
Mark Brown
Cc: Chen-Yu Tsai, devicetree, linux-arm-kernel, linux-mediatek,
linux-kernel, linux-pm, Douglas Anderson, Johan Hovold,
Andy Shevchenko, Pablo Sun, Macpaul Lin, Sebastian Reichel
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 <wenst@chromium.org>
---
Changes since v8:
- Moved OF-specific devres version to of_regulator.c
- Made _of_regulator_get() static again
- Made devm_regulator_release non-static
- Reformated stub versions with `clang-format`
Changes since v7:
- New patch
---
drivers/regulator/devres.c | 2 +-
drivers/regulator/internal.h | 2 ++
drivers/regulator/of_regulator.c | 37 ++++++++++++++++++++++++++++++
include/linux/regulator/consumer.h | 14 +++++++++++
4 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c
index 1b893cdd1aad..569a80963a86 100644
--- a/drivers/regulator/devres.c
+++ b/drivers/regulator/devres.c
@@ -14,7 +14,7 @@
#include "internal.h"
-static void devm_regulator_release(struct device *dev, void *res)
+void devm_regulator_release(struct device *dev, void *res)
{
regulator_put(*(struct regulator **)res);
}
diff --git a/drivers/regulator/internal.h b/drivers/regulator/internal.h
index f62cacbbc729..b1b4277aaf90 100644
--- a/drivers/regulator/internal.h
+++ b/drivers/regulator/internal.h
@@ -131,4 +131,6 @@ struct regulator *_regulator_get(struct device *dev, const char *id,
enum regulator_get_type get_type);
int _regulator_bulk_get(struct device *dev, int num_consumers,
struct regulator_bulk_data *consumers, enum regulator_get_type get_type);
+
+void devm_regulator_release(struct device *dev, void *res);
#endif
diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
index 358c3ed791db..9096d8f494a7 100644
--- a/drivers/regulator/of_regulator.c
+++ b/drivers/regulator/of_regulator.c
@@ -704,6 +704,43 @@ struct regulator *of_regulator_get_optional(struct device *dev,
}
EXPORT_SYMBOL_GPL(of_regulator_get_optional);
+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 = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
+ if (!ptr)
+ return ERR_PTR(-ENOMEM);
+
+ regulator = _of_regulator_get(dev, node, id, get_type);
+ if (!IS_ERR(regulator)) {
+ *ptr = regulator;
+ devres_add(dev, ptr);
+ } else {
+ devres_free(ptr);
+ }
+
+ return regulator;
+}
+
+/**
+ * devm_of_regulator_get_optional - Resource managed of_regulator_get_optional()
+ * @dev: device used for dev_printk() messages and resource lifetime management
+ * @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, struct device_node *node,
+ const char *id)
+{
+ return _devm_of_regulator_get(dev, node, id, OPTIONAL_GET);
+}
+EXPORT_SYMBOL_GPL(devm_of_regulator_get_optional);
+
/*
* Returns number of regulators coupled with rdev.
*/
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
index 37a5c4199563..582b82a104e2 100644
--- a/include/linux/regulator/consumer.h
+++ b/include/linux/regulator/consumer.h
@@ -171,12 +171,20 @@ void devm_regulator_put(struct regulator *regulator);
#if IS_ENABLED(CONFIG_OF)
struct regulator *__must_check of_regulator_get_optional(
struct device *dev, struct device_node *node, const char *id);
+struct regulator *__must_check devm_of_regulator_get_optional(
+ struct device *dev, struct device_node *node, const char *id);
#else
static inline struct regulator *__must_check of_regulator_get_optional(
struct device *dev, struct device_node *node, const char *id)
{
return ERR_PTR(-ENODEV);
}
+
+static inline struct regulator *__must_check devm_of_regulator_get_optional(
+ struct 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,
@@ -367,6 +375,12 @@ static inline struct regulator *__must_check of_regulator_get_optional(
return ERR_PTR(-ENODEV);
}
+static inline struct regulator *__must_check devm_of_regulator_get_optional(
+ struct device *dev, struct device_node *node, const char *id)
+{
+ return ERR_PTR(-ENODEV);
+}
+
static inline void regulator_put(struct regulator *regulator)
{
}
--
2.46.1.824.gd892dcdcdd-goog
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional()
2024-09-30 4:45 ` [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional() Chen-Yu Tsai
@ 2024-09-30 8:57 ` AngeloGioacchino Del Regno
0 siblings, 0 replies; 9+ messages in thread
From: AngeloGioacchino Del Regno @ 2024-09-30 8:57 UTC (permalink / raw)
To: Chen-Yu Tsai, Ulf Hansson, Matthias Brugger, Mark Brown
Cc: devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
linux-pm, Douglas Anderson, Johan Hovold, Andy Shevchenko,
Pablo Sun, Macpaul Lin, Sebastian Reichel
Il 30/09/24 06:45, Chen-Yu Tsai ha scritto:
> 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 <wenst@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply
2024-09-30 4:45 [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Chen-Yu Tsai
2024-09-30 4:45 ` [PATCH v9 1/3] regulator: Add of_regulator_get_optional() for pure DT regulator lookup Chen-Yu Tsai
2024-09-30 4:45 ` [PATCH v9 2/3] regulator: Add devres version of of_regulator_get_optional() Chen-Yu Tsai
@ 2024-09-30 4:45 ` Chen-Yu Tsai
2024-10-09 9:44 ` AngeloGioacchino Del Regno
2024-09-30 21:17 ` [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Mark Brown
3 siblings, 1 reply; 9+ messages in thread
From: Chen-Yu Tsai @ 2024-09-30 4:45 UTC (permalink / raw)
To: Ulf Hansson, Matthias Brugger, AngeloGioacchino Del Regno,
Mark Brown
Cc: Chen-Yu Tsai, devicetree, linux-arm-kernel, linux-mediatek,
linux-kernel, linux-pm, Douglas Anderson, Johan Hovold,
Andy Shevchenko, Pablo Sun, Macpaul Lin, Sebastian Reichel
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 <wenst@chromium.org>
---
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@collabora.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 = 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 = scpsys;
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 = node;
- pd->supply = devm_regulator_get(scpsys->dev, "domain");
- scpsys->dev->of_node = root_node;
+ pd->supply = 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",
--
2.46.1.824.gd892dcdcdd-goog
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply
2024-09-30 4:45 ` [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply Chen-Yu Tsai
@ 2024-10-09 9:44 ` AngeloGioacchino Del Regno
0 siblings, 0 replies; 9+ messages in thread
From: AngeloGioacchino Del Regno @ 2024-10-09 9:44 UTC (permalink / raw)
To: Chen-Yu Tsai, Ulf Hansson, Matthias Brugger, Mark Brown
Cc: devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
linux-pm, Douglas Anderson, Johan Hovold, Andy Shevchenko,
Pablo Sun, Macpaul Lin, Sebastian Reichel
Il 30/09/24 06:45, Chen-Yu Tsai ha scritto:
> 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 <wenst@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver
2024-09-30 4:45 [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Chen-Yu Tsai
` (2 preceding siblings ...)
2024-09-30 4:45 ` [PATCH v9 3/3] pmdomain: mediatek: Use OF-specific regulator API to get power domain supply Chen-Yu Tsai
@ 2024-09-30 21:17 ` Mark Brown
2024-10-02 10:58 ` Ulf Hansson
3 siblings, 1 reply; 9+ messages in thread
From: Mark Brown @ 2024-09-30 21:17 UTC (permalink / raw)
To: Chen-Yu Tsai
Cc: Ulf Hansson, Matthias Brugger, AngeloGioacchino Del Regno,
devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
linux-pm, Douglas Anderson, Johan Hovold, Andy Shevchenko,
Pablo Sun, Macpaul Lin, Sebastian Reichel
[-- Attachment #1: Type: text/plain, Size: 1599 bytes --]
On Mon, Sep 30, 2024 at 12:45:20PM +0800, Chen-Yu Tsai wrote:
> Patch 1 adds a new of_regulator_get_optional() function to look up
> regulator supplies using device tree nodes.
> Patch 2 adds a devres version of the aforementioned function at
> Sebastian's request for the two power domain drivers.
The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc:
Linux 6.12-rc1 (2024-09-29 15:06:19 -0700)
are available in the Git repository at:
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git tags/regulator-of-get-optional
for you to fetch changes up to 36ec3f437227470568e5f460997f367f5446a34d:
regulator: Add devres version of of_regulator_get_optional() (2024-09-30 01:11:41 +0200)
----------------------------------------------------------------
regulator: Add of_regulator_get_optional() APIs
Add of_regulator_get_optional() APIs, which can be used by generic code
to improve integration of regulator management helpers for their users.
----------------------------------------------------------------
Chen-Yu Tsai (2):
regulator: Add of_regulator_get_optional() for pure DT regulator lookup
regulator: Add devres version of of_regulator_get_optional()
drivers/regulator/core.c | 4 +--
drivers/regulator/devres.c | 39 +++++++++++++++++++++++++++++
drivers/regulator/internal.h | 18 +++++++++-----
drivers/regulator/of_regulator.c | 51 +++++++++++++++++++++++++++++++++-----
include/linux/regulator/consumer.h | 37 +++++++++++++++++++++++++++
5 files changed, 135 insertions(+), 14 deletions(-)
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver
2024-09-30 21:17 ` [PATCH v9 0/3] Add of_regulator_get_optional() and Fix MTK Power Domain Driver Mark Brown
@ 2024-10-02 10:58 ` Ulf Hansson
0 siblings, 0 replies; 9+ messages in thread
From: Ulf Hansson @ 2024-10-02 10:58 UTC (permalink / raw)
To: Mark Brown
Cc: Chen-Yu Tsai, Matthias Brugger, AngeloGioacchino Del Regno,
devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
linux-pm, Douglas Anderson, Johan Hovold, Andy Shevchenko,
Pablo Sun, Macpaul Lin, Sebastian Reichel
On Mon, 30 Sept 2024 at 23:17, Mark Brown <broonie@kernel.org> wrote:
>
> On Mon, Sep 30, 2024 at 12:45:20PM +0800, Chen-Yu Tsai wrote:
>
> > Patch 1 adds a new of_regulator_get_optional() function to look up
> > regulator supplies using device tree nodes.
>
> > Patch 2 adds a devres version of the aforementioned function at
> > Sebastian's request for the two power domain drivers.
>
> The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc:
>
> Linux 6.12-rc1 (2024-09-29 15:06:19 -0700)
>
> are available in the Git repository at:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git tags/regulator-of-get-optional
>
> for you to fetch changes up to 36ec3f437227470568e5f460997f367f5446a34d:
>
> regulator: Add devres version of of_regulator_get_optional() (2024-09-30 01:11:41 +0200)
>
> ----------------------------------------------------------------
> regulator: Add of_regulator_get_optional() APIs
>
> Add of_regulator_get_optional() APIs, which can be used by generic code
> to improve integration of regulator management helpers for their users.
>
> ----------------------------------------------------------------
> Chen-Yu Tsai (2):
> regulator: Add of_regulator_get_optional() for pure DT regulator lookup
> regulator: Add devres version of of_regulator_get_optional()
>
> drivers/regulator/core.c | 4 +--
> drivers/regulator/devres.c | 39 +++++++++++++++++++++++++++++
> drivers/regulator/internal.h | 18 +++++++++-----
> drivers/regulator/of_regulator.c | 51 +++++++++++++++++++++++++++++++++-----
> include/linux/regulator/consumer.h | 37 +++++++++++++++++++++++++++
> 5 files changed, 135 insertions(+), 14 deletions(-)
I have pulled in the regulator tag from Mark's git tree and applied
patch3 for next, thanks!
Kind regards
Uffe
^ permalink raw reply [flat|nested] 9+ messages in thread