static const char rcsid[] = "$Id: led.c,v 1.1 1997/10/05 06:34:56 jhawk Exp jhawk $ ";

#define _KERNEL

#include <sys/types.h>
#include <sys/systm.h>

#include <sys/modctl.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>

#undef _KERNEL

#include <sys/param.h>
#include <sys/promif.h>

static struct modlmisc ledmisc = {
  &mod_miscops,
  "jhawk's led twiddler"
};

static struct modlinkage led_modlinkage = {
  MODREV_1,
  &ledmisc,
  NULL
};

void led_idle();
void blink_led();

int led_freq;
int led_timeout;

void (*led_old_idle)();
extern void (*idle_cpu)();

int _fini()
{
#if 0
  idle_cpu=led_old_idle;
#endif
  if (led_timeout)
    untimeout(led_timeout);
  prom_interpret("led-on",0,0,0,0,0);
  return mod_remove(&led_modlinkage);
}

int _info(struct modinfo *modp)
{
  return mod_info(&led_modlinkage, modp);
}

#define LEDFREQ (hz)

int _init()
{
  led_freq = LEDFREQ;
 
#if 0
  led_old_idle=idle_cpu;
  idle_cpu=led_idle;
#endif

  led_timeout = timeout(blink_led, NULL, led_freq);

  return mod_install(&led_modlinkage);
}


void blink_led() {
  static int state;
  extern long avenrun;
  int load;

#if 1
  if (avenrun < FSCALE/2)
    led_freq = 4*hz;
  else if (avenrun < 1*FSCALE)
    led_freq = 2*hz;
  else if (avenrun < 2*FSCALE)
    led_freq = hz/4;
  else
    led_freq = hz/5;
#else
  led_freq = avenrun*100*hz/FSCALE;
#endif

  prom_interpret( state?"led-off":"led-on",
		  0,0,0,0,0);
  state ^= 1;
#ifdef LEDDEBUG
  printf("freq %d\n", led_freq);
#endif
  led_timeout = timeout(blink_led, NULL, led_freq);

}

#if 0
#define LEDTICKS    500000

void led_idle() {
  static int i;

  i++;
  if (i % LEDTICKS == 1)
    blink_led();

}
#endif


void led_idle() {
  static long blink_lbolt;

  if (lbolt - blink_lbolt > led_freq) {
    blink_led();
    blink_lbolt = lbolt;
  }
}
