ccci_util_lib_time.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <linux/module.h>
  2. #include <linux/device.h>
  3. #include <linux/fs.h>
  4. #include <linux/cdev.h>
  5. #include <linux/interrupt.h>
  6. #include <linux/spinlock.h>
  7. #include <linux/uaccess.h>
  8. #include <linux/mm.h>
  9. #include <linux/kfifo.h>
  10. #include <linux/firmware.h>
  11. #include <linux/syscalls.h>
  12. #include <linux/uaccess.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/proc_fs.h>
  15. #include <linux/seq_file.h>
  16. #include <linux/of.h>
  17. #ifdef CONFIG_OF
  18. #include <linux/of_fdt.h>
  19. #endif
  20. #include <asm/setup.h>
  21. #include <linux/atomic.h>
  22. #include <mt-plat/mt_boot_common.h>
  23. #include <mt-plat/mt_ccci_common.h>
  24. static wait_queue_head_t time_update_notify_queue_head;
  25. static spinlock_t wait_count_lock;
  26. static volatile unsigned int wait_count;
  27. static volatile unsigned int get_update;
  28. static volatile unsigned int api_ready;
  29. void ccci_timer_for_md_init(void)
  30. {
  31. init_waitqueue_head(&time_update_notify_queue_head);
  32. spin_lock_init(&wait_count_lock);
  33. wait_count = 0;
  34. get_update = 0;
  35. mb();
  36. api_ready = 1;
  37. }
  38. int wait_time_update_notify(void)
  39. { /* Only support one wait currently */
  40. int ret = -1;
  41. unsigned long flags;
  42. if (api_ready) {
  43. /* Update wait count ++ */
  44. spin_lock_irqsave(&wait_count_lock, flags);
  45. wait_count++;
  46. spin_unlock_irqrestore(&wait_count_lock, flags);
  47. ret = wait_event_interruptible(time_update_notify_queue_head, get_update);
  48. if (ret != -ERESTARTSYS)
  49. get_update = 0;
  50. /* Update wait count -- */
  51. spin_lock_irqsave(&wait_count_lock, flags);
  52. wait_count--;
  53. spin_unlock_irqrestore(&wait_count_lock, flags);
  54. }
  55. return ret;
  56. }
  57. void notify_time_update(void)
  58. {
  59. unsigned long flags;
  60. if (!api_ready)
  61. return; /* API not ready */
  62. get_update = 1;
  63. spin_lock_irqsave(&wait_count_lock, flags);
  64. if (wait_count)
  65. wake_up_all(&time_update_notify_queue_head);
  66. spin_unlock_irqrestore(&wait_count_lock, flags);
  67. }