2016-04-05 12:13:01

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 00/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices

This series add devm_ version of the APIs mfd_add_devices() and
mfd_release_devices() and get rid of call for mfd_release_devices()
some places and also remove the need of .remove callbacks as this
is not needed.

Laxman Dewangan (20):
mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices
mfd: Add resource management devm_mfd_{add,remove}_devices
mfd: act8945a: Use devm_mfd_add_devices() for mfd_device registration
mfd: as3711: Use devm_mfd_add_devices() for mfd_device registration
mfd: atmel-hlcdc: Use devm_mfd_add_devices() for mfd_device
registration
mfd: bcm590xx: Use devm_mfd_add_devices() for mfd_device registration
mfd: hi6421-pmic: Use devm_mfd_add_devices() for mfd_device
registration
mfd: lp3943: Use devm_mfd_add_devices() for mfd_device registration
mfd: menf21bmc: Use devm_mfd_add_devices() for mfd_device registration
mfd: mt6397: Use devm_mfd_add_devices() for mfd_device registration
mfd: rdc321x: Use devm_mfd_add_devices() for mfd_device registration
mfd: rk808: Use devm_mfd_add_devices() for mfd_device registration
mfd: rn5t618: Use devm_mfd_add_devices() for mfd_device registration
mfd: rt5033: Use devm_mfd_add_devices() for mfd_device registration
mfd: sky81452: Use devm_mfd_add_devices() for mfd_device registration
mfd: stw481x: Use devm_mfd_add_devices() for mfd_device registration
mfd: tps6507x: Use devm_mfd_add_devices() for mfd_device registration
mfd: tps65217: Use devm_mfd_add_devices() for mfd_device registration
mfd: tps65910: Use devm_mfd_add_devices() for mfd_device registration
mfd: wm8400: Use devm_mfd_add_devices() for mfd_device registration

Documentation/driver-model/devres.txt | 4 +++
drivers/mfd/act8945a.c | 13 ++------
drivers/mfd/as3711.c | 11 +------
drivers/mfd/atmel-hlcdc.c | 10 +-----
drivers/mfd/bcm590xx.c | 9 +----
drivers/mfd/hi6421-pmic-core.c | 10 +-----
drivers/mfd/lp3943.c | 14 ++------
drivers/mfd/menf21bmc.c | 9 +----
drivers/mfd/mfd-core.c | 62 +++++++++++++++++++++++++++++++++++
drivers/mfd/mt6397-core.c | 12 ++-----
drivers/mfd/rdc321x-southbridge.c | 8 +----
drivers/mfd/rk808.c | 3 +-
drivers/mfd/rn5t618.c | 3 +-
drivers/mfd/rt5033.c | 10 +-----
drivers/mfd/sky81452.c | 10 ++----
drivers/mfd/stw481x.c | 9 +----
drivers/mfd/tps6507x.c | 11 +------
drivers/mfd/tps65217.c | 12 +------
drivers/mfd/tps65910.c | 3 +-
drivers/mfd/wm8400-core.c | 25 ++------------
include/linux/mfd/core.h | 7 ++++
21 files changed, 99 insertions(+), 156 deletions(-)

--
2.1.4


2016-04-05 11:59:52

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 01/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices

Add device managed APIs devm_mfd_add_devices() and
devm_mfd_remove_devices() for the APIs mfd_add_devices()
and mfd_remove_devices().

This helps in reducing code in error path and sometimes
removal of .remove callback for driver unbind.

Signed-off-by: Laxman Dewangan <[email protected]>
---
drivers/mfd/mfd-core.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/mfd/core.h | 7 ++++++
2 files changed, 69 insertions(+)

diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index 409da01..145712e 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -334,6 +334,68 @@ void mfd_remove_devices(struct device *parent)
}
EXPORT_SYMBOL(mfd_remove_devices);

+static void devm_mfd_dev_release(struct device *dev, void *res)
+{
+ mfd_remove_devices(dev);
+}
+
+/**
+ * devm_mfd_add_devices - Resource managed version of mfd_add_devices()
+ *
+ * This returns the 0 on success otherwise error number in the failure.
+ * The allocated mfd devices will automatically be released when the
+ * device is unbound.
+ */
+int devm_mfd_add_devices(struct device *dev, int id,
+ const struct mfd_cell *cells, int n_devs,
+ struct resource *mem_base,
+ int irq_base, struct irq_domain *domain)
+{
+ struct device **ptr;
+ int ret;
+
+ ptr = devres_alloc(devm_mfd_dev_release, sizeof(*ptr), GFP_KERNEL);
+ if (!ptr)
+ return -ENOMEM;
+
+ ret = mfd_add_devices(dev, id, cells, n_devs, mem_base,
+ irq_base, domain);
+ if (!ret) {
+ *ptr = dev;
+ devres_add(dev, ptr);
+ } else {
+ devres_free(ptr);
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL(devm_mfd_add_devices);
+
+static int devm_mfd_devs_match(struct device *dev, void *res, void *data)
+{
+ struct device **r = res;
+
+ if (WARN_ON(!r || !*r))
+ return 0;
+
+ return *r == data;
+}
+
+/**
+ * devm_mfd_remove_device - Resource managed version of mfd_remove_devices()
+ * @dev: Device for which which resource was allocated.
+ *
+ * Remove all mfd devices added on the device.
+ * Normally this function will not need to be called and the resource
+ * management code will ensure that the resource is freed.
+ */
+void devm_mfd_remove_devices(struct device *dev)
+{
+ WARN_ON(devres_release(dev, devm_mfd_dev_release,
+ devm_mfd_devs_match, dev));
+}
+EXPORT_SYMBOL(devm_mfd_remove_devices);
+
int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
{
struct mfd_cell cell_entry;
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
index bc6f7e0..d658d7f 100644
--- a/include/linux/mfd/core.h
+++ b/include/linux/mfd/core.h
@@ -131,4 +131,11 @@ static inline int mfd_add_hotplug_devices(struct device *parent,

extern void mfd_remove_devices(struct device *parent);

+extern int devm_mfd_add_devices(struct device *dev, int id,
+ const struct mfd_cell *cells, int n_devs,
+ struct resource *mem_base,
+ int irq_base, struct irq_domain *irq_domain);
+
+extern void devm_mfd_remove_devices(struct device *dev);
+
#endif
--
2.1.4

2016-04-05 11:59:56

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 02/20] mfd: Add resource management devm_mfd_{add,remove}_devices

Add devm wrappers for the mfd_add_devices() and mfd_remove_devices()
in the list of managed interfaces.

Signed-off-by: Laxman Dewangan <[email protected]>
---
Documentation/driver-model/devres.txt | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
index 73b98df..f752169 100644
--- a/Documentation/driver-model/devres.txt
+++ b/Documentation/driver-model/devres.txt
@@ -317,6 +317,10 @@ MEM
devm_kvasprintf()
devm_kzalloc()

+MFD
+ devm_mfd_add_devices()
+ devm_mfd_remove_devices()
+
PCI
pcim_enable_device() : after success, all PCI ops become managed
pcim_pin_device() : keep PCI device enabled after release
--
2.1.4

2016-04-05 12:00:10

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 04/20] mfd: as3711: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Guennadi Liakhovetski <[email protected]>
---
drivers/mfd/as3711.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/mfd/as3711.c b/drivers/mfd/as3711.c
index 09e1483..435bfa6 100644
--- a/drivers/mfd/as3711.c
+++ b/drivers/mfd/as3711.c
@@ -189,7 +189,7 @@ static int as3711_i2c_probe(struct i2c_client *client,
as3711_subdevs[AS3711_BACKLIGHT].pdata_size = 0;
}

- ret = mfd_add_devices(as3711->dev, -1, as3711_subdevs,
+ ret = devm_mfd_add_devices(as3711->dev, -1, as3711_subdevs,
ARRAY_SIZE(as3711_subdevs), NULL, 0, NULL);
if (ret < 0)
dev_err(&client->dev, "add mfd devices failed: %d\n", ret);
@@ -197,14 +197,6 @@ static int as3711_i2c_probe(struct i2c_client *client,
return ret;
}

-static int as3711_i2c_remove(struct i2c_client *client)
-{
- struct as3711 *as3711 = i2c_get_clientdata(client);
-
- mfd_remove_devices(as3711->dev);
- return 0;
-}
-
static const struct i2c_device_id as3711_i2c_id[] = {
{.name = "as3711", .driver_data = 0},
{}
@@ -218,7 +210,6 @@ static struct i2c_driver as3711_i2c_driver = {
.of_match_table = of_match_ptr(as3711_of_match),
},
.probe = as3711_i2c_probe,
- .remove = as3711_i2c_remove,
.id_table = as3711_i2c_id,
};

--
2.1.4

2016-04-05 12:00:16

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 08/20] mfd: lp3943: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Milo Kim <[email protected]>
---
drivers/mfd/lp3943.c | 14 +++-----------
1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/mfd/lp3943.c b/drivers/mfd/lp3943.c
index eecbb13..65a2a8f1 100644
--- a/drivers/mfd/lp3943.c
+++ b/drivers/mfd/lp3943.c
@@ -123,16 +123,9 @@ static int lp3943_probe(struct i2c_client *cl, const struct i2c_device_id *id)
lp3943->mux_cfg = lp3943_mux_cfg;
i2c_set_clientdata(cl, lp3943);

- return mfd_add_devices(dev, -1, lp3943_devs, ARRAY_SIZE(lp3943_devs),
- NULL, 0, NULL);
-}
-
-static int lp3943_remove(struct i2c_client *cl)
-{
- struct lp3943 *lp3943 = i2c_get_clientdata(cl);
-
- mfd_remove_devices(lp3943->dev);
- return 0;
+ return devm_mfd_add_devices(dev, -1, lp3943_devs,
+ ARRAY_SIZE(lp3943_devs),
+ NULL, 0, NULL);
}

static const struct i2c_device_id lp3943_ids[] = {
@@ -151,7 +144,6 @@ MODULE_DEVICE_TABLE(of, lp3943_of_match);

static struct i2c_driver lp3943_driver = {
.probe = lp3943_probe,
- .remove = lp3943_remove,
.driver = {
.name = "lp3943",
.of_match_table = of_match_ptr(lp3943_of_match),
--
2.1.4

2016-04-05 12:00:22

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 10/20] mfd: mt6397: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: John Crispin <[email protected]>
CC: Javier Martinez Canillas <[email protected]>
---
drivers/mfd/mt6397-core.c | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/mt6397-core.c b/drivers/mfd/mt6397-core.c
index 8e8d932..2ea7788 100644
--- a/drivers/mfd/mt6397-core.c
+++ b/drivers/mfd/mt6397-core.c
@@ -276,7 +276,7 @@ static int mt6397_probe(struct platform_device *pdev)
pmic->int_con[1] = MT6323_INT_CON1;
pmic->int_status[0] = MT6323_INT_STATUS0;
pmic->int_status[1] = MT6323_INT_STATUS1;
- ret = mfd_add_devices(&pdev->dev, -1, mt6323_devs,
+ ret = devm_mfd_add_devices(&pdev->dev, -1, mt6323_devs,
ARRAY_SIZE(mt6323_devs), NULL, 0, NULL);
break;

@@ -286,7 +286,7 @@ static int mt6397_probe(struct platform_device *pdev)
pmic->int_con[1] = MT6397_INT_CON1;
pmic->int_status[0] = MT6397_INT_STATUS0;
pmic->int_status[1] = MT6397_INT_STATUS1;
- ret = mfd_add_devices(&pdev->dev, -1, mt6397_devs,
+ ret = devm_mfd_add_devices(&pdev->dev, -1, mt6397_devs,
ARRAY_SIZE(mt6397_devs), NULL, 0, NULL);
break;

@@ -312,13 +312,6 @@ fail_irq:
return ret;
}

-static int mt6397_remove(struct platform_device *pdev)
-{
- mfd_remove_devices(&pdev->dev);
-
- return 0;
-}
-
static const struct of_device_id mt6397_of_match[] = {
{ .compatible = "mediatek,mt6397" },
{ .compatible = "mediatek,mt6323" },
@@ -334,7 +327,6 @@ MODULE_DEVICE_TABLE(platform, mt6397_id);

static struct platform_driver mt6397_driver = {
.probe = mt6397_probe,
- .remove = mt6397_remove,
.driver = {
.name = "mt6397",
.of_match_table = of_match_ptr(mt6397_of_match),
--
2.1.4

2016-04-05 12:00:33

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 13/20] mfd: rn5t618: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and remove
the call of mfd_remove_devices() from .remove callback to remove
mfd devices. This is done by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Beniamino Galvani <[email protected]>
---
drivers/mfd/rn5t618.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
index 6668571..bbc7eca 100644
--- a/drivers/mfd/rn5t618.c
+++ b/drivers/mfd/rn5t618.c
@@ -78,7 +78,7 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
return ret;
}

- ret = mfd_add_devices(&i2c->dev, -1, rn5t618_cells,
+ ret = devm_mfd_add_devices(&i2c->dev, -1, rn5t618_cells,
ARRAY_SIZE(rn5t618_cells), NULL, 0, NULL);
if (ret) {
dev_err(&i2c->dev, "failed to add sub-devices: %d\n", ret);
@@ -102,7 +102,6 @@ static int rn5t618_i2c_remove(struct i2c_client *i2c)
pm_power_off = NULL;
}

- mfd_remove_devices(&i2c->dev);
return 0;
}

--
2.1.4

2016-04-05 12:00:41

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 16/20] mfd: stw481x: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Linus Walleij <[email protected]>
---
drivers/mfd/stw481x.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/mfd/stw481x.c b/drivers/mfd/stw481x.c
index ca613df..3f7ef6a 100644
--- a/drivers/mfd/stw481x.c
+++ b/drivers/mfd/stw481x.c
@@ -206,7 +206,7 @@ static int stw481x_probe(struct i2c_client *client,
stw481x_cells[i].pdata_size = sizeof(*stw481x);
}

- ret = mfd_add_devices(&client->dev, 0, stw481x_cells,
+ ret = devm_mfd_add_devices(&client->dev, 0, stw481x_cells,
ARRAY_SIZE(stw481x_cells), NULL, 0, NULL);
if (ret)
return ret;
@@ -216,12 +216,6 @@ static int stw481x_probe(struct i2c_client *client,
return ret;
}

-static int stw481x_remove(struct i2c_client *client)
-{
- mfd_remove_devices(&client->dev);
- return 0;
-}
-
/*
* This ID table is completely unused, as this is a pure
* device-tree probed driver, but it has to be here due to
@@ -246,7 +240,6 @@ static struct i2c_driver stw481x_driver = {
.of_match_table = stw481x_match,
},
.probe = stw481x_probe,
- .remove = stw481x_remove,
.id_table = stw481x_id,
};

--
2.1.4

2016-04-05 12:00:36

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 14/20] mfd: rt5033: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Ingi Kim <[email protected]>
CC: Javier Martinez Canillas <[email protected]>
---
drivers/mfd/rt5033.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/mfd/rt5033.c b/drivers/mfd/rt5033.c
index 2b95485..9320684 100644
--- a/drivers/mfd/rt5033.c
+++ b/drivers/mfd/rt5033.c
@@ -97,7 +97,7 @@ static int rt5033_i2c_probe(struct i2c_client *i2c,
return ret;
}

- ret = mfd_add_devices(rt5033->dev, -1, rt5033_devs,
+ ret = devm_mfd_add_devices(rt5033->dev, -1, rt5033_devs,
ARRAY_SIZE(rt5033_devs), NULL, 0,
regmap_irq_get_domain(rt5033->irq_data));
if (ret < 0) {
@@ -110,13 +110,6 @@ static int rt5033_i2c_probe(struct i2c_client *i2c,
return 0;
}

-static int rt5033_i2c_remove(struct i2c_client *i2c)
-{
- mfd_remove_devices(&i2c->dev);
-
- return 0;
-}
-
static const struct i2c_device_id rt5033_i2c_id[] = {
{ "rt5033", },
{ }
@@ -135,7 +128,6 @@ static struct i2c_driver rt5033_driver = {
.of_match_table = of_match_ptr(rt5033_dt_match),
},
.probe = rt5033_i2c_probe,
- .remove = rt5033_i2c_remove,
.id_table = rt5033_i2c_id,
};
module_i2c_driver(rt5033_driver);
--
2.1.4

2016-04-05 12:00:56

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 20/20] mfd: wm8400: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Mark Brown <[email protected]>
CC: [email protected]
---
drivers/mfd/wm8400-core.c | 25 +++----------------------
1 file changed, 3 insertions(+), 22 deletions(-)

diff --git a/drivers/mfd/wm8400-core.c b/drivers/mfd/wm8400-core.c
index 3bd44a4..9fd8230 100644
--- a/drivers/mfd/wm8400-core.c
+++ b/drivers/mfd/wm8400-core.c
@@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *wm8400)
.pdata_size = sizeof(*wm8400),
};

- return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL);
+ return devm_mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL);
}

/*
@@ -111,7 +111,7 @@ static int wm8400_init(struct wm8400 *wm8400,
ret = wm8400_register_codec(wm8400);
if (ret != 0) {
dev_err(wm8400->dev, "Failed to register codec\n");
- goto err_children;
+ return ret;
}

if (pdata && pdata->platform_init) {
@@ -119,21 +119,12 @@ static int wm8400_init(struct wm8400 *wm8400,
if (ret != 0) {
dev_err(wm8400->dev, "Platform init failed: %d\n",
ret);
- goto err_children;
+ return ret;
}
} else
dev_warn(wm8400->dev, "No platform initialisation supplied\n");

return 0;
-
-err_children:
- mfd_remove_devices(wm8400->dev);
- return ret;
-}
-
-static void wm8400_release(struct wm8400 *wm8400)
-{
- mfd_remove_devices(wm8400->dev);
}

static const struct regmap_config wm8400_regmap_config = {
@@ -176,15 +167,6 @@ static int wm8400_i2c_probe(struct i2c_client *i2c,
return wm8400_init(wm8400, dev_get_platdata(&i2c->dev));
}

-static int wm8400_i2c_remove(struct i2c_client *i2c)
-{
- struct wm8400 *wm8400 = i2c_get_clientdata(i2c);
-
- wm8400_release(wm8400);
-
- return 0;
-}
-
static const struct i2c_device_id wm8400_i2c_id[] = {
{ "wm8400", 0 },
{ }
@@ -196,7 +178,6 @@ static struct i2c_driver wm8400_i2c_driver = {
.name = "WM8400",
},
.probe = wm8400_i2c_probe,
- .remove = wm8400_i2c_remove,
.id_table = wm8400_i2c_id,
};
#endif
--
2.1.4

2016-04-05 12:00:49

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 18/20] mfd: tps65217: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Tony Lindgren <[email protected]>
---
drivers/mfd/tps65217.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c
index d32b5442..25009da 100644
--- a/drivers/mfd/tps65217.c
+++ b/drivers/mfd/tps65217.c
@@ -205,7 +205,7 @@ static int tps65217_probe(struct i2c_client *client,
return ret;
}

- ret = mfd_add_devices(tps->dev, -1, tps65217s,
+ ret = devm_mfd_add_devices(tps->dev, -1, tps65217s,
ARRAY_SIZE(tps65217s), NULL, 0, NULL);
if (ret < 0) {
dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret);
@@ -235,15 +235,6 @@ static int tps65217_probe(struct i2c_client *client,
return 0;
}

-static int tps65217_remove(struct i2c_client *client)
-{
- struct tps65217 *tps = i2c_get_clientdata(client);
-
- mfd_remove_devices(tps->dev);
-
- return 0;
-}
-
static const struct i2c_device_id tps65217_id_table[] = {
{"tps65217", TPS65217},
{ /* sentinel */ }
@@ -257,7 +248,6 @@ static struct i2c_driver tps65217_driver = {
},
.id_table = tps65217_id_table,
.probe = tps65217_probe,
- .remove = tps65217_remove,
};

static int __init tps65217_init(void)
--
2.1.4

2016-04-05 12:02:12

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 19/20] mfd: tps65910: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and remove
the call of mfd_remove_devices() from .remove callback to remove
mfd devices. This is done by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Tony Lindgren <[email protected]>
---
drivers/mfd/tps65910.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
index f7ab115..37ef804 100644
--- a/drivers/mfd/tps65910.c
+++ b/drivers/mfd/tps65910.c
@@ -510,7 +510,7 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
pm_power_off = tps65910_power_off;
}

- ret = mfd_add_devices(tps65910->dev, -1,
+ ret = devm_mfd_add_devices(tps65910->dev, -1,
tps65910s, ARRAY_SIZE(tps65910s),
NULL, 0,
regmap_irq_get_domain(tps65910->irq_data));
@@ -528,7 +528,6 @@ static int tps65910_i2c_remove(struct i2c_client *i2c)
struct tps65910 *tps65910 = i2c_get_clientdata(i2c);

tps65910_irq_exit(tps65910);
- mfd_remove_devices(tps65910->dev);

return 0;
}
--
2.1.4

2016-04-05 12:02:34

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 17/20] mfd: tps6507x: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Todd Fischer <[email protected]>
---
drivers/mfd/tps6507x.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/drivers/mfd/tps6507x.c b/drivers/mfd/tps6507x.c
index 1ab3dd6..e74239b 100644
--- a/drivers/mfd/tps6507x.c
+++ b/drivers/mfd/tps6507x.c
@@ -100,18 +100,10 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c,
tps6507x->read_dev = tps6507x_i2c_read_device;
tps6507x->write_dev = tps6507x_i2c_write_device;

- return mfd_add_devices(tps6507x->dev, -1, tps6507x_devs,
+ return devm_mfd_add_devices(tps6507x->dev, -1, tps6507x_devs,
ARRAY_SIZE(tps6507x_devs), NULL, 0, NULL);
}

-static int tps6507x_i2c_remove(struct i2c_client *i2c)
-{
- struct tps6507x_dev *tps6507x = i2c_get_clientdata(i2c);
-
- mfd_remove_devices(tps6507x->dev);
- return 0;
-}
-
static const struct i2c_device_id tps6507x_i2c_id[] = {
{ "tps6507x", 0 },
{ }
@@ -132,7 +124,6 @@ static struct i2c_driver tps6507x_i2c_driver = {
.of_match_table = of_match_ptr(tps6507x_of_match),
},
.probe = tps6507x_i2c_probe,
- .remove = tps6507x_i2c_remove,
.id_table = tps6507x_i2c_id,
};

--
2.1.4

2016-04-05 12:03:40

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 15/20] mfd: sky81452: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Gyungoh Yoo <[email protected]>
---
drivers/mfd/sky81452.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/drivers/mfd/sky81452.c b/drivers/mfd/sky81452.c
index b0c9b04..30a2a67 100644
--- a/drivers/mfd/sky81452.c
+++ b/drivers/mfd/sky81452.c
@@ -64,19 +64,14 @@ static int sky81452_probe(struct i2c_client *client,
cells[1].platform_data = pdata->regulator_init_data;
cells[1].pdata_size = sizeof(*pdata->regulator_init_data);

- ret = mfd_add_devices(dev, -1, cells, ARRAY_SIZE(cells), NULL, 0, NULL);
+ ret = devm_mfd_add_devices(dev, -1, cells, ARRAY_SIZE(cells),
+ NULL, 0, NULL);
if (ret)
dev_err(dev, "failed to add child devices. err=%d\n", ret);

return ret;
}

-static int sky81452_remove(struct i2c_client *client)
-{
- mfd_remove_devices(&client->dev);
- return 0;
-}
-
static const struct i2c_device_id sky81452_ids[] = {
{ "sky81452" },
{ }
@@ -97,7 +92,6 @@ static struct i2c_driver sky81452_driver = {
.of_match_table = of_match_ptr(sky81452_of_match),
},
.probe = sky81452_probe,
- .remove = sky81452_remove,
.id_table = sky81452_ids,
};

--
2.1.4

2016-04-05 12:00:31

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 12/20] mfd: rk808: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and remove
the call of mfd_remove_devices() from .remove callback to remove
mfd devices. This is done by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Chris Zhong <[email protected]>
---
drivers/mfd/rk808.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 4b1e439..a3026ca 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -213,7 +213,7 @@ static int rk808_probe(struct i2c_client *client,
rk808->i2c = client;
i2c_set_clientdata(client, rk808);

- ret = mfd_add_devices(&client->dev, -1,
+ ret = devm_mfd_add_devices(&client->dev, -1,
rk808s, ARRAY_SIZE(rk808s),
NULL, 0, regmap_irq_get_domain(rk808->irq_data));
if (ret) {
@@ -240,7 +240,6 @@ static int rk808_remove(struct i2c_client *client)
struct rk808 *rk808 = i2c_get_clientdata(client);

regmap_del_irq_chip(client->irq, rk808->irq_data);
- mfd_remove_devices(&client->dev);
pm_power_off = NULL;

return 0;
--
2.1.4

2016-04-05 12:05:23

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 11/20] mfd: rdc321x: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Florian Fainelli <[email protected]>
---
drivers/mfd/rdc321x-southbridge.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/drivers/mfd/rdc321x-southbridge.c b/drivers/mfd/rdc321x-southbridge.c
index 6575585..3ddb644 100644
--- a/drivers/mfd/rdc321x-southbridge.c
+++ b/drivers/mfd/rdc321x-southbridge.c
@@ -85,16 +85,11 @@ static int rdc321x_sb_probe(struct pci_dev *pdev,
rdc321x_gpio_pdata.sb_pdev = pdev;
rdc321x_wdt_pdata.sb_pdev = pdev;

- return mfd_add_devices(&pdev->dev, -1,
+ return devm_mfd_add_devices(&pdev->dev, -1,
rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells),
NULL, 0, NULL);
}

-static void rdc321x_sb_remove(struct pci_dev *pdev)
-{
- mfd_remove_devices(&pdev->dev);
-}
-
static const struct pci_device_id rdc321x_sb_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_RDC, PCI_DEVICE_ID_RDC_R6030) },
{}
@@ -105,7 +100,6 @@ static struct pci_driver rdc321x_sb_driver = {
.name = "RDC321x Southbridge",
.id_table = rdc321x_sb_table,
.probe = rdc321x_sb_probe,
- .remove = rdc321x_sb_remove,
};

module_pci_driver(rdc321x_sb_driver);
--
2.1.4

2016-04-05 12:05:53

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 09/20] mfd: menf21bmc: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Andreas Werner <[email protected]>
---
drivers/mfd/menf21bmc.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/mfd/menf21bmc.c b/drivers/mfd/menf21bmc.c
index 1c27434..b43873f 100644
--- a/drivers/mfd/menf21bmc.c
+++ b/drivers/mfd/menf21bmc.c
@@ -96,7 +96,7 @@ menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
return ret;
}

- ret = mfd_add_devices(&client->dev, 0, menf21bmc_cell,
+ ret = devm_mfd_add_devices(&client->dev, 0, menf21bmc_cell,
ARRAY_SIZE(menf21bmc_cell), NULL, 0, NULL);
if (ret < 0) {
dev_err(&client->dev, "failed to add BMC sub-devices\n");
@@ -106,12 +106,6 @@ menf21bmc_probe(struct i2c_client *client, const struct i2c_device_id *ids)
return 0;
}

-static int menf21bmc_remove(struct i2c_client *client)
-{
- mfd_remove_devices(&client->dev);
- return 0;
-}
-
static const struct i2c_device_id menf21bmc_id_table[] = {
{ "menf21bmc" },
{ }
@@ -122,7 +116,6 @@ static struct i2c_driver menf21bmc_driver = {
.driver.name = "menf21bmc",
.id_table = menf21bmc_id_table,
.probe = menf21bmc_probe,
- .remove = menf21bmc_remove,
};

module_i2c_driver(menf21bmc_driver);
--
2.1.4

2016-04-05 12:06:43

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 07/20] mfd: hi6421-pmic: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Guodong Xu <[email protected]>
---
drivers/mfd/hi6421-pmic-core.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/mfd/hi6421-pmic-core.c b/drivers/mfd/hi6421-pmic-core.c
index f9ded45..74ffff6 100644
--- a/drivers/mfd/hi6421-pmic-core.c
+++ b/drivers/mfd/hi6421-pmic-core.c
@@ -76,7 +76,7 @@ static int hi6421_pmic_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, pmic);

- ret = mfd_add_devices(&pdev->dev, 0, hi6421_devs,
+ ret = devm_mfd_add_devices(&pdev->dev, 0, hi6421_devs,
ARRAY_SIZE(hi6421_devs), NULL, 0, NULL);
if (ret) {
dev_err(&pdev->dev, "add mfd devices failed: %d\n", ret);
@@ -86,13 +86,6 @@ static int hi6421_pmic_probe(struct platform_device *pdev)
return 0;
}

-static int hi6421_pmic_remove(struct platform_device *pdev)
-{
- mfd_remove_devices(&pdev->dev);
-
- return 0;
-}
-
static const struct of_device_id of_hi6421_pmic_match_tbl[] = {
{ .compatible = "hisilicon,hi6421-pmic", },
{ },
@@ -105,7 +98,6 @@ static struct platform_driver hi6421_pmic_driver = {
.of_match_table = of_hi6421_pmic_match_tbl,
},
.probe = hi6421_pmic_probe,
- .remove = hi6421_pmic_remove,
};
module_platform_driver(hi6421_pmic_driver);

--
2.1.4

2016-04-05 12:06:59

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 05/20] mfd: atmel-hlcdc: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Boris Brezillon <[email protected]>
---
drivers/mfd/atmel-hlcdc.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/drivers/mfd/atmel-hlcdc.c b/drivers/mfd/atmel-hlcdc.c
index 06c2058..653bf261 100644
--- a/drivers/mfd/atmel-hlcdc.c
+++ b/drivers/mfd/atmel-hlcdc.c
@@ -128,18 +128,11 @@ static int atmel_hlcdc_probe(struct platform_device *pdev)

dev_set_drvdata(dev, hlcdc);

- return mfd_add_devices(dev, -1, atmel_hlcdc_cells,
+ return devm_mfd_add_devices(dev, -1, atmel_hlcdc_cells,
ARRAY_SIZE(atmel_hlcdc_cells),
NULL, 0, NULL);
}

-static int atmel_hlcdc_remove(struct platform_device *pdev)
-{
- mfd_remove_devices(&pdev->dev);
-
- return 0;
-}
-
static const struct of_device_id atmel_hlcdc_match[] = {
{ .compatible = "atmel,at91sam9n12-hlcdc" },
{ .compatible = "atmel,at91sam9x5-hlcdc" },
@@ -152,7 +145,6 @@ MODULE_DEVICE_TABLE(of, atmel_hlcdc_match);

static struct platform_driver atmel_hlcdc_driver = {
.probe = atmel_hlcdc_probe,
- .remove = atmel_hlcdc_remove,
.driver = {
.name = "atmel-hlcdc",
.of_match_table = atmel_hlcdc_match,
--
2.1.4

2016-04-05 12:11:49

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 06/20] mfd: bcm590xx: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Matt Porter <[email protected]>
---
drivers/mfd/bcm590xx.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/drivers/mfd/bcm590xx.c b/drivers/mfd/bcm590xx.c
index 320aaef..eeb8bdf 100644
--- a/drivers/mfd/bcm590xx.c
+++ b/drivers/mfd/bcm590xx.c
@@ -82,7 +82,7 @@ static int bcm590xx_i2c_probe(struct i2c_client *i2c_pri,
goto err;
}

- ret = mfd_add_devices(&i2c_pri->dev, -1, bcm590xx_devs,
+ ret = devm_mfd_add_devices(&i2c_pri->dev, -1, bcm590xx_devs,
ARRAY_SIZE(bcm590xx_devs), NULL, 0, NULL);
if (ret < 0) {
dev_err(&i2c_pri->dev, "failed to add sub-devices: %d\n", ret);
@@ -96,12 +96,6 @@ err:
return ret;
}

-static int bcm590xx_i2c_remove(struct i2c_client *i2c)
-{
- mfd_remove_devices(&i2c->dev);
- return 0;
-}
-
static const struct of_device_id bcm590xx_of_match[] = {
{ .compatible = "brcm,bcm59056" },
{ }
@@ -120,7 +114,6 @@ static struct i2c_driver bcm590xx_i2c_driver = {
.of_match_table = of_match_ptr(bcm590xx_of_match),
},
.probe = bcm590xx_i2c_probe,
- .remove = bcm590xx_i2c_remove,
.id_table = bcm590xx_i2c_id,
};
module_i2c_driver(bcm590xx_i2c_driver);
--
2.1.4

2016-04-05 12:12:44

by Laxman Dewangan

[permalink] [raw]
Subject: [PATCH 03/20] mfd: act8945a: Use devm_mfd_add_devices() for mfd_device registration

Use devm_mfd_add_devices() for mfd devices registration and get
rid of .remove callback to remove mfd devices. This is done
by managed device framework.

Signed-off-by: Laxman Dewangan <[email protected]>
CC: Wenyou Yang <[email protected]>
CC: Krzysztof Kozlowski <[email protected]>
---
drivers/mfd/act8945a.c | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/drivers/mfd/act8945a.c b/drivers/mfd/act8945a.c
index 525b546..10c6d2d 100644
--- a/drivers/mfd/act8945a.c
+++ b/drivers/mfd/act8945a.c
@@ -46,8 +46,9 @@ static int act8945a_i2c_probe(struct i2c_client *i2c,

i2c_set_clientdata(i2c, regmap);

- ret = mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE, act8945a_devs,
- ARRAY_SIZE(act8945a_devs), NULL, 0, NULL);
+ ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_NONE,
+ act8945a_devs, ARRAY_SIZE(act8945a_devs),
+ NULL, 0, NULL);
if (ret) {
dev_err(&i2c->dev, "Failed to add sub devices\n");
return ret;
@@ -56,13 +57,6 @@ static int act8945a_i2c_probe(struct i2c_client *i2c,
return 0;
}

-static int act8945a_i2c_remove(struct i2c_client *i2c)
-{
- mfd_remove_devices(&i2c->dev);
-
- return 0;
-}
-
static const struct i2c_device_id act8945a_i2c_id[] = {
{ "act8945a", 0 },
{}
@@ -81,7 +75,6 @@ static struct i2c_driver act8945a_i2c_driver = {
.of_match_table = of_match_ptr(act8945a_of_match),
},
.probe = act8945a_i2c_probe,
- .remove = act8945a_i2c_remove,
.id_table = act8945a_i2c_id,
};

--
2.1.4

2016-04-05 12:53:25

by Javier Martinez Canillas

[permalink] [raw]
Subject: Re: [PATCH 10/20] mfd: mt6397: Use devm_mfd_add_devices() for mfd_device registration

Hello Laxman,

On 04/05/2016 07:48 AM, Laxman Dewangan wrote:
> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: John Crispin <[email protected]>
> CC: Javier Martinez Canillas <[email protected]>
> ---

Patch looks good to me.

Reviewed-by: Javier Martinez Canillas <[email protected]>

Best regards,
--
Javier Martinez Canillas
Open Source Group
Samsung Research America

2016-04-05 12:54:43

by Javier Martinez Canillas

[permalink] [raw]
Subject: Re: [PATCH 14/20] mfd: rt5033: Use devm_mfd_add_devices() for mfd_device registration

Hello Laxman,

On 04/05/2016 07:48 AM, Laxman Dewangan wrote:
> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Ingi Kim <[email protected]>
> CC: Javier Martinez Canillas <[email protected]>
> ---

Reviewed-by: Javier Martinez Canillas <[email protected]>

Best regards,
--
Javier Martinez Canillas
Open Source Group
Samsung Research America

2016-04-05 13:07:55

by Andreas Werner

[permalink] [raw]
Subject: Re: [PATCH 09/20] mfd: menf21bmc: Use devm_mfd_add_devices() for mfd_device registration

On Tue, Apr 05, 2016 at 05:18:21PM +0530, Laxman Dewangan wrote:
> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Andreas Werner <[email protected]>
> ---

Thanks for the Patch, looks good to me.

Reviewed-by: Andreas Werner <[email protected]>

2016-04-05 13:18:53

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH 16/20] mfd: stw481x: Use devm_mfd_add_devices() for mfd_device registration

On Tue, Apr 5, 2016 at 1:48 PM, Laxman Dewangan <[email protected]> wrote:

> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Linus Walleij <[email protected]>

Acked-by: Linus Walleij <[email protected]>

Yours,
Linus Walleij

2016-04-05 13:39:23

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 20/20] mfd: wm8400: Use devm_mfd_add_devices() for mfd_device registration

On Tue, Apr 05, 2016 at 05:18:32PM +0530, Laxman Dewangan wrote:
> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Mark Brown <[email protected]>
> CC: [email protected]
> ---

Acked-by: Charles Keepax <[email protected]>

Thanks,
Charles

2016-04-05 17:09:52

by Boris Brezillon

[permalink] [raw]
Subject: Re: [PATCH 05/20] mfd: atmel-hlcdc: Use devm_mfd_add_devices() for mfd_device registration

On Tue, 5 Apr 2016 17:18:17 +0530
Laxman Dewangan <[email protected]> wrote:

> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Boris Brezillon <[email protected]>

Acked-by: Boris Brezillon <[email protected]>

> ---
> drivers/mfd/atmel-hlcdc.c | 10 +---------
> 1 file changed, 1 insertion(+), 9 deletions(-)
>
> diff --git a/drivers/mfd/atmel-hlcdc.c b/drivers/mfd/atmel-hlcdc.c
> index 06c2058..653bf261 100644
> --- a/drivers/mfd/atmel-hlcdc.c
> +++ b/drivers/mfd/atmel-hlcdc.c
> @@ -128,18 +128,11 @@ static int atmel_hlcdc_probe(struct platform_device *pdev)
>
> dev_set_drvdata(dev, hlcdc);
>
> - return mfd_add_devices(dev, -1, atmel_hlcdc_cells,
> + return devm_mfd_add_devices(dev, -1, atmel_hlcdc_cells,
> ARRAY_SIZE(atmel_hlcdc_cells),
> NULL, 0, NULL);
> }
>
> -static int atmel_hlcdc_remove(struct platform_device *pdev)
> -{
> - mfd_remove_devices(&pdev->dev);
> -
> - return 0;
> -}
> -
> static const struct of_device_id atmel_hlcdc_match[] = {
> { .compatible = "atmel,at91sam9n12-hlcdc" },
> { .compatible = "atmel,at91sam9x5-hlcdc" },
> @@ -152,7 +145,6 @@ MODULE_DEVICE_TABLE(of, atmel_hlcdc_match);
>
> static struct platform_driver atmel_hlcdc_driver = {
> .probe = atmel_hlcdc_probe,
> - .remove = atmel_hlcdc_remove,
> .driver = {
> .name = "atmel-hlcdc",
> .of_match_table = atmel_hlcdc_match,



--
Boris Brezillon, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

2016-04-05 23:59:25

by Kim, Milo

[permalink] [raw]
Subject: Re: [PATCH 08/20] mfd: lp3943: Use devm_mfd_add_devices() for mfd_device registration

On 4/5/2016 8:48 PM, Laxman Dewangan wrote:
> Use devm_mfd_add_devices() for mfd devices registration and get
> rid of .remove callback to remove mfd devices. This is done
> by managed device framework.
>
> Signed-off-by: Laxman Dewangan <[email protected]>
> CC: Milo Kim <[email protected]>

Acked-by: Milo Kim <[email protected]>

> ---
> drivers/mfd/lp3943.c | 14 +++-----------
> 1 file changed, 3 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/mfd/lp3943.c b/drivers/mfd/lp3943.c
> index eecbb13..65a2a8f1 100644
> --- a/drivers/mfd/lp3943.c
> +++ b/drivers/mfd/lp3943.c
> @@ -123,16 +123,9 @@ static int lp3943_probe(struct i2c_client *cl, const struct i2c_device_id *id)
> lp3943->mux_cfg = lp3943_mux_cfg;
> i2c_set_clientdata(cl, lp3943);
>
> - return mfd_add_devices(dev, -1, lp3943_devs, ARRAY_SIZE(lp3943_devs),
> - NULL, 0, NULL);
> -}
> -
> -static int lp3943_remove(struct i2c_client *cl)
> -{
> - struct lp3943 *lp3943 = i2c_get_clientdata(cl);
> -
> - mfd_remove_devices(lp3943->dev);
> - return 0;
> + return devm_mfd_add_devices(dev, -1, lp3943_devs,
> + ARRAY_SIZE(lp3943_devs),
> + NULL, 0, NULL);
> }
>
> static const struct i2c_device_id lp3943_ids[] = {
> @@ -151,7 +144,6 @@ MODULE_DEVICE_TABLE(of, lp3943_of_match);
>
> static struct i2c_driver lp3943_driver = {
> .probe = lp3943_probe,
> - .remove = lp3943_remove,
> .driver = {
> .name = "lp3943",
> .of_match_table = of_match_ptr(lp3943_of_match),
>

2016-04-07 10:44:11

by Lee Jones

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices

On Tue, 05 Apr 2016, Laxman Dewangan wrote:

> Add device managed APIs devm_mfd_add_devices() and
> devm_mfd_remove_devices() for the APIs mfd_add_devices()
> and mfd_remove_devices().

Nit: Line wrap after "devm_mfd_remove_devices()" instead.

> This helps in reducing code in error path and sometimes
> removal of .remove callback for driver unbind.

s/for/during/

> Signed-off-by: Laxman Dewangan <[email protected]>
> ---
> drivers/mfd/mfd-core.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/mfd/core.h | 7 ++++++
> 2 files changed, 69 insertions(+)
>
> diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
> index 409da01..145712e 100644
> --- a/drivers/mfd/mfd-core.c
> +++ b/drivers/mfd/mfd-core.c
> @@ -334,6 +334,68 @@ void mfd_remove_devices(struct device *parent)
> }
> EXPORT_SYMBOL(mfd_remove_devices);
>
> +static void devm_mfd_dev_release(struct device *dev, void *res)
> +{
> + mfd_remove_devices(dev);
> +}
> +
> +/**
> + * devm_mfd_add_devices - Resource managed version of mfd_add_devices()
> + *
> + * This returns the 0 on success otherwise error number in the failure.

"Returns 0 on success or an appropriate negative error number on failure."

> + * The allocated mfd devices will automatically be released when the

s/mfd/MFD/

> + * device is unbound.
> + */
> +int devm_mfd_add_devices(struct device *dev, int id,
> + const struct mfd_cell *cells, int n_devs,
> + struct resource *mem_base,
> + int irq_base, struct irq_domain *domain)
> +{
> + struct device **ptr;
> + int ret;
> +
> + ptr = devres_alloc(devm_mfd_dev_release, sizeof(*ptr), GFP_KERNEL);
> + if (!ptr)
> + return -ENOMEM;
> +
> + ret = mfd_add_devices(dev, id, cells, n_devs, mem_base,
> + irq_base, domain);
> + if (!ret) {
> + *ptr = dev;
> + devres_add(dev, ptr);
> + } else {
> + devres_free(ptr);
> + }

Switch these round. If you encounter a problem, free and return. If
not, skip the error handling and add the device outside of the if().

> + return ret;
> +}
> +EXPORT_SYMBOL(devm_mfd_add_devices);
> +
> +static int devm_mfd_devs_match(struct device *dev, void *res, void *data)
> +{
> + struct device **r = res;
> +
> + if (WARN_ON(!r || !*r))
> + return 0;
> +
> + return *r == data;
> +}
> +
> +/**
> + * devm_mfd_remove_device - Resource managed version of mfd_remove_devices()
> + * @dev: Device for which which resource was allocated.

Did you proof read your own writing? Pleaes re-word.

> + * Remove all mfd devices added on the device.

s/mfd/MFD/

'D' already means devices, so here you are saying "devices devices".
Please re-word. Besides, you need to be more specific as to which
"devices on the devices" you are detailing, since this sentence
doesn't really make a great deal of sense.

> + * Normally this function will not need to be called and the resource
> + * management code will ensure that the resource is freed.

Then what is the purpose of providing it? Do you have a user?

> + */
> +void devm_mfd_remove_devices(struct device *dev)
> +{
> + WARN_ON(devres_release(dev, devm_mfd_dev_release,
> + devm_mfd_devs_match, dev));
> +}
> +EXPORT_SYMBOL(devm_mfd_remove_devices);
> +
> int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
> {
> struct mfd_cell cell_entry;
> diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h
> index bc6f7e0..d658d7f 100644
> --- a/include/linux/mfd/core.h
> +++ b/include/linux/mfd/core.h
> @@ -131,4 +131,11 @@ static inline int mfd_add_hotplug_devices(struct device *parent,
>
> extern void mfd_remove_devices(struct device *parent);
>
> +extern int devm_mfd_add_devices(struct device *dev, int id,
> + const struct mfd_cell *cells, int n_devs,
> + struct resource *mem_base,
> + int irq_base, struct irq_domain *irq_domain);
> +
> +extern void devm_mfd_remove_devices(struct device *dev);
> +
> #endif

--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

2016-04-07 10:55:34

by Laxman Dewangan

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices

Hi Lee,
Thanks for review.
I will send another patch with incorporating your comments.


On Thursday 07 April 2016 04:14 PM, Lee Jones wrote:
> On Tue, 05 Apr 2016, Laxman Dewangan wrote:
>
> + if (!ret) {
> + *ptr = dev;
> + devres_add(dev, ptr);
> + } else {
> + devres_free(ptr);
> + }
> Switch these round. If you encounter a problem, free and return. If
> not, skip the error handling and add the device outside of the if().

Like below?

if (ret) {
devres_free(ptr);
return ret;
}

*ptr = dev;
devres_add(dev, ptr);

return ret;

>> + * Remove all mfd devices added on the device.
> s/mfd/MFD/
>
> 'D' already means devices, so here you are saying "devices devices".
> Please re-word. Besides, you need to be more specific as to which
> "devices on the devices" you are detailing, since this sentence
> doesn't really make a great deal of sense.
Wanted to say
Remove all devices added by mfd_add_devices() from parent device.


>> + * Normally this function will not need to be called and the resource
>> + * management code will ensure that the resource is freed.
> Then what is the purpose of providing it? Do you have a user?

To have pair of release. I have not seen the usage of most of
devm_*_release() function other than devm_kfree().



2016-04-07 11:42:57

by Lee Jones

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices

On Thu, 07 Apr 2016, Laxman Dewangan wrote:

> Hi Lee,
> Thanks for review.
> I will send another patch with incorporating your comments.
>
>
> On Thursday 07 April 2016 04:14 PM, Lee Jones wrote:
> >On Tue, 05 Apr 2016, Laxman Dewangan wrote:
> >
> >+ if (!ret) {
> >+ *ptr = dev;
> >+ devres_add(dev, ptr);
> >+ } else {
> >+ devres_free(ptr);
> >+ }
> >Switch these round. If you encounter a problem, free and return. If
> >not, skip the error handling and add the device outside of the if().
>
> Like below?
>
> if (ret) {
> devres_free(ptr);
> return ret;
> }
>
> *ptr = dev;
> devres_add(dev, ptr);
>
> return ret;

This is more in line with what I expect, yes.

> >>+ * Remove all mfd devices added on the device.
> >s/mfd/MFD/
> >
> >'D' already means devices, so here you are saying "devices devices".
> >Please re-word. Besides, you need to be more specific as to which
> >"devices on the devices" you are detailing, since this sentence
> >doesn't really make a great deal of sense.
> Wanted to say
> Remove all devices added by mfd_add_devices() from parent device.

Remove all chlid-devices?

> >>+ * Normally this function will not need to be called and the resource
> >>+ * management code will ensure that the resource is freed.
> >Then what is the purpose of providing it? Do you have a user?
>
> To have pair of release. I have not seen the usage of most of
> devm_*_release() function other than devm_kfree().

Unless you have a need or a user, I would omit this for now.

--
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

2016-04-07 11:53:53

by Laxman Dewangan

[permalink] [raw]
Subject: Re: [PATCH 01/20] mfd: Add devm_ apis for mfd_add_devices and mfd_release_devices


On Thursday 07 April 2016 05:12 PM, Lee Jones wrote:
> On Thu, 07 Apr 2016, Laxman Dewangan wrote:
>
> + * Normally this function will not need to be called and the resource
> + * management code will ensure that the resource is freed.
>>> Then what is the purpose of providing it? Do you have a user?
>> To have pair of release. I have not seen the usage of most of
>> devm_*_release() function other than devm_kfree().
> Unless you have a need or a user, I would omit this for now.
>
OK, I will remove it.

BTW, I have collected all acks and reviewed by which I got from this series.
So I can send this series with all acks/reviewed by.

If you want me to provide the git location for these patchs then I can
do it also. For this I will need base from where I need to take branch.