[U-Boot] [PATCH 3/3] fsl_i2c: Impl. AN2819, rev 5 to calculate FDR/DFSR
Joakim Tjernlund
joakim.tjernlund at transmode.se
Thu Sep 17 08:38:45 CEST 2009
Heiko Schocher <hs at denx.de> wrote on 17/09/2009 08:00:34:
> Hello Joakim,
Hi Heiko
>
> Joakim Tjernlund wrote:
> > The latest AN2819 has changed the way FDR/DFSR should be calculated.
> > Update the driver according to spec. However, Condition 2
> > is not accounted for as it is not clear how to do so.
>
> Thanks for your work, just some minor Codingstyle comments:
>
> > Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund at transmode.se>
> > ---
> > drivers/i2c/fsl_i2c.c | 88 +++++++++++++++++++++++++++++-------------------
> > 1 files changed, 53 insertions(+), 35 deletions(-)
> >
> > diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c
> > index 0c5f6be..0491a69 100644
> > --- a/drivers/i2c/fsl_i2c.c
> > +++ b/drivers/i2c/fsl_i2c.c
> > @@ -100,29 +100,9 @@ static const struct fsl_i2c *i2c_dev[2] = {
> > #ifdef __PPC__
> > - u8 dfsr;
> > + u8 dfsr, fdr = 0x31; /* Default if no FDR found */
> > + unsigned short A, B, Ga, Gb;
>
> Please do not use mixed-case variables, thanks.
A and B are from the AN2819 spec and I used the same names to ease
identify with the spec. I rather keep them.
>
> > + unsigned long c_div, est_div;
> > +
> > #ifdef CONFIG_FSL_I2C_CUSTOM_DFSR
> > - dfsr = CONFIG_FSL_I2C_CUSTOM_DFSR;
> > + dfsr = CONFIG_FSL_I2C_CUSTOM_DFSR;
> > #else
> > - dfsr = fsl_i2c_speed_map[i].dfsr;
> > -#endif
> > - writeb(dfsr, &dev->dfsrr); /* set default filter */
> > + /* Condition 1: dfsr <= 50/T */
> > + dfsr = (5*(i2c_clk/1000))/(100000);
>
> Please use one space around (on each side of) most binary
> and ternary operators.
Like so?
dfsr = (5 * (i2c_clk / 1000)) / 100000);
>
> > #endif
> > #ifdef CONFIG_FSL_I2C_CUSTOM_FDR
> > - fdr = CONFIG_FSL_I2C_CUSTOM_FDR;
> > - speed = i2c_clk / divider; /* Fake something */
> > + fdr = CONFIG_FSL_I2C_CUSTOM_FDR;
> > + speed = i2c_clk / divider; /* Fake something */
> > #else
> > + debug("Requested speed:%d, i2c_clk:%d\n", speed, i2c_clk);
> > + if (!dfsr)
> > + dfsr = 1;
> > +
> > + est_div = ~0;
> > + for(Ga=0x4, A=10; A<=30; Ga++, A+=2) {
>
> spaces her too.
Like so?
for(Ga = 0x4, A = 10; A <= 30; Ga++, A += 2) {
>
> > + for (Gb=0; Gb<8; Gb++) {
>
> and here too. Please check the whole patch.
>
> > + B = 16 << Gb;
> > + c_div = B * (A + ((3*dfsr)/B)*2);
> > + if (c_div > divider && c_div < est_div) {
>
> Can we make
>
> if ((c_div > divider) && (c_div < est_div)) {
Sure.
More information about the U-Boot
mailing list