leds.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mach-integrator/leds.c
  3.  *
  4.  *  Integrator LED control routines
  5.  *
  6.  *  Copyright (C) 1999 ARM Limited
  7.  *  Copyright (C) 2000 Deep Blue Solutions Ltd
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  */
  23. #include <linux/kernel.h>
  24. #include <linux/init.h>
  25. #include <asm/hardware.h>
  26. #include <asm/io.h>
  27. #include <asm/leds.h>
  28. #include <asm/system.h>
  29. #include <asm/mach-types.h>
  30. static int saved_leds;
  31. static void integrator_leds_event(led_event_t ledevt)
  32. {
  33. unsigned long flags;
  34. const unsigned int dbg_base = IO_ADDRESS(INTEGRATOR_DBG_BASE);
  35. const unsigned int hdr_ctrl = IO_ADDRESS(INTEGRATOR_HDR_BASE) +
  36. INTEGRATOR_HDR_CTRL_OFFSET;
  37. unsigned int ctrl;
  38. unsigned int update_alpha_leds;
  39. // yup, change the LEDs
  40. local_irq_save(flags);
  41. update_alpha_leds = 0;
  42. switch(ledevt) {
  43. case led_idle_start:
  44. ctrl = __raw_readl(hdr_ctrl);
  45. ctrl &= ~INTEGRATOR_HDR_CTRL_LED;
  46. __raw_writel(ctrl, hdr_ctrl);
  47. break;
  48. case led_idle_end:
  49. ctrl = __raw_readl(hdr_ctrl);
  50. ctrl |= INTEGRATOR_HDR_CTRL_LED;
  51. __raw_writel(ctrl, hdr_ctrl);
  52. break;
  53. case led_timer:
  54. saved_leds ^= GREEN_LED;
  55. update_alpha_leds = 1;
  56. break;
  57. case led_red_on:
  58. saved_leds |= RED_LED;
  59. update_alpha_leds = 1;
  60. break;
  61. case led_red_off:
  62. saved_leds &= ~RED_LED;
  63. update_alpha_leds = 1;
  64. break;
  65. default:
  66. break;
  67. }
  68. if (update_alpha_leds) {
  69. while (__raw_readl(dbg_base + INTEGRATOR_DBG_ALPHA_OFFSET) & 1);
  70. __raw_writel(saved_leds, dbg_base + INTEGRATOR_DBG_LEDS_OFFSET);
  71. }
  72. local_irq_restore(flags);
  73. }
  74. static int __init leds_init(void)
  75. {
  76. if (machine_is_integrator())
  77. leds_event = integrator_leds_event;
  78. return 0;
  79. }
  80. __initcall(leds_init);