diff options
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.patch | 361 |
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 |