mtk_cooler_backlight.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #ifdef pr_fmt
  2. #undef pr_fmt
  3. #endif
  4. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/printk.h>
  8. #include <linux/types.h>
  9. #include <linux/kobject.h>
  10. #include "mt-plat/mtk_thermal_monitor.h"
  11. #define mtk_cooler_backlight_dprintk(fmt, args...) pr_debug("thermal/cooler/backlight " fmt, ##args)
  12. #define BACKLIGHT_COOLER_NR 3
  13. static struct thermal_cooling_device *cl_backlight_dev[BACKLIGHT_COOLER_NR] = { 0 };
  14. static unsigned int g_cl_backlight_state[BACKLIGHT_COOLER_NR] = { 0 };
  15. /* static unsigned int g_cl_backlight_last_state[BACKLIGHT_COOLER_NR] = {0}; */
  16. static unsigned int g_cl_id[BACKLIGHT_COOLER_NR];
  17. static unsigned int g_backlight_level;
  18. static unsigned int g_backlight_last_level;
  19. static void mtk_cl_backlight_set_max_brightness_limit(void)
  20. {
  21. if (g_backlight_last_level != g_backlight_level) {
  22. mtk_cooler_backlight_dprintk("set brightness level = %d\n", g_backlight_level);
  23. switch (g_backlight_level) {
  24. case 0:
  25. setMaxbrightness(255, 0); /* 100% */
  26. break;
  27. case 1:
  28. setMaxbrightness(178, 1); /* 70% */
  29. break;
  30. case 2:
  31. setMaxbrightness(102, 1); /* 40% */
  32. break;
  33. case 3:
  34. setMaxbrightness(25, 1); /* 10% */
  35. break;
  36. default:
  37. setMaxbrightness(255, 0);
  38. break;
  39. }
  40. }
  41. }
  42. static int mtk_cl_backlight_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state)
  43. {
  44. *state = 1;
  45. /* mtk_cooler_backlight_dprintk("mtk_cl_backlight_get_max_state() %d\n", *state); */
  46. return 0;
  47. }
  48. static int mtk_cl_backlight_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state)
  49. {
  50. int nCoolerId;
  51. /* Get Cooler ID */
  52. nCoolerId = *((int *)cdev->devdata);
  53. *state = g_cl_backlight_state[nCoolerId];
  54. /* mtk_cooler_backlight_dprintk("mtk_cl_backlight_get_cur_state() %d CoolerID:%d\n", *state, nCoolerId); */
  55. return 0;
  56. }
  57. static int mtk_cl_backlight_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
  58. {
  59. int i;
  60. int nCoolerId; /* /< Backlight Cooler ID */
  61. /* Get Cooler ID */
  62. nCoolerId = *((int *)cdev->devdata);
  63. /* mtk_cooler_backlight_dprintk("mtk_cl_backlight_set_cur_state() %d CoolerID:%d\n", state, nCoolerId); */
  64. g_cl_backlight_state[nCoolerId] = state;
  65. g_backlight_level = 0;
  66. for (i = 0; i < BACKLIGHT_COOLER_NR; i++)
  67. g_backlight_level += g_cl_backlight_state[i];
  68. /* Mark for test */
  69. /* if(g_backlight_last_level != g_backlight_level) */
  70. {
  71. /* send uevent to notify current call must be dropped */
  72. /* char event[20] = {0}; */
  73. /* char *envp[] = { event, NULL }; */
  74. /* sprintf(event, "BACKLIGHT=%d", g_backlight_level); ///< BACKLIGHT01=1 ... */
  75. /* kobject_uevent_env(&(cl_backlight_dev[nCoolerId]->device.kobj), KOBJ_CHANGE, envp); */
  76. mtk_cl_backlight_set_max_brightness_limit();
  77. g_backlight_last_level = g_backlight_level;
  78. /* mtk_cooler_backlight_dprintk("mtk_cl_backlight_set_cur_state() event:%s g_backlight_level:%d\n",
  79. event, g_backlight_level); */
  80. }
  81. return 0;
  82. }
  83. /* bind fan callbacks to fan device */
  84. static struct thermal_cooling_device_ops mtk_cl_backlight_ops = {
  85. .get_max_state = mtk_cl_backlight_get_max_state,
  86. .get_cur_state = mtk_cl_backlight_get_cur_state,
  87. .set_cur_state = mtk_cl_backlight_set_cur_state,
  88. };
  89. static int mtk_cooler_backlight_register_ltf(void)
  90. {
  91. int i;
  92. mtk_cooler_backlight_dprintk("register ltf\n");
  93. for (i = 0; i < BACKLIGHT_COOLER_NR; i++) {
  94. char temp[20] = { 0 };
  95. sprintf(temp, "mtk-cl-backlight%02d", i + 1); /* /< Cooler Name: mtk-cl-backlight01 */
  96. g_cl_id[i] = i;
  97. cl_backlight_dev[i] = mtk_thermal_cooling_device_register(temp, (void *)&g_cl_id[i],
  98. &mtk_cl_backlight_ops);
  99. }
  100. return 0;
  101. }
  102. static void mtk_cooler_backlight_unregister_ltf(void)
  103. {
  104. int i;
  105. mtk_cooler_backlight_dprintk("unregister ltf\n");
  106. for (i = 0; i < BACKLIGHT_COOLER_NR; i++) {
  107. if (cl_backlight_dev[i]) {
  108. mtk_thermal_cooling_device_unregister(cl_backlight_dev[i]);
  109. cl_backlight_dev[i] = NULL;
  110. }
  111. }
  112. }
  113. static int __init mtk_cooler_backlight_init(void)
  114. {
  115. int err = 0;
  116. mtk_cooler_backlight_dprintk("init\n");
  117. err = mtk_cooler_backlight_register_ltf();
  118. if (err)
  119. goto err_unreg;
  120. return 0;
  121. err_unreg:
  122. mtk_cooler_backlight_unregister_ltf();
  123. return err;
  124. }
  125. static void __exit mtk_cooler_backlight_exit(void)
  126. {
  127. mtk_cooler_backlight_dprintk("exit\n");
  128. mtk_cooler_backlight_unregister_ltf();
  129. }
  130. module_init(mtk_cooler_backlight_init);
  131. module_exit(mtk_cooler_backlight_exit);