/*
 * Copyright (C) 2016 Freescale Semiconductor, Inc.
 * Copyright 2017-2019 NXP
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

/*!
 * File containing client-side RPC functions for the PAD service. These
 * functions are ported to clients that communicate to the SC.
 *
 * @addtogroup PAD_SVC
 * @{
 */

/* Includes */

#include <sci/sci_types.h>
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/svc/pad/sci_pad_api.h>
#include <sci/sci_rpc.h>
#include "sci_pad_rpc.h"
#include <stdlib.h>

/* Local Defines */

/* Local Types */

/* Local Functions */

sc_err_t sc_pad_set_mux(sc_ipc_t ipc, sc_pad_t pad,
	uint8_t mux, sc_pad_config_t config, sc_pad_iso_t iso)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_MUX);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_U8(&msg, 2U) = U8(mux);
	RPC_U8(&msg, 3U) = U8(config);
	RPC_U8(&msg, 4U) = U8(iso);
	RPC_SIZE(&msg) = 3U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_mux(sc_ipc_t ipc, sc_pad_t pad,
	uint8_t *mux, sc_pad_config_t *config, sc_pad_iso_t *iso)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_MUX);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	if (mux != NULL)
	    *mux = RPC_U8(&msg, 0U);

	if (config != NULL)
	    *config = RPC_U8(&msg, 1U);

	if (iso != NULL)
	    *iso = RPC_U8(&msg, 2U);

	return (sc_err_t)result;
}

sc_err_t sc_pad_set_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t ctrl)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP);
	RPC_U32(&msg, 0U) = U32(ctrl);
	RPC_U16(&msg, 4U) = U16(pad);
	RPC_SIZE(&msg) = 3U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_gp(sc_ipc_t ipc, sc_pad_t pad, uint32_t *ctrl)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	if (ctrl != NULL)
	    *ctrl = RPC_U32(&msg, 0U);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_set_wakeup(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_wakeup_t wakeup)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_WAKEUP);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_U8(&msg, 2U) = U8(wakeup);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_wakeup(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_wakeup_t *wakeup)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_WAKEUP);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	if (wakeup != NULL)
	    *wakeup = RPC_U8(&msg, 0U);

	return (sc_err_t)result;
}

sc_err_t sc_pad_set_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t mux,
	sc_pad_config_t config, sc_pad_iso_t iso, uint32_t ctrl,
	sc_pad_wakeup_t wakeup)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_ALL);
	RPC_U32(&msg, 0U) = U32(ctrl);
	RPC_U16(&msg, 4U) = U16(pad);
	RPC_U8(&msg, 6U) = U8(mux);
	RPC_U8(&msg, 7U) = U8(config);
	RPC_U8(&msg, 8U) = U8(iso);
	RPC_U8(&msg, 9U) = U8(wakeup);
	RPC_SIZE(&msg) = 4U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_all(sc_ipc_t ipc, sc_pad_t pad, uint8_t *mux,
	sc_pad_config_t *config, sc_pad_iso_t *iso, uint32_t *ctrl,
	sc_pad_wakeup_t *wakeup)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_ALL);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	if (ctrl != NULL)
	    *ctrl = RPC_U32(&msg, 0U);

	result = RPC_R8(&msg);
	if (mux != NULL)
	    *mux = RPC_U8(&msg, 4U);

	if (config != NULL)
	    *config = RPC_U8(&msg, 5U);

	if (iso != NULL)
	    *iso = RPC_U8(&msg, 6U);

	if (wakeup != NULL)
	    *wakeup = RPC_U8(&msg, 7U);

	return (sc_err_t)result;
}

sc_err_t sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, uint32_t val)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET);
	RPC_U32(&msg, 0U) = U32(val);
	RPC_U16(&msg, 4U) = U16(pad);
	RPC_SIZE(&msg) = 3U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, uint32_t *val)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	if (val != NULL)
	    *val = RPC_U32(&msg, 0U);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_set_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_28fdsoi_dse_t dse, sc_pad_28fdsoi_ps_t ps)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_U8(&msg, 2U) = U8(dse);
	RPC_U8(&msg, 3U) = U8(ps);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_gp_28fdsoi(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_28fdsoi_dse_t *dse, sc_pad_28fdsoi_ps_t *ps)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	if (dse != NULL)
	    *dse = RPC_U8(&msg, 0U);

	if (ps != NULL)
	    *ps = RPC_U8(&msg, 1U);

	return (sc_err_t)result;
}

sc_err_t sc_pad_set_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_28fdsoi_dse_t dse, sc_bool_t hys, sc_pad_28fdsoi_pus_t pus,
	sc_bool_t pke, sc_bool_t pue)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI_HSIC);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_U8(&msg, 2U) = U8(dse);
	RPC_U8(&msg, 3U) = U8(pus);
	RPC_U8(&msg, 4U) = B2U8(hys);
	RPC_U8(&msg, 5U) = B2U8(pke);
	RPC_U8(&msg, 6U) = B2U8(pue);
	RPC_SIZE(&msg) = 3U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_gp_28fdsoi_hsic(sc_ipc_t ipc, sc_pad_t pad,
	sc_pad_28fdsoi_dse_t *dse, sc_bool_t *hys, sc_pad_28fdsoi_pus_t *pus,
	sc_bool_t *pke, sc_bool_t *pue)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI_HSIC);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	if (dse != NULL)
	    *dse = RPC_U8(&msg, 0U);

	if (pus != NULL)
	    *pus = RPC_U8(&msg, 1U);

	if (hys != NULL)
	    *hys = U2B(RPC_U8(&msg, 2U));

	if (pke != NULL)
	    *pke = U2B(RPC_U8(&msg, 3U));

	if (pue != NULL)
	    *pue = U2B(RPC_U8(&msg, 4U));

	return (sc_err_t)result;
}

sc_err_t sc_pad_set_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad,
	uint8_t compen, sc_bool_t fastfrz, uint8_t rasrcp, uint8_t rasrcn,
	sc_bool_t nasrc_sel, sc_bool_t psw_ovr)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_SET_GP_28FDSOI_COMP);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_U8(&msg, 2U) = U8(compen);
	RPC_U8(&msg, 3U) = U8(rasrcp);
	RPC_U8(&msg, 4U) = U8(rasrcn);
	RPC_U8(&msg, 5U) = B2U8(fastfrz);
	RPC_U8(&msg, 6U) = B2U8(nasrc_sel);
	RPC_U8(&msg, 7U) = B2U8(psw_ovr);
	RPC_SIZE(&msg) = 3U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	return (sc_err_t)result;
}

sc_err_t sc_pad_get_gp_28fdsoi_comp(sc_ipc_t ipc, sc_pad_t pad,
	uint8_t *compen, sc_bool_t *fastfrz, uint8_t *rasrcp, uint8_t *rasrcn,
	sc_bool_t *nasrc_sel, sc_bool_t *compok, uint8_t *nasrc, sc_bool_t *psw_ovr)
{
	sc_rpc_msg_t msg;
	uint8_t result;

	RPC_VER(&msg) = SC_RPC_VERSION;
	RPC_SVC(&msg) = U8(SC_RPC_SVC_PAD);
	RPC_FUNC(&msg) = U8(PAD_FUNC_GET_GP_28FDSOI_COMP);
	RPC_U16(&msg, 0U) = U16(pad);
	RPC_SIZE(&msg) = 2U;

	sc_call_rpc(ipc, &msg, SC_FALSE);

	result = RPC_R8(&msg);
	if (compen != NULL)
	    *compen = RPC_U8(&msg, 0U);

	if (rasrcp != NULL)
	    *rasrcp = RPC_U8(&msg, 1U);

	if (rasrcn != NULL)
	    *rasrcn = RPC_U8(&msg, 2U);

	if (nasrc != NULL)
	    *nasrc = RPC_U8(&msg, 3U);

	if (fastfrz != NULL)
	    *fastfrz = U2B(RPC_U8(&msg, 4U));

	if (nasrc_sel != NULL)
	    *nasrc_sel = U2B(RPC_U8(&msg, 5U));

	if (compok != NULL)
	    *compok = U2B(RPC_U8(&msg, 6U));

	if (psw_ovr != NULL)
	    *psw_ovr = U2B(RPC_U8(&msg, 7U));

	return (sc_err_t)result;
}

/**@}*/

