blob: b5ec188cf395e7ed41a2c7ec54afc7a044797882 [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#include <linux/version.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/mm.h>
#include <linux/major.h>
#include <linux/platform_device.h>
#include <linux/mutex.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/delay.h>
#include <linux/arm-smccc.h>
#include <linux/slab.h>
#include <linux/dma-mapping.h>
#include <linux/highmem.h>
/* Local Include */
#include "hdmi_rx_repeater.h"
#include "hdmi_rx_drv.h"
#include "hdmi_rx_hw.h"
#include "hdmi_rx_wrapper.h"
/* FT trim flag:1-valid, 0-not valid */
bool rterm_trim_flag_t7;
/* FT trim value 4 bits */
u32 rterm_trim_val_t7;
/* for T7 */
static const u32 phy_misci_t7[][4] = {
/* 0x05 0x06 0x07 0x08 */
{ /* 24~45M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
{ /* 45~74.5M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
{ /* 77~155M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
{ /* 155~340M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
{ /* 340~525M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
{ /* 525~600M */
0x200773ff, 0x000c01c0, 0x0, 0x00000817,
},
};
static const u32 phy_dcha_t7[][4] = {
/* 0x09 0x0a 0x0b 0x0c */
{ /* 24~45M */
0x17270888, 0x45ff4b58, 0x01ff28d4, 0x817,
},
{ /* 45~74.5M */
0x17270888, 0x45ff4b58, 0x01ff28d4, 0x817,
},
{ /* 77~155M */
0x17270fff, 0x45ff4b58, 0x01ff28c9, 0x630,
},
{ /* 155~340M */
0x13270fff, 0x45ff4b58, 0x01ff28c9, 0x630,
},
{ /* 340~525M */
0x10210fff, 0x45ff4b58, 0x01ff2a21, 0x1080,
},
{ /* 525~600M */
0x10210fff, 0x45ff4b58, 0x01ff2a21, 0x1080,
},
};
static const u32 phy_dchd_t7[][5] = {
/* 0x0d 0x0e 0x0f 0x10 0x11 */
{ /* 24~45M */
0xe3372103, 0x40000000, 0x0d4aaaaa, 0x10000000, 0x3001,
},
{ /* 45~74.5M */
0xe3372103, 0x40000000, 0x0d4aaaaa, 0x10000000, 0x3001,
},
{ /* 77~155M */
0xe3372103, 0x40009000, 0x0d422222, 0x10000000, 0x3001,
},
{ /* 155~340M */
0xe3372903, 0x40009000, 0x0d422222, 0x10000000, 0x3001,
},
{ /* 340~525M */
0xe3372903, 0x4004f000, 0x0d422222, 0x10000000, 0x3001,
},
{ /* 525~600M */
0xe3372903, 0x4004f000, 0x0d422222, 0x10000000, 0x3001,
},
};
struct apll_param apll_tab_t7[] = {
/*od for tmds: 2/4/8/16/32*/
/*od2 for audio: 1/2/4/8/16*/
/* bw M, N, od, od_div, od2, od2_div, aud_div */
/* {PLL_BW_0, 160, 1, 0x5, 32,0x2, 8, 2}, */
{PLL_BW_0, 160, 1, 0x5, 32, 0x1, 8, 3},/* 16 x 27 */
/* {PLL_BW_1, 80, 1, 0x4, 16, 0x2, 8, 1}, */
{PLL_BW_1, 80, 1, 0x4, 16, 0x0, 8, 3},/* 8 x 74 */
/* {PLL_BW_2, 40, 1, 0x3, 8, 0x2, 8, 0}, */
{PLL_BW_2, 40, 1, 0x3, 8, 0x0, 8, 2}, /* 4 x 148 */
/* {PLL_BW_3, 40, 2, 0x2, 4, 0x1, 4, 0}, */
{PLL_BW_3, 40, 2, 0x2, 4, 0x0, 4, 1},/* 2 x 297 */
/* {PLL_BW_4, 40, 1, 0x1, 2, 0x0, 2, 0}, */
{PLL_BW_4, 40, 1, 0x1, 2, 0x0, 2, 0},/* 594 */
{PLL_BW_NULL, 40, 1, 0x3, 8, 0x2, 8, 0},
};
/*Decimal to Gray code */
unsigned int decimaltogray_t7(unsigned int x)
{
return x ^ (x >> 1);
}
/* Gray code to Decimal */
unsigned int graytodecimal_t7(unsigned int x)
{
unsigned int y = x;
while (x >>= 1)
y ^= x;
return y;
}
void aml_pll_bw_cfg_t7(void)
{
u32 idx = rx.phy.phy_bw;
u32 M, N;
u32 od, od_div;
u32 od2, od2_div;
u32 bw = rx.phy.pll_bw;
u32 vco_clk;
u32 data, data2;
u32 cableclk = rx.clk.cable_clk / KHz;
int pll_rst_cnt = 0;
od_div = apll_tab_t7[bw].od_div;
od = apll_tab_t7[bw].od;
if (rx.aml_phy.osc_mode && idx == PHY_BW_5) {
M = 0xF7;
/* sel osc as pll clock */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_MISC_CNTL0, _BIT(29), 0);
/* t7: select tmds_clk from tclk or tmds_ch_clk */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_MISC_CNTL3, _BIT(12), 1);
} else {
M = apll_tab_t7[bw].M;
}
N = apll_tab_t7[bw].N;
if (rx.aml_phy.pll_div && idx == PHY_BW_5) {
M *= rx.aml_phy.pll_div;
N *= rx.aml_phy.pll_div;
}
od2_div = apll_tab_t7[bw].od2_div;
od2 = apll_tab_t7[bw].od2;
if (rx.aml_phy.phy_bwth) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_LKDET_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_RSTB, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_EQ_RSTB, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_EN, 1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_HOLD, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_FR_EN, 0);
usleep_range(100, 110);
/* 0x09 */
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0, phy_dcha_t7[idx][0]);
/* 0x0b */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2, MSK(10, 0),
(phy_dcha_t7[idx][2] & 0x3ff));
/* 0x0e */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1, EQ_BYP_VAL1,
(phy_dchd_t7[idx][1] >> 12) & 0x1f);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1, EQ_BYP_VAL2,
(phy_dchd_t7[idx][1] >> 17) & 0x1f);
/* 0x0c */
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, phy_dcha_t7[idx][3]);
/* 0x0d */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_ADP_MODE,
(phy_dchd_t7[idx][0] >> 10) & 0x3);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
MSK(2, 6), (phy_dchd_t7[idx][0] >> 6) & 0x3);
/* 0xb */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(2, 25), (phy_dcha_t7[idx][2] >> 25) & 0x3);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
MSK(20, 0), (phy_dchd_t7[idx][2] & 0x1fffff));
rx_pr("phy_bw\n");
}
/* over sample control */
if (rx.aml_phy.os_rate == 0) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
MSK(2, 6), rx.aml_phy.os_rate);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(2, 25), rx.aml_phy.os_rate);
} else if (rx.aml_phy.os_rate == 1) {
od -= 1;
/* 0x0c[13:0] + 0x0b[9:0] change to 3G setting ,t7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x630);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(10, 0), 0xc9);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
MSK(2, 6), rx.aml_phy.os_rate);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(2, 25), rx.aml_phy.os_rate);
} else if (rx.aml_phy.os_rate == 2) {
od -= 2;
/* 0x0c[13:0] + 0x0b[9:0] change to 3G setting ,t7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x630);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(10, 0), 0xc9);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
MSK(2, 6), rx.aml_phy.os_rate);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
MSK(2, 25), rx.aml_phy.os_rate);
} else if (rx.aml_phy.os_rate == 3 && idx <= PHY_BW_1) {
od -= 2;
/* 0x0c[13:0] + 0x0b[9:0] change to 3G setting ,t7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x630);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2, MSK(10, 0), 0xc9);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, MSK(2, 6), 0x2);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2, MSK(2, 25), 0x2);
}
rx.phy.aud_div = apll_tab_t7[bw].aud_div;
vco_clk = (cableclk * M) / N; /*KHz*/
if ((vco_clk < (2970 * KHz)) || (vco_clk > (6000 * KHz))) {
if (log_level & VIDEO_LOG)
rx_pr("err: M=%d,N=%d,vco_clk=%d\n", M, N, vco_clk);
}
do {
/*cntl0 M <7:0> N<14:10>*/
data = 0x00090400 & 0xffff8300;
data |= M;
data |= (N << 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, data | 0x20000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, data | 0x30000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL1, 0x00000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00001118);
usleep_range(5, 10);
if (idx <= PHY_BW_2)
/* sz sast dvd flashing screen issue,*/
/* There is a large jitter between 1MHz*/
/* and 2MHz of this DVD source.*/
/* Solution: increase pll Bandwidth*/
data2 = 0x10058f30 | od2;
else
data2 = 0x10058f00 | od2;
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL3, data2);
data2 = 0x080130c0;
data2 |= (od << 24);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, data2);
usleep_range(5, 10);
/*apll_vctrl_mon_en*/
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, data2 | 0x00800000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, data | 0x34000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, data | 0x14000000);
usleep_range(5, 10);
/* bit'5: force lock bit'2: improve phy ldo voltage */
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x0000301c);
usleep_range(100, 110);
if (pll_rst_cnt++ > pll_rst_max) {
if (log_level & VIDEO_LOG)
rx_pr("pll rst error\n");
break;
}
if (log_level & VIDEO_LOG) {
//rx_pr("pll init-cableclk=%d,pixelclk=%d,\n",
// rx.clk.cable_clk / MHz,
// meson_clk_measure(44) / MHz);
rx_pr("sq=%d,pll_lock=%d",
hdmirx_rd_top(TOP_MISC_STAT0) & 0x1,
aml_phy_pll_lock());
}
} while (!is_tmds_clk_stable() && is_clk_stable() && !aml_phy_pll_lock());
rx_pr("pll done\n");
/* t7 debug */
/* manual VGA mode for debug */
if (rx.aml_phy.vga_gain <= 0xfff) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL0, MSK(12, 0),
(decimaltogray_t7(rx.aml_phy.vga_gain & 0xf) |
(decimaltogray_t7(rx.aml_phy.vga_gain >> 4 & 0xf) << 4) |
(decimaltogray_t7(rx.aml_phy.vga_gain >> 8 & 0xf) << 8)));
}
/* manual EQ mode for debug */
if (rx.aml_phy.eq_stg1 < 0x1f) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1,
EQ_BYP_VAL1, rx.aml_phy.eq_stg1 & 0x1f);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_ADP_MODE, 0);
}
if (rx.aml_phy.eq_stg2 < 0x1f) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1,
EQ_BYP_VAL2, rx.aml_phy.eq_stg2 & 0x1f);
}
/* cdr mode */
if (rx.aml_phy.cdr_mode) {
/* cdr 10bit mode */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_MODE, 1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_PH_DIV, 0x3);
} else {
/* cdr 4bit mode */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_MODE, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_PH_DIV, 0x4);
}
if (rx.aml_phy.tap2_byp && rx.phy.phy_bw >= PHY_BW_3)
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, _BIT(15), 1);
}
int get_tap2_t7(int val)
{
if ((val >> 4) == 0)
return val;
else
return (0 - (val & 0xf));
}
bool is_dfe_sts_ok_t7(void)
{
u32 data32;
u32 dfe0_tap2, dfe1_tap2, dfe2_tap2;
u32 dfe0_tap3, dfe1_tap3, dfe2_tap3;
u32 dfe0_tap4, dfe1_tap4, dfe2_tap4;
u32 dfe0_tap5, dfe1_tap5, dfe2_tap5;
u32 dfe0_tap6, dfe1_tap6, dfe2_tap6;
u32 dfe0_tap7, dfe1_tap7, dfe2_tap7;
u32 dfe0_tap8, dfe1_tap8, dfe2_tap8;
bool ret = true;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap2 = data32 & 0xf;
dfe1_tap2 = (data32 >> 8) & 0xf;
dfe2_tap2 = (data32 >> 16) & 0xf;
if (dfe0_tap2 >= 8 ||
dfe1_tap2 >= 8 ||
dfe2_tap2 >= 8)
ret = false;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap3 = data32 & 0x7;
dfe1_tap3 = (data32 >> 8) & 0x7;
dfe2_tap3 = (data32 >> 16) & 0x7;
if (dfe0_tap3 >= 6 ||
dfe1_tap3 >= 6 ||
dfe2_tap3 >= 6)
ret = false;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x4);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap4 = data32 & 0x7;
dfe1_tap4 = (data32 >> 8) & 0x7;
dfe2_tap4 = (data32 >> 16) & 0x7;
if (dfe0_tap4 >= 6 ||
dfe1_tap4 >= 6 ||
dfe2_tap4 >= 6)
ret = false;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x5);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap5 = data32 & 0x7;
dfe1_tap5 = (data32 >> 8) & 0x7;
dfe2_tap5 = (data32 >> 16) & 0x7;
if (dfe0_tap5 >= 6 ||
dfe1_tap5 >= 6 ||
dfe2_tap5 >= 6)
ret = false;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x6);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap6 = data32 & 0x7;
dfe1_tap6 = (data32 >> 8) & 0x7;
dfe2_tap6 = (data32 >> 16) & 0x7;
if (dfe0_tap6 >= 6 ||
dfe1_tap6 >= 6 ||
dfe2_tap6 >= 6)
ret = false;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x7);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap7 = data32 & 0x7;
dfe0_tap8 = (data32 >> 4) & 0x7;
dfe1_tap7 = (data32 >> 8) & 0x7;
dfe1_tap8 = (data32 >> 12) & 0x7;
dfe2_tap7 = (data32 >> 16) & 0x7;
dfe2_tap8 = (data32 >> 20) & 0x7;
if (dfe0_tap7 >= 6 ||
dfe1_tap7 >= 6 ||
dfe2_tap7 >= 6 ||
dfe0_tap8 >= 6 ||
dfe1_tap8 >= 6 ||
dfe2_tap8 >= 6)
ret = false;
return ret;
}
/* long cable detection for <3G need to be change */
void aml_phy_long_cable_det_t7(void)
{
int tap2_0, tap2_1, tap2_2;
int tap2_max = 0;
u32 data32 = 0;
if (rx.phy.phy_bw > PHY_BW_3)
return;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
tap2_0 = get_tap2_t7(data32 & 0x1f);
tap2_1 = get_tap2_t7(((data32 >> 8) & 0x1f));
tap2_2 = get_tap2_t7(((data32 >> 16) & 0x1f));
if (rx.phy.phy_bw == PHY_BW_2) {
/*disable DFE*/
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_RSTB, 0);
tap2_max = 6;
} else if (rx.phy.phy_bw == PHY_BW_3) {
tap2_max = 10;
}
if ((tap2_0 + tap2_1 + tap2_2) >= tap2_max) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1, EQ_BYP_VAL1, 0x12);
usleep_range(10, 20);
rx_pr("long cable\n");
}
}
/* aml_hyper_gain_tuning */
void aml_hyper_gain_tuning_t7(void)
{
u32 data32;
u32 tap0, tap1, tap2;
u32 hyper_gain_0, hyper_gain_1, hyper_gain_2;
/* use HYPER_GAIN calibartion instead of vga */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x0);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
tap0 = data32 & 0xff;
tap1 = (data32 >> 8) & 0xff;
tap2 = (data32 >> 16) & 0xff;
if (tap0 < 0x12)
hyper_gain_0 = 1;
else
hyper_gain_0 = 0;
if (tap1 < 0x12)
hyper_gain_1 = 1;
else
hyper_gain_1 = 0;
if (tap2 < 0x12)
hyper_gain_2 = 1;
else
hyper_gain_2 = 0;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL0,
HYPER_GAIN,
(hyper_gain_0 | (hyper_gain_1 << 1) | (hyper_gain_2 << 2)));
}
void aml_eq_retry_t7(void)
{
u32 data32 = 0;
u32 eq_boost0, eq_boost1, eq_boost2;
if (rx.phy.phy_bw >= PHY_BW_3) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
eq_boost0 = data32 & 0x1f;
eq_boost1 = (data32 >> 8) & 0x1f;
eq_boost2 = (data32 >> 16) & 0x1f;
if (eq_boost0 == 0 || eq_boost0 == 31 ||
eq_boost1 == 0 || eq_boost1 == 31 ||
eq_boost2 == 0 || eq_boost2 == 31) {
rx_pr("eq_retry:%d-%d-%d\n", eq_boost0, eq_boost1, eq_boost2);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_EN, 1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_EQ_RSTB, 0x2);
usleep_range(100, 110);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_EQ_RSTB, 3);
usleep_range(10000, 10100);
if (rx.aml_phy.eq_hold)
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_EN, 0);
}
}
}
void aml_dfe_en_t7(void)
{
if (rx.aml_phy.dfe_en) {
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_EN, 1);
if (rx.aml_phy.eq_hold)
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_EN, 0);
if (rx.aml_phy.eq_retry)
aml_eq_retry_t7();
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_RSTB, 0);
usleep_range(10, 20);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
DFE_RSTB, 1);
usleep_range(10, 20);
if (rx.aml_phy.dfe_hold)
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
DFE_HOLD, 1);
rx_pr("dfe\n");
}
}
/* phy offset calibration based on different chip and board */
void aml_phy_offset_cal_t7(void)
{
u32 data32;
u32 idx = PHY_BW_2;
data32 = phy_misci_t7[idx][0];
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, data32);
usleep_range(5, 10);
data32 = phy_misci_t7[idx][1];
if (rterm_trim_flag_t7)
data32 = ((data32 & (~((0xf << 12) | 0x1))) |
(rterm_trim_val_t7 << 12) | rterm_trim_flag_t7);
/* step2-0xd8 */
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, data32);
/*step2-0xe0*/
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL2, phy_misci_t7[idx][2]);
/*step2-0xe1*/
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, phy_misci_t7[idx][3]);
/*step2-0xe2*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0,
phy_dcha_t7[idx][0]);
/*step2-0xe3*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL1,
phy_dcha_t7[idx][1]);
/*step2-0xe4*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL2,
phy_dcha_t7[idx][2]);
/*step2-0xe5*/
data32 = phy_dchd_t7[idx][0];
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0,
data32);
/*step2-0xe6*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1,
phy_dchd_t7[idx][1]);
/*step2-0xe7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL2,
phy_dchd_t7[idx][2]);
/*step2-0xc5*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3,
phy_dcha_t7[idx][3]);
/*step2-0xc6*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL3,
phy_dchd_t7[idx][3]);
/*0xc7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL4,
phy_dchd_t7[idx][4]);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
CDR_FR_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
AFE_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
DFE_RST, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
CDR_EQ_RSTB, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
CDR_LKDET_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_MISC_CNTL0,
PLL_SRC_SEL, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_MISC_CNTL0,
SQO_GATE, 1);
/* PLL */
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x200904f8);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x300904f8);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL1, 0x00000000);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00001108);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL3, 0x10058f30);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x0b0100c0);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x0b8100c0);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x340904f8);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x140904f8);
usleep_range(10, 20);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00000308);
usleep_range(10, 20);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL1,
DFE_OFSETCAL_START, 1);
usleep_range(100, 110);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1,
OFST_CAL_START, 1);
usleep_range(100, 110);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0,
CDR_EQ_RSTB, 3);
usleep_range(10, 20);
rx_pr("ofst cal\n");
}
/* hardware eye monitor */
void aml_eq_eye_monitor_t7(void)
{
u32 data32;
u32 err_cnt0, err_cnt1, err_cnt2;
u32 scan_state0, scan_state1, scan_state2;
u32 positive_eye_height0, positive_eye_height1, positive_eye_height2;
u32 negative_eye_height0, negative_eye_height1, negative_eye_height2;
u32 left_eye_width0, left_eye_width1, left_eye_width2;
u32 right_eye_width0, right_eye_width1, right_eye_width2;
/* hold dfe tap1~tap8 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
DFE_HOLD, 1);
usleep_range(10, 20);
/* disable hw scan mode */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_EN_HW_SCAN, 0);
/* disable eye monitor */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_MONITOR_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
EYE_MONITOR_EN1, 0);
/* tb timer select for error accumulating */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
MSK(2, 12), 0x3);
/* enable eye monitor */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_MONITOR_EN, 1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
EYE_MONITOR_EN1, 1);
/* enable hw scan mode */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_EN_HW_SCAN, 1);
/* wait for scan done */
usleep_range(rx.aml_phy.eye_delay, rx.aml_phy.eye_delay + 100);
/* Check status */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_STATUS_EN, 1);
/* error cnt */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, ERROR_CNT);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
err_cnt0 = data32 & 0xff;
err_cnt1 = (data32 >> 8) & 0xff;
err_cnt2 = (data32 >> 16) & 0xff;
/* scan state */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, SCAN_STATE);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
scan_state0 = data32 & 0xff;
scan_state1 = (data32 >> 8) & 0xff;
scan_state2 = (data32 >> 16) & 0xff;
/* positive eye height */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, POSITIVE_EYE_HEIGHT);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
positive_eye_height0 = data32 & 0xff;
positive_eye_height1 = (data32 >> 8) & 0xff;
positive_eye_height2 = (data32 >> 16) & 0xff;
/* positive eye height */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, NEGATIVE_EYE_HEIGHT);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
negative_eye_height0 = data32 & 0xff;
negative_eye_height1 = (data32 >> 8) & 0xff;
negative_eye_height2 = (data32 >> 16) & 0xff;
/* left eye width */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, LEFT_EYE_WIDTH);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
left_eye_width0 = data32 & 0xff;
left_eye_width1 = (data32 >> 8) & 0xff;
left_eye_width2 = (data32 >> 16) & 0xff;
/* left eye width */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
EYE_STATUS, RIGHT_EYE_WIDTH);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
right_eye_width0 = data32 & 0xff;
right_eye_width1 = (data32 >> 8) & 0xff;
right_eye_width2 = (data32 >> 16) & 0xff;
/* exit eye monitor scan mode */
/* disable hw scan mode */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_EN_HW_SCAN, 0);
/* disable eye monitor */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4,
EYE_MONITOR_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL2,
EYE_MONITOR_EN1, 0);
usleep_range(10, 20);
/* release dfe */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2,
DFE_HOLD, 0);
rx_pr("eye monitor status:\n");
rx_pr(" error cnt[%5d, %5d, %5d]\n",
err_cnt0, err_cnt1, err_cnt2);
rx_pr(" scan state[%5d, %5d, %5d]\n",
scan_state0, scan_state1, scan_state2);
rx_pr("positive eye height[%5d, %5d, %5d]\n",
positive_eye_height0, positive_eye_height1, positive_eye_height2);
rx_pr("negative eye height[%5d, %5d, %5d]\n",
negative_eye_height0, negative_eye_height1, negative_eye_height2);
rx_pr(" left eye width[%5d, %5d, %5d]\n",
left_eye_width0, left_eye_width1, left_eye_width2);
rx_pr(" right eye width[%5d, %5d, %5d]\n",
right_eye_width0, right_eye_width1, right_eye_width2);
}
void get_eq_val_t7(void)
{
u32 data32 = 0;
u32 eq_boost0, eq_boost1, eq_boost2;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
eq_boost0 = data32 & 0x1f;
eq_boost1 = (data32 >> 8) & 0x1f;
eq_boost2 = (data32 >> 16) & 0x1f;
rx_pr("eq:%d-%d-%d\n", eq_boost0, eq_boost1, eq_boost2);
}
void aml_eq_cfg_t7(void)
{
/* dont need to run eq if no sqo_clk or pll not lock */
if (!aml_phy_pll_lock())
return;
/* step10 */
/* cdr_lkdet_en(0xe5[28])dfe_rstb(0xe7[26])), */
/* eq_adp_stg<1:0>(0xe5[9:8])b01, cdr_rstb(0xe5[25]), */
/* eq_rstb(0xe5[24]) */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_LKDET_EN, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_RSTB, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_EQ_RSTB, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, EQ_EN, 1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_HOLD, 0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_FR_EN, 0);
usleep_range(100, 110);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_EQ_RSTB, 3);
if (rx.aml_phy.cdr_fr_en) {
udelay(rx.aml_phy.cdr_fr_en);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_FR_EN, 1);
}
usleep_range(10000, 10100);
get_eq_val_t7();
/*if (rx.aml_phy.eq_retry)*/
/*aml_eq_retry_t7();*/
if (rx.phy.phy_bw >= PHY_BW_4) {
/* step12 */
/* aml_dfe_en(); */
/* udelay(100); */
} else if (rx.phy.phy_bw == PHY_BW_3) {//3G
/* aml_dfe_en(); */
/*udelay(100);*/
/*t7 removed, tap1 min value*/
/* if (rx.aml_phy.tap1_byp) { */
/* aml_phy_tap1_byp_t7(); */
/* hdmirx_wr_bits_amlphy( */
/* HHI_RX_PHY_DCHD_CNTL2, */
/* DFE_EN, 0); */
/* } */
/*udelay(100);*/
/* hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, */
/* _BIT(28), 1); */
if (rx.aml_phy.long_cable)
;/* aml_phy_long_cable_det_t7(); */
if (rx.aml_phy.vga_dbg)
;/* aml_vga_tuning_t7();*/
} else if (rx.phy.phy_bw == PHY_BW_2) {
if (rx.aml_phy.long_cable) {
/*1.5G should enable DFE first*/
/* aml_dfe_en(); */
/* long cable detection*/
/* aml_phy_long_cable_det_t7();*/
/* 1.5G should disable DFE at the end*/
/* udelay(100); */
/* aml_dfe_en(); */
}
}
/* enable dfe for all frequency */
aml_dfe_en_t7();
/*enable HYPER_GAIN calibration for 6G to fix 2.0 cts HF2-1 issue*/
aml_hyper_gain_tuning_t7();
usleep_range(100, 110);
/*tmds valid det*/
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, CDR_LKDET_EN, 1);
}
void aml_phy_get_trim_val_t7(void)
{
u32 data32;
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL1);
/* bit [12: 15]*/
rterm_trim_val_t7 = (data32 >> 12) & 0xf;
/* bit'0*/
rterm_trim_flag_t7 = data32 & 0x1;
if (rterm_trim_flag_t7)
rx_pr("rterm trim=0x%x\n", rterm_trim_val_t7);
}
void aml_phy_cfg_t7(void)
{
u32 idx = rx.phy.phy_bw;
u32 data32;
u32 term_value = hdmirx_rd_top(TOP_HPD_PWR5V) & 0x7;
if (rx.aml_phy.pre_int) {
rx_pr("\nphy reg init\n");
if (rx.aml_phy.ofst_en)
aml_phy_offset_cal_t7();
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1,
OFST_CAL_START, 0);
usleep_range(100, 110);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHA_CNTL1,
DFE_OFSETCAL_START, 0);
usleep_range(20, 30);
data32 = phy_misci_t7[idx][0];
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, data32);
usleep_range(5, 10);
data32 = phy_misci_t7[idx][1];
if (rterm_trim_flag_t7)
data32 = ((data32 & (~((0xf << 12) | 0x1))) |
(rterm_trim_val_t7 << 12) | rterm_trim_flag_t7);
/* step2-0xd8 */
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, data32);
/*step2-0xe0*/
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL2, phy_misci_t7[idx][2]);
/*step2-0xe1*/
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, phy_misci_t7[idx][3]);
/*step2-0xe2*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0, phy_dcha_t7[idx][0]);
/*step2-0xe3*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL1, phy_dcha_t7[idx][1]);
/*step2-0xe4*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL2, phy_dcha_t7[idx][2]);
/*step2-0xe5*/
data32 = phy_dchd_t7[idx][0];
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, data32);
/*step2-0xe6*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1, phy_dchd_t7[idx][1]);
/*step2-0xe7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL2, phy_dchd_t7[idx][2]);
/*step2-0xc5*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, phy_dcha_t7[idx][3]);
/*step2-0xc6*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL3, phy_dchd_t7[idx][3]);
/*0xc7*/
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL4, phy_dchd_t7[idx][4]);
if (!rx.aml_phy.pre_int_en)
rx.aml_phy.pre_int = 0;
}
/*step3 sel port 0xe1[8:6]*/
/*step4 sq_rst 0xe1[11]=0*/
data32 = phy_misci_t7[idx][3];
if (rx.aml_phy.sqrst_en)
data32 &= ~(1 << 11);
data32 |= ((1 << rx.port) << 6);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, data32);
usleep_range(5, 10);
/*step4 sq_rst 0xe1[11]=1*/
hdmirx_wr_bits_amlphy(HHI_RX_PHY_MISC_CNTL3, _BIT(11), 1);
/*step4 0xd7*/
data32 = phy_misci_t7[idx][0];
data32 &= (~(1 << 10));
data32 &= (~(0x7 << 7));
data32 |= term_value;
data32 &= ~(disable_port_num & 0x07);
/* terminal en */
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, data32);
usleep_range(5, 10);
/* res cali block[10] reset */
/* step4:data channel[7:9] */
data32 |= 0x1 << 10;
data32 |= 0x7 << 7;
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, data32);
/* step5 */
/* set 0xe5[25],disable cdr */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(25), 0);
/* 0xe7(26),disable dfe */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, _BIT(26), 0);
/* 0xe5[24],disable eq */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(24), 0);
/* 0xe5[28]=0,disable lckdet */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(28), 0);
}
/* For t7 */
void aml_phy_init_t7(void)
{
aml_phy_cfg_t7();
usleep_range(10, 20);
aml_pll_bw_cfg_t7();
usleep_range(10, 20);
aml_eq_cfg_t7();
}
void dump_reg_phy_t7(void)
{
rx_pr("PHY Register:\n");
rx_pr("apll_cntl0-0x0(0)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_APLL_CNTL0));
rx_pr("apll_cntl1-0x1(4)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_APLL_CNTL1));
rx_pr("apll_cntl2-0x2(8)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_APLL_CNTL2));
rx_pr("apll_cntl3-0x3(c)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_APLL_CNTL3));
rx_pr("apll_cntl4-0x4(10)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_APLL_CNTL4));
rx_pr("misc_cntl0-0x5(14)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL0));
rx_pr("misc_cntl1-0x6(18)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL1));
rx_pr("misc_cntl2-0x7(1c)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL2));
rx_pr("misc_cntl3-0x8(20)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL3));
rx_pr("dcha_afe-0x9(24)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHA_CNTL0));
rx_pr("dcha_dfe-0xa(28)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHA_CNTL1));
rx_pr("dcha_ctrl-0xb(2c)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHA_CNTL2));
rx_pr("dcha_pi-0xc(30)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHA_CNTL3));
rx_pr("dchd_cdr-0xd(34)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_CNTL0));
rx_pr("dchd_byp-0xe(38)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_CNTL1));
rx_pr("dchd_dfe-0xf(3c)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_CNTL2));
rx_pr("dchd_taps-0x10(40)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_CNTL3));
rx_pr("dchd_eye-0x11(44)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_CNTL4));
rx_pr("misc_stat-0x12(48)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_STAT));
rx_pr("dchd_stat-0x13(4c)=0x%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT));
}
/*
* rx phy v2 debug
*/
int count_one_bits_t7(u32 value)
{
int count = 0;
for (; value != 0; value >>= 1) {
if (value & 1)
count++;
}
return count;
}
void get_val_t7(char *temp, unsigned int val, int len)
{
if ((val >> (len - 1)) == 0)
sprintf(temp, "+%d", val & (~(1 << (len - 1))));
else
sprintf(temp, "-%d", val & (~(1 << (len - 1))));
}
void comb_val_t7(char *type, unsigned int val_0, unsigned int val_1,
unsigned int val_2, int len)
{
char out[32], v0_buf[16], v1_buf[16], v2_buf[16];
int pos = 0;
get_val_t7(v0_buf, val_0, len);
get_val_t7(v1_buf, val_1, len);
get_val_t7(v2_buf, val_2, len);
pos += snprintf(out + pos, 32 - pos, "%s[", type);
pos += snprintf(out + pos, 32 - pos, " %s,", v0_buf);
pos += snprintf(out + pos, 32 - pos, " %s,", v1_buf);
pos += snprintf(out + pos, 32 - pos, " %s]", v2_buf);
rx_pr("%s\n", out);
}
void dump_aml_phy_sts_t7(void)
{
u32 data32;
u32 terminal;
u32 ch0_vga, ch1_vga, ch2_vga;
u32 ch0_eq_boost1, ch1_eq_boost1, ch2_eq_boost1;
u32 ch0_eq_boost2, ch1_eq_boost2, ch2_eq_boost2;
u32 dfe0_tap0, dfe1_tap0, dfe2_tap0;
u32 dfe0_tap1, dfe1_tap1, dfe2_tap1;
u32 dfe0_tap2, dfe1_tap2, dfe2_tap2;
u32 dfe0_tap3, dfe1_tap3, dfe2_tap3;
u32 dfe0_tap4, dfe1_tap4, dfe2_tap4;
u32 dfe0_tap5, dfe1_tap5, dfe2_tap5;
u32 dfe0_tap6, dfe1_tap6, dfe2_tap6;
u32 dfe0_tap7, dfe1_tap7, dfe2_tap7;
u32 dfe0_tap8, dfe1_tap8, dfe2_tap8;
u32 cdr0_code, cdr0_lock, cdr1_code;
u32 cdr1_lock, cdr2_code, cdr2_lock;
u32 cdr0_init, cdr1_init, cdr2_init;
bool pll_lock;
bool squelch;
u32 sli0_ofst0, sli1_ofst0, sli2_ofst0;
u32 sli0_ofst1, sli1_ofst1, sli2_ofst1;
u32 sli0_ofst2, sli1_ofst2, sli2_ofst2;
u32 sli0_ofst3, sli1_ofst3, sli2_ofst3;
u32 sli0_ofst4, sli1_ofst4, sli2_ofst4;
u32 sli0_ofst5, sli1_ofst5, sli2_ofst5;
/* status-1 t7:todo*/
terminal = (hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL1) >> 12) & 0xf;
//terminal = count_one_bits_t7(data32);
usleep_range(100, 110);
/* status-2 t7:todo*/
data32 = (hdmirx_rd_amlphy(HHI_RX_PHY_DCHA_CNTL0) & 0xfff);
ch0_vga = graytodecimal_t7(data32 & 0xf);
ch1_vga = graytodecimal_t7((data32 >> 4) & 0xf);
ch2_vga = graytodecimal_t7((data32 >> 8) & 0xf);
usleep_range(100, 110);
/* status-3 */
/* disable eye monitor debug function */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
ch0_eq_boost1 = data32 & 0x1f;
ch1_eq_boost1 = (data32 >> 8) & 0x1f;
ch2_eq_boost1 = (data32 >> 16) & 0x1f;
ch0_eq_boost2 = (data32 >> 5) & 0x7;
ch1_eq_boost2 = (data32 >> 13) & 0x7;
ch2_eq_boost2 = (data32 >> 21) & 0x7;
/* status-4 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x0);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap0 = data32 & 0xff;
dfe1_tap0 = (data32 >> 8) & 0xff;
dfe2_tap0 = (data32 >> 16) & 0xff;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x1);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap1 = data32 & 0x3f;
dfe1_tap1 = (data32 >> 8) & 0x3f;
dfe2_tap1 = (data32 >> 16) & 0x3f;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap2 = data32 & 0x1f;
dfe1_tap2 = (data32 >> 8) & 0x1f;
dfe2_tap2 = (data32 >> 16) & 0x1f;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap3 = data32 & 0xf;
dfe1_tap3 = (data32 >> 8) & 0xf;
dfe2_tap3 = (data32 >> 16) & 0xf;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x4);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap4 = data32 & 0xf;
dfe1_tap4 = (data32 >> 8) & 0xf;
dfe2_tap4 = (data32 >> 16) & 0xf;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x5);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap5 = data32 & 0xf;
dfe1_tap5 = (data32 >> 8) & 0xf;
dfe2_tap5 = (data32 >> 16) & 0xf;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x6);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap6 = data32 & 0xf;
dfe1_tap6 = (data32 >> 8) & 0xf;
dfe2_tap6 = (data32 >> 16) & 0xf;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x7);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
dfe0_tap7 = data32 & 0xf;
dfe0_tap8 = (data32 >> 4) & 0xf;
dfe1_tap7 = (data32 >> 8) & 0xf;
dfe1_tap8 = (data32 >> 12) & 0xf;
dfe2_tap7 = (data32 >> 16) & 0xf;
dfe2_tap8 = (data32 >> 20) & 0xf;
/* status-5: CDR status */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(22), 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
cdr0_code = data32 & 0x7f;
cdr0_lock = (data32 >> 7) & 0x1;
cdr1_code = (data32 >> 8) & 0x7f;
cdr1_lock = (data32 >> 15) & 0x1;
cdr2_code = (data32 >> 16) & 0x7f;
cdr2_lock = (data32 >> 23) & 0x1;
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(22), 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
cdr0_init = (data32 & 0x7f);
cdr1_init = (data32 >> 8) & 0x7f;
cdr2_init = (data32 >> 16) & 0x7f;
/* status-6: pll lock */
pll_lock = hdmirx_rd_amlphy(HHI_RX_APLL_CNTL0) >> 31;
/* status-7: squelch */
//squelch = rd_reg_hhi(HHI_RX_PHY_MISC_STAT) >> 31;//0320
squelch = hdmirx_rd_top(TOP_MISC_STAT0) & 0x1;
/* status-8:slicer offset status */
/* status-8.0 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x0);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst0 = data32 & 0x3f;
sli1_ofst0 = (data32 >> 8) & 0x3f;
sli2_ofst0 = (data32 >> 16) & 0x3f;
/* status-8.1 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x1);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst1 = data32 & 0x3f;
sli1_ofst1 = (data32 >> 8) & 0x3f;
sli2_ofst1 = (data32 >> 16) & 0x3f;
/* status-8.2 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x2);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst2 = data32 & 0x3f;
sli1_ofst2 = (data32 >> 8) & 0x3f;
sli2_ofst2 = (data32 >> 16) & 0x3f;
/* status-8.3 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x3);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst3 = data32 & 0x3f;
sli1_ofst3 = (data32 >> 8) & 0x3f;
sli2_ofst3 = (data32 >> 16) & 0x3f;
/* status-8.4 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x4);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst4 = data32 & 0x3f;
sli1_ofst4 = (data32 >> 8) & 0x3f;
sli2_ofst4 = (data32 >> 16) & 0x3f;
/* status-8.5 */
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x1);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL2, DFE_DBG_STL, 0x5);
usleep_range(100, 110);
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
sli0_ofst5 = data32 & 0x3f;
sli1_ofst5 = (data32 >> 8) & 0x3f;
sli2_ofst5 = (data32 >> 16) & 0x3f;
rx_pr("\nhdmirx phy status:\n");
rx_pr("pll_lock=%d, squelch=%d, terminal=%d\n", pll_lock, squelch, terminal);
rx_pr("vga_gain=[%d,%d,%d]\n",
ch0_vga, ch1_vga, ch2_vga);
rx_pr("eq_boost1=[%d,%d,%d]\n",
ch0_eq_boost1, ch1_eq_boost1, ch2_eq_boost1);
rx_pr("eq_boost2=[%d,%d,%d]\n",
ch0_eq_boost2, ch1_eq_boost2, ch2_eq_boost2);
comb_val_t7(" dfe_tap0", dfe0_tap0, dfe1_tap0, dfe2_tap0, 8);
comb_val_t7(" dfe_tap1", dfe0_tap1, dfe1_tap1, dfe2_tap1, 6);
comb_val_t7(" dfe_tap2", dfe0_tap2, dfe1_tap2, dfe2_tap2, 5);
comb_val_t7(" dfe_tap3", dfe0_tap3, dfe1_tap3, dfe2_tap3, 4);
comb_val_t7(" dfe_tap4", dfe0_tap4, dfe1_tap4, dfe2_tap4, 4);
comb_val_t7(" dfe_tap5", dfe0_tap5, dfe1_tap5, dfe2_tap5, 4);
comb_val_t7(" dfe_tap6", dfe0_tap6, dfe1_tap6, dfe2_tap6, 4);
comb_val_t7(" dfe_tap7", dfe0_tap7, dfe1_tap7, dfe2_tap7, 4);
comb_val_t7(" dfe_tap8", dfe0_tap8, dfe1_tap8, dfe2_tap8, 4);
comb_val_t7("slicer_ofst0", sli0_ofst0, sli1_ofst0, sli2_ofst0, 6);
comb_val_t7("slicer_ofst1", sli0_ofst1, sli1_ofst1, sli2_ofst1, 6);
comb_val_t7("slicer_ofst2", sli0_ofst2, sli1_ofst2, sli2_ofst2, 6);
comb_val_t7("slicer_ofst3", sli0_ofst3, sli1_ofst3, sli2_ofst3, 6);
comb_val_t7("slicer_ofst4", sli0_ofst4, sli1_ofst4, sli2_ofst4, 6);
comb_val_t7("slicer_ofst5", sli0_ofst5, sli1_ofst5, sli2_ofst5, 6);
rx_pr("cdr_code=[%d,%d,%d]\n", cdr0_code, cdr1_code, cdr2_code);
rx_pr("cdr_lock=[%d,%d,%d]\n", cdr0_lock, cdr1_lock, cdr2_lock);
comb_val_t7("cdr_int", cdr0_init, cdr1_init, cdr2_init, 7);
}
void aml_phy_short_bist_t7(void)
{
int data32;
int bist_mode = 3;
int port;
int ch0_lock = 0;
int ch1_lock = 0;
int ch2_lock = 0;
int lock_sts = 0;
if (rx.aml_phy.long_bist_en)
rx_pr("t7 long bist start\n");
else
rx_pr("t7 short bist start\n");
for (port = 0; port < 3; port++) {
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, 0x4003f07f);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, 0x4003f3ff);
usleep_range(5, 10);
if (rx.aml_phy.long_bist_en)
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, 0x000c01ce);
else
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, 0x000c0fc0);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL2, 0x00000000);
usleep_range(5, 10);
data32 = 0;
/*selector clock to digital from data ch*/
data32 |= (1 << port) << 3;
data32 |= 0x7 << 0;
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, data32);
usleep_range(5, 10);
data32 |= 1 << 11;
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, data32);
rx_pr("\nport=%x\n", hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL3));
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0, 0x10210fff);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL1, 0x45ff4b58);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL2, 0x01ff2a21);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x00001080);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, 0xe0372913);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1, 0x40000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL2, 0x09422222);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL3, 0x10000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL4, 0x00000001);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x200904f8);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x300904f8);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL1, 0x00000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00001108);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL3, 0x10058f30);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x090100c0);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x098100c0);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x340904f8);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x140904f8);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00003008);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, 0xf3372913);
usleep_range(5, 10);
usleep_range(1000, 1100);
/* Reset */
data32 = 0x0;
data32 |= 1 << 8;
data32 |= 1 << 7;
/* Configure BIST analyzer before BIST path out of reset */
hdmirx_wr_top(TOP_SW_RESET, data32);
usleep_range(5, 10);
// Configure BIST analyzer before BIST path out of reset
data32 = 0;
// [23:22] prbs_ana_ch2_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 22;
// [21:20] prbs_ana_ch2_width:3=10-bit pattern
data32 |= 3 << 20;
// [ 19] prbs_ana_ch2_clr_ber_meter //0
data32 |= 1 << 19;
// [ 18] prbs_ana_ch2_freez_ber
data32 |= 0 << 18;
// [ 17] prbs_ana_ch2_bit_reverse
data32 |= 1 << 17;
// [15:14] prbs_ana_ch1_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 14;
// [13:12] prbs_ana_ch1_width:3=10-bit pattern
data32 |= 3 << 12;
// [ 11] prbs_ana_ch1_clr_ber_meter //0
data32 |= 1 << 11;
// [ 10] prbs_ana_ch1_freez_ber
data32 |= 0 << 10;
// [ 9] prbs_ana_ch1_bit_reverse
data32 |= 1 << 9;
// [ 7: 6] prbs_ana_ch0_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 6;
// [ 5: 4] prbs_ana_ch0_width:3=10-bit pattern
data32 |= 3 << 4;
// [ 3] prbs_ana_ch0_clr_ber_meter //0
data32 |= 1 << 3;
// [ 2] prbs_ana_ch0_freez_ber
data32 |= 0 << 2;
// [ 1] prbs_ana_ch0_bit_reverse
data32 |= 1 << 1;
hdmirx_wr_top(TOP_PRBS_ANA_0, data32);
usleep_range(5, 10);
data32 = 0;
// [19: 8] prbs_ana_time_window
data32 |= 255 << 8;
// [ 7: 0] prbs_ana_err_thr
data32 |= 0;
hdmirx_wr_top(TOP_PRBS_ANA_1, data32);
usleep_range(5, 10);
// Configure channel switch
data32 = 0;
data32 |= 2 << 28;// [29:28] source_2
data32 |= 1 << 26;// [27:26] source_1
data32 |= 0 << 24;// [25:24] source_0
data32 |= 0 << 22;// [22:20] skew_2
data32 |= 0 << 16;// [18:16] skew_1
data32 |= 0 << 12;// [14:12] skew_0
data32 |= 0 << 10;// [ 10] bitswap_2
data32 |= 0 << 9;// [ 9] bitswap_1
data32 |= 0 << 8;// [ 8] bitswap_0
data32 |= 0 << 6;// [ 6] polarity_2
data32 |= 0 << 5;// [ 5] polarity_1
data32 |= 0 << 4;// [ 4] polarity_0
data32 |= 0;// [ 0] enable
hdmirx_wr_top(TOP_CHAN_SWITCH_0, data32);
usleep_range(5, 10);
// Configure BIST generator
data32 = 0;
data32 |= 0 << 8;// [ 8] bist_loopback
data32 |= 3 << 5;// [ 7: 5] decoup_thresh
// [ 4: 3] prbs_gen_mode:0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 3;
data32 |= 3 << 1;// [ 2: 1] prbs_gen_width:3=10-bit.
data32 |= 0;// [ 0] prbs_gen_enable
hdmirx_wr_top(TOP_PRBS_GEN, data32);
usleep_range(1000, 1100);
/* Reset */
data32 = 0x0;
data32 &= ~(1 << 8);
data32 &= ~(1 << 7);
/* Configure BIST analyzer before BIST path out of reset */
hdmirx_wr_top(TOP_SW_RESET, data32);
usleep_range(100, 110);
// Configure channel switch
data32 = 0;
data32 |= 2 << 28;// [29:28] source_2
data32 |= 1 << 26;// [27:26] source_1
data32 |= 0 << 24;// [25:24] source_0
data32 |= 0 << 22;// [22:20] skew_2
data32 |= 0 << 16;// [18:16] skew_1
data32 |= 0 << 12;// [14:12] skew_0
data32 |= 0 << 10;// [ 10] bitswap_2
data32 |= 0 << 9;// [ 9] bitswap_1
data32 |= 0 << 8;// [ 8] bitswap_0
data32 |= 0 << 6;// [ 6] polarity_2
data32 |= 0 << 5;// [ 5] polarity_1
data32 |= 0 << 4;// [ 4] polarity_0
data32 |= 1;// [ 0] enable
hdmirx_wr_top(TOP_CHAN_SWITCH_0, data32);
/* Configure BIST generator */
data32 = 0;
/* [ 8] bist_loopback */
data32 |= 0 << 8;
/* [ 7: 5] decoup_thresh */
data32 |= 3 << 5;
// [ 4: 3] prbs_gen_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 3;
/* [ 2: 1] prbs_gen_width:3=10-bit. */
data32 |= 3 << 1;
/* [ 0] prbs_gen_enable */
data32 |= 1;
hdmirx_wr_top(TOP_PRBS_GEN, data32);
/* PRBS analyzer control */
hdmirx_wr_top(TOP_PRBS_ANA_0, 0xf6f6f6);
usleep_range(100, 110);
hdmirx_wr_top(TOP_PRBS_ANA_0, 0xf2f2f2);
//if ((hdmirx_rd_top(TOP_PRBS_GEN) & data32) != 0)
//return;
usleep_range(5000, 5050);
/* Check BIST analyzer BER counters */
if (port == 0)
rx_pr("BER_CH0 = %x\n",
hdmirx_rd_top(TOP_PRBS_ANA_BER_CH0));
else if (port == 1)
rx_pr("BER_CH1 = %x\n",
hdmirx_rd_top(TOP_PRBS_ANA_BER_CH1));
else if (port == 2)
rx_pr("BER_CH2 = %x\n",
hdmirx_rd_top(TOP_PRBS_ANA_BER_CH2));
/* check BIST analyzer result */
lock_sts = hdmirx_rd_top(TOP_PRBS_ANA_STAT) & 0x3f;
rx_pr("ch%dsts=0x%x\n", port, lock_sts);
if (port == 0) {
ch0_lock = lock_sts & 3;
if (ch0_lock == 1)
rx_pr("ch0 PASS\n");
else
rx_pr("ch0 NG\n");
}
if (port == 1) {
ch1_lock = (lock_sts >> 2) & 3;
if (ch1_lock == 1)
rx_pr("ch1 PASS\n");
else
rx_pr("ch1 NG\n");
}
if (port == 2) {
ch2_lock = (lock_sts >> 4) & 3;
if (ch2_lock == 1)
rx_pr("ch2 PASS\n");
else
rx_pr("ch2 NG\n");
}
usleep_range(1000, 1100);
}
lock_sts = ch0_lock | (ch1_lock << 2) | (ch2_lock << 4);
if (lock_sts == 0x15)/* lock_sts == b'010101' is PASS*/
rx_pr("bist_test PASS\n");
else
rx_pr("bist_test FAIL\n");
if (rx.aml_phy.long_bist_en)
rx_pr("long bist done\n");
else
rx_pr("short bist done\n");
if (rx.open_fg)
rx.aml_phy.pre_int = 1;
}
void aml_phy_get_cdr_int_avr_t7(u32 cdr_ed_mode, u32 *ch0, u32 *ch1, u32 *ch2)
{
u32 cdr0_code[10], cdr1_code[10], cdr2_code[10];
u32 data32;
u32 sum_0 = 0;
u32 sum_1 = 0;
u32 sum_2 = 0;
int i = 0;
int flag_32 = 0;
int flag_127 = 0;
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1, cdr_ed_mode);//clk0
usleep_range(100, 110);
//for(10 times)
for (; i < 10; i++) {
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_DCHD_STAT);
cdr0_code[i] = data32 & 0x7f;
cdr1_code[i] = (data32 >> 8) & 0x7f;
cdr2_code[i] = (data32 >> 16) & 0x7f;
if (cdr0_code[i] > 120 ||
cdr1_code[i] > 120 ||
cdr2_code[i] > 120)
flag_127++;
if (cdr0_code[i] < 7 ||
cdr1_code[i] < 7 ||
cdr2_code[i] < 7)
flag_32++;
rx_pr("cdr_code[%d]=[%d,%d,%d]\n",
i, cdr0_code[i], cdr1_code[i], cdr2_code[i]);
rx_pr("flag:%d-%d\n", flag_32, flag_127);
usleep_range(10, 20);
}
for (i = 0; i < 10; i++) {
if (flag_127 && flag_32) {
if (cdr0_code[i] < 7)
cdr0_code[i] += 128;
if (cdr1_code[i] < 7)
cdr1_code[i] += 128;
if (cdr2_code[i] < 7)
cdr2_code[i] += 128;
}
sum_0 += cdr0_code[i];
sum_1 += cdr1_code[i];
sum_2 += cdr2_code[i];
}
*ch0 = (sum_0 / 10);
*ch1 = (sum_1 / 10);
*ch2 = (sum_2 / 10);
rx_pr("ch0=%d, ch1=%d, ch2=%d\n", *ch0, *ch1, *ch2);
}
int aml_phy_get_iq_skew_val_t7(u32 val_0, u32 val_1)
{
int val = val_0 - val_1;
rx_pr("val=%d\n", val);
if (val)
return (val - 32);
else
return (val + 128 - 32);
}
/* IQ skew monitor */
void aml_phy_iq_skew_monitor_t7(void)
{
int data32;
int bist_mode = 3;
u32 cdr0_code_0, cdr0_code_1, cdr0_code_2;/*clk0*/
u32 cdr1_code_0, cdr1_code_1, cdr1_code_2;/*clk90*/
u32 cdr2_code_0, cdr2_code_1, cdr2_code_2;/*clk180*/
u32 cdr3_code_0, cdr3_code_1, cdr3_code_2;/*clk270*/
//u32 cdr_code_0, cdr_code_1, cdr_code_2;
int iq0_skew_ch0, iq0_skew_ch1, iq0_skew_ch2;
int iq1_skew_ch0, iq1_skew_ch1, iq1_skew_ch2;
int iq_skew;
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, 0x4003707f);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, 0x400373ff);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, 0x000401ce);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL2, 0x00000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, 0x00000017);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, 0x00000817);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0, 0x10210fff);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL1, 0x45ff4b58);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL2, 0x01ff2a21);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x00001080);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, 0xe0b72900);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1, 0x70000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL2, 0x09422222);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL3, 0x10000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL4, 0x00003001);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x200904f8);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x300904f8);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL1, 0x00000000);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00001108);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL3, 0x10058f30);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x090100c0);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL4, 0x098100c0);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x340904f8);
usleep_range(100, 110);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL0, 0x140904f8);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_APLL_CNTL2, 0x00003008);
usleep_range(5, 10);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, 0xf3b72900);
usleep_range(5, 10);
usleep_range(1000, 1100);
/* Reset */
data32 = 0x0;
data32 |= 1 << 8;
data32 |= 1 << 7;
/* Configure BIST analyzer before BIST path out of reset */
hdmirx_wr_top(TOP_SW_RESET, data32);
usleep_range(5, 10);
// Configure BIST analyzer before BIST path out of reset
data32 = 0;
// [23:22] prbs_ana_ch2_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 22;
// [21:20] prbs_ana_ch2_width:3=10-bit pattern
data32 |= 3 << 20;
// [ 19] prbs_ana_ch2_clr_ber_meter //0
data32 |= 1 << 19;
// [ 18] prbs_ana_ch2_freez_ber
data32 |= 0 << 18;
// [ 17] prbs_ana_ch2_bit_reverse
data32 |= 1 << 17;
// [15:14] prbs_ana_ch1_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 14;
// [13:12] prbs_ana_ch1_width:3=10-bit pattern
data32 |= 3 << 12;
// [ 11] prbs_ana_ch1_clr_ber_meter //0
data32 |= 1 << 11;
// [ 10] prbs_ana_ch1_freez_ber
data32 |= 0 << 10;
// [ 9] prbs_ana_ch1_bit_reverse
data32 |= 1 << 9;
// [ 7: 6] prbs_ana_ch0_prbs_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 6;
// [ 5: 4] prbs_ana_ch0_width:3=10-bit pattern
data32 |= 3 << 4;
// [ 3] prbs_ana_ch0_clr_ber_meter //0
data32 |= 1 << 3;
// [ 2] prbs_ana_ch0_freez_ber
data32 |= 0 << 2;
// [ 1] prbs_ana_ch0_bit_reverse
data32 |= 1 << 1;
hdmirx_wr_top(TOP_PRBS_ANA_0, data32);
usleep_range(5, 10);
data32 = 0;
// [19: 8] prbs_ana_time_window
data32 |= 255 << 8;
// [ 7: 0] prbs_ana_err_thr
data32 |= 0;
hdmirx_wr_top(TOP_PRBS_ANA_1, data32);
usleep_range(5, 10);
// Configure channel switch
data32 = 0;
data32 |= 2 << 28;// [29:28] source_2
data32 |= 1 << 26;// [27:26] source_1
data32 |= 0 << 24;// [25:24] source_0
data32 |= 0 << 22;// [22:20] skew_2
data32 |= 0 << 16;// [18:16] skew_1
data32 |= 0 << 12;// [14:12] skew_0
data32 |= 0 << 10;// [ 10] bitswap_2
data32 |= 0 << 9;// [ 9] bitswap_1
data32 |= 0 << 8;// [ 8] bitswap_0
data32 |= 0 << 6;// [ 6] polarity_2
data32 |= 0 << 5;// [ 5] polarity_1
data32 |= 0 << 4;// [ 4] polarity_0
data32 |= 0;// [ 0] enable
hdmirx_wr_top(TOP_CHAN_SWITCH_0, data32);
usleep_range(5, 10);
// Configure BIST generator
data32 = 0;
data32 |= 3 << 9;// [ 10:9] shift pattern en
data32 |= 0 << 8;// [ 8] bist_loopback
data32 |= 3 << 5;// [ 7: 5] decoup_thresh
// [ 4: 3] prbs_gen_mode:0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 3;
data32 |= 3 << 1;// [ 2: 1] prbs_gen_width:3=10-bit.
data32 |= 0;// [ 0] prbs_gen_enable
hdmirx_wr_top(TOP_PRBS_GEN, data32);
hdmirx_wr_top(TOP_SHIFT_PTTN_012, 0xcccccccc);
usleep_range(1000, 1100);
/* Reset */
data32 = 0x0;
data32 &= ~(1 << 8);
data32 &= ~(1 << 7);
/* Configure BIST analyzer before BIST path out of reset */
hdmirx_wr_top(TOP_SW_RESET, data32);
usleep_range(100, 110);
// Configure channel switch
data32 = 0;
data32 |= 2 << 28;// [29:28] source_2
data32 |= 1 << 26;// [27:26] source_1
data32 |= 0 << 24;// [25:24] source_0
data32 |= 0 << 22;// [22:20] skew_2
data32 |= 0 << 16;// [18:16] skew_1
data32 |= 0 << 12;// [14:12] skew_0
data32 |= 0 << 10;// [ 10] bitswap_2
data32 |= 0 << 9;// [ 9] bitswap_1
data32 |= 0 << 8;// [ 8] bitswap_0
data32 |= 0 << 6;// [ 6] polarity_2
data32 |= 0 << 5;// [ 5] polarity_1
data32 |= 0 << 4;// [ 4] polarity_0
data32 |= 1;// [ 0] enable
hdmirx_wr_top(TOP_CHAN_SWITCH_0, data32);
/* Configure BIST generator */
data32 = 0;
data32 |= 3 << 9;// [ 10:9] shift pattern en
/* [ 8] bist_loopback */
data32 |= 0 << 8;
/* [ 7: 5] decoup_thresh */
data32 |= 3 << 5;
// [ 4: 3] prbs_gen_mode:
// 0=prbs11; 1=prbs15; 2=prbs7; 3=prbs31.
data32 |= bist_mode << 3;
/* [ 2: 1] prbs_gen_width:3=10-bit. */
data32 |= 3 << 1;
/* [ 0] prbs_gen_enable */
data32 |= 1;
hdmirx_wr_top(TOP_PRBS_GEN, data32);
usleep_range(1000, 1100);
//read cdr_code 10 times, record the average value.
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL4, EYE_STATUS_EN, 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL0, _BIT(22), 0x0);
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL3, DBG_STS_SEL, 0x2);
aml_phy_get_cdr_int_avr_t7(0x40000000, &cdr0_code_0, &cdr0_code_1, &cdr0_code_2);
aml_phy_get_cdr_int_avr_t7(0x50000000, &cdr1_code_0, &cdr1_code_1, &cdr1_code_2);
aml_phy_get_cdr_int_avr_t7(0x60000000, &cdr2_code_0, &cdr2_code_1, &cdr2_code_2);
aml_phy_get_cdr_int_avr_t7(0x70000000, &cdr3_code_0, &cdr3_code_1, &cdr3_code_2);
//iq_skew0 = value(clk0)-value(clk90)-32
//iq_skew1 = value(clk180)-value(clk270)-32
//iq_skew = average(iq_skew0,iq_skew1)
//rx_pr("iq_skew=[%d,%d,%d]\n",
iq0_skew_ch0 = aml_phy_get_iq_skew_val_t7(cdr0_code_0, cdr1_code_0);
iq0_skew_ch1 = aml_phy_get_iq_skew_val_t7(cdr0_code_1, cdr1_code_1);
iq0_skew_ch2 = aml_phy_get_iq_skew_val_t7(cdr0_code_2, cdr1_code_2);
iq1_skew_ch0 = aml_phy_get_iq_skew_val_t7(cdr0_code_0, cdr1_code_0);
iq1_skew_ch1 = aml_phy_get_iq_skew_val_t7(cdr0_code_1, cdr1_code_1);
iq1_skew_ch2 = aml_phy_get_iq_skew_val_t7(cdr0_code_2, cdr1_code_2);
rx_pr("iq_skew_0:[%d, %d, %d]\n", iq0_skew_ch0, iq0_skew_ch1, iq0_skew_ch2);
rx_pr("iq_skew_1:[%d, %d, %d]\n", iq1_skew_ch0, iq1_skew_ch1, iq1_skew_ch2);
iq_skew = (iq0_skew_ch0 + iq0_skew_ch1 + iq0_skew_ch2 +
iq1_skew_ch0 + iq1_skew_ch0 + iq1_skew_ch0) / 6;
rx_pr("iq_skew=%d\n", iq_skew);
if (iq_skew)
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1, IQ_OFST_SIGN, iq_skew);
else
hdmirx_wr_bits_amlphy(HHI_RX_PHY_DCHD_CNTL1, IQ_OFST_SIGN, 1 << 6 | abs(iq_skew));
}
bool aml_get_tmds_valid_t7(void)
{
u32 tmdsclk_valid;
u32 sqofclk;
u32 tmds_align;
u32 ret;
/* digital tmds valid depends on PLL lock from analog phy. */
/* it is not necessary and T7 has not it */
/* tmds_valid = hdmirx_rd_dwc(DWC_HDMI_PLL_LCK_STS) & 0x01; */
sqofclk = hdmirx_rd_top(TOP_MISC_STAT0) & 0x1;
tmdsclk_valid = is_tmds_clk_stable();
/* modified in T7, 0x2b bit'0 tmds_align status */
tmds_align = hdmirx_rd_top(TOP_TMDS_ALIGN_STAT) & 0x01;
if (sqofclk && tmdsclk_valid && tmds_align) {
ret = 1;
} else {
if (log_level & VIDEO_LOG) {
rx_pr("sqo:%x,tmdsclk_valid:%x,align:%x\n",
sqofclk, tmdsclk_valid, tmds_align);
rx_pr("cable clk0:%d\n", rx.clk.cable_clk);
rx_pr("cable clk1:%d\n", rx_get_clock(TOP_HDMI_CABLECLK));
}
ret = 0;
}
return ret;
}
void aml_phy_power_off_t7(void)
{
/* pll power down */
hdmirx_wr_bits_amlphy(HHI_RX_APLL_CNTL0, MSK(2, 28), 2);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL0, 0x800800);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL1, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL2, 0x60000002);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL0, 0x10000000);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL1, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL2, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHA_CNTL3, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL0, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL1, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL2, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL3, 0x0);
hdmirx_wr_amlphy(HHI_RX_PHY_DCHD_CNTL4, 0x0);
}
void aml_phy_switch_port_t7(void)
{
u32 data32;
/* reset and select data port */
data32 = hdmirx_rd_amlphy(HHI_RX_PHY_MISC_CNTL3);
data32 &= (~(0x7 << 6));
data32 |= ((1 << rx.port) << 6);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, data32);
data32 &= (~(1 << 11));
/* release reset */
data32 |= (1 << 11);
hdmirx_wr_amlphy(HHI_RX_PHY_MISC_CNTL3, data32);
udelay(5);
hdmirx_wr_bits_top(TOP_PORT_SEL, MSK(3, 0), (1 << rx.port));
}
void dump_vsi_reg_t7(void)
{
u8 data8, i;
rx_pr("vsi data:\n");
for (i = 0; i <= 30; i++) {
data8 = hdmirx_rd_cor(VSIRX_TYPE_DP3_IVCRX + i);
rx_pr("%d-[%x]\n", i, data8);
}
rx_pr("hf-vsi data:\n");
for (i = 0; i <= 30; i++) {
data8 = hdmirx_rd_cor(HF_VSIRX_TYPE_DP3_IVCRX + i);
rx_pr("%d-[%x]\n", i, data8);
}
rx_pr("aif-vsi data:\n");
for (i = 0; i <= 30; i++) {
data8 = hdmirx_rd_cor(AUDRX_TYPE_DP2_IVCRX + i);
rx_pr("%d-[%x]\n", i, data8);
}
rx_pr("unrec data:\n");
for (i = 0; i <= 30; i++) {
data8 = hdmirx_rd_cor(RX_UNREC_BYTE1_DP2_IVCRX + i);
rx_pr("%d-[%x]\n", i, data8);
}
}
unsigned int rx_sec_hdcp_cfg_t7(void)
{
struct arm_smccc_res res;
arm_smccc_smc(HDMI_RX_HDCP_CFG, 0, 0, 0, 0, 0, 0, 0, &res);
return (unsigned int)((res.a0) & 0xffffffff);
}
void rx_set_irq_t7(bool en)
{
u8 data8;
if (en) {
data8 = 0;
data8 |= 1 << 4; /* intr_new_unrec en */
data8 |= 1 << 2; /* intr_new_aud */
hdmirx_wr_cor(RX_DEPACK_INTR2_MASK_DP2_IVCRX, data8);
data8 = 0;
data8 |= 1 << 4; /* intr_cea_repeat_hf_vsi en */
data8 |= 1 << 3; /* intr_cea_new_hf_vsi en */
data8 |= 1 << 2; /* intr_cea_new_vsi */
hdmirx_wr_cor(RX_DEPACK_INTR3_MASK_DP2_IVCRX, data8);
hdmirx_wr_cor(RX_GRP_INTR1_MASK_PWD_IVCRX, 5);
hdmirx_wr_cor(RX_INTR1_MASK_PWD_IVCRX, 0x03);//register_address: 0x1050
hdmirx_wr_cor(RX_INTR2_MASK_PWD_IVCRX, 0x00);//register_address: 0x1051
hdmirx_wr_cor(RX_INTR3_MASK_PWD_IVCRX, 0x00);//register_address: 0x1052
//must set 0.
hdmirx_wr_cor(RX_INTR4_MASK_PWD_IVCRX, 0);//0x03);//register_address: 0x1053
hdmirx_wr_cor(RX_INTR5_MASK_PWD_IVCRX, 0x00);//register_address: 0x1054
hdmirx_wr_cor(RX_INTR6_MASK_PWD_IVCRX, 0x00);//register_address: 0x1055
hdmirx_wr_cor(RX_INTR7_MASK_PWD_IVCRX, 0x00);//register_address: 0x1056
hdmirx_wr_cor(RX_INTR8_MASK_PWD_IVCRX, 0x00);//register_address: 0x1057
hdmirx_wr_cor(RX_INTR9_MASK_PWD_IVCRX, 0x00);//register_address: 0x1058
data8 = 0;
data8 |= 0 << 4; /* end of VSIF EMP data received */
data8 |= 0 << 3;
data8 |= 0 << 2;
hdmirx_wr_cor(RX_DEPACK2_INTR2_MASK_DP0B_IVCRX, data8);
//===for depack interrupt ====
//hdmirx_wr_cor(CP2PAX_INTR0_MASK_HDCP2X_IVCRX, 0x3);
//hdmirx_wr_cor(RX_INTR13_MASK_PWD_IVCRX, 0x02);// int
//hdmirx_wr_cor(RX_PWD_INT_CTRL, 0x00);//[1] reg_intr_polarity, default = 1
//hdmirx_wr_cor(RX_DEPACK_INTR4_MASK_DP2_IVCRX, 0x00);//interrupt mask
//hdmirx_wr_cor(RX_DEPACK2_INTR0_MASK_DP0B_IVCRX, 0x0c);//interrupt mask
//hdmirx_wr_cor(RX_DEPACK_INTR3_MASK_DP2_IVCRX, 0x20);//interrupt mask [5] acr
//HDCP irq
// encrypted sts changed
//hdmirx_wr_cor(RX_HDCP1X_INTR0_MASK_HDCP1X_IVCRX, 1);
// AKE init received
//hdmirx_wr_cor(CP2PAX_INTR1_MASK_HDCP2X_IVCRX, 4);
// HDCP 2X_RX_ECC
hdmirx_wr_cor(HDCP2X_RX_ECC_INTR_MASK, 1);
} else {
/* clear enable */
hdmirx_wr_cor(RX_DEPACK_INTR2_MASK_DP2_IVCRX, 0);
/* clear status */
hdmirx_wr_cor(RX_DEPACK_INTR2_DP2_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_DEPACK_INTR3_MASK_DP2_IVCRX, 0);
/* clear status */
hdmirx_wr_cor(RX_DEPACK_INTR3_DP2_IVCRX, 0xff);
/* clear en */
hdmirx_wr_cor(RX_GRP_INTR1_MASK_PWD_IVCRX, 0);
/* clear status */
hdmirx_wr_cor(RX_GRP_INTR1_STAT_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR1_MASK_PWD_IVCRX, 0);//register_address: 0x1050
/* clear status */
hdmirx_wr_cor(RX_INTR1_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR2_MASK_PWD_IVCRX, 0);//register_address: 0x1051
/* clear status */
hdmirx_wr_cor(RX_INTR2_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR3_MASK_PWD_IVCRX, 0);//register_address: 0x1052
/* clear status */
hdmirx_wr_cor(RX_INTR3_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR4_MASK_PWD_IVCRX, 0);//register_address: 0x1053
/* clear status */
hdmirx_wr_cor(RX_INTR4_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR5_MASK_PWD_IVCRX, 0);//register_address: 0x1054
/* clear status */
hdmirx_wr_cor(RX_INTR5_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR6_MASK_PWD_IVCRX, 0);//register_address: 0x1055
/* clear status */
hdmirx_wr_cor(RX_INTR6_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR7_MASK_PWD_IVCRX, 0);//register_address: 0x1056
/* clear status */
hdmirx_wr_cor(RX_INTR7_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR8_MASK_PWD_IVCRX, 0);//register_address: 0x1057
/* clear status */
hdmirx_wr_cor(RX_INTR8_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_INTR9_MASK_PWD_IVCRX, 0);//register_address: 0x1058
/* clear status */
hdmirx_wr_cor(RX_INTR9_PWD_IVCRX, 0xff);
/* clear enable */
hdmirx_wr_cor(RX_DEPACK2_INTR2_MASK_DP0B_IVCRX, 0);
/* clear status */
hdmirx_wr_cor(RX_DEPACK2_INTR2_DP0B_IVCRX, 0xff);
//===for depack interrupt ====
//hdmirx_wr_cor(CP2PAX_INTR0_MASK_HDCP2X_IVCRX, 0x3);
//hdmirx_wr_cor(RX_INTR13_MASK_PWD_IVCRX, 0x02);// int
//hdmirx_wr_cor(RX_PWD_INT_CTRL, 0x00);//[1] reg_intr_polarity, default = 1
/* clear enable */
hdmirx_wr_cor(RX_DEPACK_INTR2_MASK_DP2_IVCRX, 0);//interrupt mask
/* clear status */
hdmirx_wr_cor(RX_DEPACK_INTR2_DP2_IVCRX, 0xff);
//hdmirx_wr_cor(RX_DEPACK_INTR4_MASK_DP2_IVCRX, 0x00);//interrupt mask
//hdmirx_wr_cor(RX_DEPACK2_INTR0_MASK_DP0B_IVCRX, 0x0c);//interrupt mask
//hdmirx_wr_cor(RX_DEPACK_INTR3_MASK_DP2_IVCRX, 0x20);//interrupt mask [5] acr
//HDCP irq
// encrypted sts changed
//hdmirx_wr_cor(RX_HDCP1X_INTR0_MASK_HDCP1X_IVCRX, 0);
// AKE init received
//hdmirx_wr_cor(CP2PAX_INTR1_MASK_HDCP2X_IVCRX, 0);
// HDCP 2X_RX_ECC
hdmirx_wr_cor(HDCP2X_RX_ECC_INTR_MASK, 0);
}
}
/*
* 0 SPDIF
* 1 I2S
* 2 TDM
*/
void rx_set_aud_output_t7(u32 param)
{
if (param == 2) {
hdmirx_wr_cor(RX_TDM_CTRL1_AUD_IVCRX, 0x0f);
hdmirx_wr_cor(RX_TDM_CTRL2_AUD_IVCRX, 0xff);
hdmirx_wr_cor(AAC_MCLK_SEL_AUD_IVCRX, 0x90); //TDM
} else if (param == 1) {
hdmirx_wr_cor(RX_TDM_CTRL1_AUD_IVCRX, 0x00);
hdmirx_wr_cor(RX_TDM_CTRL2_AUD_IVCRX, 0x10);
hdmirx_wr_cor(AAC_MCLK_SEL_AUD_IVCRX, 0x80); //I2S
//hdmirx_wr_bits_top(TOP_CLK_CNTL, _BIT(15), 0);
hdmirx_wr_bits_top(TOP_CLK_CNTL, _BIT(4), 1);
} else {
hdmirx_wr_cor(RX_TDM_CTRL1_AUD_IVCRX, 0x00);
hdmirx_wr_cor(RX_TDM_CTRL2_AUD_IVCRX, 0x10);
hdmirx_wr_cor(AAC_MCLK_SEL_AUD_IVCRX, 0x80); //SPDIF
//hdmirx_wr_bits_top(TOP_CLK_CNTL, _BIT(15), 1);
hdmirx_wr_bits_top(TOP_CLK_CNTL, _BIT(4), 0);
}
}
void rx_sw_reset_t7(int level)
{
/* deep color fifo */
hdmirx_wr_bits_cor(RX_PWD_SRST_PWD_IVCRX, _BIT(4), 1);
udelay(1);
hdmirx_wr_bits_cor(RX_PWD_SRST_PWD_IVCRX, _BIT(4), 0);
//TODO..
}