180503b23SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
24397c98aSMike Frysinger /*
34397c98aSMike Frysinger  * AD7879-1/AD7889-1 touchscreen (I2C bus)
44397c98aSMike Frysinger  *
54397c98aSMike Frysinger  * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc.
64397c98aSMike Frysinger  */
74397c98aSMike Frysinger 
84397c98aSMike Frysinger #include <linux/input.h>	/* BUS_I2C */
94397c98aSMike Frysinger #include <linux/i2c.h>
104397c98aSMike Frysinger #include <linux/module.h>
114397c98aSMike Frysinger #include <linux/types.h>
12fa6e3ca2SStefan Agner #include <linux/of.h>
13d5dc9ac3SMark Brown #include <linux/pm.h>
14404a24c3SDmitry Torokhov #include <linux/regmap.h>
154397c98aSMike Frysinger 
164397c98aSMike Frysinger #include "ad7879.h"
174397c98aSMike Frysinger 
184397c98aSMike Frysinger #define AD7879_DEVID		0x79	/* AD7879-1/AD7889-1 */
194397c98aSMike Frysinger 
20404a24c3SDmitry Torokhov static const struct regmap_config ad7879_i2c_regmap_config = {
21404a24c3SDmitry Torokhov 	.reg_bits = 8,
22404a24c3SDmitry Torokhov 	.val_bits = 16,
23404a24c3SDmitry Torokhov 	.max_register = 15,
244397c98aSMike Frysinger };
254397c98aSMike Frysinger 
ad7879_i2c_probe(struct i2c_client * client)26f2a19deeSUwe Kleine-König static int ad7879_i2c_probe(struct i2c_client *client)
274397c98aSMike Frysinger {
28404a24c3SDmitry Torokhov 	struct regmap *regmap;
294397c98aSMike Frysinger 
304397c98aSMike Frysinger 	if (!i2c_check_functionality(client->adapter,
314397c98aSMike Frysinger 				     I2C_FUNC_SMBUS_WORD_DATA)) {
324397c98aSMike Frysinger 		dev_err(&client->dev, "SMBUS Word Data not Supported\n");
334397c98aSMike Frysinger 		return -EIO;
344397c98aSMike Frysinger 	}
354397c98aSMike Frysinger 
36404a24c3SDmitry Torokhov 	regmap = devm_regmap_init_i2c(client, &ad7879_i2c_regmap_config);
37404a24c3SDmitry Torokhov 	if (IS_ERR(regmap))
38404a24c3SDmitry Torokhov 		return PTR_ERR(regmap);
39404a24c3SDmitry Torokhov 
404e34025bSDmitry Torokhov 	return ad7879_probe(&client->dev, regmap, client->irq,
41404a24c3SDmitry Torokhov 			    BUS_I2C, AD7879_DEVID);
424397c98aSMike Frysinger }
434397c98aSMike Frysinger 
444397c98aSMike Frysinger static const struct i2c_device_id ad7879_id[] = {
454397c98aSMike Frysinger 	{ "ad7879", 0 },
464397c98aSMike Frysinger 	{ "ad7889", 0 },
474397c98aSMike Frysinger 	{ }
484397c98aSMike Frysinger };
494397c98aSMike Frysinger MODULE_DEVICE_TABLE(i2c, ad7879_id);
504397c98aSMike Frysinger 
51fa6e3ca2SStefan Agner #ifdef CONFIG_OF
52fa6e3ca2SStefan Agner static const struct of_device_id ad7879_i2c_dt_ids[] = {
53fa6e3ca2SStefan Agner 	{ .compatible = "adi,ad7879-1", },
54fa6e3ca2SStefan Agner 	{ }
55fa6e3ca2SStefan Agner };
56fa6e3ca2SStefan Agner MODULE_DEVICE_TABLE(of, ad7879_i2c_dt_ids);
57fa6e3ca2SStefan Agner #endif
58fa6e3ca2SStefan Agner 
594397c98aSMike Frysinger static struct i2c_driver ad7879_i2c_driver = {
604397c98aSMike Frysinger 	.driver = {
614397c98aSMike Frysinger 		.name	= "ad7879",
628672bd93SDmitry Torokhov 		.pm	= &ad7879_pm_ops,
63fa6e3ca2SStefan Agner 		.of_match_table = of_match_ptr(ad7879_i2c_dt_ids),
644397c98aSMike Frysinger 	},
65*d8bde56dSUwe Kleine-König 	.probe		= ad7879_i2c_probe,
664397c98aSMike Frysinger 	.id_table	= ad7879_id,
674397c98aSMike Frysinger };
684397c98aSMike Frysinger 
691b92c1cfSAxel Lin module_i2c_driver(ad7879_i2c_driver);
704397c98aSMike Frysinger 
712581e5d1SMichael Hennerich MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
724397c98aSMike Frysinger MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver");
734397c98aSMike Frysinger MODULE_LICENSE("GPL");
74