// SPDX-License-Identifier: GPL-2.0
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#include "ia_css_device_access.h"
#include <type_support.h>   /* for uint*, size_t */
#include <system_local.h>   /* for hrt_address */
#include <ia_css_env.h>     /* for ia_css_hw_access_env */
#include <assert_support.h> /* for assert */

static struct ia_css_hw_access_env my_env;

void
ia_css_device_access_init(const struct ia_css_hw_access_env *env)
{
	assert(env);

	my_env = *env;
}

uint8_t
ia_css_device_load_uint8(const hrt_address addr)
{
	return my_env.load_8(addr);
}

uint16_t
ia_css_device_load_uint16(const hrt_address addr)
{
	return my_env.load_16(addr);
}

uint32_t
ia_css_device_load_uint32(const hrt_address addr)
{
	return my_env.load_32(addr);
}

uint64_t
ia_css_device_load_uint64(const hrt_address addr)
{
	assert(0);

	(void)addr;
	return 0;
}

void
ia_css_device_store_uint8(const hrt_address addr, const uint8_t data)
{
	my_env.store_8(addr, data);
}

void
ia_css_device_store_uint16(const hrt_address addr, const uint16_t data)
{
	my_env.store_16(addr, data);
}

void
ia_css_device_store_uint32(const hrt_address addr, const uint32_t data)
{
	my_env.store_32(addr, data);
}

void
ia_css_device_store_uint64(const hrt_address addr, const uint64_t data)
{
	assert(0);

	(void)addr;
	(void)data;
}

void
ia_css_device_load(const hrt_address addr, void *data, const size_t size)
{
	my_env.load(addr, data, (uint32_t)size);
}

void
ia_css_device_store(const hrt_address addr, const void *data, const size_t size)
{
	my_env.store(addr, data, (uint32_t)size);
}
