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 --- 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 +#include +#include +#include + +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + + +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