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

Configure Feed

Select the types of activity you want to include in your feed.

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: 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>

authored by

Adrian Ng Ho Yin and committed by
Alexandre Belloni
de28e002 4cd9d2bf

+9 -4
+9 -4
drivers/i3c/master/dw-i3c-master.c
··· 1718 1718 if (master->free_pos & BIT(pos)) 1719 1719 continue; 1720 1720 1721 - if (master->devs[pos].is_i2c_addr) 1722 - reg_val = DEV_ADDR_TABLE_LEGACY_I2C_DEV | 1721 + reg_val = readl(master->regs + DEV_ADDR_TABLE_LOC(master->datstartaddr, pos)); 1722 + 1723 + if (master->devs[pos].is_i2c_addr) { 1724 + reg_val &= ~DEV_ADDR_TABLE_STATIC_MASK; 1725 + reg_val |= DEV_ADDR_TABLE_LEGACY_I2C_DEV | 1723 1726 DEV_ADDR_TABLE_STATIC_ADDR(master->devs[pos].addr); 1724 - else 1725 - reg_val = DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr); 1727 + } else { 1728 + reg_val &= ~DEV_ADDR_TABLE_DYNAMIC_MASK; 1729 + reg_val |= DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr); 1730 + } 1726 1731 1727 1732 writel(reg_val, master->regs + DEV_ADDR_TABLE_LOC(master->datstartaddr, pos)); 1728 1733 }