18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com/
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Author: Keerthy <j-keerthy@ti.com>
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or
78c2ecf20Sopenharmony_ci * modify it under the terms of the GNU General Public License as
88c2ecf20Sopenharmony_ci * published by the Free Software Foundation version 2.
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * This program is distributed "as is" WITHOUT ANY WARRANTY of any
118c2ecf20Sopenharmony_ci * kind, whether express or implied; without even the implied warranty
128c2ecf20Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
138c2ecf20Sopenharmony_ci * GNU General Public License for more details.
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
178c2ecf20Sopenharmony_ci#include <linux/mfd/core.h>
188c2ecf20Sopenharmony_ci#include <linux/module.h>
198c2ecf20Sopenharmony_ci#include <linux/of_device.h>
208c2ecf20Sopenharmony_ci#include <linux/regmap.h>
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#include <linux/mfd/lp873x.h>
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cistatic const struct regmap_config lp873x_regmap_config = {
258c2ecf20Sopenharmony_ci	.reg_bits = 8,
268c2ecf20Sopenharmony_ci	.val_bits = 8,
278c2ecf20Sopenharmony_ci	.max_register = LP873X_REG_MAX,
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic const struct mfd_cell lp873x_cells[] = {
318c2ecf20Sopenharmony_ci	{ .name = "lp873x-regulator", },
328c2ecf20Sopenharmony_ci	{ .name = "lp873x-gpio", },
338c2ecf20Sopenharmony_ci};
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic int lp873x_probe(struct i2c_client *client,
368c2ecf20Sopenharmony_ci			const struct i2c_device_id *ids)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	struct lp873x *lp873;
398c2ecf20Sopenharmony_ci	int ret;
408c2ecf20Sopenharmony_ci	unsigned int otpid;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	lp873 = devm_kzalloc(&client->dev, sizeof(*lp873), GFP_KERNEL);
438c2ecf20Sopenharmony_ci	if (!lp873)
448c2ecf20Sopenharmony_ci		return -ENOMEM;
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	lp873->dev = &client->dev;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	lp873->regmap = devm_regmap_init_i2c(client, &lp873x_regmap_config);
498c2ecf20Sopenharmony_ci	if (IS_ERR(lp873->regmap)) {
508c2ecf20Sopenharmony_ci		ret = PTR_ERR(lp873->regmap);
518c2ecf20Sopenharmony_ci		dev_err(lp873->dev,
528c2ecf20Sopenharmony_ci			"Failed to initialize register map: %d\n", ret);
538c2ecf20Sopenharmony_ci		return ret;
548c2ecf20Sopenharmony_ci	}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	ret = regmap_read(lp873->regmap, LP873X_REG_OTP_REV, &otpid);
578c2ecf20Sopenharmony_ci	if (ret) {
588c2ecf20Sopenharmony_ci		dev_err(lp873->dev, "Failed to read OTP ID\n");
598c2ecf20Sopenharmony_ci		return ret;
608c2ecf20Sopenharmony_ci	}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	lp873->rev = otpid & LP873X_OTP_REV_OTP_ID;
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	i2c_set_clientdata(client, lp873);
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci	ret = mfd_add_devices(lp873->dev, PLATFORM_DEVID_AUTO, lp873x_cells,
678c2ecf20Sopenharmony_ci			      ARRAY_SIZE(lp873x_cells), NULL, 0, NULL);
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	return ret;
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic const struct of_device_id of_lp873x_match_table[] = {
738c2ecf20Sopenharmony_ci	{ .compatible = "ti,lp8733", },
748c2ecf20Sopenharmony_ci	{ .compatible = "ti,lp8732", },
758c2ecf20Sopenharmony_ci	{}
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, of_lp873x_match_table);
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistatic const struct i2c_device_id lp873x_id_table[] = {
808c2ecf20Sopenharmony_ci	{ "lp873x", 0 },
818c2ecf20Sopenharmony_ci	{ },
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, lp873x_id_table);
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_cistatic struct i2c_driver lp873x_driver = {
868c2ecf20Sopenharmony_ci	.driver	= {
878c2ecf20Sopenharmony_ci		.name	= "lp873x",
888c2ecf20Sopenharmony_ci		.of_match_table = of_lp873x_match_table,
898c2ecf20Sopenharmony_ci	},
908c2ecf20Sopenharmony_ci	.probe		= lp873x_probe,
918c2ecf20Sopenharmony_ci	.id_table	= lp873x_id_table,
928c2ecf20Sopenharmony_ci};
938c2ecf20Sopenharmony_cimodule_i2c_driver(lp873x_driver);
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ciMODULE_AUTHOR("J Keerthy <j-keerthy@ti.com>");
968c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("LP873X chip family Multi-Function Device driver");
978c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2");
98