On Fri Dec 6 10:26:43 2024 +0200, Tomi Valkeinen wrote:
> Normally the driver accesses both the RX and the TX port registers via a
> paging mechanism: one register is used to select the page (i.e. the
> port), which dictates the port used when accessing the port specific
> registers.
> 
> The downside to this is that while debugging it's almost impossible to
> access the port specific registers from the userspace, as the driver can
> change the page at any moment.
> 
> The hardware supports another access mechanism: using the I2C_RX_ID
> registers (one for each RX port), i2c addresses can be chosen which,
> when accessed, will always use the specific port's registers, skipping
> the paging mechanism.
> 
> The support is only for the RX port, but it has proven very handy while
> debugging and testing. So let's add the code for this, but hide it
> behind a disabled define.
> 
> Reviewed-by: Jai Luthra <jai.lut...@ideasonboard.com>
> Signed-off-by: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>
> Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+hua...@kernel.org>

Patch committed.

Thanks,
Mauro Carvalho Chehab

 drivers/media/i2c/ds90ub960.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

---

diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
index eb833d3f0405..670edb1e3e75 100644
--- a/drivers/media/i2c/ds90ub960.c
+++ b/drivers/media/i2c/ds90ub960.c
@@ -54,6 +54,15 @@
 
 #define MHZ(v) ((u32)((v) * HZ_PER_MHZ))
 
+/*
+ * If this is defined, the i2c addresses from UB960_DEBUG_I2C_RX_ID to
+ * UB960_DEBUG_I2C_RX_ID + 3 can be used to access the paged RX port registers
+ * directly.
+ *
+ * Only for debug purposes.
+ */
+/* #define UB960_DEBUG_I2C_RX_ID       0x40 */
+
 #define UB960_POLL_TIME_MS     500
 
 #define UB960_MAX_RX_NPORTS    4
@@ -350,7 +359,7 @@
 #define UB960_SR_FPD3_RX_ID(n)                 (0xf0 + (n))
 #define UB960_SR_FPD3_RX_ID_LEN                        6
 
-#define UB960_SR_I2C_RX_ID(n)                  (0xf8 + (n)) /* < 
UB960_FPD_RX_NPORTS */
+#define UB960_SR_I2C_RX_ID(n)                  (0xf8 + (n))
 
 #define UB9702_SR_REFCLK_FREQ                  0x3d
 
@@ -3998,6 +4007,12 @@ static int ub960_probe(struct i2c_client *client)
        schedule_delayed_work(&priv->poll_work,
                              msecs_to_jiffies(UB960_POLL_TIME_MS));
 
+#ifdef UB960_DEBUG_I2C_RX_ID
+       for (unsigned int i = 0; i < priv->hw_data->num_rxports; i++)
+               ub960_write(priv, UB960_SR_I2C_RX_ID(i),
+                           (UB960_DEBUG_I2C_RX_ID + i) << 1);
+#endif
+
        return 0;
 
 err_free_sers:

Reply via email to