diff mbox series

[v6,01/13] mfd: add simple regmap based I2C driver

Message ID 20200725231834.25642-2-michael@walle.cc (mailing list archive)
State New, archived
Headers show
Series Add support for Kontron sl28cpld | expand

Commit Message

Michael Walle July 25, 2020, 11:18 p.m. UTC
There are I2C devices which contain several different functions but
doesn't require any special access functions. For these kind of drivers
an I2C regmap should be enough.

Create an I2C driver which creates an I2C regmap and enumerates its
children. If a device wants to use this as its MFD core driver, it has
to add an individual compatible string. It may provide its own regmap
configuration.

Subdevices can use dev_get_regmap() on the parent to get their regmap
instance.

Signed-off-by: Michael Walle <michael@walle.cc>
---
Changes since v5:
 - removed "select MFD_CORE" in Kconfig
 - removed help text in Kconfig, we assume that the users of this
   driver will have a "select MFD_SIMPLE_MFD_I2C". Instead added
   a small description to the driver itself.
 - removed "struct simple_mfd_i2c_config" and use regmap_config
   directly
 - changed builtin_i2c_driver() to module_i2c_driver(), added
   MODULE_ boilerplate
 - cleaned up the included files

Changes since v4:
 - new patch. Lee, please bear with me. I didn't want to delay the
   new version (where a lot of remarks on the other patches were
   addressed) even more, just because we haven't figured out how
   to deal with the MFD part. So for now, I've included this one.

 drivers/mfd/Kconfig          |  5 ++++
 drivers/mfd/Makefile         |  1 +
 drivers/mfd/simple-mfd-i2c.c | 55 ++++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+)
 create mode 100644 drivers/mfd/simple-mfd-i2c.c

Comments

Lee Jones July 28, 2020, 7:19 a.m. UTC | #1
On Sun, 26 Jul 2020, Michael Walle wrote:

> There are I2C devices which contain several different functions but
> doesn't require any special access functions. For these kind of drivers
> an I2C regmap should be enough.
> 
> Create an I2C driver which creates an I2C regmap and enumerates its
> children. If a device wants to use this as its MFD core driver, it has
> to add an individual compatible string. It may provide its own regmap
> configuration.
> 
> Subdevices can use dev_get_regmap() on the parent to get their regmap
> instance.
> 
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
> Changes since v5:
>  - removed "select MFD_CORE" in Kconfig
>  - removed help text in Kconfig, we assume that the users of this

That's the opposite of what I asked for.

>    driver will have a "select MFD_SIMPLE_MFD_I2C". Instead added
>    a small description to the driver itself.
>  - removed "struct simple_mfd_i2c_config" and use regmap_config
>    directly
>  - changed builtin_i2c_driver() to module_i2c_driver(), added
>    MODULE_ boilerplate
>  - cleaned up the included files
> 
> Changes since v4:
>  - new patch. Lee, please bear with me. I didn't want to delay the
>    new version (where a lot of remarks on the other patches were
>    addressed) even more, just because we haven't figured out how
>    to deal with the MFD part. So for now, I've included this one.
> 
>  drivers/mfd/Kconfig          |  5 ++++
>  drivers/mfd/Makefile         |  1 +
>  drivers/mfd/simple-mfd-i2c.c | 55 ++++++++++++++++++++++++++++++++++++
>  3 files changed, 61 insertions(+)
>  create mode 100644 drivers/mfd/simple-mfd-i2c.c
> 
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 33df0837ab41..c08539c7a166 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -1162,6 +1162,11 @@ config MFD_SI476X_CORE
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called si476x-core.
>  
> +config MFD_SIMPLE_MFD_I2C
> +	tristate
> +	depends on I2C
> +	select REGMAP_I2C

Please provide a full help.

>  config MFD_SM501
>  	tristate "Silicon Motion SM501"
>  	depends on HAS_DMA
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index a60e5f835283..78d24a3e7c9e 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -264,3 +264,4 @@ obj-$(CONFIG_MFD_STMFX) 	+= stmfx.o
>  obj-$(CONFIG_MFD_KHADAS_MCU) 	+= khadas-mcu.o
>  
>  obj-$(CONFIG_SGI_MFD_IOC3)	+= ioc3.o
> +obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)	+= simple-mfd-i2c.o
> diff --git a/drivers/mfd/simple-mfd-i2c.c b/drivers/mfd/simple-mfd-i2c.c
> new file mode 100644
> index 000000000000..45090ddad104
> --- /dev/null
> +++ b/drivers/mfd/simple-mfd-i2c.c
> @@ -0,0 +1,55 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * A very simple I2C MFD driver

Simple MFD - I2C

> + * The driver enumerates its children and registers a common regmap. Use
> + * dev_get_regmap(pdev->dev.parent, NULL) in the child nodes to fetch that
> + * regmap instance.

This driver creates a single register map with the intention for it to
be shared by all sub-devices.  Children can use their parent's device
structure (dev.parent) in order reference it. 

> + * In the future this driver might be extended to support also other interfaces
> + * like SPI etc.

Remove this please.

> + */

'\n' here.

> +#include <linux/i2c.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/of_platform.h>
> +#include <linux/regmap.h>
> +
> +static const struct regmap_config simple_regmap_config = {
> +	.reg_bits = 8,
> +	.val_bits = 8,
> +};
> +
> +static int simple_mfd_i2c_probe(struct i2c_client *i2c)
> +{
> +	const struct regmap_config *config;
> +	struct regmap *regmap;
> +
> +	config = device_get_match_data(&i2c->dev);
> +	if (!config)
> +		config = &simple_regmap_config;
> +
> +	regmap = devm_regmap_init_i2c(i2c, config);
> +	if (IS_ERR(regmap))
> +		return PTR_ERR(regmap);
> +
> +	return devm_of_platform_populate(&i2c->dev);
> +}
> +
> +static const struct of_device_id simple_mfd_i2c_of_match[] = {
> +	{}
> +};
> +MODULE_DEVICE_TABLE(of, simple_mfd_i2c_of_match);
> +
> +static struct i2c_driver simple_mfd_i2c_driver = {
> +	.probe_new = simple_mfd_i2c_probe,
> +	.driver = {
> +		.name = "simple-mfd-i2c",
> +		.of_match_table = simple_mfd_i2c_of_match,
> +	},
> +};
> +module_i2c_driver(simple_mfd_i2c_driver);
> +
> +MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
> +MODULE_DESCRIPTION("Simple I2C MFD driver");

Simple MFD - I2C driver

> +MODULE_LICENSE("GPL v2");
Michael Walle July 28, 2020, 7:42 a.m. UTC | #2
Am 2020-07-28 09:19, schrieb Lee Jones:
> On Sun, 26 Jul 2020, Michael Walle wrote:
> 
>> There are I2C devices which contain several different functions but
>> doesn't require any special access functions. For these kind of 
>> drivers
>> an I2C regmap should be enough.
>> 
>> Create an I2C driver which creates an I2C regmap and enumerates its
>> children. If a device wants to use this as its MFD core driver, it has
>> to add an individual compatible string. It may provide its own regmap
>> configuration.
>> 
>> Subdevices can use dev_get_regmap() on the parent to get their regmap
>> instance.
>> 
>> Signed-off-by: Michael Walle <michael@walle.cc>
>> ---
>> Changes since v5:
>>  - removed "select MFD_CORE" in Kconfig
>>  - removed help text in Kconfig, we assume that the users of this
> 
> That's the opposite of what I asked for.

What is the use to describe the symbol, if it is not user selectable?
I'm not aware this is done anywhere in the kernel, am I missing
something?

>>    driver will have a "select MFD_SIMPLE_MFD_I2C". Instead added
>>    a small description to the driver itself.
>>  - removed "struct simple_mfd_i2c_config" and use regmap_config
>>    directly
>>  - changed builtin_i2c_driver() to module_i2c_driver(), added
>>    MODULE_ boilerplate
>>  - cleaned up the included files
>> 
>> Changes since v4:
>>  - new patch. Lee, please bear with me. I didn't want to delay the
>>    new version (where a lot of remarks on the other patches were
>>    addressed) even more, just because we haven't figured out how
>>    to deal with the MFD part. So for now, I've included this one.
>> 
>>  drivers/mfd/Kconfig          |  5 ++++
>>  drivers/mfd/Makefile         |  1 +
>>  drivers/mfd/simple-mfd-i2c.c | 55 
>> ++++++++++++++++++++++++++++++++++++
>>  3 files changed, 61 insertions(+)
>>  create mode 100644 drivers/mfd/simple-mfd-i2c.c
>> 
>> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> index 33df0837ab41..c08539c7a166 100644
>> --- a/drivers/mfd/Kconfig
>> +++ b/drivers/mfd/Kconfig
>> @@ -1162,6 +1162,11 @@ config MFD_SI476X_CORE
>>  	  To compile this driver as a module, choose M here: the
>>  	  module will be called si476x-core.
>> 
>> +config MFD_SIMPLE_MFD_I2C
>> +	tristate
>> +	depends on I2C
>> +	select REGMAP_I2C
> 
> Please provide a full help.

See above.

> 
>>  config MFD_SM501
>>  	tristate "Silicon Motion SM501"
>>  	depends on HAS_DMA
>> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>> index a60e5f835283..78d24a3e7c9e 100644
>> --- a/drivers/mfd/Makefile
>> +++ b/drivers/mfd/Makefile
>> @@ -264,3 +264,4 @@ obj-$(CONFIG_MFD_STMFX) 	+= stmfx.o
>>  obj-$(CONFIG_MFD_KHADAS_MCU) 	+= khadas-mcu.o
>> 
>>  obj-$(CONFIG_SGI_MFD_IOC3)	+= ioc3.o
>> +obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)	+= simple-mfd-i2c.o
>> diff --git a/drivers/mfd/simple-mfd-i2c.c 
>> b/drivers/mfd/simple-mfd-i2c.c
>> new file mode 100644
>> index 000000000000..45090ddad104
>> --- /dev/null
>> +++ b/drivers/mfd/simple-mfd-i2c.c
>> @@ -0,0 +1,55 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * A very simple I2C MFD driver
> 
> Simple MFD - I2C

ok.

>> + * The driver enumerates its children and registers a common regmap. 
>> Use
>> + * dev_get_regmap(pdev->dev.parent, NULL) in the child nodes to fetch 
>> that
>> + * regmap instance.
> 
> This driver creates a single register map with the intention for it to
> be shared by all sub-devices.  Children can use their parent's device
> structure (dev.parent) in order reference it.

Should this be appended or should it replace my paragraph? If its the 
latter,
the "enumeration of the children" is missing.

>> + * In the future this driver might be extended to support also other 
>> interfaces
>> + * like SPI etc.
> 
> Remove this please.

Why would you remove information about the intention of this driver? If 
someone
looks for a place to implement its SPI/I3C/Slimbus MFD driver this might 
come
in handy.

-michael
Lee Jones July 28, 2020, 8:15 a.m. UTC | #3
On Tue, 28 Jul 2020, Michael Walle wrote:

> Am 2020-07-28 09:19, schrieb Lee Jones:
> > On Sun, 26 Jul 2020, Michael Walle wrote:
> > 
> > > There are I2C devices which contain several different functions but
> > > doesn't require any special access functions. For these kind of
> > > drivers
> > > an I2C regmap should be enough.
> > > 
> > > Create an I2C driver which creates an I2C regmap and enumerates its
> > > children. If a device wants to use this as its MFD core driver, it has
> > > to add an individual compatible string. It may provide its own regmap
> > > configuration.
> > > 
> > > Subdevices can use dev_get_regmap() on the parent to get their regmap
> > > instance.
> > > 
> > > Signed-off-by: Michael Walle <michael@walle.cc>
> > > ---
> > > Changes since v5:
> > >  - removed "select MFD_CORE" in Kconfig
> > >  - removed help text in Kconfig, we assume that the users of this
> > 
> > That's the opposite of what I asked for.
> 
> What is the use to describe the symbol, if it is not user selectable?
> I'm not aware this is done anywhere in the kernel, am I missing
> something?

You mean in menuconfig?

I find 'help's helpful even outside of menuconfig.

Surely I'm not the only one who reads them 'raw'?

> > >    driver will have a "select MFD_SIMPLE_MFD_I2C". Instead added
> > >    a small description to the driver itself.
> > >  - removed "struct simple_mfd_i2c_config" and use regmap_config
> > >    directly
> > >  - changed builtin_i2c_driver() to module_i2c_driver(), added
> > >    MODULE_ boilerplate
> > >  - cleaned up the included files
> > > 
> > > Changes since v4:
> > >  - new patch. Lee, please bear with me. I didn't want to delay the
> > >    new version (where a lot of remarks on the other patches were
> > >    addressed) even more, just because we haven't figured out how
> > >    to deal with the MFD part. So for now, I've included this one.
> > > 
> > >  drivers/mfd/Kconfig          |  5 ++++
> > >  drivers/mfd/Makefile         |  1 +
> > >  drivers/mfd/simple-mfd-i2c.c | 55
> > > ++++++++++++++++++++++++++++++++++++
> > >  3 files changed, 61 insertions(+)
> > >  create mode 100644 drivers/mfd/simple-mfd-i2c.c
> > > 
> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > > index 33df0837ab41..c08539c7a166 100644
> > > --- a/drivers/mfd/Kconfig
> > > +++ b/drivers/mfd/Kconfig
> > > @@ -1162,6 +1162,11 @@ config MFD_SI476X_CORE
> > >  	  To compile this driver as a module, choose M here: the
> > >  	  module will be called si476x-core.
> > > 
> > > +config MFD_SIMPLE_MFD_I2C
> > > +	tristate
> > > +	depends on I2C
> > > +	select REGMAP_I2C
> > 
> > Please provide a full help.
> 
> See above.
> 
> > 
> > >  config MFD_SM501
> > >  	tristate "Silicon Motion SM501"
> > >  	depends on HAS_DMA
> > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> > > index a60e5f835283..78d24a3e7c9e 100644
> > > --- a/drivers/mfd/Makefile
> > > +++ b/drivers/mfd/Makefile
> > > @@ -264,3 +264,4 @@ obj-$(CONFIG_MFD_STMFX) 	+= stmfx.o
> > >  obj-$(CONFIG_MFD_KHADAS_MCU) 	+= khadas-mcu.o
> > > 
> > >  obj-$(CONFIG_SGI_MFD_IOC3)	+= ioc3.o
> > > +obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)	+= simple-mfd-i2c.o
> > > diff --git a/drivers/mfd/simple-mfd-i2c.c
> > > b/drivers/mfd/simple-mfd-i2c.c
> > > new file mode 100644
> > > index 000000000000..45090ddad104
> > > --- /dev/null
> > > +++ b/drivers/mfd/simple-mfd-i2c.c
> > > @@ -0,0 +1,55 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * A very simple I2C MFD driver
> > 
> > Simple MFD - I2C
> 
> ok.
> 
> > > + * The driver enumerates its children and registers a common
> > > regmap. Use
> > > + * dev_get_regmap(pdev->dev.parent, NULL) in the child nodes to
> > > fetch that
> > > + * regmap instance.
> > 
> > This driver creates a single register map with the intention for it to
> > be shared by all sub-devices.  Children can use their parent's device
> > structure (dev.parent) in order reference it.
> 
> Should this be appended or should it replace my paragraph? If its the
> latter,
> the "enumeration of the children" is missing.

If you want to keep that part, try:

This driver creates a single register map with the intention for it to
be shared by all sub-devices.  Children can use their parent's device
structure (dev.parent) in order reference it.

Once the register map has been successfully initialised, any
sub-devices represented by child nodes in Device Tree will be
subsequently registered.

> > > + * In the future this driver might be extended to support also
> > > other interfaces
> > > + * like SPI etc.
> > 
> > Remove this please.
> 
> Why would you remove information about the intention of this driver? If
> someone
> looks for a place to implement its SPI/I3C/Slimbus MFD driver this might
> come
> in handy.

By all means put something similar in the commit log, but it has no
place in the driver itself.  Besides, if we were to add support for
SPI, it is likely to be a completely separate/unrelated driver.
Michael Walle July 28, 2020, 8:27 a.m. UTC | #4
Am 2020-07-28 10:15, schrieb Lee Jones:
> On Tue, 28 Jul 2020, Michael Walle wrote:
> 
>> Am 2020-07-28 09:19, schrieb Lee Jones:
>> > On Sun, 26 Jul 2020, Michael Walle wrote:
>> >
>> > > There are I2C devices which contain several different functions but
>> > > doesn't require any special access functions. For these kind of
>> > > drivers
>> > > an I2C regmap should be enough.
>> > >
>> > > Create an I2C driver which creates an I2C regmap and enumerates its
>> > > children. If a device wants to use this as its MFD core driver, it has
>> > > to add an individual compatible string. It may provide its own regmap
>> > > configuration.
>> > >
>> > > Subdevices can use dev_get_regmap() on the parent to get their regmap
>> > > instance.
>> > >
>> > > Signed-off-by: Michael Walle <michael@walle.cc>
>> > > ---
>> > > Changes since v5:
>> > >  - removed "select MFD_CORE" in Kconfig
>> > >  - removed help text in Kconfig, we assume that the users of this
>> >
>> > That's the opposite of what I asked for.
>> 
>> What is the use to describe the symbol, if it is not user selectable?
>> I'm not aware this is done anywhere in the kernel, am I missing
>> something?
> 
> You mean in menuconfig?
> 
> I find 'help's helpful even outside of menuconfig.
> 
> Surely I'm not the only one who reads them 'raw'?

Its already available in the header of the file. But sure, I can
copy it.

>> > >    driver will have a "select MFD_SIMPLE_MFD_I2C". Instead added
>> > >    a small description to the driver itself.
>> > >  - removed "struct simple_mfd_i2c_config" and use regmap_config
>> > >    directly
>> > >  - changed builtin_i2c_driver() to module_i2c_driver(), added
>> > >    MODULE_ boilerplate
>> > >  - cleaned up the included files
>> > >
>> > > Changes since v4:
>> > >  - new patch. Lee, please bear with me. I didn't want to delay the
>> > >    new version (where a lot of remarks on the other patches were
>> > >    addressed) even more, just because we haven't figured out how
>> > >    to deal with the MFD part. So for now, I've included this one.
>> > >
>> > >  drivers/mfd/Kconfig          |  5 ++++
>> > >  drivers/mfd/Makefile         |  1 +
>> > >  drivers/mfd/simple-mfd-i2c.c | 55
>> > > ++++++++++++++++++++++++++++++++++++
>> > >  3 files changed, 61 insertions(+)
>> > >  create mode 100644 drivers/mfd/simple-mfd-i2c.c
>> > >
>> > > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
>> > > index 33df0837ab41..c08539c7a166 100644
>> > > --- a/drivers/mfd/Kconfig
>> > > +++ b/drivers/mfd/Kconfig
>> > > @@ -1162,6 +1162,11 @@ config MFD_SI476X_CORE
>> > >  	  To compile this driver as a module, choose M here: the
>> > >  	  module will be called si476x-core.
>> > >
>> > > +config MFD_SIMPLE_MFD_I2C
>> > > +	tristate
>> > > +	depends on I2C
>> > > +	select REGMAP_I2C
>> >
>> > Please provide a full help.
>> 
>> See above.
>> 
>> >
>> > >  config MFD_SM501
>> > >  	tristate "Silicon Motion SM501"
>> > >  	depends on HAS_DMA
>> > > diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
>> > > index a60e5f835283..78d24a3e7c9e 100644
>> > > --- a/drivers/mfd/Makefile
>> > > +++ b/drivers/mfd/Makefile
>> > > @@ -264,3 +264,4 @@ obj-$(CONFIG_MFD_STMFX) 	+= stmfx.o
>> > >  obj-$(CONFIG_MFD_KHADAS_MCU) 	+= khadas-mcu.o
>> > >
>> > >  obj-$(CONFIG_SGI_MFD_IOC3)	+= ioc3.o
>> > > +obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)	+= simple-mfd-i2c.o
>> > > diff --git a/drivers/mfd/simple-mfd-i2c.c
>> > > b/drivers/mfd/simple-mfd-i2c.c
>> > > new file mode 100644
>> > > index 000000000000..45090ddad104
>> > > --- /dev/null
>> > > +++ b/drivers/mfd/simple-mfd-i2c.c
>> > > @@ -0,0 +1,55 @@
>> > > +// SPDX-License-Identifier: GPL-2.0-only
>> > > +/*
>> > > + * A very simple I2C MFD driver
>> >
>> > Simple MFD - I2C
>> 
>> ok.
>> 
>> > > + * The driver enumerates its children and registers a common
>> > > regmap. Use
>> > > + * dev_get_regmap(pdev->dev.parent, NULL) in the child nodes to
>> > > fetch that
>> > > + * regmap instance.
>> >
>> > This driver creates a single register map with the intention for it to
>> > be shared by all sub-devices.  Children can use their parent's device
>> > structure (dev.parent) in order reference it.
>> 
>> Should this be appended or should it replace my paragraph? If its the
>> latter,
>> the "enumeration of the children" is missing.
> 
> If you want to keep that part, try:
> 
> This driver creates a single register map with the intention for it to
> be shared by all sub-devices.  Children can use their parent's device
> structure (dev.parent) in order reference it.
> 
> Once the register map has been successfully initialised, any
> sub-devices represented by child nodes in Device Tree will be
> subsequently registered.
> 
>> > > + * In the future this driver might be extended to support also
>> > > other interfaces
>> > > + * like SPI etc.
>> >
>> > Remove this please.
>> 
>> Why would you remove information about the intention of this driver? 
>> If
>> someone
>> looks for a place to implement its SPI/I3C/Slimbus MFD driver this 
>> might
>> come
>> in handy.
> 
> By all means put something similar in the commit log, but it has no
> place in the driver itself.  Besides, if we were to add support for
> SPI, it is likely to be a completely separate/unrelated driver.

Why would that be another driver? It would be 90% copy paste with
regmap_init_i2c() replaced by regmap_init_spi() and i2c_driver replaced
by spi_driver.

But I don't care. I'll remove it.

-michael
Lee Jones July 28, 2020, 8:35 a.m. UTC | #5
On Tue, 28 Jul 2020, Michael Walle wrote:

> Am 2020-07-28 10:15, schrieb Lee Jones:
> > On Tue, 28 Jul 2020, Michael Walle wrote:
> > 
> > > Am 2020-07-28 09:19, schrieb Lee Jones:
> > > > On Sun, 26 Jul 2020, Michael Walle wrote:
> > > >
> > > > > There are I2C devices which contain several different functions but
> > > > > doesn't require any special access functions. For these kind of
> > > > > drivers
> > > > > an I2C regmap should be enough.
> > > > >
> > > > > Create an I2C driver which creates an I2C regmap and enumerates its
> > > > > children. If a device wants to use this as its MFD core driver, it has
> > > > > to add an individual compatible string. It may provide its own regmap
> > > > > configuration.
> > > > >
> > > > > Subdevices can use dev_get_regmap() on the parent to get their regmap
> > > > > instance.
> > > > >
> > > > > Signed-off-by: Michael Walle <michael@walle.cc>
> > > > > ---
> > > > > Changes since v5:
> > > > >  - removed "select MFD_CORE" in Kconfig
> > > > >  - removed help text in Kconfig, we assume that the users of this
> > > >
> > > > That's the opposite of what I asked for.
> > > 
> > > What is the use to describe the symbol, if it is not user selectable?
> > > I'm not aware this is done anywhere in the kernel, am I missing
> > > something?
> > 
> > You mean in menuconfig?
> > 
> > I find 'help's helpful even outside of menuconfig.
> > 
> > Surely I'm not the only one who reads them 'raw'?
> 
> Its already available in the header of the file. But sure, I can
> copy it.

Thanks.

[...]

> > > Why would you remove information about the intention of this driver?
> > > If
> > > someone
> > > looks for a place to implement its SPI/I3C/Slimbus MFD driver this
> > > might
> > > come
> > > in handy.
> > 
> > By all means put something similar in the commit log, but it has no
> > place in the driver itself.  Besides, if we were to add support for
> > SPI, it is likely to be a completely separate/unrelated driver.
> 
> Why would that be another driver? It would be 90% copy paste with
> regmap_init_i2c() replaced by regmap_init_spi() and i2c_driver replaced
> by spi_driver.

We'll investigate options if/when the time comes.  If 'spi_driver' and
'i2c_driver' can *sensibly* co-exist, then that is certainly an option
we can explore.

> But I don't care. I'll remove it.

Please.
diff mbox series

Patch

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 33df0837ab41..c08539c7a166 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -1162,6 +1162,11 @@  config MFD_SI476X_CORE
 	  To compile this driver as a module, choose M here: the
 	  module will be called si476x-core.
 
+config MFD_SIMPLE_MFD_I2C
+	tristate
+	depends on I2C
+	select REGMAP_I2C
+
 config MFD_SM501
 	tristate "Silicon Motion SM501"
 	depends on HAS_DMA
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index a60e5f835283..78d24a3e7c9e 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -264,3 +264,4 @@  obj-$(CONFIG_MFD_STMFX) 	+= stmfx.o
 obj-$(CONFIG_MFD_KHADAS_MCU) 	+= khadas-mcu.o
 
 obj-$(CONFIG_SGI_MFD_IOC3)	+= ioc3.o
+obj-$(CONFIG_MFD_SIMPLE_MFD_I2C)	+= simple-mfd-i2c.o
diff --git a/drivers/mfd/simple-mfd-i2c.c b/drivers/mfd/simple-mfd-i2c.c
new file mode 100644
index 000000000000..45090ddad104
--- /dev/null
+++ b/drivers/mfd/simple-mfd-i2c.c
@@ -0,0 +1,55 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * A very simple I2C MFD driver
+ *
+ * The driver enumerates its children and registers a common regmap. Use
+ * dev_get_regmap(pdev->dev.parent, NULL) in the child nodes to fetch that
+ * regmap instance.
+ *
+ * In the future this driver might be extended to support also other interfaces
+ * like SPI etc.
+ */
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/regmap.h>
+
+static const struct regmap_config simple_regmap_config = {
+	.reg_bits = 8,
+	.val_bits = 8,
+};
+
+static int simple_mfd_i2c_probe(struct i2c_client *i2c)
+{
+	const struct regmap_config *config;
+	struct regmap *regmap;
+
+	config = device_get_match_data(&i2c->dev);
+	if (!config)
+		config = &simple_regmap_config;
+
+	regmap = devm_regmap_init_i2c(i2c, config);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
+	return devm_of_platform_populate(&i2c->dev);
+}
+
+static const struct of_device_id simple_mfd_i2c_of_match[] = {
+	{}
+};
+MODULE_DEVICE_TABLE(of, simple_mfd_i2c_of_match);
+
+static struct i2c_driver simple_mfd_i2c_driver = {
+	.probe_new = simple_mfd_i2c_probe,
+	.driver = {
+		.name = "simple-mfd-i2c",
+		.of_match_table = simple_mfd_i2c_of_match,
+	},
+};
+module_i2c_driver(simple_mfd_i2c_driver);
+
+MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
+MODULE_DESCRIPTION("Simple I2C MFD driver");
+MODULE_LICENSE("GPL v2");