pmic_tps65910.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * (C) Copyright 2011-2013
  3. * Texas Instruments, <www.ti.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <i2c.h>
  9. #include <power/tps65910.h>
  10. /*
  11. * tps65910_set_i2c_control() - Set the TPS65910 to be controlled via the I2C
  12. * interface.
  13. * @return: 0 on success, not 0 on failure
  14. */
  15. int tps65910_set_i2c_control(void)
  16. {
  17. int ret;
  18. uchar buf;
  19. /* VDD1/2 voltage selection register access by control i/f */
  20. ret = i2c_read(TPS65910_CTRL_I2C_ADDR, TPS65910_DEVCTRL_REG, 1,
  21. &buf, 1);
  22. if (ret)
  23. return ret;
  24. buf |= TPS65910_DEVCTRL_REG_SR_CTL_I2C_SEL_CTL_I2C;
  25. return i2c_write(TPS65910_CTRL_I2C_ADDR, TPS65910_DEVCTRL_REG, 1,
  26. &buf, 1);
  27. }
  28. /*
  29. * tps65910_voltage_update() - Voltage switching for MPU frequency switching.
  30. * @module: mpu - 0, core - 1
  31. * @vddx_op_vol_sel: vdd voltage to set
  32. * @return: 0 on success, not 0 on failure
  33. */
  34. int tps65910_voltage_update(unsigned int module, unsigned char vddx_op_vol_sel)
  35. {
  36. uchar buf;
  37. unsigned int reg_offset;
  38. int ret;
  39. if (module == MPU)
  40. reg_offset = TPS65910_VDD1_OP_REG;
  41. else
  42. reg_offset = TPS65910_VDD2_OP_REG;
  43. /* Select VDDx OP */
  44. ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
  45. if (ret)
  46. return ret;
  47. buf &= ~TPS65910_OP_REG_CMD_MASK;
  48. ret = i2c_write(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
  49. if (ret)
  50. return ret;
  51. /* Configure VDDx OP Voltage */
  52. ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
  53. if (ret)
  54. return ret;
  55. buf &= ~TPS65910_OP_REG_SEL_MASK;
  56. buf |= vddx_op_vol_sel;
  57. ret = i2c_write(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
  58. if (ret)
  59. return ret;
  60. ret = i2c_read(TPS65910_CTRL_I2C_ADDR, reg_offset, 1, &buf, 1);
  61. if (ret)
  62. return ret;
  63. if ((buf & TPS65910_OP_REG_SEL_MASK) != vddx_op_vol_sel)
  64. return 1;
  65. return 0;
  66. }