* [PATCH v3 0/3] Use icc-clk for the SM8250 camera NoC AXI clock
@ 2026-10-16 17:06 Atanas Filipov
2026-10-16 17:06 ` [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider Atanas Filipov
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Atanas Filipov @ 2026-10-16 17:06 UTC (permalink / raw)
To: Bjorn Andersson, Michael Turquette, Stephen Boyd
Cc: Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue,
Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos,
linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel,
atanas.filipov
CAM_CC_CAMNOC_AXI_CLK on SM8250 is shared by several independent
camera blocks, such as CAMSS and the JPEG encoder. Each of them needs a
minimum camera NoC AXI rate, and setting the rate of the shared clock
directly from each consumer driver means the last writer wins.
Following the review of v2, this version drops the custom CAMNOC
interconnect provider. The camera clock controller instead exports the
camera NoC AXI clock through the common icc-clk support
(qcom_cc_desc.icc_hws), as gcc-ipq9574 and gcc-ipq5210 do. Consumers
request bandwidth on one master/slave path, the interconnect core
aggregates the requests, and the clock runs at the highest requested
rate. A consumer can do this through opp-peak-kBps in its OPP table,
so the vote follows its own core clock OPP.
The icc-clk path is backed by the RCG CAM_CC_CAMNOC_AXI_CLK_SRC rather
than the branch CAM_CC_CAMNOC_AXI_CLK. icc-clk enables its clock while
the provider registers, when TITAN_TOP_GDSC is still off, and enabling
the branch at that point fails with "cam_cc_camnoc_axi_clk status stuck
at 'off'". The RCG can be enabled at probe; the branch has
CLK_SET_RATE_PARENT, so the rate ends up on the RCG either way, and each
consumer keeps enabling the branch itself after powering the GDSC.
The JPEG encoder and CAMSS will use this path; their changes will be
posted separately.
Tested on RB5 (QRB5165): the camera NoC AXI clock follows the
aggregated vote, votes drop to zero when the consumer is idle, and no
clock warnings are seen at boot.
Changes since v2:
- Drop the CAMNOC interconnect provider driver, its binding and DT
node; export the camera NoC AXI clock through icc-clk in
camcc-sm8250 instead (Krzysztof Kozlowski, Konrad Dybcio)
- Drop the per-master CAMNOC port IDs; icc-clk provides one
master/slave pair per clock
Atanas Filipov (3):
dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider
clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock
arm64: dts: qcom: sm8250: add camcc interconnect cells
.../devicetree/bindings/clock/qcom,camcc-sm8250.yaml | 4 ++++
arch/arm64/boot/dts/qcom/sm8250.dtsi | 1 +
drivers/clk/qcom/camcc-sm8250.c | 12 ++++++++++++
include/dt-bindings/interconnect/qcom,sm8250.h | 3 +++
4 files changed, 20 insertions(+)
base-commit: b810335a0699d1810683796b0e3ffe8827ddfe6c
--
2.34.1
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider 2026-10-16 17:06 [PATCH v3 0/3] Use icc-clk for the SM8250 camera NoC AXI clock Atanas Filipov @ 2026-10-16 17:06 ` Atanas Filipov 2026-10-20 7:12 ` Krzysztof Kozlowski 2026-10-16 17:07 ` [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock Atanas Filipov 2026-10-16 17:07 ` [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells Atanas Filipov 2 siblings, 1 reply; 13+ messages in thread From: Atanas Filipov @ 2026-10-16 17:06 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd Cc: Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel, atanas.filipov CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its rate directly from each consumer means the last writer wins. Add #interconnect-cells so the camera clock controller can act as an icc-clk provider, and add the camera NoC AXI master/slave IDs. Consumers request bandwidth on this path and the interconnect core aggregates the requests. Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> --- .../devicetree/bindings/clock/qcom,camcc-sm8250.yaml | 4 ++++ include/dt-bindings/interconnect/qcom,sm8250.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml b/Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml index 5c3ff37ec0d75..9cc7e77ec89ae 100644 --- a/Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml +++ b/Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml @@ -36,6 +36,9 @@ properties: - const: bi_tcxo_ao - const: sleep_clk + '#interconnect-cells': + const: 1 + power-domains: items: - description: MMCX power domain @@ -70,5 +73,6 @@ examples: #clock-cells = <1>; #reset-cells = <1>; #power-domain-cells = <1>; + #interconnect-cells = <1>; }; ... diff --git a/include/dt-bindings/interconnect/qcom,sm8250.h b/include/dt-bindings/interconnect/qcom,sm8250.h index 2a656c02df4b1..96dc43e063cf0 100644 --- a/include/dt-bindings/interconnect/qcom,sm8250.h +++ b/include/dt-bindings/interconnect/qcom,sm8250.h @@ -173,4 +173,7 @@ #define SLAVE_QUP_CORE_1 4 #define SLAVE_QUP_CORE_2 5 +#define MASTER_CAMCC_CAMNOC_AXI 0 +#define SLAVE_CAMCC_CAMNOC_AXI 1 + #endif -- 2.34.1 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider 2026-10-16 17:06 ` [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider Atanas Filipov @ 2026-10-20 7:12 ` Krzysztof Kozlowski 2026-10-20 7:40 ` Gjorgji Rosikopulos (Consultant) 2026-10-20 12:44 ` Atanas Filipov 0 siblings, 2 replies; 13+ messages in thread From: Krzysztof Kozlowski @ 2026-10-20 7:12 UTC (permalink / raw) To: Atanas Filipov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On Fri, Oct 16, 2026 at 08:06:59PM +0300, Atanas Filipov wrote: > CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its Clock is not an interconnect, although AXI suggests this could be something with bus, but it seems you solve driver problem with interconnect description. If you only need to solve "last writer" problem, why not fixing the clock framework to accept the votes? Otherwise this should have description why it is an interconnect. Best regards, Krzysztof ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider 2026-10-20 7:12 ` Krzysztof Kozlowski @ 2026-10-20 7:40 ` Gjorgji Rosikopulos (Consultant) 2026-10-20 12:44 ` Atanas Filipov 1 sibling, 0 replies; 13+ messages in thread From: Gjorgji Rosikopulos (Consultant) @ 2026-10-20 7:40 UTC (permalink / raw) To: Krzysztof Kozlowski, Atanas Filipov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel Hi Krzysztof, On 10/20/2026 10:12 AM, Krzysztof Kozlowski wrote: > On Fri, Oct 16, 2026 at 08:06:59PM +0300, Atanas Filipov wrote: >> CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its > > Clock is not an interconnect, although AXI suggests this could be > something with bus, but it seems you solve driver problem with > interconnect description. > > If you only need to solve "last writer" problem, why not fixing the > clock framework to accept the votes? Otherwise this should have > description why it is an interconnect. There are two approaches which we have looked in to resolving the sharing of the AXI clock. 1. The drivers newer touch this clock but vote on new icc camera which controls this clock (The v1 and v2) patches. 2. Use icc-clk in the extension in clock framework same approach as: https://lore.kernel.org/all/20240430064214.2030013-6-quic_varada@quicinc.com/ This is already merged and i believe resolved similar issue. 3. Which you are proposing to have clock framework to accept the votes. Before we jump and implement the v4 it will be really good to have common agreement on which direction to go. Regards, ~Gjorgji ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider 2026-10-20 7:12 ` Krzysztof Kozlowski 2026-10-20 7:40 ` Gjorgji Rosikopulos (Consultant) @ 2026-10-20 12:44 ` Atanas Filipov 1 sibling, 0 replies; 13+ messages in thread From: Atanas Filipov @ 2026-10-20 12:44 UTC (permalink / raw) To: Krzysztof Kozlowski Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On 10/20/2026 10:12 AM, Krzysztof Kozlowski wrote: > On Fri, Oct 16, 2026 at 08:06:59PM +0300, Atanas Filipov wrote: >> CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its > > Clock is not an interconnect, although AXI suggests this could be > something with bus, but it seems you solve driver problem with > interconnect description. > Agreed, the problem is in the drivers. Today each CAMSS VFE calls clk_set_rate() on camnoc_axi based on its own load only. The last caller wins, and the rate is never lowered after streaming stops. > If you only need to solve "last writer" problem, why not fixing the > clock framework to accept the votes? Otherwise this should have > description why it is an interconnect. > > Best regards, > Krzysztof I checked clk_set_min_rate() and clk_set_rate_range(). The clock core takes the highest minimum of all users, but when a user drops its request, the core only clamps the last requested rate to the new range. The RCG keeps that rate and does not go to the lowest allowed one, so the clock stays high. Fixing this needs a change in the clock core. icc-clk already does this: the interconnect core aggregates the requests and icc-clk is the only one that sets the clock rate. The camnoc AXI clock drives the camera NoC, the bus between the camera blocks and the MMSS NoC, so a bandwidth request matches the hardware. gcc-ipq9574 uses icc-clk for its NoC clocks in the same way. Which direction do you prefer? If icc-clk stays, I will add this explanation to the commit message in v4. Best regards, Atanas ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock 2026-10-16 17:06 [PATCH v3 0/3] Use icc-clk for the SM8250 camera NoC AXI clock Atanas Filipov 2026-10-16 17:06 ` [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider Atanas Filipov @ 2026-10-16 17:07 ` Atanas Filipov 2026-10-19 14:49 ` Dmitry Baryshkov 2026-10-16 17:07 ` [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells Atanas Filipov 2 siblings, 1 reply; 13+ messages in thread From: Atanas Filipov @ 2026-10-16 17:07 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd Cc: Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel, atanas.filipov CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its rate directly from each consumer means the last writer wins. Register the clock as an icc-clk path through the common icc_hws support, as gcc-ipq9574 does. The interconnect core aggregates all requests and the clock runs at the highest requested rate. Use the RCG rather than the branch: icc-clk enables the clock at registration, when TITAN_TOP_GDSC is still off. Consumers enable the branch themselves. Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> --- drivers/clk/qcom/camcc-sm8250.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/clk/qcom/camcc-sm8250.c b/drivers/clk/qcom/camcc-sm8250.c index 21e9423676216..84a91103e5bef 100644 --- a/drivers/clk/qcom/camcc-sm8250.c +++ b/drivers/clk/qcom/camcc-sm8250.c @@ -4,11 +4,13 @@ */ #include <linux/clk-provider.h> +#include <linux/interconnect-provider.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/regmap.h> #include <dt-bindings/clock/qcom,camcc-sm8250.h> +#include <dt-bindings/interconnect/qcom,sm8250.h> #include "clk-alpha-pll.h" #include "clk-branch.h" @@ -2405,6 +2407,12 @@ static const struct regmap_config cam_cc_sm8250_regmap_config = { .fast_io = true, }; +#define SM8250_CAMCC_ICC_ID 8250 /* some unique value */ + +static const struct qcom_icc_hws_data cam_cc_sm8250_icc_hws[] = { + { MASTER_CAMCC_CAMNOC_AXI, SLAVE_CAMCC_CAMNOC_AXI, CAM_CC_CAMNOC_AXI_CLK_SRC }, +}; + static const struct qcom_cc_desc cam_cc_sm8250_desc = { .config = &cam_cc_sm8250_regmap_config, .clks = cam_cc_sm8250_clocks, @@ -2413,6 +2421,9 @@ static const struct qcom_cc_desc cam_cc_sm8250_desc = { .num_resets = ARRAY_SIZE(cam_cc_sm8250_resets), .gdscs = cam_cc_sm8250_gdscs, .num_gdscs = ARRAY_SIZE(cam_cc_sm8250_gdscs), + .icc_hws = cam_cc_sm8250_icc_hws, + .num_icc_hws = ARRAY_SIZE(cam_cc_sm8250_icc_hws), + .icc_first_node_id = SM8250_CAMCC_ICC_ID, }; static const struct of_device_id cam_cc_sm8250_match_table[] = { @@ -2443,6 +2454,7 @@ static struct platform_driver cam_cc_sm8250_driver = { .driver = { .name = "cam_cc-sm8250", .of_match_table = cam_cc_sm8250_match_table, + .sync_state = icc_sync_state, }, }; -- 2.34.1 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock 2026-10-16 17:07 ` [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock Atanas Filipov @ 2026-10-19 14:49 ` Dmitry Baryshkov 2026-10-20 8:20 ` Atanas Filipov 0 siblings, 1 reply; 13+ messages in thread From: Dmitry Baryshkov @ 2026-10-19 14:49 UTC (permalink / raw) To: Atanas Filipov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On Fri, Oct 16, 2026 at 08:07:00PM +0300, Atanas Filipov wrote: > CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its > rate directly from each consumer means the last writer wins. > > Register the clock as an icc-clk path through the common icc_hws > support, as gcc-ipq9574 does. The interconnect core aggregates all > requests and the clock runs at the highest requested rate. > > Use the RCG rather than the branch: icc-clk enables the clock at > registration, when TITAN_TOP_GDSC is still off. Consumers enable the > branch themselves. > > Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> > --- > drivers/clk/qcom/camcc-sm8250.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) This is a nice approach. Several quesitons: if there are multiple clients, should the clock track the max of the rates a sum of the rates? Also, this clock needs a certain level on a rail. Are you going to add the opp table to the clock controller or to the devices which use the ICC? -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock 2026-10-19 14:49 ` Dmitry Baryshkov @ 2026-10-20 8:20 ` Atanas Filipov 0 siblings, 0 replies; 13+ messages in thread From: Atanas Filipov @ 2026-10-20 8:20 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On 10/19/2026 5:49 PM, Dmitry Baryshkov wrote: > On Fri, Oct 16, 2026 at 08:07:00PM +0300, Atanas Filipov wrote: >> CAM_CC_CAMNOC_AXI_CLK is shared by several camera blocks. Setting its >> rate directly from each consumer means the last writer wins. >> >> Register the clock as an icc-clk path through the common icc_hws >> support, as gcc-ipq9574 does. The interconnect core aggregates all >> requests and the clock runs at the highest requested rate. >> >> Use the RCG rather than the branch: icc-clk enables the clock at >> registration, when TITAN_TOP_GDSC is still off. Consumers enable the >> branch themselves. >> >> Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> >> --- >> drivers/clk/qcom/camcc-sm8250.c | 12 ++++++++++++ >> 1 file changed, 12 insertions(+) > > This is a nice approach. Several quesitons: if there are multiple > clients, should the clock track the max of the rates a sum of the rates? Max. icc-clk sets the clock from the aggregated peak bandwidth, and icc_std_aggregate() takes the maximum of the peak requests. Each client asks for the bandwidth it needs, so the highest request covers all of them. A sum would overestimate the clock. > Also, this clock needs a certain level on a rail. Are you going to add > the opp table to the clock controller or to the devices which use the > ICC? > To the devices. Each consumer describes its own needs in its OPP table: every entry carries the core clock rate, the camera NoC bandwidth and the required rail level, and dev_pm_opp_set_opp() applies all of them at once. Dropping the OPP on idle removes the votes. For example, the JPEG encoder (to be posted separately): interconnects = <&camcc MASTER_CAMCC_CAMNOC_AXI &camcc SLAVE_CAMCC_CAMNOC_AXI>; interconnect-names = "camnoc"; operating-points-v2 = <&jpeg_opp_table>; jpeg_opp_table: opp-table { compatible = "operating-points-v2"; opp-100000000 { opp-hz = /bits/ 64 <100000000>; opp-peak-kBps = <25000>; required-opps = <&rpmhpd_opp_min_svs>; }; ... opp-600000000 { opp-hz = /bits/ 64 <600000000>; opp-peak-kBps = <400000>; required-opps = <&rpmhpd_opp_turbo>; }; }; The consumer asks for the bandwidth it needs, independent of how many rate levels the camera NoC clock has on a given platform; icc-clk rounds the request to a rate the clock supports. Best regards, Atanas ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells 2026-10-16 17:06 [PATCH v3 0/3] Use icc-clk for the SM8250 camera NoC AXI clock Atanas Filipov 2026-10-16 17:06 ` [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider Atanas Filipov 2026-10-16 17:07 ` [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock Atanas Filipov @ 2026-10-16 17:07 ` Atanas Filipov 2026-10-19 14:50 ` Dmitry Baryshkov 2 siblings, 1 reply; 13+ messages in thread From: Atanas Filipov @ 2026-10-16 17:07 UTC (permalink / raw) To: Bjorn Andersson, Michael Turquette, Stephen Boyd Cc: Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Dmitry Baryshkov, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel, atanas.filipov Add #interconnect-cells to the camera clock controller so camera consumers can request camera NoC AXI bandwidth through the interconnect framework. Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> --- arch/arm64/boot/dts/qcom/sm8250.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi index f975c2183269a..e923c74dc1435 100644 --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi @@ -4675,6 +4675,7 @@ camcc: clock-controller@ad00000 { #clock-cells = <1>; #reset-cells = <1>; #power-domain-cells = <1>; + #interconnect-cells = <1>; }; mdss: display-subsystem@ae00000 { -- 2.34.1 ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells 2026-10-16 17:07 ` [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells Atanas Filipov @ 2026-10-19 14:50 ` Dmitry Baryshkov 2026-10-20 8:26 ` Atanas Filipov 0 siblings, 1 reply; 13+ messages in thread From: Dmitry Baryshkov @ 2026-10-19 14:50 UTC (permalink / raw) To: Atanas Filipov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On Fri, Oct 16, 2026 at 08:07:01PM +0300, Atanas Filipov wrote: > Add #interconnect-cells to the camera clock controller so camera > consumers can request camera NoC AXI bandwidth through the > interconnect framework. I guess currently we have only one consumer, camss. Could you please include patches converting it to the bus voting? Be sure to retain compatibility with older DTs, which don't have ICC provided by the camcc node. > > Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> > --- > arch/arm64/boot/dts/qcom/sm8250.dtsi | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi > index f975c2183269a..e923c74dc1435 100644 > --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi > +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi > @@ -4675,6 +4675,7 @@ camcc: clock-controller@ad00000 { > #clock-cells = <1>; > #reset-cells = <1>; > #power-domain-cells = <1>; > + #interconnect-cells = <1>; > }; > > mdss: display-subsystem@ae00000 { > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells 2026-10-19 14:50 ` Dmitry Baryshkov @ 2026-10-20 8:26 ` Atanas Filipov 2026-10-20 9:45 ` Dmitry Baryshkov 0 siblings, 1 reply; 13+ messages in thread From: Atanas Filipov @ 2026-10-20 8:26 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On 10/19/2026 5:50 PM, Dmitry Baryshkov wrote: > On Fri, Oct 16, 2026 at 08:07:01PM +0300, Atanas Filipov wrote: >> Add #interconnect-cells to the camera clock controller so camera >> consumers can request camera NoC AXI bandwidth through the >> interconnect framework. > > I guess currently we have only one consumer, camss. Could you please > include patches converting it to the bus voting? Be sure to retain > compatibility with older DTs, which don't have ICC provided by the camcc > node. > Before converting CAMSS I would like to agree on the approach, since it cannot simply follow JPEG. In either case the camcc path would be optional, so older DTs keep working as before. OPP is per device, and CAMSS is a single device containing several VFEs, each with its own core clock and its own load. If CAMSS used dev_pm_opp_set_opp() on its device like JPEG does, every VFE would overwrite the clock and bandwidth votes of the others, which is the same last-writer-wins problem in a different place. I see two ways to keep the VFEs independent: 1. One OPP table in the CAMSS node, used only as a lookup. Each VFE finds the OPP for its own required rate, sets its own clock and votes the bandwidth from that OPP on its own ICC path. The driver requests a separate path per VFE from the same "interconnects" entry, so DT describes the hardware connection once and the interconnect core aggregates the VFE requests with the other consumers. The rail level is not applied by the OPP core in this case, so CAMSS keeps handling it as today. 2. An OPP table per VFE, attached to the per-VFE power domain device that CAMSS already creates, so each VFE calls dev_pm_opp_set_opp() on its own device. This applies the rail level as well, but the virtual device shares the CAMSS of_node, so it would pick up all CAMSS interconnect paths and need indexed OPP tables in DT, which I have not seen used for such devices. Which one would you prefer, or do you see a better way? Best regards, Atanas >> >> Signed-off-by: Atanas Filipov <atanas.filipov@oss.qualcomm.com> >> --- >> arch/arm64/boot/dts/qcom/sm8250.dtsi | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi >> index f975c2183269a..e923c74dc1435 100644 >> --- a/arch/arm64/boot/dts/qcom/sm8250.dtsi >> +++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi >> @@ -4675,6 +4675,7 @@ camcc: clock-controller@ad00000 { >> #clock-cells = <1>; >> #reset-cells = <1>; >> #power-domain-cells = <1>; >> + #interconnect-cells = <1>; >> }; >> >> mdss: display-subsystem@ae00000 { >> -- >> 2.34.1 >> > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells 2026-10-20 8:26 ` Atanas Filipov @ 2026-10-20 9:45 ` Dmitry Baryshkov 2026-10-20 12:49 ` Atanas Filipov 0 siblings, 1 reply; 13+ messages in thread From: Dmitry Baryshkov @ 2026-10-20 9:45 UTC (permalink / raw) To: Atanas Filipov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On Tue, Oct 20, 2026 at 11:26:42AM +0300, Atanas Filipov wrote: > On 10/19/2026 5:50 PM, Dmitry Baryshkov wrote: > > On Fri, Oct 16, 2026 at 08:07:01PM +0300, Atanas Filipov wrote: > > > Add #interconnect-cells to the camera clock controller so camera > > > consumers can request camera NoC AXI bandwidth through the > > > interconnect framework. > > > > I guess currently we have only one consumer, camss. Could you please > > include patches converting it to the bus voting? Be sure to retain > > compatibility with older DTs, which don't have ICC provided by the camcc > > node. > > > > Before converting CAMSS I would like to agree on the approach, since it > cannot simply follow JPEG. In either case the camcc path would be > optional, so older DTs keep working as before. How does the current camss vote on the clock? JPEG is not (yet) merged, so we can't reference it here. The order in which the patches can land would be: icc-clk, camss using the (optional) interconnect, JPEG on top. Please note Krzysztof's comments. > OPP is per device, and CAMSS is a single device containing several VFEs, > each with its own core clock and its own load. If CAMSS used > dev_pm_opp_set_opp() on its device like JPEG does, every VFE would overwrite > the clock and bandwidth votes of the others, which is the same > last-writer-wins problem in a different place. For this series just convert the existing approach as is. We have two distinct questions here: - Letting camss and JPEG (and others) to vote independently on the clock - Letting camss correctly handle per-VFE votes This series must address the first question only. > I see two ways to keep the VFEs independent: > > 1. One OPP table in the CAMSS node, used only as a lookup. Each VFE > finds the OPP for its own required rate, sets its own clock and > votes the bandwidth from that OPP on its own ICC path. The driver > requests a separate path per VFE from the same "interconnects" > entry, so DT describes the hardware connection once and the > interconnect core aggregates the VFE requests with the other > consumers. The rail level is not applied by the OPP core in this > case, so CAMSS keeps handling it as today. > > 2. An OPP table per VFE, attached to the per-VFE power domain device > that CAMSS already creates, so each VFE calls dev_pm_opp_set_opp() > on its own device. This applies the rail level as well, but the > virtual device shares the CAMSS of_node, so it would pick up all > CAMSS interconnect paths and need indexed OPP tables in DT, which I > have not seen used for such devices. > > Which one would you prefer, or do you see a better way? 3. Add minimal VFE nodes and let camss use those. Converge towards the split VFE (IFE) device tree. -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells 2026-10-20 9:45 ` Dmitry Baryshkov @ 2026-10-20 12:49 ` Atanas Filipov 0 siblings, 0 replies; 13+ messages in thread From: Atanas Filipov @ 2026-10-20 12:49 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Bjorn Andersson, Michael Turquette, Stephen Boyd, Konrad Dybcio, Georgi Djakov, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Abel Vesa, Jonathan Marek, Bryan O'Donoghue, Konrad Dybcio, Gjorgji Rosikopulos, linux-arm-msm, linux-clk, linux-pm, devicetree, linux-kernel On 10/20/2026 12:45 PM, Dmitry Baryshkov wrote: > On Tue, Oct 20, 2026 at 11:26:42AM +0300, Atanas Filipov wrote: >> On 10/19/2026 5:50 PM, Dmitry Baryshkov wrote: >>> On Fri, Oct 16, 2026 at 08:07:01PM +0300, Atanas Filipov wrote: >>>> Add #interconnect-cells to the camera clock controller so camera >>>> consumers can request camera NoC AXI bandwidth through the >>>> interconnect framework. >>> >>> I guess currently we have only one consumer, camss. Could you please >>> include patches converting it to the bus voting? Be sure to retain >>> compatibility with older DTs, which don't have ICC provided by the camcc >>> node. >>> >> >> Before converting CAMSS I would like to agree on the approach, since it >> cannot simply follow JPEG. In either case the camcc path would be >> optional, so older DTs keep working as before. > > How does the current camss vote on the clock? JPEG is not (yet) merged, > so we can't reference it here. The order in which the patches can land > would be: icc-clk, camss using the (optional) interconnect, JPEG on top. It does not vote. Each VFE calls clk_set_rate() directly from vfe_set_clock_rates(), based on the pixel rate of its own lines only. Where clk_set_rate() is used on camnoc_axi (SC7280, SC8280XP, SA8775P), the clock is shared by all VFEs, but: - the last VFE to power up wins and may lower the rate under a VFE that is already streaming; - vfe_check_clock_rates() checks only the VFE's own needs and does not notice changes made by other VFEs; - vfe_put() never drops the rate. On the remaining SoCs the camnoc clocks have no levels and are only enabled. On SM8250 the levels sit on "camnoc_axi_src", which vfe_match_clock_names() does not match, so they are never applied. > > Please note Krzysztof's comments. Yes. I will reply to Krzysztof directly in 1/3. The CAMSS behaviour above is part of that answer: today every consumer sets the shared camnoc rate directly and nothing aggregates the requests. > >> OPP is per device, and CAMSS is a single device containing several VFEs, >> each with its own core clock and its own load. If CAMSS used >> dev_pm_opp_set_opp() on its device like JPEG does, every VFE would overwrite >> the clock and bandwidth votes of the others, which is the same >> last-writer-wins problem in a different place. > > For this series just convert the existing approach as is. We have two > distinct questions here: > - Letting camss and JPEG (and others) to vote independently on the > clock > - Letting camss correctly handle per-VFE votes > > This series must address the first question only. > >> I see two ways to keep the VFEs independent: >> >> 1. One OPP table in the CAMSS node, used only as a lookup. Each VFE >> finds the OPP for its own required rate, sets its own clock and >> votes the bandwidth from that OPP on its own ICC path. The driver >> requests a separate path per VFE from the same "interconnects" >> entry, so DT describes the hardware connection once and the >> interconnect core aggregates the VFE requests with the other >> consumers. The rail level is not applied by the OPP core in this >> case, so CAMSS keeps handling it as today. >> >> 2. An OPP table per VFE, attached to the per-VFE power domain device >> that CAMSS already creates, so each VFE calls dev_pm_opp_set_opp() >> on its own device. This applies the rail level as well, but the >> virtual device shares the CAMSS of_node, so it would pick up all >> CAMSS interconnect paths and need indexed OPP tables in DT, which I >> have not seen used for such devices. >> >> Which one would you prefer, or do you see a better way? > > 3. Add minimal VFE nodes and let camss use those. Converge towards the > split VFE (IFE) device tree. > Agreed, I will take that up separately. To get it right the first time, could you clarify what "minimal" covers: - child nodes of the camss node, or standalone nodes like the split CSIPHY? - which resources move into them: only the per-VFE clocks, power domain, OPP table and interconnect path, or reg and interrupts as well? -- Best regards, Atanas ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-10-20 12:49 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-10-16 17:06 [PATCH v3 0/3] Use icc-clk for the SM8250 camera NoC AXI clock Atanas Filipov 2026-10-16 17:06 ` [PATCH v3 1/3] dt-bindings: clock: qcom,camcc-sm8250: add interconnect provider Atanas Filipov 2026-10-20 7:12 ` Krzysztof Kozlowski 2026-10-20 7:40 ` Gjorgji Rosikopulos (Consultant) 2026-10-20 12:44 ` Atanas Filipov 2026-10-16 17:07 ` [PATCH v3 2/3] clk: qcom: camcc-sm8250: use icc-clk for camera NoC AXI clock Atanas Filipov 2026-10-19 14:49 ` Dmitry Baryshkov 2026-10-20 8:20 ` Atanas Filipov 2026-10-16 17:07 ` [PATCH v3 3/3] arm64: dts: qcom: sm8250: add camcc interconnect cells Atanas Filipov 2026-10-19 14:50 ` Dmitry Baryshkov 2026-10-20 8:26 ` Atanas Filipov 2026-10-20 9:45 ` Dmitry Baryshkov 2026-10-20 12:49 ` Atanas Filipov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®