Add SDHC interconnect bandwidth scaling
Subsystems (4)
cover Add SDHC interconnect bandwidth scaling
Add interconnect bandwidths for SDHC driver using OPP framework that is required by SDHC driver based on the clock frequency and bus width of the card. Otherwise, the system clocks may run at minimum clock speed and thus affecting the performance.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)
[2] [Patch v3 09/17] mmc: sdhci-msm: Fix error handling for dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)
[3] [RFC v6 2/2] dt-bindings: mmc: sdhci-msm: Add interconnect BW scaling strings
(https://lkml.org/lkml/2020/3/23/409)
as there were no extra changes made on [3], retaining the Acked-by and Reviewed-by sign-off from [3].
Pradeep P V K (2):
mmc: sdhci-msm: Add interconnect bandwidth scaling support
dt-bindings: mmc: sdhci-msm: Add interconnect BW scaling strings
Documentation/devicetree/bindings/mmc/sdhci-msm.txt | 18 ++++++++++++++++++ drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 2 files changed, 34 insertions(+)
Signature · 1 line
1.9.1
PATCH 1/2 mmc: sdhci-msm: Add interconnect bandwidth scaling support
Interconnect bandwidth scaling support is now added as a part of OPP [1]. So, make sure interconnect driver is ready before handling interconnect scaling.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)
[2] [Patch v3] mmc: sdhci-msm: Fix error handling for dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)
--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/mmc/host/sdhci-msm.c +16 -0
@@ -14,6 +14,7 @@#include <linux/slab.h> #include <linux/iopoll.h> #include <linux/regulator/consumer.h> +#include <linux/interconnect.h> #include "sdhci-pltfm.h" #include "cqhci.h"
@@ -1999,6 +2000,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)struct sdhci_pltfm_host *pltfm_host;struct sdhci_msm_host *msm_host;struct clk *clk; +struct icc_path *sdhc_path;int ret;u16 host_version, core_minor;u32 core_version, config;
@@ -2070,6 +2072,20 @@ static int sdhci_msm_probe(struct platform_device *pdev) } msm_host->bulk_clks[0 ].clk = clk; +/* Make sure that ICC driver is ready for interconnect bandwdith +* scaling before registering the device for OPP. +*/ + sdhc_path =of_icc_get (&pdev->dev,NULL ); + ret =PTR_ERR_OR_ZERO (sdhc_path); +if (ret) { +if (ret == -EPROBE_DEFER ) +dev_info (&pdev->dev,"defer icc path: %d\n" , ret); +else +dev_err (&pdev->dev,"failed to get icc path:%d\n" , ret); + goto bus_clk_disable; + } +icc_put (sdhc_path); + msm_host->opp_table =dev_pm_opp_set_clkname (&pdev->dev,"core" );if (IS_ERR (msm_host->opp_table)) { ret =PTR_ERR (msm_host->opp_table);
Signature · 1 line
1.9.1
Re: [PATCH V1 1/2] mmc: sdhci-msm: Add interconnect bandwidth scaling support
Hey Pradeep,
Thanks for the patch.
Quoted 46 lines · Pradeep P V K
Interconnect bandwidth scaling support is now added as a part of OPP [1]. So, make sure interconnect driver is ready before handling interconnect scaling.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)[2] [Patch v3] mmc: sdhci-msm: Fix error handling for
dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)Signed-off-by Pradeep P V K <[email protected]>--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)drivers/mmc/host/sdhci-msm.c +2
-0@@ -14,6 +14,7 @@#include <linux/slab.h> #include <linux/iopoll.h> #include <linux/regulator/consumer.h> +#include <linux/interconnect.h> #include "sdhci-pltfm.h" #include "cqhci.h" @@ -1999,6 +2000,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)struct sdhci_pltfm_host *pltfm_host;struct sdhci_msm_host *msm_host;struct clk *clk; +struct icc_path *sdhc_path;int ret;u16 host_version, core_minor;drivers/mmc/host/sdhci-msm.c +3
-0u32 core_version, config;@@ -2070,6 +2072,20 @@ static int sdhci_msm_probe(struct platform_device *pdev) } msm_host->bulk_clks[0 ].clk = clk; +/* Make sure that ICC driver is ready for interconnect bandwdith +* scaling before registering the device for OPP. +*/
drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct · line 2088
Quoted 10 lines
drivers/mmc/host/sdhci-msm.c +10
-0+ sdhc_path =of_icc_get (&pdev->dev,NULL ); + ret =PTR_ERR_OR_ZERO (sdhc_path); +if (ret) { +if (ret == -EPROBE_DEFER ) +dev_info (&pdev->dev,"defer icc path: %d\n" , ret); +else +dev_err (&pdev->dev,"failed to get icc path:%d\n" , ret); + goto bus_clk_disable; + } +icc_put (sdhc_path);
ret = dev_pm_opp_of_find_icc_paths(&pdev->dev, NULL);
since there are multiple paths
described in the bindings you
should use ^^ instead and you
can drop temporary path as well.
Quoted 4 lines
drivers/mmc/host/sdhci-msm.c +1
-0+ msm_host->opp_table =dev_pm_opp_set_clkname (&pdev->dev,"core" );if (IS_ERR (msm_host->opp_table)) {ret =
PTR_ERR(msm_host->opp_table);
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH V1 1/2] mmc: sdhci-msm: Add interconnect bandwidth scaling support
Hi Sibi,
Thanks for the review!!
Quoted 63 lines · Sibi Sankar
Hey Pradeep,
Thanks for the patch.Quoted 46 lines · Pradeep P V K
Interconnect bandwidth scaling support is now added as a part of OPP [1]. So, make sure interconnect driver is ready before handling interconnect scaling.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)[2] [Patch v3] mmc: sdhci-msm: Fix error handling for
dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)Signed-off-by Pradeep P V K <[email protected]>--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)drivers/mmc/host/sdhci-msm.c +2
-0@@ -14,6 +14,7 @@#include <linux/slab.h> #include <linux/iopoll.h> #include <linux/regulator/consumer.h> +#include <linux/interconnect.h> #include "sdhci-pltfm.h" #include "cqhci.h" @@ -1999,6 +2000,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)struct sdhci_pltfm_host *pltfm_host;struct sdhci_msm_host *msm_host;struct clk *clk; +struct icc_path *sdhc_path;int ret;u16 host_version, core_minor;drivers/mmc/host/sdhci-msm.c +3
-0u32 core_version, config;@@ -2070,6 +2072,20 @@ static int sdhci_msm_probe(struct platform_device *pdev) } msm_host->bulk_clks[0 ].clk = clk; +/* Make sure that ICC driver is ready for interconnect bandwdith +* scaling before registering the device for OPP. +*/ drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct · line 2088
Quoted 10 lines
drivers/mmc/host/sdhci-msm.c +10
-0+ sdhc_path =of_icc_get (&pdev->dev,NULL ); + ret =PTR_ERR_OR_ZERO (sdhc_path); +if (ret) { +if (ret == -EPROBE_DEFER ) +dev_info (&pdev->dev,"defer icc path: %d\n" , ret); +else +dev_err (&pdev->dev,"failed to get icc path:%d\n" , ret); + goto bus_clk_disable; + } +icc_put (sdhc_path);ret =
dev_pm_opp_of_find_icc_paths(&pdev->dev, NULL);
Quoted 5 lines
since there are multiple paths described in the bindings you should use ^^ instead and you can drop temporary path as well.
Ok. of_icc_get() used above is only to test if ICC driver is ready or not. I'm not really using the multiple paths here. Anyhow i will use dev_pm_opp_of_find_icc_paths() to get rid of some extra lines of code.
Quoted 4 lines
Quoted 4 lines
drivers/mmc/host/sdhci-msm.c +1
-0+ msm_host->opp_table =dev_pm_opp_set_clkname (&pdev->dev,"core" );if (IS_ERR (msm_host->opp_table)) {ret =
PTR_ERR(msm_host->opp_table);
Re: [PATCH V1 1/2] mmc: sdhci-msm: Add interconnect bandwidth scaling support
Quoted 73 lines · On 2020-06-04 16:43, [email protected] wrote:
Hi Sibi,
Thanks for the review!!
Quoted 63 lines · Sibi Sankar
Hey Pradeep,
Thanks for the patch.Quoted 46 lines · Pradeep P V K
Interconnect bandwidth scaling support is now added as a part of OPP [1]. So, make sure interconnect driver is ready before handling interconnect scaling.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)[2] [Patch v3] mmc: sdhci-msm: Fix error handling for
dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)Signed-off-by Pradeep P V K <[email protected]>--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)drivers/mmc/host/sdhci-msm.c +2
-0@@ -14,6 +14,7 @@#include <linux/slab.h> #include <linux/iopoll.h> #include <linux/regulator/consumer.h> +#include <linux/interconnect.h> #include "sdhci-pltfm.h" #include "cqhci.h" @@ -1999,6 +2000,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)struct sdhci_pltfm_host *pltfm_host;struct sdhci_msm_host *msm_host;struct clk *clk; +struct icc_path *sdhc_path;int ret;u16 host_version, core_minor;drivers/mmc/host/sdhci-msm.c +3
-0u32 core_version, config;@@ -2070,6 +2072,20 @@ static int sdhci_msm_probe(struct platform_device *pdev) } msm_host->bulk_clks[0 ].clk = clk; +/* Make sure that ICC driver is ready for interconnect bandwdith +* scaling before registering the device for OPP. +*/ drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct · line 2088
Quoted 10 lines
drivers/mmc/host/sdhci-msm.c +10
-0+ sdhc_path =of_icc_get (&pdev->dev,NULL ); + ret =PTR_ERR_OR_ZERO (sdhc_path); +if (ret) { +if (ret == -EPROBE_DEFER ) +dev_info (&pdev->dev,"defer icc path: %d\n" , ret); +else +dev_err (&pdev->dev,"failed to get icc path:%d\n" , ret); + goto bus_clk_disable; + } +icc_put (sdhc_path);ret =
dev_pm_opp_of_find_icc_paths(&pdev->dev, NULL);Quoted 5 lines
since there are multiple paths described in the bindings you should use ^^ instead and you can drop temporary path as well.
Quoted 5 lines
Ok.
of_icc_get()used above is only to test if ICC driver is ready or not. I'm not
really using the multiple paths here. Anyhow i will usedev_pm_opp_of_find_icc_paths()
to get rid of some extra lines of code.
Using dev_pm_opp_of_find_icc_paths
with NULL passed acts as a way of
validating all the paths specified
in the device and also validates if
the opp-table has bw related bindings
as well.
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
drivers/mmc/host/sdhci-msm.c +1
-0+ msm_host->opp_table =dev_pm_opp_set_clkname (&pdev->dev,"core" );if (IS_ERR (msm_host->opp_table)) {ret =
PTR_ERR(msm_host->opp_table);
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
Re: [PATCH V1 1/2] mmc: sdhci-msm: Add interconnect bandwidth scaling support
In reply to Pradeep P V KHi Pradeep,
Quoted 30 lines · Pradeep P V K
Interconnect bandwidth scaling support is now added as a part of OPP [1]. So, make sure interconnect driver is ready before handling interconnect scaling.
This change is based on
[1] [Patch v8] Introduce OPP bandwidth bindings
(https://lkml.org/lkml/2020/5/12/493)[2] [Patch v3] mmc: sdhci-msm: Fix error handling for
dev_pm_opp_of_add_table()
(https://lkml.org/lkml/2020/5/5/491)Signed-off-by Pradeep P V K <[email protected]>--- drivers/mmc/host/sdhci-msm.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)drivers/mmc/host/sdhci-msm.c +1
-0@@ -14,6 +14,7 @@#include <linux/slab.h> #include <linux/iopoll.h> #include <linux/regulator/consumer.h> +#include <linux/interconnect.h> #include "sdhci-pltfm.h" #include "cqhci.h"
drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct platform_device *pdev) · line 2003
Quoted 4 lines
drivers/mmc/host/sdhci-msm.c +1
-0@@ -1999,6 +2000,7 @@ static int sdhci_msm_probe(struct platform_device *pdev)struct sdhci_pltfm_host *pltfm_host;struct sdhci_msm_host *msm_host;struct clk *clk; +struct icc_path *sdhc_path;
nit: The 'sdhc_' prefix doesn't provide any useful information, change it to 'icc_path', which makes evident what it is?
drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct platform_device *pdev) · line 2080
Quoted 13 lines
drivers/mmc/host/sdhci-msm.c +6
-0int ret;u16 host_version, core_minor;u32 core_version, config;@@ -2070,6 +2072,20 @@ static int sdhci_msm_probe(struct platform_device *pdev) } msm_host->bulk_clks[0 ].clk = clk; +/* Make sure that ICC driver is ready for interconnect bandwdith +* scaling before registering the device for OPP. +*/ + sdhc_path =of_icc_get (&pdev->dev,NULL ); + ret =PTR_ERR_OR_ZERO (sdhc_path); +if (ret) {
nit: IMO it would be clearer to do this instead of using PTR_ERR_OR_ZERO() (as for the OPP table below):
if (IS_ERR(sdhc_path)) {
ret = PTR_ERR(sdhc_path);drivers/mmc/host/sdhci-msm.c static int sdhci_msm_probe(struct platform_device *pdev) · line 2082
Quoted 2 lines
drivers/mmc/host/sdhci-msm.c +2
-0+if (ret == -EPROBE_DEFER ) +dev_info (&pdev->dev,"defer icc path: %d\n" , ret);
This log seems to add little more than noise, or are there particular reasons why it is useful in this driver? Most drivers just return silently in case of deferred probing.
Quoted 12 lines
drivers/mmc/host/sdhci-msm.c +6
-0+else +dev_err (&pdev->dev,"failed to get icc path:%d\n" , ret); + goto bus_clk_disable; + } +icc_put (sdhc_path); + msm_host->opp_table =dev_pm_opp_set_clkname (&pdev->dev,"core" );if (IS_ERR (msm_host->opp_table)) { ret =PTR_ERR (msm_host->opp_table);Signature · 1 line
1.9.1
PATCH 2/2 dt-bindings: mmc: sdhci-msm: Add interconnect BW scaling strings
In reply to Pradeep P V KAdd interconnect bandwidth scaling supported strings for qcom-sdhci controller.
--- Documentation/devicetree/bindings/mmc/sdhci-msm.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
Documentation/devicetree/bindings/mmc/sdhci-msm.txt +18 -0
@@ -54,6 +54,21 @@ Required properties: - qcom,dll-config: Chipset and Platform specific value. Use this field to specify the DLL_CONFIG register value as per Hardware Programming Guide. +Optional Properties: +* Following bus parameters are required for interconnect bandwidth scaling: +- interconnects: Pairs of phandles and interconnect provider specifier + to denote the edge source and destination ports of + the interconnect path. + +- interconnect-names: For sdhc, we have two main paths. + 1. Data path : sdhc to ddr + 2. Config path : cpu to sdhc + For Data interconnect path the name supposed to be + is "sdhc-ddr" and for config interconnect path it is + "cpu-sdhc". + Please refer to Documentation/devicetree/bindings/ + interconnect/ for more details. + Example: sdhc_1: sdhci@f9824900 {
@@ -71,6 +86,9 @@ Example: clocks = <&gcc GCC_SDCC1_APPS_CLK>, <&gcc GCC_SDCC1_AHB_CLK>; clock-names = "core", "iface"; + interconnects = <&qnoc MASTER_SDCC_ID &qnoc SLAVE_DDR_ID>, + <&qnoc MASTER_CPU_ID &qnoc SLAVE_SDCC_ID>; + interconnect-names = "sdhc-ddr","cpu-sdhc"; qcom,dll-config = <0x000f642c>; qcom,ddr-config = <0x80040868>;
Signature · 1 line
1.9.1