1/* 2 * linux/arch/sh/boards/superh/microdev/led.c 3 * 4 * Copyright (C) 2002 Stuart Menefy <stuart.menefy@st.com> 5 * Copyright (C) 2003 Richard Curnow (Richard.Curnow@superh.com) 6 * 7 * May be copied or modified under the terms of the GNU General Public 8 * License. See linux/COPYING for more information. 9 * 10 */ 11 12#include <asm/io.h> 13 14#define LED_REGISTER 0xa6104d20 15 16static void mach_led_d9(int value) 17{ 18 unsigned long reg; 19 reg = ctrl_inl(LED_REGISTER); 20 reg &= ~1; 21 reg |= (value & 1); 22 ctrl_outl(reg, LED_REGISTER); 23 return; 24} 25 26static void mach_led_d10(int value) 27{ 28 unsigned long reg; 29 reg = ctrl_inl(LED_REGISTER); 30 reg &= ~2; 31 reg |= ((value & 1) << 1); 32 ctrl_outl(reg, LED_REGISTER); 33 return; 34} 35 36 37#ifdef CONFIG_HEARTBEAT 38#include <linux/sched.h> 39 40static unsigned char banner_table[] = { 41 0x11, 0x01, 0x11, 0x01, 0x11, 0x03, 42 0x11, 0x01, 0x11, 0x01, 0x13, 0x03, 43 0x11, 0x01, 0x13, 0x01, 0x13, 0x01, 0x11, 0x03, 44 0x11, 0x03, 45 0x11, 0x01, 0x13, 0x01, 0x11, 0x03, 46 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x11, 0x07, 47 0x13, 0x01, 0x13, 0x03, 48 0x11, 0x01, 0x11, 0x03, 49 0x13, 0x01, 0x11, 0x01, 0x13, 0x01, 0x11, 0x03, 50 0x11, 0x01, 0x13, 0x01, 0x11, 0x03, 51 0x13, 0x01, 0x13, 0x01, 0x13, 0x03, 52 0x13, 0x01, 0x11, 0x01, 0x11, 0x03, 53 0x11, 0x03, 54 0x11, 0x01, 0x11, 0x01, 0x11, 0x01, 0x13, 0x07, 55 0xff 56}; 57 58static void banner(void) 59{ 60 static int pos = 0; 61 static int count = 0; 62 63 if (count) { 64 count--; 65 } else { 66 int val = banner_table[pos]; 67 if (val == 0xff) { 68 pos = 0; 69 val = banner_table[pos]; 70 } 71 pos++; 72 mach_led_d10((val >> 4) & 1); 73 count = 10 * (val & 0xf); 74 } 75} 76 77/* From heartbeat_harp in the stboards directory */ 78/* acts like an actual heart beat -- ie thump-thump-pause... */ 79void microdev_heartbeat(void) 80{ 81 static unsigned cnt = 0, period = 0, dist = 0; 82 83 if (cnt == 0 || cnt == dist) 84 mach_led_d9(1); 85 else if (cnt == 7 || cnt == dist+7) 86 mach_led_d9(0); 87 88 if (++cnt > period) { 89 cnt = 0; 90 /* The hyperbolic function below modifies the heartbeat period 91 * length in dependency of the current (5min) load. It goes 92 * through the points f(0)=126, f(1)=86, f(5)=51, 93 * f(inf)->30. */ 94 period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30; 95 dist = period / 4; 96 } 97 98 banner(); 99} 100 101#endif 102