From: Boris Brezillon <boris.brezillon@collabora.com>
To: Vitor Soares <vitor.soares@synopsys.com>
Cc: linux-i3c@lists.infradead.org, joao.pinto@synopsys.com,
linux-kernel@vger.kernel.org, stable@vger.kernel.org,
Boris Brezillon <bbrezillon@kernel.org>
Subject: Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode
Date: Tue, 16 Apr 2019 07:50:41 +0200 [thread overview]
Message-ID: <20190416075041.22f8e849@collabora.com> (raw)
In-Reply-To: <05fdeea79db83970e9ecb0d7045b4dd98f206f06.1555350118.git.vitor.soares@synopsys.com>
On Mon, 15 Apr 2019 20:46:41 +0200
Vitor Soares <vitor.soares@synopsys.com> wrote:
> Currently in case of mixed slow bus topologie and all i2c devices
> support FM+ speed, the i3c subsystem limite the SCL to FM speed.
"
Currently the I3C framework limits SCL frequency to FM speed when
dealing with a mixed slow bus, even if all I2C devices are FM+ capable.
"
> Also in case on mixed slow bus mode the max speed for both
> i2c or i3c transfers is FM or FM+.
Looks like you're basically repeating what you said above.
>
> This patch fix the definition of i2c and i3c scl rate based on bus
^fixes on the bus
> topologie and LVR[4] if no user input.
^topology ^if the rate is not already specified by the user.
> In case of mixed slow mode the i3c scl rate is overridden.
^ with the max
I2C rate.
>
> Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
> Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
> Cc: Boris Brezillon <bbrezillon@kernel.org>
> Cc: <stable@vger.kernel.org>
> Cc: <linux-kernel@vger.kernel.org>
> ---
> drivers/i3c/master.c | 39 +++++++++++++++++++++++++--------------
> 1 file changed, 25 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 909c2ad..1c4a86a 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -564,20 +564,30 @@ static const struct device_type i3c_masterdev_type = {
> .groups = i3c_masterdev_groups,
> };
>
> -int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode)
> +int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode,
> + unsigned long i2c_scl_rate)
Can we rename the last arg into max_i2c_scl_rate?
> {
> i3cbus->mode = mode;
>
> - if (!i3cbus->scl_rate.i3c)
> - i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> -
> - if (!i3cbus->scl_rate.i2c) {
> - if (i3cbus->mode == I3C_BUS_MODE_MIXED_SLOW)
> - i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE;
> - else
> - i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_PLUS_SCL_RATE;
> + switch (i3cbus->mode) {
> + case I3C_BUS_MODE_PURE:
> + if (!i3cbus->scl_rate.i3c)
> + i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> + break;
> + case I3C_BUS_MODE_MIXED_FAST:
> + if (!i3cbus->scl_rate.i3c)
> + i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> + if (!i3cbus->scl_rate.i2c)
> + i3cbus->scl_rate.i2c = i2c_scl_rate;
> + break;
> + case I3C_BUS_MODE_MIXED_SLOW:
> + if (!i3cbus->scl_rate.i2c)
> + i3cbus->scl_rate.i2c = i2c_scl_rate;
> + i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c;
Maybe we should do
if (!i3cbus->scl_rate.i3c ||
i3cbus->scl_rate.i3c > i3cbus->scl_rate.i2c)
i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c;
Just in case the I3C rate forced by the user is lower than the max I2C
rate.
The patch looks good otherwise.
> + break;
> + default:
> + return -EINVAL;
> }
> -
> /*
> * I3C/I2C frequency may have been overridden, check that user-provided
> * values are not exceeding max possible frequency.
> @@ -1980,9 +1990,6 @@ of_i3c_master_add_i2c_boardinfo(struct i3c_master_controller *master,
> /* LVR is encoded in reg[2]. */
> boardinfo->lvr = reg[2];
>
> - if (boardinfo->lvr & I3C_LVR_I2C_FM_MODE)
> - master->bus.scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE;
> -
> list_add_tail(&boardinfo->node, &master->boardinfo.i2c);
> of_node_get(node);
>
> @@ -2432,6 +2439,7 @@ int i3c_master_register(struct i3c_master_controller *master,
> const struct i3c_master_controller_ops *ops,
> bool secondary)
> {
> + unsigned long i2c_scl_rate = I3C_BUS_I2C_FM_PLUS_SCL_RATE;
> struct i3c_bus *i3cbus = i3c_master_get_bus(master);
> enum i3c_bus_mode mode = I3C_BUS_MODE_PURE;
> struct i2c_dev_boardinfo *i2cbi;
> @@ -2481,9 +2489,12 @@ int i3c_master_register(struct i3c_master_controller *master,
> ret = -EINVAL;
> goto err_put_dev;
> }
> +
> + if (i2cbi->lvr & I3C_LVR_I2C_FM_MODE)
> + i2c_scl_rate = I3C_BUS_I2C_FM_SCL_RATE;
> }
>
> - ret = i3c_bus_set_mode(i3cbus, mode);
> + ret = i3c_bus_set_mode(i3cbus, mode, i2c_scl_rate);
> if (ret)
> goto err_put_dev;
>
_______________________________________________
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@collabora.com>
To: Vitor Soares <vitor.soares@synopsys.com>
Cc: linux-i3c@lists.infradead.org, joao.pinto@synopsys.com,
Boris Brezillon <bbrezillon@kernel.org>,
stable@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode
Date: Tue, 16 Apr 2019 07:50:41 +0200 [thread overview]
Message-ID: <20190416075041.22f8e849@collabora.com> (raw)
In-Reply-To: <05fdeea79db83970e9ecb0d7045b4dd98f206f06.1555350118.git.vitor.soares@synopsys.com>
On Mon, 15 Apr 2019 20:46:41 +0200
Vitor Soares <vitor.soares@synopsys.com> wrote:
> Currently in case of mixed slow bus topologie and all i2c devices
> support FM+ speed, the i3c subsystem limite the SCL to FM speed.
"
Currently the I3C framework limits SCL frequency to FM speed when
dealing with a mixed slow bus, even if all I2C devices are FM+ capable.
"
> Also in case on mixed slow bus mode the max speed for both
> i2c or i3c transfers is FM or FM+.
Looks like you're basically repeating what you said above.
>
> This patch fix the definition of i2c and i3c scl rate based on bus
^fixes on the bus
> topologie and LVR[4] if no user input.
^topology ^if the rate is not already specified by the user.
> In case of mixed slow mode the i3c scl rate is overridden.
^ with the max
I2C rate.
>
> Fixes: 3a379bbcea0a ("i3c: Add core I3C infrastructure")
> Signed-off-by: Vitor Soares <vitor.soares@synopsys.com>
> Cc: Boris Brezillon <bbrezillon@kernel.org>
> Cc: <stable@vger.kernel.org>
> Cc: <linux-kernel@vger.kernel.org>
> ---
> drivers/i3c/master.c | 39 +++++++++++++++++++++++++--------------
> 1 file changed, 25 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 909c2ad..1c4a86a 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -564,20 +564,30 @@ static const struct device_type i3c_masterdev_type = {
> .groups = i3c_masterdev_groups,
> };
>
> -int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode)
> +int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode,
> + unsigned long i2c_scl_rate)
Can we rename the last arg into max_i2c_scl_rate?
> {
> i3cbus->mode = mode;
>
> - if (!i3cbus->scl_rate.i3c)
> - i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> -
> - if (!i3cbus->scl_rate.i2c) {
> - if (i3cbus->mode == I3C_BUS_MODE_MIXED_SLOW)
> - i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE;
> - else
> - i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_PLUS_SCL_RATE;
> + switch (i3cbus->mode) {
> + case I3C_BUS_MODE_PURE:
> + if (!i3cbus->scl_rate.i3c)
> + i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> + break;
> + case I3C_BUS_MODE_MIXED_FAST:
> + if (!i3cbus->scl_rate.i3c)
> + i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE;
> + if (!i3cbus->scl_rate.i2c)
> + i3cbus->scl_rate.i2c = i2c_scl_rate;
> + break;
> + case I3C_BUS_MODE_MIXED_SLOW:
> + if (!i3cbus->scl_rate.i2c)
> + i3cbus->scl_rate.i2c = i2c_scl_rate;
> + i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c;
Maybe we should do
if (!i3cbus->scl_rate.i3c ||
i3cbus->scl_rate.i3c > i3cbus->scl_rate.i2c)
i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c;
Just in case the I3C rate forced by the user is lower than the max I2C
rate.
The patch looks good otherwise.
> + break;
> + default:
> + return -EINVAL;
> }
> -
> /*
> * I3C/I2C frequency may have been overridden, check that user-provided
> * values are not exceeding max possible frequency.
> @@ -1980,9 +1990,6 @@ of_i3c_master_add_i2c_boardinfo(struct i3c_master_controller *master,
> /* LVR is encoded in reg[2]. */
> boardinfo->lvr = reg[2];
>
> - if (boardinfo->lvr & I3C_LVR_I2C_FM_MODE)
> - master->bus.scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE;
> -
> list_add_tail(&boardinfo->node, &master->boardinfo.i2c);
> of_node_get(node);
>
> @@ -2432,6 +2439,7 @@ int i3c_master_register(struct i3c_master_controller *master,
> const struct i3c_master_controller_ops *ops,
> bool secondary)
> {
> + unsigned long i2c_scl_rate = I3C_BUS_I2C_FM_PLUS_SCL_RATE;
> struct i3c_bus *i3cbus = i3c_master_get_bus(master);
> enum i3c_bus_mode mode = I3C_BUS_MODE_PURE;
> struct i2c_dev_boardinfo *i2cbi;
> @@ -2481,9 +2489,12 @@ int i3c_master_register(struct i3c_master_controller *master,
> ret = -EINVAL;
> goto err_put_dev;
> }
> +
> + if (i2cbi->lvr & I3C_LVR_I2C_FM_MODE)
> + i2c_scl_rate = I3C_BUS_I2C_FM_SCL_RATE;
> }
>
> - ret = i3c_bus_set_mode(i3cbus, mode);
> + ret = i3c_bus_set_mode(i3cbus, mode, i2c_scl_rate);
> if (ret)
> goto err_put_dev;
>
next prev parent reply other threads:[~2019-04-16 5:50 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-15 18:46 [PATCH 0/3] Fix i2c and i3c scl rate according bus mode Vitor Soares
2019-04-15 18:42 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-16 5:50 ` Boris Brezillon [this message]
2019-04-16 5:50 ` Boris Brezillon
2019-04-16 14:24 ` Vitor Soares
2019-04-16 14:24 ` Vitor Soares
2019-04-16 14:52 ` Boris Brezillon
2019-04-16 14:52 ` Boris Brezillon
2019-04-22 15:54 ` Vitor Soares
2019-04-22 15:54 ` Vitor Soares
2019-04-22 16:07 ` Boris Brezillon
2019-04-22 16:07 ` Boris Brezillon
2019-04-22 17:54 ` Vitor Soares
2019-04-22 17:54 ` Vitor Soares
2019-04-22 18:27 ` Boris Brezillon
2019-04-22 18:27 ` Boris Brezillon
2019-04-22 19:59 ` Vitor Soares
2019-04-22 19:59 ` Vitor Soares
2019-04-15 18:42 ` [PATCH 2/3] i3c: add mixed limited " Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-16 6:00 ` Boris Brezillon
2019-04-16 6:00 ` Boris Brezillon
2019-04-16 14:27 ` Vitor Soares
2019-04-16 14:27 ` Vitor Soares
2019-04-15 18:42 ` [PATCH 3/3] i3c: dw: Add limited bus mode support Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-15 18:46 ` Vitor Soares
2019-04-16 6:09 ` Boris Brezillon
2019-04-16 6:09 ` Boris Brezillon
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=20190416075041.22f8e849@collabora.com \
--to=boris.brezillon@collabora.com \
--cc=bbrezillon@kernel.org \
--cc=joao.pinto@synopsys.com \
--cc=linux-i3c@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=vitor.soares@synopsys.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.