From: Eddie Huang <eddie.huang@mediatek.com>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: Wolfram Sang <wsa@the-dreams.de>,
Mark Rutland <mark.rutland@arm.com>,
Xudong Chen <xudong.chen@mediatek.com>,
srv_heupstream@mediatek.com, Pawel Moll <pawel.moll@arm.com>,
Ian Campbell <ijc+devicetree@hellion.org.uk>,
Liguo Zhang <liguo.zhang@mediatek.com>,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
Rob Herring <robh+dt@kernel.org>,
linux-mediatek@lists.infradead.org, linux-i2c@vger.kernel.org,
Sascha Hauer <kernel@pengutronix.de>,
Kumar Gala <galak@codeaurora.org>,
Matthias Brugger <matthias.bgg@gmail.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v8 2/3] I2C: mediatek: Add driver for MediaTek I2C controller
Date: Thu, 21 May 2015 15:01:29 +0800 [thread overview]
Message-ID: <1432191689.28646.11.camel@mtksdaap41> (raw)
In-Reply-To: <20150520085715.GA17078@pengutronix.de>
Hi,
Please see my reply below (I skip comments that already reply in another
mail).
On Wed, 2015-05-20 at 10:57 +0200, Uwe Kleine-König wrote:
> Hello,
>
> now that I understood the formula some more comments to the calculation.
>
> On Tue, May 19, 2015 at 12:40:08AM +0800, Eddie Huang wrote:
> > +#define I2C_DEFAUT_SPEED 100000 /* hz */
> DEFAULT?
>
Yes, will fix.
> > +#define MAX_FS_MODE_SPEED 400000
> > +#define MAX_HS_MODE_SPEED 3400000
> > +#define MAX_SAMPLE_CNT_DIV 8
> > +#define MAX_STEP_CNT_DIV 64
> > +#define MAX_HS_STEP_CNT_DIV 8
> > [...]
> > +/* calculate i2c port speed */
> > +static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int clk_src_in_hz)
> > +{
> add a comment here, that clk_src_in_hz is the parent clock already
> divided by clock-div.
>
We move parent_clk div clock-div in mtk_i2c_set_speed function, I think
this is more clear.
> > + step_div = max_step_cnt;
> > + /* Find the best combination */
> > + khz = i2c->speed_hz / 1000;
> > + hclk = clk_src_in_hz / 1000;
> Why are you dividing here? There shouldn't be an overflow problem and
> you're loosing precision.
OK, will remove div 1000.
>
> > + min_div = ((hclk >> 1) + khz - 1) / khz;
> The shift accounts for the fixed divider 2 in
>
> i2c_bus_freq = parent_clk / (clock-div * 2 * sample_cnt * step_cnt
>
> ? Maybe better call this opt_div instead of min_div?
OK
>
> > + best_mul = MAX_SAMPLE_CNT_DIV * max_step_cnt;
> > +
> > + for (sample_cnt = 1; sample_cnt <= MAX_SAMPLE_CNT_DIV; sample_cnt++) {
> > + step_cnt = (min_div + sample_cnt - 1) / sample_cnt;
> DIV_ROUND_UP
OK
> > +
> > + if (cnt_mul < best_mul) {
> > + best_mul = cnt_mul;
> > + sample_div = sample_cnt;
> > + step_div = step_cnt;
> I'd call these best_sample_cnt and best_step_cnt instead of sample_div
> and step_div.
OK
>
> > + if (best_mul == min_div)
> > + break;
> > + }
> > + }
> > +
> > + sample_cnt = sample_div;
> > + step_cnt = step_div;
> > + sclk = hclk / (2 * sample_cnt * step_cnt);
> > + if (sclk > khz) {
> Can this happen? A better name for "sclk" would be "bus_freq"?
Yes, if i2c->speed_hz is too small, not able to get target_speed using
hardware div.
>
> > + dev_dbg(i2c->dev, "%s mode: unsupported speed (%ldkhz)\n",
> > + (i2c->speed_hz > MAX_HS_MODE_SPEED) ? "HS" : "ST/FT",
> What is ST/FR? I would have expected FS here.
Please skip it.The debug message is too lousy.
>
> > + (long int)khz);
> > + return -EINVAL;
> > + }
> > +
> > + step_cnt--;
> > + sample_cnt--;
> > +
> > + if (i2c->speed_hz > MAX_FS_MODE_SPEED) {
> > + /* Set the hign speed mode register */
> > + i2c->timing_reg = I2C_FS_TIME_INIT_VALUE;
> > + i2c->high_speed_reg = I2C_TIME_DEFAULT_VALUE |
> > + (sample_cnt & I2C_TIMING_SAMPLE_COUNT_MASK) << 12 |
> > + (step_cnt & I2C_TIMING_SAMPLE_COUNT_MASK) << 8;
> > + } else {
> > + i2c->timing_reg =
> > + (sample_cnt & I2C_TIMING_SAMPLE_COUNT_MASK) << 8 |
> > + (step_cnt & I2C_TIMING_STEP_DIV_MASK) << 0;
> > + /* Disable the high speed transaction */
> > + i2c->high_speed_reg = I2C_TIME_CLR_VALUE;
> > + }
> Would it be sensible to write these values directly into hardware here?
No.In some error cases, we want to reinitialize hardware, keep these
values to avoid calculate again.
Eddie
next prev parent reply other threads:[~2015-05-21 7:01 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-18 16:40 [PATCH v8 0/3] ARM: mediatek: Add driver for Mediatek I2C Eddie Huang
[not found] ` <1431967209-5261-1-git-send-email-eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2015-05-18 16:40 ` [PATCH v8 1/3] dt-bindings: Add I2C bindings for mt65xx/mt81xx Eddie Huang
[not found] ` <1431967209-5261-2-git-send-email-eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2015-05-18 18:29 ` Uwe Kleine-König
2015-05-18 16:40 ` [PATCH v8 2/3] I2C: mediatek: Add driver for MediaTek I2C controller Eddie Huang
[not found] ` <1431967209-5261-3-git-send-email-eddie.huang-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
2015-05-18 18:43 ` Uwe Kleine-König
2015-05-19 14:48 ` Matthias Brugger
2015-05-19 19:49 ` Uwe Kleine-König
[not found] ` <20150519194917.GI24769-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2015-05-20 5:33 ` Eddie Huang
2015-05-20 3:07 ` Yingjoe Chen
[not found] ` <20150518184300.GB28888-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2015-05-20 2:40 ` Eddie Huang
2015-05-20 7:11 ` Uwe Kleine-König
[not found] ` <20150520071152.GP24769-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2015-05-20 7:59 ` Eddie Huang
2015-05-20 8:33 ` Uwe Kleine-König
2015-05-20 8:57 ` Uwe Kleine-König
[not found] ` <20150520085715.GA17078-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2015-05-20 13:03 ` Yingjoe Chen
2015-05-20 15:37 ` Uwe Kleine-König
2015-05-21 7:01 ` Eddie Huang [this message]
2015-05-18 16:40 ` [PATCH v8 3/3] I2C: mediatek: Add driver for MediaTek MT8173 " Eddie Huang
2015-05-19 14:45 ` Matthias Brugger
[not found] ` <CABuKBeKJ=V6bP9iU9xDN0JecTTFoLDUfsX_QP5rpPj1bn167Vg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-05-20 2:53 ` Eddie Huang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1432191689.28646.11.camel@mtksdaap41 \
--to=eddie.huang@mediatek.com \
--cc=devicetree@vger.kernel.org \
--cc=galak@codeaurora.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=kernel@pengutronix.de \
--cc=liguo.zhang@mediatek.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=matthias.bgg@gmail.com \
--cc=pawel.moll@arm.com \
--cc=robh+dt@kernel.org \
--cc=srv_heupstream@mediatek.com \
--cc=u.kleine-koenig@pengutronix.de \
--cc=wsa@the-dreams.de \
--cc=xudong.chen@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox