ad7879-i2c.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*
  2. * AD7879-1/AD7889-1 touchscreen (I2C bus)
  3. *
  4. * Copyright (C) 2008-2010 Michael Hennerich, 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 "ad7879.h"
  13. #define AD7879_DEVID 0x79 /* AD7879-1/AD7889-1 */
  14. #ifdef CONFIG_PM
  15. static int ad7879_i2c_suspend(struct i2c_client *client, pm_message_t message)
  16. {
  17. struct ad7879 *ts = i2c_get_clientdata(client);
  18. ad7879_suspend(ts);
  19. return 0;
  20. }
  21. static int ad7879_i2c_resume(struct i2c_client *client)
  22. {
  23. struct ad7879 *ts = i2c_get_clientdata(client);
  24. ad7879_resume(ts);
  25. return 0;
  26. }
  27. #else
  28. # define ad7879_i2c_suspend NULL
  29. # define ad7879_i2c_resume NULL
  30. #endif
  31. /* All registers are word-sized.
  32. * AD7879 uses a high-byte first convention.
  33. */
  34. static int ad7879_i2c_read(struct device *dev, u8 reg)
  35. {
  36. struct i2c_client *client = to_i2c_client(dev);
  37. return swab16(i2c_smbus_read_word_data(client, reg));
  38. }
  39. static int ad7879_i2c_multi_read(struct device *dev,
  40. u8 first_reg, u8 count, u16 *buf)
  41. {
  42. struct i2c_client *client = to_i2c_client(dev);
  43. u8 idx;
  44. i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf);
  45. for (idx = 0; idx < count; ++idx)
  46. buf[idx] = swab16(buf[idx]);
  47. return 0;
  48. }
  49. static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val)
  50. {
  51. struct i2c_client *client = to_i2c_client(dev);
  52. return i2c_smbus_write_word_data(client, reg, swab16(val));
  53. }
  54. static const struct ad7879_bus_ops ad7879_i2c_bus_ops = {
  55. .bustype = BUS_I2C,
  56. .read = ad7879_i2c_read,
  57. .multi_read = ad7879_i2c_multi_read,
  58. .write = ad7879_i2c_write,
  59. };
  60. static int __devinit ad7879_i2c_probe(struct i2c_client *client,
  61. const struct i2c_device_id *id)
  62. {
  63. struct ad7879 *ts;
  64. if (!i2c_check_functionality(client->adapter,
  65. I2C_FUNC_SMBUS_WORD_DATA)) {
  66. dev_err(&client->dev, "SMBUS Word Data not Supported\n");
  67. return -EIO;
  68. }
  69. ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq,
  70. &ad7879_i2c_bus_ops);
  71. if (IS_ERR(ts))
  72. return PTR_ERR(ts);
  73. i2c_set_clientdata(client, ts);
  74. return 0;
  75. }
  76. static int __devexit ad7879_i2c_remove(struct i2c_client *client)
  77. {
  78. struct ad7879 *ts = i2c_get_clientdata(client);
  79. ad7879_remove(ts);
  80. return 0;
  81. }
  82. static const struct i2c_device_id ad7879_id[] = {
  83. { "ad7879", 0 },
  84. { "ad7889", 0 },
  85. { }
  86. };
  87. MODULE_DEVICE_TABLE(i2c, ad7879_id);
  88. static struct i2c_driver ad7879_i2c_driver = {
  89. .driver = {
  90. .name = "ad7879",
  91. .owner = THIS_MODULE,
  92. },
  93. .probe = ad7879_i2c_probe,
  94. .remove = __devexit_p(ad7879_i2c_remove),
  95. .suspend = ad7879_i2c_suspend,
  96. .resume = ad7879_i2c_resume,
  97. .id_table = ad7879_id,
  98. };
  99. static int __init ad7879_i2c_init(void)
  100. {
  101. return i2c_add_driver(&ad7879_i2c_driver);
  102. }
  103. module_init(ad7879_i2c_init);
  104. static void __exit ad7879_i2c_exit(void)
  105. {
  106. i2c_del_driver(&ad7879_i2c_driver);
  107. }
  108. module_exit(ad7879_i2c_exit);
  109. MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
  110. MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver");
  111. MODULE_LICENSE("GPL");
  112. MODULE_ALIAS("i2c:ad7879");