On Fri, 3 Jan 2025 11:02:30 +0100 Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx> wrote: > > > > > - (dynaddr_parity(address) ? DAT_0_DYNADDR_PARITY : 0); > > > > > + (parity8(address) ? 0 : DAT_0_DYNADDR_PARITY); > > ... > > > The old code is: > > > -static inline bool dynaddr_parity(unsigned int addr) > > > -{ > > > - addr |= 1 << 7; > > > - addr += addr >> 4; > > > - addr += addr >> 2; > > > - addr += addr >> 1; > > > - return (addr & 1); > > > -} > > > > So: > > 1) it always sets 0x80. > > Right, this is why the arguments of the ternary operator above are > exchanged. The old function was basically 'is_odd'. Provided the high bit isn't already set - which it may not be. > > 2) it uses addition not exclusive or. > > True, but it will work nonetheless because we are only interested in bit > 0 of the result. For one bit, XOR and addition are interchangable. The > overflow to other bits is not important. add: 00010001 => xxxx0010 => xx10 => x1 xor: 00010001 => xxxx0000 => 00xx => x0 > > > So just not the same definition of 'parity'. > > I think it is. I mean, I3C wants odd parity, otherwise it will not work. > And Jarkko kindly confirmed it still works. I bet the target isn't checking... So you might be fixing a bug. David