i2c-uclass-compat.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) 2014 Google, Inc
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <errno.h>
  9. #include <i2c.h>
  10. static int cur_busnum;
  11. static int i2c_compat_get_device(uint chip_addr, int alen,
  12. struct udevice **devp)
  13. {
  14. struct dm_i2c_chip *chip;
  15. int ret;
  16. ret = i2c_get_chip_for_busnum(cur_busnum, chip_addr, alen, devp);
  17. if (ret)
  18. return ret;
  19. chip = dev_get_parent_platdata(*devp);
  20. if (chip->offset_len != alen) {
  21. printf("Requested alen %d does not match chip offset_len %d\n",
  22. alen, chip->offset_len);
  23. return -EADDRNOTAVAIL;
  24. }
  25. return 0;
  26. }
  27. int i2c_probe(uint8_t chip_addr)
  28. {
  29. struct udevice *bus, *dev;
  30. int ret;
  31. ret = uclass_get_device_by_seq(UCLASS_I2C, cur_busnum, &bus);
  32. if (ret) {
  33. debug("Cannot find I2C bus %d: err=%d\n", cur_busnum, ret);
  34. return ret;
  35. }
  36. if (!bus)
  37. return -ENOENT;
  38. return dm_i2c_probe(bus, chip_addr, 0, &dev);
  39. }
  40. int i2c_read(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
  41. int len)
  42. {
  43. struct udevice *dev;
  44. int ret;
  45. ret = i2c_compat_get_device(chip_addr, alen, &dev);
  46. if (ret)
  47. return ret;
  48. return dm_i2c_read(dev, addr, buffer, len);
  49. }
  50. int i2c_write(uint8_t chip_addr, unsigned int addr, int alen, uint8_t *buffer,
  51. int len)
  52. {
  53. struct udevice *dev;
  54. int ret;
  55. ret = i2c_compat_get_device(chip_addr, alen, &dev);
  56. if (ret)
  57. return ret;
  58. return dm_i2c_write(dev, addr, buffer, len);
  59. }
  60. int i2c_get_bus_num_fdt(int node)
  61. {
  62. struct udevice *bus;
  63. int ret;
  64. ret = uclass_get_device_by_of_offset(UCLASS_I2C, node, &bus);
  65. if (ret)
  66. return ret;
  67. return bus->seq;
  68. }
  69. unsigned int i2c_get_bus_num(void)
  70. {
  71. return cur_busnum;
  72. }
  73. int i2c_set_bus_num(unsigned int bus)
  74. {
  75. cur_busnum = bus;
  76. return 0;
  77. }