aboutsummaryrefslogtreecommitdiff
path: root/kernel/ethosu_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/ethosu_buffer.c')
-rw-r--r--kernel/ethosu_buffer.c45
1 files changed, 24 insertions, 21 deletions
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 @@ static void ethosu_buffer_destroy(struct kref *kref)
{
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 @@ static int ethosu_buffer_mmap(struct file *file,
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 @@ static long ethosu_buffer_ioctl(struct file *file,
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 @@ static long ethosu_buffer_ioctl(struct file *file,
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 @@ static long ethosu_buffer_ioctl(struct file *file,
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 @@ static long ethosu_buffer_ioctl(struct file *file,
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 @@ int ethosu_buffer_create(struct ethosu_device *edev,
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 @@ int ethosu_buffer_create(struct ethosu_device *edev,
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;
}