driver.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * driver.c - driver support
  3. *
  4. * (C) 2006-2007 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
  5. * Shaohua Li <shaohua.li@intel.com>
  6. * Adam Belay <abelay@novell.com>
  7. *
  8. * This code is licenced under the GPL.
  9. */
  10. #include <linux/mutex.h>
  11. #include <linux/module.h>
  12. #include <linux/cpuidle.h>
  13. #include "cpuidle.h"
  14. static struct cpuidle_driver *cpuidle_curr_driver;
  15. DEFINE_SPINLOCK(cpuidle_driver_lock);
  16. /**
  17. * cpuidle_register_driver - registers a driver
  18. * @drv: the driver
  19. */
  20. int cpuidle_register_driver(struct cpuidle_driver *drv)
  21. {
  22. if (!drv)
  23. return -EINVAL;
  24. if (cpuidle_disabled())
  25. return -ENODEV;
  26. spin_lock(&cpuidle_driver_lock);
  27. if (cpuidle_curr_driver) {
  28. spin_unlock(&cpuidle_driver_lock);
  29. return -EBUSY;
  30. }
  31. cpuidle_curr_driver = drv;
  32. spin_unlock(&cpuidle_driver_lock);
  33. return 0;
  34. }
  35. EXPORT_SYMBOL_GPL(cpuidle_register_driver);
  36. /**
  37. * cpuidle_get_driver - return the current driver
  38. */
  39. struct cpuidle_driver *cpuidle_get_driver(void)
  40. {
  41. return cpuidle_curr_driver;
  42. }
  43. EXPORT_SYMBOL_GPL(cpuidle_get_driver);
  44. /**
  45. * cpuidle_unregister_driver - unregisters a driver
  46. * @drv: the driver
  47. */
  48. void cpuidle_unregister_driver(struct cpuidle_driver *drv)
  49. {
  50. if (drv != cpuidle_curr_driver) {
  51. WARN(1, "invalid cpuidle_unregister_driver(%s)\n",
  52. drv->name);
  53. return;
  54. }
  55. spin_lock(&cpuidle_driver_lock);
  56. cpuidle_curr_driver = NULL;
  57. spin_unlock(&cpuidle_driver_lock);
  58. }
  59. EXPORT_SYMBOL_GPL(cpuidle_unregister_driver);