From: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
To: Laurent Pinchart
<laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
Cc: linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Magnus Damm <magnus.damm-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Simon Horman <horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH V2 5/5] i2c: riic: add driver
Date: Thu, 19 Dec 2013 13:06:47 +0100 [thread overview]
Message-ID: <20131219120646.GA2563@katana> (raw)
In-Reply-To: <1407973.m5fTNuo5v5@avalon>
[-- Attachment #1: Type: text/plain, Size: 3206 bytes --]
Hi Laurent,
thanks for the review!
> > +/*
> > + * This i2c core has a lot of interrupts, namely 8. We use their chaining
> > as
> > + * some kind of state machine.
>
> I have mixed feelings about this. Wouldn't it be more efficient to have an
> internal state machine (which you partially have already, using RIIC_INIT_MSG
> for instance) instead of relying on enabling/disabling interrupts ? The latter
> has a larger overhead.
I am not sure I get you here. I need the interrupts anyhow. For example,
after the last byte has been written to the 1-byte-FIFO in the
transmission_irq, I need to wait for the transmission_end_irq to ensure
the bits are already on the wire before I mark the message completed.
Polling for that condition is more overhead than just enabling the
proper interrupt (one write to ICIER). I don't need to switch ISR since
all the interrupts are seperate and have dedicated ISR.
> > +static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int
> > num)
> > +{
> > + struct riic_dev *riic = i2c_get_adapdata(adap);
> > + int i, ret;
>
> One of my favorite bikeshedding comments is to ask for unsigned int when the
> variable can't be negative :-)
OK.
> > + /*
> > + * TODO: Implement formula to calculate the timing values depending on
> > + * variable parent clock rate and arbitrary bus speed
> > + */
> > + rate = clk_get_rate(riic->clk);
> > + if (rate != 33325000) {
> > + dev_err(&riic->adapter.dev,
> > + "invalid parent clk (%lu). Must be 33325000Hz\n", rate);
>
> What about a "goto done;" here and below to avoid repeating the
> clk_disable_unprepare() call ?
Yeah, can be argued that way. I was fine with both.
>
> > + clk_disable_unprepare(riic->clk);
> > + return -EINVAL;
> > + }
> > +
> > + /* Changing the order of accessing IICRST and ICE may break things! */
> > + writeb(ICCR1_IICRST | ICCR1_SOWP, riic->base + RIIC_ICCR1);
> > + riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
> > +
> > + switch (spd) {
> > + case 100000:
> > + writeb(ICMR1_CKS(3), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP100K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP100K, riic->base + RIIC_ICBRL);
> > + break;
> > + case 400000:
> > + writeb(ICMR1_CKS(1), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP400K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP400K, riic->base + RIIC_ICBRL);
>
> Couldn't you compute the ICMR1, ICBRH and ICBRL values at runtime instead ?
As mentioned in the TODO above, this is scheduled for an incremental
update to this driver.
> > + of_property_read_u32(np, "clock-frequency", &bus_rate);
>
> As the property is mandatory, shouldn't you check the return value of this
> function ? Another option would be to make the clock-frequency property
> optional and use a default value. What do the other I2C bus drivers usually do
> ?
bus_rate is initialized to 0 and if read_u32 fails, it will stay this
way. Then, the call to riic_init_hw() will fail and report the error.
There is no standard behaviour (use sane default or fail) yet. It is
somewhere on the I2C todo list :/
Regards,
Wolfram
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Wolfram Sang <wsa@the-dreams.de>
To: linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH V2 5/5] i2c: riic: add driver
Date: Thu, 19 Dec 2013 12:06:47 +0000 [thread overview]
Message-ID: <20131219120646.GA2563@katana> (raw)
In-Reply-To: <1407973.m5fTNuo5v5@avalon>
[-- Attachment #1: Type: text/plain, Size: 3206 bytes --]
Hi Laurent,
thanks for the review!
> > +/*
> > + * This i2c core has a lot of interrupts, namely 8. We use their chaining
> > as
> > + * some kind of state machine.
>
> I have mixed feelings about this. Wouldn't it be more efficient to have an
> internal state machine (which you partially have already, using RIIC_INIT_MSG
> for instance) instead of relying on enabling/disabling interrupts ? The latter
> has a larger overhead.
I am not sure I get you here. I need the interrupts anyhow. For example,
after the last byte has been written to the 1-byte-FIFO in the
transmission_irq, I need to wait for the transmission_end_irq to ensure
the bits are already on the wire before I mark the message completed.
Polling for that condition is more overhead than just enabling the
proper interrupt (one write to ICIER). I don't need to switch ISR since
all the interrupts are seperate and have dedicated ISR.
> > +static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int
> > num)
> > +{
> > + struct riic_dev *riic = i2c_get_adapdata(adap);
> > + int i, ret;
>
> One of my favorite bikeshedding comments is to ask for unsigned int when the
> variable can't be negative :-)
OK.
> > + /*
> > + * TODO: Implement formula to calculate the timing values depending on
> > + * variable parent clock rate and arbitrary bus speed
> > + */
> > + rate = clk_get_rate(riic->clk);
> > + if (rate != 33325000) {
> > + dev_err(&riic->adapter.dev,
> > + "invalid parent clk (%lu). Must be 33325000Hz\n", rate);
>
> What about a "goto done;" here and below to avoid repeating the
> clk_disable_unprepare() call ?
Yeah, can be argued that way. I was fine with both.
>
> > + clk_disable_unprepare(riic->clk);
> > + return -EINVAL;
> > + }
> > +
> > + /* Changing the order of accessing IICRST and ICE may break things! */
> > + writeb(ICCR1_IICRST | ICCR1_SOWP, riic->base + RIIC_ICCR1);
> > + riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
> > +
> > + switch (spd) {
> > + case 100000:
> > + writeb(ICMR1_CKS(3), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP100K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP100K, riic->base + RIIC_ICBRL);
> > + break;
> > + case 400000:
> > + writeb(ICMR1_CKS(1), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP400K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP400K, riic->base + RIIC_ICBRL);
>
> Couldn't you compute the ICMR1, ICBRH and ICBRL values at runtime instead ?
As mentioned in the TODO above, this is scheduled for an incremental
update to this driver.
> > + of_property_read_u32(np, "clock-frequency", &bus_rate);
>
> As the property is mandatory, shouldn't you check the return value of this
> function ? Another option would be to make the clock-frequency property
> optional and use a default value. What do the other I2C bus drivers usually do
> ?
bus_rate is initialized to 0 and if read_u32 fails, it will stay this
way. Then, the call to riic_init_hw() will fail and report the error.
There is no standard behaviour (use sane default or fail) yet. It is
somewhere on the I2C todo list :/
Regards,
Wolfram
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: wsa@the-dreams.de (Wolfram Sang)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V2 5/5] i2c: riic: add driver
Date: Thu, 19 Dec 2013 13:06:47 +0100 [thread overview]
Message-ID: <20131219120646.GA2563@katana> (raw)
In-Reply-To: <1407973.m5fTNuo5v5@avalon>
Hi Laurent,
thanks for the review!
> > +/*
> > + * This i2c core has a lot of interrupts, namely 8. We use their chaining
> > as
> > + * some kind of state machine.
>
> I have mixed feelings about this. Wouldn't it be more efficient to have an
> internal state machine (which you partially have already, using RIIC_INIT_MSG
> for instance) instead of relying on enabling/disabling interrupts ? The latter
> has a larger overhead.
I am not sure I get you here. I need the interrupts anyhow. For example,
after the last byte has been written to the 1-byte-FIFO in the
transmission_irq, I need to wait for the transmission_end_irq to ensure
the bits are already on the wire before I mark the message completed.
Polling for that condition is more overhead than just enabling the
proper interrupt (one write to ICIER). I don't need to switch ISR since
all the interrupts are seperate and have dedicated ISR.
> > +static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int
> > num)
> > +{
> > + struct riic_dev *riic = i2c_get_adapdata(adap);
> > + int i, ret;
>
> One of my favorite bikeshedding comments is to ask for unsigned int when the
> variable can't be negative :-)
OK.
> > + /*
> > + * TODO: Implement formula to calculate the timing values depending on
> > + * variable parent clock rate and arbitrary bus speed
> > + */
> > + rate = clk_get_rate(riic->clk);
> > + if (rate != 33325000) {
> > + dev_err(&riic->adapter.dev,
> > + "invalid parent clk (%lu). Must be 33325000Hz\n", rate);
>
> What about a "goto done;" here and below to avoid repeating the
> clk_disable_unprepare() call ?
Yeah, can be argued that way. I was fine with both.
>
> > + clk_disable_unprepare(riic->clk);
> > + return -EINVAL;
> > + }
> > +
> > + /* Changing the order of accessing IICRST and ICE may break things! */
> > + writeb(ICCR1_IICRST | ICCR1_SOWP, riic->base + RIIC_ICCR1);
> > + riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1);
> > +
> > + switch (spd) {
> > + case 100000:
> > + writeb(ICMR1_CKS(3), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP100K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP100K, riic->base + RIIC_ICBRL);
> > + break;
> > + case 400000:
> > + writeb(ICMR1_CKS(1), riic->base + RIIC_ICMR1);
> > + writeb(ICBRH_SP400K, riic->base + RIIC_ICBRH);
> > + writeb(ICBRL_SP400K, riic->base + RIIC_ICBRL);
>
> Couldn't you compute the ICMR1, ICBRH and ICBRL values at runtime instead ?
As mentioned in the TODO above, this is scheduled for an incremental
update to this driver.
> > + of_property_read_u32(np, "clock-frequency", &bus_rate);
>
> As the property is mandatory, shouldn't you check the return value of this
> function ? Another option would be to make the clock-frequency property
> optional and use a default value. What do the other I2C bus drivers usually do
> ?
bus_rate is initialized to 0 and if read_u32 fails, it will stay this
way. Then, the call to riic_init_hw() will fail and report the error.
There is no standard behaviour (use sane default or fail) yet. It is
somewhere on the I2C todo list :/
Regards,
Wolfram
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20131219/76f366bf/attachment.sig>
next prev parent reply other threads:[~2013-12-19 12:06 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-18 21:31 [PATCH V2 0/5] arm: shmobile: r7s72100: add native i2c support Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
2013-12-18 21:31 ` [PATCH V2 2/5] arm: shmobile: r7s72100: add i2c clocks Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
[not found] ` <1387402321-21866-3-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-12-24 2:48 ` Simon Horman
2013-12-24 2:48 ` Simon Horman
2013-12-24 2:48 ` Simon Horman
[not found] ` <20131224024855.GC22401-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>
2013-12-26 21:20 ` Geert Uytterhoeven
2013-12-26 21:20 ` Geert Uytterhoeven
2013-12-26 21:20 ` Geert Uytterhoeven
2013-12-26 21:25 ` Wolfram Sang
2013-12-26 21:25 ` Wolfram Sang
2013-12-26 21:25 ` Wolfram Sang
2013-12-26 21:34 ` Geert Uytterhoeven
2013-12-26 21:34 ` Geert Uytterhoeven
2013-12-26 21:34 ` Geert Uytterhoeven
[not found] ` <CAMuHMdXF6WmS_j4pC1U5jL3SK-ck7N=EA+-45duXdRZP1cOJkw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-12-26 21:51 ` Geert Uytterhoeven
2013-12-26 21:51 ` Geert Uytterhoeven
2013-12-26 21:51 ` Geert Uytterhoeven
[not found] ` <CAMuHMdXP4DAF1_DPtNfwCyP8WHFU03=zgM7i8FW9n6tcJpAHHQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-12-27 2:01 ` Simon Horman
2013-12-27 2:01 ` Simon Horman
2013-12-27 2:01 ` Simon Horman
[not found] ` <1387402321-21866-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-12-18 21:31 ` [PATCH V2 1/5] pinctrl: r7s72100: add riic groups Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
[not found] ` <1387402321-21866-2-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-12-18 21:49 ` Wolfram Sang
2013-12-18 21:49 ` Wolfram Sang
2013-12-18 21:49 ` Wolfram Sang
2013-12-18 21:31 ` [PATCH V2 3/5] arm: shmobile: r7s72100: add nodes for i2c controllers to dtsi Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
2013-12-18 21:31 ` Wolfram Sang
[not found] ` <1387402321-21866-4-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-12-27 4:27 ` Wolfram Sang
2013-12-27 4:27 ` Wolfram Sang
2013-12-27 4:27 ` Wolfram Sang
2014-01-06 5:22 ` Simon Horman
2014-01-06 5:22 ` Simon Horman
2014-01-06 5:22 ` Simon Horman
2013-12-18 21:32 ` [PATCH V2 4/5] arm: shmobile: genmai: adapt dts to use native i2c driver Wolfram Sang
2013-12-18 21:32 ` Wolfram Sang
2013-12-18 21:32 ` Wolfram Sang
2013-12-18 21:32 ` [PATCH V2 5/5] i2c: riic: add driver Wolfram Sang
2013-12-18 21:32 ` Wolfram Sang
2013-12-18 21:32 ` Wolfram Sang
[not found] ` <1387402321-21866-6-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2013-12-19 0:01 ` Laurent Pinchart
2013-12-19 0:01 ` Laurent Pinchart
2013-12-19 0:01 ` Laurent Pinchart
2013-12-19 12:06 ` Wolfram Sang [this message]
2013-12-19 12:06 ` Wolfram Sang
2013-12-19 12:06 ` Wolfram Sang
2013-12-19 15:33 ` Laurent Pinchart
2013-12-19 15:33 ` Laurent Pinchart
2013-12-19 15:33 ` Laurent Pinchart
2013-12-20 15:47 ` Wolfram Sang
2013-12-20 15:47 ` Wolfram Sang
2013-12-20 15:47 ` Wolfram Sang
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=20131219120646.GA2563@katana \
--to=wsa-z923lk4zbo2bacvfa/9k2g@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org \
--cc=laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=magnus.damm-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.