Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ae7fd3b authored by Kyle Yan's avatar Kyle Yan Committed by Gerrit - the friendly Code Review server
Browse files

Merge "clk: msm: mdss: add HDMI PLL sequence for external 1.8V supply" into msm-4.8

parents 851882a1 328d115e
Loading
Loading
Loading
Loading
+87 −18
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@
#define HDMI_VERSION_8996_V1                     1
#define HDMI_VERSION_8996_V1                     1
#define HDMI_VERSION_8996_V2                     2
#define HDMI_VERSION_8996_V2                     2
#define HDMI_VERSION_8996_V3                     3
#define HDMI_VERSION_8996_V3                     3
#define HDMI_VERSION_8996_V3_1_8                 4


#define HDMI_VCO_MAX_FREQ                        12000000000
#define HDMI_VCO_MAX_FREQ                        12000000000
#define HDMI_VCO_MIN_FREQ                        8000000000
#define HDMI_VCO_MIN_FREQ                        8000000000
@@ -1545,6 +1546,7 @@ static int hdmi_8996_calculate(u32 pix_clk,
{
{
	switch (ver) {
	switch (ver) {
	case HDMI_VERSION_8996_V3:
	case HDMI_VERSION_8996_V3:
	case HDMI_VERSION_8996_V3_1_8:
		return hdmi_8996_v3_calculate(pix_clk, cfg);
		return hdmi_8996_v3_calculate(pix_clk, cfg);
	case HDMI_VERSION_8996_V2:
	case HDMI_VERSION_8996_V2:
		return hdmi_8996_v2_calculate(pix_clk, cfg);
		return hdmi_8996_v2_calculate(pix_clk, cfg);
@@ -1575,6 +1577,7 @@ static int hdmi_8996_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk, u32 ver)
	switch (ver) {
	switch (ver) {
	case HDMI_VERSION_8996_V2:
	case HDMI_VERSION_8996_V2:
	case HDMI_VERSION_8996_V3:
	case HDMI_VERSION_8996_V3:
	case HDMI_VERSION_8996_V3_1_8:
		MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_BG_CTRL, 0x04);
		MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_BG_CTRL, 0x04);
		break;
		break;
	};
	};
@@ -1681,34 +1684,58 @@ static int hdmi_8996_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk, u32 ver)
		       cfg.com_coreclk_div);
		       cfg.com_coreclk_div);
	MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_CMN_CONFIG, 0x02);
	MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_CMN_CONFIG, 0x02);


	if (ver == HDMI_VERSION_8996_V3)
	if (ver == HDMI_VERSION_8996_V3 || ver == HDMI_VERSION_8996_V3_1_8)
		MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_RESCODE_DIV_NUM, 0x15);
		MDSS_PLL_REG_W(io->pll_base, QSERDES_COM_RESCODE_DIV_NUM, 0x15);


	/* TX lanes setup (TX 0/1/2/3) */
	/* TX lanes setup (TX 0/1/2/3) */
	if (ver == HDMI_VERSION_8996_V3_1_8) {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				0x00000023);
	} else {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				QSERDES_TX_L0_TX_DRV_LVL,
				cfg.tx_l0_tx_drv_lvl);
				cfg.tx_l0_tx_drv_lvl);
	}
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       cfg.tx_l0_tx_emp_post1_lvl);
		       cfg.tx_l0_tx_emp_post1_lvl);


	if (ver == HDMI_VERSION_8996_V3_1_8) {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L1_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				0x00000023);
	} else {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L1_BASE_OFFSET,
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L1_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				QSERDES_TX_L0_TX_DRV_LVL,
				cfg.tx_l1_tx_drv_lvl);
				cfg.tx_l1_tx_drv_lvl);
	}
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L1_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L1_BASE_OFFSET,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       cfg.tx_l1_tx_emp_post1_lvl);
		       cfg.tx_l1_tx_emp_post1_lvl);


	if (ver == HDMI_VERSION_8996_V3_1_8) {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L2_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				0x00000023);
	} else {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L2_BASE_OFFSET,
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L2_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				QSERDES_TX_L0_TX_DRV_LVL,
				cfg.tx_l2_tx_drv_lvl);
				cfg.tx_l2_tx_drv_lvl);
	}
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L2_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L2_BASE_OFFSET,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       cfg.tx_l2_tx_emp_post1_lvl);
		       cfg.tx_l2_tx_emp_post1_lvl);


	if (ver == HDMI_VERSION_8996_V3_1_8) {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				0x00000020);
	} else {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
				QSERDES_TX_L0_TX_DRV_LVL,
				QSERDES_TX_L0_TX_DRV_LVL,
				cfg.tx_l3_tx_drv_lvl);
				cfg.tx_l3_tx_drv_lvl);
	}
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       QSERDES_TX_L0_TX_EMP_POST1_LVL,
		       cfg.tx_l3_tx_emp_post1_lvl);
		       cfg.tx_l3_tx_emp_post1_lvl);
@@ -1737,9 +1764,15 @@ static int hdmi_8996_phy_pll_set_clk_rate(struct clk *c, u32 tmds_clk, u32 ver)
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
		       QSERDES_TX_L0_VMODE_CTRL1,
		       QSERDES_TX_L0_VMODE_CTRL1,
		       cfg.tx_l3_vmode_ctrl1);
		       cfg.tx_l3_vmode_ctrl1);
	if (ver == HDMI_VERSION_8996_V3_1_8) {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
				QSERDES_TX_L0_VMODE_CTRL2,
				0x0000000D);
	} else {
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
		MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L3_BASE_OFFSET,
				QSERDES_TX_L0_VMODE_CTRL2,
				QSERDES_TX_L0_VMODE_CTRL2,
				cfg.tx_l3_vmode_ctrl2);
				cfg.tx_l3_vmode_ctrl2);
	}


	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
	MDSS_PLL_REG_W(io->pll_base + HDMI_TX_L0_BASE_OFFSET,
		       QSERDES_TX_L0_TX_DRV_LVL_OFFSET, 0x00);
		       QSERDES_TX_L0_TX_DRV_LVL_OFFSET, 0x00);
@@ -2154,6 +2187,11 @@ static int hdmi_8996_v3_vco_enable(struct clk *c)
	return hdmi_8996_vco_enable(c, HDMI_VERSION_8996_V3);
	return hdmi_8996_vco_enable(c, HDMI_VERSION_8996_V3);
}
}


static int hdmi_8996_v3_1p8_vco_enable(struct clk *c)
{
	return hdmi_8996_vco_enable(c, HDMI_VERSION_8996_V3_1_8);
}

static int hdmi_8996_vco_set_rate(struct clk *c, unsigned long rate, u32 ver)
static int hdmi_8996_vco_set_rate(struct clk *c, unsigned long rate, u32 ver)
{
{
	struct hdmi_pll_vco_clk *vco = to_hdmi_8996_vco_clk(c);
	struct hdmi_pll_vco_clk *vco = to_hdmi_8996_vco_clk(c);
@@ -2207,6 +2245,11 @@ static int hdmi_8996_v3_vco_set_rate(struct clk *c, unsigned long rate)
	return hdmi_8996_vco_set_rate(c, rate, HDMI_VERSION_8996_V3);
	return hdmi_8996_vco_set_rate(c, rate, HDMI_VERSION_8996_V3);
}
}


static int hdmi_8996_v3_1p8_vco_set_rate(struct clk *c, unsigned long rate)
{
	return hdmi_8996_vco_set_rate(c, rate, HDMI_VERSION_8996_V3_1_8);
}

static unsigned long hdmi_8996_vco_get_rate(struct clk *c)
static unsigned long hdmi_8996_vco_get_rate(struct clk *c)
{
{
	unsigned long freq = 0;
	unsigned long freq = 0;
@@ -2258,6 +2301,11 @@ static int hdmi_8996_v3_vco_prepare(struct clk *c)
	return hdmi_8996_vco_prepare(c, HDMI_VERSION_8996_V3);
	return hdmi_8996_vco_prepare(c, HDMI_VERSION_8996_V3);
}
}


static int hdmi_8996_v3_1p8_vco_prepare(struct clk *c)
{
	return hdmi_8996_vco_prepare(c, HDMI_VERSION_8996_V3_1_8);
}

static void hdmi_8996_vco_unprepare(struct clk *c)
static void hdmi_8996_vco_unprepare(struct clk *c)
{
{
	struct hdmi_pll_vco_clk *vco = to_hdmi_8996_vco_clk(c);
	struct hdmi_pll_vco_clk *vco = to_hdmi_8996_vco_clk(c);
@@ -2347,6 +2395,17 @@ static const struct clk_ops hdmi_8996_v3_vco_clk_ops = {
	.handoff = hdmi_8996_vco_handoff,
	.handoff = hdmi_8996_vco_handoff,
};
};


static const struct clk_ops hdmi_8996_v3_1p8_vco_clk_ops = {
	.enable = hdmi_8996_v3_1p8_vco_enable,
	.set_rate = hdmi_8996_v3_1p8_vco_set_rate,
	.get_rate = hdmi_8996_vco_get_rate,
	.round_rate = hdmi_8996_vco_round_rate,
	.prepare = hdmi_8996_v3_1p8_vco_prepare,
	.unprepare = hdmi_8996_vco_unprepare,
	.handoff = hdmi_8996_vco_handoff,
};


static struct hdmi_pll_vco_clk hdmi_vco_clk = {
static struct hdmi_pll_vco_clk hdmi_vco_clk = {
	.c = {
	.c = {
		.dbg_name = "hdmi_8996_vco_clk",
		.dbg_name = "hdmi_8996_vco_clk",
@@ -2379,6 +2438,9 @@ int hdmi_8996_pll_clock_register(struct platform_device *pdev,
	case HDMI_VERSION_8996_V3:
	case HDMI_VERSION_8996_V3:
		hdmi_vco_clk.c.ops = &hdmi_8996_v3_vco_clk_ops;
		hdmi_vco_clk.c.ops = &hdmi_8996_v3_vco_clk_ops;
		break;
		break;
	case HDMI_VERSION_8996_V3_1_8:
		hdmi_vco_clk.c.ops = &hdmi_8996_v3_1p8_vco_clk_ops;
		break;
	default:
	default:
		hdmi_vco_clk.c.ops = &hdmi_8996_v1_vco_clk_ops;
		hdmi_vco_clk.c.ops = &hdmi_8996_v1_vco_clk_ops;
		break;
		break;
@@ -2416,3 +2478,10 @@ int hdmi_8996_v3_pll_clock_register(struct platform_device *pdev,
	return hdmi_8996_pll_clock_register(pdev, pll_res,
	return hdmi_8996_pll_clock_register(pdev, pll_res,
						HDMI_VERSION_8996_V3);
						HDMI_VERSION_8996_V3);
}
}

int hdmi_8996_v3_1p8_pll_clock_register(struct platform_device *pdev,
				 struct mdss_pll_resources *pll_res)
{
	return hdmi_8996_pll_clock_register(pdev, pll_res,
						HDMI_VERSION_8996_V3_1_8);
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -47,4 +47,7 @@ int hdmi_8996_v2_pll_clock_register(struct platform_device *pdev,


int hdmi_8996_v3_pll_clock_register(struct platform_device *pdev,
int hdmi_8996_v3_pll_clock_register(struct platform_device *pdev,
				 struct mdss_pll_resources *pll_res);
				 struct mdss_pll_resources *pll_res);

int hdmi_8996_v3_1p8_pll_clock_register(struct platform_device *pdev,
				 struct mdss_pll_resources *pll_res);
#endif
#endif
+7 −0
Original line number Original line Diff line number Diff line
@@ -141,6 +141,9 @@ static int mdss_pll_resource_parse(struct platform_device *pdev,
		pll_res->pll_interface_type = MDSS_HDMI_PLL_8996_V2;
		pll_res->pll_interface_type = MDSS_HDMI_PLL_8996_V2;
	} else if (!strcmp(compatible_stream, "qcom,mdss_hdmi_pll_8996_v3")) {
	} else if (!strcmp(compatible_stream, "qcom,mdss_hdmi_pll_8996_v3")) {
		pll_res->pll_interface_type = MDSS_HDMI_PLL_8996_V3;
		pll_res->pll_interface_type = MDSS_HDMI_PLL_8996_V3;
	} else if (!strcmp(compatible_stream,
				"qcom,mdss_hdmi_pll_8996_v3_1p8")) {
		pll_res->pll_interface_type = MDSS_HDMI_PLL_8996_V3_1_8;
	} else {
	} else {
		goto err;
		goto err;
	}
	}
@@ -176,6 +179,9 @@ static int mdss_pll_clock_register(struct platform_device *pdev,
	case MDSS_HDMI_PLL_8996_V3:
	case MDSS_HDMI_PLL_8996_V3:
		rc = hdmi_8996_v3_pll_clock_register(pdev, pll_res);
		rc = hdmi_8996_v3_pll_clock_register(pdev, pll_res);
		break;
		break;
	case MDSS_HDMI_PLL_8996_V3_1_8:
		rc = hdmi_8996_v3_1p8_pll_clock_register(pdev, pll_res);
		break;
	case MDSS_UNKNOWN_PLL:
	case MDSS_UNKNOWN_PLL:
	default:
	default:
		rc = -EINVAL;
		rc = -EINVAL;
@@ -365,6 +371,7 @@ static const struct of_device_id mdss_pll_dt_match[] = {
	{.compatible = "qcom,mdss_hdmi_pll_8996"},
	{.compatible = "qcom,mdss_hdmi_pll_8996"},
	{.compatible = "qcom,mdss_hdmi_pll_8996_v2"},
	{.compatible = "qcom,mdss_hdmi_pll_8996_v2"},
	{.compatible = "qcom,mdss_hdmi_pll_8996_v3"},
	{.compatible = "qcom,mdss_hdmi_pll_8996_v3"},
	{.compatible = "qcom,mdss_hdmi_pll_8996_v3_1p8"},
	{}
	{}
};
};


+1 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ enum {
	MDSS_HDMI_PLL_8996,
	MDSS_HDMI_PLL_8996,
	MDSS_HDMI_PLL_8996_V2,
	MDSS_HDMI_PLL_8996_V2,
	MDSS_HDMI_PLL_8996_V3,
	MDSS_HDMI_PLL_8996_V3,
	MDSS_HDMI_PLL_8996_V3_1_8,
	MDSS_UNKNOWN_PLL,
	MDSS_UNKNOWN_PLL,
};
};