162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AD7879-1/AD7889-1 touchscreen (I2C bus)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/input.h>	/* BUS_I2C */
962306a36Sopenharmony_ci#include <linux/i2c.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/types.h>
1262306a36Sopenharmony_ci#include <linux/of.h>
1362306a36Sopenharmony_ci#include <linux/pm.h>
1462306a36Sopenharmony_ci#include <linux/regmap.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include "ad7879.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define AD7879_DEVID		0x79	/* AD7879-1/AD7889-1 */
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic const struct regmap_config ad7879_i2c_regmap_config = {
2162306a36Sopenharmony_ci	.reg_bits = 8,
2262306a36Sopenharmony_ci	.val_bits = 16,
2362306a36Sopenharmony_ci	.max_register = 15,
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic int ad7879_i2c_probe(struct i2c_client *client)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	struct regmap *regmap;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	if (!i2c_check_functionality(client->adapter,
3162306a36Sopenharmony_ci				     I2C_FUNC_SMBUS_WORD_DATA)) {
3262306a36Sopenharmony_ci		dev_err(&client->dev, "SMBUS Word Data not Supported\n");
3362306a36Sopenharmony_ci		return -EIO;
3462306a36Sopenharmony_ci	}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	regmap = devm_regmap_init_i2c(client, &ad7879_i2c_regmap_config);
3762306a36Sopenharmony_ci	if (IS_ERR(regmap))
3862306a36Sopenharmony_ci		return PTR_ERR(regmap);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	return ad7879_probe(&client->dev, regmap, client->irq,
4162306a36Sopenharmony_ci			    BUS_I2C, AD7879_DEVID);
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic const struct i2c_device_id ad7879_id[] = {
4562306a36Sopenharmony_ci	{ "ad7879", 0 },
4662306a36Sopenharmony_ci	{ "ad7889", 0 },
4762306a36Sopenharmony_ci	{ }
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, ad7879_id);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#ifdef CONFIG_OF
5262306a36Sopenharmony_cistatic const struct of_device_id ad7879_i2c_dt_ids[] = {
5362306a36Sopenharmony_ci	{ .compatible = "adi,ad7879-1", },
5462306a36Sopenharmony_ci	{ }
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, ad7879_i2c_dt_ids);
5762306a36Sopenharmony_ci#endif
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cistatic struct i2c_driver ad7879_i2c_driver = {
6062306a36Sopenharmony_ci	.driver = {
6162306a36Sopenharmony_ci		.name	= "ad7879",
6262306a36Sopenharmony_ci		.pm	= &ad7879_pm_ops,
6362306a36Sopenharmony_ci		.of_match_table = of_match_ptr(ad7879_i2c_dt_ids),
6462306a36Sopenharmony_ci	},
6562306a36Sopenharmony_ci	.probe		= ad7879_i2c_probe,
6662306a36Sopenharmony_ci	.id_table	= ad7879_id,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cimodule_i2c_driver(ad7879_i2c_driver);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ciMODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
7262306a36Sopenharmony_ciMODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver");
7362306a36Sopenharmony_ciMODULE_LICENSE("GPL");
74