/* * @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 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; printk(KERN_ERR " %s\n", __FUNCTION__); /* size includes space for NULL, so size will be "number of buffer char. + 1" */ string = kmalloc(size * sizeof(char), GFP_KERNEL); if (string == NULL) { printk(KERN_ERR "%s failed kmalloc\n", __func__); return size; } memcpy(string, buffer, size-1); string[size-1] = '\0'; if(kstrtoul(string, 0, &mode)) { kfree(string); return size; }; 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; } *offset += size; 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, };