i2c.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2021 YADRO
  5. *
  6. * Authors:
  7. * Nikita Shubin <n.shubin@yadro.com>
  8. */
  9. #ifndef __I2C_H__
  10. #define __I2C_H__
  11. #include <sbi/sbi_types.h>
  12. #include <sbi/sbi_list.h>
  13. /** Representation of a I2C adapter */
  14. struct i2c_adapter {
  15. /** Pointer to I2C driver owning this I2C adapter */
  16. void *driver;
  17. /** Unique ID of the I2C adapter assigned by the driver */
  18. int id;
  19. /**
  20. * Send buffer to given address, register
  21. *
  22. * @return 0 on success and negative error code on failure
  23. */
  24. int (*write)(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
  25. uint8_t *buffer, int len);
  26. /**
  27. * Read buffer from given address, register
  28. *
  29. * @return 0 on success and negative error code on failure
  30. */
  31. int (*read)(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
  32. uint8_t *buffer, int len);
  33. /** List */
  34. struct sbi_dlist node;
  35. };
  36. static inline struct i2c_adapter *to_i2c_adapter(struct sbi_dlist *node)
  37. {
  38. return container_of(node, struct i2c_adapter, node);
  39. }
  40. /** Find a registered I2C adapter */
  41. struct i2c_adapter *i2c_adapter_find(int id);
  42. /** Register I2C adapter */
  43. int i2c_adapter_add(struct i2c_adapter *ia);
  44. /** Un-register I2C adapter */
  45. void i2c_adapter_remove(struct i2c_adapter *ia);
  46. /** Send to device on I2C adapter bus */
  47. int i2c_adapter_write(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
  48. uint8_t *buffer, int len);
  49. /** Read from device on I2C adapter bus */
  50. int i2c_adapter_read(struct i2c_adapter *ia, uint8_t addr, uint8_t reg,
  51. uint8_t *buffer, int len);
  52. static inline int i2c_adapter_reg_write(struct i2c_adapter *ia, uint8_t addr,
  53. uint8_t reg, uint8_t val)
  54. {
  55. return i2c_adapter_write(ia, addr, reg, &val, 1);
  56. }
  57. static inline int i2c_adapter_reg_read(struct i2c_adapter *ia, uint8_t addr,
  58. uint8_t reg, uint8_t *val)
  59. {
  60. uint8_t buf;
  61. int ret = i2c_adapter_read(ia, addr, reg, &buf, 1);
  62. if (ret)
  63. return ret;
  64. *val = buf;
  65. return 0;
  66. }
  67. #endif