xref: /openbmc/linux/drivers/gpu/drm/vc4/vc4_hdmi_phy.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1c457b8aeSMaxime Ripard // SPDX-License-Identifier: GPL-2.0
2c457b8aeSMaxime Ripard /*
3c457b8aeSMaxime Ripard  * Copyright (C) 2015 Broadcom
4c457b8aeSMaxime Ripard  * Copyright (c) 2014 The Linux Foundation. All rights reserved.
5c457b8aeSMaxime Ripard  * Copyright (C) 2013 Red Hat
6c457b8aeSMaxime Ripard  * Author: Rob Clark <robdclark@gmail.com>
7c457b8aeSMaxime Ripard  */
8c457b8aeSMaxime Ripard 
9c457b8aeSMaxime Ripard #include "vc4_hdmi.h"
10647b9655SMaxime Ripard #include "vc4_regs.h"
11c457b8aeSMaxime Ripard #include "vc4_hdmi_regs.h"
12c457b8aeSMaxime Ripard 
1383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB	BIT(5)
1483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB	BIT(4)
1583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_TX_CK_RESET	BIT(3)
1683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_TX_2_RESET	BIT(2)
1783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_TX_1_RESET	BIT(1)
1883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_RESET_CTL_TX_0_RESET	BIT(0)
1983239891SMaxime Ripard 
2083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN	BIT(4)
2183239891SMaxime Ripard 
2283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP_SHIFT	29
2383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP_MASK	VC4_MASK(31, 29)
2483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV_SHIFT	24
2583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV_MASK	VC4_MASK(28, 24)
2683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP_SHIFT	21
2783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP_MASK	VC4_MASK(23, 21)
2883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV_SHIFT	16
2983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV_MASK	VC4_MASK(20, 16)
3083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP_SHIFT	13
3183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP_MASK	VC4_MASK(15, 13)
3283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV_SHIFT	8
3383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV_MASK	VC4_MASK(12, 8)
3483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP_SHIFT	5
3583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP_MASK	VC4_MASK(7, 5)
3683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV_SHIFT	0
3783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV_MASK	VC4_MASK(4, 0)
3883239891SMaxime Ripard 
3983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2_SHIFT	15
4083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2_MASK	VC4_MASK(19, 15)
4183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1_SHIFT	10
4283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1_MASK	VC4_MASK(14, 10)
4383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0_SHIFT	5
4483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0_MASK	VC4_MASK(9, 5)
4583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK_SHIFT		0
4683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK_MASK		VC4_MASK(4, 0)
4783239891SMaxime Ripard 
4883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN_SHIFT		16
4983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN_MASK		VC4_MASK(19, 16)
5083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2_SHIFT	12
5183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2_MASK	VC4_MASK(15, 12)
5283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1_SHIFT	8
5383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1_MASK	VC4_MASK(11, 8)
5483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0_SHIFT	4
5583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0_MASK	VC4_MASK(7, 4)
5683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK_SHIFT	0
5783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK_MASK	VC4_MASK(3, 0)
5883239891SMaxime Ripard 
5983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_RP_SHIFT			17
6083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_RP_MASK			VC4_MASK(19, 17)
6183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_RZ_SHIFT			12
6283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_RZ_MASK			VC4_MASK(16, 12)
6383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CP1_SHIFT			10
6483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CP1_MASK			VC4_MASK(11, 10)
6583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CP_SHIFT			8
6683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CP_MASK			VC4_MASK(9, 8)
6783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CZ_SHIFT			6
6883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_CZ_MASK			VC4_MASK(7, 6)
6983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_ICP_SHIFT			0
7083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CTL_3_ICP_MASK			VC4_MASK(5, 0)
7183239891SMaxime Ripard 
7283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_MASH11_MODE		BIT(13)
7383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VC_RANGE_EN		BIT(12)
7483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_EMULATE_VC_LOW	BIT(11)
7583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_EMULATE_VC_HIGH	BIT(10)
7683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL_SHIFT		9
7783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL_MASK		VC4_MASK(9, 9)
7883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_FB_DIV2		BIT(8)
7983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_POST_DIV2		BIT(7)
8083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_CONT_EN		BIT(6)
8183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_0_ENA_VCO_CLK		BIT(5)
8283239891SMaxime Ripard 
8383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_CPP_SHIFT			16
8483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_CPP_MASK			VC4_MASK(27, 16)
8583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY_SHIFT	14
8683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY_MASK	VC4_MASK(15, 14)
8783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_ENABLE		BIT(13)
8883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL_SHIFT		11
8983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL_MASK		VC4_MASK(12, 11)
9083239891SMaxime Ripard 
9183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CLK_DIV_VCO_SHIFT		8
9283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CLK_DIV_VCO_MASK		VC4_MASK(15, 8)
9383239891SMaxime Ripard 
9483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CFG_PDIV_SHIFT		0
9583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CFG_PDIV_MASK		VC4_MASK(3, 0)
9683239891SMaxime Ripard 
9783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL_MASK	VC4_MASK(13, 12)
9883239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL_SHIFT	12
9983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL_MASK	VC4_MASK(9, 8)
10083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL_SHIFT	8
10183239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL_MASK	VC4_MASK(5, 4)
10283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL_SHIFT	4
10383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL_MASK	VC4_MASK(1, 0)
10483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL_SHIFT	0
10583239891SMaxime Ripard 
10683239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_MASK		VC4_MASK(27, 0)
10783239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_SHIFT	0
10883239891SMaxime Ripard 
10983239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_MASK		VC4_MASK(27, 0)
11083239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_SHIFT	0
11183239891SMaxime Ripard 
11283239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD_MASK	VC4_MASK(31, 16)
11383239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD_SHIFT	16
11483239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD_MASK	VC4_MASK(15, 0)
11583239891SMaxime Ripard #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD_SHIFT	0
11683239891SMaxime Ripard 
11783239891SMaxime Ripard #define VC4_HDMI_RM_CONTROL_EN_FREEZE_COUNTERS		BIT(19)
11883239891SMaxime Ripard #define VC4_HDMI_RM_CONTROL_EN_LOAD_INTEGRATOR		BIT(17)
11983239891SMaxime Ripard #define VC4_HDMI_RM_CONTROL_FREE_RUN			BIT(4)
12083239891SMaxime Ripard 
12183239891SMaxime Ripard #define VC4_HDMI_RM_OFFSET_ONLY				BIT(31)
12283239891SMaxime Ripard #define VC4_HDMI_RM_OFFSET_OFFSET_SHIFT			0
12383239891SMaxime Ripard #define VC4_HDMI_RM_OFFSET_OFFSET_MASK			VC4_MASK(30, 0)
12483239891SMaxime Ripard 
12583239891SMaxime Ripard #define VC4_HDMI_RM_FORMAT_SHIFT_SHIFT			24
12683239891SMaxime Ripard #define VC4_HDMI_RM_FORMAT_SHIFT_MASK			VC4_MASK(25, 24)
12783239891SMaxime Ripard 
12883239891SMaxime Ripard #define OSCILLATOR_FREQUENCY	54000000
12983239891SMaxime Ripard 
vc4_hdmi_phy_init(struct vc4_hdmi * vc4_hdmi,struct vc4_hdmi_connector_state * conn_state)130d2a7dd00SMaxime Ripard void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
131d2a7dd00SMaxime Ripard 		       struct vc4_hdmi_connector_state *conn_state)
132c457b8aeSMaxime Ripard {
13381fb55e5SMaxime Ripard 	unsigned long flags;
13481fb55e5SMaxime Ripard 
135c457b8aeSMaxime Ripard 	/* PHY should be in reset, like
136c457b8aeSMaxime Ripard 	 * vc4_hdmi_encoder_disable() does.
137c457b8aeSMaxime Ripard 	 */
138c457b8aeSMaxime Ripard 
13981fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
14081fb55e5SMaxime Ripard 
141c457b8aeSMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL, 0xf << 16);
142c457b8aeSMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL, 0);
14381fb55e5SMaxime Ripard 
14481fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
145c457b8aeSMaxime Ripard }
146c457b8aeSMaxime Ripard 
vc4_hdmi_phy_disable(struct vc4_hdmi * vc4_hdmi)147c457b8aeSMaxime Ripard void vc4_hdmi_phy_disable(struct vc4_hdmi *vc4_hdmi)
148c457b8aeSMaxime Ripard {
14981fb55e5SMaxime Ripard 	unsigned long flags;
15081fb55e5SMaxime Ripard 
15181fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
152c457b8aeSMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL, 0xf << 16);
15381fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
154c457b8aeSMaxime Ripard }
155647b9655SMaxime Ripard 
vc4_hdmi_phy_rng_enable(struct vc4_hdmi * vc4_hdmi)156647b9655SMaxime Ripard void vc4_hdmi_phy_rng_enable(struct vc4_hdmi *vc4_hdmi)
157647b9655SMaxime Ripard {
15881fb55e5SMaxime Ripard 	unsigned long flags;
15981fb55e5SMaxime Ripard 
16081fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
161647b9655SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_0,
162647b9655SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_CTL_0) &
163647b9655SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_RNG_PWRDN);
16481fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
165647b9655SMaxime Ripard }
166647b9655SMaxime Ripard 
vc4_hdmi_phy_rng_disable(struct vc4_hdmi * vc4_hdmi)167647b9655SMaxime Ripard void vc4_hdmi_phy_rng_disable(struct vc4_hdmi *vc4_hdmi)
168647b9655SMaxime Ripard {
16981fb55e5SMaxime Ripard 	unsigned long flags;
17081fb55e5SMaxime Ripard 
17181fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
172647b9655SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_0,
173647b9655SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_CTL_0) |
174647b9655SMaxime Ripard 		   VC4_HDMI_TX_PHY_RNG_PWRDN);
17581fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
176647b9655SMaxime Ripard }
17783239891SMaxime Ripard 
17883239891SMaxime Ripard static unsigned long long
phy_get_vco_freq(unsigned long long clock,u8 * vco_sel,u8 * vco_div)17983239891SMaxime Ripard phy_get_vco_freq(unsigned long long clock, u8 *vco_sel, u8 *vco_div)
18083239891SMaxime Ripard {
18183239891SMaxime Ripard 	unsigned long long vco_freq = clock;
18283239891SMaxime Ripard 	unsigned int _vco_div = 0;
18383239891SMaxime Ripard 	unsigned int _vco_sel = 0;
18483239891SMaxime Ripard 
18583239891SMaxime Ripard 	while (vco_freq < 3000000000ULL) {
18683239891SMaxime Ripard 		_vco_div++;
18783239891SMaxime Ripard 		vco_freq = clock * _vco_div * 10;
18883239891SMaxime Ripard 	}
18983239891SMaxime Ripard 
19083239891SMaxime Ripard 	if (vco_freq > 4500000000ULL)
19183239891SMaxime Ripard 		_vco_sel = 1;
19283239891SMaxime Ripard 
19383239891SMaxime Ripard 	*vco_sel = _vco_sel;
19483239891SMaxime Ripard 	*vco_div = _vco_div;
19583239891SMaxime Ripard 
19683239891SMaxime Ripard 	return vco_freq;
19783239891SMaxime Ripard }
19883239891SMaxime Ripard 
phy_get_cp_current(unsigned long vco_freq)19983239891SMaxime Ripard static u8 phy_get_cp_current(unsigned long vco_freq)
20083239891SMaxime Ripard {
20183239891SMaxime Ripard 	if (vco_freq < 3700000000ULL)
20283239891SMaxime Ripard 		return 0x1c;
20383239891SMaxime Ripard 
20483239891SMaxime Ripard 	return 0x18;
20583239891SMaxime Ripard }
20683239891SMaxime Ripard 
phy_get_rm_offset(unsigned long long vco_freq)20783239891SMaxime Ripard static u32 phy_get_rm_offset(unsigned long long vco_freq)
20883239891SMaxime Ripard {
20983239891SMaxime Ripard 	unsigned long long fref = OSCILLATOR_FREQUENCY;
21083239891SMaxime Ripard 	u64 offset = 0;
21183239891SMaxime Ripard 
21283239891SMaxime Ripard 	/* RM offset is stored as 9.22 format */
21383239891SMaxime Ripard 	offset = vco_freq * 2;
21483239891SMaxime Ripard 	offset = offset << 22;
21583239891SMaxime Ripard 	do_div(offset, fref);
21683239891SMaxime Ripard 	offset >>= 2;
21783239891SMaxime Ripard 
21883239891SMaxime Ripard 	return offset;
21983239891SMaxime Ripard }
22083239891SMaxime Ripard 
phy_get_vco_gain(unsigned long long vco_freq)22183239891SMaxime Ripard static u8 phy_get_vco_gain(unsigned long long vco_freq)
22283239891SMaxime Ripard {
22383239891SMaxime Ripard 	if (vco_freq < 3350000000ULL)
22483239891SMaxime Ripard 		return 0xf;
22583239891SMaxime Ripard 
22683239891SMaxime Ripard 	if (vco_freq < 3700000000ULL)
22783239891SMaxime Ripard 		return 0xc;
22883239891SMaxime Ripard 
22983239891SMaxime Ripard 	if (vco_freq < 4050000000ULL)
23083239891SMaxime Ripard 		return 0x6;
23183239891SMaxime Ripard 
23283239891SMaxime Ripard 	if (vco_freq < 4800000000ULL)
23383239891SMaxime Ripard 		return 0x5;
23483239891SMaxime Ripard 
23583239891SMaxime Ripard 	if (vco_freq < 5200000000ULL)
23683239891SMaxime Ripard 		return 0x7;
23783239891SMaxime Ripard 
23883239891SMaxime Ripard 	return 0x2;
23983239891SMaxime Ripard }
24083239891SMaxime Ripard 
24183239891SMaxime Ripard struct phy_lane_settings {
24283239891SMaxime Ripard 	struct {
24383239891SMaxime Ripard 		u8 preemphasis;
24483239891SMaxime Ripard 		u8 main_driver;
24583239891SMaxime Ripard 	} amplitude;
24683239891SMaxime Ripard 
24783239891SMaxime Ripard 	u8 res_sel_data;
24883239891SMaxime Ripard 	u8 term_res_sel_data;
24983239891SMaxime Ripard };
25083239891SMaxime Ripard 
25183239891SMaxime Ripard struct phy_settings {
25283239891SMaxime Ripard 	unsigned long long min_rate;
25383239891SMaxime Ripard 	unsigned long long max_rate;
25483239891SMaxime Ripard 	struct phy_lane_settings channel[3];
25583239891SMaxime Ripard 	struct phy_lane_settings clock;
25683239891SMaxime Ripard };
25783239891SMaxime Ripard 
25883239891SMaxime Ripard static const struct phy_settings vc5_hdmi_phy_settings[] = {
25983239891SMaxime Ripard 	{
26083239891SMaxime Ripard 		0, 50000000,
26183239891SMaxime Ripard 		{
26283239891SMaxime Ripard 			{{0x0, 0x0A}, 0x12, 0x0},
26383239891SMaxime Ripard 			{{0x0, 0x0A}, 0x12, 0x0},
26483239891SMaxime Ripard 			{{0x0, 0x0A}, 0x12, 0x0}
26583239891SMaxime Ripard 		},
26683239891SMaxime Ripard 		{{0x0, 0x0A}, 0x18, 0x0},
26783239891SMaxime Ripard 	},
26883239891SMaxime Ripard 	{
26983239891SMaxime Ripard 		50000001, 75000000,
27083239891SMaxime Ripard 		{
27183239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0},
27283239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0},
27383239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0}
27483239891SMaxime Ripard 		},
27583239891SMaxime Ripard 		{{0x0, 0x0C}, 0x18, 0x3},
27683239891SMaxime Ripard 	},
27783239891SMaxime Ripard 	{
27883239891SMaxime Ripard 		75000001,   165000000,
27983239891SMaxime Ripard 		{
28083239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0},
28183239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0},
28283239891SMaxime Ripard 			{{0x0, 0x09}, 0x12, 0x0}
28383239891SMaxime Ripard 		},
28483239891SMaxime Ripard 		{{0x0, 0x0C}, 0x18, 0x3},
28583239891SMaxime Ripard 	},
28683239891SMaxime Ripard 	{
28783239891SMaxime Ripard 		165000001,  250000000,
28883239891SMaxime Ripard 		{
28983239891SMaxime Ripard 			{{0x0, 0x0F}, 0x12, 0x1},
29083239891SMaxime Ripard 			{{0x0, 0x0F}, 0x12, 0x1},
29183239891SMaxime Ripard 			{{0x0, 0x0F}, 0x12, 0x1}
29283239891SMaxime Ripard 		},
29383239891SMaxime Ripard 		{{0x0, 0x0C}, 0x18, 0x3},
29483239891SMaxime Ripard 	},
29583239891SMaxime Ripard 	{
29683239891SMaxime Ripard 		250000001,  340000000,
29783239891SMaxime Ripard 		{
29883239891SMaxime Ripard 			{{0x2, 0x0D}, 0x12, 0x1},
29983239891SMaxime Ripard 			{{0x2, 0x0D}, 0x12, 0x1},
30083239891SMaxime Ripard 			{{0x2, 0x0D}, 0x12, 0x1}
30183239891SMaxime Ripard 		},
30283239891SMaxime Ripard 		{{0x0, 0x0C}, 0x18, 0xF},
30383239891SMaxime Ripard 	},
30483239891SMaxime Ripard 	{
30583239891SMaxime Ripard 		340000001,  450000000,
30683239891SMaxime Ripard 		{
30783239891SMaxime Ripard 			{{0x0, 0x1B}, 0x12, 0xF},
30883239891SMaxime Ripard 			{{0x0, 0x1B}, 0x12, 0xF},
30983239891SMaxime Ripard 			{{0x0, 0x1B}, 0x12, 0xF}
31083239891SMaxime Ripard 		},
31183239891SMaxime Ripard 		{{0x0, 0x0A}, 0x12, 0xF},
31283239891SMaxime Ripard 	},
31383239891SMaxime Ripard 	{
31483239891SMaxime Ripard 		450000001,  600000000,
31583239891SMaxime Ripard 		{
31683239891SMaxime Ripard 			{{0x0, 0x1C}, 0x12, 0xF},
31783239891SMaxime Ripard 			{{0x0, 0x1C}, 0x12, 0xF},
31883239891SMaxime Ripard 			{{0x0, 0x1C}, 0x12, 0xF}
31983239891SMaxime Ripard 		},
32083239891SMaxime Ripard 		{{0x0, 0x0B}, 0x13, 0xF},
32183239891SMaxime Ripard 	},
32283239891SMaxime Ripard };
32383239891SMaxime Ripard 
phy_get_settings(unsigned long long tmds_rate)32483239891SMaxime Ripard static const struct phy_settings *phy_get_settings(unsigned long long tmds_rate)
32583239891SMaxime Ripard {
32683239891SMaxime Ripard 	unsigned int count = ARRAY_SIZE(vc5_hdmi_phy_settings);
32783239891SMaxime Ripard 	unsigned int i;
32883239891SMaxime Ripard 
32983239891SMaxime Ripard 	for (i = 0; i < count; i++) {
33083239891SMaxime Ripard 		const struct phy_settings *s = &vc5_hdmi_phy_settings[i];
33183239891SMaxime Ripard 
33283239891SMaxime Ripard 		if (tmds_rate >= s->min_rate && tmds_rate <= s->max_rate)
33383239891SMaxime Ripard 			return s;
33483239891SMaxime Ripard 	}
33583239891SMaxime Ripard 
33683239891SMaxime Ripard 	/*
33783239891SMaxime Ripard 	 * If the pixel clock exceeds our max setting, try the max
33883239891SMaxime Ripard 	 * setting anyway.
33983239891SMaxime Ripard 	 */
34083239891SMaxime Ripard 	return &vc5_hdmi_phy_settings[count - 1];
34183239891SMaxime Ripard }
34283239891SMaxime Ripard 
34383239891SMaxime Ripard static const struct phy_lane_settings *
phy_get_channel_settings(enum vc4_hdmi_phy_channel chan,unsigned long long tmds_rate)34483239891SMaxime Ripard phy_get_channel_settings(enum vc4_hdmi_phy_channel chan,
34583239891SMaxime Ripard 			 unsigned long long tmds_rate)
34683239891SMaxime Ripard {
34783239891SMaxime Ripard 	const struct phy_settings *settings = phy_get_settings(tmds_rate);
34883239891SMaxime Ripard 
34983239891SMaxime Ripard 	if (chan == PHY_LANE_CK)
35083239891SMaxime Ripard 		return &settings->clock;
35183239891SMaxime Ripard 
35283239891SMaxime Ripard 	return &settings->channel[chan];
35383239891SMaxime Ripard }
35483239891SMaxime Ripard 
vc5_hdmi_reset_phy(struct vc4_hdmi * vc4_hdmi)35583239891SMaxime Ripard static void vc5_hdmi_reset_phy(struct vc4_hdmi *vc4_hdmi)
35683239891SMaxime Ripard {
35781fb55e5SMaxime Ripard 	lockdep_assert_held(&vc4_hdmi->hw_lock);
35881fb55e5SMaxime Ripard 
35983239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL, 0x0f);
36083239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL, BIT(10));
36183239891SMaxime Ripard }
36283239891SMaxime Ripard 
vc5_hdmi_phy_init(struct vc4_hdmi * vc4_hdmi,struct vc4_hdmi_connector_state * conn_state)363d2a7dd00SMaxime Ripard void vc5_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi,
364d2a7dd00SMaxime Ripard 		       struct vc4_hdmi_connector_state *conn_state)
36583239891SMaxime Ripard {
36683239891SMaxime Ripard 	const struct phy_lane_settings *chan0_settings, *chan1_settings, *chan2_settings, *clock_settings;
36783239891SMaxime Ripard 	const struct vc4_hdmi_variant *variant = vc4_hdmi->variant;
368*6135ee07SMaxime Ripard 	unsigned long long pixel_freq = conn_state->tmds_char_rate;
36983239891SMaxime Ripard 	unsigned long long vco_freq;
37083239891SMaxime Ripard 	unsigned char word_sel;
37181fb55e5SMaxime Ripard 	unsigned long flags;
37283239891SMaxime Ripard 	u8 vco_sel, vco_div;
37383239891SMaxime Ripard 
37483239891SMaxime Ripard 	vco_freq = phy_get_vco_freq(pixel_freq, &vco_sel, &vco_div);
37583239891SMaxime Ripard 
37681fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
37781fb55e5SMaxime Ripard 
37883239891SMaxime Ripard 	vc5_hdmi_reset_phy(vc4_hdmi);
37983239891SMaxime Ripard 
38083239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL,
38183239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN);
38283239891SMaxime Ripard 
38383239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL,
38483239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_RESET_CTL) &
38583239891SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_RESET_CTL_TX_0_RESET &
38683239891SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_RESET_CTL_TX_1_RESET &
38783239891SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_RESET_CTL_TX_2_RESET &
38883239891SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_RESET_CTL_TX_CK_RESET);
38983239891SMaxime Ripard 
39083239891SMaxime Ripard 	HDMI_WRITE(HDMI_RM_CONTROL,
39183239891SMaxime Ripard 		   HDMI_READ(HDMI_RM_CONTROL) |
39283239891SMaxime Ripard 		   VC4_HDMI_RM_CONTROL_EN_FREEZE_COUNTERS |
39383239891SMaxime Ripard 		   VC4_HDMI_RM_CONTROL_EN_LOAD_INTEGRATOR |
39483239891SMaxime Ripard 		   VC4_HDMI_RM_CONTROL_FREE_RUN);
39583239891SMaxime Ripard 
39683239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1,
39783239891SMaxime Ripard 		   (HDMI_READ(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1) &
39883239891SMaxime Ripard 		    ~VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_MASK) |
39983239891SMaxime Ripard 		   VC4_SET_FIELD(0, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT));
40083239891SMaxime Ripard 
40183239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2,
40283239891SMaxime Ripard 		   (HDMI_READ(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2) &
40383239891SMaxime Ripard 		    ~VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_MASK) |
40483239891SMaxime Ripard 		   VC4_SET_FIELD(0, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT));
40583239891SMaxime Ripard 
40683239891SMaxime Ripard 	HDMI_WRITE(HDMI_RM_OFFSET,
40783239891SMaxime Ripard 		   VC4_SET_FIELD(phy_get_rm_offset(vco_freq),
40883239891SMaxime Ripard 				 VC4_HDMI_RM_OFFSET_OFFSET) |
40983239891SMaxime Ripard 		   VC4_HDMI_RM_OFFSET_ONLY);
41083239891SMaxime Ripard 
41183239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CLK_DIV,
41283239891SMaxime Ripard 		   VC4_SET_FIELD(vco_div, VC4_HDMI_TX_PHY_CLK_DIV_VCO));
41383239891SMaxime Ripard 
41483239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4,
41583239891SMaxime Ripard 		   VC4_SET_FIELD(0xe147, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD) |
41683239891SMaxime Ripard 		   VC4_SET_FIELD(0xe14, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD));
41783239891SMaxime Ripard 
41883239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CTL_0,
41983239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_PLL_CTL_0_ENA_VCO_CLK |
42083239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_CONT_EN |
42183239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_PLL_CTL_0_MASH11_MODE |
42283239891SMaxime Ripard 		   VC4_SET_FIELD(vco_sel, VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL));
42383239891SMaxime Ripard 
42483239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CTL_1,
42583239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_PLL_CTL_1) |
42683239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_ENABLE |
42783239891SMaxime Ripard 		   VC4_SET_FIELD(3, VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL) |
42883239891SMaxime Ripard 		   VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY) |
42983239891SMaxime Ripard 		   VC4_SET_FIELD(0x8a, VC4_HDMI_TX_PHY_PLL_CTL_1_CPP));
43083239891SMaxime Ripard 
43183239891SMaxime Ripard 	HDMI_WRITE(HDMI_RM_FORMAT,
43283239891SMaxime Ripard 		   HDMI_READ(HDMI_RM_FORMAT) |
43383239891SMaxime Ripard 		   VC4_SET_FIELD(2, VC4_HDMI_RM_FORMAT_SHIFT));
43483239891SMaxime Ripard 
43583239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_PLL_CFG,
43683239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_PLL_CFG) |
43783239891SMaxime Ripard 		   VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_PLL_CFG_PDIV));
43883239891SMaxime Ripard 
43983239891SMaxime Ripard 	if (pixel_freq >= 340000000)
44083239891SMaxime Ripard 		word_sel = 3;
44183239891SMaxime Ripard 	else
44283239891SMaxime Ripard 		word_sel = 0;
44383239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_TMDS_CLK_WORD_SEL, word_sel);
44483239891SMaxime Ripard 
44583239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_3,
44683239891SMaxime Ripard 		   VC4_SET_FIELD(phy_get_cp_current(vco_freq),
44783239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_3_ICP) |
44883239891SMaxime Ripard 		   VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_CTL_3_CP) |
44983239891SMaxime Ripard 		   VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_CTL_3_CP1) |
45083239891SMaxime Ripard 		   VC4_SET_FIELD(3, VC4_HDMI_TX_PHY_CTL_3_CZ) |
45183239891SMaxime Ripard 		   VC4_SET_FIELD(4, VC4_HDMI_TX_PHY_CTL_3_RP) |
45283239891SMaxime Ripard 		   VC4_SET_FIELD(6, VC4_HDMI_TX_PHY_CTL_3_RZ));
45383239891SMaxime Ripard 
45483239891SMaxime Ripard 	chan0_settings =
45583239891SMaxime Ripard 		phy_get_channel_settings(variant->phy_lane_mapping[PHY_LANE_0],
45683239891SMaxime Ripard 					 pixel_freq);
45783239891SMaxime Ripard 	chan1_settings =
45883239891SMaxime Ripard 		phy_get_channel_settings(variant->phy_lane_mapping[PHY_LANE_1],
45983239891SMaxime Ripard 					 pixel_freq);
46083239891SMaxime Ripard 	chan2_settings =
46183239891SMaxime Ripard 		phy_get_channel_settings(variant->phy_lane_mapping[PHY_LANE_2],
46283239891SMaxime Ripard 					 pixel_freq);
46383239891SMaxime Ripard 	clock_settings =
46483239891SMaxime Ripard 		phy_get_channel_settings(variant->phy_lane_mapping[PHY_LANE_CK],
46583239891SMaxime Ripard 					 pixel_freq);
46683239891SMaxime Ripard 
46783239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_0,
46883239891SMaxime Ripard 		   VC4_SET_FIELD(chan0_settings->amplitude.preemphasis,
46983239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP) |
47083239891SMaxime Ripard 		   VC4_SET_FIELD(chan0_settings->amplitude.main_driver,
47183239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV) |
47283239891SMaxime Ripard 		   VC4_SET_FIELD(chan1_settings->amplitude.preemphasis,
47383239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP) |
47483239891SMaxime Ripard 		   VC4_SET_FIELD(chan1_settings->amplitude.main_driver,
47583239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV) |
47683239891SMaxime Ripard 		   VC4_SET_FIELD(chan2_settings->amplitude.preemphasis,
47783239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP) |
47883239891SMaxime Ripard 		   VC4_SET_FIELD(chan2_settings->amplitude.main_driver,
47983239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV) |
48083239891SMaxime Ripard 		   VC4_SET_FIELD(clock_settings->amplitude.preemphasis,
48183239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP) |
48283239891SMaxime Ripard 		   VC4_SET_FIELD(clock_settings->amplitude.main_driver,
48383239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV));
48483239891SMaxime Ripard 
48583239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_1,
48683239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_CTL_1) |
48783239891SMaxime Ripard 		   VC4_SET_FIELD(chan0_settings->res_sel_data,
48883239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0) |
48983239891SMaxime Ripard 		   VC4_SET_FIELD(chan1_settings->res_sel_data,
49083239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1) |
49183239891SMaxime Ripard 		   VC4_SET_FIELD(chan2_settings->res_sel_data,
49283239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2) |
49383239891SMaxime Ripard 		   VC4_SET_FIELD(clock_settings->res_sel_data,
49483239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK));
49583239891SMaxime Ripard 
49683239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CTL_2,
49783239891SMaxime Ripard 		   VC4_SET_FIELD(chan0_settings->term_res_sel_data,
49883239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0) |
49983239891SMaxime Ripard 		   VC4_SET_FIELD(chan1_settings->term_res_sel_data,
50083239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1) |
50183239891SMaxime Ripard 		   VC4_SET_FIELD(chan2_settings->term_res_sel_data,
50283239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2) |
50383239891SMaxime Ripard 		   VC4_SET_FIELD(clock_settings->term_res_sel_data,
50483239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK) |
50583239891SMaxime Ripard 		   VC4_SET_FIELD(phy_get_vco_gain(vco_freq),
50683239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN));
50783239891SMaxime Ripard 
50883239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_CHANNEL_SWAP,
50983239891SMaxime Ripard 		   VC4_SET_FIELD(variant->phy_lane_mapping[PHY_LANE_0],
51083239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL) |
51183239891SMaxime Ripard 		   VC4_SET_FIELD(variant->phy_lane_mapping[PHY_LANE_1],
51283239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL) |
51383239891SMaxime Ripard 		   VC4_SET_FIELD(variant->phy_lane_mapping[PHY_LANE_2],
51483239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL) |
51583239891SMaxime Ripard 		   VC4_SET_FIELD(variant->phy_lane_mapping[PHY_LANE_CK],
51683239891SMaxime Ripard 				 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL));
51783239891SMaxime Ripard 
51883239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL,
51983239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_RESET_CTL) &
52083239891SMaxime Ripard 		   ~(VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB |
52183239891SMaxime Ripard 		     VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB));
52283239891SMaxime Ripard 
52383239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_RESET_CTL,
52483239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_RESET_CTL) |
52583239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB |
52683239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB);
52781fb55e5SMaxime Ripard 
52881fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
52983239891SMaxime Ripard }
53083239891SMaxime Ripard 
vc5_hdmi_phy_disable(struct vc4_hdmi * vc4_hdmi)53183239891SMaxime Ripard void vc5_hdmi_phy_disable(struct vc4_hdmi *vc4_hdmi)
53283239891SMaxime Ripard {
53381fb55e5SMaxime Ripard 	unsigned long flags;
53481fb55e5SMaxime Ripard 
53581fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
53683239891SMaxime Ripard 	vc5_hdmi_reset_phy(vc4_hdmi);
53781fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
53883239891SMaxime Ripard }
53983239891SMaxime Ripard 
vc5_hdmi_phy_rng_enable(struct vc4_hdmi * vc4_hdmi)54083239891SMaxime Ripard void vc5_hdmi_phy_rng_enable(struct vc4_hdmi *vc4_hdmi)
54183239891SMaxime Ripard {
54281fb55e5SMaxime Ripard 	unsigned long flags;
54381fb55e5SMaxime Ripard 
54481fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
54583239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL,
54683239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_POWERDOWN_CTL) &
54783239891SMaxime Ripard 		   ~VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN);
54881fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
54983239891SMaxime Ripard }
55083239891SMaxime Ripard 
vc5_hdmi_phy_rng_disable(struct vc4_hdmi * vc4_hdmi)55183239891SMaxime Ripard void vc5_hdmi_phy_rng_disable(struct vc4_hdmi *vc4_hdmi)
55283239891SMaxime Ripard {
55381fb55e5SMaxime Ripard 	unsigned long flags;
55481fb55e5SMaxime Ripard 
55581fb55e5SMaxime Ripard 	spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
55683239891SMaxime Ripard 	HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL,
55783239891SMaxime Ripard 		   HDMI_READ(HDMI_TX_PHY_POWERDOWN_CTL) |
55883239891SMaxime Ripard 		   VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN);
55981fb55e5SMaxime Ripard 	spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
56083239891SMaxime Ripard }
561