static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret; ioctl_cmd *io_cmd = (ioctl_cmd *)arg; switch ( cmd ) { case IOC_GPIO_VAL_SET: ret = gpio_set(io_cmd->no, io_cmd->val); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[cmd %x val %d][ret:%d]\n", __FILE__, __LINE__, io_cmd->no, io_cmd->val, ret); return -EINVAL; } break; case IOC_GPIO_VAL_GET: ret = gpio_get(io_cmd->no, &(io_cmd->val)); if (ret != 0) { printk("%s:%d !!!tuner_ioctl get error[cmd %x val %d][ret:%d]\n", __FILE__, __LINE__, io_cmd->no, io_cmd->val, ret); return -EINVAL; } break; case IOC_VREG_ENABLE: ret = tuner_vreg_enable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]¥n", __FILE__, __LINE__, ret); return -EINVAL; } break; case IOC_VREG_DISABLE: ret = tuner_vreg_disable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]¥n", __FILE__, __LINE__, ret); return -EINVAL; } break; default: /* NOTE: returning a fault code here could cause trouble * in buggy userspace code. Some old kernel bugs returned * zero in this case, and userspace code might accidentally * have depended on that bug. */ return -ENOTTY; } return 0; }
static long tuner_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret; ioctl_cmd io_cmd_work; ioctl_cmd *io_cmd = &io_cmd_work; if (copy_from_user(io_cmd, (ioctl_cmd*)arg, sizeof(ioctl_cmd))) { printk("%s:%d !!!tuner_ioctl copy_from_user error %08x\n", __FILE__, __LINE__, (unsigned int)arg); return -EFAULT; } switch ( cmd ) { case IOC_GPIO_VAL_SET: ret = gpio_set(io_cmd->id, io_cmd->val); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[cmd %x val %d][ret:%d]\n", __FILE__, __LINE__, io_cmd->id, io_cmd->val, ret); return -EINVAL; } break; case IOC_GPIO_VAL_GET: ret = gpio_get(io_cmd->id, &(io_cmd->val)); if (ret != 0) { printk("%s:%d !!!tuner_ioctl get error[cmd %x val %d][ret:%d]\n", __FILE__, __LINE__, io_cmd->id, io_cmd->val, ret); return -EINVAL; } if (copy_to_user((ioctl_cmd*)arg, io_cmd, sizeof(ioctl_cmd))) { printk("%s:%d !!!tuner_ioctl copy_to_user error %08x\n", __FILE__, __LINE__, (unsigned int)arg); return -EFAULT; } break; case IOC_VREG_ENABLE: ret = tuner_vreg_enable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]\n", __FILE__, __LINE__, ret); return -EINVAL; } break; case IOC_VREG_DISABLE: ret = tuner_vreg_disable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]\n", __FILE__, __LINE__, ret); return -EINVAL; } break; case IOC_CLK_ENABLE: ret = tuner_clk_enable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]\n", __FILE__, __LINE__, ret); return -EINVAL; } break; case IOC_CLK_DISABLE: ret = tuner_clk_disable(); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]\n", __FILE__, __LINE__, ret); return -EINVAL; } break; case IOC_HW_REV_GET: ret = hw_revision_get(&(io_cmd->val)); if (ret != 0) { printk("%s:%d !!!tuner_ioctl set error[ret:%d]\n", __FILE__, __LINE__, ret); return -EINVAL; } if (copy_to_user((ioctl_cmd*)arg, io_cmd, sizeof(ioctl_cmd))) { printk("%s:%d !!!tuner_ioctl copy_to_user error %08x\n", __FILE__, __LINE__, (unsigned int)arg); return -EFAULT; } break; default: /* NOTE: returning a fault code here could cause trouble * in buggy userspace code. Some old kernel bugs returned * zero in this case, and userspace code might accidentally * have depended on that bug. */ return -ENOTTY; } return 0; }