Break circulare dependency on struct ethosu_device

The 'struct ethosu_device' has been passed as argument to classes.
This creates a circular dependency dependency and it gives all
classes full visibility to all resources in the device struct. This
patch removes the circular dependency.

Using device_lock() and device_unlock() to for synchronization.

Change-Id: I8322e6530c72d7bd67f48f411b4f14b612be2706
diff --git a/kernel/ethosu_network.c b/kernel/ethosu_network.c
index 251b181..d64d6d7 100644
--- a/kernel/ethosu_network.c
+++ b/kernel/ethosu_network.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020,2022 Arm Limited.
+ * Copyright 2020,2022-2023 Arm Limited and/or its affiliates
  *
  * This program is free software and is provided to you under the terms of the
  * GNU General Public License version 2 as published by the Free Software
@@ -67,21 +67,23 @@
 {
 	struct ethosu_network *net =
 		container_of(kref, struct ethosu_network, kref);
+	struct device *dev = net->dev;
 
-	dev_info(net->edev->dev, "Network destroy. net=0x%pK\n", net);
+	dev_info(dev, "Network destroy. net=0x%pK\n", net);
 
 	if (net->buf != NULL)
 		ethosu_buffer_put(net->buf);
 
-	devm_kfree(net->edev->dev, net);
+	devm_kfree(dev, net);
 }
 
 static int ethosu_network_release(struct inode *inode,
 				  struct file *file)
 {
 	struct ethosu_network *net = file->private_data;
+	struct device *dev = net->dev;
 
-	dev_info(net->edev->dev, "Network release. file=0x%pK, net=0x%pK\n",
+	dev_info(dev, "Network release. file=0x%pK, net=0x%pK\n",
 		 file, net);
 
 	ethosu_network_put(net);
@@ -94,14 +96,15 @@
 				 unsigned long arg)
 {
 	struct ethosu_network *net = file->private_data;
+	struct device *dev = net->dev;
 	void __user *udata = (void __user *)arg;
 	int ret = -EINVAL;
 
-	ret = mutex_lock_interruptible(&net->edev->mutex);
+	ret = device_lock_interruptible(net->dev);
 	if (ret)
 		return ret;
 
-	dev_info(net->edev->dev,
+	dev_info(dev,
 		 "Network ioctl: file=0x%pK, net=0x%pK, cmd=0x%x, arg=0x%lx\n",
 		 file, net, cmd, arg);
 
@@ -112,11 +115,13 @@
 		if (copy_from_user(&uapi, udata, sizeof(uapi)))
 			break;
 
-		dev_info(net->edev->dev,
+		dev_info(dev,
 			 "Network ioctl: Network info. net=0x%pK\n",
 			 net);
 
-		ret = ethosu_network_info_request(net, &uapi);
+		ret =
+			ethosu_network_info_request(dev, net->mailbox, net,
+						    &uapi);
 		if (ret)
 			break;
 
@@ -129,36 +134,38 @@
 		if (copy_from_user(&uapi, udata, sizeof(uapi)))
 			break;
 
-		dev_info(net->edev->dev,
+		dev_info(dev,
 			 "Network ioctl: Inference. ifm_fd=%u, ofm_fd=%u\n",
 			 uapi.ifm_fd[0], uapi.ofm_fd[0]);
 
-		ret = ethosu_inference_create(net->edev, net, &uapi);
+		ret = ethosu_inference_create(dev, net->mailbox, net, &uapi);
 		break;
 	}
 	default: {
-		dev_err(net->edev->dev, "Invalid ioctl. cmd=%u, arg=%lu",
+		dev_err(dev, "Invalid ioctl. cmd=%u, arg=%lu",
 			cmd, arg);
 		break;
 	}
 	}
 
-	mutex_unlock(&net->edev->mutex);
+	device_unlock(net->dev);
 
 	return ret;
 }
 
-int ethosu_network_create(struct ethosu_device *edev,
+int ethosu_network_create(struct device *dev,
+			  struct ethosu_mailbox *mailbox,
 			  struct ethosu_uapi_network_create *uapi)
 {
 	struct ethosu_network *net;
 	int ret = -ENOMEM;
 
-	net = devm_kzalloc(edev->dev, sizeof(*net), GFP_KERNEL);
+	net = devm_kzalloc(dev, sizeof(*net), GFP_KERNEL);
 	if (!net)
 		return -ENOMEM;
 
-	net->edev = edev;
+	net->dev = dev;
+	net->mailbox = mailbox;
 	net->buf = NULL;
 	kref_init(&net->kref);
 
@@ -180,7 +187,7 @@
 	net->file = fget(ret);
 	fput(net->file);
 
-	dev_info(edev->dev,
+	dev_info(dev,
 		 "Network create. file=0x%pK, fd=%d, net=0x%pK, buf=0x%pK, index=%u",
 		 net->file, ret, net, net->buf, net->index);
 
@@ -191,7 +198,7 @@
 		ethosu_buffer_put(net->buf);
 
 free_net:
-	devm_kfree(edev->dev, net);
+	devm_kfree(dev, net);
 
 	return ret;
 }