14138a88bSTodor Tomov // SPDX-License-Identifier: GPL-2.0 24138a88bSTodor Tomov /* 34138a88bSTodor Tomov * camss-csiphy-3ph-1-0.c 44138a88bSTodor Tomov * 54138a88bSTodor Tomov * Qualcomm MSM Camera Subsystem - CSIPHY Module 3phase v1.0 64138a88bSTodor Tomov * 74138a88bSTodor Tomov * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. 84138a88bSTodor Tomov * Copyright (C) 2016-2018 Linaro Ltd. 94138a88bSTodor Tomov */ 104138a88bSTodor Tomov 11e486781bSAngeloGioacchino Del Regno #include "camss.h" 124138a88bSTodor Tomov #include "camss-csiphy.h" 134138a88bSTodor Tomov 144138a88bSTodor Tomov #include <linux/delay.h> 154138a88bSTodor Tomov #include <linux/interrupt.h> 163799eca5SArnd Bergmann #include <linux/io.h> 174138a88bSTodor Tomov 184138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG1(n) (0x000 + 0x100 * (n)) 194138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG (BIT(7) | BIT(6)) 204138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG2(n) (0x004 + 0x100 * (n)) 214138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG2_LP_REC_EN_INT BIT(3) 224138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG3(n) (0x008 + 0x100 * (n)) 234138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG4(n) (0x00c + 0x100 * (n)) 244138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS 0xa4 25e486781bSAngeloGioacchino Del Regno #define CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS_660 0xa5 264138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG5(n) (0x010 + 0x100 * (n)) 274138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG5_T_HS_DTERM 0x02 284138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG5_HS_REC_EQ_FQ_INT 0x50 294138a88bSTodor Tomov #define CSIPHY_3PH_LNn_TEST_IMP(n) (0x01c + 0x100 * (n)) 304138a88bSTodor Tomov #define CSIPHY_3PH_LNn_TEST_IMP_HS_TERM_IMP 0xa 314138a88bSTodor Tomov #define CSIPHY_3PH_LNn_MISC1(n) (0x028 + 0x100 * (n)) 324138a88bSTodor Tomov #define CSIPHY_3PH_LNn_MISC1_IS_CLKLANE BIT(2) 334138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG6(n) (0x02c + 0x100 * (n)) 344138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG6_SWI_FORCE_INIT_EXIT BIT(0) 354138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG7(n) (0x030 + 0x100 * (n)) 364138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG7_SWI_T_INIT 0x2 374138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG8(n) (0x034 + 0x100 * (n)) 384138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG8_SWI_SKIP_WAKEUP BIT(0) 394138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG8_SKEW_FILTER_ENABLE BIT(1) 404138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG9(n) (0x038 + 0x100 * (n)) 414138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CFG9_SWI_T_WAKEUP 0x1 424138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CSI_LANE_CTRL15(n) (0x03c + 0x100 * (n)) 434138a88bSTodor Tomov #define CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL 0xb8 444138a88bSTodor Tomov 454138a88bSTodor Tomov #define CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(n) (0x800 + 0x4 * (n)) 464abb2130SRobert Foss #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE BIT(7) 474138a88bSTodor Tomov #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B BIT(0) 484138a88bSTodor Tomov #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID BIT(1) 494138a88bSTodor Tomov #define CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(n) (0x8b0 + 0x4 * (n)) 504138a88bSTodor Tomov 512f8b6719SRobert Foss #define CSIPHY_DEFAULT_PARAMS 0 522f8b6719SRobert Foss #define CSIPHY_LANE_ENABLE 1 532f8b6719SRobert Foss #define CSIPHY_SETTLE_CNT_LOWER_BYTE 2 542f8b6719SRobert Foss #define CSIPHY_SETTLE_CNT_HIGHER_BYTE 3 552f8b6719SRobert Foss #define CSIPHY_DNP_PARAMS 4 562f8b6719SRobert Foss #define CSIPHY_2PH_REGS 5 572f8b6719SRobert Foss #define CSIPHY_3PH_REGS 6 582f8b6719SRobert Foss 592f8b6719SRobert Foss struct csiphy_reg_t { 602f8b6719SRobert Foss s32 reg_addr; 612f8b6719SRobert Foss s32 reg_data; 622f8b6719SRobert Foss s32 delay; 632f8b6719SRobert Foss u32 csiphy_param_type; 642f8b6719SRobert Foss }; 652f8b6719SRobert Foss 6653655d2aSJonathan Marek /* GEN2 1.0 2PH */ 672f8b6719SRobert Foss static const struct 682f8b6719SRobert Foss csiphy_reg_t lane_regs_sdm845[5][14] = { 692f8b6719SRobert Foss { 702f8b6719SRobert Foss {0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 712f8b6719SRobert Foss {0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 722f8b6719SRobert Foss {0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 732f8b6719SRobert Foss {0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 742f8b6719SRobert Foss {0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 752f8b6719SRobert Foss {0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 762f8b6719SRobert Foss {0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 772f8b6719SRobert Foss {0x0000, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS}, 782f8b6719SRobert Foss {0x0008, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 792f8b6719SRobert Foss {0x000c, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 802f8b6719SRobert Foss {0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 812f8b6719SRobert Foss {0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 822f8b6719SRobert Foss {0x0060, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 832f8b6719SRobert Foss {0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 842f8b6719SRobert Foss }, 852f8b6719SRobert Foss { 862f8b6719SRobert Foss {0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 872f8b6719SRobert Foss {0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 882f8b6719SRobert Foss {0x0734, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 892f8b6719SRobert Foss {0x071C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 902f8b6719SRobert Foss {0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 912f8b6719SRobert Foss {0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS}, 922f8b6719SRobert Foss {0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 932f8b6719SRobert Foss {0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS}, 942f8b6719SRobert Foss {0x0708, 0x14, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 952f8b6719SRobert Foss {0x070C, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS}, 962f8b6719SRobert Foss {0x0710, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 972f8b6719SRobert Foss {0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS}, 982f8b6719SRobert Foss {0x0760, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 992f8b6719SRobert Foss {0x0764, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1002f8b6719SRobert Foss }, 1012f8b6719SRobert Foss { 1022f8b6719SRobert Foss {0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 1032f8b6719SRobert Foss {0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 1042f8b6719SRobert Foss {0x0234, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1052f8b6719SRobert Foss {0x021C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 1062f8b6719SRobert Foss {0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 1072f8b6719SRobert Foss {0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1082f8b6719SRobert Foss {0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 1092f8b6719SRobert Foss {0x0200, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS}, 1102f8b6719SRobert Foss {0x0208, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 1112f8b6719SRobert Foss {0x020C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1122f8b6719SRobert Foss {0x0210, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 1132f8b6719SRobert Foss {0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 1142f8b6719SRobert Foss {0x0260, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 1152f8b6719SRobert Foss {0x0264, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1162f8b6719SRobert Foss }, 1172f8b6719SRobert Foss { 1182f8b6719SRobert Foss {0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 1192f8b6719SRobert Foss {0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 1202f8b6719SRobert Foss {0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1212f8b6719SRobert Foss {0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 1222f8b6719SRobert Foss {0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 1232f8b6719SRobert Foss {0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1242f8b6719SRobert Foss {0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 1252f8b6719SRobert Foss {0x0400, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS}, 1262f8b6719SRobert Foss {0x0408, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 1272f8b6719SRobert Foss {0x040C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1282f8b6719SRobert Foss {0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 1292f8b6719SRobert Foss {0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 1302f8b6719SRobert Foss {0x0460, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 1312f8b6719SRobert Foss {0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1322f8b6719SRobert Foss }, 1332f8b6719SRobert Foss { 1342f8b6719SRobert Foss {0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 1352f8b6719SRobert Foss {0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 1362f8b6719SRobert Foss {0x0634, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1372f8b6719SRobert Foss {0x061C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 1382f8b6719SRobert Foss {0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 1392f8b6719SRobert Foss {0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1402f8b6719SRobert Foss {0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 1412f8b6719SRobert Foss {0x0600, 0x91, 0x00, CSIPHY_DEFAULT_PARAMS}, 1422f8b6719SRobert Foss {0x0608, 0x00, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 1432f8b6719SRobert Foss {0x060C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 1442f8b6719SRobert Foss {0x0610, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 1452f8b6719SRobert Foss {0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 1462f8b6719SRobert Foss {0x0660, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 1472f8b6719SRobert Foss {0x0664, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 1482f8b6719SRobert Foss }, 1492f8b6719SRobert Foss }; 1502f8b6719SRobert Foss 151ebdd4f22SBryan O'Donoghue /* GEN2 1.1 2PH */ 152ebdd4f22SBryan O'Donoghue static const struct 153ebdd4f22SBryan O'Donoghue csiphy_reg_t lane_regs_sc8280xp[5][14] = { 154ebdd4f22SBryan O'Donoghue { 155ebdd4f22SBryan O'Donoghue {0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 156ebdd4f22SBryan O'Donoghue {0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 157ebdd4f22SBryan O'Donoghue {0x0034, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 158ebdd4f22SBryan O'Donoghue {0x001C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 159ebdd4f22SBryan O'Donoghue {0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 160ebdd4f22SBryan O'Donoghue {0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 161ebdd4f22SBryan O'Donoghue {0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 162ebdd4f22SBryan O'Donoghue {0x0000, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS}, 163ebdd4f22SBryan O'Donoghue {0x0008, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 164ebdd4f22SBryan O'Donoghue {0x000C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 165ebdd4f22SBryan O'Donoghue {0x0010, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 166ebdd4f22SBryan O'Donoghue {0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 167ebdd4f22SBryan O'Donoghue {0x0060, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 168ebdd4f22SBryan O'Donoghue {0x0064, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 169ebdd4f22SBryan O'Donoghue }, 170ebdd4f22SBryan O'Donoghue { 171ebdd4f22SBryan O'Donoghue {0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 172ebdd4f22SBryan O'Donoghue {0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 173ebdd4f22SBryan O'Donoghue {0x0734, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 174ebdd4f22SBryan O'Donoghue {0x071C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 175ebdd4f22SBryan O'Donoghue {0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 176ebdd4f22SBryan O'Donoghue {0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS}, 177ebdd4f22SBryan O'Donoghue {0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 178ebdd4f22SBryan O'Donoghue {0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS}, 179ebdd4f22SBryan O'Donoghue {0x0708, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 180ebdd4f22SBryan O'Donoghue {0x070C, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS}, 181ebdd4f22SBryan O'Donoghue {0x0710, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 182ebdd4f22SBryan O'Donoghue {0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS}, 183ebdd4f22SBryan O'Donoghue {0x0760, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 184ebdd4f22SBryan O'Donoghue {0x0764, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 185ebdd4f22SBryan O'Donoghue }, 186ebdd4f22SBryan O'Donoghue { 187ebdd4f22SBryan O'Donoghue {0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 188ebdd4f22SBryan O'Donoghue {0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 189ebdd4f22SBryan O'Donoghue {0x0234, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 190ebdd4f22SBryan O'Donoghue {0x021C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 191ebdd4f22SBryan O'Donoghue {0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 192ebdd4f22SBryan O'Donoghue {0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 193ebdd4f22SBryan O'Donoghue {0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 194ebdd4f22SBryan O'Donoghue {0x0200, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS}, 195ebdd4f22SBryan O'Donoghue {0x0208, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 196ebdd4f22SBryan O'Donoghue {0x020C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 197ebdd4f22SBryan O'Donoghue {0x0210, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 198ebdd4f22SBryan O'Donoghue {0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 199ebdd4f22SBryan O'Donoghue {0x0260, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 200ebdd4f22SBryan O'Donoghue {0x0264, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 201ebdd4f22SBryan O'Donoghue }, 202ebdd4f22SBryan O'Donoghue { 203ebdd4f22SBryan O'Donoghue {0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 204ebdd4f22SBryan O'Donoghue {0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 205ebdd4f22SBryan O'Donoghue {0x0434, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 206ebdd4f22SBryan O'Donoghue {0x041C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 207ebdd4f22SBryan O'Donoghue {0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 208ebdd4f22SBryan O'Donoghue {0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 209ebdd4f22SBryan O'Donoghue {0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 210ebdd4f22SBryan O'Donoghue {0x0400, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS}, 211ebdd4f22SBryan O'Donoghue {0x0408, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 212ebdd4f22SBryan O'Donoghue {0x040C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 213ebdd4f22SBryan O'Donoghue {0x0410, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 214ebdd4f22SBryan O'Donoghue {0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 215ebdd4f22SBryan O'Donoghue {0x0460, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 216ebdd4f22SBryan O'Donoghue {0x0464, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 217ebdd4f22SBryan O'Donoghue }, 218ebdd4f22SBryan O'Donoghue { 219ebdd4f22SBryan O'Donoghue {0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 220ebdd4f22SBryan O'Donoghue {0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 221ebdd4f22SBryan O'Donoghue {0x0634, 0x0F, 0x00, CSIPHY_DEFAULT_PARAMS}, 222ebdd4f22SBryan O'Donoghue {0x061C, 0x0A, 0x00, CSIPHY_DEFAULT_PARAMS}, 223ebdd4f22SBryan O'Donoghue {0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 224ebdd4f22SBryan O'Donoghue {0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 225ebdd4f22SBryan O'Donoghue {0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 226ebdd4f22SBryan O'Donoghue {0x0600, 0x90, 0x00, CSIPHY_DEFAULT_PARAMS}, 227ebdd4f22SBryan O'Donoghue {0x0608, 0x0E, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 228ebdd4f22SBryan O'Donoghue {0x060C, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 229ebdd4f22SBryan O'Donoghue {0x0610, 0x52, 0x00, CSIPHY_DEFAULT_PARAMS}, 230ebdd4f22SBryan O'Donoghue {0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 231ebdd4f22SBryan O'Donoghue {0x0660, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 232ebdd4f22SBryan O'Donoghue {0x0664, 0x7F, 0x00, CSIPHY_DEFAULT_PARAMS}, 233ebdd4f22SBryan O'Donoghue }, 234ebdd4f22SBryan O'Donoghue }; 235ebdd4f22SBryan O'Donoghue 23653655d2aSJonathan Marek /* GEN2 1.2.1 2PH */ 23753655d2aSJonathan Marek static const struct 23853655d2aSJonathan Marek csiphy_reg_t lane_regs_sm8250[5][20] = { 23953655d2aSJonathan Marek { 24053655d2aSJonathan Marek {0x0030, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 24153655d2aSJonathan Marek {0x0900, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS}, 24253655d2aSJonathan Marek {0x0908, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS}, 24353655d2aSJonathan Marek {0x0904, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 24453655d2aSJonathan Marek {0x0904, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 24553655d2aSJonathan Marek {0x0004, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 24653655d2aSJonathan Marek {0x002C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 24753655d2aSJonathan Marek {0x0034, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 24853655d2aSJonathan Marek {0x0010, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 24953655d2aSJonathan Marek {0x001C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS}, 25053655d2aSJonathan Marek {0x003C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 25153655d2aSJonathan Marek {0x0008, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 25253655d2aSJonathan Marek {0x0000, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS}, 25353655d2aSJonathan Marek {0x000c, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 25453655d2aSJonathan Marek {0x0038, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 25553655d2aSJonathan Marek {0x0014, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 25653655d2aSJonathan Marek {0x0028, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 25753655d2aSJonathan Marek {0x0024, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 25853655d2aSJonathan Marek {0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 25953655d2aSJonathan Marek {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 26053655d2aSJonathan Marek }, 26153655d2aSJonathan Marek { 26253655d2aSJonathan Marek {0x0730, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 26353655d2aSJonathan Marek {0x0C80, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS}, 26453655d2aSJonathan Marek {0x0C88, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS}, 26553655d2aSJonathan Marek {0x0C84, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 26653655d2aSJonathan Marek {0x0C84, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 26753655d2aSJonathan Marek {0x0704, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 26853655d2aSJonathan Marek {0x072C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 26953655d2aSJonathan Marek {0x0734, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 27053655d2aSJonathan Marek {0x0710, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 27153655d2aSJonathan Marek {0x071C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS}, 27253655d2aSJonathan Marek {0x073C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 27353655d2aSJonathan Marek {0x0708, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 27453655d2aSJonathan Marek {0x0700, 0x80, 0x00, CSIPHY_DEFAULT_PARAMS}, 27553655d2aSJonathan Marek {0x070c, 0xA5, 0x00, CSIPHY_DEFAULT_PARAMS}, 27653655d2aSJonathan Marek {0x0738, 0x1F, 0x00, CSIPHY_DEFAULT_PARAMS}, 27753655d2aSJonathan Marek {0x0714, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 27853655d2aSJonathan Marek {0x0728, 0x04, 0x00, CSIPHY_DEFAULT_PARAMS}, 27953655d2aSJonathan Marek {0x0724, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 28053655d2aSJonathan Marek {0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 28153655d2aSJonathan Marek {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 28253655d2aSJonathan Marek }, 28353655d2aSJonathan Marek { 28453655d2aSJonathan Marek {0x0230, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 28553655d2aSJonathan Marek {0x0A00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS}, 28653655d2aSJonathan Marek {0x0A08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS}, 28753655d2aSJonathan Marek {0x0A04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 28853655d2aSJonathan Marek {0x0A04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 28953655d2aSJonathan Marek {0x0204, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 29053655d2aSJonathan Marek {0x022C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 29153655d2aSJonathan Marek {0x0234, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 29253655d2aSJonathan Marek {0x0210, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 29353655d2aSJonathan Marek {0x021C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS}, 29453655d2aSJonathan Marek {0x023C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 29553655d2aSJonathan Marek {0x0208, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 29653655d2aSJonathan Marek {0x0200, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS}, 29753655d2aSJonathan Marek {0x020c, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 29853655d2aSJonathan Marek {0x0238, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 29953655d2aSJonathan Marek {0x0214, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 30053655d2aSJonathan Marek {0x0228, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 30153655d2aSJonathan Marek {0x0224, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 30253655d2aSJonathan Marek {0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 30353655d2aSJonathan Marek {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 30453655d2aSJonathan Marek }, 30553655d2aSJonathan Marek { 30653655d2aSJonathan Marek {0x0430, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 30753655d2aSJonathan Marek {0x0B00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS}, 30853655d2aSJonathan Marek {0x0B08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS}, 30953655d2aSJonathan Marek {0x0B04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 31053655d2aSJonathan Marek {0x0B04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 31153655d2aSJonathan Marek {0x0404, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 31253655d2aSJonathan Marek {0x042C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 31353655d2aSJonathan Marek {0x0434, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 31453655d2aSJonathan Marek {0x0410, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 31553655d2aSJonathan Marek {0x041C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS}, 31653655d2aSJonathan Marek {0x043C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 31753655d2aSJonathan Marek {0x0408, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 31853655d2aSJonathan Marek {0x0400, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS}, 31953655d2aSJonathan Marek {0x040c, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 32053655d2aSJonathan Marek {0x0438, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 32153655d2aSJonathan Marek {0x0414, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 32253655d2aSJonathan Marek {0x0428, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 32353655d2aSJonathan Marek {0x0424, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 32453655d2aSJonathan Marek {0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 32553655d2aSJonathan Marek {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 32653655d2aSJonathan Marek }, 32753655d2aSJonathan Marek { 32853655d2aSJonathan Marek {0x0630, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 32953655d2aSJonathan Marek {0x0C00, 0x05, 0x00, CSIPHY_DEFAULT_PARAMS}, 33053655d2aSJonathan Marek {0x0C08, 0x10, 0x00, CSIPHY_DEFAULT_PARAMS}, 33153655d2aSJonathan Marek {0x0C04, 0x00, 0x00, CSIPHY_DEFAULT_PARAMS}, 33253655d2aSJonathan Marek {0x0C04, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 33353655d2aSJonathan Marek {0x0604, 0x0C, 0x00, CSIPHY_DEFAULT_PARAMS}, 33453655d2aSJonathan Marek {0x062C, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 33553655d2aSJonathan Marek {0x0634, 0x07, 0x00, CSIPHY_DEFAULT_PARAMS}, 33653655d2aSJonathan Marek {0x0610, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 33753655d2aSJonathan Marek {0x061C, 0x08, 0x00, CSIPHY_DEFAULT_PARAMS}, 33853655d2aSJonathan Marek {0x063C, 0xB8, 0x00, CSIPHY_DEFAULT_PARAMS}, 33953655d2aSJonathan Marek {0x0608, 0x10, 0x00, CSIPHY_SETTLE_CNT_LOWER_BYTE}, 34053655d2aSJonathan Marek {0x0600, 0x8D, 0x00, CSIPHY_DEFAULT_PARAMS}, 34153655d2aSJonathan Marek {0x060c, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 34253655d2aSJonathan Marek {0x0638, 0xFE, 0x00, CSIPHY_DEFAULT_PARAMS}, 34353655d2aSJonathan Marek {0x0614, 0x60, 0x00, CSIPHY_DEFAULT_PARAMS}, 34453655d2aSJonathan Marek {0x0628, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 34553655d2aSJonathan Marek {0x0624, 0x00, 0x00, CSIPHY_DNP_PARAMS}, 34653655d2aSJonathan Marek {0x0800, 0x02, 0x00, CSIPHY_DEFAULT_PARAMS}, 34753655d2aSJonathan Marek {0x0884, 0x01, 0x00, CSIPHY_DEFAULT_PARAMS}, 34853655d2aSJonathan Marek }, 34953655d2aSJonathan Marek }; 35053655d2aSJonathan Marek 3514138a88bSTodor Tomov static void csiphy_hw_version_read(struct csiphy_device *csiphy, 3524138a88bSTodor Tomov struct device *dev) 3534138a88bSTodor Tomov { 3544138a88bSTodor Tomov u32 hw_version; 3554138a88bSTodor Tomov 3564138a88bSTodor Tomov writel(CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID, 3574138a88bSTodor Tomov csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6)); 3584138a88bSTodor Tomov 3594138a88bSTodor Tomov hw_version = readl_relaxed(csiphy->base + 3604138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(12)); 3614138a88bSTodor Tomov hw_version |= readl_relaxed(csiphy->base + 3624138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(13)) << 8; 3634138a88bSTodor Tomov hw_version |= readl_relaxed(csiphy->base + 3644138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(14)) << 16; 3654138a88bSTodor Tomov hw_version |= readl_relaxed(csiphy->base + 3664138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(15)) << 24; 3674138a88bSTodor Tomov 368dd89115aSJonathan Marek dev_dbg(dev, "CSIPHY 3PH HW Version = 0x%08x\n", hw_version); 3694138a88bSTodor Tomov } 3704138a88bSTodor Tomov 3714138a88bSTodor Tomov /* 3724138a88bSTodor Tomov * csiphy_reset - Perform software reset on CSIPHY module 3734138a88bSTodor Tomov * @csiphy: CSIPHY device 3744138a88bSTodor Tomov */ 3754138a88bSTodor Tomov static void csiphy_reset(struct csiphy_device *csiphy) 3764138a88bSTodor Tomov { 3774138a88bSTodor Tomov writel_relaxed(0x1, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0)); 3784138a88bSTodor Tomov usleep_range(5000, 8000); 3794138a88bSTodor Tomov writel_relaxed(0x0, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0)); 3804138a88bSTodor Tomov } 3814138a88bSTodor Tomov 3824138a88bSTodor Tomov static irqreturn_t csiphy_isr(int irq, void *dev) 3834138a88bSTodor Tomov { 3844138a88bSTodor Tomov struct csiphy_device *csiphy = dev; 3854138a88bSTodor Tomov int i; 3864138a88bSTodor Tomov 3874138a88bSTodor Tomov for (i = 0; i < 11; i++) { 3884138a88bSTodor Tomov int c = i + 22; 3894138a88bSTodor Tomov u8 val = readl_relaxed(csiphy->base + 3904138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(i)); 3914138a88bSTodor Tomov 3924138a88bSTodor Tomov writel_relaxed(val, csiphy->base + 3934138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(c)); 3944138a88bSTodor Tomov } 3954138a88bSTodor Tomov 3964138a88bSTodor Tomov writel_relaxed(0x1, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(10)); 3974138a88bSTodor Tomov writel_relaxed(0x0, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(10)); 3984138a88bSTodor Tomov 3994138a88bSTodor Tomov for (i = 22; i < 33; i++) 4004138a88bSTodor Tomov writel_relaxed(0x0, csiphy->base + 4014138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(i)); 4024138a88bSTodor Tomov 4034138a88bSTodor Tomov return IRQ_HANDLED; 4044138a88bSTodor Tomov } 4054138a88bSTodor Tomov 4064138a88bSTodor Tomov /* 4074138a88bSTodor Tomov * csiphy_settle_cnt_calc - Calculate settle count value 4084138a88bSTodor Tomov * 4094138a88bSTodor Tomov * Helper function to calculate settle count value. This is 4104138a88bSTodor Tomov * based on the CSI2 T_hs_settle parameter which in turn 41178c2cc28SAndrey Konovalov * is calculated based on the CSI2 transmitter link frequency. 4124138a88bSTodor Tomov * 41378c2cc28SAndrey Konovalov * Return settle count value or 0 if the CSI2 link frequency 41478c2cc28SAndrey Konovalov * is not available 4154138a88bSTodor Tomov */ 41678c2cc28SAndrey Konovalov static u8 csiphy_settle_cnt_calc(s64 link_freq, u32 timer_clk_rate) 4174138a88bSTodor Tomov { 4184138a88bSTodor Tomov u32 ui; /* ps */ 4194138a88bSTodor Tomov u32 timer_period; /* ps */ 4204138a88bSTodor Tomov u32 t_hs_prepare_max; /* ps */ 4214138a88bSTodor Tomov u32 t_hs_settle; /* ps */ 4224138a88bSTodor Tomov u8 settle_cnt; 4234138a88bSTodor Tomov 42478c2cc28SAndrey Konovalov if (link_freq <= 0) 42578c2cc28SAndrey Konovalov return 0; 42678c2cc28SAndrey Konovalov 42778c2cc28SAndrey Konovalov ui = div_u64(1000000000000LL, link_freq); 4284138a88bSTodor Tomov ui /= 2; 4294138a88bSTodor Tomov t_hs_prepare_max = 85000 + 6 * ui; 4304138a88bSTodor Tomov t_hs_settle = t_hs_prepare_max; 4314138a88bSTodor Tomov 4324138a88bSTodor Tomov timer_period = div_u64(1000000000000LL, timer_clk_rate); 4334138a88bSTodor Tomov settle_cnt = t_hs_settle / timer_period - 6; 4344138a88bSTodor Tomov 4354138a88bSTodor Tomov return settle_cnt; 4364138a88bSTodor Tomov } 4374138a88bSTodor Tomov 4382f8b6719SRobert Foss static void csiphy_gen1_config_lanes(struct csiphy_device *csiphy, 4394138a88bSTodor Tomov struct csiphy_config *cfg, 4402f8b6719SRobert Foss u8 settle_cnt) 4414138a88bSTodor Tomov { 4424138a88bSTodor Tomov struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg; 4432f8b6719SRobert Foss int i, l = 0; 4442f8b6719SRobert Foss u8 val; 4454138a88bSTodor Tomov 4464138a88bSTodor Tomov for (i = 0; i <= c->num_data; i++) { 4474138a88bSTodor Tomov if (i == c->num_data) 4484138a88bSTodor Tomov l = 7; 4494138a88bSTodor Tomov else 4504138a88bSTodor Tomov l = c->data[i].pos * 2; 4514138a88bSTodor Tomov 4524138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG; 4534138a88bSTodor Tomov val |= 0x17; 4544138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG1(l)); 4554138a88bSTodor Tomov 4564138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG2_LP_REC_EN_INT; 4574138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG2(l)); 4584138a88bSTodor Tomov 4594138a88bSTodor Tomov val = settle_cnt; 4604138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG3(l)); 4614138a88bSTodor Tomov 4624138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG5_T_HS_DTERM | 4634138a88bSTodor Tomov CSIPHY_3PH_LNn_CFG5_HS_REC_EQ_FQ_INT; 4644138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG5(l)); 4654138a88bSTodor Tomov 4664138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG6_SWI_FORCE_INIT_EXIT; 4674138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG6(l)); 4684138a88bSTodor Tomov 4694138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG7_SWI_T_INIT; 4704138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG7(l)); 4714138a88bSTodor Tomov 4724138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG8_SWI_SKIP_WAKEUP | 4734138a88bSTodor Tomov CSIPHY_3PH_LNn_CFG8_SKEW_FILTER_ENABLE; 4744138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG8(l)); 4754138a88bSTodor Tomov 4764138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG9_SWI_T_WAKEUP; 4774138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG9(l)); 4784138a88bSTodor Tomov 4794138a88bSTodor Tomov val = CSIPHY_3PH_LNn_TEST_IMP_HS_TERM_IMP; 4804138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_TEST_IMP(l)); 4814138a88bSTodor Tomov 4824138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL; 4834138a88bSTodor Tomov writel_relaxed(val, csiphy->base + 4844138a88bSTodor Tomov CSIPHY_3PH_LNn_CSI_LANE_CTRL15(l)); 4854138a88bSTodor Tomov } 4864138a88bSTodor Tomov 4874138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG1_SWI_REC_DLY_PRG; 4884138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG1(l)); 4894138a88bSTodor Tomov 4905900b051SBryan O'Donoghue if (csiphy->camss->res->version == CAMSS_660) 491e486781bSAngeloGioacchino Del Regno val = CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS_660; 492e486781bSAngeloGioacchino Del Regno else 4934138a88bSTodor Tomov val = CSIPHY_3PH_LNn_CFG4_T_HS_CLK_MISS; 4944138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_CFG4(l)); 4954138a88bSTodor Tomov 4964138a88bSTodor Tomov val = CSIPHY_3PH_LNn_MISC1_IS_CLKLANE; 4974138a88bSTodor Tomov writel_relaxed(val, csiphy->base + CSIPHY_3PH_LNn_MISC1(l)); 4982f8b6719SRobert Foss } 4992f8b6719SRobert Foss 5002f8b6719SRobert Foss static void csiphy_gen2_config_lanes(struct csiphy_device *csiphy, 5012f8b6719SRobert Foss u8 settle_cnt) 5022f8b6719SRobert Foss { 50353655d2aSJonathan Marek const struct csiphy_reg_t *r; 50453655d2aSJonathan Marek int i, l, array_size; 5052f8b6719SRobert Foss u32 val; 5062f8b6719SRobert Foss 5075900b051SBryan O'Donoghue switch (csiphy->camss->res->version) { 50853655d2aSJonathan Marek case CAMSS_845: 50953655d2aSJonathan Marek r = &lane_regs_sdm845[0][0]; 51053655d2aSJonathan Marek array_size = ARRAY_SIZE(lane_regs_sdm845[0]); 51153655d2aSJonathan Marek break; 51253655d2aSJonathan Marek case CAMSS_8250: 51353655d2aSJonathan Marek r = &lane_regs_sm8250[0][0]; 51453655d2aSJonathan Marek array_size = ARRAY_SIZE(lane_regs_sm8250[0]); 51553655d2aSJonathan Marek break; 516f2a7ffabSBryan O'Donoghue case CAMSS_8280XP: 517f2a7ffabSBryan O'Donoghue r = &lane_regs_sc8280xp[0][0]; 518f2a7ffabSBryan O'Donoghue array_size = ARRAY_SIZE(lane_regs_sc8280xp[0]); 519f2a7ffabSBryan O'Donoghue break; 52053655d2aSJonathan Marek default: 52105fb9aceSArnd Bergmann WARN(1, "unknown cspi version\n"); 52205fb9aceSArnd Bergmann return; 52353655d2aSJonathan Marek } 5242f8b6719SRobert Foss 52553655d2aSJonathan Marek for (l = 0; l < 5; l++) { 52653655d2aSJonathan Marek for (i = 0; i < array_size; i++, r++) { 5272f8b6719SRobert Foss switch (r->csiphy_param_type) { 5282f8b6719SRobert Foss case CSIPHY_SETTLE_CNT_LOWER_BYTE: 5292f8b6719SRobert Foss val = settle_cnt & 0xff; 5302f8b6719SRobert Foss break; 5312f8b6719SRobert Foss case CSIPHY_DNP_PARAMS: 5322f8b6719SRobert Foss continue; 5332f8b6719SRobert Foss default: 5342f8b6719SRobert Foss val = r->reg_data; 5352f8b6719SRobert Foss break; 5362f8b6719SRobert Foss } 5372f8b6719SRobert Foss writel_relaxed(val, csiphy->base + r->reg_addr); 5382f8b6719SRobert Foss } 5392f8b6719SRobert Foss } 5402f8b6719SRobert Foss } 5412f8b6719SRobert Foss 5424abb2130SRobert Foss static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg) 5434abb2130SRobert Foss { 5444abb2130SRobert Foss u8 lane_mask; 5454abb2130SRobert Foss int i; 5464abb2130SRobert Foss 5474abb2130SRobert Foss lane_mask = CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE; 5484abb2130SRobert Foss 5494abb2130SRobert Foss for (i = 0; i < lane_cfg->num_data; i++) 5504abb2130SRobert Foss lane_mask |= 1 << lane_cfg->data[i].pos; 5514abb2130SRobert Foss 5524abb2130SRobert Foss return lane_mask; 5534abb2130SRobert Foss } 5544abb2130SRobert Foss 555f2a7ffabSBryan O'Donoghue static bool csiphy_is_gen2(u32 version) 556f2a7ffabSBryan O'Donoghue { 557f2a7ffabSBryan O'Donoghue bool ret = false; 558f2a7ffabSBryan O'Donoghue 559f2a7ffabSBryan O'Donoghue switch (version) { 560f2a7ffabSBryan O'Donoghue case CAMSS_845: 561f2a7ffabSBryan O'Donoghue case CAMSS_8250: 562f2a7ffabSBryan O'Donoghue case CAMSS_8280XP: 563f2a7ffabSBryan O'Donoghue ret = true; 564f2a7ffabSBryan O'Donoghue break; 565f2a7ffabSBryan O'Donoghue } 566f2a7ffabSBryan O'Donoghue 567f2a7ffabSBryan O'Donoghue return ret; 568f2a7ffabSBryan O'Donoghue } 569f2a7ffabSBryan O'Donoghue 5702f8b6719SRobert Foss static void csiphy_lanes_enable(struct csiphy_device *csiphy, 5712f8b6719SRobert Foss struct csiphy_config *cfg, 5722f8b6719SRobert Foss s64 link_freq, u8 lane_mask) 5732f8b6719SRobert Foss { 5742f8b6719SRobert Foss struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg; 5752f8b6719SRobert Foss u8 settle_cnt; 5762f8b6719SRobert Foss u8 val; 5772f8b6719SRobert Foss int i; 5782f8b6719SRobert Foss 5792f8b6719SRobert Foss settle_cnt = csiphy_settle_cnt_calc(link_freq, csiphy->timer_clk_rate); 5802f8b6719SRobert Foss 581d8f7e1a6SBryan O'Donoghue val = CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE; 5822f8b6719SRobert Foss for (i = 0; i < c->num_data; i++) 5832f8b6719SRobert Foss val |= BIT(c->data[i].pos * 2); 5842f8b6719SRobert Foss 5852f8b6719SRobert Foss writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(5)); 5862f8b6719SRobert Foss 5872f8b6719SRobert Foss val = CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B; 5882f8b6719SRobert Foss writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6)); 5892f8b6719SRobert Foss 5902f8b6719SRobert Foss val = 0x02; 5912f8b6719SRobert Foss writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(7)); 5922f8b6719SRobert Foss 5932f8b6719SRobert Foss val = 0x00; 5942f8b6719SRobert Foss writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0)); 5952f8b6719SRobert Foss 596f2a7ffabSBryan O'Donoghue if (csiphy_is_gen2(csiphy->camss->res->version)) 5972f8b6719SRobert Foss csiphy_gen2_config_lanes(csiphy, settle_cnt); 59853655d2aSJonathan Marek else 59953655d2aSJonathan Marek csiphy_gen1_config_lanes(csiphy, cfg, settle_cnt); 6004138a88bSTodor Tomov 601c6b6def9SJonathan Marek /* IRQ_MASK registers - disable all interrupts */ 602c6b6def9SJonathan Marek for (i = 11; i < 22; i++) 603c6b6def9SJonathan Marek writel_relaxed(0, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(i)); 6044138a88bSTodor Tomov } 6054138a88bSTodor Tomov 6064138a88bSTodor Tomov static void csiphy_lanes_disable(struct csiphy_device *csiphy, 6074138a88bSTodor Tomov struct csiphy_config *cfg) 6084138a88bSTodor Tomov { 6094138a88bSTodor Tomov writel_relaxed(0, csiphy->base + 6104138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(5)); 6114138a88bSTodor Tomov 6124138a88bSTodor Tomov writel_relaxed(0, csiphy->base + 6134138a88bSTodor Tomov CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6)); 6144138a88bSTodor Tomov } 6154138a88bSTodor Tomov 6164138a88bSTodor Tomov const struct csiphy_hw_ops csiphy_ops_3ph_1_0 = { 6174abb2130SRobert Foss .get_lane_mask = csiphy_get_lane_mask, 6184138a88bSTodor Tomov .hw_version_read = csiphy_hw_version_read, 6194138a88bSTodor Tomov .reset = csiphy_reset, 6204138a88bSTodor Tomov .lanes_enable = csiphy_lanes_enable, 6214138a88bSTodor Tomov .lanes_disable = csiphy_lanes_disable, 6224138a88bSTodor Tomov .isr = csiphy_isr, 6234138a88bSTodor Tomov }; 624