0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/input.h> /* BUS_I2C */
0009 #include <linux/i2c.h>
0010 #include <linux/module.h>
0011 #include <linux/types.h>
0012 #include <linux/pm.h>
0013 #include "ad714x.h"
0014
0015 static int __maybe_unused ad714x_i2c_suspend(struct device *dev)
0016 {
0017 return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev)));
0018 }
0019
0020 static int __maybe_unused ad714x_i2c_resume(struct device *dev)
0021 {
0022 return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev)));
0023 }
0024
0025 static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume);
0026
0027 static int ad714x_i2c_write(struct ad714x_chip *chip,
0028 unsigned short reg, unsigned short data)
0029 {
0030 struct i2c_client *client = to_i2c_client(chip->dev);
0031 int error;
0032
0033 chip->xfer_buf[0] = cpu_to_be16(reg);
0034 chip->xfer_buf[1] = cpu_to_be16(data);
0035
0036 error = i2c_master_send(client, (u8 *)chip->xfer_buf,
0037 2 * sizeof(*chip->xfer_buf));
0038 if (unlikely(error < 0)) {
0039 dev_err(&client->dev, "I2C write error: %d\n", error);
0040 return error;
0041 }
0042
0043 return 0;
0044 }
0045
0046 static int ad714x_i2c_read(struct ad714x_chip *chip,
0047 unsigned short reg, unsigned short *data, size_t len)
0048 {
0049 struct i2c_client *client = to_i2c_client(chip->dev);
0050 int i;
0051 int error;
0052
0053 chip->xfer_buf[0] = cpu_to_be16(reg);
0054
0055 error = i2c_master_send(client, (u8 *)chip->xfer_buf,
0056 sizeof(*chip->xfer_buf));
0057 if (error >= 0)
0058 error = i2c_master_recv(client, (u8 *)chip->xfer_buf,
0059 len * sizeof(*chip->xfer_buf));
0060
0061 if (unlikely(error < 0)) {
0062 dev_err(&client->dev, "I2C read error: %d\n", error);
0063 return error;
0064 }
0065
0066 for (i = 0; i < len; i++)
0067 data[i] = be16_to_cpu(chip->xfer_buf[i]);
0068
0069 return 0;
0070 }
0071
0072 static int ad714x_i2c_probe(struct i2c_client *client,
0073 const struct i2c_device_id *id)
0074 {
0075 struct ad714x_chip *chip;
0076
0077 chip = ad714x_probe(&client->dev, BUS_I2C, client->irq,
0078 ad714x_i2c_read, ad714x_i2c_write);
0079 if (IS_ERR(chip))
0080 return PTR_ERR(chip);
0081
0082 i2c_set_clientdata(client, chip);
0083
0084 return 0;
0085 }
0086
0087 static const struct i2c_device_id ad714x_id[] = {
0088 { "ad7142_captouch", 0 },
0089 { "ad7143_captouch", 0 },
0090 { "ad7147_captouch", 0 },
0091 { "ad7147a_captouch", 0 },
0092 { "ad7148_captouch", 0 },
0093 { }
0094 };
0095 MODULE_DEVICE_TABLE(i2c, ad714x_id);
0096
0097 static struct i2c_driver ad714x_i2c_driver = {
0098 .driver = {
0099 .name = "ad714x_captouch",
0100 .pm = &ad714x_i2c_pm,
0101 },
0102 .probe = ad714x_i2c_probe,
0103 .id_table = ad714x_id,
0104 };
0105
0106 module_i2c_driver(ad714x_i2c_driver);
0107
0108 MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver");
0109 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
0110 MODULE_LICENSE("GPL");