On Mon Jan 13 10:01:23 2025 +0530, Bryan O'Donoghue wrote:
> New versions of the CSIPHY locate the control registers at offset 0x1000
> not offset 0x800.
> 
> Provide a variable to base an offset from for the purposes of redirecting
> the base offset for the new PHY regs layout.
> 
> The existing setup bases from 0x800, the new from 0x1000 with some of the
> 'EXT' registers dropped but the lower-order lane config regs at offset 0x00
> and up the same as before.
> 
> Signed-off-by: Bryan O'Donoghue <bryan.odonog...@linaro.org>
> Signed-off-by: Depeng Shao <quic_depe...@quicinc.com>
> Reviewed-by: Vladimir Zapolskiy <vladimir.zapols...@linaro.org>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 .../platform/qcom/camss/camss-csiphy-3ph-1-0.c     | 67 ++++++++++++++--------
 drivers/media/platform/qcom/camss/camss-csiphy.h   |  1 +
 2 files changed, 44 insertions(+), 24 deletions(-)

---

diff --git a/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c 
b/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c
index 39cc7109ccf0..b5a116ced6a7 100644
--- a/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c
+++ b/drivers/media/platform/qcom/camss/camss-csiphy-3ph-1-0.c
@@ -42,11 +42,11 @@
 #define CSIPHY_3PH_LNn_CSI_LANE_CTRL15(n)      (0x03c + 0x100 * (n))
 #define CSIPHY_3PH_LNn_CSI_LANE_CTRL15_SWI_SOT_SYMBOL  0xb8
 
-#define CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(n)     (0x800 + 0x4 * (n))
+#define CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(offset, n)     ((offset) + 0x4 * (n))
 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL5_CLK_ENABLE     BIT(7)
 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B BIT(0)
 #define CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID    BIT(1)
-#define CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(n)   (0x8b0 + 0x4 * (n))
+#define CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(offset, n)   ((offset) + 0xb0 + 0x4 
* (n))
 
 #define CSIPHY_DEFAULT_PARAMS          0
 #define CSIPHY_LANE_ENABLE             1
@@ -321,19 +321,20 @@ csiphy_lane_regs lane_regs_sm8250[] = {
 static void csiphy_hw_version_read(struct csiphy_device *csiphy,
                                   struct device *dev)
 {
+       struct csiphy_device_regs *regs = csiphy->regs;
        u32 hw_version;
 
-       writel(CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID,
-              csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6));
+       writel(CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_SHOW_REV_ID, csiphy->base +
+              CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
 
        hw_version = readl_relaxed(csiphy->base +
-                                  CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(12));
+                                  
CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 12));
        hw_version |= readl_relaxed(csiphy->base +
-                                  CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(13)) << 8;
+                                  
CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 13)) << 8;
        hw_version |= readl_relaxed(csiphy->base +
-                                  CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(14)) << 16;
+                                  
CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 14)) << 16;
        hw_version |= readl_relaxed(csiphy->base +
-                                  CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(15)) << 24;
+                                  
CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, 15)) << 24;
 
        dev_dbg(dev, "CSIPHY 3PH HW Version = 0x%08x\n", hw_version);
 }
@@ -344,31 +345,39 @@ static void csiphy_hw_version_read(struct csiphy_device 
*csiphy,
  */
 static void csiphy_reset(struct csiphy_device *csiphy)
 {
-       writel_relaxed(0x1, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0));
+       struct csiphy_device_regs *regs = csiphy->regs;
+
+       writel_relaxed(0x1, csiphy->base +
+                     CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
        usleep_range(5000, 8000);
-       writel_relaxed(0x0, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0));
+       writel_relaxed(0x0, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
 }
 
 static irqreturn_t csiphy_isr(int irq, void *dev)
 {
        struct csiphy_device *csiphy = dev;
+       struct csiphy_device_regs *regs = csiphy->regs;
        int i;
 
        for (i = 0; i < 11; i++) {
                int c = i + 22;
                u8 val = readl_relaxed(csiphy->base +
-                                      CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(i));
+                                      
CSIPHY_3PH_CMN_CSI_COMMON_STATUSn(regs->offset, i));
 
                writel_relaxed(val, csiphy->base +
-                                   CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(c));
+                              CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 
c));
        }
 
-       writel_relaxed(0x1, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(10));
-       writel_relaxed(0x0, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(10));
+       writel_relaxed(0x1, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 10));
+       writel_relaxed(0x0, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 10));
 
-       for (i = 22; i < 33; i++)
+       for (i = 22; i < 33; i++) {
                writel_relaxed(0x0, csiphy->base +
-                                   CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(i));
+                              CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 
i));
+       }
 
        return IRQ_HANDLED;
 }
@@ -523,6 +532,7 @@ static void csiphy_lanes_enable(struct csiphy_device 
*csiphy,
                                s64 link_freq, u8 lane_mask)
 {
        struct csiphy_lanes_cfg *c = &cfg->csi2->lane_cfg;
+       struct csiphy_device_regs *regs = csiphy->regs;
        u8 settle_cnt;
        u8 val;
        int i;
@@ -533,16 +543,20 @@ static void csiphy_lanes_enable(struct csiphy_device 
*csiphy,
        for (i = 0; i < c->num_data; i++)
                val |= BIT(c->data[i].pos * 2);
 
-       writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(5));
+       writel_relaxed(val, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 5));
 
        val = CSIPHY_3PH_CMN_CSI_COMMON_CTRL6_COMMON_PWRDN_B;
-       writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6));
+       writel_relaxed(val, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
 
        val = 0x02;
-       writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(7));
+       writel_relaxed(val, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 7));
 
        val = 0x00;
-       writel_relaxed(val, csiphy->base + CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(0));
+       writel_relaxed(val, csiphy->base +
+                      CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 0));
 
        if (csiphy_is_gen2(csiphy->camss->res->version))
                csiphy_gen2_config_lanes(csiphy, settle_cnt);
@@ -550,18 +564,22 @@ static void csiphy_lanes_enable(struct csiphy_device 
*csiphy,
                csiphy_gen1_config_lanes(csiphy, cfg, settle_cnt);
 
        /* IRQ_MASK registers - disable all interrupts */
-       for (i = 11; i < 22; i++)
-               writel_relaxed(0, csiphy->base + 
CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(i));
+       for (i = 11; i < 22; i++) {
+               writel_relaxed(0, csiphy->base +
+                              CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 
i));
+       }
 }
 
 static void csiphy_lanes_disable(struct csiphy_device *csiphy,
                                 struct csiphy_config *cfg)
 {
+       struct csiphy_device_regs *regs = csiphy->regs;
+
        writel_relaxed(0, csiphy->base +
-                         CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(5));
+                         CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 5));
 
        writel_relaxed(0, csiphy->base +
-                         CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(6));
+                         CSIPHY_3PH_CMN_CSI_COMMON_CTRLn(regs->offset, 6));
 }
 
 static int csiphy_init(struct csiphy_device *csiphy)
@@ -574,6 +592,7 @@ static int csiphy_init(struct csiphy_device *csiphy)
                return -ENOMEM;
 
        csiphy->regs = regs;
+       regs->offset = 0x800;
 
        switch (csiphy->camss->res->version) {
        case CAMSS_845:
diff --git a/drivers/media/platform/qcom/camss/camss-csiphy.h 
b/drivers/media/platform/qcom/camss/camss-csiphy.h
index 4d731597fed7..86b98b37838e 100644
--- a/drivers/media/platform/qcom/camss/camss-csiphy.h
+++ b/drivers/media/platform/qcom/camss/camss-csiphy.h
@@ -88,6 +88,7 @@ struct csiphy_subdev_resources {
 struct csiphy_device_regs {
        const struct csiphy_lane_regs *lane_regs;
        int lane_array_size;
+       u32 offset;
 };
 
 struct csiphy_device {

Reply via email to