File Index
Files and directories
Sign in
FILE

camss-csiphy-3ph-1-0.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * camss-csiphy-3ph-1-0.c
   4 *
   5 * Qualcomm MSM Camera Subsystem - CSIPHY Module 3phase v1.0
   6 *
   7 * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
   8 * Copyright (C) 2016-2018 Linaro Ltd.
   9 */
  10
  11#include "camss.h"
  12#include "camss-csiphy.h"
  13
  14#include <linux/delay.h>
  15#include <linux/interrupt.h>
  16#include <linux/io.h>
  17
  18#define CSIPHY_3PH_LNn_CFG1(n)			(0x000 + 0x100 * (n))
  19#define CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG	(BIT(7) | BIT(6))
  20#define CSIPHY_3PH_LNn_CFG2(n)			(0x004 + 0x100 * (n))
  21#define CSIPHY_3PH_LNn_CFG2_LP_REC_EN_INT	BIT(3)
  22#define CSIPHY_3PH_LNn_CFG3(n)			(0x008 + 0x100 * (n))
  23#define CSIPHY_3PH_LNn_CFG4(n)			(0x00c + 0x100 * (n))
  24#define CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS	0xa4
  25#define CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS_660	0xa5
  26#define CSIPHY_3PH_LNn_CFG5(n)			(0x010 + 0x100 * (n))
  27#define CSIPHY_3PH_LNn_CFG5_T_HS_DTERM		0x02
  28#define CSIPHY_3PH_LNn_CFG5_HS_REC_EQ_FQ_INT	0x50
  29#define CSIPHY_3PH_LNn_TEST_IMP(n)		(0x01c + 0x100 * (n))
  30#define CSIPHY_3PH_LNn_TEST_IMP_HS_TERM_IMP	0xa
  31#define CSIPHY_3PH_LNn_MISC1(n)			(0x028 + 0x100 * (n))
  32#define CSIPHY_3PH_LNn_MISC1_IS_CLKLANE		BIT(2)
  33#define CSIPHY_3PH_LNn_CFG6(n)			(0x02c + 0x100 * (n))
  34#define CSIPHY_3PH_LNn_CFG6_SWI_FORCE_INIT_EXIT	BIT(0)
  35#define CSIPHY_3PH_LNn_CFG7(n)			(0x030 + 0x100 * (n))
  36#define CSIPHY_3PH_LNn_CFG7_SWI_T_INIT		0x2
  37#define CSIPHY_3PH_LNn_CFG8(n)			(0x034 + 0x100 * (n))
  38#define CSIPHY_3PH_LNn_CFG8_SWI_SKIP_WAKEUP	BIT(0)
  39#define CSIPHY_3PH_LNn_CFG8_SKEW_FILTER_ENABLE	BIT(1)
  40#define CSIPHY_3PH_LNn_CFG9(n)			(0x038 + 0x100 * (n))
  41#define CSIPHY_3PH_LNn_CFG9_SWI_T_WAKEUP	0x1
  42#define CSIPHY_3PH_LNn_CSI_LANE_CTRL15(n)	(0x03c + 0x100 * (n))
  43#define CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL	0xb8
  44
  45#define CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(offset, n)	((offset) + 0x4 * (n))
  46#define CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE	BIT(7)
  47#define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B	BIT(0)
  48#define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID	BIT(1)
  49#define CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(offset, n)	((offset) + 0xb0 + 0x4 * (n))
  50
  51#define CSIPHY_DEFAULT_PARAMS		0
  52#define CSIPHY_LANE_ENABLE		1
  53#define CSIPHY_SETTLE_CNT_LOWER_BYTE	2
  54#define CSIPHY_SETTLE_CNT_HIGHER_BYTE	3
  55#define CSIPHY_DNP_PARAMS		4
  56#define CSIPHY_2PH_REGS			5
  57#define CSIPHY_3PH_REGS			6
  58#define CSIPHY_SKEW_CAL			7
  59
  60struct csiphy_lane_regs {
  61	s32 reg_addr;
  62	s32 reg_data;
  63	u32 delay_us;
  64	u32 csiphy_param_type;
  65};
  66
  67/* 5nm 2PH v 1.3.0 2p5Gbps 4 lane DPHY mode */
  68static const struct
  69csiphy_lane_regs lane_regs_sa8775p[] = {
  70	{0x0724, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
  71	{0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
  72	{0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
  73	{0x070C, 0xFF, 0x00, CSIPHY_DEFAULT_PARAMS},
  74	{0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
  75	{0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
  76	{0x0734, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
  77	{0x0710, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
  78	{0x071C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
  79	{0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
  80	{0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
  81	{0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
  82	{0x0720, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
  83	{0x0708, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
  84	{0x0024, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
  85	{0x0000, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
  86	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
  87	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
  88	{0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
  89	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
  90	{0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
  91	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
  92	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
  93	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
  94	{0x0020, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
  95	{0x0008, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
  96	{0x0224, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
  97	{0x0200, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
  98	{0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
  99	{0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 100	{0x0234, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 101	{0x0210, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 102	{0x021C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 103	{0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 104	{0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 105	{0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 106	{0x0220, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 107	{0x0208, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 108	{0x0424, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 109	{0x0400, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 110	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 111	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 112	{0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 113	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 114	{0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 115	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 116	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 117	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 118	{0x0420, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 119	{0x0408, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 120	{0x0624, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 121	{0x0600, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 122	{0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 123	{0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 124	{0x0634, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 125	{0x0610, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 126	{0x061C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 127	{0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 128	{0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 129	{0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 130	{0x0620, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 131	{0x0608, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 132	{0x005C, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 133	{0x0060, 0xFD, 0x00, CSIPHY_DEFAULT_PARAMS},
 134	{0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 135	{0x025C, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 136	{0x0260, 0xFD, 0x00, CSIPHY_DEFAULT_PARAMS},
 137	{0x0264, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 138	{0x045C, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 139	{0x0460, 0xFD, 0x00, CSIPHY_DEFAULT_PARAMS},
 140	{0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 141	{0x065C, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 142	{0x0660, 0xFD, 0x00, CSIPHY_DEFAULT_PARAMS},
 143	{0x0664, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 144};
 145
 146/* GEN2 1.0 2PH */
 147static const struct
 148csiphy_lane_regs lane_regs_sdm845[] = {
 149	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 150	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 151	{0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 152	{0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 153	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 154	{0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 155	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 156	{0x0000, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS},
 157	{0x0008, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 158	{0x000c, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 159	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 160	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 161	{0x0060, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 162	{0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 163	{0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 164	{0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 165	{0x0734, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 166	{0x071C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 167	{0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 168	{0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 169	{0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 170	{0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 171	{0x0708, 0x14, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 172	{0x070C, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS},
 173	{0x0710, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 174	{0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
 175	{0x0760, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 176	{0x0764, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 177	{0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 178	{0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 179	{0x0234, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 180	{0x021C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 181	{0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 182	{0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 183	{0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 184	{0x0200, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS},
 185	{0x0208, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 186	{0x020C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 187	{0x0210, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 188	{0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 189	{0x0260, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 190	{0x0264, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 191	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 192	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 193	{0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 194	{0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 195	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 196	{0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 197	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 198	{0x0400, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS},
 199	{0x0408, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 200	{0x040C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 201	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 202	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 203	{0x0460, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 204	{0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 205	{0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 206	{0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 207	{0x0634, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 208	{0x061C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 209	{0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 210	{0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 211	{0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 212	{0x0600, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS},
 213	{0x0608, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 214	{0x060C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 215	{0x0610, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 216	{0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 217	{0x0660, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 218	{0x0664, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 219};
 220
 221/* GEN2 1.1 2PH */
 222static const struct
 223csiphy_lane_regs lane_regs_sc8280xp[] = {
 224	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 225	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 226	{0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 227	{0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 228	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 229	{0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 230	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 231	{0x0000, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS},
 232	{0x0008, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 233	{0x000C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 234	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 235	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 236	{0x0060, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 237	{0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 238	{0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 239	{0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 240	{0x0734, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 241	{0x071C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 242	{0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 243	{0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 244	{0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 245	{0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 246	{0x0708, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 247	{0x070C, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS},
 248	{0x0710, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 249	{0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
 250	{0x0760, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 251	{0x0764, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 252	{0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 253	{0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 254	{0x0234, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 255	{0x021C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 256	{0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 257	{0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 258	{0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 259	{0x0200, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS},
 260	{0x0208, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 261	{0x020C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 262	{0x0210, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 263	{0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 264	{0x0260, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 265	{0x0264, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 266	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 267	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 268	{0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 269	{0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 270	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 271	{0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 272	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 273	{0x0400, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS},
 274	{0x0408, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 275	{0x040C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 276	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 277	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 278	{0x0460, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 279	{0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 280	{0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 281	{0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 282	{0x0634, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 283	{0x061C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 284	{0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 285	{0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 286	{0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 287	{0x0600, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS},
 288	{0x0608, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 289	{0x060C, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 290	{0x0610, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 291	{0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 292	{0x0660, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 293	{0x0664, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 294};
 295
 296/* GEN2 1.2.1 2PH */
 297static const struct
 298csiphy_lane_regs lane_regs_sm8250[] = {
 299	{0x0030, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 300	{0x0900, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS},
 301	{0x0908, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS},
 302	{0x0904, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 303	{0x0904, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 304	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 305	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 306	{0x0034, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 307	{0x0010, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 308	{0x001C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 309	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 310	{0x0008, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 311	{0x0000, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 312	{0x000c, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 313	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 314	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 315	{0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 316	{0x0024, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 317	{0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 318	{0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 319	{0x0730, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 320	{0x0C80, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS},
 321	{0x0C88, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS},
 322	{0x0C84, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 323	{0x0C84, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 324	{0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 325	{0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 326	{0x0734, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 327	{0x0710, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 328	{0x071C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 329	{0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 330	{0x0708, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 331	{0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 332	{0x070c, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS},
 333	{0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
 334	{0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 335	{0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 336	{0x0724, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 337	{0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 338	{0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 339	{0x0230, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 340	{0x0A00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS},
 341	{0x0A08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS},
 342	{0x0A04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 343	{0x0A04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 344	{0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 345	{0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 346	{0x0234, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 347	{0x0210, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 348	{0x021C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 349	{0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 350	{0x0208, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 351	{0x0200, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 352	{0x020c, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 353	{0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 354	{0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 355	{0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 356	{0x0224, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 357	{0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 358	{0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 359	{0x0430, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 360	{0x0B00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS},
 361	{0x0B08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS},
 362	{0x0B04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 363	{0x0B04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 364	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 365	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 366	{0x0434, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 367	{0x0410, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 368	{0x041C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 369	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 370	{0x0408, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 371	{0x0400, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 372	{0x040c, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 373	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 374	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 375	{0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 376	{0x0424, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 377	{0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 378	{0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 379	{0x0630, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 380	{0x0C00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS},
 381	{0x0C08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS},
 382	{0x0C04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 383	{0x0C04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 384	{0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 385	{0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 386	{0x0634, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS},
 387	{0x0610, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 388	{0x061C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 389	{0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 390	{0x0608, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 391	{0x0600, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS},
 392	{0x060c, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 393	{0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 394	{0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 395	{0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 396	{0x0624, 0x00, 0x00, CSIPHY_DNP_PARAMS},
 397	{0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 398	{0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 399};
 400
 401/* 14nm 2PH v 2.0.1 2p5Gbps 4 lane DPHY mode */
 402static const struct
 403csiphy_lane_regs lane_regs_qcm2290[] = {
 404	{0x0030, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 405	{0x002c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 406	{0x0034, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 407	{0x0028, 0x04, 0x00, CSIPHY_DNP_PARAMS},
 408	{0x003c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 409	{0x001c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 410	{0x0000, 0xd7, 0x00, CSIPHY_DEFAULT_PARAMS},
 411	{0x0004, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 412	{0x0020, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 413	{0x0008, 0x04, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 414	{0x000c, 0xff, 0x00, CSIPHY_DNP_PARAMS},
 415	{0x0010, 0x50, 0x00, CSIPHY_DEFAULT_PARAMS},
 416	{0x0038, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 417	{0x0060, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 418	{0x0064, 0x3f, 0x00, CSIPHY_DEFAULT_PARAMS},
 419
 420	{0x0730, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 421	{0x072c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 422	{0x0734, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 423	{0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 424	{0x073c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 425	{0x071c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 426	{0x0700, 0xc0, 0x00, CSIPHY_DEFAULT_PARAMS},
 427	{0x0704, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 428	{0x0720, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 429	{0x0708, 0x04, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 430	{0x070c, 0xff, 0x00, CSIPHY_DEFAULT_PARAMS},
 431	{0x0710, 0x50, 0x00, CSIPHY_DEFAULT_PARAMS},
 432	{0x0738, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 433	{0x0760, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 434	{0x0764, 0x3f, 0x00, CSIPHY_DEFAULT_PARAMS},
 435
 436	{0x0230, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 437	{0x022c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 438	{0x0234, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 439	{0x0228, 0x04, 0x00, CSIPHY_DNP_PARAMS},
 440	{0x023c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 441	{0x021c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 442	{0x0200, 0xd7, 0x00, CSIPHY_DEFAULT_PARAMS},
 443	{0x0204, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 444	{0x0220, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 445	{0x0208, 0x04, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 446	{0x020c, 0xff, 0x00, CSIPHY_DNP_PARAMS},
 447	{0x0210, 0x50, 0x00, CSIPHY_DEFAULT_PARAMS},
 448	{0x0238, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 449	{0x0260, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 450	{0x0264, 0x3f, 0x00, CSIPHY_DEFAULT_PARAMS},
 451
 452	{0x0430, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 453	{0x042c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 454	{0x0434, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 455	{0x0428, 0x04, 0x00, CSIPHY_DNP_PARAMS},
 456	{0x043c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 457	{0x041c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 458	{0x0400, 0xd7, 0x00, CSIPHY_DEFAULT_PARAMS},
 459	{0x0404, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 460	{0x0420, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 461	{0x0408, 0x04, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 462	{0x040C, 0xff, 0x00, CSIPHY_DNP_PARAMS},
 463	{0x0410, 0x50, 0x00, CSIPHY_DEFAULT_PARAMS},
 464	{0x0438, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 465	{0x0460, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 466	{0x0464, 0x3f, 0x00, CSIPHY_DEFAULT_PARAMS},
 467
 468	{0x0630, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS},
 469	{0x062c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 470	{0x0634, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 471	{0x0628, 0x04, 0x00, CSIPHY_DNP_PARAMS},
 472	{0x063c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 473	{0x061c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 474	{0x0600, 0xd7, 0x00, CSIPHY_DEFAULT_PARAMS},
 475	{0x0604, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 476	{0x0620, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 477	{0x0608, 0x04, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 478	{0x060C, 0xff, 0x00, CSIPHY_DNP_PARAMS},
 479	{0x0610, 0x50, 0x00, CSIPHY_DEFAULT_PARAMS},
 480	{0x0638, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 481	{0x0660, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 482	{0x0664, 0x3f, 0x00, CSIPHY_DEFAULT_PARAMS},
 483};
 484
 485/* GEN2 2.1.2 2PH DPHY mode */
 486static const struct
 487csiphy_lane_regs lane_regs_sm8550[] = {
 488	{0x0E90, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 489	{0x0E98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 490	{0x0E94, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 491	{0x00A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 492	{0x0090, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 493	{0x0098, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 494	{0x0094, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 495	{0x0494, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 496	{0x04A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 497	{0x0490, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 498	{0x0498, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 499	{0x0494, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 500	{0x0894, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 501	{0x08A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 502	{0x0890, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 503	{0x0898, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 504	{0x0894, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 505	{0x0C94, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 506	{0x0CA0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 507	{0x0C90, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 508	{0x0C98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 509	{0x0C94, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 510	{0x0E30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 511	{0x0E28, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 512	{0x0E00, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 513	{0x0E0C, 0xFF, 0x00, CSIPHY_DEFAULT_PARAMS},
 514	{0x0E38, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
 515	{0x0E2C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 516	{0x0E34, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 517	{0x0E1C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 518	{0x0E14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 519	{0x0E3C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 520	{0x0E04, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 521	{0x0E20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 522	{0x0E08, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 523	{0x0E10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 524	{0x0030, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 525	{0x0000, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 526	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 527	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 528	{0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 529	{0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 530	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 531	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 532	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 533	{0x0020, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 534	{0x0008, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 535	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 536	{0x0430, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 537	{0x0400, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 538	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 539	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 540	{0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 541	{0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 542	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 543	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 544	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 545	{0x0420, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 546	{0x0408, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 547	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 548	{0x0830, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 549	{0x0800, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 550	{0x0838, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 551	{0x082C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 552	{0x0834, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 553	{0x081C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 554	{0x0814, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 555	{0x083C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 556	{0x0804, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 557	{0x0820, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 558	{0x0808, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 559	{0x0810, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 560	{0x0C30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 561	{0x0C00, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 562	{0x0C38, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 563	{0x0C2C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 564	{0x0C34, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 565	{0x0C1C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 566	{0x0C14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 567	{0x0C3C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 568	{0x0C04, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 569	{0x0C20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 570	{0x0C08, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 571	{0x0C10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 572	{0x0094, 0xD7, 0x00, CSIPHY_DEFAULT_PARAMS},
 573	{0x005C, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 574	{0x0060, 0xBD, 0x00, CSIPHY_DEFAULT_PARAMS},
 575	{0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 576	{0x0494, 0xD7, 0x00, CSIPHY_DEFAULT_PARAMS},
 577	{0x045C, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 578	{0x0460, 0xBD, 0x00, CSIPHY_DEFAULT_PARAMS},
 579	{0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 580	{0x0894, 0xD7, 0x00, CSIPHY_DEFAULT_PARAMS},
 581	{0x085C, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 582	{0x0860, 0xBD, 0x00, CSIPHY_DEFAULT_PARAMS},
 583	{0x0864, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 584	{0x0C94, 0xD7, 0x00, CSIPHY_DEFAULT_PARAMS},
 585	{0x0C5C, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 586	{0x0C60, 0xBD, 0x00, CSIPHY_DEFAULT_PARAMS},
 587	{0x0C64, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS},
 588};
 589
 590/* GEN2 2.2.0 2PH 4 lane DPHY mode */
 591static const struct
 592csiphy_lane_regs lane_regs_sm8650[] = {
 593	{0x0e94, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 594	{0x0ea0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 595	{0x0e90, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 596	{0x0e98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 597	{0x0e94, 0x07, 0xd1, CSIPHY_DEFAULT_PARAMS},
 598	{0x0e30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 599	{0x0e28, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 600	{0x0e00, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 601	{0x0e0c, 0xff, 0x00, CSIPHY_DEFAULT_PARAMS},
 602	{0x0e38, 0x1f, 0x00, CSIPHY_DEFAULT_PARAMS},
 603	{0x0e2c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 604	{0x0e34, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 605	{0x0e1c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 606	{0x0e14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 607	{0x0e3c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 608	{0x0e04, 0x0c, 0x00, CSIPHY_DEFAULT_PARAMS},
 609	{0x0e20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 610	{0x0e08, 0x19, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 611	{0x0e10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 612
 613	{0x0094, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 614	{0x00a0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 615	{0x0090, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 616	{0x0098, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 617	{0x0094, 0x07, 0xd1, CSIPHY_DEFAULT_PARAMS},
 618	{0x0030, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 619	{0x0000, 0x8e, 0x00, CSIPHY_DEFAULT_PARAMS},
 620	{0x0038, 0xfe, 0x00, CSIPHY_DEFAULT_PARAMS},
 621	{0x002c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 622	{0x0034, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 623	{0x001c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 624	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 625	{0x003c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 626	{0x0004, 0x0c, 0x00, CSIPHY_DEFAULT_PARAMS},
 627	{0x0020, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 628	{0x0008, 0x19, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 629	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 630
 631	{0x0494, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 632	{0x04a0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 633	{0x0490, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 634	{0x0498, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 635	{0x0494, 0x07, 0xd1, CSIPHY_DEFAULT_PARAMS},
 636	{0x0430, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 637	{0x0400, 0x8e, 0x00, CSIPHY_DEFAULT_PARAMS},
 638	{0x0438, 0xfe, 0x00, CSIPHY_DEFAULT_PARAMS},
 639	{0x042c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 640	{0x0434, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 641	{0x041c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 642	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 643	{0x043c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 644	{0x0404, 0x0c, 0x00, CSIPHY_DEFAULT_PARAMS},
 645	{0x0420, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 646	{0x0408, 0x19, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 647	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 648
 649	{0x0894, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 650	{0x08a0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 651	{0x0890, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 652	{0x0898, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 653	{0x0894, 0x07, 0xd1, CSIPHY_DEFAULT_PARAMS},
 654	{0x0830, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 655	{0x0800, 0x8e, 0x00, CSIPHY_DEFAULT_PARAMS},
 656	{0x0838, 0xfe, 0x00, CSIPHY_DEFAULT_PARAMS},
 657	{0x082c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 658	{0x0834, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 659	{0x081c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 660	{0x0814, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 661	{0x083c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 662	{0x0804, 0x0c, 0x00, CSIPHY_DEFAULT_PARAMS},
 663	{0x0820, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 664	{0x0808, 0x19, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 665	{0x0810, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 666
 667	{0x0c94, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 668	{0x0ca0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 669	{0x0c90, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 670	{0x0c98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 671	{0x0c94, 0x07, 0xd1, CSIPHY_DEFAULT_PARAMS},
 672	{0x0c30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 673	{0x0c00, 0x8e, 0x00, CSIPHY_DEFAULT_PARAMS},
 674	{0x0c38, 0xfe, 0x00, CSIPHY_DEFAULT_PARAMS},
 675	{0x0c2c, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 676	{0x0c34, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 677	{0x0c1c, 0x0a, 0x00, CSIPHY_DEFAULT_PARAMS},
 678	{0x0c14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 679	{0x0c3c, 0xb8, 0x00, CSIPHY_DEFAULT_PARAMS},
 680	{0x0c04, 0x0c, 0x00, CSIPHY_DEFAULT_PARAMS},
 681	{0x0c20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 682	{0x0c08, 0x19, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 683	{0x0c10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 684};
 685
 686/* 4nm 2PH v 2.1.2 2p5Gbps 4 lane DPHY mode */
 687static const struct
 688csiphy_lane_regs lane_regs_x1e80100[] = {
 689	/* Power up lanes 2ph mode */
 690	{0x1014, 0xD5, 0x00, CSIPHY_DEFAULT_PARAMS},
 691	{0x101C, 0x7A, 0x00, CSIPHY_DEFAULT_PARAMS},
 692	{0x1018, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 693
 694	{0x0094, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 695	{0x00A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 696	{0x0090, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 697	{0x0098, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 698	{0x0094, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 699	{0x0030, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 700	{0x0000, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 701	{0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 702	{0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 703	{0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 704	{0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 705	{0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 706	{0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 707	{0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 708	{0x0020, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 709	{0x0008, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 710	{0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 711	{0x0094, 0xD7, 0x00, CSIPHY_SKEW_CAL},
 712	{0x005C, 0x00, 0x00, CSIPHY_SKEW_CAL},
 713	{0x0060, 0xBD, 0x00, CSIPHY_SKEW_CAL},
 714	{0x0064, 0x7F, 0x00, CSIPHY_SKEW_CAL},
 715
 716	{0x0E94, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 717	{0x0EA0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 718	{0x0E90, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 719	{0x0E98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 720	{0x0E94, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 721	{0x0E30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 722	{0x0E28, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS},
 723	{0x0E00, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS},
 724	{0x0E0C, 0xFF, 0x00, CSIPHY_DEFAULT_PARAMS},
 725	{0x0E38, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS},
 726	{0x0E2C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 727	{0x0E34, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 728	{0x0E1C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 729	{0x0E14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 730	{0x0E3C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 731	{0x0E04, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 732	{0x0E20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 733	{0x0E08, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 734	{0x0E10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 735
 736	{0x0494, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 737	{0x04A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 738	{0x0490, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 739	{0x0498, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 740	{0x0494, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 741	{0x0430, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 742	{0x0400, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 743	{0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 744	{0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 745	{0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 746	{0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 747	{0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 748	{0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 749	{0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 750	{0x0420, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 751	{0x0408, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 752	{0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 753	{0x0494, 0xD7, 0x00, CSIPHY_SKEW_CAL},
 754	{0x045C, 0x00, 0x00, CSIPHY_SKEW_CAL},
 755	{0x0460, 0xBD, 0x00, CSIPHY_SKEW_CAL},
 756	{0x0464, 0x7F, 0x00, CSIPHY_SKEW_CAL},
 757
 758	{0x0894, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 759	{0x08A0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 760	{0x0890, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 761	{0x0898, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 762	{0x0894, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 763	{0x0830, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 764	{0x0800, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 765	{0x0838, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 766	{0x082C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 767	{0x0834, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 768	{0x081C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 769	{0x0814, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 770	{0x083C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 771	{0x0804, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 772	{0x0820, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 773	{0x0808, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 774	{0x0810, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 775	{0x0894, 0xD7, 0x00, CSIPHY_SKEW_CAL},
 776	{0x085C, 0x00, 0x00, CSIPHY_SKEW_CAL},
 777	{0x0860, 0xBD, 0x00, CSIPHY_SKEW_CAL},
 778	{0x0864, 0x7F, 0x00, CSIPHY_SKEW_CAL},
 779
 780	{0x0C94, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 781	{0x0CA0, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 782	{0x0C90, 0x0f, 0x00, CSIPHY_DEFAULT_PARAMS},
 783	{0x0C98, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS},
 784	{0x0C94, 0x07, 0x01, CSIPHY_DEFAULT_PARAMS},
 785	{0x0C30, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 786	{0x0C00, 0x8E, 0x00, CSIPHY_DEFAULT_PARAMS},
 787	{0x0C38, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS},
 788	{0x0C2C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS},
 789	{0x0C34, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS},
 790	{0x0C1C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS},
 791	{0x0C14, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS},
 792	{0x0C3C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS},
 793	{0x0C04, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS},
 794	{0x0C20, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS},
 795	{0x0C08, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE},
 796	{0x0C10, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS},
 797	{0x0C94, 0xD7, 0x00, CSIPHY_SKEW_CAL},
 798	{0x0C5C, 0x00, 0x00, CSIPHY_SKEW_CAL},
 799	{0x0C60, 0xBD, 0x00, CSIPHY_SKEW_CAL},
 800	{0x0C64, 0x7F, 0x00, CSIPHY_SKEW_CAL},
 801};
 802
 803static void csiphy_hw_version_read(struct csiphy_device *csiphy,
 804				   struct device *dev)
 805{
 806	struct csiphy_device_regs *regs = csiphy->regs;
 807	u32 hw_version;
 808
 809	writel(CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID, csiphy->base +
 810	       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
 811
 812	hw_version = readl_relaxed(csiphy->base +
 813				   CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 12));
 814	hw_version |= readl_relaxed(csiphy->base +
 815				   CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 13)) << 8;
 816	hw_version |= readl_relaxed(csiphy->base +
 817				   CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 14)) << 16;
 818	hw_version |= readl_relaxed(csiphy->base +
 819				   CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 15)) << 24;
 820
 821	dev_dbg(dev, "CSIPHY 3PH HW Version = 0x%08x\n", hw_version);
 822}
 823
 824/*
 825 * csiphy_reset - Perform software reset on CSIPHY module
 826 * @csiphy: CSIPHY device
 827 */
 828static void csiphy_reset(struct csiphy_device *csiphy)
 829{
 830	struct csiphy_device_regs *regs = csiphy->regs;
 831
 832	writel_relaxed(0x1, csiphy->base +
 833		      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
 834	usleep_range(5000, 8000);
 835	writel_relaxed(0x0, csiphy->base +
 836		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
 837}
 838
 839static irqreturn_t csiphy_isr(int irq, void *dev)
 840{
 841	struct csiphy_device *csiphy = dev;
 842	struct csiphy_device_regs *regs = csiphy->regs;
 843	int i;
 844
 845	for (i = 0; i < 11; i++) {
 846		int c = i + 22;
 847		u8 val = readl_relaxed(csiphy->base +
 848				       CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, i));
 849
 850		writel_relaxed(val, csiphy->base +
 851			       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, c));
 852	}
 853
 854	writel_relaxed(0x1, csiphy->base +
 855		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 10));
 856	writel_relaxed(0x0, csiphy->base +
 857		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 10));
 858
 859	for (i = 22; i < 33; i++) {
 860		writel_relaxed(0x0, csiphy->base +
 861			       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, i));
 862	}
 863
 864	return IRQ_HANDLED;
 865}
 866
 867/*
 868 * csiphy_settle_cnt_calc - Calculate settle count value
 869 *
 870 * Helper function to calculate settle count value. This is
 871 * based on the CSI2 T_hs_settle parameter which in turn
 872 * is calculated based on the CSI2 transmitter link frequency.
 873 *
 874 * Return settle count value or 0 if the CSI2 link frequency
 875 * is not available
 876 */
 877static u8 csiphy_settle_cnt_calc(s64 link_freq, u32 timer_clk_rate)
 878{
 879	u32 ui; /* ps */
 880	u32 timer_period; /* ps */
 881	u32 t_hs_prepare_max; /* ps */
 882	u32 t_hs_settle; /* ps */
 883	u8 settle_cnt;
 884
 885	if (link_freq <= 0)
 886		return 0;
 887
 888	ui = div_u64(1000000000000LL, link_freq);
 889	ui /= 2;
 890	t_hs_prepare_max = 85000 + 6 * ui;
 891	t_hs_settle = t_hs_prepare_max;
 892
 893	timer_period = div_u64(1000000000000LL, timer_clk_rate);
 894	settle_cnt = t_hs_settle / timer_period - 6;
 895
 896	return settle_cnt;
 897}
 898
 899static void csiphy_gen1_config_lanes(struct csiphy_device *csiphy,
 900				     struct csiphy_config *cfg,
 901				     u8 settle_cnt)
 902{
 903	struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg;
 904	int i, l = 0;
 905	u8 val;
 906
 907	for (i = 0; i <= c->num_data; i++) {
 908		if (i == c->num_data)
 909			l = 7;
 910		else
 911			l = c->data[i].pos * 2;
 912
 913		val = CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG;
 914		val |= 0x17;
 915		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG1(l));
 916
 917		val = CSIPHY_3PH_LNn_CFG2_LP_REC_EN_INT;
 918		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG2(l));
 919
 920		val = settle_cnt;
 921		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG3(l));
 922
 923		val = CSIPHY_3PH_LNn_CFG5_T_HS_DTERM |
 924			CSIPHY_3PH_LNn_CFG5_HS_REC_EQ_FQ_INT;
 925		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG5(l));
 926
 927		val = CSIPHY_3PH_LNn_CFG6_SWI_FORCE_INIT_EXIT;
 928		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG6(l));
 929
 930		val = CSIPHY_3PH_LNn_CFG7_SWI_T_INIT;
 931		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG7(l));
 932
 933		val = CSIPHY_3PH_LNn_CFG8_SWI_SKIP_WAKEUP |
 934			CSIPHY_3PH_LNn_CFG8_SKEW_FILTER_ENABLE;
 935		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG8(l));
 936
 937		val = CSIPHY_3PH_LNn_CFG9_SWI_T_WAKEUP;
 938		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG9(l));
 939
 940		val = CSIPHY_3PH_LNn_TEST_IMP_HS_TERM_IMP;
 941		writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_TEST_IMP(l));
 942
 943		val = CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL;
 944		writel_relaxed(val, csiphy->base +
 945				    CSIPHY_3PH_LNn_CSI_LANE_CTRL15(l));
 946	}
 947
 948	val = CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG;
 949	writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG1(l));
 950
 951	if (csiphy->camss->res->version == CAMSS_660)
 952		val = CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS_660;
 953	else
 954		val = CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS;
 955	writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG4(l));
 956
 957	val = CSIPHY_3PH_LNn_MISC1_IS_CLKLANE;
 958	writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_MISC1(l));
 959}
 960
 961static void csiphy_gen2_config_lanes(struct csiphy_device *csiphy,
 962				     u8 settle_cnt)
 963{
 964	const struct csiphy_lane_regs *r = csiphy->regs->lane_regs;
 965	int i, array_size = csiphy->regs->lane_array_size;
 966	u32 val;
 967
 968	for (i = 0; i < array_size; i++, r++) {
 969		switch (r->csiphy_param_type) {
 970		case CSIPHY_SETTLE_CNT_LOWER_BYTE:
 971			val = settle_cnt & 0xff;
 972			break;
 973		case CSIPHY_SKEW_CAL:
 974			/* TODO: support application of skew from dt flag */
 975			continue;
 976		case CSIPHY_DNP_PARAMS:
 977			continue;
 978		default:
 979			val = r->reg_data;
 980			break;
 981		}
 982		writel_relaxed(val, csiphy->base + r->reg_addr);
 983		if (r->delay_us)
 984			udelay(r->delay_us);
 985	}
 986}
 987
 988static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg)
 989{
 990	u8 lane_mask;
 991	int i;
 992
 993	lane_mask = CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE;
 994
 995	for (i = 0; i < lane_cfg->num_data; i++)
 996		lane_mask |= 1 << lane_cfg->data[i].pos;
 997
 998	return lane_mask;
 999}
1000
1001static bool csiphy_is_gen2(u32 version)
1002{
1003	bool ret = false;
1004
1005	switch (version) {
1006	case CAMSS_2290:
1007	case CAMSS_7280:
1008	case CAMSS_8250:
1009	case CAMSS_8280XP:
1010	case CAMSS_8300:
1011	case CAMSS_845:
1012	case CAMSS_8550:
1013	case CAMSS_8650:
1014	case CAMSS_8775P:
1015	case CAMSS_X1E80100:
1016		ret = true;
1017		break;
1018	}
1019
1020	return ret;
1021}
1022
1023static void csiphy_lanes_enable(struct csiphy_device *csiphy,
1024				struct csiphy_config *cfg,
1025				s64 link_freq, u8 lane_mask)
1026{
1027	struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg;
1028	struct csiphy_device_regs *regs = csiphy->regs;
1029	u8 settle_cnt;
1030	u8 val;
1031	int i;
1032
1033	settle_cnt = csiphy_settle_cnt_calc(link_freq, csiphy->timer_clk_rate);
1034
1035	val = CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE;
1036	for (i = 0; i < c->num_data; i++)
1037		val |= BIT(c->data[i].pos * 2);
1038
1039	writel_relaxed(val, csiphy->base +
1040		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 5));
1041
1042	val = CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B;
1043	writel_relaxed(val, csiphy->base +
1044		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
1045
1046	val = 0x02;
1047	writel_relaxed(val, csiphy->base +
1048		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 7));
1049
1050	val = 0x00;
1051	writel_relaxed(val, csiphy->base +
1052		       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
1053
1054	if (csiphy_is_gen2(csiphy->camss->res->version))
1055		csiphy_gen2_config_lanes(csiphy, settle_cnt);
1056	else
1057		csiphy_gen1_config_lanes(csiphy, cfg, settle_cnt);
1058
1059	/* IRQ_MASK registers - disable all interrupts */
1060	for (i = 11; i < 22; i++) {
1061		writel_relaxed(0, csiphy->base +
1062			       CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, i));
1063	}
1064}
1065
1066static void csiphy_lanes_disable(struct csiphy_device *csiphy,
1067				 struct csiphy_config *cfg)
1068{
1069	struct csiphy_device_regs *regs = csiphy->regs;
1070
1071	writel_relaxed(0, csiphy->base +
1072			  CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 5));
1073
1074	writel_relaxed(0, csiphy->base +
1075			  CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
1076}
1077
1078static int csiphy_init(struct csiphy_device *csiphy)
1079{
1080	struct device *dev = csiphy->camss->dev;
1081	struct csiphy_device_regs *regs;
1082
1083	regs = devm_kmalloc(dev, sizeof(*regs), GFP_KERNEL);
1084	if (!regs)
1085		return -ENOMEM;
1086
1087	csiphy->regs = regs;
1088	regs->offset = 0x800;
1089
1090	switch (csiphy->camss->res->version) {
1091	case CAMSS_845:
1092		regs->lane_regs = &lane_regs_sdm845[0];
1093		regs->lane_array_size = ARRAY_SIZE(lane_regs_sdm845);
1094		break;
1095	case CAMSS_2290:
1096		regs->lane_regs = &lane_regs_qcm2290[0];
1097		regs->lane_array_size = ARRAY_SIZE(lane_regs_qcm2290);
1098		break;
1099	case CAMSS_7280:
1100	case CAMSS_8250:
1101		regs->lane_regs = &lane_regs_sm8250[0];
1102		regs->lane_array_size = ARRAY_SIZE(lane_regs_sm8250);
1103		break;
1104	case CAMSS_8280XP:
1105		regs->lane_regs = &lane_regs_sc8280xp[0];
1106		regs->lane_array_size = ARRAY_SIZE(lane_regs_sc8280xp);
1107		break;
1108	case CAMSS_X1E80100:
1109		regs->lane_regs = &lane_regs_x1e80100[0];
1110		regs->lane_array_size = ARRAY_SIZE(lane_regs_x1e80100);
1111		regs->offset = 0x1000;
1112		break;
1113	case CAMSS_8550:
1114		regs->lane_regs = &lane_regs_sm8550[0];
1115		regs->lane_array_size = ARRAY_SIZE(lane_regs_sm8550);
1116		regs->offset = 0x1000;
1117		break;
1118	case CAMSS_8650:
1119		regs->lane_regs = &lane_regs_sm8650[0];
1120		regs->lane_array_size = ARRAY_SIZE(lane_regs_sm8650);
1121		regs->offset = 0x1000;
1122		break;
1123	case CAMSS_8300:
1124	case CAMSS_8775P:
1125		regs->lane_regs = &lane_regs_sa8775p[0];
1126		regs->lane_array_size = ARRAY_SIZE(lane_regs_sa8775p);
1127		break;
1128	default:
1129		break;
1130	}
1131
1132	return 0;
1133}
1134
1135const struct csiphy_hw_ops csiphy_ops_3ph_1_0 = {
1136	.get_lane_mask = csiphy_get_lane_mask,
1137	.hw_version_read = csiphy_hw_version_read,
1138	.reset = csiphy_reset,
1139	.lanes_enable = csiphy_lanes_enable,
1140	.lanes_disable = csiphy_lanes_disable,
1141	.isr = csiphy_isr,
1142	.init = csiphy_init,
1143};
~/ Read-only file preview.