xref: /linux/drivers/input/misc/ad714x-i2c.c (revision 6b7cfd193a00ba72efb19a05c486f96ae9297d0b)
131a62963SBryan Wu /*
231a62963SBryan Wu  * AD714X CapTouch Programmable Controller driver (I2C bus)
331a62963SBryan Wu  *
431a62963SBryan Wu  * Copyright 2009 Analog Devices Inc.
531a62963SBryan Wu  *
631a62963SBryan Wu  * Licensed under the GPL-2 or later.
731a62963SBryan Wu  */
831a62963SBryan Wu 
931a62963SBryan Wu #include <linux/input.h>	/* BUS_I2C */
1031a62963SBryan Wu #include <linux/i2c.h>
1131a62963SBryan Wu #include <linux/module.h>
1231a62963SBryan Wu #include <linux/types.h>
13*6b7cfd19SMark Brown #include <linux/pm.h>
1431a62963SBryan Wu #include "ad714x.h"
1531a62963SBryan Wu 
1631a62963SBryan Wu #ifdef CONFIG_PM
17*6b7cfd19SMark Brown static int ad714x_i2c_suspend(struct device *dev)
1831a62963SBryan Wu {
19*6b7cfd19SMark Brown 	return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev)));
2031a62963SBryan Wu }
2131a62963SBryan Wu 
22*6b7cfd19SMark Brown static int ad714x_i2c_resume(struct device *dev)
2331a62963SBryan Wu {
24*6b7cfd19SMark Brown 	return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev)));
2531a62963SBryan Wu }
2631a62963SBryan Wu #endif
2731a62963SBryan Wu 
28*6b7cfd19SMark Brown static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
29*6b7cfd19SMark Brown 
3031a62963SBryan Wu static int ad714x_i2c_write(struct device *dev, unsigned short reg,
3131a62963SBryan Wu 				unsigned short data)
3231a62963SBryan Wu {
3331a62963SBryan Wu 	struct i2c_client *client = to_i2c_client(dev);
3431a62963SBryan Wu 	int ret = 0;
3531a62963SBryan Wu 	u8 *_reg = (u8 *)&reg;
3631a62963SBryan Wu 	u8 *_data = (u8 *)&data;
3731a62963SBryan Wu 
3831a62963SBryan Wu 	u8 tx[4] = {
3931a62963SBryan Wu 		_reg[1],
4031a62963SBryan Wu 		_reg[0],
4131a62963SBryan Wu 		_data[1],
4231a62963SBryan Wu 		_data[0]
4331a62963SBryan Wu 	};
4431a62963SBryan Wu 
4531a62963SBryan Wu 	ret = i2c_master_send(client, tx, 4);
4631a62963SBryan Wu 	if (ret < 0)
4731a62963SBryan Wu 		dev_err(&client->dev, "I2C write error\n");
4831a62963SBryan Wu 
4931a62963SBryan Wu 	return ret;
5031a62963SBryan Wu }
5131a62963SBryan Wu 
5231a62963SBryan Wu static int ad714x_i2c_read(struct device *dev, unsigned short reg,
5331a62963SBryan Wu 				unsigned short *data)
5431a62963SBryan Wu {
5531a62963SBryan Wu 	struct i2c_client *client = to_i2c_client(dev);
5631a62963SBryan Wu 	int ret = 0;
5731a62963SBryan Wu 	u8 *_reg = (u8 *)&reg;
5831a62963SBryan Wu 	u8 *_data = (u8 *)data;
5931a62963SBryan Wu 
6031a62963SBryan Wu 	u8 tx[2] = {
6131a62963SBryan Wu 		_reg[1],
6231a62963SBryan Wu 		_reg[0]
6331a62963SBryan Wu 	};
6431a62963SBryan Wu 	u8 rx[2];
6531a62963SBryan Wu 
6631a62963SBryan Wu 	ret = i2c_master_send(client, tx, 2);
6731a62963SBryan Wu 	if (ret >= 0)
6831a62963SBryan Wu 		ret = i2c_master_recv(client, rx, 2);
6931a62963SBryan Wu 
7031a62963SBryan Wu 	if (unlikely(ret < 0)) {
7131a62963SBryan Wu 		dev_err(&client->dev, "I2C read error\n");
7231a62963SBryan Wu 	} else {
7331a62963SBryan Wu 		_data[0] = rx[1];
7431a62963SBryan Wu 		_data[1] = rx[0];
7531a62963SBryan Wu 	}
7631a62963SBryan Wu 
7731a62963SBryan Wu 	return ret;
7831a62963SBryan Wu }
7931a62963SBryan Wu 
8031a62963SBryan Wu static int __devinit ad714x_i2c_probe(struct i2c_client *client,
8131a62963SBryan Wu 					const struct i2c_device_id *id)
8231a62963SBryan Wu {
8331a62963SBryan Wu 	struct ad714x_chip *chip;
8431a62963SBryan Wu 
8531a62963SBryan Wu 	chip = ad714x_probe(&client->dev, BUS_I2C, client->irq,
8631a62963SBryan Wu 			    ad714x_i2c_read, ad714x_i2c_write);
8731a62963SBryan Wu 	if (IS_ERR(chip))
8831a62963SBryan Wu 		return PTR_ERR(chip);
8931a62963SBryan Wu 
9031a62963SBryan Wu 	i2c_set_clientdata(client, chip);
9131a62963SBryan Wu 
9231a62963SBryan Wu 	return 0;
9331a62963SBryan Wu }
9431a62963SBryan Wu 
9531a62963SBryan Wu static int __devexit ad714x_i2c_remove(struct i2c_client *client)
9631a62963SBryan Wu {
9731a62963SBryan Wu 	struct ad714x_chip *chip = i2c_get_clientdata(client);
9831a62963SBryan Wu 
9931a62963SBryan Wu 	ad714x_remove(chip);
10031a62963SBryan Wu 
10131a62963SBryan Wu 	return 0;
10231a62963SBryan Wu }
10331a62963SBryan Wu 
10431a62963SBryan Wu static const struct i2c_device_id ad714x_id[] = {
10531a62963SBryan Wu 	{ "ad7142_captouch", 0 },
1066c04d7b3SBarry Song 	{ "ad7143_captouch", 0 },
10731a62963SBryan Wu 	{ "ad7147_captouch", 0 },
1086c04d7b3SBarry Song 	{ "ad7147a_captouch", 0 },
1096c04d7b3SBarry Song 	{ "ad7148_captouch", 0 },
11031a62963SBryan Wu 	{ }
11131a62963SBryan Wu };
11231a62963SBryan Wu MODULE_DEVICE_TABLE(i2c, ad714x_id);
11331a62963SBryan Wu 
11431a62963SBryan Wu static struct i2c_driver ad714x_i2c_driver = {
11531a62963SBryan Wu 	.driver = {
11631a62963SBryan Wu 		.name = "ad714x_captouch",
117*6b7cfd19SMark Brown 		.pm   = &ad714x_i2c_pm,
11831a62963SBryan Wu 	},
11931a62963SBryan Wu 	.probe    = ad714x_i2c_probe,
12031a62963SBryan Wu 	.remove   = __devexit_p(ad714x_i2c_remove),
12131a62963SBryan Wu 	.id_table = ad714x_id,
12231a62963SBryan Wu };
12331a62963SBryan Wu 
12431a62963SBryan Wu static __init int ad714x_i2c_init(void)
12531a62963SBryan Wu {
12631a62963SBryan Wu 	return i2c_add_driver(&ad714x_i2c_driver);
12731a62963SBryan Wu }
12831a62963SBryan Wu module_init(ad714x_i2c_init);
12931a62963SBryan Wu 
13031a62963SBryan Wu static __exit void ad714x_i2c_exit(void)
13131a62963SBryan Wu {
13231a62963SBryan Wu 	i2c_del_driver(&ad714x_i2c_driver);
13331a62963SBryan Wu }
13431a62963SBryan Wu module_exit(ad714x_i2c_exit);
13531a62963SBryan Wu 
13631a62963SBryan Wu MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
13731a62963SBryan Wu MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
13831a62963SBryan Wu MODULE_LICENSE("GPL");
139