mtk_cooler_shutdown.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. #ifdef pr_fmt
  2. #undef pr_fmt
  3. #endif
  4. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  5. #include <linux/version.h>
  6. #include <linux/kernel.h>
  7. #include <linux/module.h>
  8. #include <linux/printk.h>
  9. #include <linux/types.h>
  10. #include <linux/kobject.h>
  11. #include "mt-plat/mtk_thermal_monitor.h"
  12. #define MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN 3
  13. /* #define MTK_COOLER_SHUTDOWN_UEVENT */
  14. #define MTK_COOLER_SHUTDOWN_SIGNAL
  15. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  16. #include <linux/version.h>
  17. #include <linux/proc_fs.h>
  18. #include <linux/seq_file.h>
  19. #include <asm/uaccess.h>
  20. #include <linux/pid.h>
  21. #include <linux/signal.h>
  22. #include <linux/sched.h>
  23. #include <linux/uidgid.h>
  24. #define MAX_LEN 256
  25. #endif
  26. #if 1
  27. #define mtk_cooler_shutdown_dprintk(fmt, args...) pr_debug("thermal/cooler/shutdown " fmt, ##args)
  28. #else
  29. #define mtk_cooler_shutdown_dprintk(fmt, args...)
  30. #endif
  31. struct sd_state {
  32. unsigned long state;
  33. int sd_cnt;
  34. };
  35. static struct thermal_cooling_device *cl_shutdown_dev[MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN] = { 0 };
  36. /* static unsigned long cl_shutdown_state[MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN] = { 0 }; */
  37. static struct sd_state cl_sd_state[MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN];
  38. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  39. static unsigned int tm_pid;
  40. static unsigned int tm_input_pid;
  41. static unsigned int mtk_cl_sd_rst;
  42. static struct task_struct g_task;
  43. static struct task_struct *pg_task = &g_task;
  44. static int sd_debouncet = 1;
  45. /* static int sd_cnt = 0; */
  46. static int sd_happened;
  47. static kuid_t uid = KUIDT_INIT(0);
  48. static kgid_t gid = KGIDT_INIT(1000);
  49. static ssize_t _mtk_cl_sd_rst_write(struct file *filp, const char __user *buf, size_t count,
  50. loff_t *data)
  51. {
  52. int ret = 0;
  53. char tmp[MAX_LEN] = { 0 };
  54. int len = 0;
  55. len = (count < (MAX_LEN - 1)) ? count : (MAX_LEN - 1);
  56. /* write data to the buffer */
  57. if (copy_from_user(tmp, buf, len))
  58. return -EFAULT;
  59. ret = kstrtouint(tmp, 10, &mtk_cl_sd_rst);
  60. if (ret)
  61. WARN_ON(1);
  62. if (1 == mtk_cl_sd_rst) {
  63. int i;
  64. for (i = MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN; i-- > 0;) {
  65. cl_sd_state[i].state = 0;
  66. cl_sd_state[i].sd_cnt = 0;
  67. }
  68. mtk_cl_sd_rst = 0;
  69. sd_happened = 0;
  70. /* sd_cnt = 0; */
  71. }
  72. mtk_cooler_shutdown_dprintk("%s %s = %d\n", __func__, tmp, mtk_cl_sd_rst);
  73. return len;
  74. }
  75. int _mtk_cl_sd_rst_read(struct seq_file *m, void *v)
  76. {
  77. return 0;
  78. }
  79. static int _mtk_cl_sd_rst_open(struct inode *inode, struct file *file)
  80. {
  81. return single_open(file, _mtk_cl_sd_rst_read, PDE_DATA(inode));
  82. }
  83. static const struct file_operations _cl_sd_rst_fops = {
  84. .owner = THIS_MODULE,
  85. .open = _mtk_cl_sd_rst_open,
  86. .read = seq_read,
  87. .llseek = seq_lseek,
  88. .write = _mtk_cl_sd_rst_write,
  89. .release = single_release,
  90. };
  91. static ssize_t _mtk_cl_sd_pid_write(struct file *filp, const char __user *buf, size_t count,
  92. loff_t *data)
  93. {
  94. int ret = 0;
  95. char tmp[MAX_LEN] = { 0 };
  96. int len = 0;
  97. len = (count < (MAX_LEN - 1)) ? count : (MAX_LEN - 1);
  98. /* write data to the buffer */
  99. if (copy_from_user(tmp, buf, len))
  100. return -EFAULT;
  101. ret = kstrtouint(tmp, 10, &tm_input_pid);
  102. if (ret)
  103. WARN_ON(1);
  104. mtk_cooler_shutdown_dprintk("%s %s = %d\n", __func__, tmp, tm_input_pid);
  105. return len;
  106. }
  107. static int _mtk_cl_sd_pid_read(struct seq_file *m, void *v)
  108. {
  109. seq_printf(m, "%d\n", tm_input_pid);
  110. mtk_cooler_shutdown_dprintk("%s %d\n", __func__, tm_input_pid);
  111. return 0;
  112. }
  113. static int _mtk_cl_sd_pid_open(struct inode *inode, struct file *file)
  114. {
  115. return single_open(file, _mtk_cl_sd_pid_read, PDE_DATA(inode));
  116. }
  117. static const struct file_operations _cl_sd_pid_fops = {
  118. .owner = THIS_MODULE,
  119. .open = _mtk_cl_sd_pid_open,
  120. .read = seq_read,
  121. .llseek = seq_lseek,
  122. .write = _mtk_cl_sd_pid_write,
  123. .release = single_release,
  124. };
  125. static ssize_t _mtk_cl_sd_debouncet_write(struct file *filp, const char __user *buf, size_t count,
  126. loff_t *data)
  127. {
  128. char desc[MAX_LEN] = { 0 };
  129. int tmp_dbt = -1;
  130. int len = 0;
  131. len = (count < (MAX_LEN - 1)) ? count : (MAX_LEN - 1);
  132. /* write data to the buffer */
  133. if (copy_from_user(desc, buf, len))
  134. return -EFAULT;
  135. if (kstrtoint(desc, 10, &tmp_dbt) == 0) {
  136. if (tmp_dbt >= 0 && tmp_dbt <= 5)
  137. sd_debouncet = tmp_dbt;
  138. else
  139. mtk_cooler_shutdown_dprintk("[%s] oo range %s = %d\n", __func__, desc, sd_debouncet);
  140. } else {
  141. mtk_cooler_shutdown_dprintk("[%s] bad arg %s = %d\n", __func__, desc, sd_debouncet);
  142. }
  143. mtk_cooler_shutdown_dprintk("[%s] %s = %d\n", __func__, desc, sd_debouncet);
  144. return len;
  145. }
  146. static int _mtk_cl_sd_debouncet_read(struct seq_file *m, void *v)
  147. {
  148. seq_printf(m, "%d\n", sd_debouncet);
  149. mtk_cooler_shutdown_dprintk("[%s] %d\n", __func__, sd_debouncet);
  150. return 0;
  151. }
  152. static int _mtk_cl_sd_debouncet_open(struct inode *inode, struct file *file)
  153. {
  154. return single_open(file, _mtk_cl_sd_debouncet_read, PDE_DATA(inode));
  155. }
  156. static const struct file_operations _cl_sd_debouncet_fops = {
  157. .owner = THIS_MODULE,
  158. .open = _mtk_cl_sd_debouncet_open,
  159. .read = seq_read,
  160. .llseek = seq_lseek,
  161. .write = _mtk_cl_sd_debouncet_write,
  162. .release = single_release,
  163. };
  164. static int _mtk_cl_sd_send_signal(void)
  165. {
  166. int ret = 0;
  167. if (tm_input_pid == 0) {
  168. mtk_cooler_shutdown_dprintk("%s pid is empty\n", __func__);
  169. ret = -1;
  170. }
  171. mtk_cooler_shutdown_dprintk("%s pid is %d, %d\n", __func__, tm_pid, tm_input_pid);
  172. if (ret == 0 && tm_input_pid != tm_pid) {
  173. tm_pid = tm_input_pid;
  174. pg_task = get_pid_task(find_vpid(tm_pid), PIDTYPE_PID);
  175. }
  176. if (ret == 0 && pg_task) {
  177. siginfo_t info;
  178. info.si_signo = SIGIO;
  179. info.si_errno = 0;
  180. info.si_code = 1;
  181. info.si_addr = NULL;
  182. ret = send_sig_info(SIGIO, &info, pg_task);
  183. }
  184. if (ret != 0)
  185. mtk_cooler_shutdown_dprintk("%s ret=%d\n", __func__, ret);
  186. return ret;
  187. }
  188. #endif
  189. static int mtk_cl_shutdown_get_max_state(struct thermal_cooling_device *cdev, unsigned long *state)
  190. {
  191. *state = 1;
  192. /* mtk_cooler_shutdown_dprintk("mtk_cl_shutdown_get_max_state() %s %d\n", cdev->type, *state); */
  193. return 0;
  194. }
  195. static int mtk_cl_shutdown_get_cur_state(struct thermal_cooling_device *cdev, unsigned long *state)
  196. {
  197. /* *state = *((unsigned long *)cdev->devdata); */
  198. struct sd_state *cl_state = (struct sd_state *) cdev->devdata;
  199. if (state)
  200. *state = cl_state->state;
  201. /* mtk_cooler_shutdown_dprintk("mtk_cl_shutdown_get_cur_state() %s %d\n", cdev->type, *state); */
  202. return 0;
  203. }
  204. static int mtk_cl_shutdown_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
  205. {
  206. struct sd_state *cl_state = (struct sd_state *) cdev->devdata;
  207. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  208. volatile unsigned long original_state;
  209. #endif
  210. /* mtk_cooler_shutdown_dprintk("mtk_cl_shutdown_set_cur_state() %s %d\n", cdev->type, state); */
  211. if (!cl_state)
  212. return -1;
  213. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  214. original_state = cl_state->state;
  215. #endif
  216. cl_state->state = state;
  217. if (0 == state) {
  218. if (cl_state->sd_cnt > 0)
  219. cl_state->sd_cnt--;
  220. } else if (1 == state) {
  221. cl_state->sd_cnt++;
  222. }
  223. if (sd_debouncet == cl_state->sd_cnt) {
  224. #if defined(MTK_COOLER_SHUTDOWN_UEVENT)
  225. {
  226. /* send uevent to notify current call must be dropped */
  227. char event[11] = "SHUTDOWN=1";
  228. char *envp[2] = { event, NULL };
  229. kobject_uevent_env(&(cdev->device.kobj), KOBJ_CHANGE, envp);
  230. }
  231. #endif
  232. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  233. if (0 == sd_happened) { /* make this an edge trigger instead of level trigger */
  234. /* send signal to target process */
  235. _mtk_cl_sd_send_signal();
  236. sd_happened = 1;
  237. }
  238. #endif
  239. }
  240. return 0;
  241. }
  242. /* bind fan callbacks to fan device */
  243. static struct thermal_cooling_device_ops mtk_cl_shutdown_ops = {
  244. .get_max_state = mtk_cl_shutdown_get_max_state,
  245. .get_cur_state = mtk_cl_shutdown_get_cur_state,
  246. .set_cur_state = mtk_cl_shutdown_set_cur_state,
  247. };
  248. static int mtk_cooler_shutdown_register_ltf(void)
  249. {
  250. int i;
  251. mtk_cooler_shutdown_dprintk("register ltf\n");
  252. for (i = MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN; i-- > 0;) {
  253. char temp[20] = { 0 };
  254. sprintf(temp, "mtk-cl-shutdown%02d", i);
  255. cl_shutdown_dev[i] = mtk_thermal_cooling_device_register(temp, (void *)
  256. &cl_sd_state[i],
  257. &mtk_cl_shutdown_ops);
  258. }
  259. return 0;
  260. }
  261. static void mtk_cooler_shutdown_unregister_ltf(void)
  262. {
  263. int i;
  264. mtk_cooler_shutdown_dprintk("unregister ltf\n");
  265. for (i = MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN; i-- > 0;) {
  266. if (cl_shutdown_dev[i]) {
  267. mtk_thermal_cooling_device_unregister(cl_shutdown_dev[i]);
  268. cl_shutdown_dev[i] = NULL;
  269. cl_sd_state[i].state = 0;
  270. cl_sd_state[i].sd_cnt = 0;
  271. }
  272. }
  273. }
  274. static int __init mtk_cooler_shutdown_init(void)
  275. {
  276. int err = 0;
  277. int i;
  278. for (i = MAX_NUM_INSTANCE_MTK_COOLER_SHUTDOWN; i-- > 0;) {
  279. cl_shutdown_dev[i] = NULL;
  280. cl_sd_state[i].state = 0;
  281. cl_sd_state[i].sd_cnt = 0;
  282. }
  283. mtk_cooler_shutdown_dprintk("init\n");
  284. #if defined(MTK_COOLER_SHUTDOWN_SIGNAL)
  285. {
  286. struct proc_dir_entry *entry = NULL;
  287. struct proc_dir_entry *dir_entry = mtk_thermal_get_proc_drv_therm_dir_entry();
  288. if (!dir_entry) {
  289. mtk_cooler_shutdown_dprintk("%s mkdir /proc/driver/thermal failed\n",
  290. __func__);
  291. return 0;
  292. }
  293. entry =
  294. proc_create("clsd_pid", S_IRUGO | S_IWUSR | S_IWGRP, dir_entry,
  295. &_cl_sd_pid_fops);
  296. if (!entry)
  297. mtk_cooler_shutdown_dprintk("%s clsd_pid creation failed\n", __func__);
  298. else
  299. proc_set_user(entry, uid, gid);
  300. entry =
  301. proc_create("clsd_rst", S_IRUGO | S_IWUSR | S_IWGRP, dir_entry,
  302. &_cl_sd_rst_fops);
  303. if (!entry)
  304. mtk_cooler_shutdown_dprintk("%s clsd_rst creation failed\n", __func__);
  305. else
  306. proc_set_user(entry, uid, gid);
  307. entry =
  308. proc_create("clsd_dbt", S_IRUGO | S_IWUSR | S_IWGRP, dir_entry,
  309. &_cl_sd_debouncet_fops);
  310. if (!entry)
  311. mtk_cooler_shutdown_dprintk("%s clsd_dbt creation failed\n", __func__);
  312. else
  313. proc_set_user(entry, uid, gid);
  314. }
  315. #endif
  316. err = mtk_cooler_shutdown_register_ltf();
  317. if (err)
  318. goto err_unreg;
  319. return 0;
  320. err_unreg:
  321. mtk_cooler_shutdown_unregister_ltf();
  322. return err;
  323. }
  324. static void __exit mtk_cooler_shutdown_exit(void)
  325. {
  326. mtk_cooler_shutdown_dprintk("exit\n");
  327. mtk_cooler_shutdown_unregister_ltf();
  328. }
  329. module_init(mtk_cooler_shutdown_init);
  330. module_exit(mtk_cooler_shutdown_exit);