sdk-hwV1.3/lichee/linux-4.9/drivers/aipu/src/aipu_io.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));
}