static int dsp_twch_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int ret; switch (cmd) { case TWCH_IOCTL_MKDEV: { char name[TNM_LEN]; if (copy_from_user(name, (void __user *)arg, TNM_LEN)) return -EFAULT; name[TNM_LEN-1] = '\0'; ret = dsp_mkdev(name); break; } case TWCH_IOCTL_RMDEV: { char name[TNM_LEN]; if (copy_from_user(name, (void __user *)arg, TNM_LEN)) return -EFAULT; name[TNM_LEN-1] = '\0'; ret = dsp_rmdev(name); break; } case TWCH_IOCTL_TADD: { struct omap_dsp_taddinfo ti; if (copy_from_user(&ti, (void __user *)arg, sizeof(ti))) return -EFAULT; ret = dsp_tadd_minor(ti.minor, ti.taskadr); break; } case TWCH_IOCTL_TDEL: ret = dsp_tdel_minor(arg); break; case TWCH_IOCTL_TKILL: ret = dsp_tkill_minor(arg); break; default: return -ENOIOCTLCMD; } return ret; }
static int dsp_twch_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { static DECLARE_MUTEX(ioctl_sem); int ret; if (down_interruptible(&ioctl_sem)) return -ERESTARTSYS; switch (cmd) { case OMAP_DSP_TWCH_IOCTL_MKDEV: { char name[OMAP_DSP_TNM_LEN]; if (copy_from_user(name, (void *)arg, OMAP_DSP_TNM_LEN)) { ret = -EFAULT; goto up_out; } name[OMAP_DSP_TNM_LEN-1] = '\0'; ret = dsp_mkdev(name); break; } case OMAP_DSP_TWCH_IOCTL_RMDEV: { char name[OMAP_DSP_TNM_LEN]; if (copy_from_user(name, (void *)arg, OMAP_DSP_TNM_LEN)) { ret = -EFAULT; goto up_out; } name[OMAP_DSP_TNM_LEN-1] = '\0'; ret = dsp_rmdev(name); break; } case OMAP_DSP_TWCH_IOCTL_TADD: { struct omap_dsp_taddinfo ti; if (copy_from_user(&ti, (void *)arg, sizeof(ti))) { ret = -EFAULT; goto up_out; } ret = dsp_tadd(ti.minor, ti.taskadr); break; } case OMAP_DSP_TWCH_IOCTL_TDEL: ret = dsp_tdel(arg); break; case OMAP_DSP_TWCH_IOCTL_TKILL: ret = dsp_tkill(arg); break; default: ret = -ENOIOCTLCMD; } up_out: up(&ioctl_sem); return ret; }