From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans de Goede Date: Wed, 18 Mar 2015 09:20:31 +0100 Subject: [U-Boot] [PATCH] i2c: mvtwsi: Fix problem with baud rate calculation In-Reply-To: <55080CD7.8040301@redhat.com> References: <1426586890-10130-1-git-send-email-sr@denx.de> <55080CD7.8040301@redhat.com> Message-ID: <5509354F.7020805@redhat.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi, On 17-03-15 12:15, Hans de Goede wrote: > Hi, > > On 17-03-15 11:08, Stefan Roese wrote: >> The current implementation for baudrate calculation is incorrect. >> This part from the formula: >> >> "2 ^ (n + 1)" is not equivalent to (1 << n) but to (2 << n)! >> >> This patch fixes this and moves this calculation to a function instead of using a macro. > > Hmm, this does not match with what the Allwinner datasheets say: > https://github.com/allwinner-zh/documents/blob/master/A20/A20%20user%20manual%20v1.3%2020141010.pdf > > They say: > > Fsamp = F 0 = Fin / 2^CLK_N > F1 = F0 / (CLK_M + 1) > Foscl = F1 / 10 = Fin / (2^CLK_N * (CLK_M + 1)*10) > > With Foscl being the ultimate i2c speed. Notice that they are talking about > 2 ^ CLK_N not 2 ^ (CLK_N + 1) > > And they have a few examples which match this. Now it could be that a > register value of 0 means CLK_N = 1, reg 1 CLK_N = 2, etc. this is not clearly > specified ... > >> This new function is taken from the Linux kernel. > > Interesting, because on Allwinnner / sunxi devices we are using the kernel > driver formula unmodified, and things seem to work fine despite this. Could > be tolerances allowing this, could be the Allwinner datasheet being unclear. > > I've send allwinner a mail asking them to clarify this. I've just gotten an answer from allwinner, and the formula in their datasheet is correct, with the raw register value == CLK_N so the current (before this patch) u-boot code is correct for Allwinner devices and we need a #ifdef here to keep the old formula for sunxi devices, you can use: #ifdef CONFIG_SUNXI For this. Regards, Hans