Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: camss: csiphy: Move to hardcode CSI Clock Lane number

QCOM ISPs do not support having a programmable CSI Clock Lane number.

In order to accurately reflect this, the different CSIPHY HW versions
need to have their own register layer for computing lane masks.

Signed-off-by: Robert Foss <robert.foss@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>

authored by

Robert Foss and committed by
Mauro Carvalho Chehab
4abb2130 4a92fc6e

+41 -23
+17 -2
drivers/media/platform/qcom/camss/camss-csiphy-2ph-1-0.c
··· 16 16 17 17 #define CAMSS_CSI_PHY_LNn_CFG2(n) (0x004 + 0x40 * (n)) 18 18 #define CAMSS_CSI_PHY_LNn_CFG3(n) (0x008 + 0x40 * (n)) 19 + #define CAMSS_CSI_PHY_LN_CLK 1 19 20 #define CAMSS_CSI_PHY_GLBL_RESET 0x140 20 21 #define CAMSS_CSI_PHY_GLBL_PWR_CFG 0x144 21 22 #define CAMSS_CSI_PHY_GLBL_IRQ_CMD 0x164 ··· 26 25 #define CAMSS_CSI_PHY_INTERRUPT_CLEARn(n) (0x1cc + 0x4 * (n)) 27 26 #define CAMSS_CSI_PHY_GLBL_T_INIT_CFG0 0x1ec 28 27 #define CAMSS_CSI_PHY_T_WAKEUP_CFG0 0x1f4 28 + 29 + static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg) 30 + { 31 + u8 lane_mask; 32 + int i; 33 + 34 + lane_mask = 1 << CAMSS_CSI_PHY_LN_CLK; 35 + 36 + for (i = 0; i < lane_cfg->num_data; i++) 37 + lane_mask |= 1 << lane_cfg->data[i].pos; 38 + 39 + return lane_mask; 40 + } 29 41 30 42 static void csiphy_hw_version_read(struct csiphy_device *csiphy, 31 43 struct device *dev) ··· 119 105 120 106 for (i = 0; i <= c->num_data; i++) { 121 107 if (i == c->num_data) 122 - l = c->clk.pos; 108 + l = CAMSS_CSI_PHY_LN_CLK; 123 109 else 124 110 l = c->data[i].pos; 125 111 ··· 143 129 144 130 for (i = 0; i <= c->num_data; i++) { 145 131 if (i == c->num_data) 146 - l = c->clk.pos; 132 + l = CAMSS_CSI_PHY_LN_CLK; 147 133 else 148 134 l = c->data[i].pos; 149 135 ··· 181 167 } 182 168 183 169 const struct csiphy_hw_ops csiphy_ops_2ph_1_0 = { 170 + .get_lane_mask = csiphy_get_lane_mask, 184 171 .hw_version_read = csiphy_hw_version_read, 185 172 .reset = csiphy_reset, 186 173 .lanes_enable = csiphy_lanes_enable,
+16 -1
drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c
··· 43 43 #define CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL 0xb8 44 44 45 45 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(n) (0x800 + 0x4 * (n)) 46 + #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE BIT(7) 46 47 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B BIT(0) 47 48 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID BIT(1) 48 49 #define CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(n) (0x8b0 + 0x4 * (n)) ··· 449 448 } 450 449 } 451 450 451 + static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg) 452 + { 453 + u8 lane_mask; 454 + int i; 455 + 456 + lane_mask = CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE; 457 + 458 + for (i = 0; i < lane_cfg->num_data; i++) 459 + lane_mask |= 1 << lane_cfg->data[i].pos; 460 + 461 + return lane_mask; 462 + } 463 + 452 464 static void csiphy_lanes_enable(struct csiphy_device *csiphy, 453 465 struct csiphy_config *cfg, 454 466 s64 link_freq, u8 lane_mask) ··· 475 461 476 462 settle_cnt = csiphy_settle_cnt_calc(link_freq, csiphy->timer_clk_rate); 477 463 478 - val = is_gen2 ? BIT(7) : BIT(c->clk.pos); 464 + val = is_gen2 ? BIT(7) : CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE; 479 465 for (i = 0; i < c->num_data; i++) 480 466 val |= BIT(c->data[i].pos * 2); 481 467 ··· 511 497 } 512 498 513 499 const struct csiphy_hw_ops csiphy_ops_3ph_1_0 = { 500 + .get_lane_mask = csiphy_get_lane_mask, 514 501 .hw_version_read = csiphy_hw_version_read, 515 502 .reset = csiphy_reset, 516 503 .lanes_enable = csiphy_lanes_enable,
+1 -20
drivers/media/platform/qcom/camss/camss-csiphy.c
··· 231 231 } 232 232 233 233 /* 234 - * csiphy_get_lane_mask - Calculate CSI2 lane mask configuration parameter 235 - * @lane_cfg - CSI2 lane configuration 236 - * 237 - * Return lane mask 238 - */ 239 - static u8 csiphy_get_lane_mask(struct csiphy_lanes_cfg *lane_cfg) 240 - { 241 - u8 lane_mask; 242 - int i; 243 - 244 - lane_mask = 1 << lane_cfg->clk.pos; 245 - 246 - for (i = 0; i < lane_cfg->num_data; i++) 247 - lane_mask |= 1 << lane_cfg->data[i].pos; 248 - 249 - return lane_mask; 250 - } 251 - 252 - /* 253 234 * csiphy_stream_on - Enable streaming on CSIPHY module 254 235 * @csiphy: CSIPHY device 255 236 * ··· 243 262 { 244 263 struct csiphy_config *cfg = &csiphy->cfg; 245 264 s64 link_freq; 246 - u8 lane_mask = csiphy_get_lane_mask(&cfg->csi2->lane_cfg); 265 + u8 lane_mask = csiphy->ops->get_lane_mask(&cfg->csi2->lane_cfg); 247 266 u8 bpp = csiphy_get_bpp(csiphy->formats, csiphy->nformats, 248 267 csiphy->fmt[MSM_CSIPHY_PAD_SINK].code); 249 268 u8 num_lanes = csiphy->cfg.csi2->lane_cfg.num_data;
+7
drivers/media/platform/qcom/camss/camss-csiphy.h
··· 45 45 struct csiphy_device; 46 46 47 47 struct csiphy_hw_ops { 48 + /* 49 + * csiphy_get_lane_mask - Calculate CSI2 lane mask configuration parameter 50 + * @lane_cfg - CSI2 lane configuration 51 + * 52 + * Return lane mask 53 + */ 54 + u8 (*get_lane_mask)(struct csiphy_lanes_cfg *lane_cfg); 48 55 void (*hw_version_read)(struct csiphy_device *csiphy, 49 56 struct device *dev); 50 57 void (*reset)(struct csiphy_device *csiphy);