mfd: Add simple regmap based I2C driver
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> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
Родитель
9123e3a74e
Коммит
3abee45794
|
@ -1162,6 +1162,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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
Загрузка…
Ссылка в новой задаче