1fda8d26eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
23025c868SLorenzo Bianconi /*
33025c868SLorenzo Bianconi  * STMicroelectronics uvis25 i2c driver
43025c868SLorenzo Bianconi  *
53025c868SLorenzo Bianconi  * Copyright 2017 STMicroelectronics Inc.
63025c868SLorenzo Bianconi  *
73025c868SLorenzo Bianconi  * Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>
83025c868SLorenzo Bianconi  */
93025c868SLorenzo Bianconi 
103025c868SLorenzo Bianconi #include <linux/kernel.h>
113025c868SLorenzo Bianconi #include <linux/module.h>
12645aee51SJonathan Cameron #include <linux/mod_devicetable.h>
133025c868SLorenzo Bianconi #include <linux/i2c.h>
143025c868SLorenzo Bianconi #include <linux/slab.h>
153025c868SLorenzo Bianconi #include <linux/regmap.h>
163025c868SLorenzo Bianconi 
173025c868SLorenzo Bianconi #include "st_uvis25.h"
183025c868SLorenzo Bianconi 
193025c868SLorenzo Bianconi #define UVIS25_I2C_AUTO_INCREMENT	BIT(7)
203025c868SLorenzo Bianconi 
21debbbbefSColin Ian King static const struct regmap_config st_uvis25_i2c_regmap_config = {
223025c868SLorenzo Bianconi 	.reg_bits = 8,
233025c868SLorenzo Bianconi 	.val_bits = 8,
243025c868SLorenzo Bianconi 	.write_flag_mask = UVIS25_I2C_AUTO_INCREMENT,
253025c868SLorenzo Bianconi 	.read_flag_mask = UVIS25_I2C_AUTO_INCREMENT,
263025c868SLorenzo Bianconi };
273025c868SLorenzo Bianconi 
st_uvis25_i2c_probe(struct i2c_client * client)28c3ff326aSUwe Kleine-König static int st_uvis25_i2c_probe(struct i2c_client *client)
293025c868SLorenzo Bianconi {
303025c868SLorenzo Bianconi 	struct regmap *regmap;
313025c868SLorenzo Bianconi 
323025c868SLorenzo Bianconi 	regmap = devm_regmap_init_i2c(client, &st_uvis25_i2c_regmap_config);
333025c868SLorenzo Bianconi 	if (IS_ERR(regmap)) {
343c50dee9SAndy Shevchenko 		dev_err(&client->dev, "Failed to register i2c regmap %ld\n",
353c50dee9SAndy Shevchenko 			PTR_ERR(regmap));
363025c868SLorenzo Bianconi 		return PTR_ERR(regmap);
373025c868SLorenzo Bianconi 	}
383025c868SLorenzo Bianconi 
393025c868SLorenzo Bianconi 	return st_uvis25_probe(&client->dev, client->irq, regmap);
403025c868SLorenzo Bianconi }
413025c868SLorenzo Bianconi 
423025c868SLorenzo Bianconi static const struct of_device_id st_uvis25_i2c_of_match[] = {
433025c868SLorenzo Bianconi 	{ .compatible = "st,uvis25", },
443025c868SLorenzo Bianconi 	{},
453025c868SLorenzo Bianconi };
463025c868SLorenzo Bianconi MODULE_DEVICE_TABLE(of, st_uvis25_i2c_of_match);
473025c868SLorenzo Bianconi 
483025c868SLorenzo Bianconi static const struct i2c_device_id st_uvis25_i2c_id_table[] = {
493025c868SLorenzo Bianconi 	{ ST_UVIS25_DEV_NAME },
503025c868SLorenzo Bianconi 	{},
513025c868SLorenzo Bianconi };
523025c868SLorenzo Bianconi MODULE_DEVICE_TABLE(i2c, st_uvis25_i2c_id_table);
533025c868SLorenzo Bianconi 
543025c868SLorenzo Bianconi static struct i2c_driver st_uvis25_driver = {
553025c868SLorenzo Bianconi 	.driver = {
563025c868SLorenzo Bianconi 		.name = "st_uvis25_i2c",
573259b99eSJonathan Cameron 		.pm = pm_sleep_ptr(&st_uvis25_pm_ops),
58645aee51SJonathan Cameron 		.of_match_table = st_uvis25_i2c_of_match,
593025c868SLorenzo Bianconi 	},
60*7cf15f42SUwe Kleine-König 	.probe = st_uvis25_i2c_probe,
613025c868SLorenzo Bianconi 	.id_table = st_uvis25_i2c_id_table,
623025c868SLorenzo Bianconi };
633025c868SLorenzo Bianconi module_i2c_driver(st_uvis25_driver);
643025c868SLorenzo Bianconi 
653025c868SLorenzo Bianconi MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
663025c868SLorenzo Bianconi MODULE_DESCRIPTION("STMicroelectronics uvis25 i2c driver");
673025c868SLorenzo Bianconi MODULE_LICENSE("GPL v2");
68cfaa5482SJonathan Cameron MODULE_IMPORT_NS(IIO_UVIS25);
69