// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2019 Amlogic, Inc. All rights reserved.
 *
 */

#include "vad_hw.h"

void vad_set_ram_coeff(int len, int *params)
{
	int i, ctrl_v;

	for (i = 0; i < len; i++) {
		ctrl_v = 0x1 << 31 | (i << 0);
		vad_write(VAD_LUT_WR, params[i]);
		vad_write(VAD_LUT_CTRL, ctrl_v);
	}
}

/* parameters for downsample and emphasis filter */
void vad_set_de_params(int len, int *params)
{
	int i;

	for (i = 0; i < len; i++)
		vad_write(VAD_FIR_CTRL + i, params[i]);
}

/* Power detection */
void vad_set_pwd(void)
{
	/* frame for 32 ms */
	vad_write(VAD_FRAME_CTRL0,
		  0x2 << 30 |
		  0x1 << 24 |
		  0x1 << 16);

	vad_write(VAD_FRAME_CTRL1, 0x00000d65);
	vad_write(VAD_FRAME_CTRL2, 0xd00103ff);
}

void vad_set_cep(void)
{
	vad_write(VAD_CEP_CTRL0, 0x11050000);
	vad_write(VAD_CEP_CTRL1, 0x0000001b);
	vad_write(VAD_CEP_CTRL2, 0xc001fd);
	vad_write(VAD_CEP_CTRL3, 0x137f0000);
	vad_write(VAD_CEP_CTRL4, 0x186d0000);
	vad_write(VAD_CEP_CTRL5, 0xfd00f61);
	vad_write(VAD_DEC_CTRL, 0x10030001);
}

void vad_set_src(int src)
{
	audiobus_update_bits(EE_AUDIO_TOVAD_CTRL0,
		0x7 << 12,
		src << 12);
}

void vad_set_in(void)
{
	/* two channel enable */
	vad_write(VAD_IN_SEL0, 0x00000001);
	vad_write(VAD_IN_SEL1, 0x00000002);

	vad_write(VAD_TO_DDR, 0xa0000719);
}

void vad_set_enable(bool enable)
{
	audiobus_update_bits(EE_AUDIO_TOVAD_CTRL0,
		0x1 << 31 | 0x1 << 30,
		enable << 31 | 0x1 << 30);

	if (enable) {
		vad_write(VAD_TOP_CTRL0, 0x7ff);
		vad_write(VAD_TOP_CTRL0, 0x0);

		vad_write(VAD_TOP_CTRL1, 0xff);
		vad_write(VAD_TOP_CTRL1, 0x0);

		vad_update_bits(VAD_TOP_CTRL0,
			0xfff << 20,
			1 << 31 | /* vad_en */
			1 << 30 | /* dec_fir_en */
			1 << 29 | /* pre_emp_en */
			1 << 28 | /* pre_ram_en */
			1 << 27 | /* frame_his_en */
			1 << 23 | /* ceps_ceps_en */
			1 << 22 | /* ceps_spec_en */
			0 << 20   /* two_channel_en */
		);
	} else {
		vad_write(VAD_TOP_CTRL0, 0x0);

		vad_write(VAD_TOP_CTRL1, 0x0);
	}
}

void vad_force_clk_to_oscin(bool force)
{
	audiobus_update_bits(EE_AUDIO_CLK_VAD_CTRL, 0x1 << 30, force << 30);
}

void vad_set_two_channel_en(bool en)
{
	/* two_channel_en */
	vad_update_bits(VAD_TOP_CTRL0, 0x1 << 20, en << 20);
}
