summaryrefslogtreecommitdiff
path: root/target/linux/etrax-2.6/patches/cris/020-syscalls.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/etrax-2.6/patches/cris/020-syscalls.patch')
-rw-r--r--target/linux/etrax-2.6/patches/cris/020-syscalls.patch361
1 files changed, 361 insertions, 0 deletions
diff --git a/target/linux/etrax-2.6/patches/cris/020-syscalls.patch b/target/linux/etrax-2.6/patches/cris/020-syscalls.patch
new file mode 100644
index 0000000..f735ce7
--- /dev/null
+++ b/target/linux/etrax-2.6/patches/cris/020-syscalls.patch
@@ -0,0 +1,361 @@
+diff -urN linux-2.6.19.2.orig/include/asm-cris/unistd.h linux-2.6.19.2/include/asm/unistd.h
+--- linux-2.6.19.2.orig/include/asm-cris/unistd.h 2007-06-16 23:59:11.000000000 +0200
++++ linux-2.6.19.2/include/asm/unistd.h 2007-06-17 03:43:10.000000000 +0200
+@@ -325,9 +325,52 @@
+ #define __NR_getcpu 318
+ #define __NR_epoll_pwait 319
+
++#ifdef CONFIG_ETRAX_GPIO
++ #ifdef CONFIG_FOXBONE
++ #define __NR_gpiosetbits 320
++ #define __NR_gpioclearbits 321
++ #define __NR_gpiosetdir 322
++ #define __NR_gpiotogglebit 323
++ #define __NR_gpiogetbits 324
++ #define __NR_foxboneread 325
++ #define __NR_foxbonewrite 326
++ #define __NR_foxbonebulkread 327
++ #define __NR_foxbonebulkwrite 328
++ #define __NR_foxbonereset 329
++ #define __NR_foxboneintreg 330
++ #define __NR_foxboneintcheck 331
++ #define __NR_foxboneintwait 332
++ #define NR_syscalls 333
++
++ #else
++ #define __NR_gpiosetbits 320
++ #define __NR_gpioclearbits 321
++ #define __NR_gpiosetdir 322
++ #define __NR_gpiotogglebit 323
++ #define __NR_gpiogetbits 324
++
++ #define NR_syscalls 325
++ #endif
++#else
++ #ifdef CONFIG_FOXBONE
++ #define __NR_foxboneread 320
++ #define __NR_foxbonewrite 321
++ #define __NR_foxbonebulkread 322
++ #define __NR_foxbonebulkwrite 323
++ #define __NR_foxboneintreg 324
++ #define __NR_foxboneintcheck 325
++ #define __NR_foxboneintwait 326
++
++ #define NR_syscalls 327
++
++ #else
++
++ #define NR_syscalls 320
++ #endif
++#endif
++
+ #ifdef __KERNEL__
+
+-#define NR_syscalls 320
+
+ #include <asm/arch/unistd.h>
+
+--- linux-2.6.19.2.orig/include/linux/gpio_syscalls.h 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.19.2/include/linux/gpio_syscalls.h 2007-06-17 03:44:49.000000000 +0200
+@@ -0,0 +1,75 @@
++#ifndef __LINUX_SYSCALL_GPIO
++#define __LINUX_SYSCALL_GPIO
++#include <linux/autoconf.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <asm/unistd.h>
++
++// port defines
++#define PORTA 'A'
++#define PORTB 'B'
++#define PORTG 'G'
++
++//direction defines
++#define DIRIN 'I'
++#define DIROUT 'O'
++
++// pin defines for PORTG
++#define PG0 (1<<0)
++#define PG1 (1<<1)
++#define PG2 (1<<2)
++#define PG3 (1<<3)
++#define PG4 (1<<4)
++#define PG5 (1<<5)
++#define PG6 (1<<6)
++#define PG7 (1<<7)
++#define PG8 (1<<8)
++#define PG9 (1<<9)
++#define PG10 (1<<10)
++#define PG11 (1<<11)
++#define PG12 (1<<12)
++#define PG13 (1<<13)
++#define PG14 (1<<14)
++#define PG15 (1<<15)
++#define PG16 (1<<16)
++#define PG17 (1<<17)
++#define PG18 (1<<18)
++#define PG19 (1<<19)
++#define PG20 (1<<20)
++#define PG21 (1<<21)
++#define PG22 (1<<22)
++#define PG23 (1<<23)
++#define PG24 (1<<24)
++
++#define PG8_15 0x00ff00
++#define PG16_23 0xff0000
++
++
++// pin defines for PORTA
++#define PA0 (1<<0)
++#define PA1 (1<<1)
++#define PA2 (1<<2)
++#define PA3 (1<<3)
++#define PA4 (1<<4)
++#define PA5 (1<<5)
++#define PA6 (1<<6)
++#define PA7 (1<<7)
++
++// pin defines for PORTB
++#define PB0 (1<<0)
++#define PB1 (1<<1)
++#define PB2 (1<<2)
++#define PB3 (1<<3)
++#define PB4 (1<<4)
++#define PB5 (1<<5)
++#define PB6 (1<<6)
++#define PB7 (1<<7)
++
++int errno;
++_syscall2(void, gpiosetbits, unsigned char, port, unsigned int, bits);
++_syscall2(void, gpioclearbits, unsigned char, port, unsigned int, bits);
++_syscall3(void, gpiosetdir, unsigned char, port, unsigned char, dir, unsigned int, bits);
++_syscall2(void, gpiotogglebit, unsigned char, port, unsigned int, bits);
++_syscall2(unsigned int, gpiogetbits, unsigned char, port, unsigned int, bits);
++
++#endif
+--- linux-2.6.19.2.orig/arch/cris/arch-v10/kernel/entry.S 2007-06-16 23:58:14.000000000 +0200
++++ linux-2.6.19.2/arch/cris/arch-v10/kernel/entry.S 2007-06-17 03:48:21.000000000 +0200
+@@ -1200,6 +1200,23 @@
+ .long sys_move_pages
+ .long sys_getcpu
+ .long sys_epoll_pwait
++#ifdef CONFIG_ETRAX_GPIO
++ .long sys_gpiosetbits
++ .long sys_gpioclearbits
++ .long sys_gpiosetdir
++ .long sys_gpiotogglebit
++ .long sys_gpiogetbits
++#endif
++#ifdef CONFIG_FOXBONE
++ .long sys_foxboneread
++ .long sys_foxbonewrite
++ .long sys_foxbonebulkread
++ .long sys_foxbonebulkwrite
++ .long sys_foxbonereset
++ .long sys_foxboneintreg
++ .long sys_foxboneintcheck
++ .long sys_foxboneintwait
++#endif
+
+ /*
+ * NOTE!! This doesn't have to be exact - we just have
+diff -urN linux-2.6.19.2.orig/arch/cris/arch-v10/drivers/gpio_syscalls.c linux-2.6.19.2/arch/cris/arch-v10/drivers/gpio_syscalls.c
+--- linux-2.6.19.2.orig/arch/cris/arch-v10/drivers/gpio_syscalls.c 1970-01-01 01:00:00.000000000 +0100
++++ linux-2.6.19.2/arch/cris/arch-v10/drivers/gpio_syscalls.c 2007-06-17 04:09:15.000000000 +0200
+@@ -0,0 +1,192 @@
++
++#include <linux/autoconf.h>
++
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/ioport.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/fs.h>
++#include <linux/string.h>
++#include <linux/poll.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++
++#include <asm/uaccess.h>
++#include <linux/gpio_syscalls.h>
++
++#include <asm/etraxgpio.h>
++#include <asm/arch/svinto.h>
++#include <asm/io.h>
++#include <asm/system.h>
++#include <asm/irq.h>
++#include <asm/arch/io_interface_mux.h>
++
++#include <asm/unistd.h>
++
++
++extern int errno;
++
++
++asmlinkage void sys_gpiosetbits(unsigned char port, unsigned int bits){
++ switch(port){
++ case 'G':
++ case 'g':
++ *R_PORT_G_DATA = port_g_data_shadow |= bits;
++ break;
++
++ case 'A':
++ case 'a':
++ *R_PORT_PA_DATA = port_pa_data_shadow |= bits;
++ break;
++
++ case 'B':
++ case 'b':
++ *R_PORT_PB_DATA = port_pb_data_shadow |= bits;
++ break;
++
++ };
++};
++
++
++asmlinkage void sys_gpioclearbits(unsigned char port, unsigned int bits){
++ switch(port){
++ case 'G':
++ case 'g':
++ *R_PORT_G_DATA = port_g_data_shadow &= ~bits;
++ break;
++
++ case 'A':
++ case 'a':
++ *R_PORT_PA_DATA = port_pa_data_shadow &= ~bits;
++ break;
++
++ case 'B':
++ case 'b':
++ *R_PORT_PB_DATA = port_pb_data_shadow &= ~bits;
++ break;
++
++ };
++};
++
++asmlinkage void sys_gpiosetdir(unsigned char port, unsigned char dir, unsigned int bits){
++ if((dir=='I' )||(dir=='i')){
++ switch(port){
++ case 'G':
++ case 'g':
++ if(bits & (1<<0)){
++ genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g0dir);
++ };
++ if((bits & 0x0000FF00)==0x0000FF00){
++ genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g8_15dir);
++ };
++ if((bits & 0x00FF0000)==0x00FF0000){
++ genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g16_23dir);
++ };
++ if(bits & (1<<24)){
++ genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, g24dir);
++ };
++ *R_GEN_CONFIG = genconfig_shadow;
++ break;
++
++ case 'A':
++ case 'a':
++ *R_PORT_PA_DIR = port_pa_dir_shadow &= ~(bits & 0xff);
++ break;
++
++ case 'B':
++ case 'b':
++ *R_PORT_PB_DIR = port_pb_dir_shadow &= ~(bits & 0xff);
++ break;
++ };
++ } else if((dir=='O' )||(dir=='o')){
++ switch(port){
++ case 'G':
++ case 'g':
++ if(bits & (1<<0)){
++ genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g0dir);
++ };
++ if((bits & 0x0000FF00)==0x0000FF00){
++ genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g8_15dir);
++ };
++ if((bits & 0x00FF0000)==0x00FF0000){
++ genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g8_15dir);
++ };
++ if(bits & (1<<24)){
++ genconfig_shadow |= IO_MASK(R_GEN_CONFIG, g24dir);
++ };
++ *R_GEN_CONFIG = genconfig_shadow;
++ break;
++
++ case 'A':
++ case 'a':
++ *R_PORT_PA_DIR = port_pa_dir_shadow |= (bits & 0xff);
++ break;
++
++ case 'B':
++ case 'b':
++ *R_PORT_PB_DIR = port_pb_dir_shadow |= (bits & 0xff);
++ break;
++ };
++ };
++};
++
++
++asmlinkage void sys_gpiotogglebit(unsigned char port, unsigned int bits){
++ switch(port){
++ case 'G':
++ case 'g':
++ if(port_g_data_shadow & bits){
++ *R_PORT_G_DATA = port_g_data_shadow &= ~bits;
++ } else {
++ *R_PORT_G_DATA = port_g_data_shadow |= bits;
++ };
++ break;
++
++ case 'A':
++ case 'a':
++ if(*R_PORT_PA_DATA & bits){
++ *R_PORT_PA_DATA = port_pa_data_shadow &= ~(bits & 0xff);
++ } else {
++ *R_PORT_PA_DATA = port_pa_data_shadow |= (bits & 0xff);
++ };
++ break;
++
++ case 'B':
++ case 'b':
++ if(*R_PORT_PB_DATA & bits){
++ *R_PORT_PB_DATA = port_pb_data_shadow &= ~(bits & 0xff);
++ } else {
++ *R_PORT_PB_DATA = port_pb_data_shadow |= (bits & 0xff);
++ };
++ break;
++
++ };
++};
++
++
++asmlinkage unsigned int sys_gpiogetbits(unsigned char port, unsigned int bits){
++ unsigned int data = 0;
++ switch(port){
++ case 'G':
++ case 'g':
++ data = *R_PORT_G_DATA;
++ break;
++
++ case 'A':
++ case 'a':
++ data = *R_PORT_PA_DATA;
++ break;
++
++ case 'B':
++ case 'b':
++ data = *R_PORT_PB_DATA;
++ break;
++
++ };
++ data &= bits;
++ return data;
++};
++
++
+Only in linux-2.6.19.2/arch/cris/arch-v10/drivers/: gpio_syscalls.c
+diff linux-2.6.19.2.orig/arch/cris/arch-v10/drivers/Makefile linux-2.6.19.2/arch/cris/arch-v10/drivers/Makefile
+8a9
+> obj-$(CONFIG_ETRAX_GPIO) += gpio_syscalls.o