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_capabilities.c b/kernel/ethosu_capabilities.c
index 57db452..8611edf 100644
--- a/kernel/ethosu_capabilities.c
+++ b/kernel/ethosu_capabilities.c
@@ -41,9 +41,10 @@
  * Functions
  ****************************************************************************/
 
-static inline int ethosu_capabilities_send(struct ethosu_capabilities *cap)
+static inline int ethosu_capabilities_send(struct ethosu_capabilities *cap,
+					   struct ethosu_mailbox *mailbox)
 {
-	return ethosu_mailbox_capabilities_request(&cap->edev->mailbox,
+	return ethosu_mailbox_capabilities_request(mailbox,
 						   &cap->msg);
 }
 
@@ -59,16 +60,17 @@
 	complete(&cap->done);
 }
 
-void ethosu_capability_rsp(struct ethosu_device *edev,
+void ethosu_capability_rsp(struct ethosu_mailbox *mailbox,
 			   int msg_id,
 			   struct ethosu_core_msg_capabilities_rsp *rsp)
 {
+	struct device *dev = mailbox->dev;
 	struct ethosu_mailbox_msg *msg;
 	struct ethosu_capabilities *cap;
 
-	msg = ethosu_mailbox_find(&edev->mailbox, msg_id);
+	msg = ethosu_mailbox_find(mailbox, msg_id);
 	if (IS_ERR(msg)) {
-		dev_warn(edev->dev,
+		dev_warn(dev,
 			 "Id for capabilities msg not found. id=%d\n",
 			 msg_id);
 
@@ -98,36 +100,37 @@
 	complete(&cap->done);
 }
 
-int ethosu_capabilities_request(struct ethosu_device *edev,
+int ethosu_capabilities_request(struct device *dev,
+				struct ethosu_mailbox *mailbox,
 				struct ethosu_uapi_device_capabilities *uapi)
 {
 	struct ethosu_capabilities *cap;
 	int ret;
 	int timeout;
 
-	cap = devm_kzalloc(edev->dev, sizeof(struct ethosu_capabilities),
+	cap = devm_kzalloc(dev, sizeof(struct ethosu_capabilities),
 			   GFP_KERNEL);
 	if (!cap)
 		return -ENOMEM;
 
-	cap->edev = edev;
+	cap->dev = dev;
 	cap->uapi = uapi;
 	init_completion(&cap->done);
 	cap->msg.fail = ethosu_capabilities_fail;
 
-	ret = ethosu_mailbox_register(&cap->edev->mailbox, &cap->msg);
+	ret = ethosu_mailbox_register(mailbox, &cap->msg);
 	if (ret < 0)
 		goto kfree;
 
-	dev_info(edev->dev, "Capabilities create. Id=%d, handle=0x%p\n",
+	dev_info(dev, "Capabilities create. Id=%d, handle=0x%p\n",
 		 cap->msg.id, cap);
 
-	ret = ethosu_capabilities_send(cap);
+	ret = ethosu_capabilities_send(cap, mailbox);
 	if (0 != ret)
 		goto deregister;
 
 	/* Unlock the mutex before going to block on the condition */
-	mutex_unlock(&edev->mutex);
+	device_unlock(dev);
 
 	/* wait for response to arrive back */
 	timeout = wait_for_completion_timeout(&cap->done,
@@ -135,10 +138,10 @@
 						      CAPABILITIES_RESP_TIMEOUT_MS));
 
 	/* take back the mutex before resuming to do anything */
-	mutex_lock(&edev->mutex);
+	device_lock(dev);
 
 	if (0 == timeout) {
-		dev_warn(edev->dev, "Capabilities response timeout");
+		dev_warn(dev, "Capabilities response timeout");
 		ret = -ETIME;
 		goto deregister;
 	}
@@ -149,12 +152,12 @@
 	}
 
 deregister:
-	ethosu_mailbox_deregister(&cap->edev->mailbox, &cap->msg);
+	ethosu_mailbox_deregister(mailbox, &cap->msg);
 
 kfree:
-	dev_info(cap->edev->dev, "Capabilities destroy. Id=%d, handle=0x%p\n",
+	dev_info(dev, "Capabilities destroy. Id=%d, handle=0x%p\n",
 		 cap->msg.id, cap);
-	devm_kfree(cap->edev->dev, cap);
+	devm_kfree(dev, cap);
 
 	return ret;
 }