]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i3c: dw: Preserve DAT entry bits when restoring addresses
authorAdrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Fri, 12 Dec 2025 09:02:58 +0000 (17:02 +0800)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Tue, 13 Jan 2026 17:26:47 +0000 (18:26 +0100)
Update dw_i3c_master_restore_addrs() to preserve existing bits in each
Device Address Table (DAT) entry when restoring addresses. This prevents
overwriting configuration bits during PM runtime resumes.

Signed-off-by: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/46112c0da44110f46709cb0e7a4595e312b95c10.1765529948.git.adrianhoyin.ng@altera.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/dw-i3c-master.c

index 791a8387d4e0c1b9cec33ca0f3c680ad40957543..48af00659e194cfc5e083b93f8c5d26c959f37e2 100644 (file)
@@ -1718,11 +1718,16 @@ static void dw_i3c_master_restore_addrs(struct dw_i3c_master *master)
                if (master->free_pos & BIT(pos))
                        continue;
 
-               if (master->devs[pos].is_i2c_addr)
-                       reg_val = DEV_ADDR_TABLE_LEGACY_I2C_DEV |
+               reg_val = readl(master->regs + DEV_ADDR_TABLE_LOC(master->datstartaddr, pos));
+
+               if (master->devs[pos].is_i2c_addr) {
+                       reg_val &= ~DEV_ADDR_TABLE_STATIC_MASK;
+                       reg_val |= DEV_ADDR_TABLE_LEGACY_I2C_DEV |
                               DEV_ADDR_TABLE_STATIC_ADDR(master->devs[pos].addr);
-               else
-                       reg_val = DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr);
+               } else {
+                       reg_val &= ~DEV_ADDR_TABLE_DYNAMIC_MASK;
+                       reg_val |= DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr);
+               }
 
                writel(reg_val, master->regs + DEV_ADDR_TABLE_LOC(master->datstartaddr, pos));
        }