* [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support [not found] <1548069703-26595-1-git-send-email-alokc@codeaurora.org> @ 2019-01-21 11:21 ` Alok Chauhan 2019-01-22 6:54 ` alokc 0 siblings, 1 reply; 11+ messages in thread From: Alok Chauhan @ 2019-01-21 11:21 UTC (permalink / raw) To: linux-arm-msm, devicetree, Alok Chauhan, Karthikeyan Ramasubramanian, linux-i2c, linux-kernel Cc: andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson Get the interconnect paths for I2C based Serial Engine device and vote accordingly based on maximum supported I2C frequency. Signed-off-by: Alok Chauhan <alokc@codeaurora.org> --- drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index db075bc..e8fe63a 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -14,6 +14,7 @@ #include <linux/pm_runtime.h> #include <linux/qcom-geni-se.h> #include <linux/spinlock.h> +#include <linux/interconnect.h> #define SE_I2C_TX_TRANS_LEN 0x26c #define SE_I2C_RX_TRANS_LEN 0x270 @@ -508,6 +509,15 @@ static int geni_i2c_probe(struct platform_device *pdev) return ret; } + /* Set the bus quota to a reasonable value */ + gi2c->se.avg_bw = Bps_to_icc(1000); + gi2c->se.peak_bw = Bps_to_icc(76800000); + ret = geni_interconnect_init(&gi2c->se); + if (ret) { + dev_err(&pdev->dev, "interconnect_init failed %d\n", ret); + return ret; + } + ret = device_property_read_u32(&pdev->dev, "clock-frequency", &gi2c->clk_freq_out); if (ret) { @@ -611,6 +621,8 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev) gi2c->suspended = 1; } + geni_icc_update_bw(&gi2c->se, false); + return 0; } @@ -619,6 +631,7 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev) int ret; struct geni_i2c_dev *gi2c = dev_get_drvdata(dev); + geni_icc_update_bw(&gi2c->se, true); ret = geni_se_resources_on(&gi2c->se); if (ret) return ret; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-21 11:21 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan @ 2019-01-22 6:54 ` alokc 0 siblings, 0 replies; 11+ messages in thread From: alokc @ 2019-01-22 6:54 UTC (permalink / raw) To: linux-arm-msm, devicetree, Alok Chauhan, Karthikeyan Ramasubramanian, linux-i2c, linux-kernel Cc: andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson Please don't review this patch. I've resend patches after adding all the mailing list. Sorry for inconvenience. Please review patches with spi/i2c/uart/kernel mailing list added. On 2019-01-21 16:51, Alok Chauhan wrote: > Get the interconnect paths for I2C based Serial Engine device > and vote accordingly based on maximum supported I2C frequency. > > Signed-off-by: Alok Chauhan <alokc@codeaurora.org> > --- > drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/i2c/busses/i2c-qcom-geni.c > b/drivers/i2c/busses/i2c-qcom-geni.c > index db075bc..e8fe63a 100644 > --- a/drivers/i2c/busses/i2c-qcom-geni.c > +++ b/drivers/i2c/busses/i2c-qcom-geni.c > @@ -14,6 +14,7 @@ > #include <linux/pm_runtime.h> > #include <linux/qcom-geni-se.h> > #include <linux/spinlock.h> > +#include <linux/interconnect.h> > > #define SE_I2C_TX_TRANS_LEN 0x26c > #define SE_I2C_RX_TRANS_LEN 0x270 > @@ -508,6 +509,15 @@ static int geni_i2c_probe(struct platform_device > *pdev) > return ret; > } > > + /* Set the bus quota to a reasonable value */ > + gi2c->se.avg_bw = Bps_to_icc(1000); > + gi2c->se.peak_bw = Bps_to_icc(76800000); > + ret = geni_interconnect_init(&gi2c->se); > + if (ret) { > + dev_err(&pdev->dev, "interconnect_init failed %d\n", ret); > + return ret; > + } > + > ret = device_property_read_u32(&pdev->dev, "clock-frequency", > &gi2c->clk_freq_out); > if (ret) { > @@ -611,6 +621,8 @@ static int __maybe_unused > geni_i2c_runtime_suspend(struct device *dev) > gi2c->suspended = 1; > } > > + geni_icc_update_bw(&gi2c->se, false); > + > return 0; > } > > @@ -619,6 +631,7 @@ static int __maybe_unused > geni_i2c_runtime_resume(struct device *dev) > int ret; > struct geni_i2c_dev *gi2c = dev_get_drvdata(dev); > > + geni_icc_update_bw(&gi2c->se, true); > ret = geni_se_resources_on(&gi2c->se); > if (ret) > return ret; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 0/6] Add interconnect support for GENI QUPs @ 2019-01-22 6:33 Alok Chauhan 2019-01-22 6:33 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan 0 siblings, 1 reply; 11+ messages in thread From: Alok Chauhan @ 2019-01-22 6:33 UTC (permalink / raw) To: linux-arm-msm, devicetree, linux-kernel, linux-i2c, linux-spi, linux-serial Cc: andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson, Alok Chauhan This patch series contains following: * Add wrapper framework to support interconnect path from GENI QUPs. This wrapper enabled and help individual SEs to put their BW request. Adding this wrapper make sense because we don't want individual SEs to request to interconnect driver separately and put individual bw votes from QUP. This wrapper framework does the following: - Request for interconnect path handle - Maintain record of individual SEs' avg/peak bw. - Aggregated avg/peak bw based on how many SE's are active and put single bw request from QUP * Interconnect wrapper API calling from I2C, SPI & Uart driver * dt binding in sdm845 soc for Interconnect path for GENI QUPs * dt binding documentation Alok Chauhan (6): dt-bindings: soc: qcom: Add interconnect binding for GENI QUP soc: qcom: Add wrapper to support for Interconnect path i2c: i2c-qcom-geni: Add interconnect support spi: spi-geni-qcom: Add interconnect support tty: serial: qcom_geni_serial: Add interconnect support arm64: dts: sdm845: Add interconnect for GENI QUP .../devicetree/bindings/soc/qcom/qcom,geni-se.txt | 10 ++ arch/arm64/boot/dts/qcom/sdm845.dtsi | 14 +++ drivers/i2c/busses/i2c-qcom-geni.c | 13 +++ drivers/soc/qcom/qcom-geni-se.c | 129 +++++++++++++++++++++ drivers/spi/spi-geni-qcom.c | 20 +++- drivers/tty/serial/qcom_geni_serial.c | 27 ++++- include/linux/qcom-geni-se.h | 11 ++ 7 files changed, 222 insertions(+), 2 deletions(-) -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-22 6:33 [PATCH 0/6] Add interconnect support for GENI QUPs Alok Chauhan @ 2019-01-22 6:33 ` Alok Chauhan 2019-01-22 9:07 ` Wolfram Sang ` (2 more replies) 0 siblings, 3 replies; 11+ messages in thread From: Alok Chauhan @ 2019-01-22 6:33 UTC (permalink / raw) To: linux-arm-msm, devicetree, linux-kernel, linux-i2c, linux-spi, linux-serial, Alok Chauhan, Karthikeyan Ramasubramanian Cc: andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson Get the interconnect paths for I2C based Serial Engine device and vote accordingly based on maximum supported I2C frequency. Signed-off-by: Alok Chauhan <alokc@codeaurora.org> --- drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index db075bc..e8fe63a 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -14,6 +14,7 @@ #include <linux/pm_runtime.h> #include <linux/qcom-geni-se.h> #include <linux/spinlock.h> +#include <linux/interconnect.h> #define SE_I2C_TX_TRANS_LEN 0x26c #define SE_I2C_RX_TRANS_LEN 0x270 @@ -508,6 +509,15 @@ static int geni_i2c_probe(struct platform_device *pdev) return ret; } + /* Set the bus quota to a reasonable value */ + gi2c->se.avg_bw = Bps_to_icc(1000); + gi2c->se.peak_bw = Bps_to_icc(76800000); + ret = geni_interconnect_init(&gi2c->se); + if (ret) { + dev_err(&pdev->dev, "interconnect_init failed %d\n", ret); + return ret; + } + ret = device_property_read_u32(&pdev->dev, "clock-frequency", &gi2c->clk_freq_out); if (ret) { @@ -611,6 +621,8 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev) gi2c->suspended = 1; } + geni_icc_update_bw(&gi2c->se, false); + return 0; } @@ -619,6 +631,7 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev) int ret; struct geni_i2c_dev *gi2c = dev_get_drvdata(dev); + geni_icc_update_bw(&gi2c->se, true); ret = geni_se_resources_on(&gi2c->se); if (ret) return ret; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-22 6:33 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan @ 2019-01-22 9:07 ` Wolfram Sang 2019-01-22 9:13 ` Peter Rosin 2019-01-24 1:19 ` Evan Green 2 siblings, 0 replies; 11+ messages in thread From: Wolfram Sang @ 2019-01-22 9:07 UTC (permalink / raw) To: Alok Chauhan Cc: linux-arm-msm, devicetree, linux-kernel, linux-i2c, linux-spi, linux-serial, Karthikeyan Ramasubramanian, andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson [-- Attachment #1: Type: text/plain, Size: 300 bytes --] On Tue, Jan 22, 2019 at 12:03:33PM +0530, Alok Chauhan wrote: > Get the interconnect paths for I2C based Serial Engine device > and vote accordingly based on maximum supported I2C frequency. > > Signed-off-by: Alok Chauhan <alokc@codeaurora.org> Acked-by: Wolfram Sang <wsa@the-dreams.de> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-22 6:33 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan 2019-01-22 9:07 ` Wolfram Sang @ 2019-01-22 9:13 ` Peter Rosin 2019-01-23 6:51 ` alokc 2019-01-24 1:19 ` Evan Green 2 siblings, 1 reply; 11+ messages in thread From: Peter Rosin @ 2019-01-22 9:13 UTC (permalink / raw) To: Alok Chauhan, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, linux-spi@vger.kernel.org, linux-serial@vger.kernel.org, Karthikeyan Ramasubramanian Cc: andy.gross@linaro.org, david.brown@linaro.org, georgi.djakov@linaro.org, dianders@chromium.org, swboyd@chromium.org, bjorn.andersson@linaro.org On 2019-01-22 07:33, Alok Chauhan wrote: > Get the interconnect paths for I2C based Serial Engine device > and vote accordingly based on maximum supported I2C frequency. > > Signed-off-by: Alok Chauhan <alokc@codeaurora.org> > --- > drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c > index db075bc..e8fe63a 100644 > --- a/drivers/i2c/busses/i2c-qcom-geni.c > +++ b/drivers/i2c/busses/i2c-qcom-geni.c > @@ -14,6 +14,7 @@ > #include <linux/pm_runtime.h> > #include <linux/qcom-geni-se.h> > #include <linux/spinlock.h> > +#include <linux/interconnect.h> Please keep the includes sorted. Probably applies for the other patches in the series as well? Cheers, Peter ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-22 9:13 ` Peter Rosin @ 2019-01-23 6:51 ` alokc 0 siblings, 0 replies; 11+ messages in thread From: alokc @ 2019-01-23 6:51 UTC (permalink / raw) To: Peter Rosin Cc: linux-arm-msm, devicetree, linux-kernel, linux-i2c, linux-spi, linux-serial, Karthikeyan Ramasubramanian, andy.gross, david.brown, georgi.djakov, dianders, swboyd, bjorn.andersson, linux-arm-msm-owner, Mark Brown On 2019-01-22 14:43, Peter Rosin wrote: > On 2019-01-22 07:33, Alok Chauhan wrote: >> Get the interconnect paths for I2C based Serial Engine device >> and vote accordingly based on maximum supported I2C frequency. >> >> Signed-off-by: Alok Chauhan <alokc@codeaurora.org> >> --- >> drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ >> 1 file changed, 13 insertions(+) >> >> diff --git a/drivers/i2c/busses/i2c-qcom-geni.c >> b/drivers/i2c/busses/i2c-qcom-geni.c >> index db075bc..e8fe63a 100644 >> --- a/drivers/i2c/busses/i2c-qcom-geni.c >> +++ b/drivers/i2c/busses/i2c-qcom-geni.c >> @@ -14,6 +14,7 @@ >> #include <linux/pm_runtime.h> >> #include <linux/qcom-geni-se.h> >> #include <linux/spinlock.h> >> +#include <linux/interconnect.h> > > Please keep the includes sorted. Probably applies for the other patches > in the series as well? > > Cheers, > Peter Sure, will do. Thanks for your comment. -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,a Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2019-01-22 6:33 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan 2019-01-22 9:07 ` Wolfram Sang 2019-01-22 9:13 ` Peter Rosin @ 2019-01-24 1:19 ` Evan Green 2 siblings, 0 replies; 11+ messages in thread From: Evan Green @ 2019-01-24 1:19 UTC (permalink / raw) To: Alok Chauhan Cc: linux-arm-msm, devicetree, LKML, linux-i2c, linux-spi, linux-serial, Karthikeyan Ramasubramanian, Andy Gross, David Brown, Georgi Djakov, Doug Anderson, Stephen Boyd, Bjorn Andersson On Mon, Jan 21, 2019 at 10:34 PM Alok Chauhan <alokc@codeaurora.org> wrote: > > Get the interconnect paths for I2C based Serial Engine device > and vote accordingly based on maximum supported I2C frequency. > > Signed-off-by: Alok Chauhan <alokc@codeaurora.org> > --- > drivers/i2c/busses/i2c-qcom-geni.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c > index db075bc..e8fe63a 100644 > --- a/drivers/i2c/busses/i2c-qcom-geni.c > +++ b/drivers/i2c/busses/i2c-qcom-geni.c > @@ -14,6 +14,7 @@ > #include <linux/pm_runtime.h> > #include <linux/qcom-geni-se.h> > #include <linux/spinlock.h> > +#include <linux/interconnect.h> > > #define SE_I2C_TX_TRANS_LEN 0x26c > #define SE_I2C_RX_TRANS_LEN 0x270 > @@ -508,6 +509,15 @@ static int geni_i2c_probe(struct platform_device *pdev) > return ret; > } > > + /* Set the bus quota to a reasonable value */ > + gi2c->se.avg_bw = Bps_to_icc(1000); > + gi2c->se.peak_bw = Bps_to_icc(76800000); Can you compute a real bandwidth based on the i2c bus speed, rather than some max vote? ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 0/6] Add interconnect support to UART, I2C, SPI and QSPI @ 2020-02-17 13:29 Akash Asthana [not found] ` <1581946205-27189-1-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 0 siblings, 1 reply; 11+ messages in thread From: Akash Asthana @ 2020-02-17 13:29 UTC (permalink / raw) To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, agross-DgEjT+Ai2ygdnm+yROfE0A, bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A, wsa-z923LK4zBo2bacvFa/9K2g, broonie-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-spi-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, swboyd-F7+t8E8rja9g9hUCZPvPmw, mgautam-sgV2jX0FEOL9JmXXK+q4OQ, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, linux-serial-u79uwXL29TY76Z2rM5mHXA, mka-F7+t8E8rja9g9hUCZPvPmw, dianders-F7+t8E8rja9g9hUCZPvPmw, Akash Asthana dt-binding patch for UART, I2C and SPI. - https://patchwork.kernel.org/patch/11385965/ [Convert QUP bindings to YAML and add ICC, pin swap doc] dt-binding patch for QSPI. - https://patchwork.kernel.org/cover/11386003/ [Convert QSPI binding to YAML and add interconnect doc] Akash Asthana (6): soc: qcom: geni: Support for ICC voting tty: serial: qcom_geni_serial: Add interconnect support i2c: i2c-qcom-geni: Add interconnect support spi: spi-geni-qcom: Add interconnect support spi: spi-qcom-qspi: Add interconnect support arm64: dts: sc7180: Add interconnect for QUP and QSPI arch/arm64/boot/dts/qcom/sc7180.dtsi | 199 ++++++++++++++++++++++++++++++++++ drivers/i2c/busses/i2c-qcom-geni.c | 84 +++++++++++++- drivers/spi/spi-geni-qcom.c | 65 ++++++++++- drivers/spi/spi-qcom-qspi.c | 38 ++++++- drivers/tty/serial/qcom_geni_serial.c | 84 ++++++++++++-- include/linux/qcom-geni-se.h | 31 ++++++ 6 files changed, 481 insertions(+), 20 deletions(-) -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,\na Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 11+ messages in thread
[parent not found: <1581946205-27189-1-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support [not found] ` <1581946205-27189-1-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> @ 2020-02-17 13:30 ` Akash Asthana [not found] ` <1581946205-27189-4-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 0 siblings, 1 reply; 11+ messages in thread From: Akash Asthana @ 2020-02-17 13:30 UTC (permalink / raw) To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, agross-DgEjT+Ai2ygdnm+yROfE0A, bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A, wsa-z923LK4zBo2bacvFa/9K2g, broonie-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-spi-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, swboyd-F7+t8E8rja9g9hUCZPvPmw, mgautam-sgV2jX0FEOL9JmXXK+q4OQ, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, linux-serial-u79uwXL29TY76Z2rM5mHXA, mka-F7+t8E8rja9g9hUCZPvPmw, dianders-F7+t8E8rja9g9hUCZPvPmw, Akash Asthana Get the interconnect paths for I2C based Serial Engine device and vote according to the bus speed of the driver. Signed-off-by: Akash Asthana <akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> --- drivers/i2c/busses/i2c-qcom-geni.c | 84 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c index 17abf60c..5de10a1 100644 --- a/drivers/i2c/busses/i2c-qcom-geni.c +++ b/drivers/i2c/busses/i2c-qcom-geni.c @@ -163,6 +163,44 @@ static void qcom_geni_i2c_conf(struct geni_i2c_dev *gi2c) writel_relaxed(val, gi2c->se.base + SE_I2C_SCL_COUNTERS); } +static int geni_i2c_icc_get(struct geni_se *se) +{ + if (!se) + return -EINVAL; + + se->icc_path[GENI_TO_CORE] = of_icc_get(se->dev, "qup-core"); + if (IS_ERR(se->icc_path[GENI_TO_CORE])) + return PTR_ERR(se->icc_path[GENI_TO_CORE]); + + se->icc_path[CPU_TO_GENI] = of_icc_get(se->dev, "qup-config"); + if (IS_ERR(se->icc_path[CPU_TO_GENI])) { + icc_put(se->icc_path[GENI_TO_CORE]); + se->icc_path[GENI_TO_CORE] = NULL; + return PTR_ERR(se->icc_path[CPU_TO_GENI]); + } + + se->icc_path[GENI_TO_DDR] = of_icc_get(se->dev, "qup-memory"); + if (IS_ERR(se->icc_path[GENI_TO_DDR])) { + icc_put(se->icc_path[GENI_TO_CORE]); + se->icc_path[GENI_TO_CORE] = NULL; + icc_put(se->icc_path[CPU_TO_GENI]); + se->icc_path[CPU_TO_GENI] = NULL; + return PTR_ERR(se->icc_path[GENI_TO_DDR]); + } + + return 0; +} + +void geni_i2c_icc_put(struct geni_se *se) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(se->icc_path); i++) { + icc_put(se->icc_path[i]); + se->icc_path[i] = NULL; + } +} + static void geni_i2c_err_misc(struct geni_i2c_dev *gi2c) { u32 m_cmd = readl_relaxed(gi2c->se.base + SE_GENI_M_CMD0); @@ -563,17 +601,34 @@ static int geni_i2c_probe(struct platform_device *pdev) gi2c->adap.dev.of_node = pdev->dev.of_node; strlcpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name)); + ret = geni_i2c_icc_get(&gi2c->se); + if (ret) + return ret; + /* Set the bus quota to a reasonable value */ + gi2c->se.avg_bw_core = Bps_to_icc(1000); + gi2c->se.peak_bw_core = Bps_to_icc(CORE_2X_100_MHZ); + gi2c->se.avg_bw_cpu = Bps_to_icc(1000); + gi2c->se.peak_bw_cpu = Bps_to_icc(1000); + gi2c->se.avg_bw_ddr = Bps_to_icc(gi2c->clk_freq_out); + gi2c->se.peak_bw_ddr = Bps_to_icc(2 * gi2c->clk_freq_out); + + /* Vote for core clocks and CPU for register access */ + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], gi2c->se.avg_bw_core, + gi2c->se.peak_bw_core); + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], gi2c->se.avg_bw_cpu, + gi2c->se.peak_bw_cpu); ret = geni_se_resources_on(&gi2c->se); if (ret) { dev_err(&pdev->dev, "Error turning on resources %d\n", ret); - return ret; + goto geni_i2c_put_icc; } proto = geni_se_read_proto(&gi2c->se); tx_depth = geni_se_get_tx_fifo_depth(&gi2c->se); if (proto != GENI_SE_I2C) { dev_err(&pdev->dev, "Invalid proto %d\n", proto); geni_se_resources_off(&gi2c->se); - return -ENXIO; + ret = -ENXIO; + goto geni_i2c_put_icc; } gi2c->tx_wm = tx_depth - 1; geni_se_init(&gi2c->se, gi2c->tx_wm, tx_depth); @@ -582,8 +637,11 @@ static int geni_i2c_probe(struct platform_device *pdev) ret = geni_se_resources_off(&gi2c->se); if (ret) { dev_err(&pdev->dev, "Error turning off resources %d\n", ret); - return ret; + goto geni_i2c_put_icc; } + /* Remove vote from core clocks and CPU */ + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], 0, 0); + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], 0, 0); dev_dbg(&pdev->dev, "i2c fifo/se-dma mode. fifo depth:%d\n", tx_depth); @@ -597,12 +655,16 @@ static int geni_i2c_probe(struct platform_device *pdev) if (ret) { dev_err(&pdev->dev, "Error adding i2c adapter %d\n", ret); pm_runtime_disable(gi2c->se.dev); - return ret; + goto geni_i2c_put_icc; } dev_dbg(&pdev->dev, "Geni-I2C adaptor successfully added\n"); return 0; + +geni_i2c_put_icc: + geni_i2c_icc_put(&gi2c->se); + return ret; } static int geni_i2c_remove(struct platform_device *pdev) @@ -611,6 +673,7 @@ static int geni_i2c_remove(struct platform_device *pdev) i2c_del_adapter(&gi2c->adap); pm_runtime_disable(gi2c->se.dev); + geni_i2c_icc_put(&gi2c->se); return 0; } @@ -629,6 +692,11 @@ static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev) gi2c->suspended = 1; } + /* Remove BW votes */ + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], 0, 0); + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], 0, 0); + icc_set_bw(gi2c->se.icc_path[GENI_TO_DDR], 0, 0); + return 0; } @@ -637,6 +705,14 @@ static int __maybe_unused geni_i2c_runtime_resume(struct device *dev) int ret; struct geni_i2c_dev *gi2c = dev_get_drvdata(dev); + /* Vote on Core, DDR and CPU path respectively */ + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], gi2c->se.avg_bw_core, + gi2c->se.peak_bw_core); + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], gi2c->se.avg_bw_cpu, + gi2c->se.peak_bw_cpu); + icc_set_bw(gi2c->se.icc_path[GENI_TO_DDR], gi2c->se.avg_bw_ddr, + gi2c->se.peak_bw_ddr); + ret = geni_se_resources_on(&gi2c->se); if (ret) return ret; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,\na Linux Foundation Collaborative Project ^ permalink raw reply related [flat|nested] 11+ messages in thread
[parent not found: <1581946205-27189-4-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support [not found] ` <1581946205-27189-4-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> @ 2020-02-18 22:47 ` Matthias Kaehlcke 2020-02-19 13:47 ` Akash Asthana 0 siblings, 1 reply; 11+ messages in thread From: Matthias Kaehlcke @ 2020-02-18 22:47 UTC (permalink / raw) To: Akash Asthana Cc: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, agross-DgEjT+Ai2ygdnm+yROfE0A, bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A, wsa-z923LK4zBo2bacvFa/9K2g, broonie-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, linux-i2c-u79uwXL29TY76Z2rM5mHXA, linux-spi-u79uwXL29TY76Z2rM5mHXA, devicetree-u79uwXL29TY76Z2rM5mHXA, swboyd-F7+t8E8rja9g9hUCZPvPmw, mgautam-sgV2jX0FEOL9JmXXK+q4OQ, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, linux-serial-u79uwXL29TY76Z2rM5mHXA, dianders-F7+t8E8rja9g9hUCZPvPmw On Mon, Feb 17, 2020 at 07:00:02PM +0530, Akash Asthana wrote: > Get the interconnect paths for I2C based Serial Engine device > and vote according to the bus speed of the driver. > > Signed-off-by: Akash Asthana <akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> > --- > drivers/i2c/busses/i2c-qcom-geni.c | 84 ++++++++++++++++++++++++++++++++++++-- > 1 file changed, 80 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c > index 17abf60c..5de10a1 100644 > --- a/drivers/i2c/busses/i2c-qcom-geni.c > +++ b/drivers/i2c/busses/i2c-qcom-geni.c > @@ -163,6 +163,44 @@ static void qcom_geni_i2c_conf(struct geni_i2c_dev *gi2c) > writel_relaxed(val, gi2c->se.base + SE_I2C_SCL_COUNTERS); > } > > +static int geni_i2c_icc_get(struct geni_se *se) > +{ > + if (!se) > + return -EINVAL; check is not needed > + > + se->icc_path[GENI_TO_CORE] = of_icc_get(se->dev, "qup-core"); > + if (IS_ERR(se->icc_path[GENI_TO_CORE])) > + return PTR_ERR(se->icc_path[GENI_TO_CORE]); > + > + se->icc_path[CPU_TO_GENI] = of_icc_get(se->dev, "qup-config"); > + if (IS_ERR(se->icc_path[CPU_TO_GENI])) { > + icc_put(se->icc_path[GENI_TO_CORE]); > + se->icc_path[GENI_TO_CORE] = NULL; echoing Bjorn's comments on 'tty: serial: qcom_geni_serial: Add interconnect support', resetting is not needed since _probe() will fail. > + return PTR_ERR(se->icc_path[CPU_TO_GENI]); > + } > + > + se->icc_path[GENI_TO_DDR] = of_icc_get(se->dev, "qup-memory"); > + if (IS_ERR(se->icc_path[GENI_TO_DDR])) { > + icc_put(se->icc_path[GENI_TO_CORE]); > + se->icc_path[GENI_TO_CORE] = NULL; ditto > + icc_put(se->icc_path[CPU_TO_GENI]); > + se->icc_path[CPU_TO_GENI] = NULL; ditto > + return PTR_ERR(se->icc_path[GENI_TO_DDR]); > + } > + > + return 0; > +} > + > +void geni_i2c_icc_put(struct geni_se *se) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(se->icc_path); i++) { > + icc_put(se->icc_path[i]); > + se->icc_path[i] = NULL; not needed > + } > +} > + > static void geni_i2c_err_misc(struct geni_i2c_dev *gi2c) > { > u32 m_cmd = readl_relaxed(gi2c->se.base + SE_GENI_M_CMD0); > @@ -563,17 +601,34 @@ static int geni_i2c_probe(struct platform_device *pdev) > gi2c->adap.dev.of_node = pdev->dev.of_node; > strlcpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name)); > > + ret = geni_i2c_icc_get(&gi2c->se); > + if (ret) > + return ret; > + /* Set the bus quota to a reasonable value */ > + gi2c->se.avg_bw_core = Bps_to_icc(1000); > + gi2c->se.peak_bw_core = Bps_to_icc(CORE_2X_100_MHZ); > + gi2c->se.avg_bw_cpu = Bps_to_icc(1000); > + gi2c->se.peak_bw_cpu = Bps_to_icc(1000); > + gi2c->se.avg_bw_ddr = Bps_to_icc(gi2c->clk_freq_out); > + gi2c->se.peak_bw_ddr = Bps_to_icc(2 * gi2c->clk_freq_out); > + > + /* Vote for core clocks and CPU for register access */ > + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], gi2c->se.avg_bw_core, > + gi2c->se.peak_bw_core); > + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], gi2c->se.avg_bw_cpu, > + gi2c->se.peak_bw_cpu); error handling needed? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2020-02-18 22:47 ` Matthias Kaehlcke @ 2020-02-19 13:47 ` Akash Asthana 2020-02-21 0:24 ` Matthias Kaehlcke 0 siblings, 1 reply; 11+ messages in thread From: Akash Asthana @ 2020-02-19 13:47 UTC (permalink / raw) To: Matthias Kaehlcke Cc: gregkh, agross, bjorn.andersson, wsa, broonie, mark.rutland, robh+dt, linux-i2c, linux-spi, devicetree, swboyd, mgautam, linux-arm-msm, linux-serial, dianders Hi Matthias, On 2/19/2020 4:17 AM, Matthias Kaehlcke wrote: > On Mon, Feb 17, 2020 at 07:00:02PM +0530, Akash Asthana wrote: >> Get the interconnect paths for I2C based Serial Engine device >> and vote according to the bus speed of the driver. >> >> Signed-off-by: Akash Asthana <akashast@codeaurora.org> >> --- >> drivers/i2c/busses/i2c-qcom-geni.c | 84 ++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 80 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c >> index 17abf60c..5de10a1 100644 >> --- a/drivers/i2c/busses/i2c-qcom-geni.c >> +++ b/drivers/i2c/busses/i2c-qcom-geni.c >> @@ -163,6 +163,44 @@ static void qcom_geni_i2c_conf(struct geni_i2c_dev *gi2c) >> writel_relaxed(val, gi2c->se.base + SE_I2C_SCL_COUNTERS); >> } >> >> +static int geni_i2c_icc_get(struct geni_se *se) >> +{ >> + if (!se) >> + return -EINVAL; > check is not needed ok, will remove. > >> + >> + se->icc_path[GENI_TO_CORE] = of_icc_get(se->dev, "qup-core"); >> + if (IS_ERR(se->icc_path[GENI_TO_CORE])) >> + return PTR_ERR(se->icc_path[GENI_TO_CORE]); >> + >> + se->icc_path[CPU_TO_GENI] = of_icc_get(se->dev, "qup-config"); >> + if (IS_ERR(se->icc_path[CPU_TO_GENI])) { >> + icc_put(se->icc_path[GENI_TO_CORE]); >> + se->icc_path[GENI_TO_CORE] = NULL; > echoing Bjorn's comments on 'tty: serial: qcom_geni_serial: Add > interconnect support', resetting is not needed since _probe() will > fail. ok, will remove >> + return PTR_ERR(se->icc_path[CPU_TO_GENI]); >> + } >> + >> + se->icc_path[GENI_TO_DDR] = of_icc_get(se->dev, "qup-memory"); >> + if (IS_ERR(se->icc_path[GENI_TO_DDR])) { >> + icc_put(se->icc_path[GENI_TO_CORE]); >> + se->icc_path[GENI_TO_CORE] = NULL; > ditto ok >> + icc_put(se->icc_path[CPU_TO_GENI]); >> + se->icc_path[CPU_TO_GENI] = NULL; > ditto ok >> + return PTR_ERR(se->icc_path[GENI_TO_DDR]); >> + } >> + >> + return 0; >> +} >> + >> +void geni_i2c_icc_put(struct geni_se *se) >> +{ >> + int i; >> + >> + for (i = 0; i < ARRAY_SIZE(se->icc_path); i++) { >> + icc_put(se->icc_path[i]); >> + se->icc_path[i] = NULL; > not needed ok, will remove >> + } >> +} >> + >> static void geni_i2c_err_misc(struct geni_i2c_dev *gi2c) >> { >> u32 m_cmd = readl_relaxed(gi2c->se.base + SE_GENI_M_CMD0); >> @@ -563,17 +601,34 @@ static int geni_i2c_probe(struct platform_device *pdev) >> gi2c->adap.dev.of_node = pdev->dev.of_node; >> strlcpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name)); >> >> + ret = geni_i2c_icc_get(&gi2c->se); >> + if (ret) >> + return ret; >> + /* Set the bus quota to a reasonable value */ >> + gi2c->se.avg_bw_core = Bps_to_icc(1000); >> + gi2c->se.peak_bw_core = Bps_to_icc(CORE_2X_100_MHZ); >> + gi2c->se.avg_bw_cpu = Bps_to_icc(1000); >> + gi2c->se.peak_bw_cpu = Bps_to_icc(1000); >> + gi2c->se.avg_bw_ddr = Bps_to_icc(gi2c->clk_freq_out); >> + gi2c->se.peak_bw_ddr = Bps_to_icc(2 * gi2c->clk_freq_out); >> + >> + /* Vote for core clocks and CPU for register access */ >> + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], gi2c->se.avg_bw_core, >> + gi2c->se.peak_bw_core); >> + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], gi2c->se.avg_bw_cpu, >> + gi2c->se.peak_bw_cpu); > error handling needed? I will add error handling for GENI_TO_CORE path in all the drivers. Will it be okay if we don't handle errors for CPU_TO_GENI and GENI_TO_DDR path as CPU and DDR will be running at much higher frequency? Regards, Akash -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,\na Linux Foundation Collaborative Project ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support 2020-02-19 13:47 ` Akash Asthana @ 2020-02-21 0:24 ` Matthias Kaehlcke 0 siblings, 0 replies; 11+ messages in thread From: Matthias Kaehlcke @ 2020-02-21 0:24 UTC (permalink / raw) To: Akash Asthana Cc: gregkh, agross, bjorn.andersson, wsa, broonie, mark.rutland, robh+dt, linux-i2c, linux-spi, devicetree, swboyd, mgautam, linux-arm-msm, linux-serial, dianders Hi Akash, On Wed, Feb 19, 2020 at 07:17:44PM +0530, Akash Asthana wrote: > Hi Matthias, > > On 2/19/2020 4:17 AM, Matthias Kaehlcke wrote: > > On Mon, Feb 17, 2020 at 07:00:02PM +0530, Akash Asthana wrote: > > > Get the interconnect paths for I2C based Serial Engine device > > > and vote according to the bus speed of the driver. > > > > > > Signed-off-by: Akash Asthana <akashast@codeaurora.org> > > > --- > > > drivers/i2c/busses/i2c-qcom-geni.c | 84 ++++++++++++++++++++++++++++++++++++-- > > > 1 file changed, 80 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c > > > index 17abf60c..5de10a1 100644 > > > --- a/drivers/i2c/busses/i2c-qcom-geni.c > > > +++ b/drivers/i2c/busses/i2c-qcom-geni.c > > > > > > static void geni_i2c_err_misc(struct geni_i2c_dev *gi2c) > > > { > > > u32 m_cmd = readl_relaxed(gi2c->se.base + SE_GENI_M_CMD0); > > > @@ -563,17 +601,34 @@ static int geni_i2c_probe(struct platform_device *pdev) > > > gi2c->adap.dev.of_node = pdev->dev.of_node; > > > strlcpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name)); > > > + ret = geni_i2c_icc_get(&gi2c->se); > > > + if (ret) > > > + return ret; > > > + /* Set the bus quota to a reasonable value */ > > > + gi2c->se.avg_bw_core = Bps_to_icc(1000); > > > + gi2c->se.peak_bw_core = Bps_to_icc(CORE_2X_100_MHZ); > > > + gi2c->se.avg_bw_cpu = Bps_to_icc(1000); > > > + gi2c->se.peak_bw_cpu = Bps_to_icc(1000); > > > + gi2c->se.avg_bw_ddr = Bps_to_icc(gi2c->clk_freq_out); > > > + gi2c->se.peak_bw_ddr = Bps_to_icc(2 * gi2c->clk_freq_out); > > > + > > > + /* Vote for core clocks and CPU for register access */ > > > + icc_set_bw(gi2c->se.icc_path[GENI_TO_CORE], gi2c->se.avg_bw_core, > > > + gi2c->se.peak_bw_core); > > > + icc_set_bw(gi2c->se.icc_path[CPU_TO_GENI], gi2c->se.avg_bw_cpu, > > > + gi2c->se.peak_bw_cpu); > > error handling needed? > > I will add error handling for GENI_TO_CORE path in all the drivers. Will it > be okay if we don't handle errors for CPU_TO_GENI and GENI_TO_DDR path > > as CPU and DDR will be running at much higher frequency? It may still work, but you might never know that there was a problem. I would be inclined to check the return value of all invocations of icc_set_bw() - including runtime suspend/resume - and log a message if a problem is detected. For runtime suspend/resume it would probably be wise to use dev_err_ratelimited(), to avoid spamming the system log too much in case of a persistent problem. If others think that error checking all icc_set_bw() calls is overkill please speak up :) Thanks Matthias ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2020-02-21 0:24 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1548069703-26595-1-git-send-email-alokc@codeaurora.org> 2019-01-21 11:21 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan 2019-01-22 6:54 ` alokc 2019-01-22 6:33 [PATCH 0/6] Add interconnect support for GENI QUPs Alok Chauhan 2019-01-22 6:33 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Alok Chauhan 2019-01-22 9:07 ` Wolfram Sang 2019-01-22 9:13 ` Peter Rosin 2019-01-23 6:51 ` alokc 2019-01-24 1:19 ` Evan Green -- strict thread matches above, loose matches on Subject: below -- 2020-02-17 13:29 [PATCH 0/6] Add interconnect support to UART, I2C, SPI and QSPI Akash Asthana [not found] ` <1581946205-27189-1-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 2020-02-17 13:30 ` [PATCH 3/6] i2c: i2c-qcom-geni: Add interconnect support Akash Asthana [not found] ` <1581946205-27189-4-git-send-email-akashast-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 2020-02-18 22:47 ` Matthias Kaehlcke 2020-02-19 13:47 ` Akash Asthana 2020-02-21 0:24 ` Matthias Kaehlcke
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).