2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
3 * Copyright (C) 2007-2009 PetaLogix
4 * Copyright (C) 2006 Atmark Techno, Inc.
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
11 #include <linux/sched.h>
14 #include <asm/setup.h>
18 static unsigned int base_addr
;
20 void microblaze_heartbeat(void)
22 static unsigned int cnt
, period
, dist
;
25 if (cnt
== 0 || cnt
== dist
)
26 out_be32(base_addr
, 1);
27 else if (cnt
== 7 || cnt
== dist
+ 7)
28 out_be32(base_addr
, 0);
33 * The hyperbolic function below modifies the heartbeat
34 * period length in dependency of the current (5min)
35 * load. It goes through the points f(0)=126, f(1)=86,
36 * f(5)=51, f(inf)->30.
38 period
= ((672 << FSHIFT
) / (5 * avenrun
[0] +
45 void microblaze_setup_heartbeat(void)
47 struct device_node
*gpio
= NULL
;
50 const char * const gpio_list
[] = {
51 "xlnx,xps-gpio-1.00.a",
55 for (j
= 0; gpio_list
[j
] != NULL
; j
++) {
56 gpio
= of_find_compatible_node(NULL
, NULL
, gpio_list
[j
]);
62 base_addr
= be32_to_cpup(of_get_property(gpio
, "reg", NULL
));
63 base_addr
= (unsigned long) ioremap(base_addr
, PAGE_SIZE
);
64 pr_notice("Heartbeat GPIO at 0x%x\n", base_addr
);
66 /* GPIO is configured as output */
67 prop
= (int *) of_get_property(gpio
, "xlnx,is-bidir", NULL
);
69 out_be32(base_addr
+ 4, 0);