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 <linux/pm.h> 14 #include "ad714x.h" 15 16 #ifdef CONFIG_PM 17 static int ad714x_i2c_suspend(struct device *dev) 18 { 19 return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev))); 20 } 21 22 static int ad714x_i2c_resume(struct device *dev) 23 { 24 return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev))); 25 } 26 #endif 27 28 static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume); 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 .pm = &ad714x_i2c_pm, 118 }, 119 .probe = ad714x_i2c_probe, 120 .remove = __devexit_p(ad714x_i2c_remove), 121 .id_table = ad714x_id, 122 }; 123 124 static __init int ad714x_i2c_init(void) 125 { 126 return i2c_add_driver(&ad714x_i2c_driver); 127 } 128 module_init(ad714x_i2c_init); 129 130 static __exit void ad714x_i2c_exit(void) 131 { 132 i2c_del_driver(&ad714x_i2c_driver); 133 } 134 module_exit(ad714x_i2c_exit); 135 136 MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver"); 137 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 138 MODULE_LICENSE("GPL"); 139