Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2019 MediaTek Inc.
0004  * Author: jitao.shi <jitao.shi@mediatek.com>
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      * PLL PCW config
0179      * PCW bit 24~30 = integer part of pcw
0180      * PCW bit 0~23 = fractional part of pcw
0181      * pcw = data_Rate*4*txdiv/(Ref_clk*2);
0182      * Post DIV =4, so need data_Rate*4
0183      * Ref_clk is 26MHz
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 };