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

Commit 14e40f64 authored by Bjarke Istrup Pedersen's avatar Bjarke Istrup Pedersen Committed by Richard Purdie
Browse files

leds: Add LED driver for the Soekris net5501 board



It is based on the previously submitted code by Alessandro Zummo, but is
changed to use the new GPIO driver with 2.6.33, and the driver has been
moved to drivers/leds where it belongs.

[akpm@linux-foundation.org: coding-style fixes]
[randy.dunlap@oracle.com: fix net5501 kconfig]
Signed-off-by: default avatarBjarke Istrup Pedersen <gurligebis@gentoo.org>
Signed-off-by: default avatarRandy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarRichard Purdie <rpurdie@linux.intel.com>
parent 98652efc
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -67,6 +67,16 @@ config LEDS_NET48XX
	  This option enables support for the Soekris net4801 and net4826 error
	  LED.

config LEDS_NET5501
	tristate "LED Support for Soekris net5501 series Error LED"
	depends on LEDS_CLASS && LEDS_TRIGGERS
	depends on LEDS_GPIO_PLATFORM && GPIO_CS5535
	select LEDS_TRIGGER_DEFAULT_ON
	default n
	help
	  Add support for the Soekris net5501 board (detection, error led
	  and GPIO).

config LEDS_FSG
	tristate "LED Support for the Freecom FSG-3"
	depends on MACH_FSG
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
obj-$(CONFIG_LEDS_S3C24XX)		+= leds-s3c24xx.o
obj-$(CONFIG_LEDS_AMS_DELTA)		+= leds-ams-delta.o
obj-$(CONFIG_LEDS_NET48XX)		+= leds-net48xx.o
obj-$(CONFIG_LEDS_NET5501)		+= leds-net5501.o
obj-$(CONFIG_LEDS_WRAP)			+= leds-wrap.o
obj-$(CONFIG_LEDS_ALIX2)		+= leds-alix2.o
obj-$(CONFIG_LEDS_H1940)		+= leds-h1940.o
+94 −0
Original line number Diff line number Diff line
/*
 * Soekris board support code
 *
 * Copyright (C) 2008-2009 Tower Technologies
 * Written by Alessandro Zummo <a.zummo@towertech.it>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 */

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/string.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>

#include <asm/geode.h>

static struct gpio_led net5501_leds[] = {
	{
		.name = "error",
		.gpio = 6,
		.default_trigger = "default-on",
	},
};

static struct gpio_led_platform_data net5501_leds_data = {
	.num_leds = ARRAY_SIZE(net5501_leds),
	.leds = net5501_leds,
};

static struct platform_device net5501_leds_dev = {
	.name = "leds-gpio",
	.id = -1,
	.dev.platform_data = &net5501_leds_data,
};

static void __init init_net5501(void)
{
	platform_device_register(&net5501_leds_dev);
}

struct soekris_board {
	u16	offset;
	char	*sig;
	u8	len;
	void	(*init)(void);
};

static struct soekris_board __initdata boards[] = {
	{ 0xb7b, "net5501", 7, init_net5501 },	/* net5501 v1.33/1.33c */
	{ 0xb1f, "net5501", 7, init_net5501 },	/* net5501 v1.32i */
};

static int __init soekris_init(void)
{
	int i;
	unsigned char *rombase, *bios;

	if (!is_geode())
		return 0;

	rombase = ioremap(0xffff0000, 0xffff);
	if (!rombase) {
		printk(KERN_INFO "Soekris net5501 LED driver failed to get rombase");
		return 0;
	}

	bios = rombase + 0x20;	/* null terminated */

	if (strncmp(bios, "comBIOS", 7))
		goto unmap;

	for (i = 0; i < ARRAY_SIZE(boards); i++) {
		unsigned char *model = rombase + boards[i].offset;

		if (strncmp(model, boards[i].sig, boards[i].len) == 0) {
			printk(KERN_INFO "Soekris %s: %s\n", model, bios);

			if (boards[i].init)
				boards[i].init();
			break;
		}
	}

unmap:
	iounmap(rombase);
	return 0;
}

arch_initcall(soekris_init);