lm3533-ctrlbank.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * lm3533-ctrlbank.c -- LM3533 Generic Control Bank interface
  3. *
  4. * Copyright (C) 2011-2012 Texas Instruments
  5. *
  6. * Author: Johan Hovold <jhovold@gmail.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. */
  13. #include <linux/device.h>
  14. #include <linux/module.h>
  15. #include <linux/mfd/lm3533.h>
  16. #define LM3533_BRIGHTNESS_MAX 255
  17. #define LM3533_MAX_CURRENT_MAX 31
  18. #define LM3533_PWM_MAX 0x3f
  19. #define LM3533_REG_PWM_BASE 0x14
  20. #define LM3533_REG_MAX_CURRENT_BASE 0x1f
  21. #define LM3533_REG_CTRLBANK_ENABLE 0x27
  22. #define LM3533_REG_BRIGHTNESS_BASE 0x40
  23. static inline u8 lm3533_ctrlbank_get_reg(struct lm3533_ctrlbank *cb, u8 base)
  24. {
  25. return base + cb->id;
  26. }
  27. int lm3533_ctrlbank_enable(struct lm3533_ctrlbank *cb)
  28. {
  29. u8 mask;
  30. int ret;
  31. dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);
  32. mask = 1 << cb->id;
  33. ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE,
  34. mask, mask);
  35. if (ret)
  36. dev_err(cb->dev, "failed to enable ctrlbank %d\n", cb->id);
  37. return ret;
  38. }
  39. EXPORT_SYMBOL_GPL(lm3533_ctrlbank_enable);
  40. int lm3533_ctrlbank_disable(struct lm3533_ctrlbank *cb)
  41. {
  42. u8 mask;
  43. int ret;
  44. dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);
  45. mask = 1 << cb->id;
  46. ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE, 0, mask);
  47. if (ret)
  48. dev_err(cb->dev, "failed to disable ctrlbank %d\n", cb->id);
  49. return ret;
  50. }
  51. EXPORT_SYMBOL_GPL(lm3533_ctrlbank_disable);
  52. #define lm3533_ctrlbank_set(_name, _NAME) \
  53. int lm3533_ctrlbank_set_##_name(struct lm3533_ctrlbank *cb, u8 val) \
  54. { \
  55. u8 reg; \
  56. int ret; \
  57. \
  58. if (val > LM3533_##_NAME##_MAX) \
  59. return -EINVAL; \
  60. \
  61. reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_##_NAME##_BASE); \
  62. ret = lm3533_write(cb->lm3533, reg, val); \
  63. if (ret) \
  64. dev_err(cb->dev, "failed to set " #_name "\n"); \
  65. \
  66. return ret; \
  67. } \
  68. EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_##_name);
  69. #define lm3533_ctrlbank_get(_name, _NAME) \
  70. int lm3533_ctrlbank_get_##_name(struct lm3533_ctrlbank *cb, u8 *val) \
  71. { \
  72. u8 reg; \
  73. int ret; \
  74. \
  75. reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_##_NAME##_BASE); \
  76. ret = lm3533_read(cb->lm3533, reg, val); \
  77. if (ret) \
  78. dev_err(cb->dev, "failed to get " #_name "\n"); \
  79. \
  80. return ret; \
  81. } \
  82. EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_##_name);
  83. lm3533_ctrlbank_set(brightness, BRIGHTNESS);
  84. lm3533_ctrlbank_get(brightness, BRIGHTNESS);
  85. /*
  86. * Full scale current.
  87. *
  88. * Imax = 5 + val * 0.8 mA, e.g.:
  89. *
  90. * 0 - 5 mA
  91. * ...
  92. * 19 - 20.2 mA (default)
  93. * ...
  94. * 31 - 29.8 mA
  95. */
  96. lm3533_ctrlbank_set(max_current, MAX_CURRENT);
  97. lm3533_ctrlbank_get(max_current, MAX_CURRENT);
  98. /*
  99. * PWM-input control mask:
  100. *
  101. * bit 5 - PWM-input enabled in Zone 4
  102. * bit 4 - PWM-input enabled in Zone 3
  103. * bit 3 - PWM-input enabled in Zone 2
  104. * bit 2 - PWM-input enabled in Zone 1
  105. * bit 1 - PWM-input enabled in Zone 0
  106. * bit 0 - PWM-input enabled
  107. */
  108. lm3533_ctrlbank_set(pwm, PWM);
  109. lm3533_ctrlbank_get(pwm, PWM);
  110. MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
  111. MODULE_DESCRIPTION("LM3533 Control Bank interface");
  112. MODULE_LICENSE("GPL");