blob: ee6661a82f4b34895cd03483c6b0adc0c377efa2 [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#include <linux/printk.h>
#include "common.h"
#include "mach_reg.h"
/*
* From GXL chips, registers names changes.
* Added new HHI_HDMI_PLL_CNTL1 but addessed as 0xc9.
* It's different with HHI_HDMI_PLL_CNTL2 0xc9 in previouse chips.
*/
#ifdef P_HHI_HDMI_PLL_CNTL2
#undef P_HHI_HDMI_PLL_CNTL2
#endif
#ifdef P_HHI_HDMI_PLL_CNTL3
#undef P_HHI_HDMI_PLL_CNTL3
#endif
#ifdef P_HHI_HDMI_PLL_CNTL4
#undef P_HHI_HDMI_PLL_CNTL4
#endif
#ifdef P_HHI_HDMI_PLL_CNTL5
#undef P_HHI_HDMI_PLL_CNTL5
#endif
#ifdef P_HHI_HDMI_PLL_CNTL6
#undef P_HHI_HDMI_PLL_CNTL6
#endif
#define P_HHI_HDMI_PLL_CNTL1 HHI_REG_ADDR(0xc9)
#define P_HHI_HDMI_PLL_CNTL2 HHI_REG_ADDR(0xca)
#define P_HHI_HDMI_PLL_CNTL3 HHI_REG_ADDR(0xcb)
#define P_HHI_HDMI_PLL_CNTL4 HHI_REG_ADDR(0xcc)
#define P_HHI_HDMI_PLL_CNTL5 HHI_REG_ADDR(0xcd)
/*
* NAME PAD PINMUX GPIO
* HPD GPIOH_0 reg6[31] GPIO1[20]
* SCL GPIOH_2 reg6[29] GPIO1[22[
* SDA GPIOH_1 reg6[30] GPIO1[21]
*/
int hdmitx_hpd_hw_op_gxl(enum hpd_op cmd)
{
int ret = 0;
switch (cmd) {
case HPD_INIT_DISABLE_PULLUP:
break;
case HPD_INIT_SET_FILTER:
hdmitx_wr_reg(HDMITX_TOP_HPD_FILTER,
((0xa << 12) | (0xa0 << 0)));
break;
case HPD_IS_HPD_MUXED:
break;
case HPD_MUX_HPD:
break;
case HPD_UNMUX_HPD:
break;
case HPD_READ_HPD_GPIO:
break;
default:
pr_info("error hpd cmd %d\n", cmd);
break;
}
return ret;
}
int read_hpd_gpio_gxl(void)
{
return 1;
}
int hdmitx_ddc_hw_op_gxl(enum ddc_op cmd)
{
int ret = 0;
switch (cmd) {
case DDC_INIT_DISABLE_PULL_UP_DN:
break;
case DDC_MUX_DDC:
break;
case DDC_UNMUX_DDC:
break;
default:
pr_info("error ddc cmd %d\n", cmd);
}
return ret;
}
void set_gxl_hpll_clk_out(unsigned int frac_rate, unsigned int clk)
{
/* TODO */
}
void set_hpll_sspll_gxl(enum hdmi_vic vic)
{
switch (vic) {
case HDMI_1920x1080p60_16x9:
case HDMI_1920x1080p50_16x9:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 0x68b48c4, 0, 30);
break;
case HDMI_1280x720p60_16x9:
case HDMI_1280x720p50_16x9:
case HDMI_1920x1080i60_16x9:
case HDMI_1920x1080i50_16x9:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 0x64348c4, 0, 30);
break;
default:
break;
}
}
void set_hpll_od1_gxl(unsigned int div)
{
switch (div) {
case 1:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 0, 21, 2);
break;
case 2:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 1, 21, 2);
break;
case 4:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 2, 21, 2);
break;
default:
pr_info("Err %s[%d]\n", __func__, __LINE__);
break;
}
}
void set_hpll_od2_gxl(unsigned int div)
{
switch (div) {
case 1:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 0, 23, 2);
break;
case 2:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 1, 23, 2);
break;
case 4:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 2, 23, 2);
break;
default:
pr_info("Err %s[%d]\n", __func__, __LINE__);
break;
}
}
void set_hpll_od3_gxl(unsigned int div)
{
switch (div) {
case 1:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 0, 19, 2);
break;
case 2:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 1, 19, 2);
break;
case 4:
hd_set_reg_bits(P_HHI_HDMI_PLL_CNTL2, 2, 19, 2);
break;
default:
pr_info("Err %s[%d]\n", __func__, __LINE__);
break;
}
}
void set_phy_by_mode_gxl(unsigned int mode)
{
switch (mode) {
case HDMI_PHYPARA_6G: /* 5.94Gbps, 3.7125Gbsp */
case HDMI_PHYPARA_4p5G:
case HDMI_PHYPARA_3p7G:
hd_write_reg(P_HHI_HDMI_PHY_CNTL0, 0x333d3282);
hd_write_reg(P_HHI_HDMI_PHY_CNTL3, 0x2136315b);
break;
case HDMI_PHYPARA_3G: /* 2.97Gbps */
hd_write_reg(P_HHI_HDMI_PHY_CNTL0, 0x33303382);
hd_write_reg(P_HHI_HDMI_PHY_CNTL3, 0x2036315b);
break;
case HDMI_PHYPARA_DEF: /* 1.485Gbps */
hd_write_reg(P_HHI_HDMI_PHY_CNTL0, 0x33303042);
hd_write_reg(P_HHI_HDMI_PHY_CNTL3, 0x2016315b);
break;
case HDMI_PHYPARA_270M:
default: /* 742.5Mbps, and below */
hd_write_reg(P_HHI_HDMI_PHY_CNTL0, 0x33604132);
hd_write_reg(P_HHI_HDMI_PHY_CNTL3, 0x0016315b);
break;
}
}