maxim_codec.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * maxim_codec.c -- MAXIM CODEC Common driver
  4. *
  5. * Copyright 2011 Maxim Integrated Products
  6. */
  7. #include <common.h>
  8. #include <div64.h>
  9. #include <i2c.h>
  10. #include <i2s.h>
  11. #include <log.h>
  12. #include <sound.h>
  13. #include <asm/gpio.h>
  14. #include <asm/io.h>
  15. #include "maxim_codec.h"
  16. /*
  17. * Writes value to a device register through i2c
  18. *
  19. * @param priv Private data for driver
  20. * @param reg reg number to be write
  21. * @param data data to be writen to the above registor
  22. *
  23. * @return int value 1 for change, 0 for no change or negative error code.
  24. */
  25. int maxim_i2c_write(struct maxim_priv *priv, unsigned int reg,
  26. unsigned char data)
  27. {
  28. debug("%s: Write Addr : 0x%02X, Data : 0x%02X\n",
  29. __func__, reg, data);
  30. return dm_i2c_write(priv->dev, reg, &data, 1);
  31. }
  32. /*
  33. * Read a value from a device register through i2c
  34. *
  35. * @param priv Private data for driver
  36. * @param reg reg number to be read
  37. * @param data address of read data to be stored
  38. *
  39. * @return int value 0 for success, -1 in case of error.
  40. */
  41. unsigned int maxim_i2c_read(struct maxim_priv *priv, unsigned int reg,
  42. unsigned char *data)
  43. {
  44. int ret;
  45. return dm_i2c_read(priv->dev, reg, data, 1);
  46. if (ret != 0) {
  47. debug("%s: Error while reading register %#04x\n",
  48. __func__, reg);
  49. return -1;
  50. }
  51. return 0;
  52. }
  53. /*
  54. * update device register bits through i2c
  55. *
  56. * @param priv Private data for driver
  57. * @param reg codec register
  58. * @param mask register mask
  59. * @param value new value
  60. *
  61. * @return int value 0 for success, non-zero error code.
  62. */
  63. int maxim_bic_or(struct maxim_priv *priv, unsigned int reg, unsigned char mask,
  64. unsigned char value)
  65. {
  66. int change, ret = 0;
  67. unsigned char old, new;
  68. if (maxim_i2c_read(priv, reg, &old) != 0)
  69. return -1;
  70. new = (old & ~mask) | (value & mask);
  71. change = (old != new) ? 1 : 0;
  72. if (change)
  73. ret = maxim_i2c_write(priv, reg, new);
  74. if (ret < 0)
  75. return ret;
  76. return change;
  77. }