Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * Copyright (C) Rockchip Electronics Co.Ltd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * Author:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *      Guochun Huang <hero.huang@rock-chips.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include <linux/mfd/syscon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) #include <linux/phy/phy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <linux/reset.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <media/v4l2-fwnode.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <media/v4l2-subdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include "phy-rockchip-csi2-dphy-common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) #include "phy-rockchip-samsung-dcphy.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #define UPDATE(x, h, l)	(((x) << (l)) & GENMASK((h), (l)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #define HIWORD_UPDATE(v, h, l)	(((v) << (l)) | (GENMASK((h), (l)) << 16))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #define BIAS_CON0		0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #define BIAS_CON1		0x0004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #define BIAS_CON2		0x0008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define BIAS_CON4		0x0010
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #define I_MUX_SEL_MASK		GENMASK(6, 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #define I_MUX_SEL(x)		UPDATE(x, 6, 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #define PLL_CON0		0x0100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #define PLL_EN			BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #define S_MASK			GENMASK(10, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #define S(x)			UPDATE(x, 10, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #define P_MASK			GENMASK(5, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #define P(x)			UPDATE(x, 5, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #define PLL_CON1		0x0104
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #define PLL_CON2		0x0108
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #define M_MASK			GENMASK(9, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #define M(x)			UPDATE(x, 9, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #define PLL_CON3		0x010c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #define MRR_MASK		GENMASK(13, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #define MRR(x)			UPDATE(x, 13, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #define MFR_MASK                GENMASK(7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #define MFR(x)			UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #define PLL_CON4		0x0110
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define SSCG_EN			BIT(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #define PLL_CON5		0x0114
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #define RESET_N_SEL		BIT(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #define PLL_ENABLE_SEL		BIT(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #define PLL_CON6		0x0118
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) #define PLL_CON7		0x011c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #define PLL_LOCK_CNT(x)		UPDATE(x, 15, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #define PLL_CON8		0x0120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) #define PLL_STB_CNT(x)		UPDATE(x, 15, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #define PLL_STAT0		0x0140
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define PLL_LOCK		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) #define DPHY_MC_GNR_CON0	0x0300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) #define PHY_READY		BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) #define PHY_ENABLE		BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) #define DPHY_MC_GNR_CON1	0x0304
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) #define T_PHY_READY(x)		UPDATE(x, 15, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #define DPHY_MC_ANA_CON0	0x0308
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #define DPHY_MC_ANA_CON1	0x030c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #define DPHY_MC_ANA_CON2	0x0310
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #define HS_VREG_AMP_ICON(x)	UPDATE(x, 1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define DPHY_MC_TIME_CON0	0x0330
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) #define HSTX_CLK_SEL		BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #define T_LPX(x)		UPDATE(x, 11, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #define DPHY_MC_TIME_CON1	0x0334
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #define T_CLK_ZERO(x)		UPDATE(x, 15, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) #define T_CLK_PREPARE(x)	UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) #define DPHY_MC_TIME_CON2	0x0338
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #define T_HS_EXIT(x)		UPDATE(x, 15, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) #define T_CLK_TRAIL(x)		UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) #define DPHY_MC_TIME_CON3	0x033c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) #define T_CLK_POST(x)		UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) #define DPHY_MC_TIME_CON4	0x0340
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #define T_ULPS_EXIT(x)		UPDATE(x, 9, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) #define DPHY_MC_DESKEW_CON0	0x0350
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #define SKEW_CAL_RUN_TIME(x)	UPDATE(x, 15, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #define SKEW_CAL_INIT_RUN_TIME(x)	UPDATE(x, 11, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #define SKEW_CAL_INIT_WAIT_TIME(x)	UPDATE(x, 7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define SKEW_CAL_EN			BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #define COMBO_MD0_GNR_CON0	0x0400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #define COMBO_MD0_GNR_CON1	0x0404
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) #define COMBO_MD0_ANA_CON0	0x0408
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #define COMBO_MD0_ANA_CON1      0x040C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #define COMBO_MD0_ANA_CON2	0x0410
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #define COMBO_MD0_TIME_CON0	0x0430
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #define COMBO_MD0_TIME_CON1	0x0434
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #define COMBO_MD0_TIME_CON2	0x0438
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define COMBO_MD0_TIME_CON3	0x043C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define COMBO_MD0_TIME_CON4	0x0440
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) #define COMBO_MD0_DATA_CON0	0x0444
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #define COMBO_MD1_GNR_CON0	0x0500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #define COMBO_MD1_GNR_CON1	0x0504
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) #define COMBO_MD1_ANA_CON0	0x0508
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #define COMBO_MD1_ANA_CON1	0x050c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #define COMBO_MD1_ANA_CON2	0x0510
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) #define COMBO_MD1_TIME_CON0	0x0530
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #define COMBO_MD1_TIME_CON1	0x0534
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #define COMBO_MD1_TIME_CON2	0x0538
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) #define COMBO_MD1_TIME_CON3	0x053C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #define COMBO_MD1_TIME_CON4	0x0540
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define COMBO_MD1_DATA_CON0	0x0544
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) #define COMBO_MD2_GNR_CON0	0x0600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #define COMBO_MD2_GNR_CON1	0x0604
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) #define COMBO_MD2_ANA_CON0	0X0608
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) #define COMBO_MD2_ANA_CON1	0X060C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) #define COMBO_MD2_ANA_CON2	0X0610
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) #define COMBO_MD2_TIME_CON0	0x0630
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) #define COMBO_MD2_TIME_CON1	0x0634
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) #define COMBO_MD2_TIME_CON2	0x0638
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) #define COMBO_MD2_TIME_CON3	0x063C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) #define COMBO_MD2_TIME_CON4	0x0640
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) #define COMBO_MD2_DATA_CON0	0x0644
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) #define DPHY_MD3_GNR_CON0	0x0700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) #define DPHY_MD3_GNR_CON1	0x0704
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #define DPHY_MD3_ANA_CON0	0X0708
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) #define DPHY_MD3_ANA_CON1	0X070C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define DPHY_MD3_ANA_CON2	0X0710
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) #define DPHY_MD3_TIME_CON0	0x0730
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) #define DPHY_MD3_TIME_CON1	0x0734
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) #define DPHY_MD3_TIME_CON2	0x0738
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) #define DPHY_MD3_TIME_CON3	0x073C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) #define DPHY_MD3_TIME_CON4	0x0740
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) #define DPHY_MD3_DATA_CON0	0x0744
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) #define T_LP_EXIT_SKEW(x)	UPDATE(x, 3, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) #define T_LP_ENTRY_SKEW(x)	UPDATE(x, 1, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) #define T_HS_ZERO(x)		UPDATE(x, 15, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define T_HS_PREPARE(x)		UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) #define T_HS_EXIT(x)		UPDATE(x, 15, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) #define T_HS_TRAIL(x)		UPDATE(x, 7, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) #define T_TA_GET(x)		UPDATE(x, 7, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #define T_TA_GO(x)		UPDATE(x, 3, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) /* MIPI_CDPHY_GRF registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #define MIPI_DCPHY_GRF_CON0	0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define S_CPHY_MODE		HIWORD_UPDATE(1, 3, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #define M_CPHY_MODE		HIWORD_UPDATE(1, 0, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) #define MAX_DPHY_BW		4500000L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) #define MAX_CPHY_BW		2000000L
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) #define RX_CLK_THS_SETTLE		(0xb30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) #define RX_LANE0_THS_SETTLE		(0xC30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) #define RX_LANE0_ERR_SOT_SYNC		(0xC34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) #define RX_LANE1_THS_SETTLE		(0xD30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) #define RX_LANE1_ERR_SOT_SYNC		(0xD34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) #define RX_LANE2_THS_SETTLE		(0xE30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) #define RX_LANE2_ERR_SOT_SYNC		(0xE34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) #define RX_LANE3_THS_SETTLE		(0xF30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) #define RX_LANE3_ERR_SOT_SYNC		(0xF34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) #define RX_CLK_LANE_ENABLE		(0xB00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) #define RX_DATA_LANE0_ENABLE		(0xC00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) #define RX_DATA_LANE1_ENABLE		(0xD00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) #define RX_DATA_LANE2_ENABLE		(0xE00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) #define RX_DATA_LANE3_ENABLE		(0xF00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) #define RX_S0C_GNR_CON1			(0xB04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) #define RX_S0C_ANA_CON1			(0xB0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) #define RX_S0C_ANA_CON2			(0xB10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) #define RX_S0C_ANA_CON3			(0xB14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) #define RX_COMBO_S0D0_GNR_CON1		(0xC04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) #define RX_COMBO_S0D0_ANA_CON1		(0xC0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) #define RX_COMBO_S0D0_ANA_CON2		(0xC10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) #define RX_COMBO_S0D0_ANA_CON3		(0xC14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) #define RX_COMBO_S0D0_ANA_CON6		(0xC20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) #define RX_COMBO_S0D0_ANA_CON7		(0xC24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) #define RX_COMBO_S0D0_DESKEW_CON0	(0xC40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) #define RX_COMBO_S0D0_DESKEW_CON2	(0xC48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) #define RX_COMBO_S0D0_DESKEW_CON4	(0xC50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) #define RX_COMBO_S0D0_CRC_CON1		(0xC64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) #define RX_COMBO_S0D0_CRC_CON2		(0xC68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) #define RX_COMBO_S0D1_GNR_CON1		(0xD04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) #define RX_COMBO_S0D1_ANA_CON1		(0xD0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) #define RX_COMBO_S0D1_ANA_CON2		(0xD10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) #define RX_COMBO_S0D1_ANA_CON3		(0xD14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) #define RX_COMBO_S0D1_ANA_CON6		(0xD20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) #define RX_COMBO_S0D1_ANA_CON7		(0xD24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) #define RX_COMBO_S0D1_DESKEW_CON0	(0xD40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) #define RX_COMBO_S0D1_DESKEW_CON2	(0xD48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) #define RX_COMBO_S0D1_DESKEW_CON4	(0xD50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) #define RX_COMBO_S0D1_CRC_CON1		(0xD64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) #define RX_COMBO_S0D1_CRC_CON2		(0xD68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) #define RX_COMBO_S0D2_GNR_CON1		(0xE04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) #define RX_COMBO_S0D2_ANA_CON1		(0xE0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) #define RX_COMBO_S0D2_ANA_CON2		(0xE10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) #define RX_COMBO_S0D2_ANA_CON3		(0xE14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) #define RX_COMBO_S0D2_ANA_CON6		(0xE20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) #define RX_COMBO_S0D2_ANA_CON7		(0xE24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) #define RX_COMBO_S0D2_DESKEW_CON0	(0xE40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) #define RX_COMBO_S0D2_DESKEW_CON2	(0xE48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) #define RX_COMBO_S0D2_DESKEW_CON4	(0xE50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) #define RX_COMBO_S0D2_CRC_CON1		(0xE64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) #define RX_COMBO_S0D2_CRC_CON2		(0xE68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) #define RX_S0D3_GNR_CON1		(0xF04)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) #define RX_S0D3_ANA_CON1		(0xF0c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) #define RX_S0D3_ANA_CON2		(0xF10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) #define RX_S0D3_ANA_CON3		(0xF14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) #define RX_S0D3_DESKEW_CON0		(0xF40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) #define RX_S0D3_DESKEW_CON2		(0xF48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) #define RX_S0D3_DESKEW_CON4		(0xF50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) struct samsung_mipi_dphy_timing {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	unsigned int max_lane_mbps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	u8 clk_prepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	u8 clk_zero;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	u8 clk_post;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	u8 clk_trail_eot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	u8 hs_prepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	u8 hs_zero;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	u8 hs_trail_eot;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	u8 lpx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	u8 hs_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	u8 hs_settle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) struct samsung_mipi_cphy_timing {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	unsigned int max_lane_msps;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	u8 prepare_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	u8 prebegin_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	u8 post_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	u8 lpx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	u8 hs_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	u8 settle_3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) static const
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) struct samsung_mipi_dphy_timing samsung_mipi_dphy_timing_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	{6500, 32, 117, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	{6490, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 	{6480, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	{6470, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	{6460, 32, 116, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 	{6450, 32, 115, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	{6440, 32, 115, 31, 28, 30, 56, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	{6430, 31, 116, 31, 28, 30, 55, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	{6420, 31, 116, 31, 28, 30, 55, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	{6410, 31, 116, 31, 27, 30, 55, 27, 24, 44, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	{6400, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	{6390, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	{6380, 31, 115, 30, 27, 30, 55, 27, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	{6370, 31, 115, 30, 27, 30, 55, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	{6360, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	{6350, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	{6340, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 	{6330, 31, 114, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	{6320, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	{6310, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	{6300, 31, 113, 30, 27, 30, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	{6290, 31, 113, 30, 27, 29, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	{6280, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	{6270, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	{6260, 31, 112, 30, 27, 29, 54, 26, 23, 43, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	{6250, 31, 112, 30, 27, 29, 54, 26, 23, 42, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	{6240, 30, 113, 30, 27, 29, 54, 26, 23, 42, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	{6230, 30, 112, 30, 27, 29, 54, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	{6220, 30, 112, 30, 27, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	{6210, 30, 112, 30, 27, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	{6200, 30, 112, 29, 27, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	{6190, 30, 111, 29, 27, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	{6180, 30, 111, 29, 27, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 	{6170, 30, 111, 29, 26, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	{6160, 30, 111, 29, 26, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	{6150, 30, 110, 29, 26, 29, 53, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	{6140, 30, 110, 29, 26, 29, 52, 26, 23, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	{6130, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	{6120, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	{6110, 30, 110, 29, 26, 29, 52, 25, 22, 42, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	{6100, 30, 109, 29, 26, 29, 52, 25, 22, 41, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	{6090, 30, 109, 29, 26, 29, 52, 25, 22, 41, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	{6080, 30, 109, 29, 26, 28, 53, 25, 22, 41, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	{6070, 30, 109, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	{6060, 30, 108, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	{6050, 30, 108, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	{6040, 29, 109, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	{6030, 29, 109, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	{6020, 29, 108, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	{6010, 29, 108, 29, 26, 28, 52, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	{6000, 29, 108, 28, 26, 28, 51, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	{5990, 29, 108, 28, 26, 28, 51, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	{5980, 29, 107, 28, 26, 28, 51, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	{5970, 29, 107, 28, 26, 28, 51, 25, 22, 41, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	{5960, 29, 107, 28, 26, 28, 51, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	{5950, 29, 107, 28, 26, 28, 51, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	{5940, 29, 107, 28, 25, 28, 51, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	{5930, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	{5920, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	{5910, 29, 106, 28, 25, 28, 50, 25, 22, 40, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	{5900, 29, 106, 28, 25, 28, 50, 24, 22, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	{5890, 29, 105, 28, 25, 28, 50, 24, 22, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	{5880, 29, 105, 28, 25, 28, 50, 24, 22, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	{5870, 29, 105, 28, 25, 27, 51, 24, 22, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	{5860, 29, 105, 28, 25, 27, 51, 24, 21, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	{5850, 29, 104, 28, 25, 27, 50, 24, 21, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	{5840, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	{5830, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	{5820, 28, 105, 28, 25, 27, 50, 24, 21, 40, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	{5810, 28, 104, 28, 25, 27, 50, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	{5800, 28, 104, 27, 25, 27, 50, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	{5790, 28, 104, 27, 25, 27, 50, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	{5780, 28, 104, 27, 25, 27, 49, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	{5770, 28, 104, 27, 25, 27, 49, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	{5760, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	{5750, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	{5740, 28, 103, 27, 25, 27, 49, 24, 21, 39, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	{5730, 28, 103, 27, 25, 27, 49, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	{5720, 28, 102, 27, 25, 27, 49, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	{5710, 28, 102, 27, 25, 27, 48, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	{5700, 28, 102, 27, 24, 27, 48, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	{5690, 28, 102, 27, 24, 27, 48, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	{5680, 28, 101, 27, 24, 27, 48, 24, 21, 39, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 	{5670, 28, 101, 27, 24, 27, 48, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	{5660, 28, 101, 27, 24, 26, 49, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	{5650, 28, 101, 27, 24, 26, 49, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	{5640, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	{5630, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	{5620, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	{5610, 27, 101, 27, 24, 26, 48, 23, 21, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	{5600, 27, 101, 26, 24, 26, 48, 23, 20, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	{5590, 27, 100, 26, 24, 26, 48, 23, 20, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	{5580, 27, 100, 26, 24, 26, 48, 23, 20, 38, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	{5570, 27, 100, 26, 24, 26, 48, 23, 20, 38, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	{5560, 27, 100, 26, 24, 26, 47, 23, 20, 38, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	{5550, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	{5540, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	{5530, 27,  99, 26, 24, 26, 47, 23, 20, 38, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	{5520, 27,  99, 26, 24, 26, 47, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	{5510, 27,  98, 26, 24, 26, 47, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	{5500, 27,  98, 26, 24, 26, 47, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	{5490, 27,  98, 26, 24, 26, 46, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	{5480, 27,  98, 26, 24, 26, 46, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	{5470, 27,  97, 26, 23, 26, 46, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	{5460, 27,  97, 26, 23, 26, 46, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	{5450, 27,  97, 26, 23, 25, 47, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	{5440, 26,  98, 26, 23, 25, 47, 23, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	{5430, 26,  98, 26, 23, 25, 47, 22, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	{5420, 26,  97, 26, 23, 25, 46, 22, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	{5410, 26,  97, 26, 23, 25, 46, 22, 20, 37, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	{5400, 26,  97, 25, 23, 25, 46, 22, 20, 37, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	{5390, 26,  97, 25, 23, 25, 46, 22, 20, 37, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	{5380, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	{5370, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	{5360, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	{5350, 26,  96, 25, 23, 25, 46, 22, 20, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	{5340, 26,  95, 25, 23, 25, 45, 22, 20, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	{5330, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	{5320, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	{5310, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	{5300, 26,  95, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	{5290, 26,  94, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	{5280, 26,  94, 25, 23, 25, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	{5270, 26,  94, 25, 23, 25, 44, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 	{5260, 26,  94, 25, 23, 25, 44, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	{5250, 25,  94, 25, 23, 24, 45, 22, 19, 36, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	{5240, 25,  94, 25, 23, 24, 45, 22, 19, 36, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	{5230, 25,  94, 25, 22, 24, 45, 22, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	{5220, 25,  94, 25, 22, 24, 45, 22, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	{5210, 25,  93, 25, 22, 24, 45, 22, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	{5200, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	{5190, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	{5180, 25,  93, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	{5170, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	{5160, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 	{5150, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	{5140, 25,  92, 24, 22, 24, 44, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 	{5130, 25,  92, 24, 22, 24, 43, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	{5120, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	{5110, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	{5100, 25,  91, 24, 22, 24, 43, 21, 19, 35, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	{5090, 25,  91, 24, 22, 24, 43, 21, 19, 34, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	{5080, 25,  90, 24, 22, 24, 43, 21, 19, 34, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	{5070, 25,  90, 24, 22, 24, 43, 21, 19, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	{5060, 25,  90, 24, 22, 24, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 	{5050, 24,  91, 24, 22, 24, 42, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	{5040, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	{5030, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	{5020, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	{5010, 24,  90, 24, 22, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	{5000, 24,  89, 23, 21, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	{4990, 24,  89, 23, 21, 23, 43, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 	{4980, 24,  89, 23, 21, 23, 42, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	{4970, 24,  89, 23, 21, 23, 42, 21, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	{4960, 24,  89, 23, 21, 23, 42, 20, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	{4950, 24,  88, 23, 21, 23, 42, 20, 18, 34, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	{4940, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	{4930, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	{4920, 24,  88, 23, 21, 23, 42, 20, 18, 33, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	{4910, 24,  87, 23, 21, 23, 41, 20, 18, 33, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	{4900, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	{4890, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	{4880, 24,  87, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	{4870, 24,  86, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	{4860, 24,  86, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	{4850, 23,  87, 23, 21, 23, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	{4840, 23,  87, 23, 21, 23, 40, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	{4830, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	{4820, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	{4810, 23,  86, 23, 21, 22, 41, 20, 18, 33, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	{4800, 23,  86, 22, 21, 22, 41, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	{4790, 23,  86, 22, 21, 22, 41, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	{4780, 23,  85, 22, 21, 22, 41, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	{4770, 23,  85, 22, 21, 22, 41, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	{4760, 23,  85, 22, 20, 22, 40, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	{4750, 23,  85, 22, 20, 22, 40, 20, 17, 32, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	{4740, 23,  84, 22, 20, 22, 40, 20, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	{4730, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	{4720, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	{4710, 23,  84, 22, 20, 22, 40, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	{4700, 23,  83, 22, 20, 22, 40, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	{4690, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	{4680, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	{4670, 23,  83, 22, 20, 22, 39, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	{4660, 23,  82, 22, 20, 22, 39, 19, 17, 32, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	{4650, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	{4640, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	{4630, 22,  83, 22, 20, 22, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	{4620, 22,  83, 22, 20, 21, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	{4610, 22,  82, 22, 20, 21, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	{4600, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	{4590, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	{4580, 22,  82, 21, 20, 21, 39, 19, 17, 31, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	{4570, 22,  81, 21, 20, 21, 39, 19, 17, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	{4560, 22,  81, 21, 20, 21, 39, 19, 17, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	{4550, 22,  81, 21, 20, 21, 38, 19, 17, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	{4540, 22,  81, 21, 20, 21, 38, 19, 17, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	{4530, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	{4520, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	{4510, 22,  80, 21, 19, 21, 38, 19, 16, 31, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	{4500, 22,  80, 21, 19, 21, 38, 19, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	{4490, 22,  80, 21, 19, 21, 38, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 	{4480, 22,  79, 21, 19, 21, 38, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	{4470, 22,  79, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	{4460, 22,  79, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	{4450, 21,  80, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	{4440, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	{4430, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	{4420, 21,  79, 21, 19, 21, 37, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	{4410, 21,  79, 21, 19, 20, 38, 18, 16, 30, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	{4400, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	{4390, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	{4380, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	{4370, 21,  78, 20, 19, 20, 37, 18, 16, 30, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	{4360, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	{4350, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	{4340, 21,  77, 20, 19, 20, 37, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	{4330, 21,  77, 20, 19, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	{4320, 21,  77, 20, 19, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 	{4310, 21,  76, 20, 19, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	{4300, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	{4290, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	{4280, 21,  76, 20, 18, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 	{4270, 21,  75, 20, 18, 20, 36, 18, 16, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	{4260, 21,  75, 20, 18, 20, 35, 17, 15, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 	{4250, 20,  76, 20, 18, 20, 35, 17, 15, 29, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	{4240, 20,  76, 20, 18, 20, 35, 17, 15, 29, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	{4230, 20,  75, 20, 18, 20, 35, 17, 15, 29, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	{4220, 20,  75, 20, 18, 20, 35, 17, 15, 29, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	{4210, 20,  75, 20, 18, 20, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	{4200, 20,  75, 19, 18, 19, 36, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	{4190, 20,  74, 19, 18, 19, 36, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	{4180, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	{4170, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	{4160, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	{4150, 20,  74, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	{4140, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	{4130, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	{4120, 20,  73, 19, 18, 19, 35, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	{4110, 20,  73, 19, 18, 19, 34, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	{4100, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	{4090, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	{4080, 20,  72, 19, 18, 19, 34, 17, 15, 28, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	{4070, 20,  72, 19, 18, 19, 34, 17, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	{4060, 19,  72, 19, 17, 19, 34, 17, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	{4050, 19,  72, 19, 17, 19, 34, 17, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	{4040, 19,  72, 19, 17, 19, 33, 17, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	{4030, 19,  72, 19, 17, 19, 33, 17, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	{4020, 19,  71, 19, 17, 19, 33, 16, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	{4010, 19,  71, 19, 17, 19, 33, 16, 15, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	{4000, 19,  71, 18, 17, 19, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	{3990, 19,  71, 18, 17, 18, 34, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	{3980, 19,  71, 18, 17, 18, 34, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	{3970, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	{3960, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	{3950, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	{3940, 19,  70, 18, 17, 18, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	{3930, 19,  69, 18, 17, 18, 33, 16, 14, 27, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	{3920, 19,  69, 18, 17, 18, 33, 16, 14, 26, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	{3910, 19,  69, 18, 17, 18, 33, 16, 14, 26, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	{3900, 19,  69, 18, 17, 18, 33, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	{3890, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	{3880, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	{3870, 19,  68, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	{3860, 18,  69, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	{3850, 18,  68, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	{3840, 18,  68, 18, 17, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	{3830, 18,  68, 18, 16, 18, 32, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	{3820, 18,  68, 18, 16, 18, 31, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	{3810, 18,  68, 18, 16, 18, 31, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	{3800, 18,  67, 17, 16, 18, 31, 16, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	{3790, 18,  67, 17, 16, 17, 32, 15, 14, 26, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	{3780, 18,  67, 17, 16, 17, 32, 15, 14, 25, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	{3770, 18,  67, 17, 16, 17, 32, 15, 14, 25, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	{3760, 18,  66, 17, 16, 17, 32, 15, 14, 25, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 	{3750, 18,  66, 17, 16, 17, 31, 15, 14, 25, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 	{3740, 18,  66, 17, 16, 17, 31, 15, 14, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	{3730, 18,  66, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	{3720, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	{3710, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	{3700, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	{3690, 18,  65, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	{3680, 18,  64, 17, 16, 17, 31, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	{3670, 18,  64, 17, 16, 17, 30, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	{3660, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 	{3650, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	{3640, 17,  65, 17, 16, 17, 30, 15, 13, 25, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 	{3630, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	{3620, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 	{3610, 17,  64, 17, 16, 17, 30, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	{3600, 17,  64, 16, 16, 17, 29, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	{3590, 17,  63, 16, 15, 17, 29, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	{3580, 17,  63, 16, 15, 16, 30, 15, 13, 24, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	{3570, 17,  63, 16, 15, 16, 30, 15, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	{3560, 17,  63, 16, 15, 16, 30, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 	{3550, 17,  62, 16, 15, 16, 30, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	{3540, 17,  62, 16, 15, 16, 30, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	{3530, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	{3520, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 	{3510, 17,  62, 16, 15, 16, 29, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	{3500, 17,  61, 16, 15, 16, 29, 14, 13, 24, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 	{3490, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	{3480, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 	{3470, 17,  61, 16, 15, 16, 29, 14, 13, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	{3460, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	{3450, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	{3440, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	{3430, 16,  61, 16, 15, 16, 28, 14, 12, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	{3420, 16,  60, 16, 15, 16, 28, 14, 12, 23, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	{3410, 16,  60, 16, 15, 16, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	{3400, 16,  60, 15, 15, 16, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	{3390, 16,  60, 15, 15, 16, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	{3380, 16,  59, 15, 15, 16, 27, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	{3370, 16,  59, 15, 15, 15, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	{3360, 16,  59, 15, 14, 15, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	{3350, 16,  59, 15, 14, 15, 28, 14, 12, 23, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	{3340, 16,  59, 15, 14, 15, 28, 14, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	{3330, 16,  58, 15, 14, 15, 28, 14, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	{3320, 16,  58, 15, 14, 15, 28, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	{3310, 16,  58, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 	{3300, 16,  58, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	{3290, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	{3280, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	{3270, 16,  57, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	{3260, 15,  58, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	{3250, 15,  57, 15, 14, 15, 27, 13, 12, 22, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	{3240, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	{3230, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	{3220, 15,  57, 15, 14, 15, 26, 13, 12, 22, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	{3210, 15,  56, 15, 14, 15, 26, 13, 12, 22, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	{3200, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	{3190, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	{3180, 15,  56, 14, 14, 15, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	{3170, 15,  56, 14, 14, 15, 25, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	{3160, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	{3150, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	{3140, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	{3130, 15,  55, 14, 14, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	{3120, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	{3110, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	{3100, 15,  54, 14, 13, 14, 26, 13, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	{3090, 15,  54, 14, 13, 14, 25, 12, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	{3080, 15,  53, 14, 13, 14, 25, 12, 11, 21, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	{3070, 14,  54, 14, 13, 14, 25, 12, 11, 21, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 	{3060, 14,  54, 14, 13, 14, 25, 12, 11, 21, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	{3050, 14,  54, 14, 13, 14, 25, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	{3040, 14,  53, 14, 13, 14, 25, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	{3030, 14,  53, 14, 13, 14, 25, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	{3020, 14,  53, 14, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	{3010, 14,  53, 14, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	{3000, 14,  53, 13, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	{2990, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	{2980, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	{2970, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	{2960, 14,  52, 13, 13, 14, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	{2950, 14,  51, 13, 13, 13, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	{2940, 14,  51, 13, 13, 13, 24, 12, 11, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	{2930, 14,  51, 13, 13, 13, 24, 12, 10, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	{2920, 14,  51, 13, 13, 13, 24, 12, 10, 20, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	{2910, 14,  50, 13, 13, 13, 24, 12, 10, 20, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	{2900, 14,  50, 13, 13, 13, 24, 12, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	{2890, 14,  50, 13, 12, 13, 24, 12, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	{2880, 14,  50, 13, 12, 13, 23, 12, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 	{2870, 13,  50, 13, 12, 13, 23, 12, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	{2860, 13,  50, 13, 12, 13, 23, 12, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	{2850, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	{2840, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	{2830, 13,  50, 13, 12, 13, 23, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	{2820, 13,  49, 13, 12, 13, 23, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	{2810, 13,  49, 13, 12, 13, 23, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	{2800, 13,  49, 12, 12, 13, 22, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	{2790, 13,  49, 12, 12, 13, 22, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	{2780, 13,  48, 12, 12, 13, 22, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	{2770, 13,  48, 12, 12, 13, 22, 11, 10, 19, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	{2760, 13,  48, 12, 12, 13, 22, 11, 10, 18, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	{2750, 13,  48, 12, 12, 13, 22, 11, 10, 18, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	{2740, 13,  47, 12, 12, 12, 23, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	{2730, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	{2720, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	{2710, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	{2700, 13,  47, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	{2690, 13,  46, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	{2680, 13,  46, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	{2670, 12,  47, 12, 12, 12, 22, 11, 10, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	{2660, 12,  47, 12, 12, 12, 21, 11,  9, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	{2650, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	{2640, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	{2630, 12,  46, 12, 11, 12, 21, 11,  9, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	{2620, 12,  46, 12, 11, 12, 21, 10,  9, 18, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	{2610, 12,  45, 12, 11, 12, 21, 10,  9, 17, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	{2600, 12,  45, 11, 11, 12, 21, 10,  9, 17, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	{2590, 12,  45, 11, 11, 12, 20, 10,  9, 17, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	{2580, 12,  45, 11, 11, 12, 20, 10,  9, 17, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	{2570, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	{2560, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	{2550, 12,  44, 11, 11, 12, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	{2540, 12,  44, 11, 11, 11, 21, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	{2530, 12,  44, 11, 11, 11, 21, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	{2520, 12,  43, 11, 11, 11, 21, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	{2510, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	{2500, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	{2490, 12,  43, 11, 11, 11, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	{2480, 12,  42, 11, 11, 11, 20, 10,  9, 17, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	{2470, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	{2460, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	{2450, 11,  43, 11, 11, 11, 20, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	{2440, 11,  42, 11, 11, 11, 19, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	{2430, 11,  42, 11, 11, 11, 19, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	{2420, 11,  42, 11, 10, 11, 19, 10,  9, 16, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	{2410, 11,  42, 11, 10, 11, 19, 10,  9, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	{2400, 11,  41, 10, 10, 11, 19, 10,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	{2390, 11,  41, 10, 10, 11, 19, 10,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	{2380, 11,  41, 10, 10, 11, 19,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	{2370, 11,  41, 10, 10, 11, 18,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	{2360, 11,  41, 10, 10, 11, 18,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	{2350, 11,  40, 10, 10, 11, 18,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 	{2340, 11,  40, 10, 10, 11, 18,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	{2330, 11,  40, 10, 10, 10, 19,  9,  8, 16, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	{2320, 11,  40, 10, 10, 10, 19,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	{2310, 11,  39, 10, 10, 10, 19,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	{2300, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 	{2290, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	{2280, 11,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 	{2270, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	{2260, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	{2250, 10,  39, 10, 10, 10, 18,  9,  8, 15, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	{2240, 10,  39, 10, 10, 10, 18,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	{2230, 10,  38, 10, 10, 10, 18,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 	{2220, 10,  38, 10, 10, 10, 17,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 	{2210, 10,  38, 10, 10, 10, 17,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	{2200, 10,  38,  9, 10, 10, 17,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 	{2190, 10,  38,  9,  9, 10, 17,  9,  8, 15, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 	{2180, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	{2170, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 	{2160, 10,  37,  9,  9, 10, 17,  9,  8, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	{2150, 10,  37,  9,  9, 10, 16,  8,  8, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	{2140, 10,  36,  9,  9, 10, 16,  8,  8, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 	{2130, 10,  36,  9,  9, 10, 16,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	{2120, 10,  36,  9,  9,  9, 17,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	{2110, 10,  36,  9,  9,  9, 17,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	{2100, 10,  35,  9,  9,  9, 17,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	{2090, 10,  35,  9,  9,  9, 17,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	{2080,  9,  36,  9,  9,  9, 16,  8,  7, 14, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	{2070,  9,  36,  9,  9,  9, 16,  8,  7, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	{2060,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	{2050,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	{2040,  9,  35,  9,  9,  9, 16,  8,  7, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	{2030,  9,  35,  9,  9,  9, 16,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 	{2020,  9,  35,  9,  9,  9, 16,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	{2010,  9,  34,  9,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	{2000,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	{1990,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	{1980,  9,  34,  8,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	{1970,  9,  33,  8,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	{1960,  9,  33,  8,  9,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	{1950,  9,  33,  8,  8,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	{1940,  9,  33,  8,  8,  9, 15,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	{1930,  9,  32,  8,  8,  9, 14,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	{1920,  9,  32,  8,  8,  9, 14,  8,  7, 13, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	{1910,  9,  32,  8,  8,  8, 15,  7,  7, 13,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	{1900,  9,  32,  8,  8,  8, 15,  7,  7, 13,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 	{1890,  9,  31,  8,  8,  8, 15,  7,  7, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	{1880,  8,  32,  8,  8,  8, 15,  7,  7, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	{1870,  8,  32,  8,  8,  8, 15,  7,  7, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	{1860,  8,  32,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	{1850,  8,  32,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	{1840,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	{1830,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	{1820,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	{1810,  8,  31,  8,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	{1800,  8,  30,  7,  8,  8, 14,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 	{1790,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	{1780,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 	{1770,  8,  30,  7,  8,  8, 13,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	{1760,  8,  29,  7,  8,  8, 13,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	{1750,  8,  29,  7,  8,  8, 13,  7,  6, 12,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 	{1740,  8,  29,  7,  8,  8, 13,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 	{1730,  8,  29,  7,  8,  8, 13,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 	{1720,  8,  29,  7,  7,  8, 13,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 	{1710,  8,  28,  7,  7,  8, 12,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	{1700,  8,  28,  7,  7,  7, 13,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	{1690,  8,  28,  7,  7,  7, 13,  7,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	{1680,  7,  29,  7,  7,  7, 13,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	{1670,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	{1660,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	{1650,  7,  28,  7,  7,  7, 13,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	{1640,  7,  28,  7,  7,  7, 12,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	{1630,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	{1620,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	{1610,  7,  27,  7,  7,  7, 12,  6,  6, 11,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	{1600,  7,  27,  6,  7,  7, 12,  6,  5, 10,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	{1590,  7,  26,  6,  7,  7, 12,  6,  5, 10,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	{1580,  7,  26,  6,  7,  7, 12,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 	{1570,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	{1560,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	{1550,  7,  26,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 	{1540,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	{1530,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 	{1520,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 	{1510,  7,  25,  6,  7,  7, 11,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	{1500,  7,  24,  6,  7,  7, 10,  6,  5, 10,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	{1490, 59,  25,  6, 77, 59, 10, 70, 44,  9, 73},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	{1480, 59,  24,  6, 76, 58, 10, 70, 44,  9, 73},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	{1470, 58,  24,  6, 76, 58, 10, 69, 44,  9, 72},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	{1460, 58,  24,  6, 76, 58, 10, 69, 43,  9, 72},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	{1450, 58,  24,  6, 75, 57, 10, 68, 43,  9, 71},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	{1440, 57,  24,  6, 75, 57, 10, 68, 43,  9, 71},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	{1430, 57,  23,  6, 75, 57, 10, 68, 43,  8, 70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	{1420, 56,  23,  6, 74, 57,  9, 67, 43,  8, 70},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	{1410, 56,  23,  6, 74, 57,  9, 67, 43,  8, 69},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	{1400, 56,  23,  5, 74, 55,  9, 67, 41,  8, 69},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	{1390, 55,  23,  5, 73, 55,  9, 66, 41,  8, 68},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	{1380, 55,  23,  5, 73, 54,  9, 66, 41,  8, 68},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 	{1370, 54,  22,  5, 72, 54,  9, 66, 41,  8, 67},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	{1360, 54,  22,  5, 72, 54,  9, 65, 40,  8, 67},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	{1350, 54,  22,  5, 72, 53,  9, 65, 40,  8, 66},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	{1340, 53,  22,  5, 71, 53,  9, 65, 40,  8, 66},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	{1330, 53,  22,  5, 71, 53,  9, 64, 39,  8, 65},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	{1320, 52,  22,  5, 71, 53,  8, 64, 40,  8, 65},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	{1310, 52,  21,  5, 70, 53,  8, 64, 40,  8, 64},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	{1300, 51,  21,  5, 70, 51,  8, 63, 38,  8, 64},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	{1290, 51,  21,  5, 70, 51,  8, 63, 38,  7, 64},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	{1280, 51,  21,  5, 69, 51,  8, 63, 38,  7, 63},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	{1270, 50,  21,  5, 69, 50,  8, 62, 38,  7, 63},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	{1260, 50,  20,  5, 69, 50,  8, 62, 37,  7, 62},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	{1250, 49,  20,  5, 68, 49,  8, 62, 37,  7, 62},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	{1240, 49,  20,  5, 68, 49,  8, 61, 37,  7, 61},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	{1230, 49,  20,  5, 68, 49,  8, 61, 36,  7, 61},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	{1220, 48,  20,  5, 67, 48,  8, 61, 36,  7, 60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	{1210, 48,  19,  5, 67, 48,  7, 60, 36,  7, 60},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 	{1200, 49,  19,  4, 67, 49,  7, 60, 36,  7, 59},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 	{1190, 48,  19,  4, 66, 48,  7, 60, 36,  7, 59},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	{1180, 48,  19,  4, 66, 48,  7, 59, 36,  7, 58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	{1170, 46,  19,  4, 66, 46,  7, 59, 35,  7, 58},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	{1160, 46,  18,  4, 65, 46,  7, 59, 34,  7, 57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	{1150, 45,  18,  4, 65, 46,  7, 58, 34,  7, 57},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	{1140, 45,  18,  4, 65, 45,  7, 58, 34,  6, 56},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	{1130, 45,  18,  4, 64, 45,  7, 58, 33,  6, 56},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	{1120, 44,  18,  4, 64, 44,  7, 57, 33,  6, 55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	{1110, 44,  18,  4, 64, 44,  7, 57, 33,  6, 55},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	{1100, 43,  17,  4, 63, 44,  6, 57, 32,  6, 54},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 	{1090, 43,  17,  4, 63, 44,  6, 56, 33,  6, 54},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 	{1080, 43,  17,  4, 63, 44,  6, 56, 33,  6, 53},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	{1070, 42,  17,  4, 62, 44,  6, 56, 33,  6, 53},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	{1060, 42,  17,  4, 62, 42,  6, 55, 31,  6, 52},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 	{1050, 41,  17,  4, 62, 42,  6, 55, 31,  6, 52},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	{1040, 41,  16,  4, 61, 41,  6, 54, 31,  6, 52},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 	{1030, 41,  16,  4, 61, 41,  6, 54, 30,  6, 51},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 	{1020, 40,  16,  4, 61, 41,  6, 54, 30,  6, 51},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 	{1010, 40,  16,  4, 60, 40,  6, 53, 30,  6, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	{1000, 39,  16,  3, 60, 40,  6, 53, 29,  5, 50},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 	{ 990, 39,  15,  3, 60, 39,  6, 53, 29,  5, 49},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 	{ 980, 39,  15,  3, 59, 39,  5, 52, 29,  5, 49},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	{ 970, 38,  15,  3, 59, 39,  5, 52, 29,  5, 48},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 	{ 960, 38,  15,  3, 59, 39,  5, 52, 29,  5, 48},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	{ 950, 37,  15,  3, 58, 39,  5, 51, 29,  5, 47},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 	{ 940, 37,  14,  3, 58, 39,  5, 51, 29,  5, 47},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	{ 930, 37,  14,  3, 57, 37,  5, 51, 27,  5, 46},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	{ 920, 36,  14,  3, 57, 37,  5, 50, 27,  5, 46},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	{ 910, 36,  14,  3, 57, 36,  5, 50, 27,  5, 45},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	{ 900, 35,  14,  3, 56, 36,  5, 50, 26,  5, 45},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 	{ 890, 35,  14,  3, 56, 36,  5, 49, 26,  5, 44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	{ 880, 35,  13,  3, 56, 35,  5, 49, 26,  5, 44},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 	{ 870, 34,  13,  3, 55, 35,  4, 49, 26,  5, 43},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 	{ 860, 34,  13,  3, 55, 35,  4, 48, 25,  5, 43},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	{ 850, 33,  13,  3, 55, 35,  4, 48, 26,  4, 42},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 	{ 840, 33,  13,  3, 54, 35,  4, 48, 26,  4, 42},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	{ 830, 33,  12,  3, 54, 33,  4, 47, 24,  4, 41},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	{ 820, 32,  12,  3, 54, 33,  4, 47, 24,  4, 41},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	{ 810, 32,  12,  3, 53, 33,  4, 47, 24,  4, 40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	{ 800, 31,  12,  2, 53, 32,  4, 46, 23,  4, 40},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	{ 790, 31,  12,  2, 53, 32,  4, 46, 23,  4, 39},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	{ 780, 30,  12,  2, 52, 31,  4, 46, 23,  4, 39},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	{ 770, 30,  11,  2, 52, 31,  4, 45, 23,  4, 39},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	{ 760, 30,  11,  2, 52, 31,  3, 45, 22,  4, 38},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 	{ 750, 29,  11,  2, 51, 30,  3, 45, 22,  4, 38},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 	{ 740, 29,  11,  2, 51, 30,  3, 44, 22,  4, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	{ 730, 28,  11,  2, 51, 31,  3, 44, 22,  4, 37},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	{ 720, 28,  10,  2, 50, 30,  3, 44, 22,  4, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	{ 710, 28,  10,  2, 50, 30,  3, 43, 22,  4, 36},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	{ 700, 27,  10,  2, 50, 28,  3, 43, 20,  3, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	{ 690, 27,  10,  2, 49, 28,  3, 43, 20,  3, 35},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	{ 680, 26,  10,  2, 49, 28,  3, 42, 20,  3, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	{ 670, 26,  10,  2, 49, 27,  3, 42, 20,  3, 34},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	{ 660, 26,   9,  2, 48, 27,  3, 42, 19,  3, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	{ 650, 25,   9,  2, 48, 26,  3, 41, 19,  3, 33},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	{ 640, 25,   9,  2, 48, 26,  2, 41, 19,  3, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	{ 630, 24,   9,  2, 47, 26,  2, 40, 18,  3, 32},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	{ 620, 24,   9,  2, 47, 26,  2, 40, 19,  3, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 	{ 610, 24,   8,  2, 47, 26,  2, 40, 19,  3, 31},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 	{ 600, 23,   8,  1, 46, 26,  2, 39, 18,  3, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	{ 590, 23,   8,  1, 46, 24,  2, 39, 17,  3, 30},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	{ 580, 22,   8,  1, 46, 24,  2, 39, 17,  3, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	{ 570, 22,   8,  1, 45, 23,  2, 38, 17,  3, 29},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 	{ 560, 22,   7,  1, 45, 23,  2, 38, 16,  2, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	{ 550, 21,   7,  1, 45, 23,  2, 38, 16,  2, 28},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	{ 540, 21,   7,  1, 44, 22,  2, 37, 16,  2, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	{ 530, 20,   7,  1, 44, 22,  1, 37, 15,  2, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	{ 520, 20,   7,  1, 43, 21,  1, 37, 15,  2, 27},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	{ 510, 20,   6,  1, 43, 21,  1, 36, 15,  2, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	{ 500, 19,   6,  1, 43, 22,  1, 36, 15,  2, 26},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	{ 490, 19,   6,  1, 42, 21,  1, 36, 15,  2, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	{ 480, 18,   6,  1, 42, 21,  1, 35, 15,  2, 25},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	{ 470, 18,   6,  1, 42, 21,  1, 35, 15,  2, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	{ 460, 18,   6,  1, 41, 19,  1, 35, 13,  2, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	{ 450, 17,   5,  1, 41, 19,  1, 34, 13,  2, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	{ 440, 17,   5,  1, 41, 18,  1, 34, 13,  2, 23},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	{ 430, 16,   5,  1, 40, 18,  0, 34, 12,  2, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	{ 420, 16,   5,  1, 40, 18,  0, 33, 12,  2, 22},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 	{ 410, 16,   5,  1, 40, 17,  0, 33, 12,  1, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	{ 400, 15,   5,  0, 39, 17,  0, 33, 11,  1, 21},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 	{ 390, 15,   4,  0, 39, 17,  0, 32, 12,  1, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	{ 380, 14,   4,  0, 39, 17,  0, 32, 12,  1, 20},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	{ 370, 14,   4,  0, 38, 17,  0, 32, 12,  1, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	{ 360, 14,   4,  0, 38, 15,  0, 31, 10,  1, 19},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 	{ 350, 13,   4,  0, 38, 15,  0, 31, 10,  1, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	{ 340, 13,   3,  0, 37, 15,  0, 31, 10,  1, 18},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	{ 330, 12,   3,  0, 37, 14,  0, 30,  9,  1, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	{ 320, 12,   3,  0, 37, 14,  0, 30,  9,  1, 17},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	{ 310, 12,   3,  0, 36, 13,  0, 30,  9,  1, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	{ 300, 11,   3,  0, 36, 13,  0, 29,  8,  1, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	{ 290, 11,   2,  0, 36, 13,  0, 29,  8,  1, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	{ 280, 10,   2,  0, 35, 12,  0, 29,  8,  1, 15},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	{ 270, 10,   2,  0, 35, 12,  0, 28,  8,  0, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	{ 260,  9,   2,  0, 35, 12,  0, 28,  8,  0, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 	{ 250,  9,   2,  0, 34, 12,  0, 28,  8,  0, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	{ 240,  9,   2,  0, 34, 12,  0, 27,  8,  0, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	{ 230,  8,   1,  0, 34, 10,  0, 27,  6,  0, 13},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	{ 220,  8,   1,  0, 33, 10,  0, 27,  6,  0, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 	{ 210,  7,   1,  0, 33, 10,  0, 26,  6,  0, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	{ 200,  7,   1,  0, 33,  9,  0, 26,  5,  0, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	{ 190,  7,   1,  0, 32,  9,  0, 25,  5,  0, 11},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	{ 180,  6,   1,  0, 32,  8,  0, 25,  5,  0, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	{ 170,  6,   0,  0, 32,  8,  0, 25,  5,  0, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	{ 160,  5,   0,  0, 31,  8,  0, 24,  4,  0,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	{ 150,  5,   0,  0, 31,  8,  0, 24,  5,  0,  9},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	{ 140,  5,   0,  0, 31,  8,  0, 24,  5,  0,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 	{ 130,  4,   0,  0, 30,  6,  0, 23,  3,  0,  8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	{ 120,  4,   0,  0, 30,  6,  0, 23,  3,  0,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	{ 110,  3,   0,  0, 30,  6,  0, 23,  3,  0,  7},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	{ 100,  3,   0,  0, 29,  5,  0, 22,  2,  0,  6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	{  90,  3,   0,  0, 29,  5,  0, 22,  2,  0,  6},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	{  80,  2,   0,  0, 28,  5,  0, 22,  2,  0,  5},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) static const
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) struct samsung_mipi_cphy_timing samsung_mipi_cphy_timing_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	{ 3500, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	{ 3490, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	{ 3480, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	{ 3470, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	{ 3460, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	{ 3450, 39, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	{ 3440, 38, 50, 25, 29, 54, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 	{ 3430, 38, 50, 25, 29, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 	{ 3420, 38, 50, 25, 29, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 	{ 3410, 38, 50, 25, 29, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	{ 3400, 38, 50, 25, 29, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	{ 3390, 38, 50, 25, 29, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	{ 3380, 38, 50, 25, 28, 53, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	{ 3370, 38, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 	{ 3360, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	{ 3350, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 	{ 3340, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 	{ 3330, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 	{ 3320, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 	{ 3310, 37, 50, 25, 28, 52, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 	{ 3300, 37, 50, 25, 28, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 	{ 3290, 37, 50, 25, 28, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 	{ 3280, 37, 50, 25, 28, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 	{ 3270, 36, 50, 25, 28, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 	{ 3260, 36, 50, 25, 27, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	{ 3250, 36, 50, 25, 27, 51, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	{ 3240, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	{ 3230, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	{ 3220, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	{ 3210, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 	{ 3200, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 	{ 3190, 36, 50, 25, 27, 50, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 	{ 3180, 35, 50, 25, 27, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	{ 3170, 35, 50, 25, 27, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	{ 3160, 35, 50, 25, 27, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 	{ 3150, 35, 50, 25, 26, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	{ 3140, 35, 50, 25, 26, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	{ 3130, 35, 50, 25, 26, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	{ 3120, 35, 50, 25, 26, 49, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	{ 3110, 35, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	{ 3100, 34, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	{ 3090, 34, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	{ 3080, 34, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	{ 3070, 34, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	{ 3060, 34, 50, 25, 26, 48, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	{ 3050, 34, 50, 25, 26, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	{ 3040, 34, 50, 25, 26, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	{ 3030, 34, 50, 25, 25, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	{ 3020, 34, 50, 25, 25, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 	{ 3010, 33, 50, 25, 25, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	{ 3000, 33, 50, 25, 25, 47, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 	{ 2990, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	{ 2980, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	{ 2970, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	{ 2960, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	{ 2950, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	{ 2940, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	{ 2930, 33, 50, 25, 25, 46, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	{ 2920, 32, 50, 25, 25, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	{ 2910, 32, 50, 25, 24, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	{ 2900, 32, 50, 25, 24, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	{ 2890, 32, 50, 25, 24, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	{ 2880, 32, 50, 25, 24, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	{ 2870, 32, 50, 25, 24, 45, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	{ 2860, 32, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	{ 2850, 32, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	{ 2840, 31, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	{ 2830, 31, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	{ 2820, 31, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	{ 2810, 31, 50, 25, 24, 44, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	{ 2800, 31, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	{ 2790, 31, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	{ 2780, 31, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	{ 2770, 31, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	{ 2760, 31, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	{ 2750, 30, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	{ 2740, 30, 50, 25, 23, 43, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	{ 2730, 30, 50, 25, 23, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	{ 2720, 30, 50, 25, 23, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	{ 2710, 30, 50, 25, 23, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	{ 2700, 30, 50, 25, 23, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	{ 2690, 30, 50, 25, 23, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	{ 2680, 30, 50, 25, 22, 42, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	{ 2670, 30, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	{ 2660, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 	{ 2650, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 	{ 2640, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	{ 2630, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	{ 2620, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	{ 2610, 29, 50, 25, 22, 41, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	{ 2600, 29, 50, 25, 22, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	{ 2590, 29, 50, 25, 22, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	{ 2580, 28, 50, 25, 22, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	{ 2570, 28, 50, 25, 22, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	{ 2560, 28, 50, 25, 21, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	{ 2550, 28, 50, 25, 21, 40, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	{ 2540, 28, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	{ 2530, 28, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	{ 2520, 28, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	{ 2510, 28, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	{ 2500, 28, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	{ 2490, 27, 50, 25, 21, 39, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	{ 2480, 27, 50, 25, 21, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	{ 2470, 27, 50, 25, 21, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	{ 2460, 27, 50, 25, 21, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 	{ 2450, 27, 50, 25, 20, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	{ 2440, 27, 50, 25, 20, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 	{ 2430, 27, 50, 25, 20, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	{ 2420, 27, 50, 25, 20, 38, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	{ 2410, 27, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	{ 2400, 26, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 	{ 2390, 26, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	{ 2380, 26, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	{ 2370, 26, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	{ 2360, 26, 50, 25, 20, 37, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	{ 2350, 26, 50, 25, 20, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	{ 2340, 26, 50, 25, 20, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	{ 2330, 26, 50, 25, 19, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	{ 2320, 25, 50, 25, 19, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	{ 2310, 25, 50, 25, 19, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	{ 2300, 25, 50, 25, 19, 36, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	{ 2290, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	{ 2280, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	{ 2270, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	{ 2260, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	{ 2250, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	{ 2240, 25, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	{ 2230, 24, 50, 25, 19, 35, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	{ 2220, 24, 50, 25, 19, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	{ 2210, 24, 50, 25, 18, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	{ 2200, 24, 50, 25, 18, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	{ 2190, 24, 50, 25, 18, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	{ 2180, 24, 50, 25, 18, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	{ 2170, 24, 50, 25, 18, 34, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	{ 2160, 24, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	{ 2150, 24, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	{ 2140, 23, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	{ 2130, 23, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	{ 2120, 23, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	{ 2110, 23, 50, 25, 18, 33, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	{ 2100, 23, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	{ 2090, 23, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	{ 2080, 23, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	{ 2070, 23, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	{ 2060, 22, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	{ 2050, 22, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	{ 2040, 22, 50, 25, 17, 32, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	{ 2030, 22, 50, 25, 17, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	{ 2020, 22, 50, 25, 17, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	{ 2010, 22, 50, 25, 17, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	{ 2000, 22, 50, 25, 17, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	{ 1990, 22, 50, 25, 17, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	{ 1980, 22, 50, 25, 16, 31, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	{ 1970, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	{ 1960, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	{ 1950, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	{ 1940, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	{ 1930, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	{ 1920, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	{ 1910, 21, 50, 25, 16, 30, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	{ 1900, 21, 50, 25, 16, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	{ 1890, 21, 50, 25, 16, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	{ 1880, 20, 50, 25, 16, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	{ 1870, 20, 50, 25, 16, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	{ 1860, 20, 50, 25, 15, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	{ 1850, 20, 50, 25, 15, 29, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	{ 1840, 20, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	{ 1830, 20, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	{ 1820, 20, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	{ 1810, 20, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	{ 1800, 19, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	{ 1790, 19, 50, 25, 15, 28, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	{ 1780, 19, 50, 25, 15, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	{ 1770, 19, 50, 25, 15, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	{ 1760, 19, 50, 25, 15, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	{ 1750, 19, 50, 25, 14, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 	{ 1740, 19, 50, 25, 14, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	{ 1730, 19, 50, 25, 14, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	{ 1720, 19, 50, 25, 14, 27, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	{ 1710, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	{ 1700, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	{ 1690, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	{ 1680, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	{ 1670, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	{ 1660, 18, 50, 25, 14, 26, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	{ 1650, 18, 50, 25, 14, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	{ 1640, 18, 50, 25, 14, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	{ 1630, 18, 50, 25, 13, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	{ 1620, 17, 50, 25, 13, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	{ 1610, 17, 50, 25, 13, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	{ 1600, 17, 50, 25, 13, 25, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	{ 1590, 17, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	{ 1580, 17, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	{ 1570, 17, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	{ 1560, 17, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	{ 1550, 17, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	{ 1540, 16, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	{ 1530, 16, 50, 25, 13, 24, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	{ 1520, 16, 50, 25, 13, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	{ 1510, 16, 50, 25, 12, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	{ 1500, 16, 50, 25, 12, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	{ 1490, 16, 50, 25, 12, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	{ 1480, 16, 50, 25, 12, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	{ 1470, 16, 50, 25, 12, 23, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	{ 1460, 16, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	{ 1450, 15, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	{ 1440, 15, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	{ 1430, 15, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 	{ 1420, 15, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	{ 1410, 15, 50, 25, 12, 22, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	{ 1400, 15, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	{ 1390, 15, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	{ 1380, 15, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	{ 1370, 15, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	{ 1360, 14, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	{ 1350, 14, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 	{ 1340, 14, 50, 25, 11, 21, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	{ 1330, 14, 50, 25, 11, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	{ 1320, 14, 50, 25, 11, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	{ 1310, 14, 50, 25, 11, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	{ 1300, 14, 50, 25, 11, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	{ 1290, 14, 50, 25, 11, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	{ 1280, 13, 50, 25, 10, 20, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	{ 1270, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	{ 1260, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	{ 1250, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	{ 1240, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	{ 1230, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	{ 1220, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	{ 1210, 13, 50, 25, 10, 19, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 	{ 1200, 13, 50, 25, 10, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 	{ 1190, 12, 50, 25, 10, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	{ 1180, 12, 50, 25, 10, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	{ 1170, 12, 50, 25, 10, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	{ 1160, 12, 50, 25,  9, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	{ 1150, 12, 50, 25,  9, 18, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	{ 1140, 12, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	{ 1130, 12, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	{ 1120, 12, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	{ 1110, 12, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	{ 1100, 11, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	{ 1090, 11, 50, 25,  9, 17, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	{ 1080, 11, 50, 25,  9, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	{ 1070, 11, 50, 25,  9, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 	{ 1060, 11, 50, 25,  9, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	{ 1050, 11, 50, 25,  8, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	{ 1040, 11, 50, 25,  8, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	{ 1030, 11, 50, 25,  8, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	{ 1020, 10, 50, 25,  8, 16, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	{ 1010, 10, 50, 25,  8, 15, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	{ 1000, 10, 50, 25,  8, 15, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	{  990, 10, 50, 25,  8, 15, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	{  980, 10, 50, 25,  8, 15, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	{  970, 10, 50, 25,  8, 15, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	{  960, 10, 50, 25,  8, 15, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	{  950, 10, 50, 25,  8, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	{  940, 10, 50, 25,  8, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	{  930,  9, 50, 25,  7, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 	{  920,  9, 50, 25,  7, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 	{  910,  9, 50, 25,  7, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	{  900,  9, 50, 25,  7, 14, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	{  890,  9, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	{  880,  9, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 	{  870,  9, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 	{  860,  9, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	{  850,  9, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	{  840,  8, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	{  830,  8, 50, 25,  7, 13, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	{  820,  8, 50, 25,  7, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	{  810,  8, 50, 25,  6, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	{  800,  8, 50, 25,  6, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	{  790,  8, 50, 25,  6, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 	{  780,  8, 50, 25,  6, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	{  770,  8, 50, 25,  6, 12, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	{  760,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	{  750,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	{  740,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	{  730,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 	{  720,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	{  710,  7, 50, 25,  6, 11, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	{  700,  7, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	{  690,  7, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	{  680,  7, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	{  670,  6, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	{  660,  6, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	{  650,  6, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	{  640,  6, 50, 25,  5, 10, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	{  630,  6, 50, 25,  5,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	{  620,  6, 50, 25,  5,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	{  610,  6, 50, 25,  5,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	{  600,  6, 50, 25,  5,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	{  590,  6, 50, 25,  5,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	{  580,  5, 50, 25,  4,  9, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	{  570,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	{  560,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	{  550,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 	{  540,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	{  530,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 	{  520,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 	{  510,  5, 50, 25,  4,  8, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	{  500,  4, 50, 25,  4,  7, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	{  490, 18, 50, 25, 14,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	{  480, 17, 50, 25, 14,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	{  470, 17, 50, 25, 14,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 	{  460, 17, 50, 25, 13,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 	{  450, 16, 50, 25, 13,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	{  440, 16, 50, 25, 13,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	{  430, 15, 50, 25, 12,  6, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	{  420, 15, 50, 25, 12,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 	{  410, 15, 50, 25, 12,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 	{  400, 14, 50, 25, 11,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	{  390, 14, 50, 25, 11,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 	{  380, 13, 50, 25, 11,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	{  370, 13, 50, 25, 11,  5, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	{  360, 13, 50, 25, 10,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	{  350, 12, 50, 25, 10,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	{  340, 12, 50, 25, 10,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	{  330, 11, 50, 25,  9,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	{  320, 11, 50, 25,  9,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	{  310, 11, 50, 25,  9,  4, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	{  300, 10, 50, 25,  8,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	{  290, 10, 50, 25,  8,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	{  280,  9, 50, 25,  8,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	{  270,  9, 50, 25,  8,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	{  260,  8, 50, 25,  7,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 	{  250,  8, 50, 25,  7,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	{  240,  8, 50, 25,  7,  3, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	{  230,  7, 50, 25,  6,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	{  220,  7, 50, 25,  6,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	{  210,  6, 50, 25,  6,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	{  200,  6, 50, 25,  5,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 	{  190,  6, 50, 25,  5,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	{  180,  5, 50, 25,  5,  2, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	{  170,  5, 50, 25,  5,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	{  160,  4, 50, 25,  4,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	{  150,  4, 50, 25,  4,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	{  140,  4, 50, 25,  4,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	{  130,  3, 50, 25,  3,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	{  120,  3, 50, 25,  3,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	{  110,  2, 50, 25,  3,  1, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	{  100,  2, 50, 25,  2,  0, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	{   90,  2, 50, 25,  2,  0, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	{   80,  1, 50, 25,  2,  0, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) struct hsfreq_range {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	u32 range_h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	u16 cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) /* These tables must be sorted by .range_h ascending. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) static const struct hsfreq_range samsung_dphy_rx_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	{ 80,  0x105}, { 100, 0x106}, { 120, 0x107}, { 140, 0x108},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	{ 160, 0x109}, { 180, 0x10a}, { 200, 0x10b}, { 220, 0x10c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	{ 240, 0x10d}, { 270, 0x10e}, { 290, 0x10f}, { 310, 0x110},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	{ 330, 0x111}, { 350, 0x112}, { 370, 0x113}, { 390, 0x114},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	{ 410, 0x115}, { 430, 0x116}, { 450, 0x117}, { 470, 0x118},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	{ 490, 0x119}, { 510, 0x11a}, { 540, 0x11b}, { 560, 0x11c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	{ 580, 0x11d}, { 600, 0x11e}, { 620, 0x11f}, { 640, 0x120},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	{ 660, 0x121}, { 680, 0x122}, { 700, 0x123}, { 720, 0x124},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 	{ 740, 0x125}, { 760, 0x126}, { 790, 0x127}, { 810, 0x128},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	{ 830, 0x129}, { 850, 0x12a}, { 870, 0x12b}, { 890, 0x12c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	{ 910, 0x12d}, { 930, 0x12e}, { 950, 0x12f}, { 970, 0x130},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	{ 990, 0x131}, {1010, 0x132}, {1030, 0x133}, {1060, 0x134},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	{1080, 0x135}, {1100, 0x136}, {1120, 0x137}, {1140, 0x138},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	{1160, 0x139}, {1180, 0x13a}, {1200, 0x13b}, {1220, 0x13c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	{1240, 0x13d}, {1260, 0x13e}, {1280, 0x13f}, {1310, 0x140},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	{1330, 0x141}, {1350, 0x142}, {1370, 0x143}, {1390, 0x144},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 	{1410, 0x145}, {1430, 0x146}, {1450, 0x147}, {1470, 0x148},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	{1490, 0x149}, {1580, 0x007}, {1740, 0x008}, {1910, 0x009},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	{2070, 0x00a}, {2240, 0x00b}, {2410, 0x00c}, {2570, 0x00d},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	{2740, 0x00e}, {2910, 0x00f}, {3070, 0x010}, {3240, 0x011},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	{3410, 0x012}, {3570, 0x013}, {3740, 0x014}, {3890, 0x015},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	{4070, 0x016}, {4240, 0x017}, {4400, 0x018}, {4500, 0x019},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) /* These tables must be sorted by .range_h ascending. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) static const struct hsfreq_range samsung_cphy_rx_hsfreq_ranges[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	{ 500,  0x102}, { 990, 0x002}, { 2500, 0x001},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) static void samsung_mipi_dcphy_bias_block_enable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	struct csi2_dphy *csi_dphy = samsung->dphy_dev[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	u32 bias_con2 = 0x3223;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	if (csi_dphy &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	    csi_dphy->dphy_param.lp_vol_ref != 3 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	    csi_dphy->dphy_param.lp_vol_ref < 0x7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 		bias_con2 &= 0xfffffff8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 		bias_con2 |= csi_dphy->dphy_param.lp_vol_ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 		dev_info(samsung->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 			 "rx change lp_vol_ref to %d, it may cause tx exception\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 			 csi_dphy->dphy_param.lp_vol_ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	regmap_write(samsung->regmap, BIAS_CON0, 0x0010);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	regmap_write(samsung->regmap, BIAS_CON1, 0x0110);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	regmap_write(samsung->regmap, BIAS_CON2, bias_con2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	/* default output voltage select:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	 * dphy: 400mv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	 * cphy: 530mv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	if (samsung->c_option)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 		regmap_update_bits(samsung->regmap, BIAS_CON4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 				   I_MUX_SEL_MASK, I_MUX_SEL(2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) static void samsung_mipi_dcphy_bias_block_disable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) static void samsung_mipi_dphy_lane_enable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	regmap_write(samsung->regmap, DPHY_MC_GNR_CON1, T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	regmap_update_bits(samsung->regmap, DPHY_MC_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 			   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 	switch (samsung->lanes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	case 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 		regmap_write(samsung->regmap, DPHY_MD3_GNR_CON1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 			     T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 		regmap_update_bits(samsung->regmap, DPHY_MD3_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 				   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	case 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 		regmap_write(samsung->regmap, COMBO_MD2_GNR_CON1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 			     T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 		regmap_update_bits(samsung->regmap, COMBO_MD2_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 				   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 		regmap_write(samsung->regmap, COMBO_MD1_GNR_CON1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 			     T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 		regmap_update_bits(samsung->regmap, COMBO_MD1_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 				   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 		regmap_write(samsung->regmap, COMBO_MD0_GNR_CON1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 			     T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		regmap_update_bits(samsung->regmap, COMBO_MD0_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 				   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) static void samsung_mipi_cphy_lane_enable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	regmap_write(samsung->regmap, COMBO_MD0_GNR_CON1, T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	regmap_write(samsung->regmap, COMBO_MD1_GNR_CON1, T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	regmap_write(samsung->regmap, COMBO_MD2_GNR_CON1, T_PHY_READY(0x2000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 	regmap_update_bits(samsung->regmap, COMBO_MD0_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 			   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	regmap_update_bits(samsung->regmap, COMBO_MD1_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 			   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 	regmap_update_bits(samsung->regmap, COMBO_MD2_GNR_CON0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 			   PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) static void samsung_mipi_dphy_lane_disable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 	regmap_update_bits(samsung->regmap, DPHY_MC_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	regmap_update_bits(samsung->regmap, COMBO_MD0_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	regmap_update_bits(samsung->regmap, COMBO_MD1_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 	regmap_update_bits(samsung->regmap, COMBO_MD2_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	regmap_update_bits(samsung->regmap, DPHY_MD3_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) static void samsung_mipi_cphy_lane_disable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	regmap_update_bits(samsung->regmap, COMBO_MD0_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	regmap_update_bits(samsung->regmap, COMBO_MD1_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	regmap_update_bits(samsung->regmap, COMBO_MD2_GNR_CON0, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) static void samsung_mipi_dcphy_pll_configure(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	regmap_update_bits(samsung->regmap, PLL_CON0, S_MASK | P_MASK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 			   S(samsung->pll.scaler) | P(samsung->pll.prediv));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	if (samsung->pll.dsm < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		u16 dsm_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 		/* Using opposite number subtraction to find complement */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		dsm_tmp = abs(samsung->pll.dsm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 		dsm_tmp = dsm_tmp - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 		dsm_tmp ^= 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		regmap_write(samsung->regmap, PLL_CON1, dsm_tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		regmap_write(samsung->regmap, PLL_CON1, samsung->pll.dsm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 	regmap_update_bits(samsung->regmap, PLL_CON2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 			   M_MASK, M(samsung->pll.fbdiv));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	if (samsung->pll.ssc_en) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 		regmap_write(samsung->regmap, PLL_CON3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 			     MRR(samsung->pll.mrr) | MFR(samsung->pll.mfr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 		regmap_update_bits(samsung->regmap, PLL_CON4, SSCG_EN, SSCG_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	regmap_write(samsung->regmap, PLL_CON5, RESET_N_SEL | PLL_ENABLE_SEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	regmap_write(samsung->regmap, PLL_CON7, PLL_LOCK_CNT(0xf000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 	regmap_write(samsung->regmap, PLL_CON8, PLL_STB_CNT(0xf000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static void samsung_mipi_dcphy_pll_enable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	u32 sts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	regmap_update_bits(samsung->regmap, PLL_CON0, PLL_EN, PLL_EN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	ret = regmap_read_poll_timeout(samsung->regmap, PLL_STAT0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 				       sts, (sts & PLL_LOCK), 1000, 20000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 		dev_err(samsung->dev, "DC-PHY pll is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) static void samsung_mipi_dcphy_pll_disable(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	regmap_update_bits(samsung->regmap, PLL_CON0, PLL_EN, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) static const struct samsung_mipi_dphy_timing *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) samsung_mipi_dphy_get_timing(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 	const struct samsung_mipi_dphy_timing *timings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	unsigned int num_timings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 	unsigned int lane_mbps = div64_ul(samsung->pll.rate, USEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	timings = samsung_mipi_dphy_timing_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	num_timings = ARRAY_SIZE(samsung_mipi_dphy_timing_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	for (i = num_timings; i > 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 		if (lane_mbps <= timings[i - 1].max_lane_mbps)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	if (i == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 		++i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 	return &timings[i - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) static const struct samsung_mipi_cphy_timing *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) samsung_mipi_cphy_get_timing(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	const struct samsung_mipi_cphy_timing *timings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 	unsigned int num_timings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	unsigned int lane_msps = div64_ul(samsung->pll.rate, USEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 	timings = samsung_mipi_cphy_timing_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	num_timings = ARRAY_SIZE(samsung_mipi_cphy_timing_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	for (i = num_timings; i > 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 		if (lane_msps <= timings[i - 1].max_lane_msps)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	if (i == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		++i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 	return &timings[i - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) static void samsung_mipi_cphy_timing_init(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 	const struct samsung_mipi_cphy_timing *timing;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	u32 val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	timing = samsung_mipi_cphy_get_timing(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 	 * 1500Mbps, otherwise divide-by-16 Clock from Serial Clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	if (lane_hs_rate < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 		val = HSTX_CLK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	val |= T_LPX(timing->lpx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	val = T_HS_ZERO(timing->prebegin_3) | T_HS_PREPARE(timing->prepare_3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	val = T_HS_EXIT(timing->hs_exit) | T_HS_TRAIL(timing->post_3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 	/* TTA-GET/TTA-GO Timing Counter register use default value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	val = T_TA_GET(0x3) | T_TA_GO(0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	/* Escape Clock is 20.00MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	/* set T_ERR_SOT_SYNC default value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) static unsigned long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) samsung_mipi_dcphy_pll_round_rate(struct samsung_mipi_dcphy *samsung,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 				  unsigned long prate, unsigned long rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 				  u8 *prediv, u16 *fbdiv, int *dsm, u8 *scaler)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 	u64 max_fout = samsung->c_option ? MAX_CPHY_BW : MAX_DPHY_BW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	u64 best_freq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	u64 fin, fvco, fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	u8 min_prediv, max_prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	u8 _prediv, best_prediv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	u16 _fbdiv, best_fbdiv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	u8 _scaler, best_scaler = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	u32 min_delta = UINT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 	long _dsm, best_dsm = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 	 * The PLL output frequency can be calculated using a simple formula:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 	 * Fvco = ((m+k/65536) x 2 x Fin) / p
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	 * Fout = ((m+k/65536) x 2 x Fin) / (p x 2^s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	fin = div64_ul(prate, MSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	while (!best_freq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 		fout = div64_ul(rate, MSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 		if (fout > max_fout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 			fout = max_fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 		/* 0 ≤ S[2:0] ≤ 6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 		for (_scaler = 0; _scaler < 7; _scaler++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 			fvco = fout << _scaler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 			 * 2600MHz ≤ FVCO ≤ 6600MHz
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 			if (fvco < 2600 * MSEC_PER_SEC || fvco > 6600 * MSEC_PER_SEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 			/* 6MHz ≤ Fref(Fin / p) ≤ 30MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 			min_prediv = DIV_ROUND_UP_ULL(fin, 30 * MSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 			max_prediv = DIV_ROUND_CLOSEST_ULL(fin, 6 * MSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 			for (_prediv = min_prediv; _prediv <= max_prediv; _prediv++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 				u64 delta, tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 				_fbdiv = DIV_ROUND_CLOSEST_ULL(fvco * _prediv, 2 * fin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 				 /* 64 ≤ M[9:0] ≤ 1023 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 				if ((_fbdiv < 64) || (_fbdiv > 1023))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 					continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 				/* -32767 ≤ K[15:0] ≤ 32767 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 				_dsm = ((_prediv * fvco) - (2 * _fbdiv * fin));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 				_dsm = DIV_ROUND_UP_ULL(_dsm << 15, fin);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 				if (abs(_dsm) > 32767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 					continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 				tmp = DIV_ROUND_CLOSEST_ULL((_fbdiv * fin * 2 * 1000), _prediv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 				tmp += DIV_ROUND_CLOSEST_ULL((_dsm * fin * 1000), _prediv << 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 				delta = abs(fvco * MSEC_PER_SEC - tmp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 				if (delta < min_delta) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 					best_prediv = _prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 					best_fbdiv = _fbdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 					best_dsm = _dsm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 					best_scaler = _scaler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 					min_delta = delta;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 					best_freq = DIV_ROUND_CLOSEST_ULL(tmp, 1000) * MSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 		rate += 100 * MSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 	*prediv = best_prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 	*fbdiv = best_fbdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 	*dsm = (int)best_dsm & 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	*scaler = best_scaler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	dev_dbg(samsung->dev, "p: %d, m: %d, dsm:%ld, scaler: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 		 best_prediv, best_fbdiv, best_dsm, best_scaler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	return best_freq >> best_scaler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) samsung_mipi_dphy_clk_lane_timing_init(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 	const struct samsung_mipi_dphy_timing *timing;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	u32 val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	timing = samsung_mipi_dphy_get_timing(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	regmap_write(samsung->regmap, DPHY_MC_GNR_CON0, 0xf000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	regmap_write(samsung->regmap, DPHY_MC_ANA_CON0, 0x7133);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	if (lane_hs_rate >= 4500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 		regmap_write(samsung->regmap, DPHY_MC_ANA_CON1, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	 * 1500Mbps, otherwise divide-by-16 Clock from Serial Clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	if (lane_hs_rate < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 		val = HSTX_CLK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	val |= T_LPX(timing->lpx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 	regmap_write(samsung->regmap, DPHY_MC_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 	val = T_CLK_ZERO(timing->clk_zero) | T_CLK_PREPARE(timing->clk_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 	regmap_write(samsung->regmap, DPHY_MC_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 	val = T_HS_EXIT(timing->hs_exit) | T_CLK_TRAIL(timing->clk_trail_eot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 	regmap_write(samsung->regmap, DPHY_MC_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 	val = T_CLK_POST(timing->clk_post);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 	regmap_write(samsung->regmap, DPHY_MC_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 	/* Escape Clock is 20.00MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 	regmap_write(samsung->regmap, DPHY_MC_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 	 * skew calibration should be off, if the operation data rate is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	 * under 1.5Gbps or equal to 1.5Gbps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	if (lane_hs_rate > 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 		regmap_write(samsung->regmap, DPHY_MC_DESKEW_CON0, 0x9cb1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) samsung_mipi_dphy_data_lane_timing_init(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 	const struct samsung_mipi_dphy_timing *timing;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 	unsigned int lane_hs_rate = div64_ul(samsung->pll.rate, USEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 	u32 val = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 	timing = samsung_mipi_dphy_get_timing(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 	regmap_write(samsung->regmap, COMBO_MD0_ANA_CON0, 0x7133);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 	regmap_write(samsung->regmap, COMBO_MD1_ANA_CON0, 0x7133);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 	regmap_write(samsung->regmap, COMBO_MD2_ANA_CON0, 0x7133);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 	regmap_write(samsung->regmap, DPHY_MD3_ANA_CON0, 0x7133);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	if (lane_hs_rate >= 4500) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 		regmap_write(samsung->regmap, COMBO_MD0_ANA_CON1, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 		regmap_write(samsung->regmap, COMBO_MD1_ANA_CON1, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 		regmap_write(samsung->regmap, COMBO_MD2_ANA_CON1, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 		regmap_write(samsung->regmap, DPHY_MD3_ANA_CON1, 0x0001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 	 * Divide-by-2 Clock from Serial Clock. Use this when data rate is under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 	 * 1500Mbps, otherwise divide-by-16 Clock from Serial Clock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 	if (lane_hs_rate < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 		val = HSTX_CLK_SEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	val |= T_LPX(timing->lpx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 	/*  T_LP_EXIT_SKEW/T_LP_ENTRY_SKEW unconfig */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	regmap_write(samsung->regmap, DPHY_MD3_TIME_CON0, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	val = T_HS_ZERO(timing->hs_zero) | T_HS_PREPARE(timing->hs_prepare);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	regmap_write(samsung->regmap, DPHY_MD3_TIME_CON1, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	val = T_HS_EXIT(timing->hs_exit) | T_HS_TRAIL(timing->hs_trail_eot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	regmap_write(samsung->regmap, DPHY_MD3_TIME_CON2, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 	/* TTA-GET/TTA-GO Timing Counter register use default value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 	val = T_TA_GET(0x3) | T_TA_GO(0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	regmap_write(samsung->regmap, DPHY_MD3_TIME_CON3, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 	/* Escape Clock is 20.00MHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 	regmap_write(samsung->regmap, COMBO_MD0_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 	regmap_write(samsung->regmap, COMBO_MD1_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 	regmap_write(samsung->regmap, COMBO_MD2_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 	regmap_write(samsung->regmap, DPHY_MD3_TIME_CON4, 0x1f4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) samsung_mipi_dcphy_hs_vreg_amp_configure(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 	regmap_write(samsung->regmap, DPHY_MC_ANA_CON2, HS_VREG_AMP_ICON(2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) static void samsung_mipi_dphy_power_on(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	reset_control_assert(samsung->m_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 	samsung_mipi_dcphy_bias_block_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	samsung_mipi_dcphy_pll_configure(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	samsung_mipi_dphy_clk_lane_timing_init(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 	samsung_mipi_dphy_data_lane_timing_init(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 	samsung_mipi_dcphy_pll_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 	samsung_mipi_dphy_lane_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 	reset_control_deassert(samsung->m_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 	/* The TSKEWCAL maximum is 100 µsec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 	 * at initial calibration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 	usleep_range(100, 110);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) static void samsung_mipi_cphy_power_on(struct samsung_mipi_dcphy *samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 	regmap_write(samsung->grf_regmap, MIPI_DCPHY_GRF_CON0, M_CPHY_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 	reset_control_assert(samsung->m_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 	samsung_mipi_dcphy_bias_block_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 	samsung_mipi_dcphy_hs_vreg_amp_configure(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 	samsung_mipi_dcphy_pll_configure(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) 	samsung_mipi_cphy_timing_init(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	samsung_mipi_dcphy_pll_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 	samsung_mipi_cphy_lane_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 	reset_control_deassert(samsung->m_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) static int samsung_mipi_dcphy_power_on(struct phy *phy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 	struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 	enum phy_mode mode = phy_get_mode(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 	pm_runtime_get_sync(samsung->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 	reset_control_assert(samsung->apb_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 	udelay(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 	reset_control_deassert(samsung->apb_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 	switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 	case PHY_MODE_MIPI_DPHY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 		samsung_mipi_dphy_power_on(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 		samsung_mipi_cphy_power_on(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) static int samsung_mipi_dcphy_power_off(struct phy *phy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 	struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 	enum phy_mode mode = phy_get_mode(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 	switch (mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 	case PHY_MODE_MIPI_DPHY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 		samsung_mipi_dphy_lane_disable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 		samsung_mipi_cphy_lane_disable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	samsung_mipi_dcphy_pll_disable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 	samsung_mipi_dcphy_bias_block_disable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 	pm_runtime_put(samsung->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) static int samsung_mipi_dcphy_set_mode(struct phy *phy, enum phy_mode mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 				   int submode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) samsung_mipi_dcphy_pll_ssc_modulation_calc(struct samsung_mipi_dcphy *samsung,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 					   u8 *mfr, u8 *mrr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 	unsigned long fin = div64_ul(clk_get_rate(samsung->ref_clk), MSEC_PER_SEC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 	u16 prediv = samsung->pll.prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 	u16 fbdiv = samsung->pll.fbdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 	u16 min_mfr, max_mfr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 	u16 _mfr, best_mfr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 	u16 mr, _mrr, best_mrr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 	/* 20KHz ≤ MF ≤ 150KHz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 	max_mfr = DIV_ROUND_UP(fin, (20 * prediv) << 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 	min_mfr = div64_ul(fin, ((150 * prediv) << 5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 	/*0 ≤ mfr ≤ 255 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 	if (max_mfr > 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 		max_mfr = 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 	for (_mfr = min_mfr; _mfr < max_mfr; _mfr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 		/* 1 ≤ mrr ≤ 31 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 		for (_mrr = 1; _mrr < 32; _mrr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 			mr = DIV_ROUND_UP(_mfr * _mrr * 100, fbdiv << 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 			/* 0 ≤ MR ≤ 5% */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 			if (mr > 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 			if (_mfr * _mrr < 513) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 				best_mfr = _mfr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 				best_mrr = _mrr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 	if (best_mrr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		*mfr = best_mfr & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 		*mrr = best_mrr & 0x3f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 		dev_err(samsung->dev, "failed to calc ssc parameter mfr and mrr\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) samsung_mipi_dcphy_pll_calc_rate(struct samsung_mipi_dcphy *samsung,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 				 unsigned long long rate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 	unsigned long prate = clk_get_rate(samsung->ref_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 	unsigned long fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 	u8 scaler = 0, mfr = 0, mrr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 	u16 fbdiv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 	u8 prediv = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	int dsm = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 	fout = samsung_mipi_dcphy_pll_round_rate(samsung, prate, rate,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 						 &prediv, &fbdiv, &dsm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 						 &scaler);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 	dev_dbg(samsung->dev, "%s: fin=%lu, req_rate=%llu\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 		__func__, prate, rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 	dev_dbg(samsung->dev, "%s: fout=%lu, prediv=%u, fbdiv=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 		__func__, fout, prediv, fbdiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 	samsung->pll.prediv = prediv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 	samsung->pll.fbdiv = fbdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 	samsung->pll.dsm = dsm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 	samsung->pll.scaler = scaler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 	samsung->pll.rate = fout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 	 * All DPHY 2.0 compliant Transmitters shall support SSC operating above
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 	 * 2.5 Gbps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 	if (fout > 2500000000LL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 		ret = samsung_mipi_dcphy_pll_ssc_modulation_calc(samsung,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 								 &mfr, &mrr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 		if (!ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 			samsung->pll.ssc_en = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 			samsung->pll.mfr = mfr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 			samsung->pll.mrr = mrr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) static int samsung_mipi_dcphy_configure(struct phy *phy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) 					union phy_configure_opts *opts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 	struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 	unsigned long long target_rate = opts->mipi_dphy.hs_clk_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 	enum phy_mode mode = phy_get_mode(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 	samsung->c_option = (mode == PHY_MODE_MIPI_DPHY) ? false : true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 	samsung->lanes = opts->mipi_dphy.lanes > 4 ? 4 : opts->mipi_dphy.lanes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 	samsung_mipi_dcphy_pll_calc_rate(samsung, target_rate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 	opts->mipi_dphy.hs_clk_rate = samsung->pll.rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) static struct v4l2_subdev *get_remote_sensor(struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 	struct media_pad *local, *remote;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 	struct media_entity *sensor_me;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 	local = &sd->entity.pads[CSI2_DPHY_RX_PAD_SINK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 	remote = media_entity_remote_pad(local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 	if (!remote) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 		v4l2_warn(sd, "No link between dphy and sensor\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 	sensor_me = media_entity_remote_pad(local)->entity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 	return media_entity_to_v4l2_subdev(sensor_me);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) static struct csi2_sensor *sd_to_sensor(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 					   struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 	for (i = 0; i < dphy->num_sensors; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 		if (dphy->sensors[i].sd == sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 			return &dphy->sensors[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) static void samsung_dcphy_rx_config_settle(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 					  struct csi2_sensor *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 	struct samsung_mipi_dcphy *samsung = dphy->samsung_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) 	const struct hsfreq_range *hsfreq_ranges = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 	int num_hsfreq_ranges = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 	int i, hsfreq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 	u32 sot_sync = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 		hsfreq_ranges = samsung_dphy_rx_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 		num_hsfreq_ranges = ARRAY_SIZE(samsung_dphy_rx_hsfreq_ranges);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 		sot_sync = 0x03;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 	} else if (sensor->mbus.type == V4L2_MBUS_CSI2_CPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 		hsfreq_ranges = samsung_cphy_rx_hsfreq_ranges;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 		num_hsfreq_ranges = ARRAY_SIZE(samsung_cphy_rx_hsfreq_ranges);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		sot_sync = 0x32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 		dev_err(dphy->dev, "mbus type %d is not support",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 			sensor->mbus.type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 	/* set data lane */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 	for (i = 0; i < num_hsfreq_ranges; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 		if (hsfreq_ranges[i].range_h >= dphy->data_rate_mbps) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 			hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 	if (i == num_hsfreq_ranges) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) 		i = num_hsfreq_ranges - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) 		dev_warn(dphy->dev, "data rate: %lld mbps, max support %d mbps",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 			 dphy->data_rate_mbps, hsfreq_ranges[i].range_h + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) 		hsfreq = hsfreq_ranges[i].cfg_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	/*clk settle fix to 0x301*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 		regmap_write(samsung->regmap, RX_CLK_THS_SETTLE, 0x301);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 	if (sensor->lanes > 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 		regmap_update_bits(samsung->regmap, RX_LANE0_THS_SETTLE, 0x1ff, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 		regmap_update_bits(samsung->regmap, RX_LANE0_ERR_SOT_SYNC, 0xff, sot_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) 	if (sensor->lanes > 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 		regmap_update_bits(samsung->regmap, RX_LANE1_THS_SETTLE, 0x1ff, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 		regmap_update_bits(samsung->regmap, RX_LANE1_ERR_SOT_SYNC, 0xff, sot_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 	if (sensor->lanes > 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 		regmap_update_bits(samsung->regmap, RX_LANE2_THS_SETTLE, 0x1ff, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 		regmap_update_bits(samsung->regmap, RX_LANE2_ERR_SOT_SYNC, 0xff, sot_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 	if (sensor->lanes > 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 		regmap_update_bits(samsung->regmap, RX_LANE3_THS_SETTLE, 0x1ff, hsfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 		regmap_update_bits(samsung->regmap, RX_LANE3_ERR_SOT_SYNC, 0xff, sot_sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) static int samsung_dcphy_rx_config_common(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 					  struct csi2_sensor *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 	struct samsung_mipi_dcphy *samsung = dphy->samsung_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 	u32 dlysel = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 		if (dphy->data_rate_mbps < 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 			dlysel = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 		else if (dphy->data_rate_mbps < 2000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 			dlysel = 3 << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 		else if (dphy->data_rate_mbps < 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 			dlysel = 2 << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 		else if (dphy->data_rate_mbps < 4000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 			dlysel = 1 << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 		else if (dphy->data_rate_mbps < 6500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 			dlysel = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 		if (dphy->dphy_param.clk_hs_term_sel > 0x7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 			dev_err(dphy->dev, "clk_hs_term_sel error param %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 				dphy->dphy_param.clk_hs_term_sel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 		for (i = 0; i < sensor->lanes; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 			if (dphy->dphy_param.data_hs_term_sel[i] > 0x7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 				dev_err(dphy->dev, "data_hs_term_sel[%d] error param %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 					i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 					dphy->dphy_param.data_hs_term_sel[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 			if (dphy->dphy_param.lp_hys_sw[i] > 0x3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 				dev_err(dphy->dev, "lp_hys_sw[%d] error param %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 					i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 					dphy->dphy_param.lp_hys_sw[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 			if (dphy->dphy_param.lp_escclk_pol_sel[i] > 0x1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 				dev_err(dphy->dev, "lp_escclk_pol_sel[%d] error param %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 					i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 					dphy->dphy_param.lp_escclk_pol_sel[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 			if (dphy->dphy_param.skew_data_cal_clk[i] > 0x1f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 				dev_err(dphy->dev, "skew_data_cal_clk[%d] error param %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 					i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 					dphy->dphy_param.skew_data_cal_clk[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 				return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 		regmap_write(samsung->regmap, RX_S0C_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 		regmap_write(samsung->regmap, RX_S0C_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 		regmap_write(samsung->regmap, RX_S0C_ANA_CON2, dphy->dphy_param.clk_hs_term_sel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 		regmap_write(samsung->regmap, RX_S0C_ANA_CON3, 0x0600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 		if (sensor->lanes > 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON2, dlysel |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 				     dphy->dphy_param.data_hs_term_sel[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON3, 0x0600 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 				     (dphy->dphy_param.lp_hys_sw[0] << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 				     (dphy->dphy_param.lp_escclk_pol_sel[0] << 11));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_DESKEW_CON2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 				     dphy->dphy_param.skew_data_cal_clk[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 		if (sensor->lanes > 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON2, dlysel |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 				     dphy->dphy_param.data_hs_term_sel[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON3, 0x0600 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 				     (dphy->dphy_param.lp_hys_sw[1] << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 				     (dphy->dphy_param.lp_escclk_pol_sel[1] << 11));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_DESKEW_CON2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 				     dphy->dphy_param.skew_data_cal_clk[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 		if (sensor->lanes > 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON2, dlysel |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 				     dphy->dphy_param.data_hs_term_sel[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON3, 0x0600 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 				     (dphy->dphy_param.lp_hys_sw[2] << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 				     (dphy->dphy_param.lp_escclk_pol_sel[2] << 11));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_DESKEW_CON2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 				     dphy->dphy_param.skew_data_cal_clk[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 		if (sensor->lanes > 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 			regmap_write(samsung->regmap, RX_S0D3_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 			regmap_write(samsung->regmap, RX_S0D3_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 			regmap_write(samsung->regmap, RX_S0D3_ANA_CON2, dlysel |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 				     dphy->dphy_param.data_hs_term_sel[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 			regmap_write(samsung->regmap, RX_S0D3_ANA_CON3, 0x0600 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 				     (dphy->dphy_param.lp_hys_sw[3] << 4) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 				     (dphy->dphy_param.lp_escclk_pol_sel[3] << 11));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 			regmap_write(samsung->regmap, RX_S0D3_DESKEW_CON2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 				     dphy->dphy_param.skew_data_cal_clk[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 		if (sensor->lanes > 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON2, 0x5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON3, 0x600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON6, 0x608);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_CRC_CON1, 0x1500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) 			regmap_write(samsung->regmap, RX_COMBO_S0D0_CRC_CON2, 0x30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 		if (sensor->lanes > 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON2, 0x5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON3, 0x600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON6, 0x608);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_CRC_CON1, 0x1500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 			regmap_write(samsung->regmap, RX_COMBO_S0D1_CRC_CON2, 0x30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 		if (sensor->lanes > 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_GNR_CON1, 0x1450);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON1, 0x8000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON2, 0x5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON3, 0x600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON6, 0x608);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_ANA_CON7, 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_CRC_CON1, 0x1500);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 			regmap_write(samsung->regmap, RX_COMBO_S0D2_CRC_CON2, 0x30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) static int samsung_dcphy_rx_lane_enable(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 					  struct csi2_sensor *sensor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 	struct samsung_mipi_dcphy *samsung = dphy->samsung_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 	u32 sts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 		regmap_update_bits(samsung->regmap, RX_CLK_LANE_ENABLE, PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 	if (sensor->lanes > 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE0_ENABLE, PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) 	if (sensor->lanes > 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE1_ENABLE, PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 	if (sensor->lanes > 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE2_ENABLE, PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 	if (sensor->lanes > 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE3_ENABLE, PHY_ENABLE, PHY_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	/*wait for clk lane ready*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 		ret = regmap_read_poll_timeout(samsung->regmap, RX_CLK_LANE_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 				       sts, (sts & PHY_READY), 200, 4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 			dev_err(samsung->dev, "phy rx clk lane is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 	/*wait for data lane ready*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 	if (sensor->lanes > 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 		ret = regmap_read_poll_timeout(samsung->regmap, RX_DATA_LANE0_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 				       sts, (sts & PHY_READY), 200, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 			dev_err(samsung->dev, "phy rx data lane 0 is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 	if (sensor->lanes > 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 		ret = regmap_read_poll_timeout(samsung->regmap, RX_DATA_LANE1_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 				       sts, (sts & PHY_READY), 200, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 			dev_err(samsung->dev, "phy rx data lane 1 is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 	if (sensor->lanes > 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 		ret = regmap_read_poll_timeout(samsung->regmap, RX_DATA_LANE2_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 				       sts, (sts & PHY_READY), 200, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 			dev_err(samsung->dev, "phy rx data lane 2 is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 	if (sensor->lanes > 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 		ret = regmap_read_poll_timeout(samsung->regmap, RX_DATA_LANE3_ENABLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 				       sts, (sts & PHY_READY), 200, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 		if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 			dev_err(samsung->dev, "phy rx data lane 3 is not locked\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 			return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) static int samsung_dcphy_rx_stream_on(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 					struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 	struct csi2_sensor *sensor = sd_to_sensor(dphy, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 	struct samsung_mipi_dcphy *samsung = dphy->samsung_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 	int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 	mutex_lock(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_CPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 		regmap_write(samsung->grf_regmap, MIPI_DCPHY_GRF_CON0, S_CPHY_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 	if (samsung->s_phy_rst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 		reset_control_assert(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	samsung_mipi_dcphy_bias_block_enable(samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	ret = samsung_dcphy_rx_config_common(dphy, sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 		goto out_streamon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 	samsung_dcphy_rx_config_settle(dphy, sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 	ret = samsung_dcphy_rx_lane_enable(dphy, sensor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 		goto out_streamon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 	if (samsung->s_phy_rst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 		reset_control_deassert(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	atomic_inc(&samsung->stream_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	mutex_unlock(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) out_streamon:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 	if (samsung->s_phy_rst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 		reset_control_deassert(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 	mutex_unlock(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 	dev_err(dphy->dev, "stream on error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 	return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) static int samsung_dcphy_rx_stream_off(struct csi2_dphy *dphy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 					  struct v4l2_subdev *sd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 	struct samsung_mipi_dcphy *samsung = dphy->samsung_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	struct v4l2_subdev *sensor_sd = get_remote_sensor(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	struct csi2_sensor *sensor = sd_to_sensor(dphy, sensor_sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 	if (atomic_dec_return(&samsung->stream_cnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 	mutex_lock(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 	if (samsung->s_phy_rst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 		reset_control_assert(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 	if (sensor->mbus.type == V4L2_MBUS_CSI2_DPHY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 		regmap_update_bits(samsung->regmap, RX_CLK_LANE_ENABLE, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 	if (sensor->lanes > 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE0_ENABLE, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	if (sensor->lanes > 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE1_ENABLE, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 	if (sensor->lanes > 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE2_ENABLE, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	if (sensor->lanes > 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 		regmap_update_bits(samsung->regmap, RX_DATA_LANE3_ENABLE, PHY_ENABLE, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 	if (samsung->s_phy_rst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 		reset_control_deassert(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 	usleep_range(500, 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	mutex_unlock(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) static int samsung_mipi_dcphy_init(struct phy *phy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) 	struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) 	pm_runtime_get_sync(samsung->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) static int samsung_mipi_dcphy_exit(struct phy *phy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 	struct samsung_mipi_dcphy *samsung = phy_get_drvdata(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	pm_runtime_put(samsung->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) static const struct phy_ops samsung_mipi_dcphy_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	.configure = samsung_mipi_dcphy_configure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 	.set_mode = samsung_mipi_dcphy_set_mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	.power_on  = samsung_mipi_dcphy_power_on,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 	.power_off = samsung_mipi_dcphy_power_off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	.init = samsung_mipi_dcphy_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 	.exit = samsung_mipi_dcphy_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 	.owner	   = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) static const struct regmap_config samsung_mipi_dcphy_regmap_config = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 	.name = "dcphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	.reg_bits = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 	.val_bits = 32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 	.reg_stride = 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 	.max_register = 0x10000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) static int samsung_mipi_dcphy_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 	struct device *dev = &pdev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 	struct device_node *np = dev->of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 	struct samsung_mipi_dcphy *samsung;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 	struct phy_provider *phy_provider;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 	struct phy *phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 	struct resource *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) 	void __iomem *regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 	samsung = devm_kzalloc(dev, sizeof(*samsung), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 	if (!samsung)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	samsung->dev = dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	platform_set_drvdata(pdev, samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 	regs = devm_ioremap_resource(dev, res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 	if (IS_ERR(regs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 		return PTR_ERR(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 	samsung->regmap = devm_regmap_init_mmio(dev, regs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 						&samsung_mipi_dcphy_regmap_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 	if (IS_ERR(samsung->regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 		ret = PTR_ERR(samsung->regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 		dev_err(dev, "failed to init regmap: %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 	samsung->grf_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 	if (IS_ERR(samsung->grf_regmap)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 		dev_err(dev, "Unable to get rockchip,grf\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 		return PTR_ERR(samsung->grf_regmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 	samsung->ref_clk = devm_clk_get(dev, "ref");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 	if (IS_ERR(samsung->ref_clk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 		dev_err(dev, "failed to get reference clock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 		return PTR_ERR(samsung->ref_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) 	samsung->pclk = devm_clk_get(dev, "pclk");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 	if (IS_ERR(samsung->pclk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 		dev_err(dev, "failed to get pclk\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 		return PTR_ERR(samsung->pclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	samsung->m_phy_rst = devm_reset_control_get(dev, "m_phy");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 	if (IS_ERR(samsung->m_phy_rst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 		dev_err(dev, "failed to get system m_phy_rst control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) 		return PTR_ERR(samsung->m_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 	samsung->s_phy_rst = devm_reset_control_get(dev, "s_phy");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 	if (IS_ERR(samsung->s_phy_rst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 		dev_err(dev, "failed to get system s_phy_rst control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 		return PTR_ERR(samsung->s_phy_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 	samsung->apb_rst = devm_reset_control_get(dev, "apb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 	if (IS_ERR(samsung->apb_rst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 		dev_err(dev, "failed to get system apb_rst control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 		return PTR_ERR(samsung->apb_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 	samsung->grf_apb_rst = devm_reset_control_get(dev, "grf");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 	if (IS_ERR(samsung->grf_apb_rst)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 		dev_err(dev, "failed to get system grf_apb_rst control\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 		return PTR_ERR(samsung->grf_apb_rst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 	phy = devm_phy_create(dev, NULL, &samsung_mipi_dcphy_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) 	if (IS_ERR(phy)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 		dev_err(dev, "failed to create MIPI Dc-PHY\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 		return PTR_ERR(phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) 	phy_set_drvdata(phy, samsung);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) 	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) 	if (IS_ERR(phy_provider)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) 		dev_err(dev, "failed to register phy provider\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) 		return PTR_ERR(phy_provider);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 	samsung->stream_on = samsung_dcphy_rx_stream_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) 	samsung->stream_off = samsung_dcphy_rx_stream_off;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) 	mutex_init(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 	pm_runtime_enable(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) static int samsung_mipi_dcphy_remove(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 	struct samsung_mipi_dcphy *samsung = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) 	pm_runtime_disable(samsung->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 	mutex_destroy(&samsung->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) static __maybe_unused int samsung_mipi_dcphy_runtime_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) 	struct samsung_mipi_dcphy *samsung = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 	clk_disable_unprepare(samsung->pclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 	clk_disable_unprepare(samsung->ref_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) static __maybe_unused int samsung_mipi_dcphy_runtime_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 	struct samsung_mipi_dcphy *samsung = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) 	clk_prepare_enable(samsung->pclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) 	clk_prepare_enable(samsung->ref_clk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) static const struct dev_pm_ops samsung_mipi_dcphy_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) 	SET_RUNTIME_PM_OPS(samsung_mipi_dcphy_runtime_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 			   samsung_mipi_dcphy_runtime_resume, NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) static const struct of_device_id samsung_mipi_dcphy_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 		.compatible = "rockchip,rk3588-mipi-dcphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) MODULE_DEVICE_TABLE(of, samsung_mipi_dcphy_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) static struct platform_driver samsung_mipi_dcphy_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 		.name = "samsung-mipi-dcphy",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) 		.of_match_table	= of_match_ptr(samsung_mipi_dcphy_of_match),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 		.pm = &samsung_mipi_dcphy_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) 	.probe	= samsung_mipi_dcphy_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 	.remove = samsung_mipi_dcphy_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) module_platform_driver(samsung_mipi_dcphy_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) MODULE_AUTHOR("Guochun Huang<hero.huang@rock-chips.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) MODULE_DESCRIPTION("Samsung MIPI DCPHY Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) MODULE_LICENSE("GPL v2");