0001
0002
0003
0004
0005
0006
0007 #include "phy-mtk-mipi-dsi.h"
0008
0009 #define MIPITX_LANE_CON 0x000c
0010 #define RG_DSI_CPHY_T1DRV_EN BIT(0)
0011 #define RG_DSI_ANA_CK_SEL BIT(1)
0012 #define RG_DSI_PHY_CK_SEL BIT(2)
0013 #define RG_DSI_CPHY_EN BIT(3)
0014 #define RG_DSI_PHYCK_INV_EN BIT(4)
0015 #define RG_DSI_PWR04_EN BIT(5)
0016 #define RG_DSI_BG_LPF_EN BIT(6)
0017 #define RG_DSI_BG_CORE_EN BIT(7)
0018 #define RG_DSI_PAD_TIEL_SEL BIT(8)
0019
0020 #define MIPITX_VOLTAGE_SEL 0x0010
0021 #define RG_DSI_HSTX_LDO_REF_SEL (0xf << 6)
0022
0023 #define MIPITX_PLL_PWR 0x0028
0024 #define MIPITX_PLL_CON0 0x002c
0025 #define MIPITX_PLL_CON1 0x0030
0026 #define MIPITX_PLL_CON2 0x0034
0027 #define MIPITX_PLL_CON3 0x0038
0028 #define MIPITX_PLL_CON4 0x003c
0029 #define RG_DSI_PLL_IBIAS (3 << 10)
0030
0031 #define MIPITX_D2P_RTCODE 0x0100
0032 #define MIPITX_D2_SW_CTL_EN 0x0144
0033 #define MIPITX_D0_SW_CTL_EN 0x0244
0034 #define MIPITX_CK_CKMODE_EN 0x0328
0035 #define DSI_CK_CKMODE_EN BIT(0)
0036 #define MIPITX_CK_SW_CTL_EN 0x0344
0037 #define MIPITX_D1_SW_CTL_EN 0x0444
0038 #define MIPITX_D3_SW_CTL_EN 0x0544
0039 #define DSI_SW_CTL_EN BIT(0)
0040 #define AD_DSI_PLL_SDM_PWR_ON BIT(0)
0041 #define AD_DSI_PLL_SDM_ISO_EN BIT(1)
0042
0043 #define RG_DSI_PLL_EN BIT(4)
0044 #define RG_DSI_PLL_POSDIV (0x7 << 8)
0045
0046 static int mtk_mipi_tx_pll_enable(struct clk_hw *hw)
0047 {
0048 struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
0049 unsigned int txdiv, txdiv0;
0050 u64 pcw;
0051
0052 dev_dbg(mipi_tx->dev, "enable: %u bps\n", mipi_tx->data_rate);
0053
0054 if (mipi_tx->data_rate >= 2000000000) {
0055 txdiv = 1;
0056 txdiv0 = 0;
0057 } else if (mipi_tx->data_rate >= 1000000000) {
0058 txdiv = 2;
0059 txdiv0 = 1;
0060 } else if (mipi_tx->data_rate >= 500000000) {
0061 txdiv = 4;
0062 txdiv0 = 2;
0063 } else if (mipi_tx->data_rate > 250000000) {
0064 txdiv = 8;
0065 txdiv0 = 3;
0066 } else if (mipi_tx->data_rate >= 125000000) {
0067 txdiv = 16;
0068 txdiv0 = 4;
0069 } else {
0070 return -EINVAL;
0071 }
0072
0073 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_PLL_CON4, RG_DSI_PLL_IBIAS);
0074
0075 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_PLL_PWR, AD_DSI_PLL_SDM_PWR_ON);
0076 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_PLL_CON1, RG_DSI_PLL_EN);
0077 udelay(1);
0078 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_PLL_PWR, AD_DSI_PLL_SDM_ISO_EN);
0079 pcw = div_u64(((u64)mipi_tx->data_rate * txdiv) << 24, 26000000);
0080 writel(pcw, mipi_tx->regs + MIPITX_PLL_CON0);
0081 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_PLL_CON1, RG_DSI_PLL_POSDIV,
0082 txdiv0 << 8);
0083 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_PLL_CON1, RG_DSI_PLL_EN);
0084
0085 return 0;
0086 }
0087
0088 static void mtk_mipi_tx_pll_disable(struct clk_hw *hw)
0089 {
0090 struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
0091
0092 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_PLL_CON1, RG_DSI_PLL_EN);
0093
0094 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_PLL_PWR, AD_DSI_PLL_SDM_ISO_EN);
0095 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_PLL_PWR, AD_DSI_PLL_SDM_PWR_ON);
0096 }
0097
0098 static long mtk_mipi_tx_pll_round_rate(struct clk_hw *hw, unsigned long rate,
0099 unsigned long *prate)
0100 {
0101 return clamp_val(rate, 50000000, 1600000000);
0102 }
0103
0104 static const struct clk_ops mtk_mipi_tx_pll_ops = {
0105 .enable = mtk_mipi_tx_pll_enable,
0106 .disable = mtk_mipi_tx_pll_disable,
0107 .round_rate = mtk_mipi_tx_pll_round_rate,
0108 .set_rate = mtk_mipi_tx_pll_set_rate,
0109 .recalc_rate = mtk_mipi_tx_pll_recalc_rate,
0110 };
0111
0112 static void mtk_mipi_tx_config_calibration_data(struct mtk_mipi_tx *mipi_tx)
0113 {
0114 int i, j;
0115
0116 for (i = 0; i < 5; i++) {
0117 if ((mipi_tx->rt_code[i] & 0x1f) == 0)
0118 mipi_tx->rt_code[i] |= 0x10;
0119
0120 if ((mipi_tx->rt_code[i] >> 5 & 0x1f) == 0)
0121 mipi_tx->rt_code[i] |= 0x10 << 5;
0122
0123 for (j = 0; j < 10; j++)
0124 mtk_mipi_tx_update_bits(mipi_tx,
0125 MIPITX_D2P_RTCODE * (i + 1) + j * 4,
0126 1, mipi_tx->rt_code[i] >> j & 1);
0127 }
0128 }
0129
0130 static void mtk_mipi_tx_power_on_signal(struct phy *phy)
0131 {
0132 struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
0133
0134
0135 writel(RG_DSI_PAD_TIEL_SEL | RG_DSI_BG_CORE_EN,
0136 mipi_tx->regs + MIPITX_LANE_CON);
0137 usleep_range(30, 100);
0138 writel(RG_DSI_BG_CORE_EN | RG_DSI_BG_LPF_EN,
0139 mipi_tx->regs + MIPITX_LANE_CON);
0140
0141
0142 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_D0_SW_CTL_EN, DSI_SW_CTL_EN);
0143 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_D1_SW_CTL_EN, DSI_SW_CTL_EN);
0144 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_D2_SW_CTL_EN, DSI_SW_CTL_EN);
0145 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_D3_SW_CTL_EN, DSI_SW_CTL_EN);
0146 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_CK_SW_CTL_EN, DSI_SW_CTL_EN);
0147
0148 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_VOLTAGE_SEL,
0149 RG_DSI_HSTX_LDO_REF_SEL,
0150 (mipi_tx->mipitx_drive - 3000) / 200 << 6);
0151
0152 mtk_mipi_tx_config_calibration_data(mipi_tx);
0153
0154 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_CK_CKMODE_EN, DSI_CK_CKMODE_EN);
0155 }
0156
0157 static void mtk_mipi_tx_power_off_signal(struct phy *phy)
0158 {
0159 struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
0160
0161
0162 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_D0_SW_CTL_EN, DSI_SW_CTL_EN);
0163 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_D1_SW_CTL_EN, DSI_SW_CTL_EN);
0164 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_D2_SW_CTL_EN, DSI_SW_CTL_EN);
0165 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_D3_SW_CTL_EN, DSI_SW_CTL_EN);
0166 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_CK_SW_CTL_EN, DSI_SW_CTL_EN);
0167
0168 writel(RG_DSI_PAD_TIEL_SEL | RG_DSI_BG_CORE_EN,
0169 mipi_tx->regs + MIPITX_LANE_CON);
0170 writel(RG_DSI_PAD_TIEL_SEL, mipi_tx->regs + MIPITX_LANE_CON);
0171 }
0172
0173 const struct mtk_mipitx_data mt8183_mipitx_data = {
0174 .mipi_tx_clk_ops = &mtk_mipi_tx_pll_ops,
0175 .mipi_tx_enable_signal = mtk_mipi_tx_power_on_signal,
0176 .mipi_tx_disable_signal = mtk_mipi_tx_power_off_signal,
0177 };