Commit de28e002 authored by Adrian Ng Ho Yin's avatar Adrian Ng Ho Yin Committed by Alexandre Belloni
Browse files

i3c: dw: Preserve DAT entry bits when restoring addresses



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: default avatarAdrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Reviewed-by: default avatarFrank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/46112c0da44110f46709cb0e7a4595e312b95c10.1765529948.git.adrianhoyin.ng@altera.com


Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
parent 4cd9d2bf
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -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));
	}