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