2018-12-17 21:18:50

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH v4 00/18] mfd: demodularization of non-modular drivers

[v3 --> v4: delete now unused exit fcn from wm835x core; add more acks
now all in chrono order, re-test.]

[v2 --> v3: drop diasemi commits as they will be modularized; delete
now unused exit fcn from wm831x core; add more acks; re-test.]

[v1 --> v2: add some more commits as requested by Lee (MFD maintainer),
update the 00/NN text; re-do build and link testing on new linux-next. ]

This group of MFD drivers are all controlled by "bool" Kconfig settings,
but contain various amounts of largely pointless uses of infrastructure
related to modular operations, even though they can't be built modular.

We can easily remove/replace all of it. We are trying to make driver
code consistent with the Makefiles/Kconfigs that control them. This
means not using modular functions/macros for drivers that can never be
built as a module. Some of the downfalls this oversight leads to are:

(1) it is easy to accidentally write unused module_exit and remove code
(2) it can be misleading when reading the source, thinking it can be
modular when the Makefile and/or Kconfig prohibit it
(3) it requires the include of the module.h header file which in turn
includes nearly everything else, thus adding a lot of CPP overhead.
(4) it gets copied/replicated into other drivers and spreads quickly.

What we see in current drivers falls into one or more of the following
categories:

1) include of <linux/module.h> when it simply isn't needed

2) Use of MODULE_LICENSE, MODULE_DEVICE_TABLE, MODULE_AUTHOR etc.
macros that are no-ops for non-modular drivers.

3) Creation of a module_exit() function that will be compiled and
linked in but never actually called for non-modular drivers.

4) Addition of a platform_driver ".remove" function that is bound
into the struct but will never be called for non-module use cases.

Solution to #1 --> #3 is simple ; we just delete the related code.

The solution to #4 is similar - we delete the ".remove" function and
the binding into the platform_driver struct. However, since the same
".remove" function could also be triggered by an "unbind" (such as for
pass-through of a device to a guest instance) - so we also explicitly
disable any unbind for the driver.

The unbind mask allows us to ensure we will see if there was some odd
corner case out there that was relying on it. Typically it would be a
multi-port ethernet card passing a port through to a guest, so a
sensible use case in MFD drivers seems highly unlikely. This same
solution has already been used in multiple other mainline subsystems.

Build testing was done on drivers/mfd for allyesconfig on x86_64, ARM
and ARM-64 on a recent linux-next checkout.

Paul.

---

Cc: Alessandro Rubini <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Charles Keepax <[email protected]>
Cc: Cory Maccarrone <[email protected]>
Cc: Davide Ciminaghi <[email protected]>
Cc: Dong Aisheng <[email protected]>
Cc: Graeme Gregory <[email protected]>
Cc: Guennadi Liakhovetski <[email protected]>
Cc: Haojian Zhuang <[email protected]>
Cc: Jin Park <[email protected]>
Cc: Jorge Eduardo Candelaria <[email protected]>
Cc: Laxman Dewangan <[email protected]>
Cc: Lee Jones <[email protected]>
Cc: Linus Walleij <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: Mattias Nilsson <[email protected]>
Cc: Michael Hennerich <[email protected]>
Cc: Tony Lindgren <[email protected]>
Cc: Venu Byravarasu <[email protected]>
Cc: [email protected]
Cc: [email protected]


Paul Gortmaker (18):
mfd: aat2870-core: Make it explicitly non-modular
mfd: adp5520: Make it explicitly non-modular
mfd: as3711: Make it explicitly non-modular
mfd: db8500-prcmu: drop unused MODULE_ tags from non-modular code
mfd: htc-i2cpld: Make it explicitly non-modular
mfd: max8925-core: drop unused MODULE_ tags from non-modular code
mfd: rc5t583: Make it explicitly non-modular
mfd: sta2x11: drop unused MODULE_ tags from non-modular code
mfd: syscon: Make it explicitly non-modular
mfd: tps65090: Make it explicitly non-modular
mfd: tps65910: Make it explicitly non-modular
mfd: tps80031: Make it explicitly non-modular
mfd: wm831x-spi: Make it explicitly non-modular
mfd: wm831x-i2c: Make it explicitly non-modular
mfd: wm831x-core: drop unused module infrastructure from non-modular code
mfd: wm8350-i2c: Make it explicitly non-modular
mfd: wm8350-core: drop unused module infrastructure from non-modular code
mfd: wm8400-core: Make it explicitly non-modular

drivers/mfd/aat2870-core.c | 40 +++-------------------------------------
drivers/mfd/adp5520.c | 30 +++++++-----------------------
drivers/mfd/as3711.c | 14 --------------
drivers/mfd/db8500-prcmu.c | 10 ++++------
drivers/mfd/htc-i2cpld.c | 18 +-----------------
drivers/mfd/max8925-core.c | 7 +------
drivers/mfd/rc5t583.c | 14 --------------
drivers/mfd/sta2x11-mfd.c | 10 ++++------
drivers/mfd/syscon.c | 12 +-----------
drivers/mfd/tps65090.c | 30 +++++-------------------------
drivers/mfd/tps65910.c | 18 +-----------------
drivers/mfd/tps80031.c | 37 ++-----------------------------------
drivers/mfd/wm831x-core.c | 15 ++-------------
drivers/mfd/wm831x-i2c.c | 20 ++------------------
drivers/mfd/wm831x-spi.c | 24 ++----------------------
drivers/mfd/wm8350-core.c | 30 ++----------------------------
drivers/mfd/wm8350-i2c.c | 24 +-----------------------
drivers/mfd/wm8400-core.c | 18 +++---------------
include/linux/mfd/wm831x/core.h | 1 -
include/linux/mfd/wm8350/core.h | 1 -
20 files changed, 41 insertions(+), 332 deletions(-)

--
2.7.4



2018-12-17 21:10:12

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 05/18] mfd: htc-i2cpld: Make it explicitly non-modular

The Kconfig for this option is currently:

config HTC_I2CPLD
bool "HTC I2C PLD chip support"

...meaning that it currently is not being built as a module by anyone.
Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init translates to device_initcall in the non-modular
case, the init ordering remains unchanged with this commit.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Cory Maccarrone <[email protected]>
Cc: Lee Jones <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/htc-i2cpld.c | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/drivers/mfd/htc-i2cpld.c b/drivers/mfd/htc-i2cpld.c
index 01572b5e79e8..af3c66355270 100644
--- a/drivers/mfd/htc-i2cpld.c
+++ b/drivers/mfd/htc-i2cpld.c
@@ -27,7 +27,6 @@

#include <linux/kernel.h>
#include <linux/init.h>
-#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
@@ -614,8 +613,6 @@ static const struct i2c_device_id htcpld_chip_id[] = {
{ "htcpld-chip", 0 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, htcpld_chip_id);
-

static struct i2c_driver htcpld_chip_driver = {
.driver = {
@@ -643,17 +640,4 @@ static int __init htcpld_core_init(void)
/* Probe for our chips */
return platform_driver_probe(&htcpld_core_driver, htcpld_core_probe);
}
-
-static void __exit htcpld_core_exit(void)
-{
- i2c_del_driver(&htcpld_chip_driver);
- platform_driver_unregister(&htcpld_core_driver);
-}
-
-module_init(htcpld_core_init);
-module_exit(htcpld_core_exit);
-
-MODULE_AUTHOR("Cory Maccarrone <[email protected]>");
-MODULE_DESCRIPTION("I2C HTC PLD Driver");
-MODULE_LICENSE("GPL");
-
+device_initcall(htcpld_core_init);
--
2.7.4


2018-12-17 21:10:13

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 01/18] mfd: aat2870-core: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_AAT2870_CORE
drivers/mfd/Kconfig: bool "AnalogicTech AAT2870"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Jin Park <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/aat2870-core.c | 40 +++-------------------------------------
1 file changed, 3 insertions(+), 37 deletions(-)

diff --git a/drivers/mfd/aat2870-core.c b/drivers/mfd/aat2870-core.c
index 3ba19a45f199..9d3d90d386c2 100644
--- a/drivers/mfd/aat2870-core.c
+++ b/drivers/mfd/aat2870-core.c
@@ -20,7 +20,6 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
#include <linux/init.h>
#include <linux/debugfs.h>
#include <linux/slab.h>
@@ -349,18 +348,10 @@ static void aat2870_init_debugfs(struct aat2870_data *aat2870)
"Failed to create debugfs register file\n");
}

-static void aat2870_uninit_debugfs(struct aat2870_data *aat2870)
-{
- debugfs_remove_recursive(aat2870->dentry_root);
-}
#else
static inline void aat2870_init_debugfs(struct aat2870_data *aat2870)
{
}
-
-static inline void aat2870_uninit_debugfs(struct aat2870_data *aat2870)
-{
-}
#endif /* CONFIG_DEBUG_FS */

static int aat2870_i2c_probe(struct i2c_client *client,
@@ -440,20 +431,6 @@ static int aat2870_i2c_probe(struct i2c_client *client,
return ret;
}

-static int aat2870_i2c_remove(struct i2c_client *client)
-{
- struct aat2870_data *aat2870 = i2c_get_clientdata(client);
-
- aat2870_uninit_debugfs(aat2870);
-
- mfd_remove_devices(aat2870->dev);
- aat2870_disable(aat2870);
- if (aat2870->uninit)
- aat2870->uninit(aat2870);
-
- return 0;
-}
-
#ifdef CONFIG_PM_SLEEP
static int aat2870_i2c_suspend(struct device *dev)
{
@@ -492,15 +469,14 @@ static const struct i2c_device_id aat2870_i2c_id_table[] = {
{ "aat2870", 0 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, aat2870_i2c_id_table);

static struct i2c_driver aat2870_i2c_driver = {
.driver = {
- .name = "aat2870",
- .pm = &aat2870_pm_ops,
+ .name = "aat2870",
+ .pm = &aat2870_pm_ops,
+ .suppress_bind_attrs = true,
},
.probe = aat2870_i2c_probe,
- .remove = aat2870_i2c_remove,
.id_table = aat2870_i2c_id_table,
};

@@ -509,13 +485,3 @@ static int __init aat2870_init(void)
return i2c_add_driver(&aat2870_i2c_driver);
}
subsys_initcall(aat2870_init);
-
-static void __exit aat2870_exit(void)
-{
- i2c_del_driver(&aat2870_i2c_driver);
-}
-module_exit(aat2870_exit);
-
-MODULE_DESCRIPTION("Core support for the AnalogicTech AAT2870");
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Jin Park <[email protected]>");
--
2.7.4


2018-12-17 21:12:35

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 07/18] mfd: rc5t583: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_RC5T583
drivers/mfd/Kconfig: bool "Ricoh RC5T583 Power Management system device"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Laxman Dewangan <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/rc5t583.c | 14 --------------
1 file changed, 14 deletions(-)

diff --git a/drivers/mfd/rc5t583.c b/drivers/mfd/rc5t583.c
index fd46de02b715..c5cc5cb3dde7 100644
--- a/drivers/mfd/rc5t583.c
+++ b/drivers/mfd/rc5t583.c
@@ -23,7 +23,6 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
-#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/slab.h>
@@ -298,8 +297,6 @@ static const struct i2c_device_id rc5t583_i2c_id[] = {
{}
};

-MODULE_DEVICE_TABLE(i2c, rc5t583_i2c_id);
-
static struct i2c_driver rc5t583_i2c_driver = {
.driver = {
.name = "rc5t583",
@@ -313,14 +310,3 @@ static int __init rc5t583_i2c_init(void)
return i2c_add_driver(&rc5t583_i2c_driver);
}
subsys_initcall(rc5t583_i2c_init);
-
-static void __exit rc5t583_i2c_exit(void)
-{
- i2c_del_driver(&rc5t583_i2c_driver);
-}
-
-module_exit(rc5t583_i2c_exit);
-
-MODULE_AUTHOR("Laxman Dewangan <[email protected]>");
-MODULE_DESCRIPTION("RICOH RC5T583 power management system device driver");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-17 21:12:35

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 02/18] mfd: adp5520: Make it explicitly non-modular

The Makefile/Kconfig currently controlling compilation of this code is:

drivers/mfd/Makefile:obj-$(CONFIG_PMIC_ADP5520) += adp5520.o
drivers/mfd/Kconfig:config PMIC_ADP5520
drivers/mfd/Kconfig: bool "Analog Devices ADP5520/01 MFD PMIC Core Support"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_i2c_driver() uses the same init level priority as
builtin_i2c_driver() the init ordering remains unchanged with
this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
was (or is now) contained at the top of the file in the comments.

Cc: Michael Hennerich <[email protected]>
Cc: Lee Jones <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/adp5520.c | 30 +++++++-----------------------
1 file changed, 7 insertions(+), 23 deletions(-)

diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c
index be0497b96720..2cdd39cb8a18 100644
--- a/drivers/mfd/adp5520.c
+++ b/drivers/mfd/adp5520.c
@@ -7,6 +7,8 @@
*
* Copyright 2009 Analog Devices Inc.
*
+ * Author: Michael Hennerich <[email protected]>
+ *
* Derived from da903x:
* Copyright (C) 2008 Compulab, Ltd.
* Mike Rapoport <[email protected]>
@@ -18,7 +20,7 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
@@ -304,18 +306,6 @@ static int adp5520_probe(struct i2c_client *client,
return ret;
}

-static int adp5520_remove(struct i2c_client *client)
-{
- struct adp5520_chip *chip = dev_get_drvdata(&client->dev);
-
- if (chip->irq)
- free_irq(chip->irq, chip);
-
- adp5520_remove_subdevs(chip);
- adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0);
- return 0;
-}
-
#ifdef CONFIG_PM_SLEEP
static int adp5520_suspend(struct device *dev)
{
@@ -346,20 +336,14 @@ static const struct i2c_device_id adp5520_id[] = {
{ "pmic-adp5501", ID_ADP5501 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, adp5520_id);

static struct i2c_driver adp5520_driver = {
.driver = {
- .name = "adp5520",
- .pm = &adp5520_pm,
+ .name = "adp5520",
+ .pm = &adp5520_pm,
+ .suppress_bind_attrs = true,
},
.probe = adp5520_probe,
- .remove = adp5520_remove,
.id_table = adp5520_id,
};
-
-module_i2c_driver(adp5520_driver);
-
-MODULE_AUTHOR("Michael Hennerich <[email protected]>");
-MODULE_DESCRIPTION("ADP5520(01) PMIC-MFD Driver");
-MODULE_LICENSE("GPL");
+builtin_i2c_driver(adp5520_driver);
--
2.7.4


2018-12-17 21:13:01

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 03/18] mfd: as3711: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_AS3711
drivers/mfd/Kconfig: bool "AMS AS3711"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

We don't replace module.h with init.h since the file already has that.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Guennadi Liakhovetski <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/as3711.c | 14 --------------
1 file changed, 14 deletions(-)

diff --git a/drivers/mfd/as3711.c b/drivers/mfd/as3711.c
index 67b12417585d..7a74a874b93c 100644
--- a/drivers/mfd/as3711.c
+++ b/drivers/mfd/as3711.c
@@ -16,7 +16,6 @@
#include <linux/kernel.h>
#include <linux/mfd/as3711.h>
#include <linux/mfd/core.h>
-#include <linux/module.h>
#include <linux/of.h>
#include <linux/regmap.h>
#include <linux/slab.h>
@@ -118,7 +117,6 @@ static const struct of_device_id as3711_of_match[] = {
{.compatible = "ams,as3711",},
{}
};
-MODULE_DEVICE_TABLE(of, as3711_of_match);
#endif

static int as3711_i2c_probe(struct i2c_client *client,
@@ -202,8 +200,6 @@ static const struct i2c_device_id as3711_i2c_id[] = {
{}
};

-MODULE_DEVICE_TABLE(i2c, as3711_i2c_id);
-
static struct i2c_driver as3711_i2c_driver = {
.driver = {
.name = "as3711",
@@ -219,13 +215,3 @@ static int __init as3711_i2c_init(void)
}
/* Initialise early */
subsys_initcall(as3711_i2c_init);
-
-static void __exit as3711_i2c_exit(void)
-{
- i2c_del_driver(&as3711_i2c_driver);
-}
-module_exit(as3711_i2c_exit);
-
-MODULE_AUTHOR("Guennadi Liakhovetski <[email protected]>");
-MODULE_DESCRIPTION("AS3711 PMIC driver");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-17 21:13:45

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 08/18] mfd: sta2x11: drop unused MODULE_ tags from non-modular code

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_STA2X11
drivers/mfd/Kconfig: bool "STMicroelectronics STA2X11"

...meaning that it currently is not being built as a module by anyone.

Lets remove the couple traces of modular infrastructure use, so that
when reading the driver there is no doubt it is builtin-only.

We delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We replace module.h with init.h and export.h ; the latter since the
file does export some symbols.

Cc: Lee Jones <[email protected]>
Cc: Alessandro Rubini <[email protected]>
Cc: Davide Ciminaghi <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Alessandro Rubini <[email protected]>
Acked-by: Davide Ciminaghi <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/sta2x11-mfd.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/mfd/sta2x11-mfd.c b/drivers/mfd/sta2x11-mfd.c
index 3aeafa228baf..cab9aabcaa1f 100644
--- a/drivers/mfd/sta2x11-mfd.c
+++ b/drivers/mfd/sta2x11-mfd.c
@@ -1,4 +1,6 @@
/*
+ * STA2x11 mfd for GPIO, SCTL and APBREG
+ *
* Copyright (c) 2009-2011 Wind River Systems, Inc.
* Copyright (c) 2011 ST Microelectronics (Alessandro Rubini, Davide Ciminaghi)
*
@@ -18,7 +20,8 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/export.h>
#include <linux/spinlock.h>
#include <linux/errno.h>
#include <linux/device.h>
@@ -653,8 +656,3 @@ static int __init sta2x11_mfd_init(void)
*/
subsys_initcall(sta2x11_drivers_init);
rootfs_initcall(sta2x11_mfd_init);
-
-MODULE_LICENSE("GPL v2");
-MODULE_AUTHOR("Wind River");
-MODULE_DESCRIPTION("STA2x11 mfd for GPIO, SCTL and APBREG");
-MODULE_DEVICE_TABLE(pci, sta2x11_mfd_tbl);
--
2.7.4


2018-12-17 21:15:33

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 06/18] mfd: max8925-core: drop unused MODULE_ tags from non-modular code

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_MAX8925
drivers/mfd/Kconfig: bool "Maxim Semiconductor MAX8925 PMIC Support"

...meaning that it currently is not being built as a module by anyone.

Lets remove the couple traces of modular infrastructure use, so that
when reading the driver there is no doubt it is builtin-only.

We delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Haojian Zhuang <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/max8925-core.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c
index fd8b15cd84fd..87c724ba9793 100644
--- a/drivers/mfd/max8925-core.c
+++ b/drivers/mfd/max8925-core.c
@@ -10,7 +10,7 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
@@ -919,8 +919,3 @@ void max8925_device_exit(struct max8925_chip *chip)
free_irq(chip->tsc_irq, chip);
mfd_remove_devices(chip->dev);
}
-
-
-MODULE_DESCRIPTION("PMIC Driver for Maxim MAX8925");
-MODULE_AUTHOR("Haojian Zhuang <[email protected]");
-MODULE_LICENSE("GPL");
--
2.7.4


2018-12-17 21:18:45

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 12/18] mfd: tps80031: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_TPS80031
drivers/mfd/Kconfig: bool "TI TPS80031/TPS80032 Power Management chips"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

We don't replace module.h with init.h since the file already has that.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Laxman Dewangan <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/tps80031.c | 37 ++-----------------------------------
1 file changed, 2 insertions(+), 35 deletions(-)

diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c
index 608c7f77830e..865257ade8ac 100644
--- a/drivers/mfd/tps80031.c
+++ b/drivers/mfd/tps80031.c
@@ -30,7 +30,6 @@
#include <linux/irq.h>
#include <linux/mfd/core.h>
#include <linux/mfd/tps80031.h>
-#include <linux/module.h>
#include <linux/pm.h>
#include <linux/regmap.h>
#include <linux/slab.h>
@@ -516,40 +515,18 @@ static int tps80031_probe(struct i2c_client *client,
return ret;
}

-static int tps80031_remove(struct i2c_client *client)
-{
- struct tps80031 *tps80031 = i2c_get_clientdata(client);
- int i;
-
- if (tps80031_power_off_dev == tps80031) {
- tps80031_power_off_dev = NULL;
- pm_power_off = NULL;
- }
-
- mfd_remove_devices(tps80031->dev);
-
- regmap_del_irq_chip(client->irq, tps80031->irq_data);
-
- for (i = 0; i < TPS80031_NUM_SLAVES; i++) {
- if (tps80031->clients[i] != client)
- i2c_unregister_device(tps80031->clients[i]);
- }
- return 0;
-}
-
static const struct i2c_device_id tps80031_id_table[] = {
{ "tps80031", TPS80031 },
{ "tps80032", TPS80032 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, tps80031_id_table);

static struct i2c_driver tps80031_driver = {
.driver = {
- .name = "tps80031",
+ .name = "tps80031",
+ .suppress_bind_attrs = true,
},
.probe = tps80031_probe,
- .remove = tps80031_remove,
.id_table = tps80031_id_table,
};

@@ -558,13 +535,3 @@ static int __init tps80031_init(void)
return i2c_add_driver(&tps80031_driver);
}
subsys_initcall(tps80031_init);
-
-static void __exit tps80031_exit(void)
-{
- i2c_del_driver(&tps80031_driver);
-}
-module_exit(tps80031_exit);
-
-MODULE_AUTHOR("Laxman Dewangan <[email protected]>");
-MODULE_DESCRIPTION("TPS80031 core driver");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-17 21:18:45

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 15/18] mfd: wm831x-core: drop unused module infrastructure from non-modular code

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM831X
drivers/mfd/Kconfig: bool

...meaning that it currently is not being built as a module by anyone.

Lets remove the couple traces of modular infrastructure use, so that
when reading the driver there is no doubt it is builtin-only.

We delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Previous demodularizaion work has made wm831x_device_exit() no longer
used, so it is also removed from the 831x core code.

Cc: Lee Jones <[email protected]>
Cc: Charles Keepax <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Charles Keepax <[email protected]>
---
drivers/mfd/wm831x-core.c | 15 ++-------------
include/linux/mfd/wm831x/core.h | 1 -
2 files changed, 2 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c
index e70d35ef5c6d..25fbbaf39cb9 100644
--- a/drivers/mfd/wm831x-core.c
+++ b/drivers/mfd/wm831x-core.c
@@ -13,7 +13,8 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/export.h>
#include <linux/bcd.h>
#include <linux/delay.h>
#include <linux/mfd/core.h>
@@ -1892,14 +1893,6 @@ int wm831x_device_init(struct wm831x *wm831x, int irq)
return ret;
}

-void wm831x_device_exit(struct wm831x *wm831x)
-{
- wm831x_otp_exit(wm831x);
- mfd_remove_devices(wm831x->dev);
- free_irq(wm831x_irq(wm831x, WM831X_IRQ_AUXADC_DATA), wm831x);
- wm831x_irq_exit(wm831x);
-}
-
int wm831x_device_suspend(struct wm831x *wm831x)
{
int reg, mask;
@@ -1944,7 +1937,3 @@ void wm831x_device_shutdown(struct wm831x *wm831x)
}
}
EXPORT_SYMBOL_GPL(wm831x_device_shutdown);
-
-MODULE_DESCRIPTION("Core support for the WM831X AudioPlus PMIC");
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mark Brown");
diff --git a/include/linux/mfd/wm831x/core.h b/include/linux/mfd/wm831x/core.h
index b49fa67612f1..6fcb8eb00282 100644
--- a/include/linux/mfd/wm831x/core.h
+++ b/include/linux/mfd/wm831x/core.h
@@ -418,7 +418,6 @@ int wm831x_bulk_read(struct wm831x *wm831x, unsigned short reg,
int count, u16 *buf);

int wm831x_device_init(struct wm831x *wm831x, int irq);
-void wm831x_device_exit(struct wm831x *wm831x);
int wm831x_device_suspend(struct wm831x *wm831x);
void wm831x_device_shutdown(struct wm831x *wm831x);
int wm831x_irq_init(struct wm831x *wm831x, int irq);
--
2.7.4


2018-12-17 21:19:00

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 17/18] mfd: wm8350-core: drop unused module infrastructure from non-modular code

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM8350
drivers/mfd/Kconfig: bool

...meaning that it currently is not being built as a module by anyone.

Lets remove the couple traces of modular infrastructure use, so that
when reading the driver there is no doubt it is builtin-only.

We delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

We replace module.h with init.h and export.h ; the latter since the
file does export some symbols.

Previous demodularizaion work has made wm8350_device_exit() no longer
used, so it is also removed from the 8350 core code.

Cc: Linus Walleij <[email protected]>
Cc: Charles Keepax <[email protected]>
Cc: Lee Jones <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
---
drivers/mfd/wm8350-core.c | 30 ++----------------------------
include/linux/mfd/wm8350/core.h | 1 -
2 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c
index 8a07c5634aee..9e1070f26b11 100644
--- a/drivers/mfd/wm8350-core.c
+++ b/drivers/mfd/wm8350-core.c
@@ -13,7 +13,8 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/export.h>
#include <linux/slab.h>
#include <linux/bug.h>
#include <linux/device.h>
@@ -442,30 +443,3 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,
return ret;
}
EXPORT_SYMBOL_GPL(wm8350_device_init);
-
-void wm8350_device_exit(struct wm8350 *wm8350)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(wm8350->pmic.led); i++)
- platform_device_unregister(wm8350->pmic.led[i].pdev);
-
- for (i = 0; i < ARRAY_SIZE(wm8350->pmic.pdev); i++)
- platform_device_unregister(wm8350->pmic.pdev[i]);
-
- platform_device_unregister(wm8350->wdt.pdev);
- platform_device_unregister(wm8350->rtc.pdev);
- platform_device_unregister(wm8350->power.pdev);
- platform_device_unregister(wm8350->hwmon.pdev);
- platform_device_unregister(wm8350->gpio.pdev);
- platform_device_unregister(wm8350->codec.pdev);
-
- if (wm8350->irq_base)
- free_irq(wm8350->irq_base + WM8350_IRQ_AUXADC_DATARDY, wm8350);
-
- wm8350_irq_exit(wm8350);
-}
-EXPORT_SYMBOL_GPL(wm8350_device_exit);
-
-MODULE_DESCRIPTION("WM8350 AudioPlus PMIC core driver");
-MODULE_LICENSE("GPL");
diff --git a/include/linux/mfd/wm8350/core.h b/include/linux/mfd/wm8350/core.h
index 509481d9cf19..202d9bde2c7c 100644
--- a/include/linux/mfd/wm8350/core.h
+++ b/include/linux/mfd/wm8350/core.h
@@ -643,7 +643,6 @@ struct wm8350_platform_data {
*/
int wm8350_device_init(struct wm8350 *wm8350, int irq,
struct wm8350_platform_data *pdata);
-void wm8350_device_exit(struct wm8350 *wm8350);

/*
* WM8350 device IO
--
2.7.4


2018-12-17 23:20:25

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 10/18] mfd: tps65090: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_TPS65090
drivers/mfd/Kconfig: bool "TI TPS65090 Power Management chips"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
was (or is now) contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Venu Byravarasu <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/tps65090.c | 30 +++++-------------------------
1 file changed, 5 insertions(+), 25 deletions(-)

diff --git a/drivers/mfd/tps65090.c b/drivers/mfd/tps65090.c
index f13e4cd06e89..6968df4d7828 100644
--- a/drivers/mfd/tps65090.c
+++ b/drivers/mfd/tps65090.c
@@ -2,7 +2,9 @@
* Core driver for TI TPS65090 PMIC family
*
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
-
+ *
+ * Author: Venu Byravarasu <[email protected]>
+ *
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
@@ -19,7 +21,7 @@
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/i2c.h>
@@ -171,7 +173,6 @@ static const struct of_device_id tps65090_of_match[] = {
{ .compatible = "ti,tps65090",},
{},
};
-MODULE_DEVICE_TABLE(of, tps65090_of_match);
#endif

static int tps65090_i2c_probe(struct i2c_client *client,
@@ -236,30 +237,19 @@ static int tps65090_i2c_probe(struct i2c_client *client,
return ret;
}

-static int tps65090_i2c_remove(struct i2c_client *client)
-{
- struct tps65090 *tps65090 = i2c_get_clientdata(client);
-
- mfd_remove_devices(tps65090->dev);
- if (client->irq)
- regmap_del_irq_chip(client->irq, tps65090->irq_data);
-
- return 0;
-}

static const struct i2c_device_id tps65090_id_table[] = {
{ "tps65090", 0 },
{ },
};
-MODULE_DEVICE_TABLE(i2c, tps65090_id_table);

static struct i2c_driver tps65090_driver = {
.driver = {
.name = "tps65090",
+ .suppress_bind_attrs = true,
.of_match_table = of_match_ptr(tps65090_of_match),
},
.probe = tps65090_i2c_probe,
- .remove = tps65090_i2c_remove,
.id_table = tps65090_id_table,
};

@@ -268,13 +258,3 @@ static int __init tps65090_init(void)
return i2c_add_driver(&tps65090_driver);
}
subsys_initcall(tps65090_init);
-
-static void __exit tps65090_exit(void)
-{
- i2c_del_driver(&tps65090_driver);
-}
-module_exit(tps65090_exit);
-
-MODULE_DESCRIPTION("TPS65090 core driver");
-MODULE_AUTHOR("Venu Byravarasu <[email protected]>");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-17 23:20:28

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 13/18] mfd: wm831x-spi: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM831X_SPI
drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM831x/2x PMICs with SPI"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/wm831x-spi.c | 24 ++----------------------
1 file changed, 2 insertions(+), 22 deletions(-)

diff --git a/drivers/mfd/wm831x-spi.c b/drivers/mfd/wm831x-spi.c
index 018ce652ae57..dd4dab419940 100644
--- a/drivers/mfd/wm831x-spi.c
+++ b/drivers/mfd/wm831x-spi.c
@@ -13,7 +13,7 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/pm.h>
@@ -67,15 +67,6 @@ static int wm831x_spi_probe(struct spi_device *spi)
return wm831x_device_init(wm831x, spi->irq);
}

-static int wm831x_spi_remove(struct spi_device *spi)
-{
- struct wm831x *wm831x = spi_get_drvdata(spi);
-
- wm831x_device_exit(wm831x);
-
- return 0;
-}
-
static int wm831x_spi_suspend(struct device *dev)
{
struct wm831x *wm831x = dev_get_drvdata(dev);
@@ -108,17 +99,16 @@ static const struct spi_device_id wm831x_spi_ids[] = {
{ "wm8326", WM8326 },
{ },
};
-MODULE_DEVICE_TABLE(spi, wm831x_spi_ids);

static struct spi_driver wm831x_spi_driver = {
.driver = {
.name = "wm831x",
.pm = &wm831x_spi_pm,
.of_match_table = of_match_ptr(wm831x_of_match),
+ .suppress_bind_attrs = true,
},
.id_table = wm831x_spi_ids,
.probe = wm831x_spi_probe,
- .remove = wm831x_spi_remove,
};

static int __init wm831x_spi_init(void)
@@ -132,13 +122,3 @@ static int __init wm831x_spi_init(void)
return 0;
}
subsys_initcall(wm831x_spi_init);
-
-static void __exit wm831x_spi_exit(void)
-{
- spi_unregister_driver(&wm831x_spi_driver);
-}
-module_exit(wm831x_spi_exit);
-
-MODULE_DESCRIPTION("SPI support for WM831x/2x AudioPlus PMICs");
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mark Brown");
--
2.7.4


2018-12-17 23:20:30

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 14/18] mfd: wm831x-i2c: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM831X_I2C
drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM831x/2x PMICs with I2C"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

Cc: Lee Jones <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/wm831x-i2c.c | 20 ++------------------
1 file changed, 2 insertions(+), 18 deletions(-)

diff --git a/drivers/mfd/wm831x-i2c.c b/drivers/mfd/wm831x-i2c.c
index 22f7054d1b28..0f3af42f7268 100644
--- a/drivers/mfd/wm831x-i2c.c
+++ b/drivers/mfd/wm831x-i2c.c
@@ -13,7 +13,7 @@
*/

#include <linux/kernel.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/delay.h>
#include <linux/mfd/core.h>
@@ -68,15 +68,6 @@ static int wm831x_i2c_probe(struct i2c_client *i2c,
return wm831x_device_init(wm831x, i2c->irq);
}

-static int wm831x_i2c_remove(struct i2c_client *i2c)
-{
- struct wm831x *wm831x = i2c_get_clientdata(i2c);
-
- wm831x_device_exit(wm831x);
-
- return 0;
-}
-
static int wm831x_i2c_suspend(struct device *dev)
{
struct wm831x *wm831x = dev_get_drvdata(dev);
@@ -103,7 +94,6 @@ static const struct i2c_device_id wm831x_i2c_id[] = {
{ "wm8326", WM8326 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, wm831x_i2c_id);

static const struct dev_pm_ops wm831x_pm_ops = {
.suspend = wm831x_i2c_suspend,
@@ -115,9 +105,9 @@ static struct i2c_driver wm831x_i2c_driver = {
.name = "wm831x",
.pm = &wm831x_pm_ops,
.of_match_table = of_match_ptr(wm831x_of_match),
+ .suppress_bind_attrs = true,
},
.probe = wm831x_i2c_probe,
- .remove = wm831x_i2c_remove,
.id_table = wm831x_i2c_id,
};

@@ -132,9 +122,3 @@ static int __init wm831x_i2c_init(void)
return ret;
}
subsys_initcall(wm831x_i2c_init);
-
-static void __exit wm831x_i2c_exit(void)
-{
- i2c_del_driver(&wm831x_i2c_driver);
-}
-module_exit(wm831x_i2c_exit);
--
2.7.4


2018-12-17 23:20:36

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM8400
drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM8400"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

A trivial function rename from wm8400_module_init to the name
wm8400_driver_init is also done to reduce possible confusion.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Mark Brown <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/wm8400-core.c | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)

diff --git a/drivers/mfd/wm8400-core.c b/drivers/mfd/wm8400-core.c
index 8a98a2fc74e1..79756c83f5f0 100644
--- a/drivers/mfd/wm8400-core.c
+++ b/drivers/mfd/wm8400-core.c
@@ -12,7 +12,7 @@
*
*/

-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/bug.h>
#include <linux/err.h>
#include <linux/i2c.h>
@@ -150,7 +150,6 @@ static const struct i2c_device_id wm8400_i2c_id[] = {
{ "wm8400", 0 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, wm8400_i2c_id);

static struct i2c_driver wm8400_i2c_driver = {
.driver = {
@@ -161,7 +160,7 @@ static struct i2c_driver wm8400_i2c_driver = {
};
#endif

-static int __init wm8400_module_init(void)
+static int __init wm8400_driver_init(void)
{
int ret = -ENODEV;

@@ -173,15 +172,4 @@ static int __init wm8400_module_init(void)

return ret;
}
-subsys_initcall(wm8400_module_init);
-
-static void __exit wm8400_module_exit(void)
-{
-#if IS_ENABLED(CONFIG_I2C)
- i2c_del_driver(&wm8400_i2c_driver);
-#endif
-}
-module_exit(wm8400_module_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mark Brown <[email protected]>");
+subsys_initcall(wm8400_driver_init);
--
2.7.4


2018-12-17 23:20:40

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 11/18] mfd: tps65910: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_TPS65910
drivers/mfd/Kconfig- bool "TI TPS65910 Power Management chip"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

We don't replace module.h with init.h since the file already has that.
We do delete an unused moduleparam.h include though.

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
was (or is now) contained at the top of the file in the comments.

Cc: Tony Lindgren <[email protected]>
Cc: Lee Jones <[email protected]>
Cc: Graeme Gregory <[email protected]>
Cc: Jorge Eduardo Candelaria <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/tps65910.c | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)

diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
index bf16cbe6fd88..aa3d472a10ff 100644
--- a/drivers/mfd/tps65910.c
+++ b/drivers/mfd/tps65910.c
@@ -1,5 +1,5 @@
/*
- * tps65910.c -- TI TPS6591x
+ * tps65910.c -- TI TPS6591x chip family multi-function driver
*
* Copyright 2010 Texas Instruments Inc.
*
@@ -13,8 +13,6 @@
*
*/

-#include <linux/module.h>
-#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/slab.h>
@@ -374,7 +372,6 @@ static const struct of_device_id tps65910_of_match[] = {
{ .compatible = "ti,tps65911", .data = (void *)TPS65911},
{ },
};
-MODULE_DEVICE_TABLE(of, tps65910_of_match);

static struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
unsigned long *chip_id)
@@ -527,8 +524,6 @@ static const struct i2c_device_id tps65910_i2c_id[] = {
{ "tps65911", TPS65911 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, tps65910_i2c_id);
-

static struct i2c_driver tps65910_i2c_driver = {
.driver = {
@@ -545,14 +540,3 @@ static int __init tps65910_i2c_init(void)
}
/* init early so consumer devices can complete system boot */
subsys_initcall(tps65910_i2c_init);
-
-static void __exit tps65910_i2c_exit(void)
-{
- i2c_del_driver(&tps65910_i2c_driver);
-}
-module_exit(tps65910_i2c_exit);
-
-MODULE_AUTHOR("Graeme Gregory <[email protected]>");
-MODULE_AUTHOR("Jorge Eduardo Candelaria <[email protected]>");
-MODULE_DESCRIPTION("TPS6591x chip family multi-function driver");
-MODULE_LICENSE("GPL");
--
2.7.4


2018-12-17 23:20:47

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 16/18] mfd: wm8350-i2c: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_WM8350_I2C
drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM8350 with I2C"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

We explicitly disallow a driver unbind, since that doesn't have a
sensible use case anyway, and it allows us to drop the ".remove"
code for non-modular drivers.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

We don't replace module.h with init.h since the file already has that.
But we do delete an unused moduleparam.h

Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: [email protected]
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/wm8350-i2c.c | 24 +-----------------------
1 file changed, 1 insertion(+), 23 deletions(-)

diff --git a/drivers/mfd/wm8350-i2c.c b/drivers/mfd/wm8350-i2c.c
index 9358f03b7938..b4194e068e1b 100644
--- a/drivers/mfd/wm8350-i2c.c
+++ b/drivers/mfd/wm8350-i2c.c
@@ -13,8 +13,6 @@
*
*/

-#include <linux/module.h>
-#include <linux/moduleparam.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/i2c.h>
@@ -48,30 +46,19 @@ static int wm8350_i2c_probe(struct i2c_client *i2c,
return wm8350_device_init(wm8350, i2c->irq, pdata);
}

-static int wm8350_i2c_remove(struct i2c_client *i2c)
-{
- struct wm8350 *wm8350 = i2c_get_clientdata(i2c);
-
- wm8350_device_exit(wm8350);
-
- return 0;
-}
-
static const struct i2c_device_id wm8350_i2c_id[] = {
{ "wm8350", 0 },
{ "wm8351", 0 },
{ "wm8352", 0 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, wm8350_i2c_id);
-

static struct i2c_driver wm8350_i2c_driver = {
.driver = {
.name = "wm8350",
+ .suppress_bind_attrs = true,
},
.probe = wm8350_i2c_probe,
- .remove = wm8350_i2c_remove,
.id_table = wm8350_i2c_id,
};

@@ -81,12 +68,3 @@ static int __init wm8350_i2c_init(void)
}
/* init early so consumer devices can complete system boot */
subsys_initcall(wm8350_i2c_init);
-
-static void __exit wm8350_i2c_exit(void)
-{
- i2c_del_driver(&wm8350_i2c_driver);
-}
-module_exit(wm8350_i2c_exit);
-
-MODULE_DESCRIPTION("I2C support for the WM8350 AudioPlus PMIC");
-MODULE_LICENSE("GPL");
--
2.7.4


2018-12-17 23:20:49

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 04/18] mfd: db8500-prcmu: drop unused MODULE_ tags from non-modular code

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_DB8500_PRCMU
drivers/mfd/Kconfig: bool "ST-Ericsson DB8500 Power Reset Control Management Unit"

...meaning that it currently is not being built as a module by anyone.

Lets remove the couple traces of modular infrastructure use, so that
when reading the driver there is no doubt it is builtin-only.

We delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

We replace module.h with init.h and export.h ; the latter since the
file does export some symbols.

Cc: Linus Walleij <[email protected]>
Cc: Lee Jones <[email protected]>
Cc: Mattias Nilsson <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Reviewed-by: Linus Walleij <[email protected]>
---
drivers/mfd/db8500-prcmu.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c
index aec20e1c7d3d..65666b624ae8 100644
--- a/drivers/mfd/db8500-prcmu.c
+++ b/drivers/mfd/db8500-prcmu.c
@@ -1,4 +1,6 @@
/*
+ * DB8500 PRCM Unit driver
+ *
* Copyright (C) STMicroelectronics 2009
* Copyright (C) ST-Ericsson SA 2010
*
@@ -10,7 +12,8 @@
* U8500 PRCM Unit interface driver
*
*/
-#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/export.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/errno.h>
@@ -3188,9 +3191,4 @@ static int __init db8500_prcmu_init(void)
{
return platform_driver_register(&db8500_prcmu_driver);
}
-
core_initcall(db8500_prcmu_init);
-
-MODULE_AUTHOR("Mattias Nilsson <[email protected]>");
-MODULE_DESCRIPTION("DB8500 PRCM Unit driver");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-17 23:21:17

by Paul Gortmaker

[permalink] [raw]
Subject: [PATCH 09/18] mfd: syscon: Make it explicitly non-modular

The Kconfig currently controlling compilation of this code is:

drivers/mfd/Kconfig:config MFD_SYSCON
drivers/mfd/Kconfig: bool "System Controller Register R/W Based on Regmap"

...meaning that it currently is not being built as a module by anyone.

Lets remove the modular code that is essentially orphaned, so that
when reading the driver there is no doubt it is builtin-only.

Since module_init was not in use by this code, the init ordering
remains unchanged with this commit.

We also delete the MODULE_LICENSE tag etc. since all that information
is already contained at the top of the file in the comments.

Cc: Lee Jones <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Dong Aisheng <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>
Acked-by: Linus Walleij <[email protected]>
---
drivers/mfd/syscon.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index b6d05cd934e6..0ecdffb3d967 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -15,7 +15,7 @@
#include <linux/err.h>
#include <linux/hwspinlock.h>
#include <linux/io.h>
-#include <linux/module.h>
+#include <linux/init.h>
#include <linux/list.h>
#include <linux/of.h>
#include <linux/of_address.h>
@@ -272,13 +272,3 @@ static int __init syscon_init(void)
return platform_driver_register(&syscon_driver);
}
postcore_initcall(syscon_init);
-
-static void __exit syscon_exit(void)
-{
- platform_driver_unregister(&syscon_driver);
-}
-module_exit(syscon_exit);
-
-MODULE_AUTHOR("Dong Aisheng <[email protected]>");
-MODULE_DESCRIPTION("System Control driver");
-MODULE_LICENSE("GPL v2");
--
2.7.4


2018-12-18 06:22:24

by Jinyoung Park

[permalink] [raw]
Subject: Re: [PATCH 01/18] mfd: aat2870-core: Make it explicitly non-modular

Acked-by : Jin Park <[email protected]>


Thanks,

Jinyoung.


On 12/18/18 5:31 AM, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_AAT2870_CORE
> drivers/mfd/Kconfig: bool "AnalogicTech AAT2870"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: Jin Park <[email protected]>
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
> ---
> drivers/mfd/aat2870-core.c | 40 +++-------------------------------------
> 1 file changed, 3 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/mfd/aat2870-core.c b/drivers/mfd/aat2870-core.c
> index 3ba19a45f199..9d3d90d386c2 100644
> --- a/drivers/mfd/aat2870-core.c
> +++ b/drivers/mfd/aat2870-core.c
> @@ -20,7 +20,6 @@
> */
>
> #include <linux/kernel.h>
> -#include <linux/module.h>
> #include <linux/init.h>
> #include <linux/debugfs.h>
> #include <linux/slab.h>
> @@ -349,18 +348,10 @@ static void aat2870_init_debugfs(struct aat2870_data *aat2870)
> "Failed to create debugfs register file\n");
> }
>
> -static void aat2870_uninit_debugfs(struct aat2870_data *aat2870)
> -{
> - debugfs_remove_recursive(aat2870->dentry_root);
> -}
> #else
> static inline void aat2870_init_debugfs(struct aat2870_data *aat2870)
> {
> }
> -
> -static inline void aat2870_uninit_debugfs(struct aat2870_data *aat2870)
> -{
> -}
> #endif /* CONFIG_DEBUG_FS */
>
> static int aat2870_i2c_probe(struct i2c_client *client,
> @@ -440,20 +431,6 @@ static int aat2870_i2c_probe(struct i2c_client *client,
> return ret;
> }
>
> -static int aat2870_i2c_remove(struct i2c_client *client)
> -{
> - struct aat2870_data *aat2870 = i2c_get_clientdata(client);
> -
> - aat2870_uninit_debugfs(aat2870);
> -
> - mfd_remove_devices(aat2870->dev);
> - aat2870_disable(aat2870);
> - if (aat2870->uninit)
> - aat2870->uninit(aat2870);
> -
> - return 0;
> -}
> -
> #ifdef CONFIG_PM_SLEEP
> static int aat2870_i2c_suspend(struct device *dev)
> {
> @@ -492,15 +469,14 @@ static const struct i2c_device_id aat2870_i2c_id_table[] = {
> { "aat2870", 0 },
> { }
> };
> -MODULE_DEVICE_TABLE(i2c, aat2870_i2c_id_table);
>
> static struct i2c_driver aat2870_i2c_driver = {
> .driver = {
> - .name = "aat2870",
> - .pm = &aat2870_pm_ops,
> + .name = "aat2870",
> + .pm = &aat2870_pm_ops,
> + .suppress_bind_attrs = true,
> },
> .probe = aat2870_i2c_probe,
> - .remove = aat2870_i2c_remove,
> .id_table = aat2870_i2c_id_table,
> };
>
> @@ -509,13 +485,3 @@ static int __init aat2870_init(void)
> return i2c_add_driver(&aat2870_i2c_driver);
> }
> subsys_initcall(aat2870_init);
> -
> -static void __exit aat2870_exit(void)
> -{
> - i2c_del_driver(&aat2870_i2c_driver);
> -}
> -module_exit(aat2870_exit);
> -
> -MODULE_DESCRIPTION("Core support for the AnalogicTech AAT2870");
> -MODULE_LICENSE("GPL");
> -MODULE_AUTHOR("Jin Park <[email protected]>");

2018-12-18 07:45:10

by Hennerich, Michael

[permalink] [raw]
Subject: RE: [PATCH 02/18] mfd: adp5520: Make it explicitly non-modular



> -----Original Message-----
> From: Paul Gortmaker [mailto:[email protected]]
> Sent: Montag, 17. Dezember 2018 21:31
> To: Lee Jones <[email protected]>
> Cc: [email protected]; Paul Gortmaker <[email protected]>; Hennerich, Michael
> <[email protected]>
> Subject: [PATCH 02/18] mfd: adp5520: Make it explicitly non-modular
>
> The Makefile/Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Makefile:obj-$(CONFIG_PMIC_ADP5520) += adp5520.o
> drivers/mfd/Kconfig:config PMIC_ADP5520
> drivers/mfd/Kconfig: bool "Analog Devices ADP5520/01 MFD PMIC Core Support"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_i2c_driver() uses the same init level priority as
> builtin_i2c_driver() the init ordering remains unchanged with
> this commit.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> was (or is now) contained at the top of the file in the comments.
>
> Cc: Michael Hennerich <[email protected]>
> Cc: Lee Jones <[email protected]>
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>

Acked-by: Michael Hennerich <[email protected]>

> ---
> drivers/mfd/adp5520.c | 30 +++++++-----------------------
> 1 file changed, 7 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/mfd/adp5520.c b/drivers/mfd/adp5520.c
> index be0497b96720..2cdd39cb8a18 100644
> --- a/drivers/mfd/adp5520.c
> +++ b/drivers/mfd/adp5520.c
> @@ -7,6 +7,8 @@
> *
> * Copyright 2009 Analog Devices Inc.
> *
> + * Author: Michael Hennerich <[email protected]>
> + *
> * Derived from da903x:
> * Copyright (C) 2008 Compulab, Ltd.
> * Mike Rapoport <[email protected]>
> @@ -18,7 +20,7 @@
> */
>
> #include <linux/kernel.h>
> -#include <linux/module.h>
> +#include <linux/init.h>
> #include <linux/platform_device.h>
> #include <linux/slab.h>
> #include <linux/interrupt.h>
> @@ -304,18 +306,6 @@ static int adp5520_probe(struct i2c_client *client,
> return ret;
> }
>
> -static int adp5520_remove(struct i2c_client *client)
> -{
> - struct adp5520_chip *chip = dev_get_drvdata(&client->dev);
> -
> - if (chip->irq)
> - free_irq(chip->irq, chip);
> -
> - adp5520_remove_subdevs(chip);
> - adp5520_write(chip->dev, ADP5520_MODE_STATUS, 0);
> - return 0;
> -}
> -
> #ifdef CONFIG_PM_SLEEP
> static int adp5520_suspend(struct device *dev)
> {
> @@ -346,20 +336,14 @@ static const struct i2c_device_id adp5520_id[] = {
> { "pmic-adp5501", ID_ADP5501 },
> { }
> };
> -MODULE_DEVICE_TABLE(i2c, adp5520_id);
>
> static struct i2c_driver adp5520_driver = {
> .driver = {
> - .name = "adp5520",
> - .pm = &adp5520_pm,
> + .name = "adp5520",
> + .pm = &adp5520_pm,
> + .suppress_bind_attrs = true,
> },
> .probe = adp5520_probe,
> - .remove = adp5520_remove,
> .id_table = adp5520_id,
> };
> -
> -module_i2c_driver(adp5520_driver);
> -
> -MODULE_AUTHOR("Michael Hennerich <[email protected]>");
> -MODULE_DESCRIPTION("ADP5520(01) PMIC-MFD Driver");
> -MODULE_LICENSE("GPL");
> +builtin_i2c_driver(adp5520_driver);
> --
> 2.7.4


2018-12-18 10:07:47

by Laxman Dewangan

[permalink] [raw]
Subject: Re: [PATCH 07/18] mfd: rc5t583: Make it explicitly non-modular



On Tuesday 18 December 2018 02:01 AM, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_RC5T583
> drivers/mfd/Kconfig: bool "Ricoh RC5T583 Power Management system device"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: Laxman Dewangan <[email protected]>
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
>
Acked-by: Laxman Dewangan <[email protected]>

2018-12-18 10:09:01

by Laxman Dewangan

[permalink] [raw]
Subject: Re: [PATCH 12/18] mfd: tps80031: Make it explicitly non-modular



On Tuesday 18 December 2018 02:01 AM, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_TPS80031
> drivers/mfd/Kconfig: bool "TI TPS80031/TPS80032 Power Management chips"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> We don't replace module.h with init.h since the file already has that.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: Laxman Dewangan <[email protected]>
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
>

Acked-by: Laxman Dewangan <[email protected]>

2018-12-19 09:17:38

by Lee Jones

[permalink] [raw]
Subject: Re: [PATCH v4 00/18] mfd: demodularization of non-modular drivers

To all recipients (therefore, not a top post ;D ),

So far, so good. Please keep the reviews coming.

On Mon, 17 Dec 2018, Paul Gortmaker wrote:

> [v3 --> v4: delete now unused exit fcn from wm835x core; add more acks
> now all in chrono order, re-test.]
>
> [v2 --> v3: drop diasemi commits as they will be modularized; delete
> now unused exit fcn from wm831x core; add more acks; re-test.]
>
> [v1 --> v2: add some more commits as requested by Lee (MFD maintainer),
> update the 00/NN text; re-do build and link testing on new linux-next. ]
>
> This group of MFD drivers are all controlled by "bool" Kconfig settings,
> but contain various amounts of largely pointless uses of infrastructure
> related to modular operations, even though they can't be built modular.
>
> We can easily remove/replace all of it. We are trying to make driver
> code consistent with the Makefiles/Kconfigs that control them. This
> means not using modular functions/macros for drivers that can never be
> built as a module. Some of the downfalls this oversight leads to are:
>
> (1) it is easy to accidentally write unused module_exit and remove code
> (2) it can be misleading when reading the source, thinking it can be
> modular when the Makefile and/or Kconfig prohibit it
> (3) it requires the include of the module.h header file which in turn
> includes nearly everything else, thus adding a lot of CPP overhead.
> (4) it gets copied/replicated into other drivers and spreads quickly.
>
> What we see in current drivers falls into one or more of the following
> categories:
>
> 1) include of <linux/module.h> when it simply isn't needed
>
> 2) Use of MODULE_LICENSE, MODULE_DEVICE_TABLE, MODULE_AUTHOR etc.
> macros that are no-ops for non-modular drivers.
>
> 3) Creation of a module_exit() function that will be compiled and
> linked in but never actually called for non-modular drivers.
>
> 4) Addition of a platform_driver ".remove" function that is bound
> into the struct but will never be called for non-module use cases.
>
> Solution to #1 --> #3 is simple ; we just delete the related code.
>
> The solution to #4 is similar - we delete the ".remove" function and
> the binding into the platform_driver struct. However, since the same
> ".remove" function could also be triggered by an "unbind" (such as for
> pass-through of a device to a guest instance) - so we also explicitly
> disable any unbind for the driver.
>
> The unbind mask allows us to ensure we will see if there was some odd
> corner case out there that was relying on it. Typically it would be a
> multi-port ethernet card passing a port through to a guest, so a
> sensible use case in MFD drivers seems highly unlikely. This same
> solution has already been used in multiple other mainline subsystems.
>
> Build testing was done on drivers/mfd for allyesconfig on x86_64, ARM
> and ARM-64 on a recent linux-next checkout.
>
> Paul.
>
> ---
>
> Cc: Alessandro Rubini <[email protected]>
> Cc: Arnd Bergmann <[email protected]>
> Cc: Charles Keepax <[email protected]>
> Cc: Cory Maccarrone <[email protected]>
> Cc: Davide Ciminaghi <[email protected]>
> Cc: Dong Aisheng <[email protected]>
> Cc: Graeme Gregory <[email protected]>
> Cc: Guennadi Liakhovetski <[email protected]>
> Cc: Haojian Zhuang <[email protected]>
> Cc: Jin Park <[email protected]>
> Cc: Jorge Eduardo Candelaria <[email protected]>
> Cc: Laxman Dewangan <[email protected]>
> Cc: Lee Jones <[email protected]>
> Cc: Linus Walleij <[email protected]>
> Cc: Mark Brown <[email protected]>
> Cc: Mattias Nilsson <[email protected]>
> Cc: Michael Hennerich <[email protected]>
> Cc: Tony Lindgren <[email protected]>
> Cc: Venu Byravarasu <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
>
>
> Paul Gortmaker (18):
> mfd: aat2870-core: Make it explicitly non-modular
> mfd: adp5520: Make it explicitly non-modular
> mfd: as3711: Make it explicitly non-modular
> mfd: db8500-prcmu: drop unused MODULE_ tags from non-modular code
> mfd: htc-i2cpld: Make it explicitly non-modular
> mfd: max8925-core: drop unused MODULE_ tags from non-modular code
> mfd: rc5t583: Make it explicitly non-modular
> mfd: sta2x11: drop unused MODULE_ tags from non-modular code
> mfd: syscon: Make it explicitly non-modular
> mfd: tps65090: Make it explicitly non-modular
> mfd: tps65910: Make it explicitly non-modular
> mfd: tps80031: Make it explicitly non-modular
> mfd: wm831x-spi: Make it explicitly non-modular
> mfd: wm831x-i2c: Make it explicitly non-modular
> mfd: wm831x-core: drop unused module infrastructure from non-modular code
> mfd: wm8350-i2c: Make it explicitly non-modular
> mfd: wm8350-core: drop unused module infrastructure from non-modular code
> mfd: wm8400-core: Make it explicitly non-modular
>
> drivers/mfd/aat2870-core.c | 40 +++-------------------------------------
> drivers/mfd/adp5520.c | 30 +++++++-----------------------
> drivers/mfd/as3711.c | 14 --------------
> drivers/mfd/db8500-prcmu.c | 10 ++++------
> drivers/mfd/htc-i2cpld.c | 18 +-----------------
> drivers/mfd/max8925-core.c | 7 +------
> drivers/mfd/rc5t583.c | 14 --------------
> drivers/mfd/sta2x11-mfd.c | 10 ++++------
> drivers/mfd/syscon.c | 12 +-----------
> drivers/mfd/tps65090.c | 30 +++++-------------------------
> drivers/mfd/tps65910.c | 18 +-----------------
> drivers/mfd/tps80031.c | 37 ++-----------------------------------
> drivers/mfd/wm831x-core.c | 15 ++-------------
> drivers/mfd/wm831x-i2c.c | 20 ++------------------
> drivers/mfd/wm831x-spi.c | 24 ++----------------------
> drivers/mfd/wm8350-core.c | 30 ++----------------------------
> drivers/mfd/wm8350-i2c.c | 24 +-----------------------
> drivers/mfd/wm8400-core.c | 18 +++---------------
> include/linux/mfd/wm831x/core.h | 1 -
> include/linux/mfd/wm8350/core.h | 1 -
> 20 files changed, 41 insertions(+), 332 deletions(-)
>

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

2018-12-19 09:31:32

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 17/18] mfd: wm8350-core: drop unused module infrastructure from non-modular code

On Mon, Dec 17, 2018 at 03:31:27PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM8350
> drivers/mfd/Kconfig: bool
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the couple traces of modular infrastructure use, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> We replace module.h with init.h and export.h ; the latter since the
> file does export some symbols.
>
> Previous demodularizaion work has made wm8350_device_exit() no longer
> used, so it is also removed from the 8350 core code.
>
> Cc: Linus Walleij <[email protected]>
> Cc: Charles Keepax <[email protected]>
> Cc: Lee Jones <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> ---

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

Thanks,
Charles

2018-12-19 09:32:00

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 13/18] mfd: wm831x-spi: Make it explicitly non-modular

On Mon, Dec 17, 2018 at 03:31:23PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM831X_SPI
> drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM831x/2x PMICs with SPI"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
> ---

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

Thanks,
Charles

2018-12-19 09:32:19

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 15/18] mfd: wm831x-core: drop unused module infrastructure from non-modular code

On Mon, Dec 17, 2018 at 03:31:25PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM831X
> drivers/mfd/Kconfig: bool
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the couple traces of modular infrastructure use, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Previous demodularizaion work has made wm831x_device_exit() no longer
> used, so it is also removed from the 831x core code.
>
> Cc: Lee Jones <[email protected]>
> Cc: Charles Keepax <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Charles Keepax <[email protected]>
> ---

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

Thanks,
Charles

2018-12-19 11:42:14

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 14/18] mfd: wm831x-i2c: Make it explicitly non-modular

On Mon, Dec 17, 2018 at 03:31:24PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM831X_I2C
> drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM831x/2x PMICs with I2C"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> Cc: Lee Jones <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
> ---

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

Thanks,
Charles

2018-12-19 11:42:14

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 16/18] mfd: wm8350-i2c: Make it explicitly non-modular

On Mon, Dec 17, 2018 at 03:31:26PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM8350_I2C
> drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM8350 with I2C"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> We explicitly disallow a driver unbind, since that doesn't have a
> sensible use case anyway, and it allows us to drop the ".remove"
> code for non-modular drivers.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> We don't replace module.h with init.h since the file already has that.
> But we do delete an unused moduleparam.h
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
> ---

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

Thanks,
Charles

2018-12-19 12:05:47

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular

On Mon, Dec 17, 2018 at 03:31:28PM -0500, Paul Gortmaker wrote:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_WM8400
> drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM8400"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.
>
> Since module_init was not in use by this code, the init ordering
> remains unchanged with this commit.
>
> A trivial function rename from wm8400_module_init to the name
> wm8400_driver_init is also done to reduce possible confusion.
>
> Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
>
> We also delete the MODULE_LICENSE tag etc. since all that information
> is already contained at the top of the file in the comments.
>
> Cc: Lee Jones <[email protected]>
> Cc: Mark Brown <[email protected]>
> Cc: [email protected]
> Signed-off-by: Paul Gortmaker <[email protected]>
> Acked-by: Linus Walleij <[email protected]>
> ---
> -MODULE_DEVICE_TABLE(i2c, wm8400_i2c_id);
>
> static struct i2c_driver wm8400_i2c_driver = {
> .driver = {
> @@ -161,7 +160,7 @@ static struct i2c_driver wm8400_i2c_driver = {
> };
> #endif

Do we not want to add suppress_bind_attrs into the i2c_driver
struct here?

Thanks,
Charles

2018-12-22 03:01:56

by Paul Gortmaker

[permalink] [raw]
Subject: Re: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular

[Re: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular] On 19/12/2018 (Wed 09:17) Charles Keepax wrote:

> On Mon, Dec 17, 2018 at 03:31:28PM -0500, Paul Gortmaker wrote:
> > The Kconfig currently controlling compilation of this code is:
> >
> > drivers/mfd/Kconfig:config MFD_WM8400
> > drivers/mfd/Kconfig: bool "Wolfson Microelectronics WM8400"
> >
> > ...meaning that it currently is not being built as a module by anyone.
> >
> > Lets remove the modular code that is essentially orphaned, so that
> > when reading the driver there is no doubt it is builtin-only.
> >
> > Since module_init was not in use by this code, the init ordering
> > remains unchanged with this commit.
> >
> > A trivial function rename from wm8400_module_init to the name
> > wm8400_driver_init is also done to reduce possible confusion.
> >
> > Also note that MODULE_DEVICE_TABLE is a no-op for non-modular code.
> >
> > We also delete the MODULE_LICENSE tag etc. since all that information
> > is already contained at the top of the file in the comments.
> >
> > Cc: Lee Jones <[email protected]>
> > Cc: Mark Brown <[email protected]>
> > Cc: [email protected]
> > Signed-off-by: Paul Gortmaker <[email protected]>
> > Acked-by: Linus Walleij <[email protected]>
> > ---
> > -MODULE_DEVICE_TABLE(i2c, wm8400_i2c_id);
> >
> > static struct i2c_driver wm8400_i2c_driver = {
> > .driver = {
> > @@ -161,7 +160,7 @@ static struct i2c_driver wm8400_i2c_driver = {
> > };
> > #endif
>
> Do we not want to add suppress_bind_attrs into the i2c_driver
> struct here?

We can add one if you/maintainers want one, but if you look at the
original patch, this driver was using the more classic/legacy case of
subsys_init() vs. platform_driver_register() used in other drivers.

Not adding a suppress_bind_attrs here was intentional, since I'd decided
to put in the unbind entries for code that used platform_driver_register()
where the author had created the .remove code, on the assumption that they
had put some thought into the process of unbind/remove - to make it
explicit that unbind is now disabled.

To be clear, using the subsys_init() doesn't implicitly disable unbind.
However, there are lots of non-modular drivers out there; ones I've not
even touched, and to start a project to add an unbind disable to them
all is beyond the scope of the goals I've listed in the 00/18 preamble.

I'd hope maybe we can revisit the global default setting for non-modular
code someday - to make non-modules opt-in instead of opt-out, and
achieve better consistency from one driver to the next, without having
to add a new .driver sub-struct to each file for the suppress entry.

I think LinusW hinted at in an earlier email in this ongoing review,
that the default setting didn't quite make sense to him either. But in
any case, that is a separate discussion for another time and place.

Let me know if you explicitly want one added, otherwise I'll just leave
the .remove + .suppress_bind_attrs pairing as described above.

Thanks,
Paul.
--

>
> Thanks, Charles

2018-12-23 16:47:07

by Tony Lindgren

[permalink] [raw]
Subject: Re: [PATCH 11/18] mfd: tps65910: Make it explicitly non-modular

* Paul Gortmaker <[email protected]> [181217 20:36]:
> The Kconfig currently controlling compilation of this code is:
>
> drivers/mfd/Kconfig:config MFD_TPS65910
> drivers/mfd/Kconfig- bool "TI TPS65910 Power Management chip"
>
> ...meaning that it currently is not being built as a module by anyone.
>
> Lets remove the modular code that is essentially orphaned, so that
> when reading the driver there is no doubt it is builtin-only.

Acked-by: Tony Lindgren <[email protected]>

2018-12-28 12:28:14

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular

On Fri, Dec 21, 2018 at 10:55:16AM -0500, Paul Gortmaker wrote:
> [Re: [PATCH 18/18] mfd: wm8400-core: Make it explicitly non-modular] On 19/12/2018 (Wed 09:17) Charles Keepax wrote:
>
> > On Mon, Dec 17, 2018 at 03:31:28PM -0500, Paul Gortmaker wrote:
> > > -MODULE_DEVICE_TABLE(i2c, wm8400_i2c_id);
> > >
> > > static struct i2c_driver wm8400_i2c_driver = {
> > > .driver = {
> > > @@ -161,7 +160,7 @@ static struct i2c_driver wm8400_i2c_driver = {
> > > };
> > > #endif
> >
> > Do we not want to add suppress_bind_attrs into the i2c_driver
> > struct here?
>
> We can add one if you/maintainers want one, but if you look at the
> original patch, this driver was using the more classic/legacy case of
> subsys_init() vs. platform_driver_register() used in other drivers.
>
> Not adding a suppress_bind_attrs here was intentional, since I'd decided
> to put in the unbind entries for code that used platform_driver_register()
> where the author had created the .remove code, on the assumption that they
> had put some thought into the process of unbind/remove - to make it
> explicit that unbind is now disabled.
>
> To be clear, using the subsys_init() doesn't implicitly disable unbind.
> However, there are lots of non-modular drivers out there; ones I've not
> even touched, and to start a project to add an unbind disable to them
> all is beyond the scope of the goals I've listed in the 00/18 preamble.
>
> I'd hope maybe we can revisit the global default setting for non-modular
> code someday - to make non-modules opt-in instead of opt-out, and
> achieve better consistency from one driver to the next, without having
> to add a new .driver sub-struct to each file for the suppress entry.
>
> I think LinusW hinted at in an earlier email in this ongoing review,
> that the default setting didn't quite make sense to him either. But in
> any case, that is a separate discussion for another time and place.
>
> Let me know if you explicitly want one added, otherwise I'll just leave
> the .remove + .suppress_bind_attrs pairing as described above.
>

Nah its ok, if you are specifically not doing this one I think I
am ok with it. Just seemed out of place compared to the the
others:

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

Thanks,
Charles