/* * @file mst_ctrl.c * @brief MST stop control node * Copyright (c) 2015, Samsung Electronics Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Mar 9, 2016, limit the length of string to 1 byte: "0" or "1"*/ #define MST_CTRL_CMD_LEN ((size_t)1) extern void mst_ctrl_of_mst_hw_onoff(bool on); ssize_t mst_ctrl_write(struct file *file, const char __user *buffer, size_t size, loff_t *offset) { unsigned long mode; char *string; if (size == 0) return 0; printk(KERN_ERR " %s\n", __FUNCTION__); /* size includes space for NULL, so size will be "number of buffer char. + 1" */ string = kmalloc(MST_CTRL_CMD_LEN + 1, GFP_KERNEL); if (string == NULL) { printk(KERN_ERR "%s failed kmalloc\n", __func__); return 0; } if (copy_from_user(string, buffer, MST_CTRL_CMD_LEN) != 0) { printk(KERN_ERR "%s failed copy_from_user\n", __func__); kfree(string); return 0; } string[MST_CTRL_CMD_LEN] = '\0'; if (kstrtoul(string, 0, &mode)) { memset(string, 0, MST_CTRL_CMD_LEN); kfree(string); return 0; }; memset(string, 0, MST_CTRL_CMD_LEN); kfree(string); printk(KERN_ERR "id: %d\n", (int)mode); switch (mode) { case 1: printk(KERN_ERR " %s -> Notify secure world that NFS starts.\n", __FUNCTION__); mst_ctrl_of_mst_hw_onoff(0); printk(KERN_ERR " %s -> nfc_status is on / mst_status is off.\n", __FUNCTION__); break; case 0: printk(KERN_ERR " %s -> Notify secure world that NFS ends.\n", __FUNCTION__); mst_ctrl_of_mst_hw_onoff(1); printk(KERN_ERR " %s -> nfc_status is off.\n", __FUNCTION__); break; default: printk(KERN_ERR " %s -> Invalid mst operations\n", __FUNCTION__); break; } return size; } static int mst_ctrl_read(struct seq_file *m, void *v) { return 0; } static int mst_ctrl_open(struct inode *inode, struct file *filp) { return single_open(filp, mst_ctrl_read, NULL); } long mst_ctrl_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { /* * Switch according to the ioctl called */ switch (cmd) { case 1: printk(KERN_ERR " %s -> [ioctl] Notify secure world that NFS starts.\n", __FUNCTION__); mst_ctrl_of_mst_hw_onoff(0); printk(KERN_ERR " %s -> [ioctl] nfc_status is on / mst_status is off.\n", __FUNCTION__); break; case 0: printk(KERN_ERR " %s -> [ioctl] Notify secure world that NFS ends.\n", __FUNCTION__); mst_ctrl_of_mst_hw_onoff(1); printk(KERN_ERR " %s -> [ioctl] nfc_status is off.\n", __FUNCTION__); break; default: printk(KERN_ERR " %s -> [ioctl] Invalid mst ctrl operations\n", __FUNCTION__); return -1; break; } return 0; } const struct file_operations mst_ctrl_fops = { .open = mst_ctrl_open, .release = single_release, .read = seq_read, .write = mst_ctrl_write, .unlocked_ioctl = mst_ctrl_ioctl, };