All of lore.kernel.org
 help / color / mirror / Atom feed
* [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children
@ 2020-07-23 10:54 Charles Keepax
  2020-07-23 10:54 ` [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding Charles Keepax
  2020-07-27 14:02 ` [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Lee Jones
  0 siblings, 2 replies; 4+ messages in thread
From: Charles Keepax @ 2020-07-23 10:54 UTC (permalink / raw)
  To: lee.jones; +Cc: linux-kernel, patches

Currently, the only way to remove MFD children is with a call to
mfd_remove_devices, which will remove all the children. Under
some circumstances it is useful to remove only a subset of the
child devices. For example if some additional clean up is required
between removal of certain child devices.

To accomplish this a level field is added to mfd_cell, the normal
mfd_remove_devices is modified to not remove devices that are set
to a higher level and a corresponding mfd_remove_devices_late
function is added to remove those children.

See further discussion at:
https://lore.kernel.org/lkml/20200616075834.GF2608702@dell/

Suggested-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
 drivers/mfd/mfd-core.c   | 16 +++++++++++++++-
 include/linux/mfd/core.h |  5 +++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index c51183209f82c..c3ef58a802bee 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -357,6 +357,7 @@ static int mfd_remove_devices_fn(struct device *dev, void *data)
 	struct platform_device *pdev;
 	const struct mfd_cell *cell;
 	struct mfd_of_node_entry *of_entry, *tmp;
+	int *level = data;
 
 	if (dev->type != &mfd_dev_type)
 		return 0;
@@ -364,6 +365,9 @@ static int mfd_remove_devices_fn(struct device *dev, void *data)
 	pdev = to_platform_device(dev);
 	cell = mfd_get_cell(pdev);
 
+	if (level && cell->level > *level)
+		return 0;
+
 	regulator_bulk_unregister_supply_alias(dev, cell->parent_supplies,
 					       cell->num_parent_supplies);
 
@@ -380,9 +384,19 @@ static int mfd_remove_devices_fn(struct device *dev, void *data)
 	return 0;
 }
 
+void mfd_remove_devices_late(struct device *parent)
+{
+	int level = MFD_DEP_LEVEL_HIGH;
+
+	device_for_each_child_reverse(parent, &level, mfd_remove_devices_fn);
+}
+EXPORT_SYMBOL(mfd_remove_devices_late);
+
 void mfd_remove_devices(struct device *parent)
 {
-	device_for_each_child_reverse(parent, NULL, mfd_remove_devices_fn);
+	int level = MFD_DEP_LEVEL_NORMAL;
+
+	device_for_each_child_reverse(parent, &level, mfd_remove_devices_fn);
 }
 EXPORT_SYMBOL(mfd_remove_devices);
 
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
index 6d68f44a26a1c..4b35baa14d308 100644
--- a/include/linux/mfd/core.h
+++ b/include/linux/mfd/core.h
@@ -46,6 +46,9 @@
 #define MFD_CELL_NAME(_name) \
 	MFD_CELL_ALL(_name, NULL, NULL, 0, 0, NULL, 0, false, NULL)
 
+#define MFD_DEP_LEVEL_NORMAL 0
+#define MFD_DEP_LEVEL_HIGH 1
+
 struct irq_domain;
 struct property_entry;
 
@@ -63,6 +66,7 @@ struct mfd_cell_acpi_match {
 struct mfd_cell {
 	const char		*name;
 	int			id;
+	int			level;
 
 	int			(*enable)(struct platform_device *dev);
 	int			(*disable)(struct platform_device *dev);
@@ -150,6 +154,7 @@ static inline int mfd_add_hotplug_devices(struct device *parent,
 }
 
 extern void mfd_remove_devices(struct device *parent);
+extern void mfd_remove_devices_late(struct device *parent);
 
 extern int devm_mfd_add_devices(struct device *dev, int id,
 				const struct mfd_cell *cells, int n_devs,
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding
  2020-07-23 10:54 [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Charles Keepax
@ 2020-07-23 10:54 ` Charles Keepax
  2020-07-27 14:02   ` Lee Jones
  2020-07-27 14:02 ` [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Lee Jones
  1 sibling, 1 reply; 4+ messages in thread
From: Charles Keepax @ 2020-07-23 10:54 UTC (permalink / raw)
  To: lee.jones; +Cc: linux-kernel, patches

The current unbinding process for Madera has some issues. The trouble
is runtime PM is disabled as the first step of the process, but
some of the drivers release IRQs causing regmap IRQ to issue a
runtime get which fails. To allow runtime PM to remain enabled during
mfd_remove_devices, the DCVDD regulator must remain available. In
the case of external DCVDD's this is simple, the regulator can simply
be disabled/put after the call to mfd_remove_devices. However, in
the case of an internally supplied DCVDD the regulator needs to be
released after the other MFD children depending on it.

Use the new MFD mfd_remove_devices_late functionality to split
the DCVDD regulator off from the other drivers.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
 drivers/mfd/madera-core.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c
index 4724c1a01a39f..8a8d733fdce5b 100644
--- a/drivers/mfd/madera-core.c
+++ b/drivers/mfd/madera-core.c
@@ -44,7 +44,10 @@ static const char * const madera_core_supplies[] = {
 };
 
 static const struct mfd_cell madera_ldo1_devs[] = {
-	{ .name = "madera-ldo1", },
+	{
+		.name = "madera-ldo1",
+		.level = MFD_DEP_LEVEL_HIGH,
+	},
 };
 
 static const char * const cs47l15_supplies[] = {
@@ -743,18 +746,22 @@ int madera_dev_exit(struct madera *madera)
 	/* Prevent any IRQs being serviced while we clean up */
 	disable_irq(madera->irq);
 
-	/*
-	 * DCVDD could be supplied by a child node, we must disable it before
-	 * removing the children, and prevent PM runtime from turning it back on
-	 */
-	pm_runtime_disable(madera->dev);
+	pm_runtime_get_sync(madera->dev);
 
-	clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
+	mfd_remove_devices(madera->dev);
+
+	pm_runtime_disable(madera->dev);
 
 	regulator_disable(madera->dcvdd);
 	regulator_put(madera->dcvdd);
 
-	mfd_remove_devices(madera->dev);
+	mfd_remove_devices_late(madera->dev);
+
+	pm_runtime_set_suspended(madera->dev);
+	pm_runtime_put_noidle(madera->dev);
+
+	clk_disable_unprepare(madera->mclk[MADERA_MCLK2].clk);
+
 	madera_enable_hard_reset(madera);
 
 	regulator_bulk_disable(madera->num_core_supplies,
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children
  2020-07-23 10:54 [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Charles Keepax
  2020-07-23 10:54 ` [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding Charles Keepax
@ 2020-07-27 14:02 ` Lee Jones
  1 sibling, 0 replies; 4+ messages in thread
From: Lee Jones @ 2020-07-27 14:02 UTC (permalink / raw)
  To: Charles Keepax; +Cc: linux-kernel, patches

On Thu, 23 Jul 2020, Charles Keepax wrote:

> Currently, the only way to remove MFD children is with a call to
> mfd_remove_devices, which will remove all the children. Under
> some circumstances it is useful to remove only a subset of the
> child devices. For example if some additional clean up is required
> between removal of certain child devices.
> 
> To accomplish this a level field is added to mfd_cell, the normal
> mfd_remove_devices is modified to not remove devices that are set
> to a higher level and a corresponding mfd_remove_devices_late
> function is added to remove those children.
> 
> See further discussion at:
> https://lore.kernel.org/lkml/20200616075834.GF2608702@dell/
> 
> Suggested-by: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
> ---
>  drivers/mfd/mfd-core.c   | 16 +++++++++++++++-
>  include/linux/mfd/core.h |  5 +++++
>  2 files changed, 20 insertions(+), 1 deletion(-)

Applied, thanks.

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding
  2020-07-23 10:54 ` [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding Charles Keepax
@ 2020-07-27 14:02   ` Lee Jones
  0 siblings, 0 replies; 4+ messages in thread
From: Lee Jones @ 2020-07-27 14:02 UTC (permalink / raw)
  To: Charles Keepax; +Cc: linux-kernel, patches

On Thu, 23 Jul 2020, Charles Keepax wrote:

> The current unbinding process for Madera has some issues. The trouble
> is runtime PM is disabled as the first step of the process, but
> some of the drivers release IRQs causing regmap IRQ to issue a
> runtime get which fails. To allow runtime PM to remain enabled during
> mfd_remove_devices, the DCVDD regulator must remain available. In
> the case of external DCVDD's this is simple, the regulator can simply
> be disabled/put after the call to mfd_remove_devices. However, in
> the case of an internally supplied DCVDD the regulator needs to be
> released after the other MFD children depending on it.
> 
> Use the new MFD mfd_remove_devices_late functionality to split
> the DCVDD regulator off from the other drivers.
> 
> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
> ---
>  drivers/mfd/madera-core.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)

Applied, thanks.

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-07-27 14:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-23 10:54 [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Charles Keepax
2020-07-23 10:54 ` [RESEND PATCH v3 2/2] mfd: madera: Improve handling of regulator unbinding Charles Keepax
2020-07-27 14:02   ` Lee Jones
2020-07-27 14:02 ` [RESEND PATCH v3 1/2] mfd: mfd-core: Add mechanism for removal of a subset of children Lee Jones

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.