kernel-brax3-ubuntu-touch/drivers/misc/mediatek/apusys/midware/2.0/mdw_ioctl.c
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

62 lines
1.1 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2021 MediaTek Inc.
*/
#include <linux/slab.h>
#include <linux/uaccess.h>
#include "mdw_ioctl.h"
#include "mdw_cmn.h"
long mdw_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
int ret = 0;
unsigned int usize = 0;
void *kdata = NULL;
struct mdw_fpriv *mpriv = filp->private_data;
/* allocate for user data */
usize = _IOC_SIZE(cmd);
kdata = kzalloc(usize, GFP_KERNEL);
if (!kdata)
return -ENOMEM;
/* copy from user data */
if (cmd & IOC_IN) {
if (copy_from_user(kdata, (void __user *)arg, usize)) {
ret = -EFAULT;
goto out;
}
}
switch (cmd) {
case APU_MDW_IOCTL_HANDSHAKE:
ret = mdw_hs_ioctl(mpriv, kdata);
break;
case APU_MDW_IOCTL_MEM:
ret = mdw_mem_ioctl(mpriv, kdata);
break;
case APU_MDW_IOCTL_CMD:
ret = mdw_cmd_ioctl(mpriv, kdata);
break;
case APU_MDW_IOCTL_UTIL:
ret = mdw_util_ioctl(mpriv, kdata);
break;
default:
ret = -EFAULT;
goto out;
}
/* copy to user data */
if (cmd & IOC_OUT) {
if (copy_to_user((void __user *)arg, kdata, usize)) {
ret = -EFAULT;
goto out;
}
}
out:
kfree(kdata);
return ret;
}