Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * AD714X CapTouch Programmable Controller driver (I2C bus)
0004  *
0005  * Copyright 2009-2011 Analog Devices Inc.
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");