mt6315-spmi.c 3.2 KB

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