1 /* 2 * AD714X CapTouch Programmable Controller driver (I2C bus) 3 * 4 * Copyright 2009 Analog Devices Inc. 5 * 6 * Licensed under the GPL-2 or later. 7 */ 8 9 #include <linux/input.h> /* BUS_I2C */ 10 #include <linux/i2c.h> 11 #include <linux/module.h> 12 #include <linux/types.h> 13 #include "ad714x.h" 14 15 #ifdef CONFIG_PM 16 static int ad714x_i2c_suspend(struct i2c_client *client, pm_message_t message) 17 { 18 return ad714x_disable(i2c_get_clientdata(client)); 19 } 20 21 static int ad714x_i2c_resume(struct i2c_client *client) 22 { 23 return ad714x_enable(i2c_get_clientdata(client)); 24 } 25 #else 26 # define ad714x_i2c_suspend NULL 27 # define ad714x_i2c_resume NULL 28 #endif 29 30 static int ad714x_i2c_write(struct device *dev, unsigned short reg, 31 unsigned short data) 32 { 33 struct i2c_client *client = to_i2c_client(dev); 34 int ret = 0; 35 u8 *_reg = (u8 *)® 36 u8 *_data = (u8 *)&data; 37 38 u8 tx[4] = { 39 _reg[1], 40 _reg[0], 41 _data[1], 42 _data[0] 43 }; 44 45 ret = i2c_master_send(client, tx, 4); 46 if (ret < 0) 47 dev_err(&client->dev, "I2C write error\n"); 48 49 return ret; 50 } 51 52 static int ad714x_i2c_read(struct device *dev, unsigned short reg, 53 unsigned short *data) 54 { 55 struct i2c_client *client = to_i2c_client(dev); 56 int ret = 0; 57 u8 *_reg = (u8 *)® 58 u8 *_data = (u8 *)data; 59 60 u8 tx[2] = { 61 _reg[1], 62 _reg[0] 63 }; 64 u8 rx[2]; 65 66 ret = i2c_master_send(client, tx, 2); 67 if (ret >= 0) 68 ret = i2c_master_recv(client, rx, 2); 69 70 if (unlikely(ret < 0)) { 71 dev_err(&client->dev, "I2C read error\n"); 72 } else { 73 _data[0] = rx[1]; 74 _data[1] = rx[0]; 75 } 76 77 return ret; 78 } 79 80 static int __devinit ad714x_i2c_probe(struct i2c_client *client, 81 const struct i2c_device_id *id) 82 { 83 struct ad714x_chip *chip; 84 85 chip = ad714x_probe(&client->dev, BUS_I2C, client->irq, 86 ad714x_i2c_read, ad714x_i2c_write); 87 if (IS_ERR(chip)) 88 return PTR_ERR(chip); 89 90 i2c_set_clientdata(client, chip); 91 92 return 0; 93 } 94 95 static int __devexit ad714x_i2c_remove(struct i2c_client *client) 96 { 97 struct ad714x_chip *chip = i2c_get_clientdata(client); 98 99 ad714x_remove(chip); 100 101 return 0; 102 } 103 104 static const struct i2c_device_id ad714x_id[] = { 105 { "ad7142_captouch", 0 }, 106 { "ad7143_captouch", 0 }, 107 { "ad7147_captouch", 0 }, 108 { "ad7147a_captouch", 0 }, 109 { "ad7148_captouch", 0 }, 110 { } 111 }; 112 MODULE_DEVICE_TABLE(i2c, ad714x_id); 113 114 static struct i2c_driver ad714x_i2c_driver = { 115 .driver = { 116 .name = "ad714x_captouch", 117 }, 118 .probe = ad714x_i2c_probe, 119 .remove = __devexit_p(ad714x_i2c_remove), 120 .suspend = ad714x_i2c_suspend, 121 .resume = ad714x_i2c_resume, 122 .id_table = ad714x_id, 123 }; 124 125 static __init int ad714x_i2c_init(void) 126 { 127 return i2c_add_driver(&ad714x_i2c_driver); 128 } 129 module_init(ad714x_i2c_init); 130 131 static __exit void ad714x_i2c_exit(void) 132 { 133 i2c_del_driver(&ad714x_i2c_driver); 134 } 135 module_exit(ad714x_i2c_exit); 136 137 MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver"); 138 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 139 MODULE_LICENSE("GPL"); 140