0001
0002
0003
0004
0005
0006
0007 #include "phy-mtk-mipi-dsi.h"
0008
0009 #define MIPITX_DSI_CON 0x00
0010 #define RG_DSI_LDOCORE_EN BIT(0)
0011 #define RG_DSI_CKG_LDOOUT_EN BIT(1)
0012 #define RG_DSI_BCLK_SEL (3 << 2)
0013 #define RG_DSI_LD_IDX_SEL (7 << 4)
0014 #define RG_DSI_PHYCLK_SEL (2 << 8)
0015 #define RG_DSI_DSICLK_FREQ_SEL BIT(10)
0016 #define RG_DSI_LPTX_CLMP_EN BIT(11)
0017
0018 #define MIPITX_DSI_CLOCK_LANE 0x04
0019 #define MIPITX_DSI_DATA_LANE0 0x08
0020 #define MIPITX_DSI_DATA_LANE1 0x0c
0021 #define MIPITX_DSI_DATA_LANE2 0x10
0022 #define MIPITX_DSI_DATA_LANE3 0x14
0023 #define RG_DSI_LNTx_LDOOUT_EN BIT(0)
0024 #define RG_DSI_LNTx_CKLANE_EN BIT(1)
0025 #define RG_DSI_LNTx_LPTX_IPLUS1 BIT(2)
0026 #define RG_DSI_LNTx_LPTX_IPLUS2 BIT(3)
0027 #define RG_DSI_LNTx_LPTX_IMINUS BIT(4)
0028 #define RG_DSI_LNTx_LPCD_IPLUS BIT(5)
0029 #define RG_DSI_LNTx_LPCD_IMINUS BIT(6)
0030 #define RG_DSI_LNTx_RT_CODE (0xf << 8)
0031
0032 #define MIPITX_DSI_TOP_CON 0x40
0033 #define RG_DSI_LNT_INTR_EN BIT(0)
0034 #define RG_DSI_LNT_HS_BIAS_EN BIT(1)
0035 #define RG_DSI_LNT_IMP_CAL_EN BIT(2)
0036 #define RG_DSI_LNT_TESTMODE_EN BIT(3)
0037 #define RG_DSI_LNT_IMP_CAL_CODE (0xf << 4)
0038 #define RG_DSI_LNT_AIO_SEL (7 << 8)
0039 #define RG_DSI_PAD_TIE_LOW_EN BIT(11)
0040 #define RG_DSI_DEBUG_INPUT_EN BIT(12)
0041 #define RG_DSI_PRESERVE (7 << 13)
0042
0043 #define MIPITX_DSI_BG_CON 0x44
0044 #define RG_DSI_BG_CORE_EN BIT(0)
0045 #define RG_DSI_BG_CKEN BIT(1)
0046 #define RG_DSI_BG_DIV (0x3 << 2)
0047 #define RG_DSI_BG_FAST_CHARGE BIT(4)
0048 #define RG_DSI_VOUT_MSK (0x3ffff << 5)
0049 #define RG_DSI_V12_SEL (7 << 5)
0050 #define RG_DSI_V10_SEL (7 << 8)
0051 #define RG_DSI_V072_SEL (7 << 11)
0052 #define RG_DSI_V04_SEL (7 << 14)
0053 #define RG_DSI_V032_SEL (7 << 17)
0054 #define RG_DSI_V02_SEL (7 << 20)
0055 #define RG_DSI_BG_R1_TRIM (0xf << 24)
0056 #define RG_DSI_BG_R2_TRIM (0xf << 28)
0057
0058 #define MIPITX_DSI_PLL_CON0 0x50
0059 #define RG_DSI_MPPLL_PLL_EN BIT(0)
0060 #define RG_DSI_MPPLL_DIV_MSK (0x1ff << 1)
0061 #define RG_DSI_MPPLL_PREDIV (3 << 1)
0062 #define RG_DSI_MPPLL_TXDIV0 (3 << 3)
0063 #define RG_DSI_MPPLL_TXDIV1 (3 << 5)
0064 #define RG_DSI_MPPLL_POSDIV (7 << 7)
0065 #define RG_DSI_MPPLL_MONVC_EN BIT(10)
0066 #define RG_DSI_MPPLL_MONREF_EN BIT(11)
0067 #define RG_DSI_MPPLL_VOD_EN BIT(12)
0068
0069 #define MIPITX_DSI_PLL_CON1 0x54
0070 #define RG_DSI_MPPLL_SDM_FRA_EN BIT(0)
0071 #define RG_DSI_MPPLL_SDM_SSC_PH_INIT BIT(1)
0072 #define RG_DSI_MPPLL_SDM_SSC_EN BIT(2)
0073 #define RG_DSI_MPPLL_SDM_SSC_PRD (0xffff << 16)
0074
0075 #define MIPITX_DSI_PLL_CON2 0x58
0076
0077 #define MIPITX_DSI_PLL_TOP 0x64
0078 #define RG_DSI_MPPLL_PRESERVE (0xff << 8)
0079
0080 #define MIPITX_DSI_PLL_PWR 0x68
0081 #define RG_DSI_MPPLL_SDM_PWR_ON BIT(0)
0082 #define RG_DSI_MPPLL_SDM_ISO_EN BIT(1)
0083 #define RG_DSI_MPPLL_SDM_PWR_ACK BIT(8)
0084
0085 #define MIPITX_DSI_SW_CTRL 0x80
0086 #define SW_CTRL_EN BIT(0)
0087
0088 #define MIPITX_DSI_SW_CTRL_CON0 0x84
0089 #define SW_LNTC_LPTX_PRE_OE BIT(0)
0090 #define SW_LNTC_LPTX_OE BIT(1)
0091 #define SW_LNTC_LPTX_P BIT(2)
0092 #define SW_LNTC_LPTX_N BIT(3)
0093 #define SW_LNTC_HSTX_PRE_OE BIT(4)
0094 #define SW_LNTC_HSTX_OE BIT(5)
0095 #define SW_LNTC_HSTX_ZEROCLK BIT(6)
0096 #define SW_LNT0_LPTX_PRE_OE BIT(7)
0097 #define SW_LNT0_LPTX_OE BIT(8)
0098 #define SW_LNT0_LPTX_P BIT(9)
0099 #define SW_LNT0_LPTX_N BIT(10)
0100 #define SW_LNT0_HSTX_PRE_OE BIT(11)
0101 #define SW_LNT0_HSTX_OE BIT(12)
0102 #define SW_LNT0_LPRX_EN BIT(13)
0103 #define SW_LNT1_LPTX_PRE_OE BIT(14)
0104 #define SW_LNT1_LPTX_OE BIT(15)
0105 #define SW_LNT1_LPTX_P BIT(16)
0106 #define SW_LNT1_LPTX_N BIT(17)
0107 #define SW_LNT1_HSTX_PRE_OE BIT(18)
0108 #define SW_LNT1_HSTX_OE BIT(19)
0109 #define SW_LNT2_LPTX_PRE_OE BIT(20)
0110 #define SW_LNT2_LPTX_OE BIT(21)
0111 #define SW_LNT2_LPTX_P BIT(22)
0112 #define SW_LNT2_LPTX_N BIT(23)
0113 #define SW_LNT2_HSTX_PRE_OE BIT(24)
0114 #define SW_LNT2_HSTX_OE BIT(25)
0115
0116 static int mtk_mipi_tx_pll_prepare(struct clk_hw *hw)
0117 {
0118 struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
0119 u8 txdiv, txdiv0, txdiv1;
0120 u64 pcw;
0121
0122 dev_dbg(mipi_tx->dev, "prepare: %u Hz\n", mipi_tx->data_rate);
0123
0124 if (mipi_tx->data_rate >= 500000000) {
0125 txdiv = 1;
0126 txdiv0 = 0;
0127 txdiv1 = 0;
0128 } else if (mipi_tx->data_rate >= 250000000) {
0129 txdiv = 2;
0130 txdiv0 = 1;
0131 txdiv1 = 0;
0132 } else if (mipi_tx->data_rate >= 125000000) {
0133 txdiv = 4;
0134 txdiv0 = 2;
0135 txdiv1 = 0;
0136 } else if (mipi_tx->data_rate > 62000000) {
0137 txdiv = 8;
0138 txdiv0 = 2;
0139 txdiv1 = 1;
0140 } else if (mipi_tx->data_rate >= 50000000) {
0141 txdiv = 16;
0142 txdiv0 = 2;
0143 txdiv1 = 2;
0144 } else {
0145 return -EINVAL;
0146 }
0147
0148 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_BG_CON,
0149 RG_DSI_VOUT_MSK |
0150 RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN,
0151 (4 << 20) | (4 << 17) | (4 << 14) |
0152 (4 << 11) | (4 << 8) | (4 << 5) |
0153 RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN);
0154
0155 usleep_range(30, 100);
0156
0157 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_TOP_CON,
0158 RG_DSI_LNT_IMP_CAL_CODE | RG_DSI_LNT_HS_BIAS_EN,
0159 (8 << 4) | RG_DSI_LNT_HS_BIAS_EN);
0160
0161 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_CON,
0162 RG_DSI_CKG_LDOOUT_EN | RG_DSI_LDOCORE_EN);
0163
0164 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_PWR,
0165 RG_DSI_MPPLL_SDM_PWR_ON |
0166 RG_DSI_MPPLL_SDM_ISO_EN,
0167 RG_DSI_MPPLL_SDM_PWR_ON);
0168
0169 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
0170 RG_DSI_MPPLL_PLL_EN);
0171
0172 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
0173 RG_DSI_MPPLL_TXDIV0 | RG_DSI_MPPLL_TXDIV1 |
0174 RG_DSI_MPPLL_PREDIV,
0175 (txdiv0 << 3) | (txdiv1 << 5));
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 pcw = div_u64(((u64)mipi_tx->data_rate * 2 * txdiv) << 24,
0186 26000000);
0187 writel(pcw, mipi_tx->regs + MIPITX_DSI_PLL_CON2);
0188
0189 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_PLL_CON1,
0190 RG_DSI_MPPLL_SDM_FRA_EN);
0191
0192 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_PLL_CON0, RG_DSI_MPPLL_PLL_EN);
0193
0194 usleep_range(20, 100);
0195
0196 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON1,
0197 RG_DSI_MPPLL_SDM_SSC_EN);
0198
0199 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_TOP,
0200 RG_DSI_MPPLL_PRESERVE,
0201 mipi_tx->driver_data->mppll_preserve);
0202
0203 return 0;
0204 }
0205
0206 static void mtk_mipi_tx_pll_unprepare(struct clk_hw *hw)
0207 {
0208 struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
0209
0210 dev_dbg(mipi_tx->dev, "unprepare\n");
0211
0212 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
0213 RG_DSI_MPPLL_PLL_EN);
0214
0215 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_TOP,
0216 RG_DSI_MPPLL_PRESERVE, 0);
0217
0218 mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_PWR,
0219 RG_DSI_MPPLL_SDM_ISO_EN |
0220 RG_DSI_MPPLL_SDM_PWR_ON,
0221 RG_DSI_MPPLL_SDM_ISO_EN);
0222
0223 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_TOP_CON,
0224 RG_DSI_LNT_HS_BIAS_EN);
0225
0226 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_CON,
0227 RG_DSI_CKG_LDOOUT_EN | RG_DSI_LDOCORE_EN);
0228
0229 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_BG_CON,
0230 RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN);
0231
0232 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
0233 RG_DSI_MPPLL_DIV_MSK);
0234 }
0235
0236 static long mtk_mipi_tx_pll_round_rate(struct clk_hw *hw, unsigned long rate,
0237 unsigned long *prate)
0238 {
0239 return clamp_val(rate, 50000000, 1250000000);
0240 }
0241
0242 static const struct clk_ops mtk_mipi_tx_pll_ops = {
0243 .prepare = mtk_mipi_tx_pll_prepare,
0244 .unprepare = mtk_mipi_tx_pll_unprepare,
0245 .round_rate = mtk_mipi_tx_pll_round_rate,
0246 .set_rate = mtk_mipi_tx_pll_set_rate,
0247 .recalc_rate = mtk_mipi_tx_pll_recalc_rate,
0248 };
0249
0250 static void mtk_mipi_tx_power_on_signal(struct phy *phy)
0251 {
0252 struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
0253 u32 reg;
0254
0255 for (reg = MIPITX_DSI_CLOCK_LANE;
0256 reg <= MIPITX_DSI_DATA_LANE3; reg += 4)
0257 mtk_mipi_tx_set_bits(mipi_tx, reg, RG_DSI_LNTx_LDOOUT_EN);
0258
0259 mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_TOP_CON,
0260 RG_DSI_PAD_TIE_LOW_EN);
0261 }
0262
0263 static void mtk_mipi_tx_power_off_signal(struct phy *phy)
0264 {
0265 struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
0266 u32 reg;
0267
0268 mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_TOP_CON,
0269 RG_DSI_PAD_TIE_LOW_EN);
0270
0271 for (reg = MIPITX_DSI_CLOCK_LANE;
0272 reg <= MIPITX_DSI_DATA_LANE3; reg += 4)
0273 mtk_mipi_tx_clear_bits(mipi_tx, reg, RG_DSI_LNTx_LDOOUT_EN);
0274 }
0275
0276 const struct mtk_mipitx_data mt2701_mipitx_data = {
0277 .mppll_preserve = (3 << 8),
0278 .mipi_tx_clk_ops = &mtk_mipi_tx_pll_ops,
0279 .mipi_tx_enable_signal = mtk_mipi_tx_power_on_signal,
0280 .mipi_tx_disable_signal = mtk_mipi_tx_power_off_signal,
0281 };
0282
0283 const struct mtk_mipitx_data mt8173_mipitx_data = {
0284 .mppll_preserve = (0 << 8),
0285 .mipi_tx_clk_ops = &mtk_mipi_tx_pll_ops,
0286 .mipi_tx_enable_signal = mtk_mipi_tx_power_on_signal,
0287 .mipi_tx_disable_signal = mtk_mipi_tx_power_off_signal,
0288 };