mt6315-spmi.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include <platform/errno.h>
  2. #include <platform/mt6315-spmi.h>
  3. #include <platform/mt6315_upmu_hw.h>
  4. #include <platform/spmi.h>
  5. #include <platform/spmi_sw.h>
  6. #include <stdint.h>
  7. /* Enable dump all register */
  8. #define MT6315_DEBUG 0
  9. #define DECL_CHIP(_pidx, _mid, _type, _saddr)\
  10. { \
  11. .power_idx = _pidx, \
  12. .master_idx = _mid, \
  13. .slave_addr = _saddr, \
  14. .type = _type, \
  15. .spmi_dev = NULL, \
  16. }
  17. static struct mt6315_chip mt6315_chip[MT6315_MAX] = {
  18. DECL_CHIP(MT6315_S6, SPMI_MASTER_0, MT6315_TYPE_A, SPMI_SLAVE_6),
  19. DECL_CHIP(MT6315_S7, SPMI_MASTER_0, MT6315_TYPE_B, SPMI_SLAVE_7),
  20. DECL_CHIP(MT6315_S3, SPMI_MASTER_0, MT6315_TYPE_C, SPMI_SLAVE_3),
  21. };
  22. #if MT6315_DEBUG
  23. static void mt6315_dump_register(int pidx)
  24. {
  25. int addr = 0;
  26. uint8_t val = 0;
  27. struct mt6315_chip *chip;
  28. if (pidx >= MT6315_MAX)
  29. return;
  30. chip = &mt6315_chip[pidx];
  31. if (!chip->spmi_dev)
  32. return;
  33. for (addr = 0; addr <= MT6315_BUCK_TOP_4PHASE_ELR_29; addr++) {
  34. spmi_ext_register_readl(chip->spmi_dev, addr, &val, 1);
  35. MT6315_INFO("[0x%x]=0x%x ", addr, val);
  36. }
  37. }
  38. #endif
  39. struct mt6315_chip *mt6315_find_chip(int pidx)
  40. {
  41. int i;
  42. for (i = 0; i < MT6315_MAX; i++) {
  43. if (mt6315_chip[i].power_idx == pidx)
  44. return &mt6315_chip[i];
  45. }
  46. return NULL;
  47. }
  48. #if !SPMI_NO_PMIC
  49. static int mt6315_check_cid(void)
  50. {
  51. int pidx = 0, ret = 0;
  52. struct mt6315_chip *chip;
  53. struct spmi_device *dev;
  54. uint8_t val = 0;
  55. for (pidx = 0; pidx < MT6315_MAX; pidx++) {
  56. chip = &mt6315_chip[pidx];
  57. dev = get_spmi_device(chip->master_idx,
  58. mt6315_chip[pidx].slave_addr);
  59. if (!dev) {
  60. MT6315_ERR("%s fail(%d).\n", __func__, pidx);
  61. return -ENODEV;
  62. }
  63. chip->spmi_dev = dev;
  64. ret = spmi_ext_register_readl_field(dev,
  65. MT6315_PMIC_SWCID_H_ADDR,
  66. &val, 1,
  67. MT6315_PMIC_SWCID_H_MASK,
  68. MT6315_PMIC_SWCID_H_SHIFT);
  69. if (ret != 0 ||
  70. val != MT6315_SWCID_H_CODE) {
  71. MT6315_ERR("%s ret=%d val=%d\n", __func__, ret, val);
  72. return -EIO;
  73. }
  74. }
  75. return 0;
  76. }
  77. #else
  78. static int mt6315_check_cid(void)
  79. {
  80. return -ENODEV;
  81. }
  82. #endif
  83. void mt6315_all_seq_off(unsigned char en_seq_off)
  84. {
  85. int pidx = 0;
  86. struct mt6315_chip *chip;
  87. for (pidx = 0; pidx < MT6315_MAX; pidx++) {
  88. chip = &mt6315_chip[pidx];
  89. if (!chip->spmi_dev)
  90. return;
  91. mt6315_write_field_byte(chip->spmi_dev,
  92. MT6315_PMIC_TMA_KEY_H_ADDR, 0x9C,
  93. MT6315_PMIC_TMA_KEY_H_MASK,
  94. MT6315_PMIC_TMA_KEY_H_SHIFT);
  95. mt6315_write_field_byte(chip->spmi_dev,
  96. MT6315_PMIC_TMA_KEY_ADDR, 0xEA,
  97. MT6315_PMIC_TMA_KEY_MASK,
  98. MT6315_PMIC_TMA_KEY_SHIFT);
  99. mt6315_write_field_byte(chip->spmi_dev,
  100. MT6315_PMIC_RG_TOP2_RSV2_ADDR,
  101. en_seq_off, 0x1, 0);
  102. mt6315_write_field_byte(chip->spmi_dev,
  103. MT6315_PMIC_TMA_KEY_ADDR, 0,
  104. MT6315_PMIC_TMA_KEY_MASK,
  105. MT6315_PMIC_TMA_KEY_SHIFT);
  106. mt6315_write_field_byte(chip->spmi_dev,
  107. MT6315_PMIC_TMA_KEY_H_ADDR, 0,
  108. MT6315_PMIC_TMA_KEY_H_MASK,
  109. MT6315_PMIC_TMA_KEY_H_SHIFT);
  110. MT6315_INFO("S%d set seq off=%d\n"
  111. , chip->slave_addr, en_seq_off);
  112. }
  113. return;
  114. }
  115. int mt6315_write_field_byte(struct spmi_device *dev, unsigned int addr,
  116. unsigned char val, unsigned short mask, unsigned short shift) {
  117. #if !SPMI_NO_PMIC
  118. return spmi_ext_register_writel_field(dev, addr, &val, 1, mask, shift);
  119. #else
  120. return -ENODEV;
  121. #endif
  122. }
  123. int mt6315_spmi_probe(void)
  124. {
  125. int ret = 0;
  126. ret = mt6315_check_cid();
  127. if (ret < 0)
  128. return ret;
  129. MT6315_INFO("%s done\n", __func__);
  130. return 0;
  131. }