* [PATCH v9 0/1] Introducing an attribute to select the time setting @ 2022-02-09 9:54 Kewei Xu 2022-02-09 9:54 ` [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula Kewei Xu 0 siblings, 1 reply; 4+ messages in thread From: Kewei Xu @ 2022-02-09 9:54 UTC (permalink / raw) To: wsa Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang, liguo.zhang, caiyu.chen, housong.zhang, yuhan.wei, kewei.xu, ryan-jh.yu, david-yh.chiu v9: 1. Base on for-next remove received patch 2. Update ac-timing calculation algorithm to make i2c ac-timing meet specification and function normal. v8: Remove received patch v7: Resubmit the patch based on version 5.15-rc1 v6: 1. Add the judgment condition, clear the handshake signal between dma and i2c when multiple msgs are transmitted. v5: 1. Replace the previous variable name "default_timing_adjust" with "use-default-timing" 2. Added waiting for dma reset mechanism 3. Remove received patch(dt-bindings: i2c: update bindings for MT8195 SOC) v4: 1. Remove the repeated assignment of the inter_clk_div parameter 2. Modify the wrong assignment of OFFSET_MULTI_DMA 3. Unify the log print format of the i2c_dump_register() and drop the extra outer parentheses 4. Place the fixes at the very least 5. Add fixed tags commit 25708278f810 ("i2c: mediatek: Add i2c support for MediaTek MT8183") 6. Add "i2c: mediatek: modify bus speed calculation formula" 7. Fix single line characters exceeding 80 characters 8. Combine two different series of patches. v3: 1. Fix code errors caused by v2 modification v2: 1. Add "dt-bindings: i2c: add attribute default-timing-adjust" 2. Split the fix into sepatate patch. Kewei Xu (1): i2c: mediatek: modify bus speed calculation formula drivers/i2c/busses/i2c-mt65xx.c | 51 ++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 10 deletions(-) -- 2.18.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula 2022-02-09 9:54 [PATCH v9 0/1] Introducing an attribute to select the time setting Kewei Xu @ 2022-02-09 9:54 ` Kewei Xu 2022-02-14 11:58 ` AngeloGioacchino Del Regno 0 siblings, 1 reply; 4+ messages in thread From: Kewei Xu @ 2022-02-09 9:54 UTC (permalink / raw) To: wsa Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang, liguo.zhang, caiyu.chen, housong.zhang, yuhan.wei, kewei.xu, ryan-jh.yu, david-yh.chiu When clock-div is 0 or greater than 1, the bus speed calculated by the old speed calculation formula will be larger than the target speed. So we update the formula. Signed-off-by: Kewei Xu <kewei.xu@mediatek.com> Change-Id: Ic0d9b8ab036bcf215d3a5066f2b91c7b8b128ba6 --- drivers/i2c/busses/i2c-mt65xx.c | 51 +++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c index aa4d218..682293e 100644 --- a/drivers/i2c/busses/i2c-mt65xx.c +++ b/drivers/i2c/busses/i2c-mt65xx.c @@ -67,11 +67,12 @@ #define MAX_SAMPLE_CNT_DIV 8 #define MAX_STEP_CNT_DIV 64 -#define MAX_CLOCK_DIV 256 +#define MAX_CLOCK_DIV_8BITS 256 +#define MAX_CLOCK_DIV_5BITS 32 #define MAX_HS_STEP_CNT_DIV 8 -#define I2C_STANDARD_MODE_BUFFER (1000 / 2) -#define I2C_FAST_MODE_BUFFER (300 / 2) -#define I2C_FAST_MODE_PLUS_BUFFER (20 / 2) +#define I2C_STANDARD_MODE_BUFFER (1000 / 3) +#define I2C_FAST_MODE_BUFFER (300 / 3) +#define I2C_FAST_MODE_PLUS_BUFFER (20 / 3) #define I2C_CONTROL_RS (0x1 << 1) #define I2C_CONTROL_DMA_EN (0x1 << 2) @@ -604,6 +605,31 @@ static int mtk_i2c_max_step_cnt(unsigned int target_speed) return MAX_STEP_CNT_DIV; } +static int mtk_i2c_get_clk_div_restri(struct mtk_i2c *i2c, + unsigned int sample_cnt) +{ + int clk_div_restri = 0; + + if (i2c->dev_comp->ltiming_adjust == 0) + return 0; + + if (sample_cnt == 1) { + if (i2c->ac_timing.inter_clk_div == 0) + clk_div_restri = 0; + else + clk_div_restri = 1; + } else { + if (i2c->ac_timing.inter_clk_div == 0) + clk_div_restri = -1; + else if (i2c->ac_timing.inter_clk_div == 1) + clk_div_restri = 0; + else + clk_div_restri = 1; + } + + return clk_div_restri; +} + /* * Check and Calculate i2c ac-timing * @@ -732,6 +758,7 @@ static int mtk_i2c_calculate_speed(struct mtk_i2c *i2c, unsigned int clk_src, unsigned int best_mul; unsigned int cnt_mul; int ret = -EINVAL; + int clk_div_restri = 0; if (target_speed > I2C_MAX_HIGH_SPEED_MODE_FREQ) target_speed = I2C_MAX_HIGH_SPEED_MODE_FREQ; @@ -749,7 +776,8 @@ static int mtk_i2c_calculate_speed(struct mtk_i2c *i2c, unsigned int clk_src, * optimizing for sample_cnt * step_cnt being minimal */ for (sample_cnt = 1; sample_cnt <= MAX_SAMPLE_CNT_DIV; sample_cnt++) { - step_cnt = DIV_ROUND_UP(opt_div, sample_cnt); + clk_div_restri = mtk_i2c_get_clk_div_restri(i2c, sample_cnt); + step_cnt = DIV_ROUND_UP(opt_div + clk_div_restri, sample_cnt); cnt_mul = step_cnt * sample_cnt; if (step_cnt > max_step_cnt) continue; @@ -763,7 +791,7 @@ static int mtk_i2c_calculate_speed(struct mtk_i2c *i2c, unsigned int clk_src, best_mul = cnt_mul; base_sample_cnt = sample_cnt; base_step_cnt = step_cnt; - if (best_mul == opt_div) + if (best_mul == (opt_div + clk_div_restri)) break; } } @@ -774,7 +802,8 @@ static int mtk_i2c_calculate_speed(struct mtk_i2c *i2c, unsigned int clk_src, sample_cnt = base_sample_cnt; step_cnt = base_step_cnt; - if ((clk_src / (2 * sample_cnt * step_cnt)) > target_speed) { + if ((clk_src / (2 * (sample_cnt * step_cnt - clk_div_restri))) > + target_speed) { /* In this case, hardware can't support such * low i2c_bus_freq */ @@ -803,13 +832,16 @@ static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk) target_speed = i2c->speed_hz; parent_clk /= i2c->clk_src_div; - if (i2c->dev_comp->timing_adjust) - max_clk_div = MAX_CLOCK_DIV; + if (i2c->dev_comp->timing_adjust && i2c->dev_comp->ltiming_adjust) + max_clk_div = MAX_CLOCK_DIV_5BITS; + else if (i2c->dev_comp->timing_adjust) + max_clk_div = MAX_CLOCK_DIV_8BITS; else max_clk_div = 1; for (clk_div = 1; clk_div <= max_clk_div; clk_div++) { clk_src = parent_clk / clk_div; + i2c->ac_timing.inter_clk_div = clk_div - 1; if (target_speed > I2C_MAX_FAST_MODE_PLUS_FREQ) { /* Set master code speed register */ @@ -856,7 +888,6 @@ static int mtk_i2c_set_speed(struct mtk_i2c *i2c, unsigned int parent_clk) break; } - i2c->ac_timing.inter_clk_div = clk_div - 1; return 0; } -- 1.9.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula 2022-02-09 9:54 ` [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula Kewei Xu @ 2022-02-14 11:58 ` AngeloGioacchino Del Regno 2022-02-17 12:28 ` Kewei Xu 0 siblings, 1 reply; 4+ messages in thread From: AngeloGioacchino Del Regno @ 2022-02-14 11:58 UTC (permalink / raw) To: Kewei Xu, wsa Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang, liguo.zhang, caiyu.chen, housong.zhang, yuhan.wei, ryan-jh.yu, david-yh.chiu Il 09/02/22 10:54, Kewei Xu ha scritto: > When clock-div is 0 or greater than 1, the bus speed > calculated by the old speed calculation formula will be > larger than the target speed. So we update the formula. > > Signed-off-by: Kewei Xu <kewei.xu@mediatek.com> > Change-Id: Ic0d9b8ab036bcf215d3a5066f2b91c7b8b128ba6 Please remove Change-Id tag, this is inappropriate and it's also irrelevant here. After removing that tag: Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> > --- > drivers/i2c/busses/i2c-mt65xx.c | 51 +++++++++++++++++++++++++++++++++-------- > 1 file changed, 41 insertions(+), 10 deletions(-) > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula 2022-02-14 11:58 ` AngeloGioacchino Del Regno @ 2022-02-17 12:28 ` Kewei Xu 0 siblings, 0 replies; 4+ messages in thread From: Kewei Xu @ 2022-02-17 12:28 UTC (permalink / raw) To: AngeloGioacchino Del Regno, wsa Cc: matthias.bgg, robh+dt, linux-i2c, devicetree, linux-arm-kernel, linux-kernel, linux-mediatek, srv_heupstream, leilk.liu, qii.wang, liguo.zhang, caiyu.chen, housong.zhang, yuhan.wei, ryan-jh.yu, david-yh.chiu On Mon, 2022-02-14 at 12:58 +0100, AngeloGioacchino Del Regno wrote: > Il 09/02/22 10:54, Kewei Xu ha scritto: > > When clock-div is 0 or greater than 1, the bus speed > > calculated by the old speed calculation formula will be > > larger than the target speed. So we update the formula. > > > > Signed-off-by: Kewei Xu <kewei.xu@mediatek.com> > > Change-Id: Ic0d9b8ab036bcf215d3a5066f2b91c7b8b128ba6 > > Please remove Change-Id tag, this is inappropriate and it's also > irrelevant here. > > After removing that tag: > > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Hi, Okay, I will remove the Change-Id tag in V10. Thanks for your comment. thanks Kewei > > --- > > drivers/i2c/busses/i2c-mt65xx.c | 51 > > +++++++++++++++++++++++++++++++++-------- > > 1 file changed, 41 insertions(+), 10 deletions(-) > > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-02-17 12:28 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-02-09 9:54 [PATCH v9 0/1] Introducing an attribute to select the time setting Kewei Xu 2022-02-09 9:54 ` [PATCH v9 1/1] i2c: mediatek: modify bus speed calculation formula Kewei Xu 2022-02-14 11:58 ` AngeloGioacchino Del Regno 2022-02-17 12:28 ` Kewei Xu
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).