summaryrefslogtreecommitdiff
path: root/openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch
diff options
context:
space:
mode:
authorwbx <wbx@3c298f89-4303-0410-b956-a3cf2f4a3e73>2005-09-10 22:08:13 +0000
committerwbx <wbx@3c298f89-4303-0410-b956-a3cf2f4a3e73>2005-09-10 22:08:13 +0000
commita77d9445f2cd173c26c12c16ea77b171a5f4b25e (patch)
treed77b1bbeda0a48e36cfb56b296c1b5113f1cabbc /openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch
parentab76f37e5171c84788f66a150024b781ffd8d2c3 (diff)
add first steps for led driver port to 2.6
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@1896 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch')
-rw-r--r--openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch288
1 files changed, 288 insertions, 0 deletions
diff --git a/openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch b/openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch
new file mode 100644
index 0000000000..a0f36e669c
--- /dev/null
+++ b/openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch
@@ -0,0 +1,288 @@
+diff -Nur linux-2.6.12.5/drivers/net/Kconfig linux-2.6.12.5-diag/drivers/net/Kconfig
+--- linux-2.6.12.5/drivers/net/Kconfig 2005-08-15 02:20:18.000000000 +0200
++++ linux-2.6.12.5-diag/drivers/net/Kconfig 2005-09-10 23:08:53.209908656 +0200
+@@ -41,6 +41,11 @@
+ Instead of 'dummy', the devices will then be called 'dummy0',
+ 'dummy1' etc.
+
++config DIAG_LED
++ tristate "Led driver for Broadcom BCM97xx"
++ ---help---
++ Say m if you like the led to signal status of operation.
++
+ config BONDING
+ tristate "Bonding driver support"
+ depends on NETDEVICES
+diff -Nur linux-2.6.12.5/drivers/net/Makefile linux-2.6.12.5-diag/drivers/net/Makefile
+--- linux-2.6.12.5/drivers/net/Makefile 2005-08-15 02:20:18.000000000 +0200
++++ linux-2.6.12.5-diag/drivers/net/Makefile 2005-09-08 17:49:02.249278160 +0200
+@@ -1,6 +1,7 @@
+ #
+ # Makefile for the Linux network (ethercard) device drivers.
+ #
++obj-$(CONFIG_DIAG_LED) += diag/
+
+ ifeq ($(CONFIG_ISDN_PPP),y)
+ obj-$(CONFIG_ISDN) += slhc.o
+diff -Nur linux-2.6.12.5/drivers/net/diag/Makefile linux-2.6.12.5-diag/drivers/net/diag/Makefile
+--- linux-2.6.12.5/drivers/net/diag/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.12.5-diag/drivers/net/diag/Makefile 2005-09-10 19:45:26.596290216 +0200
+@@ -0,0 +1,5 @@
++#$Id$
++
++EXTRA_CFLAGS := -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER
++
++obj-$(CONFIG_DIAG_LED) += diag.o
+diff -Nur linux-2.6.12.5/drivers/net/diag/diag.c linux-2.6.12.5-diag/drivers/net/diag/diag.c
+--- linux-2.6.12.5/drivers/net/diag/diag.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.12.5-diag/drivers/net/diag/diag.c 2005-09-10 18:51:02.727849016 +0200
+@@ -0,0 +1,249 @@
++/*
++ * diag_led.c - replacement diag module
++ *
++ * Copyright (C) 2004 Mike Baker,
++ * Imre Kaloz <kaloz@dune.hu>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * $Id$
++ */
++
++/*
++ * ChangeLog:
++ * 2004/03/28 initial release
++ * 2004/08/26 asus & buffalo support added
++ * 2005/03/14 asus wl-500g deluxe and buffalo v2 support added
++ * 2005/04/13 added licensing informations
++ * 2005/04/18 base reset polarity off initial readings
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/sysctl.h>
++#include <asm/io.h>
++#include <typedefs.h>
++#include <bcmdevs.h>
++#include <sbutils.h>
++
++extern char * nvram_get(const char *name);
++static void *sbh;
++
++// v2.x - - - - -
++#define DIAG_GPIO (1<<1)
++#define DMZ_GPIO (1<<7)
++
++/*
++static void set_gpio(uint32 mask, uint32 value) {
++ sb_gpiocontrol(sbh,mask,0);
++ sb_gpioouten(sbh,mask,mask);
++ sb_gpioout(sbh,mask,value);
++}
++
++static void v2_set_diag(u8 state) {
++ set_gpio(DIAG_GPIO,state);
++}
++static void v2_set_dmz(u8 state) {
++ set_gpio(DMZ_GPIO,state);
++}
++*/
++
++/*
++// v1.x - - - - -
++#define LED_DIAG 0x13
++#define LED_DMZ 0x12
++
++static void v1_set_diag(u8 state) {
++ if (!state) {
++ *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DIAG)=0xFF;
++ } else {
++ *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DIAG);
++ }
++}
++static void v1_set_dmz(u8 state) {
++ if (!state) {
++ *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DMZ)=0xFF;
++ } else {
++ *(volatile u8*)(KSEG1ADDR(BCM4710_EUART)+LED_DMZ);
++ }
++}
++*/
++
++// - - - - -
++static void ignore(u8 ignored) {};
++
++// - - - - -
++#define BIT_DMZ 0x01
++#define BIT_DIAG 0x04
++
++void (*set_diag)(u8 state);
++void (*set_dmz)(u8 state);
++
++static unsigned int diag = 0;
++
++static void diag_change()
++{
++ set_diag(0xFF); // off
++ set_dmz(0xFF); // off
++
++ if(diag & BIT_DIAG)
++ set_diag(0x00); // on
++ if(diag & BIT_DMZ)
++ set_dmz(0x00); // on
++}
++
++static int proc_diag(ctl_table *table, int write, struct file *filp,
++ void *buffer, size_t *lenp, loff_t *ppos)
++{
++ int r;
++ r = proc_dointvec(table, write, filp, buffer, lenp, ppos);
++ if (write && !r) {
++ diag_change();
++ }
++ return r;
++}
++
++// - - - - -
++static unsigned char reset_gpio = 0;
++static unsigned char reset_polarity = 0;
++static unsigned int reset = 0;
++
++static int proc_reset(ctl_table *table, int write, struct file *filp,
++ void *buffer, size_t *lenp, loff_t *ppos)
++{
++
++ if (reset_gpio) {
++ sb_gpiocontrol(sbh,reset_gpio,reset_gpio);
++ sb_gpioouten(sbh,reset_gpio,0);
++ reset=!(sb_gpioin(sbh)&reset_gpio);
++
++ if (reset_polarity) reset=!reset;
++ } else {
++ reset=0;
++ }
++
++ return proc_dointvec(table, write, filp, buffer, lenp, ppos);
++}
++
++// - - - - -
++static struct ctl_table_header *diag_sysctl_header;
++
++static ctl_table sys_diag[] = {
++ {
++ ctl_name: 2000,
++ procname: "diag",
++ data: &diag,
++ maxlen: sizeof(diag),
++ mode: 0644,
++ proc_handler: proc_diag
++ },
++ {
++ ctl_name: 2001,
++ procname: "reset",
++ data: &reset,
++ maxlen: sizeof(reset),
++ mode: 0444,
++ proc_handler: proc_reset
++ },
++ { 0 }
++};
++
++static int __init diag_init()
++{
++ //char *buf;
++ u32 board_type;
++ sbh = sb_kattach();
++ sb_gpiosetcore(sbh);
++
++ board_type = sb_boardtype(sbh);
++ printk(KERN_INFO "diag boardtype: %08x\n",board_type);
++
++ set_diag=ignore;
++ set_dmz=ignore;
++
++ /*
++ buf=nvram_get("boardrev");
++ if (((board_type & 0xf00) == 0x400) && strcmp(buf,"0x10")) {
++ buf=nvram_get("boardtype")?:"";
++ if (!strcmp(buf,"bcm94710dev")) {
++ buf=nvram_get("boardnum")?:"";
++ if (!strcmp(buf,"42")) {
++ // wrt54g v1.x
++ set_diag=v1_set_diag;
++ set_dmz=v1_set_dmz;
++ reset_gpio=(1<<6);
++ }
++ if (!strcmp(buf,"asusX")) {
++ //asus wl-500g
++ reset_gpio=(1<<6);
++ }
++ }
++ if (!strcmp(buf,"bcm94710ap")) {
++ buf=nvram_get("boardnum")?:"";
++ if (!strcmp(buf,"42")) {
++ // buffalo
++ set_dmz=v2_set_dmz;
++ reset_gpio=(1<<4);
++ }
++ if (!strcmp(buf,"44")) {
++ //dell truemobile
++ set_dmz=v2_set_dmz;
++ reset_gpio=(1<<0);
++ }
++ }
++ } else {
++ buf=nvram_get("boardnum")?:"";
++ if (!strcmp(buf,"42")) {
++ //linksys
++ set_diag=v2_set_diag;
++ set_dmz=v2_set_dmz;
++ reset_gpio=(1<<6);
++ }
++ if (!strcmp(buf,"44")) {
++ //motorola
++ reset_gpio=(1<<5);
++ }
++ if (!strcmp(buf,"00")) {
++ //buffalo
++ reset_gpio=(1<<7);
++ }
++ if (!strcmp(buf,"45")) {
++ //wl-500g deluxe
++ reset_gpio=(1<<6);
++ }
++ }
++
++ */
++ sb_gpiocontrol(sbh,reset_gpio,reset_gpio);
++ sb_gpioouten(sbh,reset_gpio,0);
++ reset_polarity=!(sb_gpioin(sbh)&reset_gpio);
++
++ diag_sysctl_header = register_sysctl_table(sys_diag, 0);
++ diag_change();
++
++ return 0;
++}
++
++static void __exit diag_exit()
++{
++ unregister_sysctl_table(diag_sysctl_header);
++}
++
++MODULE_AUTHOR("openwrt.org");
++MODULE_LICENSE("GPL");
++
++module_init(diag_init);
++module_exit(diag_exit);