diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-13 08:17:52 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-13 08:17:52 -0700 |
commit | cec5455e457928153f5a51668dad3d68176feab5 (patch) | |
tree | bf62da1e26096c4cf97e56f8678269112dc306a1 /arch/microblaze/kernel/heartbeat.c | |
parent | b0cbc861a3c05e634520b049b5cc27ad6febb51f (diff) | |
parent | c6375b0a8007fffe65109aeea032a9243df070e1 (diff) |
Merge branch 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze
* 'for-linus' of git://git.monstr.eu/linux-2.6-microblaze: (60 commits)
microblaze_v8: Add MAINTAINERS fragment
microblaze_v8: Uartlite for Microblaze
microblaze_v8: Makefiles for Microblaze cpu
microblaze_v8: Kconfig patches
microblaze_v8: Interrupt handling and timer support
microblaze_v8: syscalls.h
microblaze_v8: pci headers
microblaze_v8: Kbuild file
microblaze_v8: string.h thread_info.h
microblaze_v8: unistd.h
microblaze_v8: fcntl.h sockios.h ucontext.h
microblaze_v8: pool.h socket.h
microblaze_v8: device.h param.h topology.h
microblaze_v8: headers files entry.h current.h mman.h registers.h sembuf.h
microblaze_v8: namei.h
microblaze_v8: gpio.h, serial.h
microblaze_v8: headers simple files - empty or redirect to asm-generic
microblaze_v8: sigcontext.h siginfo.h
microblaze_v8: termbits.h termios.h
microblaze_v8: stats headers
...
Diffstat (limited to 'arch/microblaze/kernel/heartbeat.c')
-rw-r--r-- | arch/microblaze/kernel/heartbeat.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/arch/microblaze/kernel/heartbeat.c b/arch/microblaze/kernel/heartbeat.c new file mode 100644 index 00000000000..1bdf20222b9 --- /dev/null +++ b/arch/microblaze/kernel/heartbeat.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> + * Copyright (C) 2007-2009 PetaLogix + * Copyright (C) 2006 Atmark Techno, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + +#include <linux/sched.h> +#include <linux/io.h> + +#include <asm/setup.h> +#include <asm/page.h> +#include <asm/prom.h> + +static unsigned int base_addr; + +void heartbeat(void) +{ + static unsigned int cnt, period, dist; + + if (base_addr) { + if (cnt == 0 || cnt == dist) + out_be32(base_addr, 1); + else if (cnt == 7 || cnt == dist + 7) + out_be32(base_addr, 0); + + if (++cnt > period) { + cnt = 0; + /* + * The hyperbolic function below modifies the heartbeat + * period length in dependency of the current (5min) + * load. It goes through the points f(0)=126, f(1)=86, + * f(5)=51, f(inf)->30. + */ + period = ((672 << FSHIFT) / (5 * avenrun[0] + + (7 << FSHIFT))) + 30; + dist = period / 4; + } + } +} + +void setup_heartbeat(void) +{ + struct device_node *gpio = NULL; + int j; + char *gpio_list[] = { + "xlnx,xps-gpio-1.00.a", + "xlnx,opb-gpio-1.00.a", + NULL + }; + + for (j = 0; gpio_list[j] != NULL; j++) { + gpio = of_find_compatible_node(NULL, NULL, gpio_list[j]); + if (gpio) + break; + } + + base_addr = *(int *) of_get_property(gpio, "reg", NULL); + base_addr = (unsigned long) ioremap(base_addr, PAGE_SIZE); + printk(KERN_NOTICE "Heartbeat GPIO at 0x%x\n", base_addr); + + if (*(int *) of_get_property(gpio, "xlnx,is-bidir", NULL)) + out_be32(base_addr + 4, 0); /* GPIO is configured as output */ +} |