69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2018-2021 Arm Technology (China) Co., Ltd. All rights reserved. */
|
|
|
|
/**
|
|
* @file aipu_io.c
|
|
* Implementations of AIPU IO R/W API
|
|
*/
|
|
|
|
#include "aipu_io.h"
|
|
|
|
int init_aipu_ioregion(struct device *dev, struct io_region *region, u64 phys_base, u32 size)
|
|
{
|
|
int ret = 0;
|
|
|
|
if ((!size) || (!dev) || (!region)) {
|
|
dev_dbg(dev, "invalid input args size/dev/region!");
|
|
goto fail;
|
|
}
|
|
|
|
if (!request_mem_region(phys_base, size, "aipu")) {
|
|
dev_err(dev, "request IO region failed");
|
|
goto fail;
|
|
}
|
|
|
|
region->kern = ioremap(phys_base, size);
|
|
if (!region->kern) {
|
|
dev_err(dev, "ioremap failed");
|
|
goto fail;
|
|
}
|
|
|
|
region->phys = phys_base;
|
|
region->size = size;
|
|
|
|
/* success */
|
|
goto finish;
|
|
|
|
fail:
|
|
dev_err(dev, "init IO region [0x%llx, 0x%llx] failed",
|
|
phys_base, phys_base + size - 1);
|
|
ret = -EINVAL;
|
|
|
|
finish:
|
|
return ret;
|
|
}
|
|
|
|
void deinit_aipu_ioregion(struct io_region *region)
|
|
{
|
|
if (region && region->kern) {
|
|
iounmap(region->kern);
|
|
release_mem_region(region->phys, region->size);
|
|
region->kern = NULL;
|
|
region->phys = 0;
|
|
region->size = 0;
|
|
}
|
|
}
|
|
|
|
u32 aipu_read32(struct io_region *region, int offset)
|
|
{
|
|
if (region && region->kern && (offset < region->size))
|
|
return readl((void __iomem *)((unsigned long)(region->kern) + offset));
|
|
return -EINVAL;
|
|
}
|
|
|
|
void aipu_write32(struct io_region *region, int offset, unsigned int data)
|
|
{
|
|
if (region && region->kern && (offset < region->size))
|
|
return writel((u32)data, (void __iomem *)((unsigned long)(region->kern) + offset));
|
|
}
|