ad714x-i2c.c 2.8 KB

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