lkml.org 
[lkml]   [2020]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 01/13] mfd: add simple regmap based I2C driver
    Date
    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>
    Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
    ---
    Changes since v9:
    - none

    Changes since v8:
    - fixed typo

    Changes since v7:
    - none

    Changes since v6:
    - added SIMPLE_MFD_I2C help text
    - revised description in module header

    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 | 12 ++++++++
    drivers/mfd/Makefile | 1 +
    drivers/mfd/simple-mfd-i2c.c | 56 ++++++++++++++++++++++++++++++++++++
    3 files changed, 69 insertions(+)
    create mode 100644 drivers/mfd/simple-mfd-i2c.c

    diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
    index 2bc3073d4891..b66b60eed003 100644
    --- a/drivers/mfd/Kconfig
    +++ b/drivers/mfd/Kconfig
    @@ -1173,6 +1173,18 @@ 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
    + help
    + This driver creates a single register map with the intention for it
    + to be shared by all sub-devices.
    +
    + Once the register map has been successfully initialised, any
    + sub-devices represented by child nodes in Device Tree will be
    + subsequently registered.
    +
    config MFD_SM501
    tristate "Silicon Motion SM501"
    depends on HAS_DMA
    diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
    index d660be7fef1b..e6c7520ed129 100644
    --- a/drivers/mfd/Makefile
    +++ b/drivers/mfd/Makefile
    @@ -265,3 +265,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..28e96a246be1
    --- /dev/null
    +++ b/drivers/mfd/simple-mfd-i2c.c
    @@ -0,0 +1,56 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +/*
    + * Simple MFD - I2C
    + *
    + * 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 to reference it.
    + *
    + * Once the register map has been successfully initialised, any sub-devices
    + * represented by child nodes in Device Tree will be subsequently registered.
    + */
    +
    +#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 MFD - I2C driver");
    +MODULE_LICENSE("GPL v2");
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-09-14 23:45    [W:4.222 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site