static ssize_t gpio_read(struct file *file, char *buf, size_t count, loff_t *ppos) { u32 val; switch (MINOR(file->f_dentry->d_inode->i_rdev)) { case 0: val = si_gpioin(gpio_sih); break; case 1: val = si_gpioout(gpio_sih, 0, 0, GPIO_APP_PRIORITY); break; case 2: val = si_gpioouten(gpio_sih, 0, 0, GPIO_APP_PRIORITY); break; case 3: val = si_gpiocontrol(gpio_sih, 0, 0, GPIO_APP_PRIORITY); break; default: return -ENODEV; } if (put_user(val, (u32 *) buf)) return -EFAULT; return sizeof(val); }
static ssize_t gpio_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { u32 val; if (get_user(val, (u32 *) buf)) return -EFAULT; switch (MINOR(file->f_dentry->d_inode->i_rdev)) { case 0: return -EACCES; case 1: si_gpioout(gpio_sih, ~0, val, GPIO_APP_PRIORITY); break; case 2: si_gpioouten(gpio_sih, ~0, val, GPIO_APP_PRIORITY); break; case 3: si_gpiocontrol(gpio_sih, ~0, val, GPIO_APP_PRIORITY); break; default: return -ENODEV; } return sizeof(val); }
int gpio_request(unsigned int gpio, const char *label) { int ret; mask |= (1<<gpio); ret = si_gpioreserve(gpio_sih, (1<<gpio), GPIO_APP_PRIORITY); DBG("%s: gpio %d label %s mask 0x%x reserve 0x%x\n", __FUNCTION__, gpio, label, mask, ret); ret = si_gpiocontrol(gpio_sih, (1<<gpio), 0, GPIO_APP_PRIORITY); DBG("%s: si_gpiocontrol 0x%x\n", __FUNCTION__, ret); /* clear pulldown */ ret = si_gpiopull(gpio_sih, 1/*pulldown*/, (1<<gpio), 0); DBG("%s: si_gpiopull (down) 0x%x\n", __FUNCTION__, ret); /* Set pullup */ ret = si_gpiopull(gpio_sih, 0/*pullup*/, (1<<gpio), (1<<gpio)); DBG("%s: si_gpiopull (up) 0x%x\n", __FUNCTION__, ret); return 0; }