pmac_backlight.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.pmac_backlight.c 1.10 12/01/01 20:09:06 benh
  3.  */
  4. /*
  5.  * Miscellaneous procedures for dealing with the PowerMac hardware.
  6.  * Contains support for the backlight.
  7.  * 
  8.  *   Copyright (C) 2000 Benjamin Herrenschmidt
  9.  *
  10.  */
  11. #include <linux/config.h>
  12. #include <linux/kernel.h>
  13. #include <linux/stddef.h>
  14. #include <linux/reboot.h>
  15. #include <linux/nvram.h>
  16. #include <asm/sections.h>
  17. #include <asm/ptrace.h>
  18. #include <asm/io.h>
  19. #include <asm/pgtable.h>
  20. #include <asm/system.h>
  21. #include <asm/prom.h>
  22. #include <asm/machdep.h>
  23. #include <asm/nvram.h>
  24. #include <asm/backlight.h>
  25. #include <linux/adb.h>
  26. #include <linux/pmu.h>
  27. static struct backlight_controller *backlighter = NULL;
  28. static void* backlighter_data = NULL;
  29. static int backlight_autosave = 0;
  30. static int backlight_level = BACKLIGHT_MAX;
  31. static int backlight_enabled = 1;
  32. void __pmac
  33. register_backlight_controller(struct backlight_controller *ctrler, void *data, char *type)
  34. {
  35. struct device_node* bk_node;
  36. char *prop;
  37. int valid = 0;
  38. bk_node = find_devices("backlight");
  39. #ifdef CONFIG_ADB_PMU
  40. /* Special case for the old PowerBook since I can't test on it */
  41. backlight_autosave = machine_is_compatible("AAPL,3400/2400")
  42. || machine_is_compatible("AAPL,3500");
  43. if ((backlight_autosave
  44.      || machine_is_compatible("AAPL,PowerBook1998")
  45.      || machine_is_compatible("PowerBook1,1"))
  46.     && !strcmp(type, "pmu"))
  47. valid = 1;
  48. #endif
  49. if (bk_node) {
  50. prop = get_property(bk_node, "backlight-control", NULL);
  51. if (prop && !strncmp(prop, type, strlen(type)))
  52. valid = 1;
  53. }
  54. if (!valid)
  55. return;
  56. backlighter = ctrler;
  57. backlighter_data = data;
  58. if (bk_node && !backlight_autosave)
  59. prop = get_property(bk_node, "bklt", NULL);
  60. else
  61. prop = NULL;
  62. if (prop) {
  63. backlight_level = ((*prop)+1) >> 1;
  64. if (backlight_level > BACKLIGHT_MAX)
  65. backlight_level = BACKLIGHT_MAX;
  66. }
  67. #ifdef CONFIG_ADB_PMU
  68. if (backlight_autosave) {
  69. struct adb_request req;
  70. pmu_request(&req, NULL, 2, 0xd9, 0);
  71. while (!req.complete)
  72. pmu_poll();
  73. backlight_level = req.reply[0] >> 4;
  74. }
  75. #endif
  76. if (!backlighter->set_enable(1, backlight_level, data))
  77. backlight_enabled = 1;
  78. printk(KERN_INFO "Registered "%s" backlight controller, level: %d/15n",
  79. type, backlight_level);
  80. }
  81. void __pmac
  82. unregister_backlight_controller(struct backlight_controller *ctrler, void *data)
  83. {
  84. /* We keep the current backlight level (for now) */
  85. if (ctrler == backlighter && data == backlighter_data)
  86. backlighter = NULL;
  87. }
  88. int __pmac
  89. set_backlight_enable(int enable)
  90. {
  91. int rc;
  92. if (!backlighter)
  93. return -ENODEV;
  94. rc = backlighter->set_enable(enable, backlight_level, backlighter_data);
  95. if (!rc)
  96. backlight_enabled = enable;
  97. return rc;
  98. }
  99. int __pmac
  100. get_backlight_enable(void)
  101. {
  102. if (!backlighter)
  103. return -ENODEV;
  104. return backlight_enabled;
  105. }
  106. int __pmac
  107. set_backlight_level(int level)
  108. {
  109. int rc = 0;
  110. if (!backlighter)
  111. return -ENODEV;
  112. if (level < BACKLIGHT_MIN)
  113. level = BACKLIGHT_OFF;
  114. if (level > BACKLIGHT_MAX)
  115. level = BACKLIGHT_MAX;
  116. if (backlight_enabled)
  117. rc = backlighter->set_level(level, backlighter_data);
  118. if (!rc)
  119. backlight_level = level;
  120. if (!rc && !backlight_autosave) {
  121. level <<=1;
  122. if (level & 0x10)
  123. level |= 0x01;
  124. // -- todo: save to property "bklt"
  125. }
  126. return rc;
  127. }
  128. int __pmac
  129. get_backlight_level(void)
  130. {
  131. if (!backlighter)
  132. return -ENODEV;
  133. return backlight_level;
  134. }