Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b4d9539 authored by Paul Mundt's avatar Paul Mundt
Browse files

sh: heartbeat consolidation for banked LEDs.



This consolidates the various board heartbeat LED implementations,
used for strobing the load average across a LED bank. Those boards
not implementing a full bank can hook in via the LED class.

We leave the compat hook in the machvec for now until those non-banked
boards are able to migrate to the drivers/leds.

Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent c7666e72
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -512,7 +512,8 @@ config HEARTBEAT
	bool "Heartbeat LED"
	depends on SH_MPC1211 || SH_SH03 || \
		   SH_BIGSUR || SOLUTION_ENGINE || \
		   SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK
		   SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK || \
		   SH_R7780RP
	help
	  Use the power-on LED on your machine as a load meter.  The exact
	  behavior is platform-dependent, but normally the flash frequency is
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
# Makefile for the Interface (CTP/PCI/MPC-SH02) specific parts of the kernel
#

obj-y	 := setup.o rtc.o led.o
obj-y	 := setup.o rtc.o

obj-$(CONFIG_PCI) += pci.o

arch/sh/boards/mpc1211/led.c

deleted100644 → 0
+0 −63
Original line number Diff line number Diff line
/*
 * linux/arch/sh/boards/mpc1211/led.c
 *
 * Copyright (C) 2001  Saito.K & Jeanne
 *
 * This file contains Interface MPC-1211 specific LED code.
 */


static void mach_led(int position, int value)
{
	volatile unsigned char* p = (volatile unsigned char*)0xa2000000;

	if (value) {
		*p |= 1;
	} else {
		*p &= ~1;
	}
}

#ifdef CONFIG_HEARTBEAT

#include <linux/sched.h>

/* Cycle the LED's in the clasic Knightrider/Sun pattern */
void heartbeat_mpc1211(void)
{
	static unsigned int cnt = 0, period = 0;
	volatile unsigned char* p = (volatile unsigned char*)0xa2000000;
	static unsigned bit = 0, up = 1;

	cnt += 1;
	if (cnt < period) {
		return;
	}

	cnt = 0;

	/* Go through the points (roughly!):
	 * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
	 */
	period = 110 - ( (300<<FSHIFT)/
			 ((avenrun[0]/5) + (3<<FSHIFT)) );

	if (up) {
		if (bit == 7) {
			bit--;
			up=0;
		} else {
			bit ++;
		}
	} else {
		if (bit == 0) {
			bit++;
			up=1;
		} else {
			bit--;
		}
	}
	*p = 1<<bit;

}
#endif /* CONFIG_HEARTBEAT */
+27 −4
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <linux/hdreg.h>
#include <linux/ide.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <asm/io.h>
#include <asm/machvec.h>
#include <asm/mpc1211/mpc1211.h>
@@ -281,6 +282,32 @@ static int put_smb_blk(unsigned char *p, int address, int command, int no)
	return 0;
}

static struct resource heartbeat_resources[] = {
	[0] = {
		.start	= 0xa2000000,
		.end	= 0xa2000000 + 8 - 1,
		.flags	= IORESOURCE_MEM,
	},
};

static struct platform_device heartbeat_device = {
	.name		= "heartbeat",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(heartbeat_resources),
	.resource	= heartbeat_resources,
};

static struct platform_device *mpc1211_devices[] __initdata = {
	&heartbeat_device,
};

static int __init mpc1211_devices_setup(void)
{
	return platform_add_devices(mpc1211_devices,
				    ARRAY_SIZE(mpc1211_devices));
}
__initcall(mpc1211_devices_setup);

/* arch/sh/boards/mpc1211/rtc.c */
void mpc1211_time_init(void);

@@ -317,9 +344,5 @@ struct sh_machine_vector mv_mpc1211 __initmv = {
	.mv_nr_irqs		= 48,
	.mv_irq_demux		= mpc1211_irq_demux,
	.mv_init_irq		= init_mpc1211_IRQ,

#ifdef CONFIG_HEARTBEAT
	.mv_heartbeat		= heartbeat_mpc1211,
#endif
};
ALIAS_MV(mpc1211)
+0 −1
Original line number Diff line number Diff line
@@ -4,5 +4,4 @@

obj-y	 := setup.o io.o irq.o

obj-$(CONFIG_HEARTBEAT)		+= led.o
obj-$(CONFIG_PUSH_SWITCH)	+= psw.o
Loading