/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2010-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.
 */

#ifndef __INPUT_SYSTEM_2400_PRIVATE_H_INCLUDED__
#define __INPUT_SYSTEM_2400_PRIVATE_H_INCLUDED__

#include "input_system_public.h"

#include "device_access.h"

#include "assert_support.h"

STORAGE_CLASS_INPUT_SYSTEM_C void input_system_reg_store(
    const input_system_ID_t			ID,
    const hrt_address			reg,
    const hrt_data				value)
{
	assert(ID < N_INPUT_SYSTEM_ID);
	assert(INPUT_SYSTEM_BASE[ID] != (hrt_address)-1);
	ia_css_device_store_uint32(INPUT_SYSTEM_BASE[ID] + reg * sizeof(hrt_data),
				   value);
	return;
}

STORAGE_CLASS_INPUT_SYSTEM_C hrt_data input_system_reg_load(
    const input_system_ID_t			ID,
    const hrt_address			reg)
{
	assert(ID < N_INPUT_SYSTEM_ID);
	assert(INPUT_SYSTEM_BASE[ID] != (hrt_address)-1);
	return ia_css_device_load_uint32(INPUT_SYSTEM_BASE[ID] + reg * sizeof(
					     hrt_data));
}

STORAGE_CLASS_INPUT_SYSTEM_C void receiver_reg_store(
    const rx_ID_t				ID,
    const hrt_address			reg,
    const hrt_data				value)
{
	assert(ID < N_RX_ID);
	assert(RX_BASE[ID] != (hrt_address)-1);
	ia_css_device_store_uint32(RX_BASE[ID] + reg * sizeof(hrt_data), value);
	return;
}

STORAGE_CLASS_INPUT_SYSTEM_C hrt_data receiver_reg_load(
    const rx_ID_t				ID,
    const hrt_address			reg)
{
	assert(ID < N_RX_ID);
	assert(RX_BASE[ID] != (hrt_address)-1);
	return ia_css_device_load_uint32(RX_BASE[ID] + reg * sizeof(hrt_data));
}

STORAGE_CLASS_INPUT_SYSTEM_C void receiver_port_reg_store(
    const rx_ID_t				ID,
    const enum mipi_port_id			port_ID,
    const hrt_address			reg,
    const hrt_data				value)
{
	assert(ID < N_RX_ID);
	assert(port_ID < N_MIPI_PORT_ID);
	assert(RX_BASE[ID] != (hrt_address)-1);
	assert(MIPI_PORT_OFFSET[port_ID] != (hrt_address)-1);
	ia_css_device_store_uint32(RX_BASE[ID] + MIPI_PORT_OFFSET[port_ID] + reg *
				   sizeof(hrt_data), value);
	return;
}

STORAGE_CLASS_INPUT_SYSTEM_C hrt_data receiver_port_reg_load(
    const rx_ID_t				ID,
    const enum mipi_port_id			port_ID,
    const hrt_address			reg)
{
	assert(ID < N_RX_ID);
	assert(port_ID < N_MIPI_PORT_ID);
	assert(RX_BASE[ID] != (hrt_address)-1);
	assert(MIPI_PORT_OFFSET[port_ID] != (hrt_address)-1);
	return ia_css_device_load_uint32(RX_BASE[ID] + MIPI_PORT_OFFSET[port_ID] + reg *
					 sizeof(hrt_data));
}

STORAGE_CLASS_INPUT_SYSTEM_C void input_system_sub_system_reg_store(
    const input_system_ID_t			ID,
    const sub_system_ID_t			sub_ID,
    const hrt_address			reg,
    const hrt_data				value)
{
	assert(ID < N_INPUT_SYSTEM_ID);
	assert(sub_ID < N_SUB_SYSTEM_ID);
	assert(INPUT_SYSTEM_BASE[ID] != (hrt_address)-1);
	assert(SUB_SYSTEM_OFFSET[sub_ID] != (hrt_address)-1);
	ia_css_device_store_uint32(INPUT_SYSTEM_BASE[ID] + SUB_SYSTEM_OFFSET[sub_ID] +
				   reg * sizeof(hrt_data), value);
	return;
}

STORAGE_CLASS_INPUT_SYSTEM_C hrt_data input_system_sub_system_reg_load(
    const input_system_ID_t			ID,
    const sub_system_ID_t			sub_ID,
    const hrt_address			reg)
{
	assert(ID < N_INPUT_SYSTEM_ID);
	assert(sub_ID < N_SUB_SYSTEM_ID);
	assert(INPUT_SYSTEM_BASE[ID] != (hrt_address)-1);
	assert(SUB_SYSTEM_OFFSET[sub_ID] != (hrt_address)-1);
	return ia_css_device_load_uint32(INPUT_SYSTEM_BASE[ID] +
					 SUB_SYSTEM_OFFSET[sub_ID] + reg * sizeof(hrt_data));
}

#endif /* __INPUT_SYSTEM_PRIVATE_H_INCLUDED__ */
