mhl_i2c_utils.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /* Copyright (c) 2012, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <linux/i2c.h>
  14. #include <linux/mhl_8334.h>
  15. #include "mhl_i2c_utils.h"
  16. uint8_t slave_addrs[MAX_PAGES] = {
  17. DEV_PAGE_TPI_0 ,
  18. DEV_PAGE_TX_L0_0 ,
  19. DEV_PAGE_TX_L1_0 ,
  20. DEV_PAGE_TX_2_0 ,
  21. DEV_PAGE_TX_3_0 ,
  22. DEV_PAGE_CBUS ,
  23. DEV_PAGE_DDC_EDID ,
  24. DEV_PAGE_DDC_SEGM ,
  25. };
  26. int mhl_i2c_reg_read(uint8_t slave_addr_index, uint8_t reg_offset)
  27. {
  28. struct i2c_msg msgs[2];
  29. uint8_t buffer = 0;
  30. int ret = -1;
  31. pr_debug("MRR: Reading from slave_addr_index=[%x] and offset=[%x]\n",
  32. slave_addr_index, reg_offset);
  33. pr_debug("MRR: Addr slave_addr_index=[%x]\n",
  34. slave_addrs[slave_addr_index]);
  35. /* Slave addr */
  36. msgs[0].addr = slave_addrs[slave_addr_index] >> 1;
  37. msgs[1].addr = slave_addrs[slave_addr_index] >> 1;
  38. /* Write Command */
  39. msgs[0].flags = 0;
  40. msgs[1].flags = I2C_M_RD;
  41. /* Register offset for the next transaction */
  42. msgs[0].buf = &reg_offset;
  43. msgs[1].buf = &buffer;
  44. /* Offset is 1 Byte long */
  45. msgs[0].len = 1;
  46. msgs[1].len = 1;
  47. ret = i2c_transfer(mhl_msm_state->i2c_client->adapter, msgs, 2);
  48. if (ret < 1) {
  49. pr_err("I2C READ FAILED=[%d]\n", ret);
  50. return -EACCES;
  51. }
  52. pr_debug("Buffer is [%x]\n", buffer);
  53. return buffer;
  54. }
  55. int mhl_i2c_reg_write(uint8_t slave_addr_index, uint8_t reg_offset,
  56. uint8_t value)
  57. {
  58. return mhl_i2c_reg_write_cmds(slave_addr_index, reg_offset, &value, 1);
  59. }
  60. int mhl_i2c_reg_write_cmds(uint8_t slave_addr_index, uint8_t reg_offset,
  61. uint8_t *value, uint16_t count)
  62. {
  63. struct i2c_msg msgs[1];
  64. uint8_t data[2];
  65. int status = -EACCES;
  66. msgs[0].addr = slave_addrs[slave_addr_index] >> 1;
  67. msgs[0].flags = 0;
  68. msgs[0].len = 2;
  69. msgs[0].buf = data;
  70. data[0] = reg_offset;
  71. data[1] = *value;
  72. status = i2c_transfer(mhl_msm_state->i2c_client->adapter, msgs, 1);
  73. if (status < 1) {
  74. pr_err("I2C WRITE FAILED=[%d]\n", status);
  75. return -EACCES;
  76. }
  77. return status;
  78. }
  79. void mhl_i2c_reg_modify(uint8_t slave_addr_index, uint8_t reg_offset,
  80. uint8_t mask, uint8_t val)
  81. {
  82. uint8_t temp;
  83. temp = mhl_i2c_reg_read(slave_addr_index, reg_offset);
  84. temp &= (~mask);
  85. temp |= (mask & val);
  86. mhl_i2c_reg_write(slave_addr_index, reg_offset, temp);
  87. }