xref: /rk3399_rockchip-uboot/drivers/video/drm/samsung_mipi_dcphy.c (revision cee7440b5c7d6a9e5f973cd8102635df70abf9cd)
18995df60SGuochun Huang // SPDX-License-Identifier: GPL-2.0+
28995df60SGuochun Huang /*
38995df60SGuochun Huang  * (C) Copyright 2008-2018 Fuzhou Rockchip Electronics Co., Ltd
48995df60SGuochun Huang  *
58995df60SGuochun Huang  * Author: Guochun Huang <hero.huang@rock-chips.com>
68995df60SGuochun Huang  */
78995df60SGuochun Huang 
88995df60SGuochun Huang #include <config.h>
98995df60SGuochun Huang #include <common.h>
108995df60SGuochun Huang #include <errno.h>
118995df60SGuochun Huang #include <dm.h>
128995df60SGuochun Huang #include <div64.h>
138995df60SGuochun Huang #include <asm/io.h>
148995df60SGuochun Huang #include <asm/arch-rockchip/clock.h>
158995df60SGuochun Huang #include <linux/ioport.h>
168995df60SGuochun Huang #include <linux/iopoll.h>
178995df60SGuochun Huang #include <linux/math64.h>
188995df60SGuochun Huang #include <reset.h>
1975d08e7bSGuochun Huang #include <regmap.h>
208995df60SGuochun Huang #include <syscon.h>
218995df60SGuochun Huang 
228995df60SGuochun Huang #include "rockchip_phy.h"
238995df60SGuochun Huang 
2412f57f38SGuochun Huang #define MSEC_PER_SEC	1000L
258995df60SGuochun Huang #define USEC_PER_SEC	1000000LL
268995df60SGuochun Huang #define PSEC_PER_SEC	1000000000000LL
278995df60SGuochun Huang 
288995df60SGuochun Huang #define UPDATE(x, h, l)	(((x) << (l)) & GENMASK((h), (l)))
298995df60SGuochun Huang #define HIWORD_UPDATE(v, h, l)	(((v) << (l)) | (GENMASK((h), (l)) << 16))
308995df60SGuochun Huang 
318995df60SGuochun Huang #define BIAS_CON0		0x0000
328995df60SGuochun Huang #define BIAS_CON1		0x0004
338995df60SGuochun Huang #define BIAS_CON2		0x0008
3475d08e7bSGuochun Huang #define BIAS_CON4		0x0010
3575d08e7bSGuochun Huang #define I_MUX_SEL_MASK		GENMASK(6, 5)
3675d08e7bSGuochun Huang #define I_MUX_SEL(x)		UPDATE(x, 6, 5)
378995df60SGuochun Huang 
388995df60SGuochun Huang #define PLL_CON0		0x0100
398995df60SGuochun Huang #define PLL_EN			BIT(12)
408995df60SGuochun Huang #define S_MASK			GENMASK(10, 8)
418995df60SGuochun Huang #define S(x)			UPDATE(x, 10, 8)
428995df60SGuochun Huang #define P_MASK			GENMASK(5, 0)
438995df60SGuochun Huang #define P(x)			UPDATE(x, 5, 0)
448995df60SGuochun Huang #define PLL_CON1		0x0104
458995df60SGuochun Huang #define PLL_CON2		0x0108
468995df60SGuochun Huang #define M_MASK			GENMASK(9, 0)
478995df60SGuochun Huang #define M(x)			UPDATE(x, 9, 0)
488995df60SGuochun Huang #define PLL_CON3		0x010c
498995df60SGuochun Huang #define MRR_MASK		GENMASK(13, 8)
508995df60SGuochun Huang #define MRR(x)			UPDATE(x, 13, 8)
518995df60SGuochun Huang #define MFR_MASK                GENMASK(7, 0)
528995df60SGuochun Huang #define MFR(x)			UPDATE(x, 7, 0)
538995df60SGuochun Huang #define PLL_CON4		0x0110
548995df60SGuochun Huang #define SSCG_EN			BIT(11)
558995df60SGuochun Huang #define PLL_CON5		0x0114
568995df60SGuochun Huang #define RESET_N_SEL		BIT(10)
578995df60SGuochun Huang #define PLL_ENABLE_SEL		BIT(8)
588995df60SGuochun Huang #define PLL_CON6		0x0118
598995df60SGuochun Huang #define PLL_CON7		0x011c
608995df60SGuochun Huang #define PLL_LOCK_CNT(x)		UPDATE(x, 15, 0)
618995df60SGuochun Huang #define PLL_CON8		0x0120
628995df60SGuochun Huang #define PLL_STB_CNT(x)		UPDATE(x, 15, 0)
638995df60SGuochun Huang #define PLL_STAT0		0x0140
648995df60SGuochun Huang #define PLL_LOCK		BIT(0)
658995df60SGuochun Huang 
668995df60SGuochun Huang #define DPHY_MC_GNR_CON0	0x0300
678995df60SGuochun Huang #define PHY_READY		BIT(1)
688995df60SGuochun Huang #define PHY_ENABLE		BIT(0)
698995df60SGuochun Huang #define DPHY_MC_GNR_CON1	0x0304
708995df60SGuochun Huang #define T_PHY_READY(x)		UPDATE(x, 15, 0)
718995df60SGuochun Huang #define DPHY_MC_ANA_CON0	0x0308
72cc91b41bSZhibin Huang #define EDGE_CON(x)		UPDATE(x, 14, 12)
73cc91b41bSZhibin Huang #define EDGE_CON_DIR(x)		UPDATE(x, 9, 9)
74cc91b41bSZhibin Huang #define EDGE_CON_EN		BIT(8)
75cc91b41bSZhibin Huang #define RES_UP(x)		UPDATE(x, 7, 4)
76cc91b41bSZhibin Huang #define RES_DN(x)		UPDATE(x, 3, 0)
778995df60SGuochun Huang #define DPHY_MC_ANA_CON1	0x030c
788995df60SGuochun Huang #define DPHY_MC_ANA_CON2	0x0310
798995df60SGuochun Huang #define HS_VREG_AMP_ICON(x)	UPDATE(x, 1, 0)
808995df60SGuochun Huang #define DPHY_MC_TIME_CON0	0x0330
818995df60SGuochun Huang #define HSTX_CLK_SEL		BIT(12)
828995df60SGuochun Huang #define T_LPX(x)		UPDATE(x, 11, 4)
838995df60SGuochun Huang #define DPHY_MC_TIME_CON1	0x0334
848995df60SGuochun Huang #define T_CLK_ZERO(x)		UPDATE(x, 15, 8)
858995df60SGuochun Huang #define T_CLK_PREPARE(x)	UPDATE(x, 7, 0)
868995df60SGuochun Huang #define DPHY_MC_TIME_CON2	0x0338
878995df60SGuochun Huang #define T_HS_EXIT(x)		UPDATE(x, 15, 8)
888995df60SGuochun Huang #define T_CLK_TRAIL(x)		UPDATE(x, 7, 0)
898995df60SGuochun Huang #define DPHY_MC_TIME_CON3	0x033c
908995df60SGuochun Huang #define T_CLK_POST(x)		UPDATE(x, 7, 0)
918995df60SGuochun Huang #define DPHY_MC_TIME_CON4	0x0340
928995df60SGuochun Huang #define T_ULPS_EXIT(x)		UPDATE(x, 9, 0)
938995df60SGuochun Huang #define DPHY_MC_DESKEW_CON0	0x0350
948995df60SGuochun Huang #define SKEW_CAL_RUN_TIME(x)	UPDATE(x, 15, 12)
958995df60SGuochun Huang 
968995df60SGuochun Huang #define SKEW_CAL_INIT_RUN_TIME(x)	UPDATE(x, 11, 8)
978995df60SGuochun Huang #define SKEW_CAL_INIT_WAIT_TIME(x)	UPDATE(x, 7, 4)
988995df60SGuochun Huang #define SKEW_CAL_EN			BIT(0)
998995df60SGuochun Huang 
1008995df60SGuochun Huang #define COMBO_MD0_GNR_CON0	0x0400
1018995df60SGuochun Huang #define COMBO_MD0_GNR_CON1	0x0404
1028995df60SGuochun Huang #define COMBO_MD0_ANA_CON0	0x0408
1038995df60SGuochun Huang #define COMBO_MD0_ANA_CON1      0x040C
1048995df60SGuochun Huang #define COMBO_MD0_ANA_CON2	0x0410
1058995df60SGuochun Huang 
1068995df60SGuochun Huang #define COMBO_MD0_TIME_CON0	0x0430
1078995df60SGuochun Huang #define COMBO_MD0_TIME_CON1	0x0434
1088995df60SGuochun Huang #define COMBO_MD0_TIME_CON2	0x0438
1098995df60SGuochun Huang #define COMBO_MD0_TIME_CON3	0x043C
1108995df60SGuochun Huang #define COMBO_MD0_TIME_CON4	0x0440
1118995df60SGuochun Huang #define COMBO_MD0_DATA_CON0	0x0444
1128995df60SGuochun Huang 
1138995df60SGuochun Huang #define COMBO_MD1_GNR_CON0	0x0500
1148995df60SGuochun Huang #define COMBO_MD1_GNR_CON1	0x0504
1158995df60SGuochun Huang #define COMBO_MD1_ANA_CON0	0x0508
1168995df60SGuochun Huang #define COMBO_MD1_ANA_CON1	0x050c
1178995df60SGuochun Huang #define COMBO_MD1_ANA_CON2	0x0510
1188995df60SGuochun Huang #define COMBO_MD1_TIME_CON0	0x0530
1198995df60SGuochun Huang #define COMBO_MD1_TIME_CON1	0x0534
1208995df60SGuochun Huang #define COMBO_MD1_TIME_CON2	0x0538
1218995df60SGuochun Huang #define COMBO_MD1_TIME_CON3	0x053C
1228995df60SGuochun Huang #define COMBO_MD1_TIME_CON4	0x0540
1238995df60SGuochun Huang #define COMBO_MD1_DATA_CON0	0x0544
1248995df60SGuochun Huang 
1258995df60SGuochun Huang #define COMBO_MD2_GNR_CON0	0x0600
1268995df60SGuochun Huang #define COMBO_MD2_GNR_CON1	0x0604
1278995df60SGuochun Huang #define COMBO_MD2_ANA_CON0	0X0608
1288995df60SGuochun Huang #define COMBO_MD2_ANA_CON1	0X060C
1298995df60SGuochun Huang #define COMBO_MD2_ANA_CON2	0X0610
1308995df60SGuochun Huang #define COMBO_MD2_TIME_CON0	0x0630
1318995df60SGuochun Huang #define COMBO_MD2_TIME_CON1	0x0634
1328995df60SGuochun Huang #define COMBO_MD2_TIME_CON2	0x0638
1338995df60SGuochun Huang #define COMBO_MD2_TIME_CON3	0x063C
1348995df60SGuochun Huang #define COMBO_MD2_TIME_CON4	0x0640
1358995df60SGuochun Huang #define COMBO_MD2_DATA_CON0	0x0644
1368995df60SGuochun Huang 
1378995df60SGuochun Huang #define DPHY_MD3_GNR_CON0	0x0700
1388995df60SGuochun Huang #define DPHY_MD3_GNR_CON1	0x0704
1398995df60SGuochun Huang #define DPHY_MD3_ANA_CON0	0X0708
1408995df60SGuochun Huang #define DPHY_MD3_ANA_CON1	0X070C
1418995df60SGuochun Huang #define DPHY_MD3_ANA_CON2	0X0710
1428995df60SGuochun Huang #define DPHY_MD3_TIME_CON0	0x0730
1438995df60SGuochun Huang #define DPHY_MD3_TIME_CON1	0x0734
1448995df60SGuochun Huang #define DPHY_MD3_TIME_CON2	0x0738
1458995df60SGuochun Huang #define DPHY_MD3_TIME_CON3	0x073C
1468995df60SGuochun Huang #define DPHY_MD3_TIME_CON4	0x0740
1478995df60SGuochun Huang #define DPHY_MD3_DATA_CON0	0x0744
1488995df60SGuochun Huang 
1498995df60SGuochun Huang #define T_LP_EXIT_SKEW(x)	UPDATE(x, 3, 2)
1508995df60SGuochun Huang #define T_LP_ENTRY_SKEW(x)	UPDATE(x, 1, 0)
1518995df60SGuochun Huang #define T_HS_ZERO(x)		UPDATE(x, 15, 8)
1528995df60SGuochun Huang #define T_HS_PREPARE(x)		UPDATE(x, 7, 0)
1538995df60SGuochun Huang #define T_HS_EXIT(x)		UPDATE(x, 15, 8)
1548995df60SGuochun Huang #define T_HS_TRAIL(x)		UPDATE(x, 7, 0)
1558995df60SGuochun Huang #define T_TA_GET(x)		UPDATE(x, 7, 4)
1568995df60SGuochun Huang #define T_TA_GO(x)		UPDATE(x, 3, 0)
1578995df60SGuochun Huang 
1588995df60SGuochun Huang /* MIPI_CDPHY_GRF registers */
1598995df60SGuochun Huang #define MIPI_DCPHY_GRF_CON0	0x0000
1608995df60SGuochun Huang #define S_CPHY_MODE		HIWORD_UPDATE(1, 3, 3)
1618995df60SGuochun Huang #define M_CPHY_MODE		HIWORD_UPDATE(1, 0, 0)
1628995df60SGuochun Huang 
1638995df60SGuochun Huang struct samsung_mipi_dphy_timing {
1648995df60SGuochun Huang 	unsigned int max_lane_mbps;
1658995df60SGuochun Huang 	u8 clk_prepare;
1668995df60SGuochun Huang 	u8 clk_zero;
1678995df60SGuochun Huang 	u8 clk_post;
1688995df60SGuochun Huang 	u8 clk_trail_eot;
1698995df60SGuochun Huang 	u8 hs_prepare;
1708995df60SGuochun Huang 	u8 hs_zero;
1718995df60SGuochun Huang 	u8 hs_trail_eot;
1728995df60SGuochun Huang 	u8 lpx;
1738995df60SGuochun Huang 	u8 hs_exit;
1748995df60SGuochun Huang 	u8 hs_settle;
1758995df60SGuochun Huang };
1768995df60SGuochun Huang 
1778995df60SGuochun Huang struct samsung_mipi_cphy_timing {
1788995df60SGuochun Huang 	unsigned int max_lane_msps;
1798995df60SGuochun Huang 	u8 prepare_3;
1808995df60SGuochun Huang 	u8 prebegin_3;
1818995df60SGuochun Huang 	u8 post_3;
1828995df60SGuochun Huang 	u8 lpx;
1838995df60SGuochun Huang 	u8 hs_exit;
1848995df60SGuochun Huang 	u8 settle_3;
1858995df60SGuochun Huang };
1868995df60SGuochun Huang 
187cc91b41bSZhibin Huang enum hs_drv_res_ohm {
188cc91b41bSZhibin Huang 	_30_OHM = 0x8,
189cc91b41bSZhibin Huang 	_31_2_OHM,
190cc91b41bSZhibin Huang 	_32_5_OHM,
191cc91b41bSZhibin Huang 	_34_OHM,
192cc91b41bSZhibin Huang 	_35_5_OHM,
193cc91b41bSZhibin Huang 	_37_OHM,
194cc91b41bSZhibin Huang 	_39_OHM,
195cc91b41bSZhibin Huang 	_41_OHM,
196cc91b41bSZhibin Huang 	_43_OHM = 0x0,
197cc91b41bSZhibin Huang 	_46_OHM,
198cc91b41bSZhibin Huang 	_49_OHM,
199cc91b41bSZhibin Huang 	_52_OHM,
200cc91b41bSZhibin Huang 	_56_OHM,
201cc91b41bSZhibin Huang 	_60_OHM,
202cc91b41bSZhibin Huang 	_66_OHM,
203cc91b41bSZhibin Huang 	_73_OHM,
204cc91b41bSZhibin Huang };
205cc91b41bSZhibin Huang 
206cc91b41bSZhibin Huang struct hs_drv_res_cfg {
207cc91b41bSZhibin Huang 	enum hs_drv_res_ohm clk_hs_drv_up_ohm;
208cc91b41bSZhibin Huang 	enum hs_drv_res_ohm clk_hs_drv_down_ohm;
209cc91b41bSZhibin Huang 	enum hs_drv_res_ohm data_hs_drv_up_ohm;
210cc91b41bSZhibin Huang 	enum hs_drv_res_ohm data_hs_drv_down_ohm;
211cc91b41bSZhibin Huang };
212cc91b41bSZhibin Huang 
213ffabeb2fSGuochun Huang struct samsung_mipi_dcphy_plat_data {
214cc91b41bSZhibin Huang 	const struct hs_drv_res_cfg *dphy_hs_drv_res_cfg;
215ffabeb2fSGuochun Huang 	u32 dphy_tx_max_kbps_per_lane;
216ffabeb2fSGuochun Huang 	u32 cphy_tx_max_ksps_per_lane;
217ffabeb2fSGuochun Huang };
218ffabeb2fSGuochun Huang 
2198995df60SGuochun Huang struct samsung_mipi_dcphy {
2208995df60SGuochun Huang 	enum phy_mode mode;
2218995df60SGuochun Huang 	void *base;
2228995df60SGuochun Huang 	void *grf;
22306bd1923SGuochun Huang 	int lanes;
2248995df60SGuochun Huang 	bool c_option;
225cd24009bSGuochun Huang 	struct reset_ctl m_phy_rst;
2268995df60SGuochun Huang 
227ffabeb2fSGuochun Huang 	const struct samsung_mipi_dcphy_plat_data *pdata;
2288995df60SGuochun Huang 	struct {
2298995df60SGuochun Huang 		unsigned long long rate;
2308995df60SGuochun Huang 		u8 prediv;
2318995df60SGuochun Huang 		u16 fbdiv;
23221906a8eSZhibin Huang 		u16 dsm;
2338995df60SGuochun Huang 		u8 scaler;
2348995df60SGuochun Huang 
2358995df60SGuochun Huang 		bool ssc_en;
2368995df60SGuochun Huang 		u8 mfr;
2378995df60SGuochun Huang 		u8 mrr;
2388995df60SGuochun Huang 	} pll;
2398995df60SGuochun Huang };
2408995df60SGuochun Huang 
2418995df60SGuochun Huang static const
2428995df60SGuochun Huang struct samsung_mipi_dphy_timing samsung_mipi_dphy_timing_table[] = {
2438995df60SGuochun Huang 	{6500, 32, 117, 31, 28, 30, 56, 27, 24, 44, 37},
2448995df60SGuochun Huang 	{6490, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
2458995df60SGuochun Huang 	{6480, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
2468995df60SGuochun Huang 	{6470, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
2478995df60SGuochun Huang 	{6460, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
2488995df60SGuochun Huang 	{6450, 32, 115, 31, 28, 30, 56, 27, 24, 44, 37},
2498995df60SGuochun Huang 	{6440, 32, 115, 31, 28, 30, 56, 27, 24, 44, 37},
2508995df60SGuochun Huang 	{6430, 31, 116, 31, 28, 30, 55, 27, 24, 44, 37},
2518995df60SGuochun Huang 	{6420, 31, 116, 31, 28, 30, 55, 27, 24, 44, 37},
2528995df60SGuochun Huang 	{6410, 31, 116, 31, 27, 30, 55, 27, 24, 44, 37},
2538995df60SGuochun Huang 	{6400, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
2548995df60SGuochun Huang 	{6390, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
2558995df60SGuochun Huang 	{6380, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
2568995df60SGuochun Huang 	{6370, 31, 115, 30, 27, 30, 55, 26, 23, 43, 36},
2578995df60SGuochun Huang 	{6360, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
2588995df60SGuochun Huang 	{6350, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
2598995df60SGuochun Huang 	{6340, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
2608995df60SGuochun Huang 	{6330, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
2618995df60SGuochun Huang 	{6320, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
2628995df60SGuochun Huang 	{6310, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
2638995df60SGuochun Huang 	{6300, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
2648995df60SGuochun Huang 	{6290, 31, 113, 30, 27, 29, 54, 26, 23, 43, 36},
2658995df60SGuochun Huang 	{6280, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
2668995df60SGuochun Huang 	{6270, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
2678995df60SGuochun Huang 	{6260, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
2688995df60SGuochun Huang 	{6250, 31, 112, 30, 27, 29, 54, 26, 23, 42, 36},
2698995df60SGuochun Huang 	{6240, 30, 113, 30, 27, 29, 54, 26, 23, 42, 36},
2708995df60SGuochun Huang 	{6230, 30, 112, 30, 27, 29, 54, 26, 23, 42, 35},
2718995df60SGuochun Huang 	{6220, 30, 112, 30, 27, 29, 53, 26, 23, 42, 35},
2728995df60SGuochun Huang 	{6210, 30, 112, 30, 27, 29, 53, 26, 23, 42, 35},
2738995df60SGuochun Huang 	{6200, 30, 112, 29, 27, 29, 53, 26, 23, 42, 35},
2748995df60SGuochun Huang 	{6190, 30, 111, 29, 27, 29, 53, 26, 23, 42, 35},
2758995df60SGuochun Huang 	{6180, 30, 111, 29, 27, 29, 53, 26, 23, 42, 35},
2768995df60SGuochun Huang 	{6170, 30, 111, 29, 26, 29, 53, 26, 23, 42, 35},
2778995df60SGuochun Huang 	{6160, 30, 111, 29, 26, 29, 53, 26, 23, 42, 35},
2788995df60SGuochun Huang 	{6150, 30, 110, 29, 26, 29, 53, 26, 23, 42, 35},
2798995df60SGuochun Huang 	{6140, 30, 110, 29, 26, 29, 52, 26, 23, 42, 35},
2808995df60SGuochun Huang 	{6130, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
2818995df60SGuochun Huang 	{6120, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
2828995df60SGuochun Huang 	{6110, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
2838995df60SGuochun Huang 	{6100, 30, 109, 29, 26, 29, 52, 25, 22, 41, 35},
2848995df60SGuochun Huang 	{6090, 30, 109, 29, 26, 29, 52, 25, 22, 41, 35},
2858995df60SGuochun Huang 	{6080, 30, 109, 29, 26, 28, 53, 25, 22, 41, 35},
2868995df60SGuochun Huang 	{6070, 30, 109, 29, 26, 28, 52, 25, 22, 41, 34},
2878995df60SGuochun Huang 	{6060, 30, 108, 29, 26, 28, 52, 25, 22, 41, 34},
2888995df60SGuochun Huang 	{6050, 30, 108, 29, 26, 28, 52, 25, 22, 41, 34},
2898995df60SGuochun Huang 	{6040, 29, 109, 29, 26, 28, 52, 25, 22, 41, 34},
2908995df60SGuochun Huang 	{6030, 29, 109, 29, 26, 28, 52, 25, 22, 41, 34},
2918995df60SGuochun Huang 	{6020, 29, 108, 29, 26, 28, 52, 25, 22, 41, 34},
2928995df60SGuochun Huang 	{6010, 29, 108, 29, 26, 28, 52, 25, 22, 41, 34},
2938995df60SGuochun Huang 	{6000, 29, 108, 28, 26, 28, 51, 25, 22, 41, 34},
2948995df60SGuochun Huang 	{5990, 29, 108, 28, 26, 28, 51, 25, 22, 41, 34},
2958995df60SGuochun Huang 	{5980, 29, 107, 28, 26, 28, 51, 25, 22, 41, 34},
2968995df60SGuochun Huang 	{5970, 29, 107, 28, 26, 28, 51, 25, 22, 41, 34},
2978995df60SGuochun Huang 	{5960, 29, 107, 28, 26, 28, 51, 25, 22, 40, 34},
2988995df60SGuochun Huang 	{5950, 29, 107, 28, 26, 28, 51, 25, 22, 40, 34},
2998995df60SGuochun Huang 	{5940, 29, 107, 28, 25, 28, 51, 25, 22, 40, 34},
3008995df60SGuochun Huang 	{5930, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
3018995df60SGuochun Huang 	{5920, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
3028995df60SGuochun Huang 	{5910, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
3038995df60SGuochun Huang 	{5900, 29, 106, 28, 25, 28, 50, 24, 22, 40, 33},
3048995df60SGuochun Huang 	{5890, 29, 105, 28, 25, 28, 50, 24, 22, 40, 33},
3058995df60SGuochun Huang 	{5880, 29, 105, 28, 25, 28, 50, 24, 22, 40, 33},
3068995df60SGuochun Huang 	{5870, 29, 105, 28, 25, 27, 51, 24, 22, 40, 33},
3078995df60SGuochun Huang 	{5860, 29, 105, 28, 25, 27, 51, 24, 21, 40, 33},
3088995df60SGuochun Huang 	{5850, 29, 104, 28, 25, 27, 50, 24, 21, 40, 33},
3098995df60SGuochun Huang 	{5840, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
3108995df60SGuochun Huang 	{5830, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
3118995df60SGuochun Huang 	{5820, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
3128995df60SGuochun Huang 	{5810, 28, 104, 28, 25, 27, 50, 24, 21, 39, 33},
3138995df60SGuochun Huang 	{5800, 28, 104, 27, 25, 27, 50, 24, 21, 39, 33},
3148995df60SGuochun Huang 	{5790, 28, 104, 27, 25, 27, 50, 24, 21, 39, 33},
3158995df60SGuochun Huang 	{5780, 28, 104, 27, 25, 27, 49, 24, 21, 39, 33},
3168995df60SGuochun Huang 	{5770, 28, 104, 27, 25, 27, 49, 24, 21, 39, 33},
3178995df60SGuochun Huang 	{5760, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
3188995df60SGuochun Huang 	{5750, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
3198995df60SGuochun Huang 	{5740, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
3208995df60SGuochun Huang 	{5730, 28, 103, 27, 25, 27, 49, 24, 21, 39, 32},
3218995df60SGuochun Huang 	{5720, 28, 102, 27, 25, 27, 49, 24, 21, 39, 32},
3228995df60SGuochun Huang 	{5710, 28, 102, 27, 25, 27, 48, 24, 21, 39, 32},
3238995df60SGuochun Huang 	{5700, 28, 102, 27, 24, 27, 48, 24, 21, 39, 32},
3248995df60SGuochun Huang 	{5690, 28, 102, 27, 24, 27, 48, 24, 21, 39, 32},
3258995df60SGuochun Huang 	{5680, 28, 101, 27, 24, 27, 48, 24, 21, 39, 32},
3268995df60SGuochun Huang 	{5670, 28, 101, 27, 24, 27, 48, 23, 21, 38, 32},
3278995df60SGuochun Huang 	{5660, 28, 101, 27, 24, 26, 49, 23, 21, 38, 32},
3288995df60SGuochun Huang 	{5650, 28, 101, 27, 24, 26, 49, 23, 21, 38, 32},
3298995df60SGuochun Huang 	{5640, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
3308995df60SGuochun Huang 	{5630, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
3318995df60SGuochun Huang 	{5620, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
3328995df60SGuochun Huang 	{5610, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
3338995df60SGuochun Huang 	{5600, 27, 101, 26, 24, 26, 48, 23, 20, 38, 32},
3348995df60SGuochun Huang 	{5590, 27, 100, 26, 24, 26, 48, 23, 20, 38, 32},
3358995df60SGuochun Huang 	{5580, 27, 100, 26, 24, 26, 48, 23, 20, 38, 32},
3368995df60SGuochun Huang 	{5570, 27, 100, 26, 24, 26, 48, 23, 20, 38, 31},
3378995df60SGuochun Huang 	{5560, 27, 100, 26, 24, 26, 47, 23, 20, 38, 31},
3388995df60SGuochun Huang 	{5550, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
3398995df60SGuochun Huang 	{5540, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
3408995df60SGuochun Huang 	{5530, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
3418995df60SGuochun Huang 	{5520, 27,  99, 26, 24, 26, 47, 23, 20, 37, 31},
3428995df60SGuochun Huang 	{5510, 27,  98, 26, 24, 26, 47, 23, 20, 37, 31},
3438995df60SGuochun Huang 	{5500, 27,  98, 26, 24, 26, 47, 23, 20, 37, 31},
3448995df60SGuochun Huang 	{5490, 27,  98, 26, 24, 26, 46, 23, 20, 37, 31},
3458995df60SGuochun Huang 	{5480, 27,  98, 26, 24, 26, 46, 23, 20, 37, 31},
3468995df60SGuochun Huang 	{5470, 27,  97, 26, 23, 26, 46, 23, 20, 37, 31},
3478995df60SGuochun Huang 	{5460, 27,  97, 26, 23, 26, 46, 23, 20, 37, 31},
3488995df60SGuochun Huang 	{5450, 27,  97, 26, 23, 25, 47, 23, 20, 37, 31},
3498995df60SGuochun Huang 	{5440, 26,  98, 26, 23, 25, 47, 23, 20, 37, 31},
3508995df60SGuochun Huang 	{5430, 26,  98, 26, 23, 25, 47, 22, 20, 37, 31},
3518995df60SGuochun Huang 	{5420, 26,  97, 26, 23, 25, 46, 22, 20, 37, 31},
3528995df60SGuochun Huang 	{5410, 26,  97, 26, 23, 25, 46, 22, 20, 37, 31},
3538995df60SGuochun Huang 	{5400, 26,  97, 25, 23, 25, 46, 22, 20, 37, 30},
3548995df60SGuochun Huang 	{5390, 26,  97, 25, 23, 25, 46, 22, 20, 37, 30},
3558995df60SGuochun Huang 	{5380, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
3568995df60SGuochun Huang 	{5370, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
3578995df60SGuochun Huang 	{5360, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
3588995df60SGuochun Huang 	{5350, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
3598995df60SGuochun Huang 	{5340, 26,  95, 25, 23, 25, 45, 22, 20, 36, 30},
3608995df60SGuochun Huang 	{5330, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
3618995df60SGuochun Huang 	{5320, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
3628995df60SGuochun Huang 	{5310, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
3638995df60SGuochun Huang 	{5300, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
3648995df60SGuochun Huang 	{5290, 26,  94, 25, 23, 25, 45, 22, 19, 36, 30},
3658995df60SGuochun Huang 	{5280, 26,  94, 25, 23, 25, 45, 22, 19, 36, 30},
3668995df60SGuochun Huang 	{5270, 26,  94, 25, 23, 25, 44, 22, 19, 36, 30},
3678995df60SGuochun Huang 	{5260, 26,  94, 25, 23, 25, 44, 22, 19, 36, 30},
3688995df60SGuochun Huang 	{5250, 25,  94, 25, 23, 24, 45, 22, 19, 36, 30},
3698995df60SGuochun Huang 	{5240, 25,  94, 25, 23, 24, 45, 22, 19, 36, 29},
3708995df60SGuochun Huang 	{5230, 25,  94, 25, 22, 24, 45, 22, 19, 35, 29},
3718995df60SGuochun Huang 	{5220, 25,  94, 25, 22, 24, 45, 22, 19, 35, 29},
3728995df60SGuochun Huang 	{5210, 25,  93, 25, 22, 24, 45, 22, 19, 35, 29},
3738995df60SGuochun Huang 	{5200, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
3748995df60SGuochun Huang 	{5190, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
3758995df60SGuochun Huang 	{5180, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
3768995df60SGuochun Huang 	{5170, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
3778995df60SGuochun Huang 	{5160, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
3788995df60SGuochun Huang 	{5150, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
3798995df60SGuochun Huang 	{5140, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
3808995df60SGuochun Huang 	{5130, 25,  92, 24, 22, 24, 43, 21, 19, 35, 29},
3818995df60SGuochun Huang 	{5120, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
3828995df60SGuochun Huang 	{5110, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
3838995df60SGuochun Huang 	{5100, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
3848995df60SGuochun Huang 	{5090, 25,  91, 24, 22, 24, 43, 21, 19, 34, 29},
3858995df60SGuochun Huang 	{5080, 25,  90, 24, 22, 24, 43, 21, 19, 34, 29},
3868995df60SGuochun Huang 	{5070, 25,  90, 24, 22, 24, 43, 21, 19, 34, 28},
3878995df60SGuochun Huang 	{5060, 25,  90, 24, 22, 24, 43, 21, 18, 34, 28},
3888995df60SGuochun Huang 	{5050, 24,  91, 24, 22, 24, 42, 21, 18, 34, 28},
3898995df60SGuochun Huang 	{5040, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
3908995df60SGuochun Huang 	{5030, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
3918995df60SGuochun Huang 	{5020, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
3928995df60SGuochun Huang 	{5010, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
3938995df60SGuochun Huang 	{5000, 24,  89, 23, 21, 23, 43, 21, 18, 34, 28},
3948995df60SGuochun Huang 	{4990, 24,  89, 23, 21, 23, 43, 21, 18, 34, 28},
3958995df60SGuochun Huang 	{4980, 24,  89, 23, 21, 23, 42, 21, 18, 34, 28},
3968995df60SGuochun Huang 	{4970, 24,  89, 23, 21, 23, 42, 21, 18, 34, 28},
3978995df60SGuochun Huang 	{4960, 24,  89, 23, 21, 23, 42, 20, 18, 34, 28},
3988995df60SGuochun Huang 	{4950, 24,  88, 23, 21, 23, 42, 20, 18, 34, 28},
3998995df60SGuochun Huang 	{4940, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
4008995df60SGuochun Huang 	{4930, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
4018995df60SGuochun Huang 	{4920, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
4028995df60SGuochun Huang 	{4910, 24,  87, 23, 21, 23, 41, 20, 18, 33, 28},
4038995df60SGuochun Huang 	{4900, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
4048995df60SGuochun Huang 	{4890, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
4058995df60SGuochun Huang 	{4880, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
4068995df60SGuochun Huang 	{4870, 24,  86, 23, 21, 23, 41, 20, 18, 33, 27},
4078995df60SGuochun Huang 	{4860, 24,  86, 23, 21, 23, 41, 20, 18, 33, 27},
4088995df60SGuochun Huang 	{4850, 23,  87, 23, 21, 23, 41, 20, 18, 33, 27},
4098995df60SGuochun Huang 	{4840, 23,  87, 23, 21, 23, 40, 20, 18, 33, 27},
4108995df60SGuochun Huang 	{4830, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
4118995df60SGuochun Huang 	{4820, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
4128995df60SGuochun Huang 	{4810, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
4138995df60SGuochun Huang 	{4800, 23,  86, 22, 21, 22, 41, 20, 17, 32, 27},
4148995df60SGuochun Huang 	{4790, 23,  86, 22, 21, 22, 41, 20, 17, 32, 27},
4158995df60SGuochun Huang 	{4780, 23,  85, 22, 21, 22, 41, 20, 17, 32, 27},
4168995df60SGuochun Huang 	{4770, 23,  85, 22, 21, 22, 41, 20, 17, 32, 27},
4178995df60SGuochun Huang 	{4760, 23,  85, 22, 20, 22, 40, 20, 17, 32, 27},
4188995df60SGuochun Huang 	{4750, 23,  85, 22, 20, 22, 40, 20, 17, 32, 27},
4198995df60SGuochun Huang 	{4740, 23,  84, 22, 20, 22, 40, 20, 17, 32, 26},
4208995df60SGuochun Huang 	{4730, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
4218995df60SGuochun Huang 	{4720, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
4228995df60SGuochun Huang 	{4710, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
4238995df60SGuochun Huang 	{4700, 23,  83, 22, 20, 22, 40, 19, 17, 32, 26},
4248995df60SGuochun Huang 	{4690, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
4258995df60SGuochun Huang 	{4680, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
4268995df60SGuochun Huang 	{4670, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
4278995df60SGuochun Huang 	{4660, 23,  82, 22, 20, 22, 39, 19, 17, 32, 26},
4288995df60SGuochun Huang 	{4650, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
4298995df60SGuochun Huang 	{4640, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
4308995df60SGuochun Huang 	{4630, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
4318995df60SGuochun Huang 	{4620, 22,  83, 22, 20, 21, 39, 19, 17, 31, 26},
4328995df60SGuochun Huang 	{4610, 22,  82, 22, 20, 21, 39, 19, 17, 31, 26},
4338995df60SGuochun Huang 	{4600, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
4348995df60SGuochun Huang 	{4590, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
4358995df60SGuochun Huang 	{4580, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
4368995df60SGuochun Huang 	{4570, 22,  81, 21, 20, 21, 39, 19, 17, 31, 25},
4378995df60SGuochun Huang 	{4560, 22,  81, 21, 20, 21, 39, 19, 17, 31, 25},
4388995df60SGuochun Huang 	{4550, 22,  81, 21, 20, 21, 38, 19, 17, 31, 25},
4398995df60SGuochun Huang 	{4540, 22,  81, 21, 20, 21, 38, 19, 17, 31, 25},
4408995df60SGuochun Huang 	{4530, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
4418995df60SGuochun Huang 	{4520, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
4428995df60SGuochun Huang 	{4510, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
4438995df60SGuochun Huang 	{4500, 22,  80, 21, 19, 21, 38, 19, 16, 30, 25},
4448995df60SGuochun Huang 	{4490, 22,  80, 21, 19, 21, 38, 18, 16, 30, 25},
4458995df60SGuochun Huang 	{4480, 22,  79, 21, 19, 21, 38, 18, 16, 30, 25},
4468995df60SGuochun Huang 	{4470, 22,  79, 21, 19, 21, 37, 18, 16, 30, 25},
4478995df60SGuochun Huang 	{4460, 22,  79, 21, 19, 21, 37, 18, 16, 30, 25},
4488995df60SGuochun Huang 	{4450, 21,  80, 21, 19, 21, 37, 18, 16, 30, 25},
4498995df60SGuochun Huang 	{4440, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
4508995df60SGuochun Huang 	{4430, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
4518995df60SGuochun Huang 	{4420, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
4528995df60SGuochun Huang 	{4410, 21,  79, 21, 19, 20, 38, 18, 16, 30, 25},
4538995df60SGuochun Huang 	{4400, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
4548995df60SGuochun Huang 	{4390, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
4558995df60SGuochun Huang 	{4380, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
4568995df60SGuochun Huang 	{4370, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
4578995df60SGuochun Huang 	{4360, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
4588995df60SGuochun Huang 	{4350, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
4598995df60SGuochun Huang 	{4340, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
4608995df60SGuochun Huang 	{4330, 21,  77, 20, 19, 20, 36, 18, 16, 29, 24},
4618995df60SGuochun Huang 	{4320, 21,  77, 20, 19, 20, 36, 18, 16, 29, 24},
4628995df60SGuochun Huang 	{4310, 21,  76, 20, 19, 20, 36, 18, 16, 29, 24},
4638995df60SGuochun Huang 	{4300, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
4648995df60SGuochun Huang 	{4290, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
4658995df60SGuochun Huang 	{4280, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
4668995df60SGuochun Huang 	{4270, 21,  75, 20, 18, 20, 36, 18, 16, 29, 24},
4678995df60SGuochun Huang 	{4260, 21,  75, 20, 18, 20, 35, 17, 15, 29, 24},
4688995df60SGuochun Huang 	{4250, 20,  76, 20, 18, 20, 35, 17, 15, 29, 24},
4698995df60SGuochun Huang 	{4240, 20,  76, 20, 18, 20, 35, 17, 15, 29, 23},
4708995df60SGuochun Huang 	{4230, 20,  75, 20, 18, 20, 35, 17, 15, 29, 23},
4718995df60SGuochun Huang 	{4220, 20,  75, 20, 18, 20, 35, 17, 15, 29, 23},
4728995df60SGuochun Huang 	{4210, 20,  75, 20, 18, 20, 35, 17, 15, 28, 23},
4738995df60SGuochun Huang 	{4200, 20,  75, 19, 18, 19, 36, 17, 15, 28, 23},
4748995df60SGuochun Huang 	{4190, 20,  74, 19, 18, 19, 36, 17, 15, 28, 23},
4758995df60SGuochun Huang 	{4180, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
4768995df60SGuochun Huang 	{4170, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
4778995df60SGuochun Huang 	{4160, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
4788995df60SGuochun Huang 	{4150, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
4798995df60SGuochun Huang 	{4140, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
4808995df60SGuochun Huang 	{4130, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
4818995df60SGuochun Huang 	{4120, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
4828995df60SGuochun Huang 	{4110, 20,  73, 19, 18, 19, 34, 17, 15, 28, 23},
4838995df60SGuochun Huang 	{4100, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
4848995df60SGuochun Huang 	{4090, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
4858995df60SGuochun Huang 	{4080, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
4868995df60SGuochun Huang 	{4070, 20,  72, 19, 18, 19, 34, 17, 15, 27, 22},
4878995df60SGuochun Huang 	{4060, 19,  72, 19, 17, 19, 34, 17, 15, 27, 22},
4888995df60SGuochun Huang 	{4050, 19,  72, 19, 17, 19, 34, 17, 15, 27, 22},
4898995df60SGuochun Huang 	{4040, 19,  72, 19, 17, 19, 33, 17, 15, 27, 22},
4908995df60SGuochun Huang 	{4030, 19,  72, 19, 17, 19, 33, 17, 15, 27, 22},
4918995df60SGuochun Huang 	{4020, 19,  71, 19, 17, 19, 33, 16, 15, 27, 22},
4928995df60SGuochun Huang 	{4010, 19,  71, 19, 17, 19, 33, 16, 15, 27, 22},
4938995df60SGuochun Huang 	{4000, 19,  71, 18, 17, 19, 33, 16, 14, 27, 22},
4948995df60SGuochun Huang 	{3990, 19,  71, 18, 17, 18, 34, 16, 14, 27, 22},
4958995df60SGuochun Huang 	{3980, 19,  71, 18, 17, 18, 34, 16, 14, 27, 22},
4968995df60SGuochun Huang 	{3970, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
4978995df60SGuochun Huang 	{3960, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
4988995df60SGuochun Huang 	{3950, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
4998995df60SGuochun Huang 	{3940, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
5008995df60SGuochun Huang 	{3930, 19,  69, 18, 17, 18, 33, 16, 14, 27, 22},
5018995df60SGuochun Huang 	{3920, 19,  69, 18, 17, 18, 33, 16, 14, 26, 22},
5028995df60SGuochun Huang 	{3910, 19,  69, 18, 17, 18, 33, 16, 14, 26, 22},
5038995df60SGuochun Huang 	{3900, 19,  69, 18, 17, 18, 33, 16, 14, 26, 21},
5048995df60SGuochun Huang 	{3890, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
5058995df60SGuochun Huang 	{3880, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
5068995df60SGuochun Huang 	{3870, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
5078995df60SGuochun Huang 	{3860, 18,  69, 18, 17, 18, 32, 16, 14, 26, 21},
5088995df60SGuochun Huang 	{3850, 18,  68, 18, 17, 18, 32, 16, 14, 26, 21},
5098995df60SGuochun Huang 	{3840, 18,  68, 18, 17, 18, 32, 16, 14, 26, 21},
5108995df60SGuochun Huang 	{3830, 18,  68, 18, 16, 18, 32, 16, 14, 26, 21},
5118995df60SGuochun Huang 	{3820, 18,  68, 18, 16, 18, 31, 16, 14, 26, 21},
5128995df60SGuochun Huang 	{3810, 18,  68, 18, 16, 18, 31, 16, 14, 26, 21},
5138995df60SGuochun Huang 	{3800, 18,  67, 17, 16, 18, 31, 16, 14, 26, 21},
5148995df60SGuochun Huang 	{3790, 18,  67, 17, 16, 17, 32, 15, 14, 26, 21},
5158995df60SGuochun Huang 	{3780, 18,  67, 17, 16, 17, 32, 15, 14, 25, 21},
5168995df60SGuochun Huang 	{3770, 18,  67, 17, 16, 17, 32, 15, 14, 25, 21},
5178995df60SGuochun Huang 	{3760, 18,  66, 17, 16, 17, 32, 15, 14, 25, 21},
5188995df60SGuochun Huang 	{3750, 18,  66, 17, 16, 17, 31, 15, 14, 25, 21},
5198995df60SGuochun Huang 	{3740, 18,  66, 17, 16, 17, 31, 15, 14, 25, 20},
5208995df60SGuochun Huang 	{3730, 18,  66, 17, 16, 17, 31, 15, 13, 25, 20},
5218995df60SGuochun Huang 	{3720, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
5228995df60SGuochun Huang 	{3710, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
5238995df60SGuochun Huang 	{3700, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
5248995df60SGuochun Huang 	{3690, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
5258995df60SGuochun Huang 	{3680, 18,  64, 17, 16, 17, 31, 15, 13, 25, 20},
5268995df60SGuochun Huang 	{3670, 18,  64, 17, 16, 17, 30, 15, 13, 25, 20},
5278995df60SGuochun Huang 	{3660, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
5288995df60SGuochun Huang 	{3650, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
5298995df60SGuochun Huang 	{3640, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
5308995df60SGuochun Huang 	{3630, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
5318995df60SGuochun Huang 	{3620, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
5328995df60SGuochun Huang 	{3610, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
5338995df60SGuochun Huang 	{3600, 17,  64, 16, 16, 17, 29, 15, 13, 24, 20},
5348995df60SGuochun Huang 	{3590, 17,  63, 16, 15, 17, 29, 15, 13, 24, 20},
5358995df60SGuochun Huang 	{3580, 17,  63, 16, 15, 16, 30, 15, 13, 24, 20},
5368995df60SGuochun Huang 	{3570, 17,  63, 16, 15, 16, 30, 15, 13, 24, 19},
5378995df60SGuochun Huang 	{3560, 17,  63, 16, 15, 16, 30, 14, 13, 24, 19},
5388995df60SGuochun Huang 	{3550, 17,  62, 16, 15, 16, 30, 14, 13, 24, 19},
5398995df60SGuochun Huang 	{3540, 17,  62, 16, 15, 16, 30, 14, 13, 24, 19},
5408995df60SGuochun Huang 	{3530, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
5418995df60SGuochun Huang 	{3520, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
5428995df60SGuochun Huang 	{3510, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
5438995df60SGuochun Huang 	{3500, 17,  61, 16, 15, 16, 29, 14, 13, 24, 19},
5448995df60SGuochun Huang 	{3490, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
5458995df60SGuochun Huang 	{3480, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
5468995df60SGuochun Huang 	{3470, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
5478995df60SGuochun Huang 	{3460, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
5488995df60SGuochun Huang 	{3450, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
5498995df60SGuochun Huang 	{3440, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
5508995df60SGuochun Huang 	{3430, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
5518995df60SGuochun Huang 	{3420, 16,  60, 16, 15, 16, 28, 14, 12, 23, 19},
5528995df60SGuochun Huang 	{3410, 16,  60, 16, 15, 16, 28, 14, 12, 23, 18},
5538995df60SGuochun Huang 	{3400, 16,  60, 15, 15, 16, 28, 14, 12, 23, 18},
5548995df60SGuochun Huang 	{3390, 16,  60, 15, 15, 16, 28, 14, 12, 23, 18},
5558995df60SGuochun Huang 	{3380, 16,  59, 15, 15, 16, 27, 14, 12, 23, 18},
5568995df60SGuochun Huang 	{3370, 16,  59, 15, 15, 15, 28, 14, 12, 23, 18},
5578995df60SGuochun Huang 	{3360, 16,  59, 15, 14, 15, 28, 14, 12, 23, 18},
5588995df60SGuochun Huang 	{3350, 16,  59, 15, 14, 15, 28, 14, 12, 23, 18},
5598995df60SGuochun Huang 	{3340, 16,  59, 15, 14, 15, 28, 14, 12, 22, 18},
5608995df60SGuochun Huang 	{3330, 16,  58, 15, 14, 15, 28, 14, 12, 22, 18},
5618995df60SGuochun Huang 	{3320, 16,  58, 15, 14, 15, 28, 13, 12, 22, 18},
5628995df60SGuochun Huang 	{3310, 16,  58, 15, 14, 15, 27, 13, 12, 22, 18},
5638995df60SGuochun Huang 	{3300, 16,  58, 15, 14, 15, 27, 13, 12, 22, 18},
5648995df60SGuochun Huang 	{3290, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
5658995df60SGuochun Huang 	{3280, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
5668995df60SGuochun Huang 	{3270, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
5678995df60SGuochun Huang 	{3260, 15,  58, 15, 14, 15, 27, 13, 12, 22, 18},
5688995df60SGuochun Huang 	{3250, 15,  57, 15, 14, 15, 27, 13, 12, 22, 18},
5698995df60SGuochun Huang 	{3240, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
5708995df60SGuochun Huang 	{3230, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
5718995df60SGuochun Huang 	{3220, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
5728995df60SGuochun Huang 	{3210, 15,  56, 15, 14, 15, 26, 13, 12, 22, 17},
5738995df60SGuochun Huang 	{3200, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
5748995df60SGuochun Huang 	{3190, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
5758995df60SGuochun Huang 	{3180, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
5768995df60SGuochun Huang 	{3170, 15,  56, 14, 14, 15, 25, 13, 11, 21, 17},
5778995df60SGuochun Huang 	{3160, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
5788995df60SGuochun Huang 	{3150, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
5798995df60SGuochun Huang 	{3140, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
5808995df60SGuochun Huang 	{3130, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
5818995df60SGuochun Huang 	{3120, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
5828995df60SGuochun Huang 	{3110, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
5838995df60SGuochun Huang 	{3100, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
5848995df60SGuochun Huang 	{3090, 15,  54, 14, 13, 14, 25, 12, 11, 21, 17},
5858995df60SGuochun Huang 	{3080, 15,  53, 14, 13, 14, 25, 12, 11, 21, 17},
5868995df60SGuochun Huang 	{3070, 14,  54, 14, 13, 14, 25, 12, 11, 21, 16},
5878995df60SGuochun Huang 	{3060, 14,  54, 14, 13, 14, 25, 12, 11, 21, 16},
5888995df60SGuochun Huang 	{3050, 14,  54, 14, 13, 14, 25, 12, 11, 20, 16},
5898995df60SGuochun Huang 	{3040, 14,  53, 14, 13, 14, 25, 12, 11, 20, 16},
5908995df60SGuochun Huang 	{3030, 14,  53, 14, 13, 14, 25, 12, 11, 20, 16},
5918995df60SGuochun Huang 	{3020, 14,  53, 14, 13, 14, 24, 12, 11, 20, 16},
5928995df60SGuochun Huang 	{3010, 14,  53, 14, 13, 14, 24, 12, 11, 20, 16},
5938995df60SGuochun Huang 	{3000, 14,  53, 13, 13, 14, 24, 12, 11, 20, 16},
5948995df60SGuochun Huang 	{2990, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
5958995df60SGuochun Huang 	{2980, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
5968995df60SGuochun Huang 	{2970, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
5978995df60SGuochun Huang 	{2960, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
5988995df60SGuochun Huang 	{2950, 14,  51, 13, 13, 13, 24, 12, 11, 20, 16},
5998995df60SGuochun Huang 	{2940, 14,  51, 13, 13, 13, 24, 12, 11, 20, 16},
6008995df60SGuochun Huang 	{2930, 14,  51, 13, 13, 13, 24, 12, 10, 20, 16},
6018995df60SGuochun Huang 	{2920, 14,  51, 13, 13, 13, 24, 12, 10, 20, 16},
6028995df60SGuochun Huang 	{2910, 14,  50, 13, 13, 13, 24, 12, 10, 20, 15},
6038995df60SGuochun Huang 	{2900, 14,  50, 13, 13, 13, 24, 12, 10, 19, 15},
6048995df60SGuochun Huang 	{2890, 14,  50, 13, 12, 13, 24, 12, 10, 19, 15},
6058995df60SGuochun Huang 	{2880, 14,  50, 13, 12, 13, 23, 12, 10, 19, 15},
6068995df60SGuochun Huang 	{2870, 13,  50, 13, 12, 13, 23, 12, 10, 19, 15},
6078995df60SGuochun Huang 	{2860, 13,  50, 13, 12, 13, 23, 12, 10, 19, 15},
6088995df60SGuochun Huang 	{2850, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
6098995df60SGuochun Huang 	{2840, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
6108995df60SGuochun Huang 	{2830, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
6118995df60SGuochun Huang 	{2820, 13,  49, 13, 12, 13, 23, 11, 10, 19, 15},
6128995df60SGuochun Huang 	{2810, 13,  49, 13, 12, 13, 23, 11, 10, 19, 15},
6138995df60SGuochun Huang 	{2800, 13,  49, 12, 12, 13, 22, 11, 10, 19, 15},
6148995df60SGuochun Huang 	{2790, 13,  49, 12, 12, 13, 22, 11, 10, 19, 15},
6158995df60SGuochun Huang 	{2780, 13,  48, 12, 12, 13, 22, 11, 10, 19, 15},
6168995df60SGuochun Huang 	{2770, 13,  48, 12, 12, 13, 22, 11, 10, 19, 15},
6178995df60SGuochun Huang 	{2760, 13,  48, 12, 12, 13, 22, 11, 10, 18, 15},
6188995df60SGuochun Huang 	{2750, 13,  48, 12, 12, 13, 22, 11, 10, 18, 15},
6198995df60SGuochun Huang 	{2740, 13,  47, 12, 12, 12, 23, 11, 10, 18, 14},
6208995df60SGuochun Huang 	{2730, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
6218995df60SGuochun Huang 	{2720, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
6228995df60SGuochun Huang 	{2710, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
6238995df60SGuochun Huang 	{2700, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
6248995df60SGuochun Huang 	{2690, 13,  46, 12, 12, 12, 22, 11, 10, 18, 14},
6258995df60SGuochun Huang 	{2680, 13,  46, 12, 12, 12, 22, 11, 10, 18, 14},
6268995df60SGuochun Huang 	{2670, 12,  47, 12, 12, 12, 22, 11, 10, 18, 14},
6278995df60SGuochun Huang 	{2660, 12,  47, 12, 12, 12, 21, 11,  9, 18, 14},
6288995df60SGuochun Huang 	{2650, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
6298995df60SGuochun Huang 	{2640, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
6308995df60SGuochun Huang 	{2630, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
6318995df60SGuochun Huang 	{2620, 12,  46, 12, 11, 12, 21, 10,  9, 18, 14},
6328995df60SGuochun Huang 	{2610, 12,  45, 12, 11, 12, 21, 10,  9, 17, 14},
6338995df60SGuochun Huang 	{2600, 12,  45, 11, 11, 12, 21, 10,  9, 17, 14},
6348995df60SGuochun Huang 	{2590, 12,  45, 11, 11, 12, 20, 10,  9, 17, 14},
6358995df60SGuochun Huang 	{2580, 12,  45, 11, 11, 12, 20, 10,  9, 17, 14},
6368995df60SGuochun Huang 	{2570, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
6378995df60SGuochun Huang 	{2560, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
6388995df60SGuochun Huang 	{2550, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
6398995df60SGuochun Huang 	{2540, 12,  44, 11, 11, 11, 21, 10,  9, 17, 13},
6408995df60SGuochun Huang 	{2530, 12,  44, 11, 11, 11, 21, 10,  9, 17, 13},
6418995df60SGuochun Huang 	{2520, 12,  43, 11, 11, 11, 21, 10,  9, 17, 13},
6428995df60SGuochun Huang 	{2510, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
6438995df60SGuochun Huang 	{2500, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
6448995df60SGuochun Huang 	{2490, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
6458995df60SGuochun Huang 	{2480, 12,  42, 11, 11, 11, 20, 10,  9, 17, 13},
6468995df60SGuochun Huang 	{2470, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
6478995df60SGuochun Huang 	{2460, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
6488995df60SGuochun Huang 	{2450, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
6498995df60SGuochun Huang 	{2440, 11,  42, 11, 11, 11, 19, 10,  9, 16, 13},
6508995df60SGuochun Huang 	{2430, 11,  42, 11, 11, 11, 19, 10,  9, 16, 13},
6518995df60SGuochun Huang 	{2420, 11,  42, 11, 10, 11, 19, 10,  9, 16, 13},
6528995df60SGuochun Huang 	{2410, 11,  42, 11, 10, 11, 19, 10,  9, 16, 12},
6538995df60SGuochun Huang 	{2400, 11,  41, 10, 10, 11, 19, 10,  8, 16, 12},
6548995df60SGuochun Huang 	{2390, 11,  41, 10, 10, 11, 19, 10,  8, 16, 12},
6558995df60SGuochun Huang 	{2380, 11,  41, 10, 10, 11, 19,  9,  8, 16, 12},
6568995df60SGuochun Huang 	{2370, 11,  41, 10, 10, 11, 18,  9,  8, 16, 12},
6578995df60SGuochun Huang 	{2360, 11,  41, 10, 10, 11, 18,  9,  8, 16, 12},
6588995df60SGuochun Huang 	{2350, 11,  40, 10, 10, 11, 18,  9,  8, 16, 12},
6598995df60SGuochun Huang 	{2340, 11,  40, 10, 10, 11, 18,  9,  8, 16, 12},
6608995df60SGuochun Huang 	{2330, 11,  40, 10, 10, 10, 19,  9,  8, 16, 12},
6618995df60SGuochun Huang 	{2320, 11,  40, 10, 10, 10, 19,  9,  8, 15, 12},
6628995df60SGuochun Huang 	{2310, 11,  39, 10, 10, 10, 19,  9,  8, 15, 12},
6638995df60SGuochun Huang 	{2300, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6648995df60SGuochun Huang 	{2290, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6658995df60SGuochun Huang 	{2280, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6668995df60SGuochun Huang 	{2270, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6678995df60SGuochun Huang 	{2260, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6688995df60SGuochun Huang 	{2250, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
6698995df60SGuochun Huang 	{2240, 10,  39, 10, 10, 10, 18,  9,  8, 15, 11},
6708995df60SGuochun Huang 	{2230, 10,  38, 10, 10, 10, 18,  9,  8, 15, 11},
6718995df60SGuochun Huang 	{2220, 10,  38, 10, 10, 10, 17,  9,  8, 15, 11},
6728995df60SGuochun Huang 	{2210, 10,  38, 10, 10, 10, 17,  9,  8, 15, 11},
6738995df60SGuochun Huang 	{2200, 10,  38,  9, 10, 10, 17,  9,  8, 15, 11},
6748995df60SGuochun Huang 	{2190, 10,  38,  9,  9, 10, 17,  9,  8, 15, 11},
6758995df60SGuochun Huang 	{2180, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
6768995df60SGuochun Huang 	{2170, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
6778995df60SGuochun Huang 	{2160, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
6788995df60SGuochun Huang 	{2150, 10,  37,  9,  9, 10, 16,  8,  8, 14, 11},
6798995df60SGuochun Huang 	{2140, 10,  36,  9,  9, 10, 16,  8,  8, 14, 11},
6808995df60SGuochun Huang 	{2130, 10,  36,  9,  9, 10, 16,  8,  7, 14, 11},
6818995df60SGuochun Huang 	{2120, 10,  36,  9,  9,  9, 17,  8,  7, 14, 11},
6828995df60SGuochun Huang 	{2110, 10,  36,  9,  9,  9, 17,  8,  7, 14, 11},
6838995df60SGuochun Huang 	{2100, 10,  35,  9,  9,  9, 17,  8,  7, 14, 11},
6848995df60SGuochun Huang 	{2090, 10,  35,  9,  9,  9, 17,  8,  7, 14, 11},
6858995df60SGuochun Huang 	{2080,  9,  36,  9,  9,  9, 16,  8,  7, 14, 11},
6868995df60SGuochun Huang 	{2070,  9,  36,  9,  9,  9, 16,  8,  7, 14, 10},
6878995df60SGuochun Huang 	{2060,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
6888995df60SGuochun Huang 	{2050,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
6898995df60SGuochun Huang 	{2040,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
6908995df60SGuochun Huang 	{2030,  9,  35,  9,  9,  9, 16,  8,  7, 13, 10},
6918995df60SGuochun Huang 	{2020,  9,  35,  9,  9,  9, 16,  8,  7, 13, 10},
6928995df60SGuochun Huang 	{2010,  9,  34,  9,  9,  9, 15,  8,  7, 13, 10},
6938995df60SGuochun Huang 	{2000,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
6948995df60SGuochun Huang 	{1990,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
6958995df60SGuochun Huang 	{1980,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
6968995df60SGuochun Huang 	{1970,  9,  33,  8,  9,  9, 15,  8,  7, 13, 10},
6978995df60SGuochun Huang 	{1960,  9,  33,  8,  9,  9, 15,  8,  7, 13, 10},
6988995df60SGuochun Huang 	{1950,  9,  33,  8,  8,  9, 15,  8,  7, 13, 10},
6998995df60SGuochun Huang 	{1940,  9,  33,  8,  8,  9, 15,  8,  7, 13, 10},
7008995df60SGuochun Huang 	{1930,  9,  32,  8,  8,  9, 14,  8,  7, 13, 10},
7018995df60SGuochun Huang 	{1920,  9,  32,  8,  8,  9, 14,  8,  7, 13, 10},
7028995df60SGuochun Huang 	{1910,  9,  32,  8,  8,  8, 15,  7,  7, 13,  9},
7038995df60SGuochun Huang 	{1900,  9,  32,  8,  8,  8, 15,  7,  7, 13,  9},
7048995df60SGuochun Huang 	{1890,  9,  31,  8,  8,  8, 15,  7,  7, 12,  9},
7058995df60SGuochun Huang 	{1880,  8,  32,  8,  8,  8, 15,  7,  7, 12,  9},
7068995df60SGuochun Huang 	{1870,  8,  32,  8,  8,  8, 15,  7,  7, 12,  9},
7078995df60SGuochun Huang 	{1860,  8,  32,  8,  8,  8, 14,  7,  6, 12,  9},
7088995df60SGuochun Huang 	{1850,  8,  32,  8,  8,  8, 14,  7,  6, 12,  9},
7098995df60SGuochun Huang 	{1840,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
7108995df60SGuochun Huang 	{1830,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
7118995df60SGuochun Huang 	{1820,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
7128995df60SGuochun Huang 	{1810,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
7138995df60SGuochun Huang 	{1800,  8,  30,  7,  8,  8, 14,  7,  6, 12,  9},
7148995df60SGuochun Huang 	{1790,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
7158995df60SGuochun Huang 	{1780,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
7168995df60SGuochun Huang 	{1770,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
7178995df60SGuochun Huang 	{1760,  8,  29,  7,  8,  8, 13,  7,  6, 12,  9},
7188995df60SGuochun Huang 	{1750,  8,  29,  7,  8,  8, 13,  7,  6, 12,  9},
7198995df60SGuochun Huang 	{1740,  8,  29,  7,  8,  8, 13,  7,  6, 11,  8},
7208995df60SGuochun Huang 	{1730,  8,  29,  7,  8,  8, 13,  7,  6, 11,  8},
7218995df60SGuochun Huang 	{1720,  8,  29,  7,  7,  8, 13,  7,  6, 11,  8},
7228995df60SGuochun Huang 	{1710,  8,  28,  7,  7,  8, 12,  7,  6, 11,  8},
7238995df60SGuochun Huang 	{1700,  8,  28,  7,  7,  7, 13,  7,  6, 11,  8},
7248995df60SGuochun Huang 	{1690,  8,  28,  7,  7,  7, 13,  7,  6, 11,  8},
7258995df60SGuochun Huang 	{1680,  7,  29,  7,  7,  7, 13,  6,  6, 11,  8},
7268995df60SGuochun Huang 	{1670,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
7278995df60SGuochun Huang 	{1660,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
7288995df60SGuochun Huang 	{1650,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
7298995df60SGuochun Huang 	{1640,  7,  28,  7,  7,  7, 12,  6,  6, 11,  8},
7308995df60SGuochun Huang 	{1630,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
7318995df60SGuochun Huang 	{1620,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
7328995df60SGuochun Huang 	{1610,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
7338995df60SGuochun Huang 	{1600,  7,  27,  6,  7,  7, 12,  6,  5, 10,  8},
7348995df60SGuochun Huang 	{1590,  7,  26,  6,  7,  7, 12,  6,  5, 10,  8},
7358995df60SGuochun Huang 	{1580,  7,  26,  6,  7,  7, 12,  6,  5, 10,  7},
7368995df60SGuochun Huang 	{1570,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
7378995df60SGuochun Huang 	{1560,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
7388995df60SGuochun Huang 	{1550,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
7398995df60SGuochun Huang 	{1540,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
7408995df60SGuochun Huang 	{1530,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
7418995df60SGuochun Huang 	{1520,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
7428995df60SGuochun Huang 	{1510,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
7438995df60SGuochun Huang 	{1500,  7,  24,  6,  7,  7, 10,  6,  5, 10,  7},
7448995df60SGuochun Huang 	{1490, 59,  25,  6, 77, 59, 10, 70, 44,  9, 73},
7458995df60SGuochun Huang 	{1480, 59,  24,  6, 76, 58, 10, 70, 44,  9, 73},
7468995df60SGuochun Huang 	{1470, 58,  24,  6, 76, 58, 10, 69, 44,  9, 72},
7478995df60SGuochun Huang 	{1460, 58,  24,  6, 76, 58, 10, 69, 43,  9, 72},
7488995df60SGuochun Huang 	{1450, 58,  24,  6, 75, 57, 10, 68, 43,  9, 71},
7498995df60SGuochun Huang 	{1440, 57,  24,  6, 75, 57, 10, 68, 43,  9, 71},
7508995df60SGuochun Huang 	{1430, 57,  23,  6, 75, 57, 10, 68, 43,  8, 70},
7518995df60SGuochun Huang 	{1420, 56,  23,  6, 74, 57,  9, 67, 43,  8, 70},
7528995df60SGuochun Huang 	{1410, 56,  23,  6, 74, 57,  9, 67, 43,  8, 69},
7538995df60SGuochun Huang 	{1400, 56,  23,  5, 74, 55,  9, 67, 41,  8, 69},
7548995df60SGuochun Huang 	{1390, 55,  23,  5, 73, 55,  9, 66, 41,  8, 68},
7558995df60SGuochun Huang 	{1380, 55,  23,  5, 73, 54,  9, 66, 41,  8, 68},
7568995df60SGuochun Huang 	{1370, 54,  22,  5, 72, 54,  9, 66, 41,  8, 67},
7578995df60SGuochun Huang 	{1360, 54,  22,  5, 72, 54,  9, 65, 40,  8, 67},
7588995df60SGuochun Huang 	{1350, 54,  22,  5, 72, 53,  9, 65, 40,  8, 66},
7598995df60SGuochun Huang 	{1340, 53,  22,  5, 71, 53,  9, 65, 40,  8, 66},
7608995df60SGuochun Huang 	{1330, 53,  22,  5, 71, 53,  9, 64, 39,  8, 65},
7618995df60SGuochun Huang 	{1320, 52,  22,  5, 71, 53,  8, 64, 40,  8, 65},
7628995df60SGuochun Huang 	{1310, 52,  21,  5, 70, 53,  8, 64, 40,  8, 64},
7638995df60SGuochun Huang 	{1300, 51,  21,  5, 70, 51,  8, 63, 38,  8, 64},
7648995df60SGuochun Huang 	{1290, 51,  21,  5, 70, 51,  8, 63, 38,  7, 64},
7658995df60SGuochun Huang 	{1280, 51,  21,  5, 69, 51,  8, 63, 38,  7, 63},
7668995df60SGuochun Huang 	{1270, 50,  21,  5, 69, 50,  8, 62, 38,  7, 63},
7678995df60SGuochun Huang 	{1260, 50,  20,  5, 69, 50,  8, 62, 37,  7, 62},
7688995df60SGuochun Huang 	{1250, 49,  20,  5, 68, 49,  8, 62, 37,  7, 62},
7698995df60SGuochun Huang 	{1240, 49,  20,  5, 68, 49,  8, 61, 37,  7, 61},
7708995df60SGuochun Huang 	{1230, 49,  20,  5, 68, 49,  8, 61, 36,  7, 61},
7718995df60SGuochun Huang 	{1220, 48,  20,  5, 67, 48,  8, 61, 36,  7, 60},
7728995df60SGuochun Huang 	{1210, 48,  19,  5, 67, 48,  7, 60, 36,  7, 60},
7738995df60SGuochun Huang 	{1200, 49,  19,  4, 67, 49,  7, 60, 36,  7, 59},
7748995df60SGuochun Huang 	{1190, 48,  19,  4, 66, 48,  7, 60, 36,  7, 59},
7758995df60SGuochun Huang 	{1180, 48,  19,  4, 66, 48,  7, 59, 36,  7, 58},
7768995df60SGuochun Huang 	{1170, 46,  19,  4, 66, 46,  7, 59, 35,  7, 58},
7778995df60SGuochun Huang 	{1160, 46,  18,  4, 65, 46,  7, 59, 34,  7, 57},
7788995df60SGuochun Huang 	{1150, 45,  18,  4, 65, 46,  7, 58, 34,  7, 57},
7798995df60SGuochun Huang 	{1140, 45,  18,  4, 65, 45,  7, 58, 34,  6, 56},
7808995df60SGuochun Huang 	{1130, 45,  18,  4, 64, 45,  7, 58, 33,  6, 56},
7818995df60SGuochun Huang 	{1120, 44,  18,  4, 64, 44,  7, 57, 33,  6, 55},
7828995df60SGuochun Huang 	{1110, 44,  18,  4, 64, 44,  7, 57, 33,  6, 55},
7838995df60SGuochun Huang 	{1100, 43,  17,  4, 63, 44,  6, 57, 32,  6, 54},
7848995df60SGuochun Huang 	{1090, 43,  17,  4, 63, 44,  6, 56, 33,  6, 54},
7858995df60SGuochun Huang 	{1080, 43,  17,  4, 63, 44,  6, 56, 33,  6, 53},
7868995df60SGuochun Huang 	{1070, 42,  17,  4, 62, 44,  6, 56, 33,  6, 53},
7878995df60SGuochun Huang 	{1060, 42,  17,  4, 62, 42,  6, 55, 31,  6, 52},
7888995df60SGuochun Huang 	{1050, 41,  17,  4, 62, 42,  6, 55, 31,  6, 52},
7898995df60SGuochun Huang 	{1040, 41,  16,  4, 61, 41,  6, 54, 31,  6, 52},
7908995df60SGuochun Huang 	{1030, 41,  16,  4, 61, 41,  6, 54, 30,  6, 51},
7918995df60SGuochun Huang 	{1020, 40,  16,  4, 61, 41,  6, 54, 30,  6, 51},
7928995df60SGuochun Huang 	{1010, 40,  16,  4, 60, 40,  6, 53, 30,  6, 50},
7938995df60SGuochun Huang 	{1000, 39,  16,  3, 60, 40,  6, 53, 29,  5, 50},
7948995df60SGuochun Huang 	{ 990, 39,  15,  3, 60, 39,  6, 53, 29,  5, 49},
7958995df60SGuochun Huang 	{ 980, 39,  15,  3, 59, 39,  5, 52, 29,  5, 49},
7968995df60SGuochun Huang 	{ 970, 38,  15,  3, 59, 39,  5, 52, 29,  5, 48},
7978995df60SGuochun Huang 	{ 960, 38,  15,  3, 59, 39,  5, 52, 29,  5, 48},
7988995df60SGuochun Huang 	{ 950, 37,  15,  3, 58, 39,  5, 51, 29,  5, 47},
7998995df60SGuochun Huang 	{ 940, 37,  14,  3, 58, 39,  5, 51, 29,  5, 47},
8008995df60SGuochun Huang 	{ 930, 37,  14,  3, 57, 37,  5, 51, 27,  5, 46},
8018995df60SGuochun Huang 	{ 920, 36,  14,  3, 57, 37,  5, 50, 27,  5, 46},
8028995df60SGuochun Huang 	{ 910, 36,  14,  3, 57, 36,  5, 50, 27,  5, 45},
8038995df60SGuochun Huang 	{ 900, 35,  14,  3, 56, 36,  5, 50, 26,  5, 45},
8048995df60SGuochun Huang 	{ 890, 35,  14,  3, 56, 36,  5, 49, 26,  5, 44},
8058995df60SGuochun Huang 	{ 880, 35,  13,  3, 56, 35,  5, 49, 26,  5, 44},
8068995df60SGuochun Huang 	{ 870, 34,  13,  3, 55, 35,  4, 49, 26,  5, 43},
8078995df60SGuochun Huang 	{ 860, 34,  13,  3, 55, 35,  4, 48, 25,  5, 43},
8088995df60SGuochun Huang 	{ 850, 33,  13,  3, 55, 35,  4, 48, 26,  4, 42},
8098995df60SGuochun Huang 	{ 840, 33,  13,  3, 54, 35,  4, 48, 26,  4, 42},
8108995df60SGuochun Huang 	{ 830, 33,  12,  3, 54, 33,  4, 47, 24,  4, 41},
8118995df60SGuochun Huang 	{ 820, 32,  12,  3, 54, 33,  4, 47, 24,  4, 41},
8128995df60SGuochun Huang 	{ 810, 32,  12,  3, 53, 33,  4, 47, 24,  4, 40},
8138995df60SGuochun Huang 	{ 800, 31,  12,  2, 53, 32,  4, 46, 23,  4, 40},
8148995df60SGuochun Huang 	{ 790, 31,  12,  2, 53, 32,  4, 46, 23,  4, 39},
8158995df60SGuochun Huang 	{ 780, 30,  12,  2, 52, 31,  4, 46, 23,  4, 39},
8168995df60SGuochun Huang 	{ 770, 30,  11,  2, 52, 31,  4, 45, 23,  4, 39},
8178995df60SGuochun Huang 	{ 760, 30,  11,  2, 52, 31,  3, 45, 22,  4, 38},
8188995df60SGuochun Huang 	{ 750, 29,  11,  2, 51, 30,  3, 45, 22,  4, 38},
8198995df60SGuochun Huang 	{ 740, 29,  11,  2, 51, 30,  3, 44, 22,  4, 37},
8208995df60SGuochun Huang 	{ 730, 28,  11,  2, 51, 31,  3, 44, 22,  4, 37},
8218995df60SGuochun Huang 	{ 720, 28,  10,  2, 50, 30,  3, 44, 22,  4, 36},
8228995df60SGuochun Huang 	{ 710, 28,  10,  2, 50, 30,  3, 43, 22,  4, 36},
8238995df60SGuochun Huang 	{ 700, 27,  10,  2, 50, 28,  3, 43, 20,  3, 35},
8248995df60SGuochun Huang 	{ 690, 27,  10,  2, 49, 28,  3, 43, 20,  3, 35},
8258995df60SGuochun Huang 	{ 680, 26,  10,  2, 49, 28,  3, 42, 20,  3, 34},
8268995df60SGuochun Huang 	{ 670, 26,  10,  2, 49, 27,  3, 42, 20,  3, 34},
8278995df60SGuochun Huang 	{ 660, 26,   9,  2, 48, 27,  3, 42, 19,  3, 33},
8288995df60SGuochun Huang 	{ 650, 25,   9,  2, 48, 26,  3, 41, 19,  3, 33},
8298995df60SGuochun Huang 	{ 640, 25,   9,  2, 48, 26,  2, 41, 19,  3, 32},
8308995df60SGuochun Huang 	{ 630, 24,   9,  2, 47, 26,  2, 40, 18,  3, 32},
8318995df60SGuochun Huang 	{ 620, 24,   9,  2, 47, 26,  2, 40, 19,  3, 31},
8328995df60SGuochun Huang 	{ 610, 24,   8,  2, 47, 26,  2, 40, 19,  3, 31},
8338995df60SGuochun Huang 	{ 600, 23,   8,  1, 46, 26,  2, 39, 18,  3, 30},
8348995df60SGuochun Huang 	{ 590, 23,   8,  1, 46, 24,  2, 39, 17,  3, 30},
8358995df60SGuochun Huang 	{ 580, 22,   8,  1, 46, 24,  2, 39, 17,  3, 29},
8368995df60SGuochun Huang 	{ 570, 22,   8,  1, 45, 23,  2, 38, 17,  3, 29},
8378995df60SGuochun Huang 	{ 560, 22,   7,  1, 45, 23,  2, 38, 16,  2, 28},
8388995df60SGuochun Huang 	{ 550, 21,   7,  1, 45, 23,  2, 38, 16,  2, 28},
8398995df60SGuochun Huang 	{ 540, 21,   7,  1, 44, 22,  2, 37, 16,  2, 27},
8408995df60SGuochun Huang 	{ 530, 20,   7,  1, 44, 22,  1, 37, 15,  2, 27},
8418995df60SGuochun Huang 	{ 520, 20,   7,  1, 43, 21,  1, 37, 15,  2, 27},
8428995df60SGuochun Huang 	{ 510, 20,   6,  1, 43, 21,  1, 36, 15,  2, 26},
8438995df60SGuochun Huang 	{ 500, 19,   6,  1, 43, 22,  1, 36, 15,  2, 26},
8448995df60SGuochun Huang 	{ 490, 19,   6,  1, 42, 21,  1, 36, 15,  2, 25},
8458995df60SGuochun Huang 	{ 480, 18,   6,  1, 42, 21,  1, 35, 15,  2, 25},
8468995df60SGuochun Huang 	{ 470, 18,   6,  1, 42, 21,  1, 35, 15,  2, 24},
8478995df60SGuochun Huang 	{ 460, 18,   6,  1, 41, 19,  1, 35, 13,  2, 24},
8488995df60SGuochun Huang 	{ 450, 17,   5,  1, 41, 19,  1, 34, 13,  2, 23},
8498995df60SGuochun Huang 	{ 440, 17,   5,  1, 41, 18,  1, 34, 13,  2, 23},
8508995df60SGuochun Huang 	{ 430, 16,   5,  1, 40, 18,  0, 34, 12,  2, 22},
8518995df60SGuochun Huang 	{ 420, 16,   5,  1, 40, 18,  0, 33, 12,  2, 22},
8528995df60SGuochun Huang 	{ 410, 16,   5,  1, 40, 17,  0, 33, 12,  1, 21},
8538995df60SGuochun Huang 	{ 400, 15,   5,  0, 39, 17,  0, 33, 11,  1, 21},
8548995df60SGuochun Huang 	{ 390, 15,   4,  0, 39, 17,  0, 32, 12,  1, 20},
8558995df60SGuochun Huang 	{ 380, 14,   4,  0, 39, 17,  0, 32, 12,  1, 20},
8568995df60SGuochun Huang 	{ 370, 14,   4,  0, 38, 17,  0, 32, 12,  1, 19},
8578995df60SGuochun Huang 	{ 360, 14,   4,  0, 38, 15,  0, 31, 10,  1, 19},
8588995df60SGuochun Huang 	{ 350, 13,   4,  0, 38, 15,  0, 31, 10,  1, 18},
8598995df60SGuochun Huang 	{ 340, 13,   3,  0, 37, 15,  0, 31, 10,  1, 18},
8608995df60SGuochun Huang 	{ 330, 12,   3,  0, 37, 14,  0, 30,  9,  1, 17},
8618995df60SGuochun Huang 	{ 320, 12,   3,  0, 37, 14,  0, 30,  9,  1, 17},
8628995df60SGuochun Huang 	{ 310, 12,   3,  0, 36, 13,  0, 30,  9,  1, 16},
8638995df60SGuochun Huang 	{ 300, 11,   3,  0, 36, 13,  0, 29,  8,  1, 16},
8648995df60SGuochun Huang 	{ 290, 11,   2,  0, 36, 13,  0, 29,  8,  1, 15},
8658995df60SGuochun Huang 	{ 280, 10,   2,  0, 35, 12,  0, 29,  8,  1, 15},
8668995df60SGuochun Huang 	{ 270, 10,   2,  0, 35, 12,  0, 28,  8,  0, 14},
8678995df60SGuochun Huang 	{ 260,  9,   2,  0, 35, 12,  0, 28,  8,  0, 14},
8688995df60SGuochun Huang 	{ 250,  9,   2,  0, 34, 12,  0, 28,  8,  0, 14},
8698995df60SGuochun Huang 	{ 240,  9,   2,  0, 34, 12,  0, 27,  8,  0, 13},
8708995df60SGuochun Huang 	{ 230,  8,   1,  0, 34, 10,  0, 27,  6,  0, 13},
8718995df60SGuochun Huang 	{ 220,  8,   1,  0, 33, 10,  0, 27,  6,  0, 12},
8728995df60SGuochun Huang 	{ 210,  7,   1,  0, 33, 10,  0, 26,  6,  0, 12},
8738995df60SGuochun Huang 	{ 200,  7,   1,  0, 33,  9,  0, 26,  5,  0, 11},
8748995df60SGuochun Huang 	{ 190,  7,   1,  0, 32,  9,  0, 25,  5,  0, 11},
8758995df60SGuochun Huang 	{ 180,  6,   1,  0, 32,  8,  0, 25,  5,  0, 10},
8768995df60SGuochun Huang 	{ 170,  6,   0,  0, 32,  8,  0, 25,  5,  0, 10},
8778995df60SGuochun Huang 	{ 160,  5,   0,  0, 31,  8,  0, 24,  4,  0,  9},
8788995df60SGuochun Huang 	{ 150,  5,   0,  0, 31,  8,  0, 24,  5,  0,  9},
8798995df60SGuochun Huang 	{ 140,  5,   0,  0, 31,  8,  0, 24,  5,  0,  8},
8808995df60SGuochun Huang 	{ 130,  4,   0,  0, 30,  6,  0, 23,  3,  0,  8},
8818995df60SGuochun Huang 	{ 120,  4,   0,  0, 30,  6,  0, 23,  3,  0,  7},
8828995df60SGuochun Huang 	{ 110,  3,   0,  0, 30,  6,  0, 23,  3,  0,  7},
8838995df60SGuochun Huang 	{ 100,  3,   0,  0, 29,  5,  0, 22,  2,  0,  6},
8848995df60SGuochun Huang 	{  90,  3,   0,  0, 29,  5,  0, 22,  2,  0,  6},
8858995df60SGuochun Huang 	{  80,  2,   0,  0, 28,  5,  0, 22,  2,  0,  5},
8868995df60SGuochun Huang };
8878995df60SGuochun Huang 
8888995df60SGuochun Huang static const
8898995df60SGuochun Huang struct samsung_mipi_cphy_timing samsung_mipi_cphy_timing_table[] = {
8908995df60SGuochun Huang 	{ 3500, 39, 50, 25, 29, 54, 1 },
8918995df60SGuochun Huang 	{ 3490, 39, 50, 25, 29, 54, 1 },
8928995df60SGuochun Huang 	{ 3480, 39, 50, 25, 29, 54, 1 },
8938995df60SGuochun Huang 	{ 3470, 39, 50, 25, 29, 54, 1 },
8948995df60SGuochun Huang 	{ 3460, 39, 50, 25, 29, 54, 1 },
8958995df60SGuochun Huang 	{ 3450, 39, 50, 25, 29, 54, 1 },
8968995df60SGuochun Huang 	{ 3440, 38, 50, 25, 29, 54, 1 },
8978995df60SGuochun Huang 	{ 3430, 38, 50, 25, 29, 53, 1 },
8988995df60SGuochun Huang 	{ 3420, 38, 50, 25, 29, 53, 1 },
8998995df60SGuochun Huang 	{ 3410, 38, 50, 25, 29, 53, 1 },
9008995df60SGuochun Huang 	{ 3400, 38, 50, 25, 29, 53, 1 },
9018995df60SGuochun Huang 	{ 3390, 38, 50, 25, 29, 53, 1 },
9028995df60SGuochun Huang 	{ 3380, 38, 50, 25, 28, 53, 1 },
9038995df60SGuochun Huang 	{ 3370, 38, 50, 25, 28, 52, 1 },
9048995df60SGuochun Huang 	{ 3360, 37, 50, 25, 28, 52, 1 },
9058995df60SGuochun Huang 	{ 3350, 37, 50, 25, 28, 52, 1 },
9068995df60SGuochun Huang 	{ 3340, 37, 50, 25, 28, 52, 1 },
9078995df60SGuochun Huang 	{ 3330, 37, 50, 25, 28, 52, 1 },
9088995df60SGuochun Huang 	{ 3320, 37, 50, 25, 28, 52, 1 },
9098995df60SGuochun Huang 	{ 3310, 37, 50, 25, 28, 52, 1 },
9108995df60SGuochun Huang 	{ 3300, 37, 50, 25, 28, 51, 1 },
9118995df60SGuochun Huang 	{ 3290, 37, 50, 25, 28, 51, 1 },
9128995df60SGuochun Huang 	{ 3280, 37, 50, 25, 28, 51, 1 },
9138995df60SGuochun Huang 	{ 3270, 36, 50, 25, 28, 51, 1 },
9148995df60SGuochun Huang 	{ 3260, 36, 50, 25, 27, 51, 1 },
9158995df60SGuochun Huang 	{ 3250, 36, 50, 25, 27, 51, 1 },
9168995df60SGuochun Huang 	{ 3240, 36, 50, 25, 27, 50, 1 },
9178995df60SGuochun Huang 	{ 3230, 36, 50, 25, 27, 50, 1 },
9188995df60SGuochun Huang 	{ 3220, 36, 50, 25, 27, 50, 1 },
9198995df60SGuochun Huang 	{ 3210, 36, 50, 25, 27, 50, 1 },
9208995df60SGuochun Huang 	{ 3200, 36, 50, 25, 27, 50, 1 },
9218995df60SGuochun Huang 	{ 3190, 36, 50, 25, 27, 50, 1 },
9228995df60SGuochun Huang 	{ 3180, 35, 50, 25, 27, 49, 1 },
9238995df60SGuochun Huang 	{ 3170, 35, 50, 25, 27, 49, 1 },
9248995df60SGuochun Huang 	{ 3160, 35, 50, 25, 27, 49, 1 },
9258995df60SGuochun Huang 	{ 3150, 35, 50, 25, 26, 49, 1 },
9268995df60SGuochun Huang 	{ 3140, 35, 50, 25, 26, 49, 1 },
9278995df60SGuochun Huang 	{ 3130, 35, 50, 25, 26, 49, 1 },
9288995df60SGuochun Huang 	{ 3120, 35, 50, 25, 26, 49, 1 },
9298995df60SGuochun Huang 	{ 3110, 35, 50, 25, 26, 48, 1 },
9308995df60SGuochun Huang 	{ 3100, 34, 50, 25, 26, 48, 1 },
9318995df60SGuochun Huang 	{ 3090, 34, 50, 25, 26, 48, 1 },
9328995df60SGuochun Huang 	{ 3080, 34, 50, 25, 26, 48, 1 },
9338995df60SGuochun Huang 	{ 3070, 34, 50, 25, 26, 48, 1 },
9348995df60SGuochun Huang 	{ 3060, 34, 50, 25, 26, 48, 1 },
9358995df60SGuochun Huang 	{ 3050, 34, 50, 25, 26, 47, 1 },
9368995df60SGuochun Huang 	{ 3040, 34, 50, 25, 26, 47, 1 },
9378995df60SGuochun Huang 	{ 3030, 34, 50, 25, 25, 47, 1 },
9388995df60SGuochun Huang 	{ 3020, 34, 50, 25, 25, 47, 1 },
9398995df60SGuochun Huang 	{ 3010, 33, 50, 25, 25, 47, 1 },
9408995df60SGuochun Huang 	{ 3000, 33, 50, 25, 25, 47, 1 },
9418995df60SGuochun Huang 	{ 2990, 33, 50, 25, 25, 46, 1 },
9428995df60SGuochun Huang 	{ 2980, 33, 50, 25, 25, 46, 1 },
9438995df60SGuochun Huang 	{ 2970, 33, 50, 25, 25, 46, 1 },
9448995df60SGuochun Huang 	{ 2960, 33, 50, 25, 25, 46, 1 },
9458995df60SGuochun Huang 	{ 2950, 33, 50, 25, 25, 46, 1 },
9468995df60SGuochun Huang 	{ 2940, 33, 50, 25, 25, 46, 1 },
9478995df60SGuochun Huang 	{ 2930, 33, 50, 25, 25, 46, 1 },
9488995df60SGuochun Huang 	{ 2920, 32, 50, 25, 25, 45, 1 },
9498995df60SGuochun Huang 	{ 2910, 32, 50, 25, 24, 45, 1 },
9508995df60SGuochun Huang 	{ 2900, 32, 50, 25, 24, 45, 1 },
9518995df60SGuochun Huang 	{ 2890, 32, 50, 25, 24, 45, 1 },
9528995df60SGuochun Huang 	{ 2880, 32, 50, 25, 24, 45, 1 },
9538995df60SGuochun Huang 	{ 2870, 32, 50, 25, 24, 45, 1 },
9548995df60SGuochun Huang 	{ 2860, 32, 50, 25, 24, 44, 1 },
9558995df60SGuochun Huang 	{ 2850, 32, 50, 25, 24, 44, 1 },
9568995df60SGuochun Huang 	{ 2840, 31, 50, 25, 24, 44, 1 },
9578995df60SGuochun Huang 	{ 2830, 31, 50, 25, 24, 44, 1 },
9588995df60SGuochun Huang 	{ 2820, 31, 50, 25, 24, 44, 1 },
9598995df60SGuochun Huang 	{ 2810, 31, 50, 25, 24, 44, 1 },
9608995df60SGuochun Huang 	{ 2800, 31, 50, 25, 23, 43, 1 },
9618995df60SGuochun Huang 	{ 2790, 31, 50, 25, 23, 43, 1 },
9628995df60SGuochun Huang 	{ 2780, 31, 50, 25, 23, 43, 1 },
9638995df60SGuochun Huang 	{ 2770, 31, 50, 25, 23, 43, 1 },
9648995df60SGuochun Huang 	{ 2760, 31, 50, 25, 23, 43, 1 },
9658995df60SGuochun Huang 	{ 2750, 30, 50, 25, 23, 43, 1 },
9668995df60SGuochun Huang 	{ 2740, 30, 50, 25, 23, 43, 1 },
9678995df60SGuochun Huang 	{ 2730, 30, 50, 25, 23, 42, 1 },
9688995df60SGuochun Huang 	{ 2720, 30, 50, 25, 23, 42, 1 },
9698995df60SGuochun Huang 	{ 2710, 30, 50, 25, 23, 42, 1 },
9708995df60SGuochun Huang 	{ 2700, 30, 50, 25, 23, 42, 1 },
9718995df60SGuochun Huang 	{ 2690, 30, 50, 25, 23, 42, 1 },
9728995df60SGuochun Huang 	{ 2680, 30, 50, 25, 22, 42, 1 },
9738995df60SGuochun Huang 	{ 2670, 30, 50, 25, 22, 41, 1 },
9748995df60SGuochun Huang 	{ 2660, 29, 50, 25, 22, 41, 1 },
9758995df60SGuochun Huang 	{ 2650, 29, 50, 25, 22, 41, 1 },
9768995df60SGuochun Huang 	{ 2640, 29, 50, 25, 22, 41, 1 },
9778995df60SGuochun Huang 	{ 2630, 29, 50, 25, 22, 41, 1 },
9788995df60SGuochun Huang 	{ 2620, 29, 50, 25, 22, 41, 1 },
9798995df60SGuochun Huang 	{ 2610, 29, 50, 25, 22, 41, 1 },
9808995df60SGuochun Huang 	{ 2600, 29, 50, 25, 22, 40, 1 },
9818995df60SGuochun Huang 	{ 2590, 29, 50, 25, 22, 40, 1 },
9828995df60SGuochun Huang 	{ 2580, 28, 50, 25, 22, 40, 1 },
9838995df60SGuochun Huang 	{ 2570, 28, 50, 25, 22, 40, 1 },
9848995df60SGuochun Huang 	{ 2560, 28, 50, 25, 21, 40, 1 },
9858995df60SGuochun Huang 	{ 2550, 28, 50, 25, 21, 40, 1 },
9868995df60SGuochun Huang 	{ 2540, 28, 50, 25, 21, 39, 1 },
9878995df60SGuochun Huang 	{ 2530, 28, 50, 25, 21, 39, 1 },
9888995df60SGuochun Huang 	{ 2520, 28, 50, 25, 21, 39, 1 },
9898995df60SGuochun Huang 	{ 2510, 28, 50, 25, 21, 39, 1 },
9908995df60SGuochun Huang 	{ 2500, 28, 50, 25, 21, 39, 1 },
9918995df60SGuochun Huang 	{ 2490, 27, 50, 25, 21, 39, 1 },
9928995df60SGuochun Huang 	{ 2480, 27, 50, 25, 21, 38, 1 },
9938995df60SGuochun Huang 	{ 2470, 27, 50, 25, 21, 38, 1 },
9948995df60SGuochun Huang 	{ 2460, 27, 50, 25, 21, 38, 1 },
9958995df60SGuochun Huang 	{ 2450, 27, 50, 25, 20, 38, 1 },
9968995df60SGuochun Huang 	{ 2440, 27, 50, 25, 20, 38, 1 },
9978995df60SGuochun Huang 	{ 2430, 27, 50, 25, 20, 38, 1 },
9988995df60SGuochun Huang 	{ 2420, 27, 50, 25, 20, 38, 1 },
9998995df60SGuochun Huang 	{ 2410, 27, 50, 25, 20, 37, 1 },
10008995df60SGuochun Huang 	{ 2400, 26, 50, 25, 20, 37, 1 },
10018995df60SGuochun Huang 	{ 2390, 26, 50, 25, 20, 37, 1 },
10028995df60SGuochun Huang 	{ 2380, 26, 50, 25, 20, 37, 1 },
10038995df60SGuochun Huang 	{ 2370, 26, 50, 25, 20, 37, 1 },
10048995df60SGuochun Huang 	{ 2360, 26, 50, 25, 20, 37, 1 },
10058995df60SGuochun Huang 	{ 2350, 26, 50, 25, 20, 36, 1 },
10068995df60SGuochun Huang 	{ 2340, 26, 50, 25, 20, 36, 1 },
10078995df60SGuochun Huang 	{ 2330, 26, 50, 25, 19, 36, 1 },
10088995df60SGuochun Huang 	{ 2320, 25, 50, 25, 19, 36, 1 },
10098995df60SGuochun Huang 	{ 2310, 25, 50, 25, 19, 36, 1 },
10108995df60SGuochun Huang 	{ 2300, 25, 50, 25, 19, 36, 1 },
10118995df60SGuochun Huang 	{ 2290, 25, 50, 25, 19, 35, 1 },
10128995df60SGuochun Huang 	{ 2280, 25, 50, 25, 19, 35, 1 },
10138995df60SGuochun Huang 	{ 2270, 25, 50, 25, 19, 35, 1 },
10148995df60SGuochun Huang 	{ 2260, 25, 50, 25, 19, 35, 1 },
10158995df60SGuochun Huang 	{ 2250, 25, 50, 25, 19, 35, 1 },
10168995df60SGuochun Huang 	{ 2240, 25, 50, 25, 19, 35, 1 },
10178995df60SGuochun Huang 	{ 2230, 24, 50, 25, 19, 35, 1 },
10188995df60SGuochun Huang 	{ 2220, 24, 50, 25, 19, 34, 1 },
10198995df60SGuochun Huang 	{ 2210, 24, 50, 25, 18, 34, 1 },
10208995df60SGuochun Huang 	{ 2200, 24, 50, 25, 18, 34, 1 },
10218995df60SGuochun Huang 	{ 2190, 24, 50, 25, 18, 34, 1 },
10228995df60SGuochun Huang 	{ 2180, 24, 50, 25, 18, 34, 1 },
10238995df60SGuochun Huang 	{ 2170, 24, 50, 25, 18, 34, 1 },
10248995df60SGuochun Huang 	{ 2160, 24, 50, 25, 18, 33, 1 },
10258995df60SGuochun Huang 	{ 2150, 24, 50, 25, 18, 33, 1 },
10268995df60SGuochun Huang 	{ 2140, 23, 50, 25, 18, 33, 1 },
10278995df60SGuochun Huang 	{ 2130, 23, 50, 25, 18, 33, 1 },
10288995df60SGuochun Huang 	{ 2120, 23, 50, 25, 18, 33, 1 },
10298995df60SGuochun Huang 	{ 2110, 23, 50, 25, 18, 33, 1 },
10308995df60SGuochun Huang 	{ 2100, 23, 50, 25, 17, 32, 1 },
10318995df60SGuochun Huang 	{ 2090, 23, 50, 25, 17, 32, 1 },
10328995df60SGuochun Huang 	{ 2080, 23, 50, 25, 17, 32, 1 },
10338995df60SGuochun Huang 	{ 2070, 23, 50, 25, 17, 32, 1 },
10348995df60SGuochun Huang 	{ 2060, 22, 50, 25, 17, 32, 1 },
10358995df60SGuochun Huang 	{ 2050, 22, 50, 25, 17, 32, 1 },
10368995df60SGuochun Huang 	{ 2040, 22, 50, 25, 17, 32, 1 },
10378995df60SGuochun Huang 	{ 2030, 22, 50, 25, 17, 31, 1 },
10388995df60SGuochun Huang 	{ 2020, 22, 50, 25, 17, 31, 1 },
10398995df60SGuochun Huang 	{ 2010, 22, 50, 25, 17, 31, 1 },
10408995df60SGuochun Huang 	{ 2000, 22, 50, 25, 17, 31, 1 },
10418995df60SGuochun Huang 	{ 1990, 22, 50, 25, 17, 31, 1 },
10428995df60SGuochun Huang 	{ 1980, 22, 50, 25, 16, 31, 1 },
10438995df60SGuochun Huang 	{ 1970, 21, 50, 25, 16, 30, 1 },
10448995df60SGuochun Huang 	{ 1960, 21, 50, 25, 16, 30, 1 },
10458995df60SGuochun Huang 	{ 1950, 21, 50, 25, 16, 30, 1 },
10468995df60SGuochun Huang 	{ 1940, 21, 50, 25, 16, 30, 1 },
10478995df60SGuochun Huang 	{ 1930, 21, 50, 25, 16, 30, 1 },
10488995df60SGuochun Huang 	{ 1920, 21, 50, 25, 16, 30, 1 },
10498995df60SGuochun Huang 	{ 1910, 21, 50, 25, 16, 30, 1 },
10508995df60SGuochun Huang 	{ 1900, 21, 50, 25, 16, 29, 1 },
10518995df60SGuochun Huang 	{ 1890, 21, 50, 25, 16, 29, 1 },
10528995df60SGuochun Huang 	{ 1880, 20, 50, 25, 16, 29, 1 },
10538995df60SGuochun Huang 	{ 1870, 20, 50, 25, 16, 29, 1 },
10548995df60SGuochun Huang 	{ 1860, 20, 50, 25, 15, 29, 1 },
10558995df60SGuochun Huang 	{ 1850, 20, 50, 25, 15, 29, 1 },
10568995df60SGuochun Huang 	{ 1840, 20, 50, 25, 15, 28, 1 },
10578995df60SGuochun Huang 	{ 1830, 20, 50, 25, 15, 28, 1 },
10588995df60SGuochun Huang 	{ 1820, 20, 50, 25, 15, 28, 1 },
10598995df60SGuochun Huang 	{ 1810, 20, 50, 25, 15, 28, 1 },
10608995df60SGuochun Huang 	{ 1800, 19, 50, 25, 15, 28, 1 },
10618995df60SGuochun Huang 	{ 1790, 19, 50, 25, 15, 28, 1 },
10628995df60SGuochun Huang 	{ 1780, 19, 50, 25, 15, 27, 1 },
10638995df60SGuochun Huang 	{ 1770, 19, 50, 25, 15, 27, 1 },
10648995df60SGuochun Huang 	{ 1760, 19, 50, 25, 15, 27, 1 },
10658995df60SGuochun Huang 	{ 1750, 19, 50, 25, 14, 27, 1 },
10668995df60SGuochun Huang 	{ 1740, 19, 50, 25, 14, 27, 1 },
10678995df60SGuochun Huang 	{ 1730, 19, 50, 25, 14, 27, 1 },
10688995df60SGuochun Huang 	{ 1720, 19, 50, 25, 14, 27, 1 },
10698995df60SGuochun Huang 	{ 1710, 18, 50, 25, 14, 26, 1 },
10708995df60SGuochun Huang 	{ 1700, 18, 50, 25, 14, 26, 1 },
10718995df60SGuochun Huang 	{ 1690, 18, 50, 25, 14, 26, 1 },
10728995df60SGuochun Huang 	{ 1680, 18, 50, 25, 14, 26, 1 },
10738995df60SGuochun Huang 	{ 1670, 18, 50, 25, 14, 26, 1 },
10748995df60SGuochun Huang 	{ 1660, 18, 50, 25, 14, 26, 1 },
10758995df60SGuochun Huang 	{ 1650, 18, 50, 25, 14, 25, 1 },
10768995df60SGuochun Huang 	{ 1640, 18, 50, 25, 14, 25, 1 },
10778995df60SGuochun Huang 	{ 1630, 18, 50, 25, 13, 25, 1 },
10788995df60SGuochun Huang 	{ 1620, 17, 50, 25, 13, 25, 1 },
10798995df60SGuochun Huang 	{ 1610, 17, 50, 25, 13, 25, 1 },
10808995df60SGuochun Huang 	{ 1600, 17, 50, 25, 13, 25, 1 },
10818995df60SGuochun Huang 	{ 1590, 17, 50, 25, 13, 24, 1 },
10828995df60SGuochun Huang 	{ 1580, 17, 50, 25, 13, 24, 1 },
10838995df60SGuochun Huang 	{ 1570, 17, 50, 25, 13, 24, 1 },
10848995df60SGuochun Huang 	{ 1560, 17, 50, 25, 13, 24, 1 },
10858995df60SGuochun Huang 	{ 1550, 17, 50, 25, 13, 24, 1 },
10868995df60SGuochun Huang 	{ 1540, 16, 50, 25, 13, 24, 1 },
10878995df60SGuochun Huang 	{ 1530, 16, 50, 25, 13, 24, 1 },
10888995df60SGuochun Huang 	{ 1520, 16, 50, 25, 13, 23, 1 },
10898995df60SGuochun Huang 	{ 1510, 16, 50, 25, 12, 23, 1 },
10908995df60SGuochun Huang 	{ 1500, 16, 50, 25, 12, 23, 1 },
10918995df60SGuochun Huang 	{ 1490, 16, 50, 25, 12, 23, 1 },
10928995df60SGuochun Huang 	{ 1480, 16, 50, 25, 12, 23, 1 },
10938995df60SGuochun Huang 	{ 1470, 16, 50, 25, 12, 23, 1 },
10948995df60SGuochun Huang 	{ 1460, 16, 50, 25, 12, 22, 1 },
10958995df60SGuochun Huang 	{ 1450, 15, 50, 25, 12, 22, 1 },
10968995df60SGuochun Huang 	{ 1440, 15, 50, 25, 12, 22, 1 },
10978995df60SGuochun Huang 	{ 1430, 15, 50, 25, 12, 22, 1 },
10988995df60SGuochun Huang 	{ 1420, 15, 50, 25, 12, 22, 1 },
10998995df60SGuochun Huang 	{ 1410, 15, 50, 25, 12, 22, 1 },
11008995df60SGuochun Huang 	{ 1400, 15, 50, 25, 11, 21, 1 },
11018995df60SGuochun Huang 	{ 1390, 15, 50, 25, 11, 21, 1 },
11028995df60SGuochun Huang 	{ 1380, 15, 50, 25, 11, 21, 1 },
11038995df60SGuochun Huang 	{ 1370, 15, 50, 25, 11, 21, 1 },
11048995df60SGuochun Huang 	{ 1360, 14, 50, 25, 11, 21, 1 },
11058995df60SGuochun Huang 	{ 1350, 14, 50, 25, 11, 21, 1 },
11068995df60SGuochun Huang 	{ 1340, 14, 50, 25, 11, 21, 1 },
11078995df60SGuochun Huang 	{ 1330, 14, 50, 25, 11, 20, 1 },
11088995df60SGuochun Huang 	{ 1320, 14, 50, 25, 11, 20, 1 },
11098995df60SGuochun Huang 	{ 1310, 14, 50, 25, 11, 20, 1 },
11108995df60SGuochun Huang 	{ 1300, 14, 50, 25, 11, 20, 1 },
11118995df60SGuochun Huang 	{ 1290, 14, 50, 25, 11, 20, 1 },
11128995df60SGuochun Huang 	{ 1280, 13, 50, 25, 10, 20, 1 },
11138995df60SGuochun Huang 	{ 1270, 13, 50, 25, 10, 19, 1 },
11148995df60SGuochun Huang 	{ 1260, 13, 50, 25, 10, 19, 1 },
11158995df60SGuochun Huang 	{ 1250, 13, 50, 25, 10, 19, 1 },
11168995df60SGuochun Huang 	{ 1240, 13, 50, 25, 10, 19, 1 },
11178995df60SGuochun Huang 	{ 1230, 13, 50, 25, 10, 19, 1 },
11188995df60SGuochun Huang 	{ 1220, 13, 50, 25, 10, 19, 1 },
11198995df60SGuochun Huang 	{ 1210, 13, 50, 25, 10, 19, 1 },
11208995df60SGuochun Huang 	{ 1200, 13, 50, 25, 10, 18, 1 },
11218995df60SGuochun Huang 	{ 1190, 12, 50, 25, 10, 18, 1 },
11228995df60SGuochun Huang 	{ 1180, 12, 50, 25, 10, 18, 1 },
11238995df60SGuochun Huang 	{ 1170, 12, 50, 25, 10, 18, 1 },
11248995df60SGuochun Huang 	{ 1160, 12, 50, 25,  9, 18, 1 },
11258995df60SGuochun Huang 	{ 1150, 12, 50, 25,  9, 18, 1 },
11268995df60SGuochun Huang 	{ 1140, 12, 50, 25,  9, 17, 1 },
11278995df60SGuochun Huang 	{ 1130, 12, 50, 25,  9, 17, 1 },
11288995df60SGuochun Huang 	{ 1120, 12, 50, 25,  9, 17, 1 },
11298995df60SGuochun Huang 	{ 1110, 12, 50, 25,  9, 17, 1 },
11308995df60SGuochun Huang 	{ 1100, 11, 50, 25,  9, 17, 1 },
11318995df60SGuochun Huang 	{ 1090, 11, 50, 25,  9, 17, 1 },
11328995df60SGuochun Huang 	{ 1080, 11, 50, 25,  9, 16, 1 },
11338995df60SGuochun Huang 	{ 1070, 11, 50, 25,  9, 16, 1 },
11348995df60SGuochun Huang 	{ 1060, 11, 50, 25,  9, 16, 1 },
11358995df60SGuochun Huang 	{ 1050, 11, 50, 25,  8, 16, 1 },
11368995df60SGuochun Huang 	{ 1040, 11, 50, 25,  8, 16, 1 },
11378995df60SGuochun Huang 	{ 1030, 11, 50, 25,  8, 16, 1 },
11388995df60SGuochun Huang 	{ 1020, 10, 50, 25,  8, 16, 1 },
11398995df60SGuochun Huang 	{ 1010, 10, 50, 25,  8, 15, 1 },
11408995df60SGuochun Huang 	{ 1000, 10, 50, 25,  8, 15, 1 },
11418995df60SGuochun Huang 	{  990, 10, 50, 25,  8, 15, 2 },
11428995df60SGuochun Huang 	{  980, 10, 50, 25,  8, 15, 2 },
11438995df60SGuochun Huang 	{  970, 10, 50, 25,  8, 15, 2 },
11448995df60SGuochun Huang 	{  960, 10, 50, 25,  8, 15, 2 },
11458995df60SGuochun Huang 	{  950, 10, 50, 25,  8, 14, 2 },
11468995df60SGuochun Huang 	{  940, 10, 50, 25,  8, 14, 2 },
11478995df60SGuochun Huang 	{  930,  9, 50, 25,  7, 14, 2 },
11488995df60SGuochun Huang 	{  920,  9, 50, 25,  7, 14, 2 },
11498995df60SGuochun Huang 	{  910,  9, 50, 25,  7, 14, 2 },
11508995df60SGuochun Huang 	{  900,  9, 50, 25,  7, 14, 2 },
11518995df60SGuochun Huang 	{  890,  9, 50, 25,  7, 13, 2 },
11528995df60SGuochun Huang 	{  880,  9, 50, 25,  7, 13, 2 },
11538995df60SGuochun Huang 	{  870,  9, 50, 25,  7, 13, 2 },
11548995df60SGuochun Huang 	{  860,  9, 50, 25,  7, 13, 2 },
11558995df60SGuochun Huang 	{  850,  9, 50, 25,  7, 13, 2 },
11568995df60SGuochun Huang 	{  840,  8, 50, 25,  7, 13, 2 },
11578995df60SGuochun Huang 	{  830,  8, 50, 25,  7, 13, 2 },
11588995df60SGuochun Huang 	{  820,  8, 50, 25,  7, 12, 2 },
11598995df60SGuochun Huang 	{  810,  8, 50, 25,  6, 12, 2 },
11608995df60SGuochun Huang 	{  800,  8, 50, 25,  6, 12, 2 },
11618995df60SGuochun Huang 	{  790,  8, 50, 25,  6, 12, 2 },
11628995df60SGuochun Huang 	{  780,  8, 50, 25,  6, 12, 2 },
11638995df60SGuochun Huang 	{  770,  8, 50, 25,  6, 12, 2 },
11648995df60SGuochun Huang 	{  760,  7, 50, 25,  6, 11, 2 },
11658995df60SGuochun Huang 	{  750,  7, 50, 25,  6, 11, 2 },
11668995df60SGuochun Huang 	{  740,  7, 50, 25,  6, 11, 2 },
11678995df60SGuochun Huang 	{  730,  7, 50, 25,  6, 11, 2 },
11688995df60SGuochun Huang 	{  720,  7, 50, 25,  6, 11, 2 },
11698995df60SGuochun Huang 	{  710,  7, 50, 25,  6, 11, 2 },
11708995df60SGuochun Huang 	{  700,  7, 50, 25,  5, 10, 2 },
11718995df60SGuochun Huang 	{  690,  7, 50, 25,  5, 10, 2 },
11728995df60SGuochun Huang 	{  680,  7, 50, 25,  5, 10, 2 },
11738995df60SGuochun Huang 	{  670,  6, 50, 25,  5, 10, 2 },
11748995df60SGuochun Huang 	{  660,  6, 50, 25,  5, 10, 2 },
11758995df60SGuochun Huang 	{  650,  6, 50, 25,  5, 10, 2 },
11768995df60SGuochun Huang 	{  640,  6, 50, 25,  5, 10, 2 },
11778995df60SGuochun Huang 	{  630,  6, 50, 25,  5,  9, 2 },
11788995df60SGuochun Huang 	{  620,  6, 50, 25,  5,  9, 2 },
11798995df60SGuochun Huang 	{  610,  6, 50, 25,  5,  9, 2 },
11808995df60SGuochun Huang 	{  600,  6, 50, 25,  5,  9, 2 },
11818995df60SGuochun Huang 	{  590,  6, 50, 25,  5,  9, 2 },
11828995df60SGuochun Huang 	{  580,  5, 50, 25,  4,  9, 2 },
11838995df60SGuochun Huang 	{  570,  5, 50, 25,  4,  8, 2 },
11848995df60SGuochun Huang 	{  560,  5, 50, 25,  4,  8, 2 },
11858995df60SGuochun Huang 	{  550,  5, 50, 25,  4,  8, 2 },
11868995df60SGuochun Huang 	{  540,  5, 50, 25,  4,  8, 2 },
11878995df60SGuochun Huang 	{  530,  5, 50, 25,  4,  8, 2 },
11888995df60SGuochun Huang 	{  520,  5, 50, 25,  4,  8, 2 },
11898995df60SGuochun Huang 	{  510,  5, 50, 25,  4,  8, 2 },
11908995df60SGuochun Huang 	{  500,  4, 50, 25,  4,  7, 2 },
11918995df60SGuochun Huang 	{  490, 18, 50, 25, 14,  6, 2 },
11928995df60SGuochun Huang 	{  480, 17, 50, 25, 14,  6, 2 },
11938995df60SGuochun Huang 	{  470, 17, 50, 25, 14,  6, 2 },
11948995df60SGuochun Huang 	{  460, 17, 50, 25, 13,  6, 2 },
11958995df60SGuochun Huang 	{  450, 16, 50, 25, 13,  6, 2 },
11968995df60SGuochun Huang 	{  440, 16, 50, 25, 13,  6, 2 },
11978995df60SGuochun Huang 	{  430, 15, 50, 25, 12,  6, 2 },
11988995df60SGuochun Huang 	{  420, 15, 50, 25, 12,  5, 2 },
11998995df60SGuochun Huang 	{  410, 15, 50, 25, 12,  5, 2 },
12008995df60SGuochun Huang 	{  400, 14, 50, 25, 11,  5, 2 },
12018995df60SGuochun Huang 	{  390, 14, 50, 25, 11,  5, 2 },
12028995df60SGuochun Huang 	{  380, 13, 50, 25, 11,  5, 2 },
12038995df60SGuochun Huang 	{  370, 13, 50, 25, 11,  5, 2 },
12048995df60SGuochun Huang 	{  360, 13, 50, 25, 10,  4, 2 },
12058995df60SGuochun Huang 	{  350, 12, 50, 25, 10,  4, 2 },
12068995df60SGuochun Huang 	{  340, 12, 50, 25, 10,  4, 2 },
12078995df60SGuochun Huang 	{  330, 11, 50, 25,  9,  4, 2 },
12088995df60SGuochun Huang 	{  320, 11, 50, 25,  9,  4, 2 },
12098995df60SGuochun Huang 	{  310, 11, 50, 25,  9,  4, 2 },
12108995df60SGuochun Huang 	{  300, 10, 50, 25,  8,  3, 2 },
12118995df60SGuochun Huang 	{  290, 10, 50, 25,  8,  3, 2 },
12128995df60SGuochun Huang 	{  280,  9, 50, 25,  8,  3, 2 },
12138995df60SGuochun Huang 	{  270,  9, 50, 25,  8,  3, 2 },
12148995df60SGuochun Huang 	{  260,  8, 50, 25,  7,  3, 2 },
12158995df60SGuochun Huang 	{  250,  8, 50, 25,  7,  3, 2 },
12168995df60SGuochun Huang 	{  240,  8, 50, 25,  7,  3, 2 },
12178995df60SGuochun Huang 	{  230,  7, 50, 25,  6,  2, 2 },
12188995df60SGuochun Huang 	{  220,  7, 50, 25,  6,  2, 2 },
12198995df60SGuochun Huang 	{  210,  6, 50, 25,  6,  2, 2 },
12208995df60SGuochun Huang 	{  200,  6, 50, 25,  5,  2, 2 },
12218995df60SGuochun Huang 	{  190,  6, 50, 25,  5,  2, 2 },
12228995df60SGuochun Huang 	{  180,  5, 50, 25,  5,  2, 2 },
12238995df60SGuochun Huang 	{  170,  5, 50, 25,  5,  1, 2 },
12248995df60SGuochun Huang 	{  160,  4, 50, 25,  4,  1, 2 },
12258995df60SGuochun Huang 	{  150,  4, 50, 25,  4,  1, 2 },
12268995df60SGuochun Huang 	{  140,  4, 50, 25,  4,  1, 2 },
12278995df60SGuochun Huang 	{  130,  3, 50, 25,  3,  1, 2 },
12288995df60SGuochun Huang 	{  120,  3, 50, 25,  3,  1, 2 },
12298995df60SGuochun Huang 	{  110,  2, 50, 25,  3,  1, 2 },
12308995df60SGuochun Huang 	{  100,  2, 50, 25,  2,  0, 2 },
12318995df60SGuochun Huang 	{   90,  2, 50, 25,  2,  0, 2 },
12328995df60SGuochun Huang 	{   80,  1, 50, 25,  2,  0, 2 },
12338995df60SGuochun Huang };
12348995df60SGuochun Huang 
12358995df60SGuochun Huang static inline void
phy_write(struct samsung_mipi_dcphy * samsung,u32 reg,u32 val)12368995df60SGuochun Huang phy_write(struct samsung_mipi_dcphy *samsung, u32 reg, u32 val)
12378995df60SGuochun Huang {
12388995df60SGuochun Huang 	writel(val, samsung->base + reg);
12398995df60SGuochun Huang }
12408995df60SGuochun Huang 
phy_read(struct samsung_mipi_dcphy * samsung,u32 reg)12418995df60SGuochun Huang static inline u32 phy_read(struct samsung_mipi_dcphy *samsung, u32 reg)
12428995df60SGuochun Huang {
12438995df60SGuochun Huang 	return readl(samsung->base + reg);
12448995df60SGuochun Huang }
12458995df60SGuochun Huang 
phy_update_bits(struct samsung_mipi_dcphy * samsung,u32 reg,u32 mask,u32 val)12468995df60SGuochun Huang static inline void phy_update_bits(struct samsung_mipi_dcphy *samsung,
12478995df60SGuochun Huang 				   u32 reg, u32 mask, u32 val)
12488995df60SGuochun Huang {
12498995df60SGuochun Huang 	u32 orig, tmp;
12508995df60SGuochun Huang 
12518995df60SGuochun Huang 	orig = phy_read(samsung, reg);
12528995df60SGuochun Huang 	tmp = orig & ~mask;
12538995df60SGuochun Huang 	tmp |= val & mask;
12548995df60SGuochun Huang 	phy_write(samsung, reg, tmp);
12558995df60SGuochun Huang }
12568995df60SGuochun Huang 
grf_write(struct samsung_mipi_dcphy * samsung,u32 reg,u32 val)12578995df60SGuochun Huang static inline void grf_write(struct samsung_mipi_dcphy *samsung,
12588995df60SGuochun Huang 			     u32 reg, u32 val)
12598995df60SGuochun Huang {
126075d08e7bSGuochun Huang 	regmap_write(samsung->grf, reg, val);
12618995df60SGuochun Huang }
12628995df60SGuochun Huang 
12638995df60SGuochun Huang static const struct samsung_mipi_dphy_timing *
samsung_mipi_dphy_get_timing(struct samsung_mipi_dcphy * samsung)12648995df60SGuochun Huang samsung_mipi_dphy_get_timing(struct samsung_mipi_dcphy *samsung)
12658995df60SGuochun Huang {
12668995df60SGuochun Huang 	const struct samsung_mipi_dphy_timing *timings;
12678995df60SGuochun Huang 	unsigned int num_timings;
12688995df60SGuochun Huang 	unsigned int lane_mbps = samsung->pll.rate / USEC_PER_SEC;
12698995df60SGuochun Huang 	unsigned int i;
12708995df60SGuochun Huang 
12718995df60SGuochun Huang 	timings = samsung_mipi_dphy_timing_table;
12728995df60SGuochun Huang 	num_timings = ARRAY_SIZE(samsung_mipi_dphy_timing_table);
12738995df60SGuochun Huang 
12748995df60SGuochun Huang 	for (i = num_timings; i > 0; i--)
12758995df60SGuochun Huang 		if (lane_mbps <= timings[i - 1].max_lane_mbps)
12768995df60SGuochun Huang 			break;
12778995df60SGuochun Huang 
12788995df60SGuochun Huang 	if (i == 0)
12798995df60SGuochun Huang 		++i;
12808995df60SGuochun Huang 
12818995df60SGuochun Huang 	return &timings[i - 1];
12828995df60SGuochun Huang }
12838995df60SGuochun Huang 
12848995df60SGuochun Huang static const struct samsung_mipi_cphy_timing *
samsung_mipi_cphy_get_timing(struct samsung_mipi_dcphy * samsung)12858995df60SGuochun Huang samsung_mipi_cphy_get_timing(struct samsung_mipi_dcphy *samsung)
12868995df60SGuochun Huang {
12878995df60SGuochun Huang 	const struct samsung_mipi_cphy_timing *timings;
12888995df60SGuochun Huang 	unsigned int num_timings;
12898995df60SGuochun Huang 	unsigned int lane_msps = div64_ul(samsung->pll.rate, USEC_PER_SEC);
12908995df60SGuochun Huang 	unsigned int i;
12918995df60SGuochun Huang 
12928995df60SGuochun Huang 	timings = samsung_mipi_cphy_timing_table;
12938995df60SGuochun Huang 	num_timings = ARRAY_SIZE(samsung_mipi_cphy_timing_table);
12948995df60SGuochun Huang 
12958995df60SGuochun Huang 	for (i = num_timings; i > 0; i--)
12968995df60SGuochun Huang 		if (lane_msps <= timings[i - 1].max_lane_msps)
12978995df60SGuochun Huang 			break;
12988995df60SGuochun Huang 
12998995df60SGuochun Huang 	if (i == 0)
13008995df60SGuochun Huang 		++i;
13018995df60SGuochun Huang 
13028995df60SGuochun Huang 	return &timings[i - 1];
13038995df60SGuochun Huang }
13048995df60SGuochun Huang 
samsung_mipi_dcphy_bias_block_enable(struct samsung_mipi_dcphy * samsung)13058995df60SGuochun Huang static void samsung_mipi_dcphy_bias_block_enable(struct samsung_mipi_dcphy *samsung)
13068995df60SGuochun Huang {
13078995df60SGuochun Huang 	phy_write(samsung, BIAS_CON0, 0x0010);
13088995df60SGuochun Huang 	phy_write(samsung, BIAS_CON1, 0x0110);
13098995df60SGuochun Huang 	phy_write(samsung, BIAS_CON2, 0x3223);
131075d08e7bSGuochun Huang 
131175d08e7bSGuochun Huang 	if (samsung->c_option)
131275d08e7bSGuochun Huang 		phy_update_bits(samsung, BIAS_CON4, I_MUX_SEL_MASK, I_MUX_SEL(2));
13138995df60SGuochun Huang }
13148995df60SGuochun Huang 
samsung_mipi_dcphy_bias_block_disable(struct samsung_mipi_dcphy * samsung)13158995df60SGuochun Huang static void samsung_mipi_dcphy_bias_block_disable(struct samsung_mipi_dcphy *samsung)
13168995df60SGuochun Huang {
13178995df60SGuochun Huang }
13188995df60SGuochun Huang 
samsung_mipi_dcphy_pll_configure(struct samsung_mipi_dcphy * samsung)13198995df60SGuochun Huang static void samsung_mipi_dcphy_pll_configure(struct samsung_mipi_dcphy *samsung)
13208995df60SGuochun Huang {
13218995df60SGuochun Huang 	phy_update_bits(samsung, PLL_CON0, S_MASK | P_MASK,
13228995df60SGuochun Huang 			S(samsung->pll.scaler) | P(samsung->pll.prediv));
13238995df60SGuochun Huang 	phy_write(samsung, PLL_CON1, samsung->pll.dsm);
13248995df60SGuochun Huang 	phy_update_bits(samsung, PLL_CON2, M_MASK, M(samsung->pll.fbdiv));
13258995df60SGuochun Huang 
13268995df60SGuochun Huang 	if (samsung->pll.ssc_en) {
13278995df60SGuochun Huang 		phy_write(samsung, PLL_CON3,
13288995df60SGuochun Huang 			  MRR(samsung->pll.mrr) | MFR(samsung->pll.mfr));
13298995df60SGuochun Huang 		phy_update_bits(samsung, PLL_CON4, SSCG_EN, SSCG_EN);
13308995df60SGuochun Huang 	}
13318995df60SGuochun Huang 
13328995df60SGuochun Huang 	phy_write(samsung, PLL_CON5, RESET_N_SEL | PLL_ENABLE_SEL);
13338995df60SGuochun Huang 	phy_write(samsung, PLL_CON7, PLL_LOCK_CNT(0xf000));
13348995df60SGuochun Huang 	phy_write(samsung, PLL_CON8, PLL_STB_CNT(0xf000));
13358995df60SGuochun Huang }
13368995df60SGuochun Huang 
13378995df60SGuochun Huang static void
samsung_mipi_dphy_clk_lane_timing_init(struct samsung_mipi_dcphy * samsung)13388995df60SGuochun Huang samsung_mipi_dphy_clk_lane_timing_init(struct samsung_mipi_dcphy *samsung)
13398995df60SGuochun Huang {
13408995df60SGuochun Huang 	const struct samsung_mipi_dphy_timing *timing;
13418995df60SGuochun Huang 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
1342cc91b41bSZhibin Huang 	u32 val, res_up, res_down;
13438995df60SGuochun Huang 
13448995df60SGuochun Huang 	timing = samsung_mipi_dphy_get_timing(samsung);
13458995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_GNR_CON0, 0xf000);
1346cc91b41bSZhibin Huang 
1347cc91b41bSZhibin Huang 	/*
1348cc91b41bSZhibin Huang 	 * The Drive-Strength / Voltage-Amplitude is adjusted by adjusting the
1349cc91b41bSZhibin Huang 	 *  Driver-Up Resistor and Driver-Down Resistor.
1350cc91b41bSZhibin Huang 	 */
1351cc91b41bSZhibin Huang 	res_up = samsung->pdata->dphy_hs_drv_res_cfg->clk_hs_drv_up_ohm;
1352cc91b41bSZhibin Huang 	res_down = samsung->pdata->dphy_hs_drv_res_cfg->clk_hs_drv_down_ohm;
1353cc91b41bSZhibin Huang 	val = EDGE_CON(7) | EDGE_CON_DIR(0) | EDGE_CON_EN |
1354cc91b41bSZhibin Huang 	      RES_UP(res_up) | RES_DN(res_down);
1355cc91b41bSZhibin Huang 	phy_write(samsung, DPHY_MC_ANA_CON0, val);
13568995df60SGuochun Huang 
13578995df60SGuochun Huang 	if (lane_hs_rate >= 4500)
13588995df60SGuochun Huang 		phy_write(samsung, DPHY_MC_ANA_CON1, 0x0001);
13598995df60SGuochun Huang 
1360cc91b41bSZhibin Huang 	val = 0;
13618995df60SGuochun Huang 	/*
13628995df60SGuochun Huang 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
13638995df60SGuochun Huang 	 * 1500Mbps, otherwise divide-by-16 Clock from Serial Clock
13648995df60SGuochun Huang 	 */
13658995df60SGuochun Huang 	if (lane_hs_rate < 1500)
13668995df60SGuochun Huang 		val = HSTX_CLK_SEL;
13678995df60SGuochun Huang 
13688995df60SGuochun Huang 	val |= T_LPX(timing->lpx);
13698995df60SGuochun Huang 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
13708995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_TIME_CON0, val);
13718995df60SGuochun Huang 
13728995df60SGuochun Huang 	val = T_CLK_ZERO(timing->clk_zero) | T_CLK_PREPARE(timing->clk_prepare);
13738995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_TIME_CON1, val);
13748995df60SGuochun Huang 
13758995df60SGuochun Huang 	val = T_HS_EXIT(timing->hs_exit) | T_CLK_TRAIL(timing->clk_trail_eot);
13768995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_TIME_CON2, val);
13778995df60SGuochun Huang 
13788995df60SGuochun Huang 	val = T_CLK_POST(timing->clk_post);
13798995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_TIME_CON3, val);
13808995df60SGuochun Huang 
13818995df60SGuochun Huang 	/* Escape Clock is 20.00MHz */
13828995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_TIME_CON4, 0x1f4);
13838995df60SGuochun Huang 
13848995df60SGuochun Huang 	/*
13858995df60SGuochun Huang 	 * skew calibration should be off, if the operation data rate is
13868995df60SGuochun Huang 	 * under 1.5Gbps or equal to 1.5Gbps.
13878995df60SGuochun Huang 	 */
13888995df60SGuochun Huang 	if (lane_hs_rate > 1500)
13898995df60SGuochun Huang 		phy_write(samsung, DPHY_MC_DESKEW_CON0, 0x9cb1);
13908995df60SGuochun Huang }
13918995df60SGuochun Huang 
13928995df60SGuochun Huang static void
samsung_mipi_dphy_data_lane_timing_init(struct samsung_mipi_dcphy * samsung)13938995df60SGuochun Huang samsung_mipi_dphy_data_lane_timing_init(struct samsung_mipi_dcphy *samsung)
13948995df60SGuochun Huang {
13958995df60SGuochun Huang 	const struct samsung_mipi_dphy_timing *timing;
13968995df60SGuochun Huang 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
1397cc91b41bSZhibin Huang 	u32 val, res_up, res_down;
13988995df60SGuochun Huang 
13998995df60SGuochun Huang 	timing = samsung_mipi_dphy_get_timing(samsung);
14008995df60SGuochun Huang 
1401cc91b41bSZhibin Huang 	/*
1402cc91b41bSZhibin Huang 	 * The Drive-Strength / Voltage-Amplitude is adjusted by adjusting the
1403cc91b41bSZhibin Huang 	 *  Driver-Up Resistor and Driver-Down Resistor.
1404cc91b41bSZhibin Huang 	 */
1405cc91b41bSZhibin Huang 	res_up = samsung->pdata->dphy_hs_drv_res_cfg->data_hs_drv_up_ohm;
1406cc91b41bSZhibin Huang 	res_down = samsung->pdata->dphy_hs_drv_res_cfg->data_hs_drv_down_ohm;
1407cc91b41bSZhibin Huang 	val = EDGE_CON(7) | EDGE_CON_DIR(0) | EDGE_CON_EN |
1408cc91b41bSZhibin Huang 	      RES_UP(res_up) | RES_DN(res_down);
1409cc91b41bSZhibin Huang 	phy_write(samsung, COMBO_MD0_ANA_CON0, val);
1410cc91b41bSZhibin Huang 	phy_write(samsung, COMBO_MD1_ANA_CON0, val);
1411cc91b41bSZhibin Huang 	phy_write(samsung, COMBO_MD2_ANA_CON0, val);
1412cc91b41bSZhibin Huang 	phy_write(samsung, DPHY_MD3_ANA_CON0, val);
14138995df60SGuochun Huang 
14148995df60SGuochun Huang 	if (lane_hs_rate >= 1500) {
14158995df60SGuochun Huang 		phy_write(samsung, COMBO_MD0_ANA_CON1, 0x0001);
14168995df60SGuochun Huang 		phy_write(samsung, COMBO_MD1_ANA_CON1, 0x0001);
14178995df60SGuochun Huang 		phy_write(samsung, COMBO_MD2_ANA_CON1, 0x0001);
14188995df60SGuochun Huang 		phy_write(samsung, DPHY_MD3_ANA_CON1, 0x0001);
14198995df60SGuochun Huang 	}
14208995df60SGuochun Huang 
1421cc91b41bSZhibin Huang 	val = 0;
14228995df60SGuochun Huang 	/*
14238995df60SGuochun Huang 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
14248995df60SGuochun Huang 	 * 1500Mbps, otherwise divide-by-16 Clock from Serial Clock
14258995df60SGuochun Huang 	 */
14268995df60SGuochun Huang 	if (lane_hs_rate < 1500)
14278995df60SGuochun Huang 		val = HSTX_CLK_SEL;
14288995df60SGuochun Huang 
14298995df60SGuochun Huang 	val |= T_LPX(timing->lpx);
14308995df60SGuochun Huang 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
14318995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON0, val);
14328995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON0, val);
14338995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON0, val);
14348995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON0, val);
14358995df60SGuochun Huang 
14368995df60SGuochun Huang 	val = T_HS_ZERO(timing->hs_zero) | T_HS_PREPARE(timing->hs_prepare);
14378995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON1, val);
14388995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON1, val);
14398995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON1, val);
14408995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON1, val);
14418995df60SGuochun Huang 
14428995df60SGuochun Huang 	val = T_HS_EXIT(timing->hs_exit) | T_HS_TRAIL(timing->hs_trail_eot);
14438995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON2, val);
14448995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON2, val);
14458995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON2, val);
14468995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON2, val);
14478995df60SGuochun Huang 
14488995df60SGuochun Huang 	/* TTA-GET/TTA-GO Timing Counter register use default value */
14498995df60SGuochun Huang 	val = T_TA_GET(0x3) | T_TA_GO(0x0);
14508995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON3, val);
14518995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON3, val);
14528995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON3, val);
14538995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON3, val);
14548995df60SGuochun Huang 
14558995df60SGuochun Huang 	/* Escape Clock is 20.00MHz */
14568995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON4, 0x1f4);
14578995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON4, 0x1f4);
14588995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON4, 0x1f4);
14598995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON4, 0x1f4);
14608995df60SGuochun Huang }
14618995df60SGuochun Huang 
samsung_mipi_dcphy_pll_enable(struct samsung_mipi_dcphy * samsung)14628995df60SGuochun Huang static void samsung_mipi_dcphy_pll_enable(struct samsung_mipi_dcphy *samsung)
14638995df60SGuochun Huang {
14648995df60SGuochun Huang 	u32 sts;
14658995df60SGuochun Huang 	int ret;
14668995df60SGuochun Huang 
14678995df60SGuochun Huang 	phy_update_bits(samsung, PLL_CON0, PLL_EN, PLL_EN);
14688995df60SGuochun Huang 
14698995df60SGuochun Huang 	ret = readl_poll_timeout(samsung->base + PLL_STAT0,
14708995df60SGuochun Huang 				 sts, (sts & PLL_LOCK), 20000);
14718995df60SGuochun Huang 	if (ret < 0)
14728995df60SGuochun Huang 		dev_err(samsung->dev, "DC-PHY pll is not locked\n");
14738995df60SGuochun Huang }
14748995df60SGuochun Huang 
samsung_mipi_dcphy_pll_disable(struct samsung_mipi_dcphy * samsung)14758995df60SGuochun Huang static void samsung_mipi_dcphy_pll_disable(struct samsung_mipi_dcphy *samsung)
14768995df60SGuochun Huang {
14778995df60SGuochun Huang 	phy_update_bits(samsung, PLL_CON0, PLL_EN, 0);
14788995df60SGuochun Huang }
14798995df60SGuochun Huang 
samsung_mipi_dphy_lane_enable(struct samsung_mipi_dcphy * samsung)14808995df60SGuochun Huang static void samsung_mipi_dphy_lane_enable(struct samsung_mipi_dcphy *samsung)
14818995df60SGuochun Huang {
14828995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_GNR_CON1, T_PHY_READY(0x2000));
14838995df60SGuochun Huang 	phy_update_bits(samsung, DPHY_MC_GNR_CON0, PHY_ENABLE, PHY_ENABLE);
14848995df60SGuochun Huang 
148506bd1923SGuochun Huang 	switch (samsung->lanes) {
148606bd1923SGuochun Huang 	case 4:
148706bd1923SGuochun Huang 		phy_write(samsung, DPHY_MD3_GNR_CON1, T_PHY_READY(0x2000));
148806bd1923SGuochun Huang 		phy_update_bits(samsung, DPHY_MD3_GNR_CON0,
148906bd1923SGuochun Huang 				PHY_ENABLE, PHY_ENABLE);
149006bd1923SGuochun Huang 		//fallthrough;
149106bd1923SGuochun Huang 	case 3:
149206bd1923SGuochun Huang 		phy_write(samsung, COMBO_MD2_GNR_CON1, T_PHY_READY(0x2000));
149306bd1923SGuochun Huang 		phy_update_bits(samsung, COMBO_MD2_GNR_CON0,
149406bd1923SGuochun Huang 				PHY_ENABLE, PHY_ENABLE);
149506bd1923SGuochun Huang 		//fallthrough;
149606bd1923SGuochun Huang 	case 2:
149706bd1923SGuochun Huang 		phy_write(samsung, COMBO_MD1_GNR_CON1, T_PHY_READY(0x2000));
149806bd1923SGuochun Huang 		phy_update_bits(samsung, COMBO_MD1_GNR_CON0,
149906bd1923SGuochun Huang 				PHY_ENABLE, PHY_ENABLE);
150006bd1923SGuochun Huang 		//fallthrough;
150106bd1923SGuochun Huang 	case 1:
150206bd1923SGuochun Huang 	default:
150306bd1923SGuochun Huang 		phy_write(samsung, COMBO_MD0_GNR_CON1, T_PHY_READY(0x2000));
150406bd1923SGuochun Huang 		phy_update_bits(samsung, COMBO_MD0_GNR_CON0,
150506bd1923SGuochun Huang 				PHY_ENABLE, PHY_ENABLE);
150606bd1923SGuochun Huang 		break;
150706bd1923SGuochun Huang 	}
15088995df60SGuochun Huang }
15098995df60SGuochun Huang 
samsung_mipi_cphy_timing_init(struct samsung_mipi_dcphy * samsung)15108995df60SGuochun Huang static void samsung_mipi_cphy_timing_init(struct samsung_mipi_dcphy *samsung)
15118995df60SGuochun Huang {
15128995df60SGuochun Huang 	const struct samsung_mipi_cphy_timing *timing;
15138995df60SGuochun Huang 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
15148995df60SGuochun Huang 	u32 val = 0;
15158995df60SGuochun Huang 
15168995df60SGuochun Huang 	timing = samsung_mipi_cphy_get_timing(samsung);
15178995df60SGuochun Huang 
15188995df60SGuochun Huang 	/*
15198995df60SGuochun Huang 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
15205df36e39SGuochun Huang 	 * 500Msps, otherwise divide-by-16 Clock from Serial Clock
15218995df60SGuochun Huang 	 */
15225df36e39SGuochun Huang 	if (lane_hs_rate < 500)
15238995df60SGuochun Huang 		val = HSTX_CLK_SEL;
15248995df60SGuochun Huang 
15258995df60SGuochun Huang 	val |= T_LPX(timing->lpx);
15268995df60SGuochun Huang 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
15278995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON0, val);
15288995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON0, val);
15298995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON0, val);
15308995df60SGuochun Huang 
15318995df60SGuochun Huang 	val = T_HS_ZERO(timing->prebegin_3) | T_HS_PREPARE(timing->prepare_3);
15328995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON1, val);
15338995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON1, val);
15348995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON1, val);
15358995df60SGuochun Huang 
15368995df60SGuochun Huang 	val = T_HS_EXIT(timing->hs_exit) | T_HS_TRAIL(timing->post_3);
15378995df60SGuochun Huang 	phy_write(samsung, DPHY_MD3_TIME_CON2, val);
15388995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON2, val);
15398995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON2, val);
15408995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON2, val);
15418995df60SGuochun Huang 
15428995df60SGuochun Huang 	/* TTA-GET/TTA-GO Timing Counter register use default value */
15438995df60SGuochun Huang 	val = T_TA_GET(0x3) | T_TA_GO(0x0);
15448995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON3, val);
15458995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON3, val);
15468995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON3, val);
15478995df60SGuochun Huang 
15488995df60SGuochun Huang 	/* Escape Clock is 20.00MHz */
15498995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_TIME_CON4, 0x1f4);
15508995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_TIME_CON4, 0x1f4);
15518995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_TIME_CON4, 0x1f4);
15528995df60SGuochun Huang 
15538995df60SGuochun Huang 	/* set T_ERR_SOT_SYNC default value */
15548995df60SGuochun Huang }
15558995df60SGuochun Huang 
samsung_mipi_cphy_lane_enable(struct samsung_mipi_dcphy * samsung)15568995df60SGuochun Huang static void samsung_mipi_cphy_lane_enable(struct samsung_mipi_dcphy *samsung)
15578995df60SGuochun Huang {
15588995df60SGuochun Huang 	phy_write(samsung, COMBO_MD0_GNR_CON1, T_PHY_READY(0x2000));
15598995df60SGuochun Huang 	phy_write(samsung, COMBO_MD1_GNR_CON1, T_PHY_READY(0x2000));
15608995df60SGuochun Huang 	phy_write(samsung, COMBO_MD2_GNR_CON1, T_PHY_READY(0x2000));
15618995df60SGuochun Huang 
15628995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD0_GNR_CON0, PHY_ENABLE, PHY_ENABLE);
15638995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD1_GNR_CON0, PHY_ENABLE, PHY_ENABLE);
15648995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD2_GNR_CON0, PHY_ENABLE, PHY_ENABLE);
15658995df60SGuochun Huang }
15668995df60SGuochun Huang 
15678995df60SGuochun Huang static void
samsung_mipi_dcphy_hs_vreg_amp_config(struct samsung_mipi_dcphy * samsung)15688995df60SGuochun Huang samsung_mipi_dcphy_hs_vreg_amp_config(struct samsung_mipi_dcphy *samsung)
15698995df60SGuochun Huang {
15708995df60SGuochun Huang 	phy_write(samsung, DPHY_MC_ANA_CON2, HS_VREG_AMP_ICON(2));
15718995df60SGuochun Huang }
15728995df60SGuochun Huang 
samsung_mipi_dphy_power_on(struct samsung_mipi_dcphy * samsung)15738995df60SGuochun Huang static void samsung_mipi_dphy_power_on(struct samsung_mipi_dcphy *samsung)
15748995df60SGuochun Huang {
1575cd24009bSGuochun Huang 	reset_assert(&samsung->m_phy_rst);
15768995df60SGuochun Huang 
15778995df60SGuochun Huang 	samsung_mipi_dcphy_bias_block_enable(samsung);
15788995df60SGuochun Huang 	samsung_mipi_dcphy_pll_configure(samsung);
15798995df60SGuochun Huang 	samsung_mipi_dphy_clk_lane_timing_init(samsung);
15808995df60SGuochun Huang 	samsung_mipi_dphy_data_lane_timing_init(samsung);
15818995df60SGuochun Huang 	samsung_mipi_dcphy_pll_enable(samsung);
15828995df60SGuochun Huang 	samsung_mipi_dphy_lane_enable(samsung);
15838995df60SGuochun Huang 
1584cd24009bSGuochun Huang 	reset_deassert(&samsung->m_phy_rst);
1585c6fe3b68SGuochun Huang 
1586c6fe3b68SGuochun Huang 	/* The Tskewcal maximum is 100 usec at initial calibration. */
1587c6fe3b68SGuochun Huang 	udelay(100);
15888995df60SGuochun Huang }
15898995df60SGuochun Huang 
samsung_mipi_cphy_power_on(struct samsung_mipi_dcphy * samsung)15908995df60SGuochun Huang static void samsung_mipi_cphy_power_on(struct samsung_mipi_dcphy *samsung)
15918995df60SGuochun Huang {
15928995df60SGuochun Huang 	grf_write(samsung, MIPI_DCPHY_GRF_CON0, M_CPHY_MODE);
1593cd24009bSGuochun Huang 	reset_assert(&samsung->m_phy_rst);
15948995df60SGuochun Huang 
15958995df60SGuochun Huang 	samsung_mipi_dcphy_bias_block_enable(samsung);
15968995df60SGuochun Huang 	samsung_mipi_dcphy_hs_vreg_amp_config(samsung);
15978995df60SGuochun Huang 	samsung_mipi_dcphy_pll_configure(samsung);
15988995df60SGuochun Huang 	samsung_mipi_cphy_timing_init(samsung);
15998995df60SGuochun Huang 	samsung_mipi_dcphy_pll_enable(samsung);
16008995df60SGuochun Huang 	samsung_mipi_cphy_lane_enable(samsung);
16018995df60SGuochun Huang 
1602cd24009bSGuochun Huang 	reset_deassert(&samsung->m_phy_rst);
16038995df60SGuochun Huang }
16048995df60SGuochun Huang 
samsung_mipi_dphy_lane_disable(struct samsung_mipi_dcphy * samsung)16058995df60SGuochun Huang static void samsung_mipi_dphy_lane_disable(struct samsung_mipi_dcphy *samsung)
16068995df60SGuochun Huang {
16078995df60SGuochun Huang 	phy_update_bits(samsung, DPHY_MC_GNR_CON0, PHY_ENABLE, 0);
16088995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD0_GNR_CON0, PHY_ENABLE, 0);
16098995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD1_GNR_CON0, PHY_ENABLE, 0);
16108995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD2_GNR_CON0, PHY_ENABLE, 0);
16118995df60SGuochun Huang 	phy_update_bits(samsung, DPHY_MD3_GNR_CON0, PHY_ENABLE, 0);
16128995df60SGuochun Huang }
16138995df60SGuochun Huang 
samsung_mipi_cphy_lane_disable(struct samsung_mipi_dcphy * samsung)16148995df60SGuochun Huang static void samsung_mipi_cphy_lane_disable(struct samsung_mipi_dcphy *samsung)
16158995df60SGuochun Huang {
16168995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD0_GNR_CON0, PHY_ENABLE, 0);
16178995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD1_GNR_CON0, PHY_ENABLE, 0);
16188995df60SGuochun Huang 	phy_update_bits(samsung, COMBO_MD2_GNR_CON0, PHY_ENABLE, 0);
16198995df60SGuochun Huang }
16208995df60SGuochun Huang 
samsung_mipi_dcphy_power_on(struct rockchip_phy * phy)16218995df60SGuochun Huang static int samsung_mipi_dcphy_power_on(struct rockchip_phy *phy)
16228995df60SGuochun Huang {
16238995df60SGuochun Huang 	struct samsung_mipi_dcphy *samsung = dev_get_priv(phy->dev);
16248995df60SGuochun Huang 
162575d08e7bSGuochun Huang 	if (samsung->mode == PHY_MODE_MIPI_DPHY)
16268995df60SGuochun Huang 		samsung_mipi_dphy_power_on(samsung);
162775d08e7bSGuochun Huang 	else
16288995df60SGuochun Huang 		samsung_mipi_cphy_power_on(samsung);
16298995df60SGuochun Huang 
16308995df60SGuochun Huang 	return 0;
16318995df60SGuochun Huang }
16328995df60SGuochun Huang 
samsung_mipi_dcphy_power_off(struct rockchip_phy * phy)16338995df60SGuochun Huang static int samsung_mipi_dcphy_power_off(struct rockchip_phy *phy)
16348995df60SGuochun Huang {
16358995df60SGuochun Huang 	struct samsung_mipi_dcphy *samsung = dev_get_priv(phy->dev);
16368995df60SGuochun Huang 
163775d08e7bSGuochun Huang 	if (samsung->mode == PHY_MODE_MIPI_DPHY)
16388995df60SGuochun Huang 		samsung_mipi_dphy_lane_disable(samsung);
163975d08e7bSGuochun Huang 	else
16408995df60SGuochun Huang 		samsung_mipi_cphy_lane_disable(samsung);
16418995df60SGuochun Huang 
16428995df60SGuochun Huang 	samsung_mipi_dcphy_pll_disable(samsung);
16438995df60SGuochun Huang 	samsung_mipi_dcphy_bias_block_disable(samsung);
16448995df60SGuochun Huang 
16458995df60SGuochun Huang 	return 0;
16468995df60SGuochun Huang }
16478995df60SGuochun Huang 
16488995df60SGuochun Huang static int
samsung_mipi_dcphy_pll_ssc_modulation_calc(struct samsung_mipi_dcphy * samsung,u16 prediv,u16 fbdiv,u8 * mfr,u8 * mrr)16498995df60SGuochun Huang samsung_mipi_dcphy_pll_ssc_modulation_calc(struct samsung_mipi_dcphy *samsung,
165021906a8eSZhibin Huang 					   u16 prediv, u16 fbdiv, u8 *mfr, u8 *mrr)
16518995df60SGuochun Huang {
16528995df60SGuochun Huang 	unsigned long fin = 24000;
165321906a8eSZhibin Huang 	u16 min_mfr, max_mfr, mid_mfr, mfr_end;
16548995df60SGuochun Huang 	u16 _mfr, best_mfr = 0;
165521906a8eSZhibin Huang 	u16 _mrr, best_mrr = 0;
16568995df60SGuochun Huang 
165721906a8eSZhibin Huang 	/* MF(MHz) = Fref / p / mfr / 32 */
165821906a8eSZhibin Huang 	/* 30MHz ≤ MF ≤ 33MHz, default 31 */
165921906a8eSZhibin Huang 	max_mfr = DIV_ROUND_UP(fin, (30 * prediv) << 5);
166021906a8eSZhibin Huang 	min_mfr = div64_ul(fin, ((33 * prediv) << 5));
166121906a8eSZhibin Huang 	mid_mfr = div64_ul(fin, (31 * prediv) << 5);
16628995df60SGuochun Huang 	/* 0 ≤ mfr ≤ 255 */
16638995df60SGuochun Huang 	if (max_mfr > 256)
16648995df60SGuochun Huang 		max_mfr = 256;
16658995df60SGuochun Huang 
166621906a8eSZhibin Huang 	mfr_end = max_mfr;
166721906a8eSZhibin Huang 	for (_mfr = mid_mfr; _mfr < mfr_end; _mfr++) {
166821906a8eSZhibin Huang 		/* MR(%) = mfr * mrr * 100 / m / 64 */
166921906a8eSZhibin Huang 		/* 0 ≤ MR ≤ 5000ppm(0.5%), default is reduced from 0.25%. */
167021906a8eSZhibin Huang 		_mrr = (25 * fbdiv << 6) / (_mfr * 100 * 100);
167121906a8eSZhibin Huang 		for (; _mrr > 0; _mrr--) {
167221906a8eSZhibin Huang 			/* 0 ≤ mrr * mfr ≤ 512 */
167321906a8eSZhibin Huang 			if (_mfr * _mrr <= 512) {
16748995df60SGuochun Huang 				best_mfr = _mfr;
16758995df60SGuochun Huang 				best_mrr = _mrr;
16768995df60SGuochun Huang 				break;
16778995df60SGuochun Huang 			}
16788995df60SGuochun Huang 		}
167921906a8eSZhibin Huang 
168021906a8eSZhibin Huang 		if (best_mrr)
168121906a8eSZhibin Huang 			break;
168221906a8eSZhibin Huang 
168321906a8eSZhibin Huang 		if (_mfr == mfr_end - 1 && _mfr > mid_mfr) {
168421906a8eSZhibin Huang 			_mfr = min_mfr - 1;
168521906a8eSZhibin Huang 			mfr_end = mid_mfr;
168621906a8eSZhibin Huang 		}
16878995df60SGuochun Huang 	}
16888995df60SGuochun Huang 
16898995df60SGuochun Huang 	if (best_mrr) {
16908995df60SGuochun Huang 		*mfr = best_mfr & 0xff;
16918995df60SGuochun Huang 		*mrr = best_mrr & 0x3f;
169221906a8eSZhibin Huang 		dev_info(samsung->dev, "mfr=%d, mrr=%d, MF=%llukHz, MR=%lluppm\n",
169321906a8eSZhibin Huang 			 *mfr, *mrr, div64_ul(fin, (prediv * *mfr) << 5),
169421906a8eSZhibin Huang 			 div64_ul(*mfr * *mrr * 1000000, fbdiv << 6));
16958995df60SGuochun Huang 
16968995df60SGuochun Huang 		return 0;
16978995df60SGuochun Huang 	}
16988995df60SGuochun Huang 
169921906a8eSZhibin Huang 	dev_info(samsung->dev, "%s: failed to calc ssc parameter mfr and mrr\n", __func__);
170021906a8eSZhibin Huang 
170121906a8eSZhibin Huang 	return -EINVAL;
170221906a8eSZhibin Huang }
170321906a8eSZhibin Huang 
17048995df60SGuochun Huang static unsigned long
samsung_mipi_dcphy_pll_round_rate(struct samsung_mipi_dcphy * samsung,unsigned long prate,unsigned long rate,u8 * prediv,u16 * fbdiv,u16 * dsm,u8 * scaler,u8 * mfr,u8 * mrr)17058995df60SGuochun Huang samsung_mipi_dcphy_pll_round_rate(struct samsung_mipi_dcphy *samsung,
17068995df60SGuochun Huang 				  unsigned long prate, unsigned long rate,
170721906a8eSZhibin Huang 				  u8 *prediv, u16 *fbdiv, u16 *dsm, u8 *scaler, u8 *mfr, u8 *mrr)
17088995df60SGuochun Huang {
1709ffabeb2fSGuochun Huang 	u32 max_fout = samsung->c_option ?
1710ffabeb2fSGuochun Huang 		       samsung->pdata->cphy_tx_max_ksps_per_lane :
1711ffabeb2fSGuochun Huang 		       samsung->pdata->dphy_tx_max_kbps_per_lane;
171221906a8eSZhibin Huang 	u64 _freq, best_freq = 0;
171312f57f38SGuochun Huang 	u64 fin, fvco, fout;
17148995df60SGuochun Huang 	u8 min_prediv, max_prediv;
171521906a8eSZhibin Huang 	u8 _mfr = 0, best_mfr = 0;
171621906a8eSZhibin Huang 	u8 _mrr = 0, best_mrr = 0;
17178995df60SGuochun Huang 	u8 _prediv, best_prediv = 1;
17188995df60SGuochun Huang 	u16 _fbdiv, best_fbdiv = 1;
17198995df60SGuochun Huang 	u8 _scaler, best_scaler = 0;
172021906a8eSZhibin Huang 	long long _dsm, best_dsm = 0;
17218995df60SGuochun Huang 	u32 min_delta = 0xffffffff;
172221906a8eSZhibin Huang 	int ret = 0;
17238995df60SGuochun Huang 
1724ffabeb2fSGuochun Huang 	if (!prate) {
1725ffabeb2fSGuochun Huang 		dev_err(samsung->dev, "prate of pll can not be set zero\n");
1726ffabeb2fSGuochun Huang 		return 0;
1727ffabeb2fSGuochun Huang 	}
1728ffabeb2fSGuochun Huang 
172921906a8eSZhibin Huang 	printf("%s: fin=%lu, req_rate=%lu\n",
173021906a8eSZhibin Huang 	       __func__, prate, rate);
173121906a8eSZhibin Huang 
17328995df60SGuochun Huang 	/*
17338995df60SGuochun Huang 	 * The PLL output frequency can be calculated using a simple formula:
17348995df60SGuochun Huang 	 * Fvco = ((m+k/65536) x 2 x Fin) / p
17358995df60SGuochun Huang 	 * Fout = ((m+k/65536) x 2 x Fin) / (p x 2^s)
17368995df60SGuochun Huang 	 */
173712f57f38SGuochun Huang 	fin = div64_ul(prate, MSEC_PER_SEC);
17388995df60SGuochun Huang 
17398995df60SGuochun Huang 	while (!best_freq) {
174012f57f38SGuochun Huang 		fout = div64_ul(rate, MSEC_PER_SEC);
17418995df60SGuochun Huang 		if (fout > max_fout)
17428995df60SGuochun Huang 			fout = max_fout;
17438995df60SGuochun Huang 
17448995df60SGuochun Huang 		/* 0 ≤ S[2:0] ≤ 6 */
17458995df60SGuochun Huang 		for (_scaler = 0; _scaler < 7; _scaler++) {
17468995df60SGuochun Huang 			fvco = fout << _scaler;
17478995df60SGuochun Huang 
17488995df60SGuochun Huang 			/*
17498995df60SGuochun Huang 			 * 2600MHz ≤ FVCO ≤ 6600MHz
17508995df60SGuochun Huang 			 */
175112f57f38SGuochun Huang 			if (fvco < 2600 * MSEC_PER_SEC || fvco > 6600 * MSEC_PER_SEC)
17528995df60SGuochun Huang 				continue;
17538995df60SGuochun Huang 
17548995df60SGuochun Huang 			/* 6MHz ≤ Fref(Fin / p) ≤ 30MHz */
175512f57f38SGuochun Huang 			min_prediv = DIV_ROUND_UP(fin, 30 * MSEC_PER_SEC);
175612f57f38SGuochun Huang 			max_prediv = DIV_ROUND_CLOSEST(fin, 6 * MSEC_PER_SEC);
17578995df60SGuochun Huang 
17588995df60SGuochun Huang 			for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
175912f57f38SGuochun Huang 				u64 delta, tmp;
17608995df60SGuochun Huang 
17618995df60SGuochun Huang 				_fbdiv = DIV_ROUND_CLOSEST(fvco * _prediv, 2 * fin);
17628995df60SGuochun Huang 
17638995df60SGuochun Huang 				 /* 64 ≤ M[9:0] ≤ 1023 */
17648995df60SGuochun Huang 				if ((_fbdiv < 64) || (_fbdiv > 1023))
17658995df60SGuochun Huang 					continue;
17668995df60SGuochun Huang 
176721906a8eSZhibin Huang 				/* -32768 ≤ K[15:0] ≤ 32767 */
176821906a8eSZhibin Huang 				_dsm = _prediv * fvco - 2 * _fbdiv * fin;
176921906a8eSZhibin Huang 				_dsm = _dsm / abs(_dsm) * DIV_ROUND_UP_ULL(abs(_dsm) << 15, fin);
177021906a8eSZhibin Huang 				if (_dsm < -32768 || _dsm > 32767)
17718995df60SGuochun Huang 					continue;
17728995df60SGuochun Huang 
177321906a8eSZhibin Huang 				tmp = DIV_ROUND_CLOSEST(_fbdiv * fin * 2 * 1000, _prediv);
177421906a8eSZhibin Huang 				tmp += (_dsm / abs(_dsm) *
177521906a8eSZhibin Huang 					DIV_ROUND_CLOSEST(abs(_dsm) * fin * 1000,
177621906a8eSZhibin Huang 							      _prediv << 15));
177721906a8eSZhibin Huang 				_freq = (DIV_ROUND_CLOSEST(tmp, 1000) * MSEC_PER_SEC);
177821906a8eSZhibin Huang 
177921906a8eSZhibin Huang 				/*
178021906a8eSZhibin Huang 				 * All DPHY 2.0 compliant Transmitters shall support SSC
178121906a8eSZhibin Huang 				 * operating above 2.5 Gbps
178221906a8eSZhibin Huang 				 */
178321906a8eSZhibin Huang 				if ((_freq >> _scaler) > 2500000000LL)
178421906a8eSZhibin Huang 					ret = samsung_mipi_dcphy_pll_ssc_modulation_calc(samsung,
178521906a8eSZhibin Huang 											 _prediv,
178621906a8eSZhibin Huang 											 _fbdiv,
178721906a8eSZhibin Huang 											 &_mfr,
178821906a8eSZhibin Huang 											 &_mrr);
17898995df60SGuochun Huang 
179012f57f38SGuochun Huang 				delta = abs(fvco * MSEC_PER_SEC - tmp);
179121906a8eSZhibin Huang 				if (!ret && delta <= min_delta) {
17928995df60SGuochun Huang 					best_prediv = _prediv;
17938995df60SGuochun Huang 					best_fbdiv = _fbdiv;
17948995df60SGuochun Huang 					best_dsm = _dsm;
179521906a8eSZhibin Huang 					best_mfr = _mfr;
179621906a8eSZhibin Huang 					best_mrr = _mrr;
17978995df60SGuochun Huang 					best_scaler = _scaler;
17988995df60SGuochun Huang 					min_delta = delta;
179921906a8eSZhibin Huang 					best_freq = _freq;
18008995df60SGuochun Huang 				}
18018995df60SGuochun Huang 			}
18028995df60SGuochun Huang 		}
18038995df60SGuochun Huang 
180412f57f38SGuochun Huang 		rate += 100 * MSEC_PER_SEC;
18058995df60SGuochun Huang 	}
18068995df60SGuochun Huang 
18078995df60SGuochun Huang 	*prediv = best_prediv;
18088995df60SGuochun Huang 	*fbdiv = best_fbdiv;
18098995df60SGuochun Huang 	*dsm = (int)best_dsm & 0xffff;
18108995df60SGuochun Huang 	*scaler = best_scaler;
181121906a8eSZhibin Huang 	*mfr = best_mfr;
181221906a8eSZhibin Huang 	*mrr = best_mrr;
181321906a8eSZhibin Huang 	printf("%s: fout=%llu, prediv=%u, fbdiv=%u, dsm=%lld, scaler=%u\n",
181421906a8eSZhibin Huang 	       __func__, best_freq >> best_scaler, best_prediv, best_fbdiv, best_dsm, best_scaler);
18158995df60SGuochun Huang 
18168995df60SGuochun Huang 	return best_freq >> best_scaler;
18178995df60SGuochun Huang }
18188995df60SGuochun Huang 
samsung_mipi_dcphy_set_pll(struct rockchip_phy * phy,unsigned long rate)18198995df60SGuochun Huang static unsigned long samsung_mipi_dcphy_set_pll(struct rockchip_phy *phy,
18208995df60SGuochun Huang 						unsigned long rate)
18218995df60SGuochun Huang {
18228995df60SGuochun Huang 	struct samsung_mipi_dcphy *samsung = dev_get_priv(phy->dev);
182375d08e7bSGuochun Huang 	unsigned long fin = 24000000, fout;
18248995df60SGuochun Huang 	u8 scaler = 0, mfr = 0, mrr = 0;
1825ffabeb2fSGuochun Huang 	u16 fbdiv = 0;
18268995df60SGuochun Huang 	u8 prediv = 1;
182721906a8eSZhibin Huang 	u16 dsm = 0;
18288995df60SGuochun Huang 
182975d08e7bSGuochun Huang 	samsung->c_option = (samsung->mode == PHY_MODE_MIPI_DPHY) ? false : true;
18308995df60SGuochun Huang 	fout = samsung_mipi_dcphy_pll_round_rate(samsung, fin, rate, &prediv,
183121906a8eSZhibin Huang 						 &fbdiv, &dsm, &scaler, &mfr, &mrr);
18328995df60SGuochun Huang 
183321906a8eSZhibin Huang 	if (fout != 0) {
18348995df60SGuochun Huang 		samsung->pll.prediv = prediv;
18358995df60SGuochun Huang 		samsung->pll.fbdiv = fbdiv;
18368995df60SGuochun Huang 		samsung->pll.dsm = dsm;
18378995df60SGuochun Huang 		samsung->pll.scaler = scaler;
18388995df60SGuochun Huang 		samsung->pll.rate = fout;
18398995df60SGuochun Huang 
18408995df60SGuochun Huang 		if (fout > 2500000000LL) {
18418995df60SGuochun Huang 			samsung->pll.ssc_en = true;
18428995df60SGuochun Huang 			samsung->pll.mfr = mfr;
18438995df60SGuochun Huang 			samsung->pll.mrr = mrr;
18448995df60SGuochun Huang 		}
18458995df60SGuochun Huang 	}
18468995df60SGuochun Huang 
18478995df60SGuochun Huang 	return fout;
18488995df60SGuochun Huang }
18498995df60SGuochun Huang 
samsung_mipi_dcphy_set_mode(struct rockchip_phy * phy,enum phy_mode mode)18508995df60SGuochun Huang static int samsung_mipi_dcphy_set_mode(struct rockchip_phy *phy,
18518995df60SGuochun Huang 				       enum phy_mode mode)
18528995df60SGuochun Huang {
18538995df60SGuochun Huang 	struct samsung_mipi_dcphy *samsung = dev_get_priv(phy->dev);
18548995df60SGuochun Huang 
18558995df60SGuochun Huang 	samsung->mode = mode;
18568995df60SGuochun Huang 
18578995df60SGuochun Huang 	return 0;
18588995df60SGuochun Huang }
18598995df60SGuochun Huang 
samsung_mipi_dcphy_probe(struct udevice * dev)18608995df60SGuochun Huang static int samsung_mipi_dcphy_probe(struct udevice *dev)
18618995df60SGuochun Huang {
18628995df60SGuochun Huang 	struct samsung_mipi_dcphy *samsung = dev_get_priv(dev);
18638995df60SGuochun Huang 	struct rockchip_phy *tmp_phy;
18648995df60SGuochun Huang 	struct rockchip_phy *phy;
186575d08e7bSGuochun Huang 	struct udevice *syscon;
18668995df60SGuochun Huang 	int ret;
18678995df60SGuochun Huang 
18688995df60SGuochun Huang 	phy = calloc(1, sizeof(*phy));
18698995df60SGuochun Huang 	if (!phy)
18708995df60SGuochun Huang 		return -ENOMEM;
18718995df60SGuochun Huang 
18728995df60SGuochun Huang 	tmp_phy = (struct rockchip_phy *)dev_get_driver_data(dev);
18738995df60SGuochun Huang 	dev->driver_data = (ulong)phy;
18748995df60SGuochun Huang 	memcpy(phy, tmp_phy, sizeof(*phy));
18758995df60SGuochun Huang 
1876ffabeb2fSGuochun Huang 	samsung->pdata = (struct samsung_mipi_dcphy_plat_data *)phy->data;
187706bd1923SGuochun Huang 	samsung->lanes = ofnode_read_u32_default(dev->node, "samsung,lanes", 4);
187806bd1923SGuochun Huang 
18798995df60SGuochun Huang 	samsung->base = dev_read_addr_ptr(dev);
18808995df60SGuochun Huang 	if (IS_ERR(samsung->base)) {
18818995df60SGuochun Huang 		dev_err(dev, "resource \"phy\" not found\n");
18828995df60SGuochun Huang 		return PTR_ERR(samsung->base);
18838995df60SGuochun Huang 	}
18848995df60SGuochun Huang 
188575d08e7bSGuochun Huang 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
188675d08e7bSGuochun Huang 					   &syscon);
188775d08e7bSGuochun Huang 	if (!ret) {
188875d08e7bSGuochun Huang 		samsung->grf = syscon_get_regmap(syscon);
188975d08e7bSGuochun Huang 		if (!samsung->grf)
189075d08e7bSGuochun Huang 			return -ENODEV;
18918995df60SGuochun Huang 	}
18928995df60SGuochun Huang 
1893cd24009bSGuochun Huang 	ret = reset_get_by_name(dev, "m_phy", &samsung->m_phy_rst);
1894cd24009bSGuochun Huang 	if (ret) {
1895cd24009bSGuochun Huang 		ret = reset_get_by_name(dev, "phy", &samsung->m_phy_rst);
18968995df60SGuochun Huang 		if (ret) {
18978995df60SGuochun Huang 			pr_err("reset_get_by_name(phy) failed: %d\n", ret);
18988995df60SGuochun Huang 			return ret;
18998995df60SGuochun Huang 		}
1900cd24009bSGuochun Huang 	}
19018995df60SGuochun Huang 
19028995df60SGuochun Huang 	phy->dev = dev;
19038995df60SGuochun Huang 
19048995df60SGuochun Huang 	return 0;
19058995df60SGuochun Huang }
19068995df60SGuochun Huang 
19078995df60SGuochun Huang static const struct rockchip_phy_funcs samsung_mipi_dcphy_funcs = {
19088995df60SGuochun Huang 	.power_on = samsung_mipi_dcphy_power_on,
19098995df60SGuochun Huang 	.power_off = samsung_mipi_dcphy_power_off,
19108995df60SGuochun Huang 	.set_pll = samsung_mipi_dcphy_set_pll,
19118995df60SGuochun Huang 	.set_mode = samsung_mipi_dcphy_set_mode,
19128995df60SGuochun Huang };
19138995df60SGuochun Huang 
1914cc91b41bSZhibin Huang static const struct hs_drv_res_cfg rk3576_dphy_hs_drv_res_cfg = {
1915cc91b41bSZhibin Huang 	.clk_hs_drv_up_ohm = _52_OHM,
1916cc91b41bSZhibin Huang 	.clk_hs_drv_down_ohm = _52_OHM,
1917*cee7440bSZhibin Huang 	.data_hs_drv_up_ohm = _43_OHM,
1918*cee7440bSZhibin Huang 	.data_hs_drv_down_ohm = _43_OHM,
1919cc91b41bSZhibin Huang };
1920cc91b41bSZhibin Huang 
1921cc91b41bSZhibin Huang static const struct hs_drv_res_cfg rk3588_dphy_hs_drv_res_cfg = {
1922cc91b41bSZhibin Huang 	.clk_hs_drv_up_ohm = _34_OHM,
1923cc91b41bSZhibin Huang 	.clk_hs_drv_down_ohm = _34_OHM,
1924cc91b41bSZhibin Huang 	.data_hs_drv_up_ohm = _43_OHM,
1925cc91b41bSZhibin Huang 	.data_hs_drv_down_ohm = _43_OHM,
1926cc91b41bSZhibin Huang };
1927cc91b41bSZhibin Huang 
1928ffabeb2fSGuochun Huang static const struct samsung_mipi_dcphy_plat_data rk3576_samsung_mipi_dcphy_plat_data = {
1929cc91b41bSZhibin Huang 	.dphy_hs_drv_res_cfg = &rk3576_dphy_hs_drv_res_cfg,
1930ffabeb2fSGuochun Huang 	.dphy_tx_max_kbps_per_lane = 2500000L,
1931cc91b41bSZhibin Huang 	.cphy_tx_max_ksps_per_lane = 1700000L,
1932ffabeb2fSGuochun Huang };
1933ffabeb2fSGuochun Huang 
1934ffabeb2fSGuochun Huang static const struct samsung_mipi_dcphy_plat_data rk3588_samsung_mipi_dcphy_plat_data = {
1935cc91b41bSZhibin Huang 	.dphy_hs_drv_res_cfg = &rk3588_dphy_hs_drv_res_cfg,
1936ffabeb2fSGuochun Huang 	.dphy_tx_max_kbps_per_lane = 4500000L,
1937ffabeb2fSGuochun Huang 	.cphy_tx_max_ksps_per_lane = 2000000L,
1938ffabeb2fSGuochun Huang };
1939ffabeb2fSGuochun Huang 
1940ffabeb2fSGuochun Huang static struct rockchip_phy rk3576_samsung_mipi_dcphy_driver_data = {
1941ffabeb2fSGuochun Huang 	 .data = &rk3576_samsung_mipi_dcphy_plat_data,
1942ffabeb2fSGuochun Huang 	 .funcs = &samsung_mipi_dcphy_funcs,
1943ffabeb2fSGuochun Huang };
1944ffabeb2fSGuochun Huang 
19458995df60SGuochun Huang static struct rockchip_phy rk3588_samsung_mipi_dcphy_driver_data = {
1946ffabeb2fSGuochun Huang 	 .data = &rk3588_samsung_mipi_dcphy_plat_data,
19478995df60SGuochun Huang 	 .funcs = &samsung_mipi_dcphy_funcs,
19488995df60SGuochun Huang };
19498995df60SGuochun Huang 
19508995df60SGuochun Huang static const struct udevice_id samsung_mipi_dcphy_ids[] = {
19518995df60SGuochun Huang 	{
1952ffabeb2fSGuochun Huang 		.compatible = "rockchip,rk3576-mipi-dcphy",
1953ffabeb2fSGuochun Huang 		.data = (ulong)&rk3576_samsung_mipi_dcphy_driver_data,
1954ffabeb2fSGuochun Huang 	}, {
19558995df60SGuochun Huang 		.compatible = "rockchip,rk3588-mipi-dcphy",
19568995df60SGuochun Huang 		.data = (ulong)&rk3588_samsung_mipi_dcphy_driver_data,
19578995df60SGuochun Huang 	},
19588995df60SGuochun Huang 	{}
19598995df60SGuochun Huang };
19608995df60SGuochun Huang 
19618995df60SGuochun Huang U_BOOT_DRIVER(samsung_mipi_dcphy) = {
19628995df60SGuochun Huang 	.name = "samsung-mipi-dcphy",
19638995df60SGuochun Huang 	.id = UCLASS_PHY,
19648995df60SGuochun Huang 	.of_match = samsung_mipi_dcphy_ids,
19658995df60SGuochun Huang 	.probe = samsung_mipi_dcphy_probe,
19668995df60SGuochun Huang 	.priv_auto_alloc_size = sizeof(struct samsung_mipi_dcphy),
19678995df60SGuochun Huang };
1968