diff -Nru linux-2.6.26-officiel/drivers/char/Kconfig /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Kconfig --- linux-2.6.26-officiel/drivers/char/Kconfig 2008-07-13 23:51:29.000000000 +0200 +++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Kconfig 2008-09-26 14:44:59.000000000 +0200 @@ -1006,6 +1006,14 @@ tristate "NEC VR4100 series General-purpose I/O Unit support" depends on CPU_VR41XX +config GPIO_MPC8313 + tristate "mpc8313e gpio" + depends on PPC_MPC831x + select INPUT + default y + help + test + config RAW_DRIVER tristate "RAW driver (/dev/raw/rawN)" depends on BLOCK diff -Nru linux-2.6.26-officiel/drivers/char/Makefile /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Makefile --- linux-2.6.26-officiel/drivers/char/Makefile 2008-07-13 23:51:29.000000000 +0200 +++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/Makefile 2008-09-26 14:44:59.000000000 +0200 @@ -111,6 +111,8 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o obj-$(CONFIG_JS_RTC) += js-rtc.o + +obj-$(CONFIG_GPIO_MPC8313) += mpc8313e_gpio.o js-rtc-y = rtc.o # Files generated that shall be removed upon make clean diff -Nru linux-2.6.26-officiel/drivers/char/mpc8313e_gpio.c /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/mpc8313e_gpio.c --- linux-2.6.26-officiel/drivers/char/mpc8313e_gpio.c 1970-01-01 01:00:00.000000000 +0100 +++ /home/guilig/workspace/kernel-goobie-2.6.26/src/drivers/char/mpc8313e_gpio.c 2008-09-26 14:44:59.000000000 +0200 @@ -0,0 +1,127 @@ +/* linux/drivers/char/mpc8313e_gpio.c + + Allows a user space process to control the GPIO pins. + + +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Alexandre Coffignal "); +MODULE_DESCRIPTION("mpc8313e GPIO"); +MODULE_LICENSE("GPL"); + +static int major = 0; +struct gpio { + __be32 gpdir; + __be32 gpodr; + __be32 gpdat; + __be32 gpier; + __be32 gpimr; + __be32 gpicr; +} __attribute__ ((packed)); +static struct gpio *gpio_regs; + +static ssize_t mpc8313e_gpio_write(struct file *file, const char __user *data, size_t len, loff_t *ppos) +{ + unsigned m = iminor(file->f_path.dentry->d_inode); + size_t i; + int err = 0; + + for (i = 0; i < len; ++i) { + char c; + if (get_user(c, data + i)) + return -EFAULT; + /* set GPIO as output */ + setbits32(&gpio_regs->gpdir, 1 << (31 - m)); + clrbits32(&gpio_regs->gpodr, 1 << (31 - m)); + switch (c) { + case '0': + /*Set GPIO level */ + clrbits32(&gpio_regs->gpdat, 1 << (31 - m)); + break; + case '1': + /*Set GPIO level */ + setbits32(&gpio_regs->gpdat, 1 << (31 - m)); + break; + default: + printk(KERN_DEBUG "io%2d bad setting: chr<0x%2x>\n", + m, (int)c); + err++; + } + } + if (err) + return -EINVAL; + + return len; +} + +static ssize_t mpc8313e_gpio_read(struct file *file, char __user * buf, size_t len, loff_t * ppos) +{ + unsigned m = iminor(file->f_path.dentry->d_inode); + int value; + value=in_be32(&gpio_regs->gpdat)&(1 << (31 - m)); + if (value) + put_user(1, buf); + else + put_user(0, buf); + + return 0; + +} + +static int mpc8313e_gpio_open(struct inode *inode, struct file *file) +{ + return 0; +} + +static int mpc8313e_gpio_close(struct inode *inode, struct file *file) +{ + printk(KERN_DEBUG "close()\n"); + return 0; +} + +struct file_operations fops = +{ + .read = mpc8313e_gpio_read, + .write = mpc8313e_gpio_write, + .open = mpc8313e_gpio_open, + .release = mpc8313e_gpio_close /* correspond a close */ +}; + +static int __init mpc8313e_gpio_init(void) +{ + int ret; + + ret = register_chrdev(major, "gpio", &fops); + if(ret < 0) + { + printk(KERN_WARNING "Probleme sur le major\n"); + return ret; + } + + /* System I/O Configuration Register Low */ + gpio_regs = ioremap(get_immrbase() + 0xc00, 0x20); + if (!gpio_regs) + return -ENOMEM; + return 0; + +} + +static void __exit mpc8313e_gpio_cleanup(void) +{ + unregister_chrdev(major, "gpio"); +} + +module_init(mpc8313e_gpio_init); +module_exit(mpc8313e_gpio_cleanup); + +