// SPDX-License-Identifier: GPL-2.0-only
/*
 * Simple MFD - I2C
 *
 * Author(s):
 * 	Michael Walle <michael@walle.cc>
 * 	Lee Jones <lee.jones@linaro.org>
 *
 * 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 or via the MFD cells in this file
 * will be subsequently registered.
 */

#include <linux/array_size.h>
#include <linux/dev_printk.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/mfd/core.h>
#include <linux/module.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
#include <linux/stddef.h>

#include "simple-mfd-i2c.h"

static const struct regmap_config regmap_config_8r_8v = {
	.reg_bits = 8,
	.val_bits = 8,
};

static int simple_mfd_i2c_probe(struct i2c_client *i2c)
{
	const struct simple_mfd_data *simple_mfd_data;
	const struct regmap_config *regmap_config;
	struct regmap *regmap;
	int ret;

	simple_mfd_data = device_get_match_data(&i2c->dev);

	/* If no regmap_config is specified, use the default 8reg and 8val bits */
	if (!simple_mfd_data || !simple_mfd_data->regmap_config)
		regmap_config = &regmap_config_8r_8v;
	else
		regmap_config = simple_mfd_data->regmap_config;

	regmap = devm_regmap_init_i2c(i2c, regmap_config);
	if (IS_ERR(regmap))
		return PTR_ERR(regmap);

	/* If no MFD cells are specified, register using the DT child nodes instead */
	if (!simple_mfd_data || !simple_mfd_data->mfd_cell)
		return devm_of_platform_populate(&i2c->dev);

	ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO,
				   simple_mfd_data->mfd_cell,
				   simple_mfd_data->mfd_cell_size,
				   NULL, 0, NULL);
	if (ret)
		dev_err(&i2c->dev, "Failed to add child devices\n");

	return ret;
}

static const struct mfd_cell sy7636a_cells[] = {
	{ .name = "sy7636a-regulator", },
	{ .name = "sy7636a-temperature", },
};

static const struct simple_mfd_data silergy_sy7636a = {
	.mfd_cell = sy7636a_cells,
	.mfd_cell_size = ARRAY_SIZE(sy7636a_cells),
};

static const struct mfd_cell max5970_cells[] = {
	{ .name = "max5970-regulator", },
	{ .name = "max5970-iio", },
	{ .name = "max5970-led", },
};

static const struct simple_mfd_data maxim_max5970 = {
	.mfd_cell = max5970_cells,
	.mfd_cell_size = ARRAY_SIZE(max5970_cells),
};

static const struct mfd_cell max77705_sensor_cells[] = {
	{ .name = "max77705-battery" },
	{ .name = "max77705-hwmon", },
};

static const struct simple_mfd_data maxim_mon_max77705 = {
	.mfd_cell = max77705_sensor_cells,
	.mfd_cell_size = ARRAY_SIZE(max77705_sensor_cells),
};

static const struct regmap_config spacemit_p1_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
};

static const struct mfd_cell spacemit_p1_cells[] = {
	{ .name = "spacemit-p1-reboot", },
	{ .name = "spacemit-p1-regulator", },
	{ .name = "spacemit-p1-rtc", },
};

static const struct simple_mfd_data spacemit_p1 = {
	.regmap_config = &spacemit_p1_regmap_config,
	.mfd_cell = spacemit_p1_cells,
	.mfd_cell_size = ARRAY_SIZE(spacemit_p1_cells),
};

static const struct of_device_id simple_mfd_i2c_of_match[] = {
	{ .compatible = "delta,tn48m-cpld" },
	{ .compatible = "fsl,ls1028aqds-fpga" },
	{ .compatible = "fsl,lx2160aqds-fpga" },
	{ .compatible = "fsl,lx2160ardb-fpga" },
	{ .compatible = "kontron,sl28cpld" },
	{ .compatible = "maxim,max5970", .data = &maxim_max5970 },
	{ .compatible = "maxim,max5978", .data = &maxim_max5970 },
	{ .compatible = "maxim,max77705-battery", .data = &maxim_mon_max77705 },
	{ .compatible = "silergy,sy7636a", .data = &silergy_sy7636a },
	{ .compatible = "spacemit,p1", .data = &spacemit_p1 },
	{}
};
MODULE_DEVICE_TABLE(of, simple_mfd_i2c_of_match);

static struct i2c_driver simple_mfd_i2c_driver = {
	.probe = 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");
