axp_twi.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (C) 2020 allwinnertech Ltd.
  3. */
  4. #include <log.h>
  5. #include <sunxi_hal_regulator.h>
  6. #include <sunxi_hal_regulator_private.h>
  7. #include <sunxi_hal_twi.h>
  8. int hal_axp_twi_init(struct regulator_dev *rdev)
  9. {
  10. unsigned char port = TWI_PORT(rdev->flag);
  11. unsigned short addr = AXP_ADDR(rdev->flag);
  12. hal_twi_init(port);
  13. hal_twi_control(port, I2C_SLAVE, &addr);
  14. return 0;
  15. }
  16. int hal_axp_byte_read(struct regulator_dev *rdev, u8 reg, u8 *reg_val)
  17. {
  18. unsigned char port = TWI_PORT(rdev->flag);
  19. int ret;
  20. ret = hal_twi_read(port, reg, reg_val, 1);
  21. if (ret > 0)
  22. return 0;
  23. return ret;
  24. }
  25. int hal_axp_byte_write(struct regulator_dev *rdev, u8 reg, u8 reg_val)
  26. {
  27. /* hal_twi_write bug workaround */
  28. unsigned char port = TWI_PORT(rdev->flag);
  29. twi_msg_t msg;
  30. uint8_t buf[2];
  31. buf[0] = reg;
  32. buf[1] = reg_val;
  33. msg.flags = 0;
  34. msg.addr = AXP_ADDR(rdev->flag);
  35. msg.len = 2;
  36. msg.buf = buf;
  37. return hal_twi_control(port, I2C_RDWR, &msg);
  38. }
  39. int hal_axp_byte_update(struct regulator_dev *rdev, u8 reg, u8 val, u8 mask)
  40. {
  41. u8 reg_val = 0;
  42. int ret = 0;
  43. ret = hal_axp_byte_read(rdev, reg, &reg_val);
  44. if (ret)
  45. goto out;
  46. if ((reg_val & mask) != val) {
  47. reg_val = (reg_val & ~mask) | (val & mask);
  48. ret = hal_axp_byte_write(rdev, reg, reg_val);
  49. }
  50. out:
  51. return ret;
  52. }