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_buffer.c b/kernel/ethosu_buffer.c
index a83a95a..0fcbf3b 100644
--- a/kernel/ethosu_buffer.c
+++ b/kernel/ethosu_buffer.c
@@ -89,21 +89,24 @@
 {
 	struct ethosu_buffer *buf =
 		container_of(kref, struct ethosu_buffer, kref);
+	struct device *dev = buf->dev;
+	struct rproc *rproc = rproc_get_by_child(dev);
 
-	dev_info(buf->edev->dev, "Buffer destroy. buf=0x%pK\n", buf);
+	dev_info(dev, "Buffer destroy. buf=0x%pK\n", buf);
 
-	dma_free_coherent(buf->dev, buf->capacity, buf->cpu_addr,
+	dma_free_coherent(rproc->dev.parent, buf->capacity, buf->cpu_addr,
 			  buf->dma_addr);
 
-	devm_kfree(buf->edev->dev, buf);
+	devm_kfree(dev, buf);
 }
 
 static int ethosu_buffer_release(struct inode *inode,
 				 struct file *file)
 {
 	struct ethosu_buffer *buf = file->private_data;
+	struct device *dev = buf->dev;
 
-	dev_info(buf->edev->dev, "Buffer release. file=0x%pK, buf=0x%pK\n",
+	dev_info(dev, "Buffer release. file=0x%pK, buf=0x%pK\n",
 		 file, buf);
 
 	ethosu_buffer_put(buf);
@@ -115,12 +118,13 @@
 			      struct vm_area_struct *vma)
 {
 	struct ethosu_buffer *buf = file->private_data;
+	struct device *dev = buf->dev;
 	int ret;
 
-	dev_info(buf->edev->dev, "Buffer mmap. file=0x%pK, buf=0x%pK\n",
+	dev_info(dev, "Buffer mmap. file=0x%pK, buf=0x%pK\n",
 		 file, buf);
 
-	ret = dma_mmap_coherent(buf->edev->dev, vma, buf->cpu_addr,
+	ret = dma_mmap_coherent(dev, vma, buf->cpu_addr,
 				buf->dma_addr, buf->capacity);
 
 	return ret;
@@ -131,14 +135,15 @@
 				unsigned long arg)
 {
 	struct ethosu_buffer *buf = file->private_data;
+	struct device *dev = buf->dev;
 	void __user *udata = (void __user *)arg;
 	int ret = -EINVAL;
 
-	ret = mutex_lock_interruptible(&buf->edev->mutex);
+	ret = device_lock_interruptible(dev);
 	if (ret)
 		return ret;
 
-	dev_info(buf->edev->dev,
+	dev_info(dev,
 		 "Buffer ioctl. file=0x%pK, buf=0x%pK, cmd=0x%x, arg=%lu\n",
 		 file, buf, cmd, arg);
 
@@ -149,7 +154,7 @@
 		if (copy_from_user(&uapi, udata, sizeof(uapi)))
 			break;
 
-		dev_info(buf->edev->dev,
+		dev_info(dev,
 			 "Buffer ioctl: Buffer set. size=%u, offset=%u\n",
 			 uapi.size, uapi.offset);
 
@@ -162,7 +167,7 @@
 		uapi.size = buf->size;
 		uapi.offset = buf->offset;
 
-		dev_info(buf->edev->dev,
+		dev_info(dev,
 			 "Buffer ioctl: Buffer get. size=%u, offset=%u\n",
 			 uapi.size, uapi.offset);
 
@@ -173,40 +178,38 @@
 		break;
 	}
 	default: {
-		dev_err(buf->edev->dev, "Invalid ioctl. cmd=%u, arg=%lu",
+		dev_err(dev, "Invalid ioctl. cmd=%u, arg=%lu",
 			cmd, arg);
 		break;
 	}
 	}
 
-	mutex_unlock(&buf->edev->mutex);
+	device_unlock(dev);
 
 	return ret;
 }
 
-int ethosu_buffer_create(struct ethosu_device *edev,
+int ethosu_buffer_create(struct device *dev,
 			 size_t capacity)
 {
-	struct rproc *rproc = rproc_get_by_child(edev->dev);
-	struct device *dev = rproc->dev.parent;
+	struct rproc *rproc = rproc_get_by_child(dev);
 	struct ethosu_buffer *buf;
 	int ret = -ENOMEM;
 
 	if (!capacity)
 		return -EINVAL;
 
-	buf = devm_kzalloc(edev->dev, sizeof(*buf), GFP_KERNEL);
+	buf = devm_kzalloc(dev, sizeof(*buf), GFP_KERNEL);
 	if (!buf)
 		return -ENOMEM;
 
-	buf->edev = edev;
 	buf->dev = dev;
 	buf->capacity = capacity;
 	buf->offset = 0;
 	buf->size = 0;
 	kref_init(&buf->kref);
 
-	buf->cpu_addr = dma_alloc_coherent(dev, capacity,
+	buf->cpu_addr = dma_alloc_coherent(rproc->dev.parent, capacity,
 					   &buf->dma_addr, GFP_KERNEL);
 	if (!buf->cpu_addr)
 		goto free_buf;
@@ -219,7 +222,7 @@
 	buf->file = fget(ret);
 	fput(buf->file);
 
-	dev_info(buf->edev->dev,
+	dev_info(dev,
 		 "Buffer create. file=0x%pK, fd=%d, buf=0x%pK, capacity=%zu, cpu_addr=0x%pK, dma_addr=0x%llx, phys_addr=0x%llx\n",
 		 buf->file, ret, buf, capacity, buf->cpu_addr, buf->dma_addr,
 		 virt_to_phys(buf->cpu_addr));
@@ -227,11 +230,11 @@
 	return ret;
 
 free_dma:
-	dma_free_coherent(buf->edev->dev, buf->capacity, buf->cpu_addr,
+	dma_free_coherent(rproc->dev.parent, buf->capacity, buf->cpu_addr,
 			  buf->dma_addr);
 
 free_buf:
-	devm_kfree(buf->edev->dev, buf);
+	devm_kfree(dev, buf);
 
 	return ret;
 }