From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Andi Shyti" <andi.shyti@kernel.org>
Cc: "Linus Walleij" <linus.walleij@linaro.org>,
"Rob Herring" <robh+dt@kernel.org>,
"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Thomas Bogendoerfer" <tsbogend@alpha.franken.de>,
<linux-arm-kernel@lists.infradead.org>,
<linux-i2c@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-mips@vger.kernel.org>,
"Gregory Clement" <gregory.clement@bootlin.com>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>
Subject: Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller
Date: Mon, 04 Mar 2024 15:53:52 +0100 [thread overview]
Message-ID: <CZL1VED24SZ0.7ETRO4YZ70CF@bootlin.com> (raw)
In-Reply-To: <yqyhu3qsrfyj52sraeo76jnpbgq6wi4o66hfqepxwwwupaggoa@7t5bah3qqcwb>
Hello,
On Mon Mar 4, 2024 at 3:08 PM CET, Andi Shyti wrote:
> Hi Theo,
>
> ...
>
> > +#include <linux/amba/bus.h>
> > #include <linux/bitfield.h>
> > +#include <linux/clk.h>
> > +#include <linux/err.h>
> > +#include <linux/i2c.h>
> > #include <linux/init.h>
> > -#include <linux/module.h>
> > -#include <linux/amba/bus.h>
> > -#include <linux/slab.h>
> > #include <linux/interrupt.h>
> > -#include <linux/i2c.h>
> > -#include <linux/err.h>
> > -#include <linux/clk.h>
> > #include <linux/io.h>
> > -#include <linux/pm_runtime.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/module.h>
> > #include <linux/of.h>
> > #include <linux/pinctrl/consumer.h>
> > +#include <linux/pm_runtime.h>
> > +#include <linux/regmap.h>
> > +#include <linux/slab.h>
>
> Please reorder the headers in a different patch.
Will do.
>
> > #define DRIVER_NAME "nmk-i2c"
> >
>
> ...
>
> > +static inline u8 nmk_i2c_readb(const struct nmk_i2c_dev *priv,
> > + unsigned long reg)
> > +{
> > + if (priv->has_32b_bus)
> > + return readl(priv->virtbase + reg);
> > + else
> > + return readb(priv->virtbase + reg);
>
> nit: no need for the else (your choice though, if you want to
> have ti coherent with the write counterpart).
Indeed, the useless else block can be removed. Will do.
> > +}
> > +
> > +static inline void nmk_i2c_writeb(const struct nmk_i2c_dev *priv, u32 val,
> > + unsigned long reg)
> > +{
> > + if (priv->has_32b_bus)
> > + writel(val, priv->virtbase + reg);
> > + else
> > + writeb(val, priv->virtbase + reg);
> > +}
>
> ...
>
> > +static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv)
> > +{
> > + struct device *dev = &priv->adev->dev;
> > + struct device_node *np = dev->of_node;
> > + unsigned int shift, speed_mode;
> > + struct regmap *olb;
> > + unsigned int id;
> > +
> > + priv->has_32b_bus = true;
> > +
> > + olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id);
> > + if (IS_ERR_OR_NULL(olb)) {
> > + if (!olb)
> > + olb = ERR_PTR(-ENOENT);
> > + return dev_err_probe(dev, PTR_ERR(olb),
> > + "failed OLB lookup: %lu\n", PTR_ERR(olb));
>
> just return PTR_ERR(olb) and use dev_err_probe() in the upper
> layer probe.
Good catch. In previous revisions nmk_i2c_eyeq5_probe() had multiple
error cases so it had to be the one doing the logging. Now that there
is a single possible error parent can do it. It should simplify code.
>
> > + }
> > +
> > + if (priv->clk_freq <= 400000)
> > + speed_mode = 0b00;
> > + else if (priv->clk_freq <= 1000000)
> > + speed_mode = 0b01;
> > + else
> > + speed_mode = 0b10;
>
> would be nice to have these as defines.
Agreed. Will be named based on I2C mode names, eg standard, fast, high
speed, fast plus.
>
> > +
> > + shift = NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id);
> > + regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2,
> > + 0b11 << shift, speed_mode << shift);
>
> please define these values and for hexadecimals use 0x...
0b11 is a two-bit mask. What do you mean by "these values"? Something
like:
#define NMK_I2C_EYEQ5_SPEED_MODE_FAST 0b00
#define NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS 0b01
#define NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED 0b10
static const u8 nmk_i2c_eyeq5_masks[] = {
[0] = 0x0030,
[1] = 0x00C0,
[2] = 0x0300,
[3] = 0x0C00,
[4] = 0x3000,
};
static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv)
{
// ...
unsigned int id, mask, speed_mode;
priv->has_32b_bus = true;
olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id);
// TODO: olb error checking
// TODO: check id is valid
if (priv->clk_freq <= 400000)
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST;
else if (priv->clk_freq <= 1000000)
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS;
else
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED;
mask = nmk_i2c_eyeq5_masks[id];
regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2,
mask, speed_mode << __fls(mask));
return 0;
}
Else I do not see what you are suggesting by "please define these
values".
Have a nice day,
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
WARNING: multiple messages have this Message-ID (diff)
From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Andi Shyti" <andi.shyti@kernel.org>
Cc: "Linus Walleij" <linus.walleij@linaro.org>,
"Rob Herring" <robh+dt@kernel.org>,
"Krzysztof Kozlowski" <krzysztof.kozlowski+dt@linaro.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Thomas Bogendoerfer" <tsbogend@alpha.franken.de>,
<linux-arm-kernel@lists.infradead.org>,
<linux-i2c@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-mips@vger.kernel.org>,
"Gregory Clement" <gregory.clement@bootlin.com>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>
Subject: Re: [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller
Date: Mon, 04 Mar 2024 15:53:52 +0100 [thread overview]
Message-ID: <CZL1VED24SZ0.7ETRO4YZ70CF@bootlin.com> (raw)
In-Reply-To: <yqyhu3qsrfyj52sraeo76jnpbgq6wi4o66hfqepxwwwupaggoa@7t5bah3qqcwb>
Hello,
On Mon Mar 4, 2024 at 3:08 PM CET, Andi Shyti wrote:
> Hi Theo,
>
> ...
>
> > +#include <linux/amba/bus.h>
> > #include <linux/bitfield.h>
> > +#include <linux/clk.h>
> > +#include <linux/err.h>
> > +#include <linux/i2c.h>
> > #include <linux/init.h>
> > -#include <linux/module.h>
> > -#include <linux/amba/bus.h>
> > -#include <linux/slab.h>
> > #include <linux/interrupt.h>
> > -#include <linux/i2c.h>
> > -#include <linux/err.h>
> > -#include <linux/clk.h>
> > #include <linux/io.h>
> > -#include <linux/pm_runtime.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/module.h>
> > #include <linux/of.h>
> > #include <linux/pinctrl/consumer.h>
> > +#include <linux/pm_runtime.h>
> > +#include <linux/regmap.h>
> > +#include <linux/slab.h>
>
> Please reorder the headers in a different patch.
Will do.
>
> > #define DRIVER_NAME "nmk-i2c"
> >
>
> ...
>
> > +static inline u8 nmk_i2c_readb(const struct nmk_i2c_dev *priv,
> > + unsigned long reg)
> > +{
> > + if (priv->has_32b_bus)
> > + return readl(priv->virtbase + reg);
> > + else
> > + return readb(priv->virtbase + reg);
>
> nit: no need for the else (your choice though, if you want to
> have ti coherent with the write counterpart).
Indeed, the useless else block can be removed. Will do.
> > +}
> > +
> > +static inline void nmk_i2c_writeb(const struct nmk_i2c_dev *priv, u32 val,
> > + unsigned long reg)
> > +{
> > + if (priv->has_32b_bus)
> > + writel(val, priv->virtbase + reg);
> > + else
> > + writeb(val, priv->virtbase + reg);
> > +}
>
> ...
>
> > +static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv)
> > +{
> > + struct device *dev = &priv->adev->dev;
> > + struct device_node *np = dev->of_node;
> > + unsigned int shift, speed_mode;
> > + struct regmap *olb;
> > + unsigned int id;
> > +
> > + priv->has_32b_bus = true;
> > +
> > + olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id);
> > + if (IS_ERR_OR_NULL(olb)) {
> > + if (!olb)
> > + olb = ERR_PTR(-ENOENT);
> > + return dev_err_probe(dev, PTR_ERR(olb),
> > + "failed OLB lookup: %lu\n", PTR_ERR(olb));
>
> just return PTR_ERR(olb) and use dev_err_probe() in the upper
> layer probe.
Good catch. In previous revisions nmk_i2c_eyeq5_probe() had multiple
error cases so it had to be the one doing the logging. Now that there
is a single possible error parent can do it. It should simplify code.
>
> > + }
> > +
> > + if (priv->clk_freq <= 400000)
> > + speed_mode = 0b00;
> > + else if (priv->clk_freq <= 1000000)
> > + speed_mode = 0b01;
> > + else
> > + speed_mode = 0b10;
>
> would be nice to have these as defines.
Agreed. Will be named based on I2C mode names, eg standard, fast, high
speed, fast plus.
>
> > +
> > + shift = NMK_I2C_EYEQ5_OLB_IOCR2_SHIFT(id);
> > + regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2,
> > + 0b11 << shift, speed_mode << shift);
>
> please define these values and for hexadecimals use 0x...
0b11 is a two-bit mask. What do you mean by "these values"? Something
like:
#define NMK_I2C_EYEQ5_SPEED_MODE_FAST 0b00
#define NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS 0b01
#define NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED 0b10
static const u8 nmk_i2c_eyeq5_masks[] = {
[0] = 0x0030,
[1] = 0x00C0,
[2] = 0x0300,
[3] = 0x0C00,
[4] = 0x3000,
};
static int nmk_i2c_eyeq5_probe(struct nmk_i2c_dev *priv)
{
// ...
unsigned int id, mask, speed_mode;
priv->has_32b_bus = true;
olb = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 1, &id);
// TODO: olb error checking
// TODO: check id is valid
if (priv->clk_freq <= 400000)
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST;
else if (priv->clk_freq <= 1000000)
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_FAST_PLUS;
else
speed_mode = NMK_I2C_EYEQ5_SPEED_MODE_HIGH_SPEED;
mask = nmk_i2c_eyeq5_masks[id];
regmap_update_bits(olb, NMK_I2C_EYEQ5_OLB_IOCR2,
mask, speed_mode << __fls(mask));
return 0;
}
Else I do not see what you are suggesting by "please define these
values".
Have a nice day,
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-03-04 14:53 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 18:10 [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 01/11] dt-bindings: i2c: nomadik: add mobileye,eyeq5-i2c bindings and example Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 19:26 ` Rob Herring
2024-02-29 19:26 ` Rob Herring
2024-03-01 15:11 ` Rob Herring
2024-03-01 15:11 ` Rob Herring
2024-03-01 15:47 ` Théo Lebrun
2024-03-01 15:47 ` Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 02/11] dt-bindings: hwmon: lm75: use common hwmon schema Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 19:26 ` Rob Herring
2024-02-29 19:26 ` Rob Herring
2024-03-01 6:37 ` Krzysztof Kozlowski
2024-03-01 6:37 ` Krzysztof Kozlowski
2024-03-01 6:53 ` Guenter Roeck
2024-03-01 6:53 ` Guenter Roeck
2024-03-01 9:41 ` Théo Lebrun
2024-03-01 9:41 ` Théo Lebrun
2024-03-01 10:13 ` Krzysztof Kozlowski
2024-03-01 10:13 ` Krzysztof Kozlowski
2024-03-01 10:44 ` Théo Lebrun
2024-03-01 10:44 ` Théo Lebrun
2024-03-01 11:35 ` Krzysztof Kozlowski
2024-03-01 11:35 ` Krzysztof Kozlowski
2024-03-01 14:09 ` Théo Lebrun
2024-03-01 14:09 ` Théo Lebrun
2024-03-01 14:13 ` Krzysztof Kozlowski
2024-03-01 14:13 ` Krzysztof Kozlowski
2024-03-01 15:35 ` Rob Herring
2024-03-01 15:35 ` Rob Herring
2024-03-01 15:52 ` Théo Lebrun
2024-03-01 15:52 ` Théo Lebrun
2024-03-01 15:38 ` Rob Herring
2024-03-01 15:38 ` Rob Herring
2024-03-01 19:21 ` Guenter Roeck
2024-03-01 19:21 ` Guenter Roeck
2024-02-29 18:10 ` [PATCH v2 03/11] i2c: nomadik: rename private struct pointers from dev to priv Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-03-02 0:16 ` [SPAM] " Andi Shyti
2024-03-02 0:16 ` Andi Shyti
2024-03-04 9:13 ` Wolfram Sang
2024-03-04 9:13 ` Wolfram Sang
2024-02-29 18:10 ` [PATCH v2 04/11] i2c: nomadik: simplify IRQ masking logic Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-03-02 0:39 ` [SPAM] " Andi Shyti
2024-03-02 0:39 ` Andi Shyti
2024-03-04 9:46 ` Théo Lebrun
2024-03-04 9:46 ` Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 05/11] i2c: nomadik: use bitops helpers Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-03-02 1:31 ` Andi Shyti
2024-03-02 1:31 ` Andi Shyti
2024-03-04 10:00 ` Théo Lebrun
2024-03-04 10:00 ` Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 06/11] i2c: nomadik: support short xfer timeouts using waitqueue & hrtimer Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-03-04 9:18 ` Wolfram Sang
2024-03-04 9:18 ` Wolfram Sang
2024-03-04 10:14 ` Théo Lebrun
2024-03-04 10:14 ` Théo Lebrun
2024-03-04 11:37 ` Wolfram Sang
2024-03-04 11:37 ` Wolfram Sang
2024-03-04 13:54 ` [SPAM] " Andi Shyti
2024-03-04 13:54 ` Andi Shyti
2024-03-04 14:32 ` Théo Lebrun
2024-03-04 14:32 ` Théo Lebrun
2024-03-04 15:09 ` Andi Shyti
2024-03-04 15:09 ` Andi Shyti
2024-02-29 18:10 ` [PATCH v2 07/11] i2c: nomadik: replace jiffies by ktime for FIFO flushing timeout Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-03-04 9:23 ` Wolfram Sang
2024-03-04 9:23 ` Wolfram Sang
2024-03-04 13:55 ` Andi Shyti
2024-03-04 13:55 ` Andi Shyti
2024-02-29 18:10 ` [PATCH v2 08/11] i2c: nomadik: fetch i2c-transfer-timeout-us property from devicetree Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 21:04 ` Linus Walleij
2024-02-29 21:04 ` Linus Walleij
2024-03-04 9:25 ` Wolfram Sang
2024-03-04 9:25 ` Wolfram Sang
2024-03-04 13:57 ` Andi Shyti
2024-03-04 13:57 ` Andi Shyti
2024-02-29 18:10 ` [PATCH v2 09/11] i2c: nomadik: support Mobileye EyeQ5 I2C controller Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 21:08 ` Linus Walleij
2024-02-29 21:08 ` Linus Walleij
2024-03-04 9:27 ` Wolfram Sang
2024-03-04 9:27 ` Wolfram Sang
2024-03-04 10:25 ` Théo Lebrun
2024-03-04 10:25 ` Théo Lebrun
2024-03-04 14:08 ` Andi Shyti
2024-03-04 14:08 ` Andi Shyti
2024-03-04 14:53 ` Théo Lebrun [this message]
2024-03-04 14:53 ` Théo Lebrun
2024-02-29 18:10 ` [PATCH v2 10/11] MIPS: mobileye: eyeq5: add 5 I2C controller nodes Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 21:09 ` Linus Walleij
2024-02-29 21:09 ` Linus Walleij
2024-02-29 18:10 ` [PATCH v2 11/11] MIPS: mobileye: eyeq5: add evaluation board I2C temp sensor Théo Lebrun
2024-02-29 18:10 ` Théo Lebrun
2024-02-29 21:09 ` Linus Walleij
2024-02-29 21:09 ` Linus Walleij
2024-03-06 1:49 ` [PATCH v2 00/11] Add Mobileye EyeQ5 support to the Nomadik I2C controller & use hrtimers for timeouts Andi Shyti
2024-03-06 1:49 ` Andi Shyti
2024-03-06 9:34 ` Théo Lebrun
2024-03-06 9:34 ` Théo Lebrun
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=CZL1VED24SZ0.7ETRO4YZ70CF@bootlin.com \
--to=theo.lebrun@bootlin.com \
--cc=andi.shyti@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gregory.clement@bootlin.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=robh+dt@kernel.org \
--cc=tawfik.bayouk@mobileye.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=tsbogend@alpha.franken.de \
--cc=vladimir.kondratiev@mobileye.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 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.