123 lines
3.2 KiB
C
123 lines
3.2 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include <asm/arch/secure_apb.h>
|
|
#include <amlogic/auge_sound.h>
|
|
#include <asm/io.h>
|
|
#include <common.h>
|
|
|
|
void update_bits(unsigned int reg, unsigned int mask, unsigned int val)
|
|
{
|
|
unsigned int tmp, orig;
|
|
|
|
orig = readl(reg);
|
|
tmp = orig & ~mask;
|
|
tmp |= val & mask;
|
|
writel(tmp, reg);
|
|
}
|
|
|
|
static void earcrx_cmdc_set_clk(void)
|
|
{
|
|
/* clock gate */
|
|
update_bits(EE_AUDIO_CLK_GATE_EN1, 0x1 << 6, 0x1 << 6);
|
|
/* cmdc clock, 10m */
|
|
writel(0x86000031, EE_AUDIO_EARCRX_CMDC_CLK_CTRL);
|
|
}
|
|
|
|
static void earcrx_pll_refresh(void)
|
|
{
|
|
/* pll tdc mode */
|
|
update_bits(EARCRX_PLL_CTRL3,
|
|
0x1 << 15, 0x1 << 15);
|
|
|
|
/* pll self reset */
|
|
update_bits(EARCRX_PLL_CTRL0,
|
|
0x1 << 29, 0x1 << 29);
|
|
update_bits(EARCRX_PLL_CTRL0,
|
|
0x1 << 29, 0x0 << 29);
|
|
|
|
update_bits(EARCRX_PLL_CTRL3,
|
|
0x1 << 15, 0x0 << 15);
|
|
}
|
|
|
|
static void earcrx_cmdc_int_mask(void)
|
|
{
|
|
/* set irq mask */
|
|
writel((1 << 15) | /* idle2_int */
|
|
(1 << 14) | /* idle1_int */
|
|
(1 << 13) | /* disc2_int */
|
|
(1 << 12) | /* disc1_int */
|
|
(1 << 11) | /* earc_int */
|
|
(1 << 10) | /* hb_status_int */
|
|
(1 << 9) | /* losthb_int */
|
|
(1 << 8) | /* timeout_int */
|
|
(0 << 7) | /* status_ch_int */
|
|
(0 << 6) | /* int_rec_invalid_id */
|
|
(0 << 5) | /* int_rec_invalid_offset */
|
|
(0 << 4) | /* int_rec_unexp */
|
|
(0 << 3) | /* int_rec_ecc_err */
|
|
(0 << 2) | /* int_rec_parity_err */
|
|
(0 << 1) | /* int_recv_packet */
|
|
(0 << 0), /* int_rec_time_out */
|
|
EARCRX_CMDC_INT_MASK);
|
|
}
|
|
|
|
static void earcrx_cmdc_init(int version)
|
|
{
|
|
if (version == EARC_RX_ANA_V1) {
|
|
writel(0x1 << 31 | /* earcrx_en_d2a */
|
|
0x10 << 24 | /* earcrx_cmdcrx_reftrim */
|
|
0x8 << 20 | /* earcrx_idr_trim */
|
|
0x10 << 15 | /* earcrx_rterm_trim */
|
|
0x4 << 12 | /* earcrx_cmdctx_ack_hystrim */
|
|
0x10 << 7 | /* earcrx_cmdctx_ack_reftrim */
|
|
0x1 << 4 | /* earcrx_cmdcrx_rcfilter_sel */
|
|
0x4 << 0, /* earcrx_cmdcrx_hystrim */
|
|
EARCRX_ANA_CTRL0);
|
|
} else {
|
|
writel(0x1 << 31 | /* earcrx_en_d2a */
|
|
0x10 << 25 | /* earcrx_cmdcrx_reftrim */
|
|
0x10 << 20 | /* earcrx_idr_trim */
|
|
0x10 << 15 | /* earcrx_rterm_trim */
|
|
0x4 << 12 | /* earcrx_cmdctx_ack_hystrim */
|
|
0x10 << 7 | /* earcrx_cmdctx_ack_reftrim */
|
|
0x1 << 4 | /* earcrx_cmdcrx_rcfilter_sel */
|
|
0x4 << 0, /* earcrx_cmdcrx_hystrim */
|
|
EARCRX_ANA_CTRL0);
|
|
writel(0x1 << 11 | 0x1 << 10 | 0x8 << 4 | 0x8 << 0, EARCRX_ANA_CTRL1);
|
|
}
|
|
|
|
writel(0x2 << 20 | /* earcrx_pll_bias_adj */
|
|
0x4 << 16 | /* earcrx_pll_rou */
|
|
0x1 << 13, /* earcrx_pll_dco_sdm_e */
|
|
EARCRX_PLL_CTRL3);
|
|
|
|
writel(0x1 << 28 | /* earcrx_pll_en */
|
|
0x1 << 23 | /* earcrx_pll_dmacrx_sqout_rstn_sel */
|
|
0x1 << 10, /* earcrx_pll_n */
|
|
EARCRX_PLL_CTRL0);
|
|
|
|
/* eARC_RX_CONN_START Max time 200ms */
|
|
update_bits(EARC_RX_CMDC_VSM_CTRL1,
|
|
0xfffff << 12,
|
|
0x80 << 12
|
|
);
|
|
update_bits(EARC_RX_CMDC_VSM_CTRL0,
|
|
0x1 << 19,
|
|
0x1 << 19
|
|
);
|
|
}
|
|
|
|
void earcrx_init(int version)
|
|
{
|
|
/* cmdc init */
|
|
earcrx_cmdc_set_clk();
|
|
earcrx_pll_refresh();
|
|
earcrx_cmdc_init(version);
|
|
earcrx_cmdc_int_mask();
|
|
|
|
printf("%s done\n", __func__);
|
|
}
|