platform/x86: intel_scu_ipcutil: Convert to use new SCU IPC API
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 16 Apr 2020 08:15:39 +0000 (11:15 +0300)
committerLee Jones <lee.jones@linaro.org>
Fri, 24 Apr 2020 10:17:41 +0000 (11:17 +0100)
Convert the IPC util to use the new SCU IPC API where the SCU IPC
instance is passed to the functions.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
drivers/platform/x86/intel_scu_ipcutil.c

index 8afe6fa..b7c10c1 100644 (file)
@@ -22,6 +22,9 @@
 
 static int major;
 
+struct intel_scu_ipc_dev *scu;
+static DEFINE_MUTEX(scu_lock);
+
 /* IOCTL commands */
 #define        INTE_SCU_IPC_REGISTER_READ      0
 #define INTE_SCU_IPC_REGISTER_WRITE    1
@@ -52,12 +55,12 @@ static int scu_reg_access(u32 cmd, struct scu_ipc_data  *data)
 
        switch (cmd) {
        case INTE_SCU_IPC_REGISTER_READ:
-               return intel_scu_ipc_readv(data->addr, data->data, count);
+               return intel_scu_ipc_dev_readv(scu, data->addr, data->data, count);
        case INTE_SCU_IPC_REGISTER_WRITE:
-               return intel_scu_ipc_writev(data->addr, data->data, count);
+               return intel_scu_ipc_dev_writev(scu, data->addr, data->data, count);
        case INTE_SCU_IPC_REGISTER_UPDATE:
-               return intel_scu_ipc_update_register(data->addr[0],
-                                                   data->data[0], data->mask);
+               return intel_scu_ipc_dev_update(scu, data->addr[0], data->data[0],
+                                               data->mask);
        default:
                return -ENOTTY;
        }
@@ -91,8 +94,40 @@ static long scu_ipc_ioctl(struct file *fp, unsigned int cmd,
        return 0;
 }
 
+static int scu_ipc_open(struct inode *inode, struct file *file)
+{
+       int ret = 0;
+
+       /* Only single open at the time */
+       mutex_lock(&scu_lock);
+       if (scu) {
+               ret = -EBUSY;
+               goto unlock;
+       }
+
+       scu = intel_scu_ipc_dev_get();
+       if (!scu)
+               ret = -ENODEV;
+
+unlock:
+       mutex_unlock(&scu_lock);
+       return ret;
+}
+
+static int scu_ipc_release(struct inode *inode, struct file *file)
+{
+       mutex_lock(&scu_lock);
+       intel_scu_ipc_dev_put(scu);
+       scu = NULL;
+       mutex_unlock(&scu_lock);
+
+       return 0;
+}
+
 static const struct file_operations scu_ipc_fops = {
        .unlocked_ioctl = scu_ipc_ioctl,
+       .open = scu_ipc_open,
+       .release = scu_ipc_release,
 };
 
 static int __init ipc_module_init(void)