add first steps for led driver port to 2.6
authorWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 10 Sep 2005 22:08:13 +0000 (22:08 +0000)
committerWaldemar Brodkorb <mail@waldemar-brodkorb.de>
Sat, 10 Sep 2005 22:08:13 +0000 (22:08 +0000)
SVN-Revision: 1896

openwrt/target/linux/linux-2.6/Makefile
openwrt/target/linux/linux-2.6/broadcom.mk
openwrt/target/linux/linux-2.6/config/brcm
openwrt/target/linux/linux-2.6/patches/brcm/002-diag_led.patch [new file with mode: 0644]

index 72a0e7896e7213d7fe077edc623d0cbc33fd2572..dfaf1f48ce8a45ae668832fc2136b8e7ac87d2ea 100644 (file)
@@ -6,7 +6,7 @@ include ../rules.mk
 
 KERNEL:=2.6
 LINUX_VERSION:=2.6.12.5
-LINUX_KERNEL_MD5SUM:=x
+LINUX_KERNEL_MD5SUM:=076f0dc714112c764c790fbaef19e228
 LINUX_SITE=http://www.fi.kernel.org/pub/linux/kernel/v2.6 \
            http://www.fr.kernel.org/pub/linux/kernel/v2.6 \
            http://www.kernel.org/pub/linux/kernel/v2.6 \
index 02b5f165e4509ceab3a7a80b282f664f3fb4f7fa..758cf063d549666a8a7411a6a6b65f0d97ced5f5 100644 (file)
@@ -1,2 +1,6 @@
 # $Id$
-
+#
+# broadcom specific kmod packages
+$(eval $(call KMOD_template,DIAG,diag,\
+     $(MODULES_DIR)/kernel/drivers/net/diag/diag.ko \
+))
index 456881baa97030c05294f2b078fb9f3d7bcae3bd..ba33c215839fb92b4165290e8545ec392cfbe93a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.12.5
-# Sun Sep  4 13:44:48 2005
+# Sat Sep 10 19:04:19 2005
 #
 CONFIG_MIPS=y
 # CONFIG_MIPS64 is not set
@@ -561,6 +561,7 @@ CONFIG_BT_HCIUART_BCSP_TXCRC=y
 # CONFIG_BT_HCIVHCI is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
+CONFIG_DIAG_LED=m
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=m
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 (file)
index 0000000..a0f36e6
--- /dev/null
@@ -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);