aw36413_driver.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #include <linux/module.h>
  2. #include <linux/uaccess.h>
  3. #include "flash_led_driver.h"
  4. #include "flash_led_ioctl.h"
  5. #include "aw36413_driver.h"
  6. /* flashlight enable function */
  7. static volatile uint32_t aw_reg1_val = 0x0;
  8. static int aw36413_enable(void *ctx, int channel)
  9. {
  10. int ret;
  11. struct flash_led_dev *dev = ctx;
  12. unsigned char reg = 0;
  13. uint32_t mask = 0;
  14. if (channel == 1) {
  15. mask = AW36413_ENABLE_LED1;
  16. } else if (channel == 2) {
  17. mask = AW36413_ENABLE_LED2;
  18. } else if (channel == 3) {
  19. mask = AW36413_ENABLE_LED1 | AW36413_ENABLE_LED2;
  20. }
  21. aw_reg1_val |= mask;
  22. reg = AW36413_REG_ENABLE;
  23. return flash_led_i2c_write(dev, reg, aw_reg1_val);
  24. }
  25. /* flashlight disable function */
  26. static int aw36413_disable(void *ctx, int channel)
  27. {
  28. int ret;
  29. struct flash_led_dev *dev = ctx;
  30. unsigned char reg = 0;
  31. uint32_t mask = 0;
  32. if (channel == 1) {
  33. mask = AW36413_ENABLE_LED1;
  34. } else if (channel == 2) {
  35. mask = AW36413_ENABLE_LED2;
  36. } else if (channel == 3) {
  37. mask = AW36413_ENABLE_LED1 | AW36413_ENABLE_LED2;
  38. }
  39. aw_reg1_val &= ~mask;
  40. reg = AW36413_REG_ENABLE;
  41. return flash_led_i2c_write(dev, reg, aw_reg1_val);
  42. }
  43. /* set flashlight level */
  44. static int aw36413_set_ch1_flash_brightness(void *ctx, int level)
  45. {
  46. int ret;
  47. uint32_t val = 0;
  48. unsigned char reg = 0;
  49. struct flash_led_dev *dev = ctx;
  50. /* set flash brightness level */
  51. reg = AW36413_REG_FLASH_LEVEL_LED1;
  52. val = level & 0xff;
  53. ret = flash_led_i2c_write(dev, reg, val);
  54. return ret;
  55. }
  56. static int aw36413_set_ch1_torch_brightness(void *ctx, int level)
  57. {
  58. int ret;
  59. uint32_t val = 0;
  60. unsigned char reg = 0;
  61. struct flash_led_dev *dev = ctx;
  62. /* set torch brightness level */
  63. reg = AW36413_REG_TORCH_LEVEL_LED1;
  64. val = level & 0xff;
  65. ret = flash_led_i2c_write(dev, reg, val);
  66. return ret;
  67. }
  68. static int aw36413_set_ch2_flash_brightness(void *ctx, int level)
  69. {
  70. int ret;
  71. uint32_t val = 0;
  72. unsigned char reg = 0;
  73. struct flash_led_dev *dev = ctx;
  74. reg = AW36413_REG_FLASH_LEVEL_LED2;
  75. val = level & 0xff;
  76. ret = flash_led_i2c_write(dev, reg, val);
  77. return ret;
  78. }
  79. static int aw36413_set_ch2_torch_brightness(void *ctx, int level)
  80. {
  81. int ret;
  82. uint32_t val = 0;
  83. unsigned char reg = 0;
  84. struct flash_led_dev *dev = ctx;
  85. reg = AW36413_REG_TORCH_LEVEL_LED2;
  86. val = level & 0xff;
  87. ret = flash_led_i2c_write(dev, reg, val);
  88. return ret;
  89. }
  90. static int aw36413_set_flash_brightness(void *ctx, int channel, uint32_t level)
  91. {
  92. int ret = 0;
  93. struct flash_led_dev *dev = ctx;
  94. if (channel == 1) {
  95. ret = aw36413_set_ch1_flash_brightness(dev, level);
  96. } else if (channel == 2) {
  97. ret = aw36413_set_ch2_flash_brightness(dev, level);
  98. } else if (channel == 3) {
  99. ret = aw36413_set_ch1_flash_brightness(dev, level);
  100. if (ret != 0) {
  101. return -1;
  102. }
  103. ret = aw36413_set_ch2_flash_brightness(dev, level);
  104. } else {
  105. return -1;
  106. }
  107. return ret;
  108. }
  109. static int aw36413_set_torch_brightness(void *ctx, int channel, uint32_t level)
  110. {
  111. int ret = 0;
  112. struct flash_led_dev *dev = ctx;
  113. if (channel == 1) {
  114. ret = aw36413_set_ch1_torch_brightness(dev, level);
  115. } else if (channel == 2) {
  116. ret = aw36413_set_ch2_torch_brightness(dev, level);
  117. } else if (channel == 3) {
  118. ret = aw36413_set_ch1_torch_brightness(dev, level);
  119. if (ret != 0) {
  120. return -1;
  121. }
  122. ret = aw36413_set_ch2_torch_brightness(dev, level);
  123. } else {
  124. return -1;
  125. }
  126. return ret;
  127. }
  128. #define AW36413_STANDBY_MODE 0x0
  129. #define AW36413_EXT_TORCH_MODE (0x1 << 4)
  130. #define AW36413_EXT_FLASH_MODE (0x1 << 5)
  131. #define AW36413_INT_TORCH_MODE (0x2 << 2)
  132. #define AW36413_INT_FLASH_MODE (0x3 << 2)
  133. #define AW36413_IR_STANDBY_MODE (0x1 << 2)
  134. #define AW36413_IR_ENABLE_MODE ((0x1 << 2) | (1 << 5))
  135. static int aw36413_set_mode(void *ctx, flash_led_mode_t mode)
  136. {
  137. int ret = 0;
  138. unsigned char reg = 0;
  139. struct flash_led_dev *dev = ctx;
  140. reg = AW36413_REG_ENABLE;
  141. aw_reg1_val &= 0x3;
  142. switch(mode) {
  143. case FLASH_LED_STANDBY:
  144. aw_reg1_val |= AW36413_STANDBY_MODE;
  145. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  146. break;
  147. case FLASH_LED_EXT_TORCH:
  148. aw_reg1_val |= AW36413_EXT_TORCH_MODE;
  149. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  150. break;
  151. case FLASH_LED_EXT_FLASH:
  152. aw_reg1_val |= AW36413_EXT_FLASH_MODE;
  153. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  154. break;
  155. case FLASH_LED_INT_TORCH:
  156. aw_reg1_val |= AW36413_INT_TORCH_MODE;
  157. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  158. break;
  159. case FLASH_LED_INT_FLASH:
  160. aw_reg1_val |= AW36413_INT_FLASH_MODE;
  161. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  162. break;
  163. case FLASH_LED_IR_STANDBY:
  164. aw_reg1_val |= AW36413_IR_STANDBY_MODE;
  165. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  166. break;
  167. case FLASH_LED_IR_ENABLE:
  168. aw_reg1_val |= AW36413_IR_ENABLE_MODE;
  169. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  170. break;
  171. default:
  172. return -1;
  173. }
  174. return ret;
  175. }
  176. /* flashlight init */
  177. static int aw36413_init(void *ctx);
  178. /* flashlight uninit */
  179. static int aw36413_uninit(void *ctx)
  180. {
  181. struct flash_led_dev *dev = ctx;
  182. aw36413_disable(dev, 3);
  183. return 0;
  184. }
  185. struct flash_led_function_s aw36413_function =
  186. {
  187. .flash_led_name = "aw36413",
  188. .reserve_id = 0x36,
  189. .init = aw36413_init,
  190. .uninit = aw36413_uninit,
  191. .enable_channel = aw36413_enable,
  192. .disable_channel = aw36413_disable,
  193. .set_mode = aw36413_set_mode,
  194. .set_flash_brightness = aw36413_set_flash_brightness,
  195. .set_torch_brightness = aw36413_set_torch_brightness,
  196. };
  197. static int aw36413_init(void *ctx)
  198. {
  199. struct flash_led_dev *dev = ctx;
  200. int ret;
  201. uint32_t val = 0;
  202. unsigned char reg = 0;
  203. usleep_range(2000, 2500);
  204. dev->flash_led_func = &aw36413_function;
  205. dev->flash_led_sccb_cfg.addr_byte = 1;
  206. dev->flash_led_sccb_cfg.data_byte = 1;
  207. dev->flash_led_sccb_cfg.slave_addr = AW36413_ADDR;
  208. /* clear enable register */
  209. reg = AW36413_REG_ENABLE;
  210. aw_reg1_val = AW36413_DISABLE;
  211. ret = flash_led_i2c_write(dev, reg, aw_reg1_val);
  212. if (ret != 0) {
  213. return -1;
  214. }
  215. /* set torch current ramp time and flash timeout */
  216. reg = AW36413_REG_TIMING_CONF;
  217. val = AW36413_TORCH_RAMP_TIME | AW36413_FLASH_TIMEOUT;
  218. ret = flash_led_i2c_write(dev, reg, val);
  219. if (ret != 0) {
  220. return -1;
  221. }
  222. ret = aw36413_set_mode(dev, FLASH_LED_IR_ENABLE);
  223. return ret;
  224. }