|
|
@@ -0,0 +1,317 @@
|
|
|
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
|
|
+index 2f18a15..7a4f34b 100644
|
|
|
+--- a/arch/x86/Kconfig
|
|
|
++++ b/arch/x86/Kconfig
|
|
|
+@@ -2174,6 +2174,12 @@ config GEOS
|
|
|
+ ---help---
|
|
|
+ This option enables system support for the Traverse Technologies GEOS.
|
|
|
+
|
|
|
++config NET5501
|
|
|
++ bool "Soekris Engineering net5501 System Support (LEDS, GPIO, etc)"
|
|
|
++ select GPIOLIB
|
|
|
++ ---help---
|
|
|
++ This option enables system support for the Soekris Engineering net5501.
|
|
|
++
|
|
|
+ endif # X86_32
|
|
|
+
|
|
|
+ config AMD_NB
|
|
|
+diff --git a/arch/x86/platform/geode/Makefile b/arch/x86/platform/geode/Makefile
|
|
|
+index d8ba564..5b51194 100644
|
|
|
+--- a/arch/x86/platform/geode/Makefile
|
|
|
++++ b/arch/x86/platform/geode/Makefile
|
|
|
+@@ -1,2 +1,3 @@
|
|
|
+ obj-$(CONFIG_ALIX) += alix.o
|
|
|
++obj-$(CONFIG_NET5501) += net5501.o
|
|
|
+ obj-$(CONFIG_GEOS) += geos.o
|
|
|
+diff --git a/arch/x86/platform/geode/net5501.c b/arch/x86/platform/geode/net5501.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..66d377e
|
|
|
+--- /dev/null
|
|
|
++++ b/arch/x86/platform/geode/net5501.c
|
|
|
+@@ -0,0 +1,154 @@
|
|
|
++/*
|
|
|
++ * System Specific setup for Soekris net5501
|
|
|
++ * At the moment this means setup of GPIO control of LEDs and buttons
|
|
|
++ * on net5501 boards.
|
|
|
++ *
|
|
|
++ *
|
|
|
++ * Copyright (C) 2008-2009 Tower Technologies
|
|
|
++ * Written by Alessandro Zummo <[email protected]>
|
|
|
++ *
|
|
|
++ * Copyright (C) 2008 Constantin Baranov <[email protected]>
|
|
|
++ * Copyright (C) 2011 Ed Wildgoose <[email protected]>
|
|
|
++ * and Philip Prindeville <[email protected]>
|
|
|
++ *
|
|
|
++ * 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/module.h>
|
|
|
++#include <linux/leds.h>
|
|
|
++#include <linux/platform_device.h>
|
|
|
++#include <linux/gpio.h>
|
|
|
++#include <linux/input.h>
|
|
|
++#include <linux/gpio_keys.h>
|
|
|
++
|
|
|
++#include <asm/geode.h>
|
|
|
++
|
|
|
++#define BIOS_REGION_BASE 0xffff0000
|
|
|
++#define BIOS_REGION_SIZE 0x00010000
|
|
|
++
|
|
|
++static struct gpio_keys_button net5501_gpio_buttons[] = {
|
|
|
++ {
|
|
|
++ .code = KEY_RESTART,
|
|
|
++ .gpio = 24,
|
|
|
++ .active_low = 1,
|
|
|
++ .desc = "Reset button",
|
|
|
++ .type = EV_KEY,
|
|
|
++ .wakeup = 0,
|
|
|
++ .debounce_interval = 100,
|
|
|
++ .can_disable = 0,
|
|
|
++ }
|
|
|
++};
|
|
|
++static struct gpio_keys_platform_data net5501_buttons_data = {
|
|
|
++ .buttons = net5501_gpio_buttons,
|
|
|
++ .nbuttons = ARRAY_SIZE(net5501_gpio_buttons),
|
|
|
++ .poll_interval = 20,
|
|
|
++};
|
|
|
++
|
|
|
++static struct platform_device net5501_buttons_dev = {
|
|
|
++ .name = "gpio-keys-polled",
|
|
|
++ .id = 1,
|
|
|
++ .dev = {
|
|
|
++ .platform_data = &net5501_buttons_data,
|
|
|
++ }
|
|
|
++};
|
|
|
++
|
|
|
++static struct gpio_led net5501_leds[] = {
|
|
|
++ {
|
|
|
++ .name = "net5501:1",
|
|
|
++ .gpio = 6,
|
|
|
++ .default_trigger = "default-on",
|
|
|
++ .active_low = 1,
|
|
|
++ },
|
|
|
++};
|
|
|
++
|
|
|
++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 struct __initdata platform_device *net5501_devs[] = {
|
|
|
++ &net5501_buttons_dev,
|
|
|
++ &net5501_leds_dev,
|
|
|
++};
|
|
|
++
|
|
|
++static void __init register_net5501(void)
|
|
|
++{
|
|
|
++ /* Setup LED control through leds-gpio driver */
|
|
|
++ platform_add_devices(net5501_devs, ARRAY_SIZE(net5501_devs));
|
|
|
++}
|
|
|
++
|
|
|
++struct net5501_board {
|
|
|
++ u16 offset;
|
|
|
++ u16 len;
|
|
|
++ char *sig;
|
|
|
++};
|
|
|
++
|
|
|
++static struct net5501_board __initdata boards[] = {
|
|
|
++ { 0xb7b, 7, "net5501" }, /* net5501 v1.33/1.33c */
|
|
|
++ { 0xb1f, 7, "net5501" }, /* net5501 v1.32i */
|
|
|
++};
|
|
|
++
|
|
|
++static bool __init net5501_present(void)
|
|
|
++{
|
|
|
++ int i;
|
|
|
++ unsigned char *rombase, *bios;
|
|
|
++ bool found = false;
|
|
|
++
|
|
|
++ rombase = ioremap(BIOS_REGION_BASE, BIOS_REGION_SIZE - 1);
|
|
|
++ if (!rombase) {
|
|
|
++ printk(KERN_ERR "%s: failed to get rombase\n", KBUILD_MODNAME);
|
|
|
++ return found;
|
|
|
++ }
|
|
|
++
|
|
|
++ bios = rombase + 0x20; /* null terminated */
|
|
|
++
|
|
|
++ if (memcmp(bios, "comBIOS", 7))
|
|
|
++ goto unmap;
|
|
|
++
|
|
|
++ for (i = 0; i < ARRAY_SIZE(boards); i++) {
|
|
|
++ unsigned char *model = rombase + boards[i].offset;
|
|
|
++
|
|
|
++ if (!memcmp(model, boards[i].sig, boards[i].len)) {
|
|
|
++ printk(KERN_INFO "%s: system is recognized as \"%s\"\n",
|
|
|
++ KBUILD_MODNAME, model);
|
|
|
++
|
|
|
++ found = true;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++ }
|
|
|
++
|
|
|
++unmap:
|
|
|
++ iounmap(rombase);
|
|
|
++ return found;
|
|
|
++}
|
|
|
++
|
|
|
++static int __init net5501_init(void)
|
|
|
++{
|
|
|
++ if (!is_geode())
|
|
|
++ return 0;
|
|
|
++
|
|
|
++ if (!net5501_present())
|
|
|
++ return 0;
|
|
|
++
|
|
|
++ register_net5501();
|
|
|
++
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++
|
|
|
++module_init(net5501_init);
|
|
|
++
|
|
|
++MODULE_AUTHOR("Philip Prindeville <[email protected]>");
|
|
|
++MODULE_DESCRIPTION("Soekris net5501 System Setup");
|
|
|
++MODULE_LICENSE("GPL");
|
|
|
+diff --git a/drivers/leds/leds-net5501.c b/drivers/leds/leds-net5501.c
|
|
|
+deleted file mode 100644
|
|
|
+index 0555d47..0000000
|
|
|
+--- a/drivers/leds/leds-net5501.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,97 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Soekris board support code
|
|
|
+- *
|
|
|
+- * Copyright (C) 2008-2009 Tower Technologies
|
|
|
+- * Written by Alessandro Zummo <[email protected]>
|
|
|
+- *
|
|
|
+- * 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 <linux/module.h>
|
|
|
+-
|
|
|
+-#include <asm/geode.h>
|
|
|
+-
|
|
|
+-static const 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);
|
|
|
+-
|
|
|
+-MODULE_LICENSE("GPL");
|
|
|
+--- a/drivers/leds/Kconfig 2012-01-29 23:22:59.487891522 -0700
|
|
|
++++ b/drivers/leds/Kconfig 2012-02-03 10:33:39.650202054 -0700
|
|
|
+@@ -89,16 +89,6 @@ 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_TRIGGERS
|
|
|
+- depends on X86 && 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 LEDS_CLASS
|
|
|
+--- a/drivers/leds/Makefile 2012-01-29 23:22:59.487891522 -0700
|
|
|
++++ b/drivers/leds/Makefile 2012-02-03 10:33:24.468430696 -0700
|
|
|
+@@ -14,7 +14,6 @@ obj-$(CONFIG_LEDS_MIKROTIK_RB532) += led
|
|
|
+ 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_COBALT_QUBE) += leds-cobalt-qube.o
|
|
|
+ obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o
|