* [PATCH 0/3] Fix i2c and i3c scl rate according bus mode @ 2019-04-15 18:46 Vitor Soares 2019-04-15 18:46 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares ` (2 more replies) 0 siblings, 3 replies; 15+ messages in thread From: Vitor Soares @ 2019-04-15 18:46 UTC (permalink / raw) To: linux-i3c; +Cc: joao.pinto, Vitor Soares This patch series fix the i2c and i3c scl rate according the bus mode and LVR register. It also introduce the mixed limited bus for the cases where i2c devices doesn't have 50 ns filter but allow higher clock rate for i3c transfers. Please refer table 5 and 10 of i3c bus spec v1.0 for more detail. Please follow each patch commit message for more details. Vitor Soares (3): i3c: fix i2c and i3c scl rate by bus mode i3c: add mixed limited bus mode i3c: dw: Add limited bus mode support drivers/i3c/master.c | 44 ++++++++++++++++++++++++++------------ drivers/i3c/master/dw-i3c-master.c | 1 + include/linux/i3c/master.h | 5 +++++ 3 files changed, 36 insertions(+), 14 deletions(-) -- 2.7.4 _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-15 18:46 [PATCH 0/3] Fix i2c and i3c scl rate according bus mode Vitor Soares @ 2019-04-15 18:46 ` Vitor Soares 2019-04-16 5:50 ` Boris Brezillon 2019-04-15 18:46 ` [PATCH 2/3] i3c: add mixed limited " Vitor Soares 2019-04-15 18:46 ` [PATCH 3/3] i3c: dw: Add limited bus mode support Vitor Soares 2 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-15 18:46 UTC (permalink / raw) To: linux-i3c; +Cc: joao.pinto, Boris Brezillon, linux-kernel, stable, Vitor Soares Currently in case of mixed slow bus topologie and all i2c devices support FM+ speed, the i3c subsystem limite the SCL to FM speed. Also in case on mixed slow bus mode the max speed for both i2c or i3c transfers is FM or FM+. This patch fix the definition of i2c and i3c scl rate based on bus topologie and LVR[4] if no user input. In case of mixed slow mode the i3c scl rate is overridden. 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) { 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; + 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; -- 2.7.4 _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-15 18:46 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares @ 2019-04-16 5:50 ` Boris Brezillon 2019-04-16 14:24 ` Vitor Soares 0 siblings, 1 reply; 15+ messages in thread From: Boris Brezillon @ 2019-04-16 5:50 UTC (permalink / raw) To: Vitor Soares; +Cc: linux-i3c, joao.pinto, linux-kernel, stable, Boris Brezillon 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 ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-16 5:50 ` Boris Brezillon @ 2019-04-16 14:24 ` Vitor Soares 2019-04-16 14:52 ` Boris Brezillon 0 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-16 14:24 UTC (permalink / raw) To: Boris Brezillon, Vitor Soares Cc: linux-i3c, joao.pinto, linux-kernel, stable, Boris Brezillon Hi Boris, From: Boris Brezillon <boris.brezillon@collabora.com> Date: Tue, Apr 16, 2019 at 06:50:41 > 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. > I will it replace with your message below. > " > 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. What I meant was that I3C framework isn't limiting the I3C speed in case of mixed slow bus. > > > > > 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? The i2c_scl_rate is base on LVR[4] bit and the user can set a higher scl rate, this is reason I didn't named it to max_i2c_scl_rate. But if you think that make more sense I'm ok with that. > > > { > > 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. That was something that I considered but TBH it isn't a real use case. > > The patch looks good otherwise. Thanks. > > > + 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; > > Best regards, Vitor Soares _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-16 14:24 ` Vitor Soares @ 2019-04-16 14:52 ` Boris Brezillon 2019-04-22 15:54 ` Vitor Soares 0 siblings, 1 reply; 15+ messages in thread From: Boris Brezillon @ 2019-04-16 14:52 UTC (permalink / raw) To: Vitor Soares; +Cc: linux-i3c, joao.pinto, linux-kernel, stable, Boris Brezillon On Tue, 16 Apr 2019 14:24:57 +0000 Vitor Soares <vitor.soares@synopsys.com> wrote: > Hi Boris, > > From: Boris Brezillon <boris.brezillon@collabora.com> > Date: Tue, Apr 16, 2019 at 06:50:41 > > > 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. > > > > I will it replace with your message below. > > > " > > 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. > > What I meant was that I3C framework isn't limiting the I3C speed in case > of mixed slow bus. Oh, okay, then maybe something like " The core was also not accounting for I3C speed limitations when operating in mixed slow mode and was erroneously using FM+ speed as the max I2C speed when operating in mixed fast mode. " > > > > > > > > > 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? > > The i2c_scl_rate is base on LVR[4] bit and the user can set a higher scl > rate, this is reason I didn't named it to max_i2c_scl_rate. > But if you think that make more sense I'm ok with that. In this context it does encode the maximum rate allowed by the spec (based on LVR parsing), so max_i2c_rate sounds like a correct name to me. > > > > > > { > > > 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. > > That was something that I considered but TBH it isn't a real use case. Add a WARN_ON() to at least catch such inconsistencies. And maybe we should add a dev_warn() when the user-defined rates do not match the mode/LVR constraints. It's easy to do a mistake when writing a dts. _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-16 14:52 ` Boris Brezillon @ 2019-04-22 15:54 ` Vitor Soares 2019-04-22 16:07 ` Boris Brezillon 0 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-22 15:54 UTC (permalink / raw) To: Boris Brezillon, Vitor Soares Cc: linux-i3c, joao.pinto@synopsys.com, linux-kernel, stable, Boris Brezillon Hi Boris, From: Boris Brezillon <boris.brezillon@collabora.com> Date: Tue, Apr 16, 2019 at 15:52:50 > On Tue, 16 Apr 2019 14:24:57 +0000 > Vitor Soares <vitor.soares@synopsys.com> wrote: > > > Hi Boris, > > > > From: Boris Brezillon <boris.brezillon@collabora.com> > > Date: Tue, Apr 16, 2019 at 06:50:41 > > > > > 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. > > > > > > > I will it replace with your message below. > > > > > " > > > 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. > > > > What I meant was that I3C framework isn't limiting the I3C speed in case > > of mixed slow bus. > > Oh, okay, then maybe something like > > " > The core was also not accounting for I3C speed limitations when > operating in mixed slow mode and was erroneously using FM+ speed as the > max I2C speed when operating in mixed fast mode. > " Sounds good to me. Thanks for the advise. > > > > > > > > > > > > > > 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? > > > > The i2c_scl_rate is base on LVR[4] bit and the user can set a higher scl > > rate, this is reason I didn't named it to max_i2c_scl_rate. > > But if you think that make more sense I'm ok with that. > > In this context it does encode the maximum rate allowed by the spec > (based on LVR parsing), so max_i2c_rate sounds like a correct name to > me. > > > > > > > > > > { > > > > 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. > > > > That was something that I considered but TBH it isn't a real use case. > > Add a WARN_ON() to at least catch such inconsistencies. And maybe we > should add a dev_warn() when the user-defined rates do not match > the mode/LVR constraints. It's easy to do a mistake when writing a dts. I think the WARN_ON() is too evasive on the screen and won't provide the information we want. The dev_warn() should work perfectly here. if (i3cbus->scl_rate.i3c < i3cbus->scl_rate.i2c) dev_warn(&i3cbus->cur_master->dev->dev, "%s: i3c-scl-hz lower then i2c-scl-hz\n", __func__); if (i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_SCL_RATE || i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_PLUS_SCL_RATE) dev_warn(&i3cbus->cur_master->dev->dev, "%s: i2c-scl-hz not defined according MIPI I3C spec\n", __func__); Maybe it make more sense to do this check on of_populate_i3c_bus(), what do you think? _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-22 15:54 ` Vitor Soares @ 2019-04-22 16:07 ` Boris Brezillon 2019-04-22 17:54 ` Vitor Soares 0 siblings, 1 reply; 15+ messages in thread From: Boris Brezillon @ 2019-04-22 16:07 UTC (permalink / raw) To: Vitor Soares Cc: linux-i3c, joao.pinto@synopsys.com, linux-kernel, stable, Boris Brezillon On Mon, 22 Apr 2019 15:54:33 +0000 Vitor Soares <Vitor.Soares@synopsys.com> wrote: > > > > > > > > > { > > > > > 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. > > > > > > That was something that I considered but TBH it isn't a real use case. > > > > Add a WARN_ON() to at least catch such inconsistencies. And maybe we > > should add a dev_warn() when the user-defined rates do not match > > the mode/LVR constraints. It's easy to do a mistake when writing a dts. > > I think the WARN_ON() is too evasive on the screen and won't provide the > information we want. > The dev_warn() should work perfectly here. > > if (i3cbus->scl_rate.i3c < i3cbus->scl_rate.i2c) > dev_warn(&i3cbus->cur_master->dev->dev, > "%s: i3c-scl-hz lower then i2c-scl-hz\n", __func__); Using dev_warn() sounds good, though I don't think you need the __func__ here. Also, please print the i2c/i3c rates in the message, and align the second line on the open parens. > if (i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_SCL_RATE || > i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_PLUS_SCL_RATE) > dev_warn(&i3cbus->cur_master->dev->dev, > "%s: i2c-scl-hz not defined according MIPI I3C spec\n", > __func__); Is that really a problem? Having an i2c rate that is less than FM speed sounds like a valid case to me. > > Maybe it make more sense to do this check on of_populate_i3c_bus(), what > do you think? > No, we really want to have this check here, because we might support other HW description formats at some point (board-files, ACPI, ...). _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-22 16:07 ` Boris Brezillon @ 2019-04-22 17:54 ` Vitor Soares 2019-04-22 18:27 ` Boris Brezillon 0 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-22 17:54 UTC (permalink / raw) To: Boris Brezillon, Vitor Soares Cc: linux-i3c, joao.pinto@synopsys.com, linux-kernel, stable, Boris Brezillon From: Boris Brezillon <boris.brezillon@collabora.com> Date: Mon, Apr 22, 2019 at 17:07:15 > On Mon, 22 Apr 2019 15:54:33 +0000 > Vitor Soares <Vitor.Soares@synopsys.com> wrote: > > > > > > > > > > > > > { > > > > > > 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. > > > > > > > > That was something that I considered but TBH it isn't a real use case. > > > > > > Add a WARN_ON() to at least catch such inconsistencies. And maybe we > > > should add a dev_warn() when the user-defined rates do not match > > > the mode/LVR constraints. It's easy to do a mistake when writing a dts. > > > > I think the WARN_ON() is too evasive on the screen and won't provide the > > information we want. > > The dev_warn() should work perfectly here. > > > > if (i3cbus->scl_rate.i3c < i3cbus->scl_rate.i2c) > > dev_warn(&i3cbus->cur_master->dev->dev, > > "%s: i3c-scl-hz lower then i2c-scl-hz\n", __func__); > > Using dev_warn() sounds good, though I don't think you need the > __func__ here. Also, please print the i2c/i3c rates in the message, and > align the second line on the open parens. > > > if (i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_SCL_RATE || > > i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_PLUS_SCL_RATE) > > dev_warn(&i3cbus->cur_master->dev->dev, > > "%s: i2c-scl-hz not defined according MIPI I3C spec\n", > > __func__); > > Is that really a problem? Having an i2c rate that is less than FM speed > sounds like a valid case to me. I'm addressing the spec constrains. In the practice it can be SM or even HS, it depends on the interface. > > > > > Maybe it make more sense to do this check on of_populate_i3c_bus(), what > > do you think? > > > > No, we really want to have this check here, because we might support > other HW description formats at some point (board-files, ACPI, ...). Yes, you are right. I forgot that point. _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-22 17:54 ` Vitor Soares @ 2019-04-22 18:27 ` Boris Brezillon 2019-04-22 19:59 ` Vitor Soares 0 siblings, 1 reply; 15+ messages in thread From: Boris Brezillon @ 2019-04-22 18:27 UTC (permalink / raw) To: Vitor Soares Cc: linux-i3c, joao.pinto@synopsys.com, linux-kernel, stable, Boris Brezillon On Mon, 22 Apr 2019 17:54:29 +0000 Vitor Soares <Vitor.Soares@synopsys.com> wrote: > > > > > > > > > > > > > { > > > > > > > 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. > > > > > > > > > > That was something that I considered but TBH it isn't a real use case. > > > > > > > > Add a WARN_ON() to at least catch such inconsistencies. And maybe we > > > > should add a dev_warn() when the user-defined rates do not match > > > > the mode/LVR constraints. It's easy to do a mistake when writing a dts. > > > > > > I think the WARN_ON() is too evasive on the screen and won't provide the > > > information we want. > > > The dev_warn() should work perfectly here. > > > > > > if (i3cbus->scl_rate.i3c < i3cbus->scl_rate.i2c) > > > dev_warn(&i3cbus->cur_master->dev->dev, > > > "%s: i3c-scl-hz lower then i2c-scl-hz\n", __func__); > > > > Using dev_warn() sounds good, though I don't think you need the > > __func__ here. Also, please print the i2c/i3c rates in the message, and > > align the second line on the open parens. > > > > > if (i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_SCL_RATE || > > > i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_PLUS_SCL_RATE) > > > dev_warn(&i3cbus->cur_master->dev->dev, > > > "%s: i2c-scl-hz not defined according MIPI I3C spec\n", > > > __func__); > > > > Is that really a problem? Having an i2c rate that is less than FM speed > > sounds like a valid case to me. > > I'm addressing the spec constrains. "Table 57 I3C Timing Requirements When Communicating With I2C Legacy Devices" says that freq can be between 0 and 400KHz when operating in slow(FM) mode. Yes, maximum rate when not specified otherwise is 400Khz, but the point of overloading the max I2C/I3C spec is to allow custom rates when the default/spec ones are not achievable, so I'm not sure complaining in that case is legitimate. We should definitely complain when one tries to set a maximum rate that is higher than what devices can do (i3cbus->scl_rate.i2c > max_i2c_scl_rate). Same goes for I3C communications, we shouldn't care when the forced rate is lower than what the bus is capable of, what's important is to complain when it's higher than what's supported. _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 1/3] i3c: fix i2c and i3c scl rate by bus mode 2019-04-22 18:27 ` Boris Brezillon @ 2019-04-22 19:59 ` Vitor Soares 0 siblings, 0 replies; 15+ messages in thread From: Vitor Soares @ 2019-04-22 19:59 UTC (permalink / raw) To: Boris Brezillon, Vitor Soares Cc: linux-i3c, joao.pinto@synopsys.com, linux-kernel, stable, Boris Brezillon From: Boris Brezillon <boris.brezillon@collabora.com> Date: Mon, Apr 22, 2019 at 19:27:32 > On Mon, 22 Apr 2019 17:54:29 +0000 > Vitor Soares <Vitor.Soares@synopsys.com> wrote: > > > > > > > > > > > > > > > > { > > > > > > > > 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. > > > > > > > > > > > > That was something that I considered but TBH it isn't a real use case. > > > > > > > > > > Add a WARN_ON() to at least catch such inconsistencies. And maybe we > > > > > should add a dev_warn() when the user-defined rates do not match > > > > > the mode/LVR constraints. It's easy to do a mistake when writing a dts. > > > > > > > > I think the WARN_ON() is too evasive on the screen and won't provide the > > > > information we want. > > > > The dev_warn() should work perfectly here. > > > > > > > > if (i3cbus->scl_rate.i3c < i3cbus->scl_rate.i2c) > > > > dev_warn(&i3cbus->cur_master->dev->dev, > > > > "%s: i3c-scl-hz lower then i2c-scl-hz\n", __func__); > > > > > > Using dev_warn() sounds good, though I don't think you need the > > > __func__ here. Also, please print the i2c/i3c rates in the message, and > > > align the second line on the open parens. > > > > > > > if (i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_SCL_RATE || > > > > i3cbus->scl_rate.i2c != I3C_BUS_I2C_FM_PLUS_SCL_RATE) > > > > dev_warn(&i3cbus->cur_master->dev->dev, > > > > "%s: i2c-scl-hz not defined according MIPI I3C spec\n", > > > > __func__); > > > > > > Is that really a problem? Having an i2c rate that is less than FM speed > > > sounds like a valid case to me. > > > > I'm addressing the spec constrains. > > "Table 57 I3C Timing Requirements When Communicating With I2C Legacy > Devices" says that freq can be between 0 and 400KHz when operating in > slow(FM) mode. That is the definition of Fast-mode: "Fast-mode devices can receive and transmit at up to 400kbit/s" as per i2c spec. So this way the slaves can be connected to Standard Mode bus... you already know that. For the FM requirements in I3C bus, please refer to I3C FAQ Q2.2 and table 56 of I3C v1.0 basic spec. > Yes, maximum rate when not specified otherwise is > 400Khz, By default you will have always FM or FM+ due the LVR register be mandatory. > but the point of overloading the max I2C/I3C spec is to allow > custom rates when the default/spec ones are not achievable, so I'm not > sure complaining in that case is legitimate. > Well, if the users aren't able to achieve at least FM is because something is not correct. > We should definitely complain when one tries to set a maximum rate that > is higher than what devices can do (i3cbus->scl_rate.i2c > > max_i2c_scl_rate). > I can put another if() for such cases. > Same goes for I3C communications, we shouldn't care when the forced rate > is lower than what the bus is capable of, what's important is to > complain when it's higher than what's supported. The point is complain when scl_rate.i3c < scl_rate.i2c because it can be error from user. Best regards, Vitor Soares _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/3] i3c: add mixed limited bus mode 2019-04-15 18:46 [PATCH 0/3] Fix i2c and i3c scl rate according bus mode Vitor Soares 2019-04-15 18:46 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares @ 2019-04-15 18:46 ` Vitor Soares 2019-04-16 6:00 ` Boris Brezillon 2019-04-15 18:46 ` [PATCH 3/3] i3c: dw: Add limited bus mode support Vitor Soares 2 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-15 18:46 UTC (permalink / raw) To: linux-i3c; +Cc: joao.pinto, Boris Brezillon, linux-kernel, Vitor Soares The i3c bus spec define a bus configuration where the i2c devices doesn't have the 50ns filter yet they allow the SDR max speed. This patch introduce the limited bus mode so the users can use a higher speed on presence of i2c devices index 1. Signed-off-by: Vitor Soares <vitor.soares@synopsys.com> Cc: Boris Brezillon <bbrezillon@kernel.org> Cc: <linux-kernel@vger.kernel.org> --- drivers/i3c/master.c | 5 +++++ include/linux/i3c/master.h | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c index 1c4a86a..46d3774 100644 --- a/drivers/i3c/master.c +++ b/drivers/i3c/master.c @@ -463,6 +463,7 @@ static int i3c_bus_init(struct i3c_bus *i3cbus) static const char * const i3c_bus_mode_strings[] = { [I3C_BUS_MODE_PURE] = "pure", [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast", + [I3C_BUS_MODE_MIXED_LIMITED] = "mixed-limited", [I3C_BUS_MODE_MIXED_SLOW] = "mixed-slow", }; @@ -575,6 +576,7 @@ int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; break; case I3C_BUS_MODE_MIXED_FAST: + case I3C_BUS_MODE_MIXED_LIMITED: if (!i3cbus->scl_rate.i3c) i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; if (!i3cbus->scl_rate.i2c) @@ -2481,6 +2483,9 @@ int i3c_master_register(struct i3c_master_controller *master, mode = I3C_BUS_MODE_MIXED_FAST; break; case I3C_LVR_I2C_INDEX(1): + if (mode < I3C_BUS_MODE_MIXED_LIMITED) + mode = I3C_BUS_MODE_MIXED_LIMITED; + break; case I3C_LVR_I2C_INDEX(2): if (mode < I3C_BUS_MODE_MIXED_SLOW) mode = I3C_BUS_MODE_MIXED_SLOW; diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h index 44fb3cf..740235e 100644 --- a/include/linux/i3c/master.h +++ b/include/linux/i3c/master.h @@ -250,12 +250,17 @@ struct i3c_device { * the bus. The only impact in this mode is that the * high SCL pulse has to stay below 50ns to trick I2C * devices when transmitting I3C frames + * @I3C_BUS_MODE_MIXED_LIMITED: I2C devices without 50ns spike filter are + * present on the bus. However they allows + * compliance up to the maximum SDR SCL clock + * frequency. * @I3C_BUS_MODE_MIXED_SLOW: I2C devices without 50ns spike filter are present * on the bus */ enum i3c_bus_mode { I3C_BUS_MODE_PURE, I3C_BUS_MODE_MIXED_FAST, + I3C_BUS_MODE_MIXED_LIMITED, I3C_BUS_MODE_MIXED_SLOW, }; -- 2.7.4 _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 2/3] i3c: add mixed limited bus mode 2019-04-15 18:46 ` [PATCH 2/3] i3c: add mixed limited " Vitor Soares @ 2019-04-16 6:00 ` Boris Brezillon 2019-04-16 14:27 ` Vitor Soares 0 siblings, 1 reply; 15+ messages in thread From: Boris Brezillon @ 2019-04-16 6:00 UTC (permalink / raw) To: Vitor Soares; +Cc: linux-i3c, joao.pinto, linux-kernel, Boris Brezillon Hi Vitor, On Mon, 15 Apr 2019 20:46:42 +0200 Vitor Soares <vitor.soares@synopsys.com> wrote: > The i3c bus spec define a bus configuration where the i2c devices ^defines I2C devices... > doesn't have the 50ns filter yet they allow the SDR max speed. ^don't ^ a 50ns filter but support SCL running at SDR max rate (12MHz). > > This patch introduce the limited bus mode so the users can use ^introduces ^ so that users > a higher speed on presence of i2c devices index 1. ^in > > Signed-off-by: Vitor Soares <vitor.soares@synopsys.com> > Cc: Boris Brezillon <bbrezillon@kernel.org> > Cc: <linux-kernel@vger.kernel.org> > --- > drivers/i3c/master.c | 5 +++++ > include/linux/i3c/master.h | 5 +++++ > 2 files changed, 10 insertions(+) > > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c > index 1c4a86a..46d3774 100644 > --- a/drivers/i3c/master.c > +++ b/drivers/i3c/master.c > @@ -463,6 +463,7 @@ static int i3c_bus_init(struct i3c_bus *i3cbus) > static const char * const i3c_bus_mode_strings[] = { > [I3C_BUS_MODE_PURE] = "pure", > [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast", > + [I3C_BUS_MODE_MIXED_LIMITED] = "mixed-limited", > [I3C_BUS_MODE_MIXED_SLOW] = "mixed-slow", > }; > > @@ -575,6 +576,7 @@ int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, > i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; > break; > case I3C_BUS_MODE_MIXED_FAST: > + case I3C_BUS_MODE_MIXED_LIMITED: > if (!i3cbus->scl_rate.i3c) > i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; > if (!i3cbus->scl_rate.i2c) > @@ -2481,6 +2483,9 @@ int i3c_master_register(struct i3c_master_controller *master, > mode = I3C_BUS_MODE_MIXED_FAST; > break; > case I3C_LVR_I2C_INDEX(1): > + if (mode < I3C_BUS_MODE_MIXED_LIMITED) > + mode = I3C_BUS_MODE_MIXED_LIMITED; > + break; > case I3C_LVR_I2C_INDEX(2): > if (mode < I3C_BUS_MODE_MIXED_SLOW) > mode = I3C_BUS_MODE_MIXED_SLOW; > diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h > index 44fb3cf..740235e 100644 > --- a/include/linux/i3c/master.h > +++ b/include/linux/i3c/master.h > @@ -250,12 +250,17 @@ struct i3c_device { > * the bus. The only impact in this mode is that the > * high SCL pulse has to stay below 50ns to trick I2C > * devices when transmitting I3C frames > + * @I3C_BUS_MODE_MIXED_LIMITED: I2C devices without 50ns spike filter are > + * present on the bus. However they allows > + * compliance up to the maximum SDR SCL clock > + * frequency. However they support SCL clock running at maximum SDR rate (12.5MHz). > * @I3C_BUS_MODE_MIXED_SLOW: I2C devices without 50ns spike filter are present > * on the bus > */ > enum i3c_bus_mode { > I3C_BUS_MODE_PURE, > I3C_BUS_MODE_MIXED_FAST, > + I3C_BUS_MODE_MIXED_LIMITED, > I3C_BUS_MODE_MIXED_SLOW, > }; > The code itself looks good. Thanks, Boris _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* RE: [PATCH 2/3] i3c: add mixed limited bus mode 2019-04-16 6:00 ` Boris Brezillon @ 2019-04-16 14:27 ` Vitor Soares 0 siblings, 0 replies; 15+ messages in thread From: Vitor Soares @ 2019-04-16 14:27 UTC (permalink / raw) To: Boris Brezillon, Vitor Soares Cc: linux-i3c, joao.pinto, linux-kernel, Boris Brezillon Hi Boris, From: Boris Brezillon <boris.brezillon@collabora.com> Date: Tue, Apr 16, 2019 at 07:00:49 > Hi Vitor, > > On Mon, 15 Apr 2019 20:46:42 +0200 > Vitor Soares <vitor.soares@synopsys.com> wrote: > > > The i3c bus spec define a bus configuration where the i2c devices > > ^defines I2C devices... > > > doesn't have the 50ns filter yet they allow the SDR max speed. > > ^don't ^ a 50ns filter but support SCL running at SDR max > rate (12MHz). > > > > > This patch introduce the limited bus mode so the users can use > > ^introduces ^ so that users > > > a higher speed on presence of i2c devices index 1. > > ^in > > > > > Signed-off-by: Vitor Soares <vitor.soares@synopsys.com> > > Cc: Boris Brezillon <bbrezillon@kernel.org> > > Cc: <linux-kernel@vger.kernel.org> > > --- > > drivers/i3c/master.c | 5 +++++ > > include/linux/i3c/master.h | 5 +++++ > > 2 files changed, 10 insertions(+) > > > > diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c > > index 1c4a86a..46d3774 100644 > > --- a/drivers/i3c/master.c > > +++ b/drivers/i3c/master.c > > @@ -463,6 +463,7 @@ static int i3c_bus_init(struct i3c_bus *i3cbus) > > static const char * const i3c_bus_mode_strings[] = { > > [I3C_BUS_MODE_PURE] = "pure", > > [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast", > > + [I3C_BUS_MODE_MIXED_LIMITED] = "mixed-limited", > > [I3C_BUS_MODE_MIXED_SLOW] = "mixed-slow", > > }; > > > > @@ -575,6 +576,7 @@ int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, > > i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; > > break; > > case I3C_BUS_MODE_MIXED_FAST: > > + case I3C_BUS_MODE_MIXED_LIMITED: > > if (!i3cbus->scl_rate.i3c) > > i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; > > if (!i3cbus->scl_rate.i2c) > > @@ -2481,6 +2483,9 @@ int i3c_master_register(struct i3c_master_controller *master, > > mode = I3C_BUS_MODE_MIXED_FAST; > > break; > > case I3C_LVR_I2C_INDEX(1): > > + if (mode < I3C_BUS_MODE_MIXED_LIMITED) > > + mode = I3C_BUS_MODE_MIXED_LIMITED; > > + break; > > case I3C_LVR_I2C_INDEX(2): > > if (mode < I3C_BUS_MODE_MIXED_SLOW) > > mode = I3C_BUS_MODE_MIXED_SLOW; > > diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h > > index 44fb3cf..740235e 100644 > > --- a/include/linux/i3c/master.h > > +++ b/include/linux/i3c/master.h > > @@ -250,12 +250,17 @@ struct i3c_device { > > * the bus. The only impact in this mode is that the > > * high SCL pulse has to stay below 50ns to trick I2C > > * devices when transmitting I3C frames > > + * @I3C_BUS_MODE_MIXED_LIMITED: I2C devices without 50ns spike filter are > > + * present on the bus. However they allows > > + * compliance up to the maximum SDR SCL clock > > + * frequency. > > However they support > SCL clock running at maximum SDR rate > (12.5MHz). > > > * @I3C_BUS_MODE_MIXED_SLOW: I2C devices without 50ns spike filter are present > > * on the bus > > */ > > enum i3c_bus_mode { > > I3C_BUS_MODE_PURE, > > I3C_BUS_MODE_MIXED_FAST, > > + I3C_BUS_MODE_MIXED_LIMITED, > > I3C_BUS_MODE_MIXED_SLOW, > > }; > > > > The code itself looks good. > > Thanks, > > Boris Thanks for your feedback I will address the fixes next version. Best regards, Vitor Soares _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3/3] i3c: dw: Add limited bus mode support 2019-04-15 18:46 [PATCH 0/3] Fix i2c and i3c scl rate according bus mode Vitor Soares 2019-04-15 18:46 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares 2019-04-15 18:46 ` [PATCH 2/3] i3c: add mixed limited " Vitor Soares @ 2019-04-15 18:46 ` Vitor Soares 2019-04-16 6:09 ` Boris Brezillon 2 siblings, 1 reply; 15+ messages in thread From: Vitor Soares @ 2019-04-15 18:46 UTC (permalink / raw) To: linux-i3c; +Cc: joao.pinto, Boris Brezillon, linux-kernel, Vitor Soares This patch add limited bus mode support for DesignWare i3c master Signed-off-by: Vitor Soares <vitor.soares@synopsys.com> Cc: Boris Brezillon <bbrezillon@kernel.org> Cc: <linux-kernel@vger.kernel.org> --- drivers/i3c/master/dw-i3c-master.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c index 0b01607..4005508 100644 --- a/drivers/i3c/master/dw-i3c-master.c +++ b/drivers/i3c/master/dw-i3c-master.c @@ -650,6 +650,7 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m) switch (bus->mode) { case I3C_BUS_MODE_MIXED_FAST: + case I3C_BUS_MODE_MIXED_LIMITED: ret = dw_i2c_clk_cfg(master); if (ret) return ret; -- 2.7.4 _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] i3c: dw: Add limited bus mode support 2019-04-15 18:46 ` [PATCH 3/3] i3c: dw: Add limited bus mode support Vitor Soares @ 2019-04-16 6:09 ` Boris Brezillon 0 siblings, 0 replies; 15+ messages in thread From: Boris Brezillon @ 2019-04-16 6:09 UTC (permalink / raw) To: Vitor Soares Cc: linux-i3c, joao.pinto, Przemyslaw Gaj, linux-kernel, Boris Brezillon +Przemek On Mon, 15 Apr 2019 20:46:43 +0200 Vitor Soares <vitor.soares@synopsys.com> wrote: > This patch add limited bus mode support for DesignWare i3c master > > Signed-off-by: Vitor Soares <vitor.soares@synopsys.com> > Cc: Boris Brezillon <bbrezillon@kernel.org> > Cc: <linux-kernel@vger.kernel.org> > --- > drivers/i3c/master/dw-i3c-master.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c > index 0b01607..4005508 100644 > --- a/drivers/i3c/master/dw-i3c-master.c > +++ b/drivers/i3c/master/dw-i3c-master.c > @@ -650,6 +650,7 @@ static int dw_i3c_master_bus_init(struct i3c_master_controller *m) > > switch (bus->mode) { > case I3C_BUS_MODE_MIXED_FAST: > + case I3C_BUS_MODE_MIXED_LIMITED: > ret = dw_i2c_clk_cfg(master); > if (ret) > return ret; Przemek, you might want to do the same thing in the Cadence driver. _______________________________________________ linux-i3c mailing list linux-i3c@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-i3c ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2019-04-22 19:59 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-04-15 18:46 [PATCH 0/3] Fix i2c and i3c scl rate according bus mode Vitor Soares 2019-04-15 18:46 ` [PATCH 1/3] i3c: fix i2c and i3c scl rate by " Vitor Soares 2019-04-16 5:50 ` Boris Brezillon 2019-04-16 14:24 ` Vitor Soares 2019-04-16 14:52 ` Boris Brezillon 2019-04-22 15:54 ` Vitor Soares 2019-04-22 16:07 ` Boris Brezillon 2019-04-22 17:54 ` Vitor Soares 2019-04-22 18:27 ` Boris Brezillon 2019-04-22 19:59 ` Vitor Soares 2019-04-15 18:46 ` [PATCH 2/3] i3c: add mixed limited " Vitor Soares 2019-04-16 6:00 ` Boris Brezillon 2019-04-16 14:27 ` Vitor Soares 2019-04-15 18:46 ` [PATCH 3/3] i3c: dw: Add limited bus mode support Vitor Soares 2019-04-16 6:09 ` Boris Brezillon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).